LyoKICogTW9zdGx5IGRvbmUgYWZ0ZXIgdGhlIFNjaXRlY2ggQmlvcyBlbXVsYXRpb24KICogV3JpdHRlbiBieSBIYW5zLUr2cmcgRnJpZWRlbgogKiBIeXBlcmlvbiBFbnRlcnRhaW5tZW50CiAqLwojaW5jbHVkZSAieDg2ZW11LmgiCiNpbmNsdWRlICJnbHVlLmgiCgojdW5kZWYgREVCVUcKI2lmZGVmIERFQlVHCiNkZWZpbmUgUFJJTlRGKGZtdCwgYXJncy4uLikgcHJpbnRmKGZtdCwgIyMgYXJncykKI2Vsc2UKI2RlZmluZSBQUklOVEYoZm10LCBhcmdzLi4uKQojZW5kaWYKCiNkZWZpbmUgQklPU19TRUcgMHhGRkYwCiNkZWZpbmUgUENJQklPU19TVUNDRVNTRlVMIDAKI2RlZmluZSBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQgMHg4NgoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVCWVRFOwp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVXT1JEOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Cgp0eXBlZGVmIGNoYXIgQllURTsKdHlwZWRlZiBzaG9ydCBXT1JUOwp0eXBlZGVmIGxvbmcgTE9ORzsKCnN0YXRpYyBpbmxpbmUgVUJZVEUgcmVhZF9ieXRlKHZvbGF0aWxlIFVCWVRFKiBmcm9tKQp7CiAgICBpbnQgeDsKICAgIGFzbSB2b2xhdGlsZSAoImxieiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOwogICAgcmV0dXJuIChVQllURSl4Owp9CgpzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZSh2b2xhdGlsZSBVQllURSAqdG8sIGludCB4KQp7CiAgICBhc20gdm9sYXRpbGUgKCJzdGIgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Cn0KCnN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqZnJvbSkKewogICAgaW50IHg7CiAgICBhc20gdm9sYXRpbGUgKCJsaGJyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIgKCpmcm9tKSk7CiAgICByZXR1cm4gKFVXT1JEKXg7Cn0KCnN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqZnJvbSkKewogICAgaW50IHg7CiAgICBhc20gdm9sYXRpbGUgKCJsaHogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKICAgIHJldHVybiAoVVdPUkQpeDsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfbGl0dGxlKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCnsKICAgIGFzbSB2b2xhdGlsZSAoInN0aGJyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfYmlnKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCnsKICAgIGFzbSB2b2xhdGlsZSAoInN0aCAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKfQoKc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICpmcm9tKQp7CiAgICB1bnNpZ25lZCBsb25nIHg7CiAgICBhc20gdm9sYXRpbGUgKCJsd2JyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIoKmZyb20pKTsKICAgIHJldHVybiAoVUxPTkcpeDsKfQoKc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICpmcm9tKQp7CiAgICB1bnNpZ25lZCBsb25nIHg7CiAgICBhc20gdm9sYXRpbGUgKCJsd3ogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKICAgIHJldHVybiAoVUxPTkcpeDsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICp0bywgVUxPTkcgeCkKewogICAgYXNtIHZvbGF0aWxlICgic3R3YnJ4ICUxLDAsJTJcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19iaWcodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQp7CiAgICBhc20gdm9sYXRpbGUgKCJzdHcgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Cn0KCiNkZWZpbmUgcG9ydF90b19tZW0oZnJvbSkgKDB4RkUwMDAwMDB8KGZyb20pKQojZGVmaW5lIGluX2J5dGUoZnJvbSkgcmVhZF9ieXRlKCAoVUJZVEUgKilwb3J0X3RvX21lbShmcm9tKSkKI2RlZmluZSBpbl93b3JkKGZyb20pIHJlYWRfd29yZF9saXR0bGUoKFVXT1JEICopcG9ydF90b19tZW0oZnJvbSkpCiNkZWZpbmUgaW5fbG9uZyhmcm9tKSByZWFkX2xvbmdfbGl0dGxlKChVTE9ORyAqKXBvcnRfdG9fbWVtKGZyb20pKQojZGVmaW5lIG91dF9ieXRlKHRvLCB2YWwpIHdyaXRlX2J5dGUoKFVCWVRFICopcG9ydF90b19tZW0odG8pLCB2YWwpCiNkZWZpbmUgb3V0X3dvcmQodG8sIHZhbCkgd3JpdGVfd29yZF9saXR0bGUoKFVXT1JEICopcG9ydF90b19tZW0odG8pLCB2YWwpCiNkZWZpbmUgb3V0X2xvbmcodG8sIHZhbCkgd3JpdGVfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0odG8pLCB2YWwpCgpzdGF0aWMgdm9pZCBYODZBUEkgdW5kZWZpbmVkX2ludHIoaW50IGludG5vKQp7CiAgICBleHRlcm4gdTE2IEExX3Jkdyh1MzIgYWRkcik7CiAgICBpZiAoQTFfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKQogICAgewoJUFJJTlRGKCJVbmRlZmluZWQgaW50ZXJydXB0ICV4aCBjYWxsZWQgQVggPSAleGgsIEJYID0gJXhoLCBDWCA9ICV4aCwgRFggPSAleGhcbiIsCgkgICBpbnRubywgTS54ODYuUl9BWCwgTS54ODYuUl9CWCwgTS54ODYuUl9DWCwgTS54ODYuUl9EWCk7CglYODZFTVVfaGFsdF9zeXMoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCVBSSU5URigiQ2FsbGluZyBpbnRlcnJ1cHQgJXhoLCBBTD0leGgsIEFIPSV4aFxuIiwgaW50bm8sIE0ueDg2LlJfQUwsIE0ueDg2LlJfQUgpOwoJWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50bm8pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBYODZBUEkgaW50NDIoaW50IGludG5vKTsKc3RhdGljIHZvaWQgWDg2QVBJIGludDE1KGludCBpbnRubyk7CgpzdGF0aWMgdm9pZCBYODZBUEkgaW50MTAoaW50IGludG5vKQp7CiAgICBpZiAoQTFfcmR3KGludG5vKjQrMikgPT0gQklPU19TRUcpCglpbnQ0MihpbnRubyk7CiAgICBlbHNlCiAgICB7CglQUklOVEYoImludDEwOiBicmFuY2hpbmcgdG8gJTA0WDolMDRYLCBBTD0leGgsIEFIPSV4aFxuIiwgQTFfcmR3KGludG5vKjQrMiksIEExX3JkdyhpbnRubyo0KSwKCSAgICAgICBNLng4Ni5SX0FMLCBNLng4Ni5SX0FIKTsKCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgWDg2QVBJIGludDFBKGludCBpbnRubykKewogICAgaW50IGRldmljZTsKCiAgICBzd2l0Y2goTS54ODYuUl9BWCkKICAgIHsKICAgIGNhc2UgMHhCMTAxOiAvKiBQQ0kgQmlvcyBQcmVzZW50PyAqLwoJTS54ODYuUl9BTCAgPSAweDAwOwoJTS54ODYuUl9FRFggPSAweDIwNDk0MzUwOwoJTS54ODYuUl9CWCAgPSAweDAyMTA7CglNLng4Ni5SX0NMICA9IDM7CglDTEVBUl9GTEFHKEZfQ0YpOwoJYnJlYWs7CiAgICBjYXNlIDB4QjEwMjogLyogRmluZCBkZXZpY2UgKi8KCWRldmljZSA9IG15cGNpX2ZpbmRfZGV2aWNlKE0ueDg2LlJfRFgsIE0ueDg2LlJfQ1gsIE0ueDg2LlJfU0kpOwoJaWYgKGRldmljZSAhPSAtMSkKCXsKCSAgICBNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOwoJICAgIE0ueDg2LlJfQkggPSBteXBjaV9idXMoZGV2aWNlKTsKCSAgICBNLng4Ni5SX0JMID0gbXlwY2lfZGV2Zm4oZGV2aWNlKTsKCX0KCWVsc2UKCXsKCSAgICBNLng4Ni5SX0FIID0gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwoJfQoJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7CglicmVhazsKICAgIGNhc2UgMHhCMTAzOiAvKiBGaW5kIFBDSSBjbGFzcyBjb2RlICovCglNLng4Ni5SX0FIID0gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwoJLypwcmludGYoIkZpbmQgYnkgY2xhc3Mgbm90IHlldCBpbXBsbWVudGVkIik7ICovCglDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKCWJyZWFrOwogICAgY2FzZSAweEIxMDg6IC8qIHJlYWQgY29uZmlnIGJ5dGUgKi8KCU0ueDg2LlJfQ0wgPSBteXBjaV9yZWFkX2NmZ19ieXRlKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREkpOwoJTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwoJLypwcmludGYoInJlYWRfY29uZmlnX2J5dGUgJXgsJXgsJXggLT4gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCgkvKgkgICAgTS54ODYuUl9DTCk7ICovCglicmVhazsKICAgIGNhc2UgMHhCMTA5OiAvKiByZWFkIGNvbmZpZyB3b3JkICovCglNLng4Ni5SX0NYID0gbXlwY2lfcmVhZF9jZmdfd29yZChNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJKTsKCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7CglDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKCS8qcHJpbnRmKCJyZWFkX2NvbmZpZ193b3JkICV4LCV4LCV4IC0+ICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwoJLyoJICAgIE0ueDg2LlJfQ1gpOyAqLwoJYnJlYWs7CiAgICBjYXNlIDB4QjEwQTogLyogcmVhZCBjb25maWcgZHdvcmQgKi8KCU0ueDg2LlJfRUNYID0gbXlwY2lfcmVhZF9jZmdfbG9uZyhNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJKTsKCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7CglDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKCS8qcHJpbnRmKCJyZWFkX2NvbmZpZ19sb25nICV4LCV4LCV4IC0+ICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwoJLyogICAgTS54ODYuUl9FQ1gpOyAqLwoJYnJlYWs7CiAgICBjYXNlIDB4QjEwQjogLyogd3JpdGUgY29uZmlnIGJ5dGUgKi8KCW15cGNpX3dyaXRlX2NmZ19ieXRlKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksIE0ueDg2LlJfQ0wpOwoJTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwoJLypwcmludGYoIndyaXRlX2NvbmZpZ19ieXRlICV4LCV4LCV4IDwtICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwoJLyogICAgTS54ODYuUl9DTCk7ICovCglicmVhazsKICAgIGNhc2UgMHhCMTBDOiAvKiB3cml0ZSBjb25maWcgd29yZCAqLwoJbXlwY2lfd3JpdGVfY2ZnX3dvcmQoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgTS54ODYuUl9DWCk7CglNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOwoJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7CgkvKnByaW50Zigid3JpdGVfY29uZmlnX3dvcmQgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCgkvKgkgICAgTS54ODYuUl9DWCk7ICovCglicmVhazsKICAgIGNhc2UgMHhCMTBEOiAvKiB3cml0ZSBjb25maWcgZHdvcmQgKi8KCW15cGNpX3dyaXRlX2NmZ19sb25nKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksIE0ueDg2LlJfRUNYKTsKCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7CglDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKCS8qcHJpbnRmKCJ3cml0ZV9jb25maWdfbG9uZyAleCwleCwleCA8LSAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgKi8KCS8qCSAgICBNLng4Ni5SX0VDWCk7ICovCglicmVhazsKICAgIGRlZmF1bHQ6CglQUklOVEYoIkJJT1MgaW50ICV4aDogVW5rbm93biBmdW5jdGlvbiBBWD0lMDR4aFxuIiwgaW50bm8sIE0ueDg2LlJfQVgpOwoKICAgIH0KfQoKdm9pZCBiaW9zX2luaXQodm9pZCkKewogICAgaW50IGk7CiAgICBYODZFTVVfaW50ckZ1bmNzIGJpb3NfaW50cl90YWJbMjU2XTsKCiAgICBmb3IgKGk9MDsgaTwyNTY7IGkrKykKICAgIHsKCXdyaXRlX2xvbmdfbGl0dGxlKE0ubWVtX2Jhc2UraSo0LCBCSU9TX1NFRzw8MTYpOwoJYmlvc19pbnRyX3RhYltpXSA9IHVuZGVmaW5lZF9pbnRyOwogICAgfQoKICAgIGJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKICAgIGJpb3NfaW50cl90YWJbMHgxQV0gPSBpbnQxQTsKICAgIGJpb3NfaW50cl90YWJbMHg0Ml0gPSBpbnQ0MjsKICAgIGJpb3NfaW50cl90YWJbMHgxNV0gPSBpbnQxNTsKCiAgICBiaW9zX2ludHJfdGFiWzB4NkRdID0gaW50NDI7CgogICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKGJpb3NfaW50cl90YWIpOwogICAgdmlkZW9faW5pdCgpOwp9Cgp1bnNpZ25lZCBjaGFyIHNldHVwXzQweDI1W10gPQp7CiAgICAweDM4LCAweDI4LCAweDJkLCAweDBhLCAweDFmLCA2LCAweDE5LAogICAgMHgxYywgMiwgNywgNiwgNywgMCwgMCwgMCwgMAp9OwoKdW5zaWduZWQgY2hhciBzZXR1cF84MHgyNVtdID0KewogICAgMHg3MSwgMHg1MCwgMHg1YSwgMHgwYSwgMHgxZiwgNiwgMHgxOSwKICAgIDB4MWMsIDIsIDcsIDYsIDcsIDAsIDAsIDAsIDAKfTsKCnVuc2lnbmVkIGNoYXIgc2V0dXBfZ3JhcGhpY3NbXSA9CnsKICAgIDB4MzgsIDB4MjgsIDB4MjAsIDB4MGEsIDB4N2YsIDYsIDB4NjQsCiAgICAweDcwLCAyLCAxLCA2LCA3LCAwLCAwLCAwLCAwCn07Cgp1bnNpZ25lZCBjaGFyIHNldHVwX2J3W10gPQp7CiAgICAweDYxLCAweDUwLCAweDUyLCAweDBmLCAweDE5LCA2LCAweDE5LAogICAgMHgxOSwgMiwgMHgwZCwgMHgwYiwgMHgwYywgMCwgMCwgMCwgMAp9OwoKdW5zaWduZWQgY2hhciAqIHNldHVwX21vZGVzW10gPQp7CiAgICBzZXR1cF80MHgyNSwgICAgIC8qIG1vZGUgMDogNDB4MjUgYncgdGV4dCAqLwogICAgc2V0dXBfNDB4MjUsICAgICAvKiBtb2RlIDE6IDQweDI1IGNvbCB0ZXh0ICovCiAgICBzZXR1cF84MHgyNSwgICAgIC8qIG1vZGUgMjogODB4MjUgYncgdGV4dCAqLwogICAgc2V0dXBfODB4MjUsICAgICAvKiBtb2RlIDM6IDgweDI1IGNvbCB0ZXh0ICovCiAgICBzZXR1cF9ncmFwaGljcywgIC8qIG1vZGUgNDogMzIweDIwMCBjb2wgZ3JhcGhpY3MgKi8KICAgIHNldHVwX2dyYXBoaWNzLCAgLyogbW9kZSA1OiAzMjB4MjAwIGJ3IGdyYXBoaWNzICovCiAgICBzZXR1cF9ncmFwaGljcywgIC8qIG1vZGUgNjogNjQweDIwMCBidyBncmFwaGljcyAqLwogICAgc2V0dXBfYncgICAgICAgICAvKiBtb2RlIDc6IDgweDI1IG1vbm8gdGV4dCAqLwp9OwoKdW5zaWduZWQgaW50IHNldHVwX2NvbHNbXSA9CnsKICAgIDQwLCA0MCwgODAsIDgwLCA0MCwgNDAsIDgwLCA4MAp9OwoKdW5zaWduZWQgY2hhciBzZXR1cF9tb2Rlc2V0c1tdID0KewogICAgIDB4MkMsIDB4MjgsIDB4MkQsIDB4MjksIDB4MkEsIDB4MkUsIDB4MUUsIDB4MjkKfTsKCnVuc2lnbmVkIGludCBzZXR1cF9idWZzaXplW10gPQp7CiAgICAyMDQ4LCAyMDQ4LCA0MDk2LCAyMDk2LCAxNjM4NCwgMTYzODQsIDE2Mzg0LCA0MDk2Cn07Cgp2b2lkIGJpb3Nfc2V0X21vZGUoaW50IG1vZGUpCnsKICAgIGludCBpOwogICAgdW5zaWduZWQgY2hhciBtb2RlX3NldCA9IHNldHVwX21vZGVzZXRzW21vZGVdOyAvKiBDb250cm9sIHJlZ2lzdGVyIHZhbHVlICovCiAgICB1bnNpZ25lZCBjaGFyICpzZXR1cF9yZWdzID0gc2V0dXBfbW9kZXNbbW9kZV07IC8qIFJlZ2lzdGVyIDNENCBBcnJheSAqLwoKICAgIC8qIFN3aXRjaCB2aWRlbyBvZmYgKi8KICAgIG91dF9ieXRlKDB4M0Q4LCBtb2RlX3NldCAmIDB4MzcpOwoKICAgIC8qIFNldCB1cCBwYXJhbWV0ZXJzIGF0IDNENGggKi8KICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCiAgICB7CglvdXRfYnl0ZSgweDNENCwgKHVuc2lnbmVkIGNoYXIpaSk7CglvdXRfYnl0ZSgweDNENSwgKnNldHVwX3JlZ3MpOwoJc2V0dXBfcmVncysrOwogICAgfQoKICAgIC8qIEVuYWJsZSB2aWRlbyAqLwogICAgb3V0X2J5dGUoMHgzRDgsIG1vZGVfc2V0KTsKCiAgICAvKiBTZXQgb3ZlcnNjYW4gKi8KICAgIGlmIChtb2RlID09IDYpIG91dF9ieXRlKDB4M0Q5LCAweDNGKTsKICAgIGVsc2UgICAgICAgICAgIG91dF9ieXRlKDB4M0Q5LCAweDMwKTsKfQoKc3RhdGljIHZvaWQgYmlvc19wcmludF9zdHJpbmcodm9pZCkKewogICAgZXh0ZXJuIHZvaWQgdmlkZW9fYmlvc19wcmludF9zdHJpbmcoY2hhciAqc3RyaW5nLCBpbnQgeCwgaW50IHksIGludCBhdHRyLCBpbnQgY291bnQpOwogICAgY2hhciAqcyA9IChjaGFyICopKE0ueDg2LlJfRVM8PDQpICsgTS54ODYuUl9CUDsKICAgIGludCBhdHRyOwogICAgaWYgKE0ueDg2LlJfQUwgJiAweDAyKSBhdHRyID0gLSAxOwogICAgZWxzZSAgICAgICAgICAgICAgICAgICBhdHRyID0gTS54ODYuUl9CTDsKICAgIHZpZGVvX2Jpb3NfcHJpbnRfc3RyaW5nKHMsIE0ueDg2LlJfREgsIE0ueDg2LlJfREwsIGF0dHIsIE0ueDg2LlJfQ1gpOwp9CgpzdGF0aWMgdm9pZCBYODZBUEkgaW50NDIoaW50IGludG5vKQp7CiAgICBzd2l0Y2ggKE0ueDg2LlJfQUgpCiAgICB7CiAgICBjYXNlIDB4MDA6CgliaW9zX3NldF9tb2RlKE0ueDg2LlJfQUwpOwoJYnJlYWs7CiAgICBjYXNlIDB4MTM6CgliaW9zX3ByaW50X3N0cmluZygpOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJUFJJTlRGKCJXYXJuaW5nOiBWSURFTyBCSU9TIGludGVycnVwdCAleGggdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiAleGgsIEFMID0gJXhoXG4iLAoJICAgICAgIGludG5vLCBNLng4Ni5SX0FILCBNLng4Ni5SX0FMKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgWDg2QVBJIGludDE1KGludCBpbnRubykKewogICAgUFJJTlRGKCJDYWxsZWQgaW50ZXJydXB0IDE1aDogQVggPSAleGgsIEJYID0gJXhoLCBDWCA9ICV4aCwgRFggPSAleGhcbiIsCgkgICBNLng4Ni5SX0FYLCBNLng4Ni5SX0JYLCBNLng4Ni5SX0NYLCBNLng4Ni5SX0RYKTsKfQo=