Lyogdmlzb3JjaGFubmVsX2Z1bmNzLmMKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgovKgogKiAgVGhpcyBwcm92aWRlcyBTdXBlcnZpc29yIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKICogIGluZGVwZW5kZW50IG9mIHRoZSBtZWNoYW5pc20gdXNlZCB0byBhY2Nlc3MgdGhlIGNoYW5uZWwgZGF0YS4gIEFsbCBjaGFubmVsCiAqICBkYXRhIGlzIGFjY2Vzc2VkIHVzaW5nIHRoZSBtZW1yZWdpb24gYWJzdHJhY3Rpb24uICAobWVtcmVnaW9uIGhhcyBib3RoCiAqICBhIENNMiBpbXBsZW1lbnRhdGlvbiBhbmQgYSBkaXJlY3QgbWVtb3J5IGltcGxlbWVudGF0aW9uLikKICovCgojaW5jbHVkZSAiZ2xvYmFscy5oIgojaW5jbHVkZSAidmlzb3JjaGFubmVsLmgiCiNpbmNsdWRlICJndWlkdXRpbHMuaCIKCiNkZWZpbmUgTVlEUlZOQU1FICJ2aXNvcmNoYW5uZWwiCgpzdHJ1Y3QgVklTT1JDSEFOTkVMX1RhZyB7CglNRU1SRUdJT04gKm1lbXJlZ2lvbjsJLyogZnJvbSB2aXNvcl9tZW1yZWdpb25fY3JlYXRlKCkgKi8KCUNIQU5ORUxfSEVBREVSIGNoYW5faGRyOwoJR1VJRCBndWlkOwoJdWxvbmcgc2l6ZTsKCUJPT0wgbmVlZHNfbG9jazsKCXNwaW5sb2NrX3QgaW5zZXJ0X2xvY2s7CglzcGlubG9ja190IHJlbW92ZV9sb2NrOwoKCXN0cnVjdCB7CgkJU0lHTkFMX1FVRVVFX0hFQURFUiByZXFfcXVldWU7CgkJU0lHTkFMX1FVRVVFX0hFQURFUiByc3BfcXVldWU7CgkJU0lHTkFMX1FVRVVFX0hFQURFUiBldmVudF9xdWV1ZTsKCQlTSUdOQUxfUVVFVUVfSEVBREVSIGFja19xdWV1ZTsKCX0gc2FmZV91aXNfcXVldWU7Cn07CgovKiBDcmVhdGVzIHRoZSBWSVNPUkNIQU5ORUwgYWJzdHJhY3Rpb24gZm9yIGEgZGF0YSBhcmVhIGluIG1lbW9yeSwgYnV0IGRvZXMKICogTk9UIG1vZGlmeSB0aGlzIGRhdGEgYXJlYS4KICovCnN0YXRpYyBWSVNPUkNIQU5ORUwgKgp2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIGNoYW5uZWxCeXRlcywKCQkJIFZJU09SQ0hBTk5FTCAqcGFyZW50LCB1bG9uZyBvZmYsIEdVSUQgZ3VpZCwKCQkJIEJPT0wgbmVlZHNfbG9jaykKewoJVklTT1JDSEFOTkVMICpwID0gTlVMTDsKCXZvaWQgKnJjID0gTlVMTDsKCglwID0ga21hbGxvYyhzaXplb2YoVklTT1JDSEFOTkVMKSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKCWlmIChwID09IE5VTEwpIHsKCQlFUlJEUlYoImFsbG9jYXRpb24gZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKCQlyYyA9IE5VTEw7CgkJZ290byBBd2F5OwoJfQoJcC0+bWVtcmVnaW9uID0gTlVMTDsKCXAtPm5lZWRzX2xvY2sgPSBuZWVkc19sb2NrOwoJc3Bpbl9sb2NrX2luaXQoJnAtPmluc2VydF9sb2NrKTsKCXNwaW5fbG9ja19pbml0KCZwLT5yZW1vdmVfbG9jayk7CgoJLyogcHJlcGFyZSBjaGFuX2hkciAoYWJzdHJhY3Rpb24gdG8gcmVhZC93cml0ZSBjaGFubmVsIG1lbW9yeSkgKi8KCWlmIChwYXJlbnQgPT0gTlVMTCkKCQlwLT5tZW1yZWdpb24gPQoJCSAgICB2aXNvcl9tZW1yZWdpb25fY3JlYXRlKHBoeXNhZGRyLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKCWVsc2UKCQlwLT5tZW1yZWdpb24gPQoJCSAgICB2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQocGFyZW50LT5tZW1yZWdpb24sCgkJCQkJCSAgICAgIG9mZiwKCQkJCQkJICAgICAgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSk7CglpZiAocC0+bWVtcmVnaW9uID09IE5VTEwpIHsKCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9jcmVhdGUgZmFpbGVkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CgkJcmMgPSBOVUxMOwoJCWdvdG8gQXdheTsKCX0KCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChwLT5tZW1yZWdpb24sIDAsICZwLT5jaGFuX2hkciwKCQkJCSBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKSA8IDApIHsKCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CgkJcmMgPSBOVUxMOwoJCWdvdG8gQXdheTsKCX0KCWlmIChjaGFubmVsQnl0ZXMgPT0gMCkKCQkvKiB3ZSBoYWQgYmV0dGVyIGJlIGEgQ0xJRU5UIG9mIHRoaXMgY2hhbm5lbCAqLwoJCWNoYW5uZWxCeXRlcyA9ICh1bG9uZykgcC0+Y2hhbl9oZHIuU2l6ZTsKCWlmIChTVFJVQ1RTRVFVQUwoZ3VpZCwgR3VpZDApKQoJCS8qIHdlIGhhZCBiZXR0ZXIgYmUgYSBDTElFTlQgb2YgdGhpcyBjaGFubmVsICovCgkJZ3VpZCA9IHAtPmNoYW5faGRyLlR5cGU7CglpZiAodmlzb3JfbWVtcmVnaW9uX3Jlc2l6ZShwLT5tZW1yZWdpb24sIGNoYW5uZWxCeXRlcykgPCAwKSB7CgkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVzaXplIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CgkJcmMgPSBOVUxMOwoJCWdvdG8gQXdheTsKCX0KCXAtPnNpemUgPSBjaGFubmVsQnl0ZXM7CglwLT5ndWlkID0gZ3VpZDsKCglyYyA9IHA7CkF3YXk6CgoJaWYgKHJjID09IE5VTEwpIHsKCQlpZiAocCAhPSBOVUxMKSB7CgkJCXZpc29yY2hhbm5lbF9kZXN0cm95KHApOwoJCQlwID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0KClZJU09SQ0hBTk5FTCAqCnZpc29yY2hhbm5lbF9jcmVhdGUoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIGNoYW5uZWxCeXRlcywgR1VJRCBndWlkKQp7CglyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsQnl0ZXMsIE5VTEwsIDAsIGd1aWQsCgkJCQkJRkFMU0UpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGUpOwoKVklTT1JDSEFOTkVMICoKdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2soSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIGNoYW5uZWxCeXRlcywKCQkJICAgICAgR1VJRCBndWlkKQp7CglyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsQnl0ZXMsIE5VTEwsIDAsIGd1aWQsCgkJCQkJVFJVRSk7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2spOwoKVklTT1JDSEFOTkVMICoKdmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKHVsb25nIGNoYW5uZWxCeXRlcywKCQkJICAgICAgIFZJU09SQ0hBTk5FTCAqcGFyZW50LCB1bG9uZyBvZmYsIEdVSUQgZ3VpZCkKewoJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cygwLCBjaGFubmVsQnl0ZXMsIHBhcmVudCwgb2ZmLCBndWlkLAoJCQkJCUZBTFNFKTsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWQpOwoKVklTT1JDSEFOTkVMICoKdmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkX3dpdGhfbG9jayh1bG9uZyBjaGFubmVsQnl0ZXMsCgkJCQkJIFZJU09SQ0hBTk5FTCAqcGFyZW50LCB1bG9uZyBvZmYsCgkJCQkJIEdVSUQgZ3VpZCkKewoJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cygwLCBjaGFubmVsQnl0ZXMsIHBhcmVudCwgb2ZmLCBndWlkLAoJCQkJCVRSVUUpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZF93aXRoX2xvY2spOwoKdm9pZAp2aXNvcmNoYW5uZWxfZGVzdHJveShWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCnsKCWlmIChjaGFubmVsID09IE5VTEwpCgkJcmV0dXJuOwoJaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbiAhPSBOVUxMKSB7CgkJdmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3koY2hhbm5lbC0+bWVtcmVnaW9uKTsKCQljaGFubmVsLT5tZW1yZWdpb24gPSBOVUxMOwoJfQoJa2ZyZWUoY2hhbm5lbCk7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2Rlc3Ryb3kpOwoKSE9TVEFERFJFU1MKdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCnsKCXJldHVybiB2aXNvcl9tZW1yZWdpb25fZ2V0X3BoeXNhZGRyKGNoYW5uZWwtPm1lbXJlZ2lvbik7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9waHlzYWRkcik7Cgp1bG9uZwp2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCnsKCXJldHVybiBjaGFubmVsLT5zaXplOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKTsKCmNoYXIgKgp2aXNvcmNoYW5uZWxfR1VJRF9pZChHVUlEICpndWlkLCBjaGFyICpzKQp7CglyZXR1cm4gR1VJRF9mb3JtYXQxKGd1aWQsIHMpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9HVUlEX2lkKTsKCmNoYXIgKgp2aXNvcmNoYW5uZWxfaWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKQp7CglyZXR1cm4gdmlzb3JjaGFubmVsX0dVSURfaWQoJmNoYW5uZWwtPmd1aWQsIHMpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9pZCk7CgpjaGFyICoKdmlzb3JjaGFubmVsX3pvbmVpZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGNoYXIgKnMpCnsKCXJldHVybiB2aXNvcmNoYW5uZWxfR1VJRF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuWm9uZUd1aWQsIHMpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF96b25laWQpOwoKSE9TVEFERFJFU1MKdmlzb3JjaGFubmVsX2dldF9jbGllbnRwYXJ0aXRpb24oVklTT1JDSEFOTkVMICpjaGFubmVsKQp7CglyZXR1cm4gY2hhbm5lbC0+Y2hhbl9oZHIuUGFydGl0aW9uSGFuZGxlOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKTsKCkdVSUQKdmlzb3JjaGFubmVsX2dldF9HVUlEKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKewoJcmV0dXJuIGNoYW5uZWwtPmd1aWQ7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9HVUlEKTsKCk1FTVJFR0lPTiAqCnZpc29yY2hhbm5lbF9nZXRfbWVtcmVnaW9uKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKewoJcmV0dXJuIGNoYW5uZWwtPm1lbXJlZ2lvbjsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X21lbXJlZ2lvbik7CgppbnQKdmlzb3JjaGFubmVsX3JlYWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCgkJICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKQp7CglpbnQgcmMgPSB2aXNvcl9tZW1yZWdpb25fcmVhZChjaGFubmVsLT5tZW1yZWdpb24sIG9mZnNldCwKCQkJCSAgICAgIGxvY2FsLCBuYnl0ZXMpOwoJaWYgKChyYyA+PSAwKSAmJiAob2Zmc2V0ID09IDApICYmIChuYnl0ZXMgPj0gc2l6ZW9mKENIQU5ORUxfSEVBREVSKSkpCgkJbWVtY3B5KCZjaGFubmVsLT5jaGFuX2hkciwgbG9jYWwsIHNpemVvZihDSEFOTkVMX0hFQURFUikpOwoJcmV0dXJuIHJjOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9yZWFkKTsKCmludAp2aXNvcmNoYW5uZWxfd3JpdGUoVklTT1JDSEFOTkVMICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCgkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKewoJaWYgKG9mZnNldCA9PSAwICYmIG5ieXRlcyA+PSBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKQoJCW1lbWNweSgmY2hhbm5lbC0+Y2hhbl9oZHIsIGxvY2FsLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKCXJldHVybiB2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLCBvZmZzZXQsIGxvY2FsLCBuYnl0ZXMpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF93cml0ZSk7CgppbnQKdmlzb3JjaGFubmVsX2NsZWFyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LCBVOCBjaCwgdWxvbmcgbmJ5dGVzKQp7CglpbnQgcmMgPSAtMTsKCWludCBidWZzaXplID0gNjU1MzY7CglpbnQgd3JpdHRlbiA9IDA7CglVOCAqYnVmID0gdm1hbGxvYyhidWZzaXplKTsKCglpZiAoYnVmID09IE5VTEwpIHsKCQlFUlJEUlYoIiVzIGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiIsIF9fZnVuY19fKTsKCQlnb3RvIEF3YXk7Cgl9CgltZW1zZXQoYnVmLCBjaCwgYnVmc2l6ZSk7Cgl3aGlsZSAobmJ5dGVzID4gMCkgewoJCXVsb25nIHRoaXNieXRlcyA9IGJ1ZnNpemU7CgkJaW50IHggPSAtMTsKCQlpZiAobmJ5dGVzIDwgdGhpc2J5dGVzKQoJCQl0aGlzYnl0ZXMgPSBuYnl0ZXM7CgkJeCA9IHZpc29yX21lbXJlZ2lvbl93cml0ZShjaGFubmVsLT5tZW1yZWdpb24sIG9mZnNldCArIHdyaXR0ZW4sCgkJCQkJICBidWYsIHRoaXNieXRlcyk7CgkJaWYgKHggPCAwKSB7CgkJCXJjID0geDsKCQkJZ290byBBd2F5OwoJCX0KCQl3cml0dGVuICs9IHRoaXNieXRlczsKCQluYnl0ZXMgLT0gdGhpc2J5dGVzOwoJfQoJcmMgPSAwOwoKQXdheToKCWlmIChidWYgIT0gTlVMTCkgewoJCXZmcmVlKGJ1Zik7CgkJYnVmID0gTlVMTDsKCX0KCXJldHVybiByYzsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY2xlYXIpOwoKdm9pZCAqCnZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKewoJcmV0dXJuICh2b2lkICopICYoY2hhbm5lbC0+Y2hhbl9oZHIpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKTsKCi8qKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgU0lHTkFMX1FVRVVFX0hFQURFUiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYQogKiAgY2hhbm5lbCBoZWFkZXIKICovCiNkZWZpbmUgU0lHX1FVRVVFX09GRlNFVChjaGFuX2hkciwgcSkgXAoJKChjaGFuX2hkciktPm9DaGFubmVsU3BhY2UgKyAoKHEpICogc2l6ZW9mKFNJR05BTF9RVUVVRV9IRUFERVIpKSkKCi8qKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgcXVldWUgZW50cnkgKGRhdGEpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCiAqICBjaGFubmVsIGhlYWRlcgogKi8KI2RlZmluZSBTSUdfREFUQV9PRkZTRVQoY2hhbl9oZHIsIHEsIHNpZ19oZHIsIHNsb3QpIFwKCShTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSArIChzaWdfaGRyKS0+b1NpZ25hbEJhc2UgKyBcCgkgICAgKChzbG90KSAqIChzaWdfaGRyKS0+U2lnbmFsU2l6ZSkpCgovKiogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgZmllbGQgd2l0aGluIGEgU0lHTkFMX1FVRVVFX0hFQURFUiBiYWNrCiAqICBpbnRvIGhvc3QgbWVtb3J5CiAqLwojZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJXAoJKHZpc29yX21lbXJlZ2lvbl93cml0ZShjaGFubmVsLT5tZW1yZWdpb24sCQkJXAoJCQkgICAgICAgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSsgXAoJCQkgICAgICAgb2Zmc2V0b2YoU0lHTkFMX1FVRVVFX0hFQURFUiwgRklFTEQpLAlcCgkJCSAgICAgICAmKChzaWdfaGRyKS0+RklFTEQpLAkJCVwKCQkJICAgICAgIHNpemVvZigoc2lnX2hkciktPkZJRUxEKSkgPj0gMCkKCnN0YXRpYyBCT09MCnNpZ19yZWFkX2hlYWRlcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKCQlTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyKQp7CglCT09MIHJjID0gRkFMU0U7CgoJaWYgKGNoYW5uZWwtPmNoYW5faGRyLm9DaGFubmVsU3BhY2UgPCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKSB7CgkJRVJSRFJWKCJvQ2hhbm5lbFNwYWNlIHRvbyBzbWFsbDogKHN0YXR1cz0lZClcbiIsIHJjKTsKCQlnb3RvIEF3YXk7Cgl9CgoJLyogUmVhZCB0aGUgYXBwcm9wcmlhdGUgU0lHTkFMX1FVRVVFX0hFQURFUiBpbnRvIGxvY2FsIG1lbW9yeS4gKi8KCglpZiAodmlzb3JfbWVtcmVnaW9uX3JlYWQoY2hhbm5lbC0+bWVtcmVnaW9uLAoJCQkJIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSksCgkJCQkgc2lnX2hkciwgc2l6ZW9mKFNJR05BTF9RVUVVRV9IRUFERVIpKSA8IDApIHsKCQlFUlJEUlYoInF1ZXVlPSVkIFNJR19RVUVVRV9PRkZTRVQ9JWQiLAoJCSAgICAgICBxdWV1ZSwgKGludClTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKTsKCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIG9mIHNpZ25hbCBxdWV1ZSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CgkJZ290byBBd2F5OwoJfQoJcmMgPSBUUlVFOwpBd2F5OgoJcmV0dXJuIHJjOwp9CgpzdGF0aWMgQk9PTApzaWdfZG9fZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKCSAgICBTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyLCBVMzIgc2xvdCwgdm9pZCAqZGF0YSwgQk9PTCBpc193cml0ZSkKewoJQk9PTCByYyA9IEZBTFNFOwoJaW50IHNpZ25hbF9kYXRhX29mZnNldCA9IFNJR19EQVRBX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlLAoJCQkJCQkgc2lnX2hkciwgc2xvdCk7CglpZiAoaXNfd3JpdGUpIHsKCQlpZiAodmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwKCQkJCQkgIHNpZ25hbF9kYXRhX29mZnNldCwKCQkJCQkgIGRhdGEsIHNpZ19oZHItPlNpZ25hbFNpemUpIDwgMCkgewoJCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBzaWduYWwgZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CgkJCWdvdG8gQXdheTsKCQl9Cgl9IGVsc2UgewoJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChjaGFubmVsLT5tZW1yZWdpb24sIHNpZ25hbF9kYXRhX29mZnNldCwKCQkJCQkgZGF0YSwgc2lnX2hkci0+U2lnbmFsU2l6ZSkgPCAwKSB7CgkJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3JlYWQgb2Ygc2lnbmFsIGRhdGEgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOwoJCQlnb3RvIEF3YXk7CgkJfQoJfQoJcmMgPSBUUlVFOwpBd2F5OgoJcmV0dXJuIHJjOwp9CgpzdGF0aWMgaW5saW5lIEJPT0wKc2lnX3JlYWRfZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKCSAgICAgIFNJR05BTF9RVUVVRV9IRUFERVIgKnNpZ19oZHIsIFUzMiBzbG90LCB2b2lkICpkYXRhKQp7CglyZXR1cm4gc2lnX2RvX2RhdGEoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIHNsb3QsIGRhdGEsIEZBTFNFKTsKfQoKc3RhdGljIGlubGluZSBCT09MCnNpZ193cml0ZV9kYXRhKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLAoJICAgICAgIFNJR05BTF9RVUVVRV9IRUFERVIgKnNpZ19oZHIsIFUzMiBzbG90LCB2b2lkICpkYXRhKQp7CglyZXR1cm4gc2lnX2RvX2RhdGEoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIHNsb3QsIGRhdGEsIFRSVUUpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKc2FmZV9zaWdfcXVldWVfdmFsaWRhdGUocFNJR05BTF9RVUVVRV9IRUFERVIgcHNhZmVfc3FoLAoJCQlwU0lHTkFMX1FVRVVFX0hFQURFUiBwdW5zYWZlX3NxaCwKCQkJVTMyICpwaGVhZCwgVTMyICpwdGFpbCkKewoJaWYgKCgqcGhlYWQgPj0gcHNhZmVfc3FoLT5NYXhTaWduYWxTbG90cykKCSAgICB8fCAoKnB0YWlsID49IHBzYWZlX3NxaC0+TWF4U2lnbmFsU2xvdHMpKSB7CgkJLyogQ2hvb3NlIDAgb3IgbWF4LCBtYXliZSBiYXNlZCBvbiBjdXJyZW50IHRhaWwgdmFsdWUgKi8KCQkqcGhlYWQgPSAwOwoJCSpwdGFpbCA9IDA7CgoJCS8qIFN5bmMgd2l0aCBjbGllbnQgYXMgbmVjZXNzYXJ5ICovCgkJcHVuc2FmZV9zcWgtPkhlYWQgPSAqcGhlYWQ7CgkJcHVuc2FmZV9zcWgtPlRhaWwgPSAqcHRhaWw7CgoJCUVSUkRSVigic2FmZV9zaWdfcXVldWVfdmFsaWRhdGU6IGhlYWQgPSAweCV4LCB0YWlsID0gMHgleCwgTWF4U2xvdHMgPSAweCV4IiwKCQkgICAgICpwaGVhZCwgKnB0YWlsLCBwc2FmZV9zcWgtPk1heFNpZ25hbFNsb3RzKTsKCQlyZXR1cm4gMDsKCX0KCXJldHVybiAxOwp9CQkJCS8qIGVuZCBzYWZlX3NpZ19xdWV1ZV92YWxpZGF0ZSAqLwoKQk9PTAp2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpCnsKCUJPT0wgcmMgPSBGQUxTRTsKCVNJR05BTF9RVUVVRV9IRUFERVIgc2lnX2hkcjsKCglpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKCQlzcGluX2xvY2soJmNoYW5uZWwtPnJlbW92ZV9sb2NrKTsKCglpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKSB7CgkJcmMgPSBGQUxTRTsKCQlnb3RvIEF3YXk7Cgl9CglpZiAoc2lnX2hkci5IZWFkID09IHNpZ19oZHIuVGFpbCkgewoJCXJjID0gRkFMU0U7CS8qIG5vIHNpZ25hbHMgdG8gcmVtb3ZlICovCgkJZ290byBBd2F5OwoJfQoJc2lnX2hkci5UYWlsID0gKHNpZ19oZHIuVGFpbCArIDEpICUgc2lnX2hkci5NYXhTaWduYWxTbG90czsKCWlmICghc2lnX3JlYWRfZGF0YShjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHNpZ19oZHIuVGFpbCwgbXNnKSkgewoJCUVSUkRSVigic2lnX3JlYWRfZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CgkJZ290byBBd2F5OwoJfQoJc2lnX2hkci5OdW1TaWduYWxzUmVjZWl2ZWQrKzsKCgkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCgkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCgkgKi8KCU1FTU9SWUJBUlJJRVI7CglpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIFRhaWwpKSB7CgkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgVGFpbCBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLAoJCSAgICAgICByYyk7CgkJZ290byBBd2F5OwoJfQoJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBOdW1TaWduYWxzUmVjZWl2ZWQpKSB7CgkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtU2lnbmFsc1JlY2VpdmVkIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKCQlnb3RvIEF3YXk7Cgl9CglyYyA9IFRSVUU7CkF3YXk6CglpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKCQlzcGluX3VubG9jaygmY2hhbm5lbC0+cmVtb3ZlX2xvY2spOwoKCXJldHVybiByYzsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKTsKCkJPT0wKdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwgdm9pZCAqbXNnKQp7CglCT09MIHJjID0gRkFMU0U7CglTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CgoJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCgkJc3Bpbl9sb2NrKCZjaGFubmVsLT5pbnNlcnRfbG9jayk7CgoJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkgewoJCXJjID0gRkFMU0U7CgkJZ290byBBd2F5OwoJfQoKCXNpZ19oZHIuSGVhZCA9ICgoc2lnX2hkci5IZWFkICsgMSkgJSBzaWdfaGRyLk1heFNpZ25hbFNsb3RzKTsKCWlmIChzaWdfaGRyLkhlYWQgPT0gc2lnX2hkci5UYWlsKSB7CgkJc2lnX2hkci5OdW1PdmVyZmxvd3MrKzsKCQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIE51bU92ZXJmbG93cykpIHsKCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtT3ZlcmZsb3dzIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKCQkJZ290byBBd2F5OwoJCX0KCQlyYyA9IEZBTFNFOwoJCWdvdG8gQXdheTsKCX0KCglpZiAoIXNpZ193cml0ZV9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5IZWFkLCBtc2cpKSB7CgkJRVJSRFJWKCJzaWdfd3JpdGVfZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CgkJZ290byBBd2F5OwoJfQoJc2lnX2hkci5OdW1TaWduYWxzU2VudCsrOwoKCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KCSAqLwoJTUVNT1JZQkFSUklFUjsKCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgSGVhZCkpIHsKCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBIZWFkIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsCgkJICAgICAgIHJjKTsKCQlnb3RvIEF3YXk7Cgl9CglpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIE51bVNpZ25hbHNTZW50KSkgewoJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIE51bVNpZ25hbHNTZW50IGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKCQlnb3RvIEF3YXk7Cgl9CglyYyA9IFRSVUU7CkF3YXk6CglpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKCQlzcGluX3VubG9jaygmY2hhbm5lbC0+aW5zZXJ0X2xvY2spOwoKCXJldHVybiByYzsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KTsKCgppbnQKdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlKQp7CglTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CglVMzIgc2xvdHNfYXZhaWwsIHNsb3RzX3VzZWQ7CglVMzIgaGVhZCwgdGFpbDsKCglpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQoJCXJldHVybiAwOwoJaGVhZCA9IHNpZ19oZHIuSGVhZDsKCXRhaWwgPSBzaWdfaGRyLlRhaWw7CglpZiAoaGVhZCA8IHRhaWwpCgkJaGVhZCA9IGhlYWQgKyBzaWdfaGRyLk1heFNpZ25hbFNsb3RzOwoJc2xvdHNfdXNlZCA9IChoZWFkIC0gdGFpbCk7CglzbG90c19hdmFpbCA9IHNpZ19oZHIuTWF4U2lnbmFscyAtIHNsb3RzX3VzZWQ7CglyZXR1cm4gKGludCkgc2xvdHNfYXZhaWw7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKTsKCmludAp2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlKQp7CglTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CglpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQoJCXJldHVybiAwOwoJcmV0dXJuIChpbnQpIHNpZ19oZHIuTWF4U2lnbmFsczsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKTsKCnN0YXRpYyB2b2lkCnNpZ3F1ZXVlX2RlYnVnKFNJR05BTF9RVUVVRV9IRUFERVIgKnEsIGludCB3aGljaCwgc3RydWN0IHNlcV9maWxlICpzZXEpCnsKCXNlcV9wcmludGYoc2VxLCAiU2lnbmFsIFF1ZXVlICMlZFxuIiwgd2hpY2gpOwoJc2VxX3ByaW50ZihzZXEsICIgICBWZXJzaW9uSWQgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcS0+VmVyc2lvbklkKTsKCXNlcV9wcmludGYoc2VxLCAiICAgVHlwZSAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPlR5cGUpOwoJc2VxX3ByaW50ZihzZXEsICIgICBvU2lnbmFsQmFzZSAgICAgICAgPSAlbGx1XG4iLAoJCSAgIChsb25nIGxvbmcpIHEtPm9TaWduYWxCYXNlKTsKCXNlcV9wcmludGYoc2VxLCAiICAgU2lnbmFsU2l6ZSAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPlNpZ25hbFNpemUpOwoJc2VxX3ByaW50ZihzZXEsICIgICBNYXhTaWduYWxTbG90cyAgICAgPSAlbHVcbiIsCgkJICAgKHVsb25nKSBxLT5NYXhTaWduYWxTbG90cyk7CglzZXFfcHJpbnRmKHNlcSwgIiAgIE1heFNpZ25hbHMgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5NYXhTaWduYWxzKTsKCXNlcV9wcmludGYoc2VxLCAiICAgRmVhdHVyZUZsYWdzICAgICAgID0gJS0xNi4xNkx4XG4iLAoJCSAgIChsb25nIGxvbmcpIHEtPkZlYXR1cmVGbGFncyk7CglzZXFfcHJpbnRmKHNlcSwgIiAgIE51bVNpZ25hbHNTZW50ICAgICA9ICVsbHVcbiIsCgkJICAgKGxvbmcgbG9uZykgcS0+TnVtU2lnbmFsc1NlbnQpOwoJc2VxX3ByaW50ZihzZXEsICIgICBOdW1TaWduYWxzUmVjZWl2ZWQgPSAlbGx1XG4iLAoJCSAgIChsb25nIGxvbmcpIHEtPk51bVNpZ25hbHNSZWNlaXZlZCk7CglzZXFfcHJpbnRmKHNlcSwgIiAgIE51bU92ZXJmbG93cyAgICAgICA9ICVsbHVcbiIsCgkJICAgKGxvbmcgbG9uZykgcS0+TnVtT3ZlcmZsb3dzKTsKCXNlcV9wcmludGYoc2VxLCAiICAgSGVhZCAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpIHEtPkhlYWQpOwoJc2VxX3ByaW50ZihzZXEsICIgICBUYWlsICAgICAgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcS0+VGFpbCk7Cn0KCnZvaWQKdmlzb3JjaGFubmVsX2RlYnVnKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgaW50IG5RdWV1ZXMsCgkJICAgc3RydWN0IHNlcV9maWxlICpzZXEsIFUzMiBvZmYpCnsKCUhPU1RBRERSRVNTIGFkZHIgPSAwOwoJdWxvbmcgbmJ5dGVzID0gMCwgbmJ5dGVzX3JlZ2lvbiA9IDA7CglNRU1SRUdJT04gKm1lbXJlZ2lvbiA9IE5VTEw7CglDSEFOTkVMX0hFQURFUiBoZHI7CglDSEFOTkVMX0hFQURFUiAqcGhkciA9ICZoZHI7CgljaGFyIHNbOTldOwoJaW50IGkgPSAwOwoJaW50IGVycmNvZGUgPSAwOwoKCWlmIChjaGFubmVsID09IE5VTEwpIHsKCQlFUlJEUlYoIiVzIG5vIGNoYW5uZWwiLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQoJbWVtcmVnaW9uID0gY2hhbm5lbC0+bWVtcmVnaW9uOwoJaWYgKG1lbXJlZ2lvbiA9PSBOVUxMKSB7CgkJRVJSRFJWKCIlcyBubyBtZW1yZWdpb24iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQoJYWRkciA9IHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIobWVtcmVnaW9uKTsKCW5ieXRlc19yZWdpb24gPSB2aXNvcl9tZW1yZWdpb25fZ2V0X25ieXRlcyhtZW1yZWdpb24pOwoJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIG9mZiwKCQkJCSAgICBwaGRyLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKCWlmIChlcnJjb2RlIDwgMCkgewoJCXNlcV9wcmludGYoc2VxLAoJCQkgICAiUmVhZCBvZiBjaGFubmVsIGhlYWRlciBmYWlsZWQgd2l0aCBlcnJjb2RlPSVkKVxuIiwKCQkJICAgZXJyY29kZSk7CgkJaWYgKG9mZiA9PSAwKSB7CgkJCXBoZHIgPSAmY2hhbm5lbC0+Y2hhbl9oZHI7CgkJCXNlcV9wdXRzKHNlcSwgIihmb2xsb3dpbmcgZGF0YSBtYXkgYmUgc3RhbGUpXG4iKTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJbmJ5dGVzID0gKHVsb25nKSAocGhkci0+U2l6ZSk7CglzZXFfcHJpbnRmKHNlcSwgIi0tLSBCZWdpbiBjaGFubmVsIEAweCUtMTYuMTZMeCBmb3IgMHglbHggYnl0ZXMgKHJlZ2lvbj0weCVseCBieXRlcykgLS0tXG4iLAoJCSAgIGFkZHIgKyBvZmYsIG5ieXRlcywgbmJ5dGVzX3JlZ2lvbik7CglzZXFfcHJpbnRmKHNlcSwgIlR5cGUgICAgICAgICAgICA9ICVzXG4iLCBHVUlEX2Zvcm1hdDIoJnBoZHItPlR5cGUsIHMpKTsKCXNlcV9wcmludGYoc2VxLCAiWm9uZUd1aWQgICAgICAgID0gJXNcbiIsCgkJICAgR1VJRF9mb3JtYXQyKCZwaGRyLT5ab25lR3VpZCwgcykpOwoJc2VxX3ByaW50ZihzZXEsICJTaWduYXR1cmUgICAgICAgPSAweCUtMTYuMTZMeFxuIiwKCQkgICAobG9uZyBsb25nKSBwaGRyLT5TaWduYXR1cmUpOwoJc2VxX3ByaW50ZihzZXEsICJMZWdhY3lTdGF0ZSAgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+TGVnYWN5U3RhdGUpOwoJc2VxX3ByaW50ZihzZXEsICJTcnZTdGF0ZSAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+U3J2U3RhdGUpOwoJc2VxX3ByaW50ZihzZXEsICJDbGlTdGF0ZUJvb3QgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+Q2xpU3RhdGVCb290KTsKCXNlcV9wcmludGYoc2VxLCAiQ2xpU3RhdGVPUyAgICAgID0gJWx1XG4iLCAodWxvbmcpIHBoZHItPkNsaVN0YXRlT1MpOwoJc2VxX3ByaW50ZihzZXEsICJIZWFkZXJTaXplICAgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+SGVhZGVyU2l6ZSk7CglzZXFfcHJpbnRmKHNlcSwgIlNpemUgICAgICAgICAgICA9ICVsbHVcbiIsIChsb25nIGxvbmcpIHBoZHItPlNpemUpOwoJc2VxX3ByaW50ZihzZXEsICJGZWF0dXJlcyAgICAgICAgPSAweCUtMTYuMTZsbHhcbiIsCgkJICAgKGxvbmcgbG9uZykgcGhkci0+RmVhdHVyZXMpOwoJc2VxX3ByaW50ZihzZXEsICJQYXJ0aXRpb25IYW5kbGUgPSAweCUtMTYuMTZsbHhcbiIsCgkJICAgKGxvbmcgbG9uZykgcGhkci0+UGFydGl0aW9uSGFuZGxlKTsKCXNlcV9wcmludGYoc2VxLCAiSGFuZGxlICAgICAgICAgID0gMHglLTE2LjE2bGx4XG4iLAoJCSAgIChsb25nIGxvbmcpIHBoZHItPkhhbmRsZSk7CglzZXFfcHJpbnRmKHNlcSwgIlZlcnNpb25JZCAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5WZXJzaW9uSWQpOwoJc2VxX3ByaW50ZihzZXEsICJvQ2hhbm5lbFNwYWNlICAgPSAlbGx1XG4iLAoJCSAgIChsb25nIGxvbmcpIHBoZHItPm9DaGFubmVsU3BhY2UpOwoJaWYgKChwaGRyLT5vQ2hhbm5lbFNwYWNlID09IDApIHx8IChlcnJjb2RlIDwgMCkpCgkJOwoJZWxzZQoJCWZvciAoaSA9IDA7IGkgPCBuUXVldWVzOyBpKyspIHsKCQkJU0lHTkFMX1FVRVVFX0hFQURFUiBxOwoJCQllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKCQkJCQkJICAgIG9mZiArIHBoZHItPm9DaGFubmVsU3BhY2UgKwoJCQkJCQkgICAgKGkgKiBzaXplb2YocSkpLAoJCQkJCQkgICAgJnEsIHNpemVvZihxKSk7CgkJCWlmIChlcnJjb2RlIDwgMCkgewoJCQkJc2VxX3ByaW50ZihzZXEsCgkJCQkJICAgImZhaWxlZCB0byByZWFkIHNpZ25hbCBxdWV1ZSAjJWQgZnJvbSBjaGFubmVsIEAweCUtMTYuMTZMeCBlcnJjb2RlPSVkXG4iLAoJCQkJCSAgIGksIGFkZHIsIGVycmNvZGUpOwoJCQkJY29udGludWU7CgkJCX0KCQkJc2lncXVldWVfZGVidWcoJnEsIGksIHNlcSk7CgkJfQoJc2VxX3ByaW50ZihzZXEsICItLS0gRW5kICAgY2hhbm5lbCBAMHglLTE2LjE2THggZm9yIDB4JWx4IGJ5dGVzIC0tLVxuIiwKCQkgICBhZGRyICsgb2ZmLCBuYnl0ZXMpOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kZWJ1Zyk7Cgp2b2lkCnZpc29yY2hhbm5lbF9kdW1wX3NlY3Rpb24oVklTT1JDSEFOTkVMICpjaGFuLCBjaGFyICpzLAoJCQkgIGludCBvZmYsIGludCBsZW4sIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQp7CgljaGFyICpidWYsICp0YnVmLCAqZm10YnVmOwoJaW50IGZtdGJ1ZnNpemUgPSAwOwoJaW50IGk7CglpbnQgZXJyY29kZSA9IDA7CgoJZm10YnVmc2l6ZSA9IDEwMCAqIENPVlEobGVuLCAxNik7CglidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKCWZtdGJ1ZiA9IGttYWxsb2MoZm10YnVmc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKCWlmIChidWYgPT0gTlVMTCB8fCBmbXRidWYgPT0gTlVMTCkKCQlnb3RvIEF3YXk7CgoJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW4sIG9mZiwgYnVmLCBsZW4pOwoJaWYgKGVycmNvZGUgPCAwKSB7CgkJRVJSRFJWKCIlcyBmYWlsZWQgdG8gcmVhZCAlcyBmcm9tIGNoYW5uZWwgZXJyY29kZT0lZCIsCgkJICAgICAgIHMsIF9fZnVuY19fLCBlcnJjb2RlKTsKCQlnb3RvIEF3YXk7Cgl9CglzZXFfcHJpbnRmKHNlcSwgImNoYW5uZWwgJXM6XG4iLCBzKTsKCXRidWYgPSBidWY7Cgl3aGlsZSAobGVuID4gMCkgewoJCWkgPSAobGVuIDwgMTYpID8gbGVuIDogMTY7CgkJaGV4X2R1bXBfdG9fYnVmZmVyKHRidWYsIGksIDE2LCAxLCBmbXRidWYsIGZtdGJ1ZnNpemUsIFRSVUUpOwoJCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsIGZtdGJ1Zik7CgkJdGJ1ZiArPSAxNjsKCQlsZW4gLT0gMTY7Cgl9CgpBd2F5OgoJaWYgKGJ1ZiAhPSBOVUxMKSB7CgkJa2ZyZWUoYnVmKTsKCQlidWYgPSBOVUxMOwoJfQoJaWYgKGZtdGJ1ZiAhPSBOVUxMKSB7CgkJa2ZyZWUoZm10YnVmKTsKCQlmbXRidWYgPSBOVUxMOwoJfQp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kdW1wX3NlY3Rpb24pOwo=