LyoKICogQ29weXJpZ2h0IChDKSAyMDE2IFpYSUMgSW5jLgogKgogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9hcmNoL3VhcnQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2FyY2gvdG9wX2Nsb2NrLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CgojZGVmaW5lIENPTkZJR19CQVVEUkFURSA5MjE2MDAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uOiAgICBzZXJpYWxfZ3Bpb19jb25maWcKICogRGVzY3JpcHRpb246IAogKiBQYXJhbWV0ZXJzOiAKICogICBJbnB1dDoKICoKICogICBPdXRwdXQ6CiAqCiAqIFJldHVybnM6IAogKgogKgogKiBPdGhlcnM6IAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIHNlcmlhbF9ncGlvX2NvbmZpZyh2b2lkKQp7CiNpZmRlZiBDT05GSUdfWlgyOTc1MjBWM0VfQ1BFCgl1bnNpZ25lZCBpbnQgdG1wID0gMDsKCS8qdWFydDBfY3RzLS0tLS0+dWFydDFfdHhkKi8KCV9fUkVHKFBBRF9UT1BfRlVOQ19CQVNFKzB4MjApIHw9ICgxPDwyKTsKCXRtcCA9IF9fUkVHKFBBRF9QRF9GVU5DX0JBU0UrMHg0KTsKCXRtcCAmPSB+KDB4Mzw8Mik7CglfX1JFRyhQQURfUERfRlVOQ19CQVNFKzB4NCkgPSB0bXAgfCAoMHgxPDwyKTsKCgkvKnVhcnQwX3J0cy0tLS0tPnVhcnQxX3J4ZCovCiAgICBfX1JFRyhQQURfVE9QX0ZVTkNfQkFTRSsweDIwKSB8PSAoMTw8Myk7Cgl0bXAgPSBfX1JFRyhQQURfUERfRlVOQ19CQVNFKzB4NCk7Cgl0bXAgJj0gfigweDM8PDQpOwoJX19SRUcoUEFEX1BEX0ZVTkNfQkFTRSsweDQpID0gdG1wIHwgKDB4MTw8NCk7CgojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb246IAogKiBEZXNjcmlwdGlvbjogyejWw7Suv9q1xLKozNjCygogKiBQYXJhbWV0ZXJzOiAKICogICBJbnB1dDoKICoKICogICBPdXRwdXQ6CiAqCiAqIFJldHVybnM6IAogKgogKgogKiBPdGhlcnM6IAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIHNlcmlhbF9zZXRicmcodm9pZCkKewogICAgdTMyIHVhcnRDbGsgPSAyNjAwMDAwMDsKICAgIHUzMiBpYnJkID0gdWFydENsayAvIChDT05GSUdfQkFVRFJBVEUgPDwgNCk7CiAgICB1MzIgZmJyZCA9ICgoKHVhcnRDbGstKChpYnJkKkNPTkZJR19CQVVEUkFURSk8PDQpKTw8NikrKENPTkZJR19CQVVEUkFURTw8MykpLyhDT05GSUdfQkFVRFJBVEU8PDQpOwogICAgX19SRUcoVUFSVF9JQlJEKSA9IGlicmQ7CiAgICBfX1JFRyhVQVJUX0ZCUkQpID0gZmJyZDsgIAogICAgI2lmIDAKICAgIGlmKCBfX1JFRyhQTExfNjI0XzIwOF9DRkcwX1JFRykgJiBQTExfNjI0XzIwOF9DRkcwX0xPQ0sgKSAgCiAgICB7CiAgICAgICAgX19SRUcoVUFSVF9JQlJEKSA9IDB4Mzg7CiAgICAgICAgX19SRUcoVUFSVF9GQlJEKSA9IDB4MWI7CiAgICB9ICAgICAgICAgICAgCiAgICBlbHNlCiAgICB7CiAgICAgICAgX19SRUcoVUFSVF9JQlJEKSA9IDB4MjsgICAgIC8qIG1pZGlmeSAhISEgKi8KICAgICAgICBfX1JFRyhVQVJUX0ZCUkQpID0gMHgxNjsKICAgIH0gICAgCiAgICAjZW5kaWYKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uOiAKICogRGVzY3JpcHRpb246ILP1yry7r7Suv9qyzsr9ICAxMTUyMDAKICogUGFyYW1ldGVyczogCiAqICAgSW5wdXQ6CiAqCiAqICAgT3V0cHV0OgogKgogKiBSZXR1cm5zOiAKICoKICoKICogT3RoZXJzOiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHVhcnRfaW5pdCh2b2lkKQp7CglpbnQgY291bnQgPSAzMDAwOwoKCXdoaWxlKF9fUkVHKFVBUlRfRlIpICYgVUFSVF9GUl9UWEJVU1kpewoKCQlpZigtLWNvdW50ID09IDApCgkJewoJCQlicmVhazsKCQl9Cgl9CgkKCS8qINL9vcW4tNPDyejWwyAqLwoJc2VyaWFsX2dwaW9fY29uZmlnKCk7CgoJLyogIL3708NVQVJUICovCglfX1JFRyhVQVJUX0lDUikgPSAweGZmZmY7CglfX1JFRyhVQVJUX0NSKSAmPSAofihVQVJUX0VOIHwgVUFSVF9UWEUpKTsgCgoJCgoJLyogILKozNjCysno1sMgKi8KCXNlcmlhbF9zZXRicmcoKTsgICAgCgoJLyogIMno1sO0q8rkuPHKvc6qOiDO3tCj0ekvMc67zaPWuc67LzjOu8r9vt3Ouy/KucTcIEZJRk8go7u8xLTmxvez9cq8u6/OqiAweDAgKi8KCV9fUkVHKFVBUlRfTENSX0gpICY9ICh+KFVBUlRfQlJFQUsgfCBVQVJUX1BFTiB8IFVBUlRfU1RQMiApKTsKCV9fUkVHKFVBUlRfTENSX0gpIHw9IChVQVJUX1dMRU5fOCB8IFVBUlRfRkVOICk7CgoJLyogIMbBsc7L+dPQtcR1YXJ0xKO/6beis/a1xNbQts8gKi8KCV9fUkVHKFVBUlRfSU1TQykgJj0gKH5VQVJUX0lOVF9NQVNLKTsKCgkvKiAgyrnE3FVBUlQgKi8KCV9fUkVHKFVBUlRfQ1IpIHw9IChVQVJUX1RYRSB8IFVBUlRfRU4gKTsgCgp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uOiAgICB1YXJ0X3B1dGMKICogRGVzY3JpcHRpb246IAogKiBQYXJhbWV0ZXJzOiAKICogICBJbnB1dDoKICoKICogICBPdXRwdXQ6CiAqCiAqIFJldHVybnM6IAogKgogKgogKiBPdGhlcnM6IAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIHVhcnRfcHV0Yyhjb25zdCBjaGFyIGMpCnsKCS8qILXItP23osvNIEZJRk8gsrvC+qOsv8nS1NC0yv2+3SAqLwoJd2hpbGUgKChfX1JFRyhVQVJUX0ZSKSAmIFVBUlRfVFhGRikgIT0gMCApOwogICAgX19SRUcoVUFSVF9EUikgPSBjOwogICAgCgkvKiBJZiBcbiwgYWxzbyBkbyBcciAqLwoJaWYgKGMgPT0gJ1xuJykKCQl1YXJ0X3B1dGMoJ1xyJyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGdW5jdGlvbjogICAgdWFydF9wdXRzCiAqIERlc2NyaXB0aW9uOiAKICogUGFyYW1ldGVyczogCiAqICAgSW5wdXQ6CiAqCiAqICAgT3V0cHV0OgogKgogKiBSZXR1cm5zOiAKICoKICoKICogT3RoZXJzOiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHVhcnRfcHV0cyAoY29uc3QgY2hhciAqcykKewoJd2hpbGUgKCpzKSB7CgkJdWFydF9wdXRjICgqcysrKTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb246ICAgIHVhcnRfZ2V0YwogKiBEZXNjcmlwdGlvbjogCiAqIFBhcmFtZXRlcnM6IAogKiAgIElucHV0OgogKgogKiAgIE91dHB1dDoKICoKICogUmV0dXJuczogCiAqCiAqCiAqIE90aGVyczogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KY2hhciB1YXJ0X2dldGModm9pZCkKewoJd2hpbGUgKChfX1JFRyhVQVJUX0ZSKSAmIFVBUlRfUlhGRSkgIT0gMCApOwoJcmV0dXJuIChfX1JFRyhVQVJUX0RSKSAmIDB4ZmYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGdW5jdGlvbjogICAgdWFydF90c3RjCiAqIERlc2NyaXB0aW9uOiAKICogUGFyYW1ldGVyczogCiAqICAgSW5wdXQ6CiAqCiAqICAgT3V0cHV0OgogKgogKiBSZXR1cm5zOiAKICoKICoKICogT3RoZXJzOiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgdWFydF90c3RjKHZvaWQpCnsKICAgIGlmKCBfX1JFRyhVQVJUX0ZSKSAmIFVBUlRfUlhGRSApCiAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8vtcjT2jHKsaOsvdPK1UZJRk/Oqr/Vo6zDu9PQyv2+3QogICAgZWxzZQogICAgICAgIHJldHVybiAxOyAgICAgICAvL7XI09owyrGjrL3TytVGSUZPsrvOqr/Vo6zT0Mr9vt07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uOiAKICogRGVzY3JpcHRpb246IAogKiBQYXJhbWV0ZXJzOiAKICogICBJbnB1dDoKICoKICogICBPdXRwdXQ6CiAqCiAqIFJldHVybnM6IAogKgogKgogKiBPdGhlcnM6IAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQgVUFSVF9SZWFkKGNoYXIgKnBjaEJ1ZiwgaW50IGR3TGVuKQp7CiAgICBpbnQgaSA9IDA7Cglmb3IoaT0wO2k8ZHdMZW47aSsrKQoJewoJICAgIHBjaEJ1ZltpXSA9IChjaGFyKXVhcnRfZ2V0YygpOwoJfQoKCXJldHVybiBkd0xlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb246IAogKiBEZXNjcmlwdGlvbjogCiAqIFBhcmFtZXRlcnM6IAogKiAgIElucHV0OgogKgogKiAgIE91dHB1dDoKICoKICogUmV0dXJuczogCiAqCiAqCiAqIE90aGVyczogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludCBVQVJUX1dyaXRlKGNoYXIgKnBjaEJ1ZiwgaW50IGR3TGVuKQoKewoJaW50IGkgPSAwOwoJZm9yKGk9MDtpPGR3TGVuO2krKykKCXsKCSAgICB1YXJ0X3B1dGMocGNoQnVmW2ldKTsKCX0KCglyZXR1cm4gZHdMZW47Cn0KCmludCBVQVJUX0NoZWNrX1N5bmMoY2hhciAqcGNoQnVmLCBpbnQgZHdMZW4pCnsKICAgIGludCByZXQgPSAwOwoJcmV0ID0gVUFSVF9SZWFkKHBjaEJ1ZiwxKTsKICAgIAoJaWYoMHg1QSE9KnBjaEJ1ZikKCXsKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gcmV0Owp9CgoKCg==