Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRocmVhZC5jcHAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2luY2x1ZGUgInRocmVhZCIKI2luY2x1ZGUgImV4Y2VwdGlvbiIKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KCl9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAoKdGhyZWFkOjp+dGhyZWFkKCkKewogICAgaWYgKF9fdF8gIT0gbnVsbHB0cikKICAgICAgICB0ZXJtaW5hdGUoKTsKfQoKdm9pZAp0aHJlYWQ6OmpvaW4oKQp7CiAgICBpbnQgZWMgPSBwdGhyZWFkX2pvaW4oX190XywgMCk7CiAgICBpZiAoZWMpCiAgICAgICAgdGhyb3cgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUoZWMsIHN5c3RlbV9jYXRlZ29yeSgpKSwgInRocmVhZDo6am9pbiBmYWlsZWQiKTsKICAgIF9fdF8gPSBudWxscHRyOwp9Cgp2b2lkCnRocmVhZDo6ZGV0YWNoKCkKewogICAgaW50IGVjID0gRUlOVkFMOwogICAgaWYgKF9fdF8gIT0gMCkKICAgIHsKICAgICAgICBlYyA9IHB0aHJlYWRfZGV0YWNoKF9fdF8pOwogICAgICAgIGlmIChlYyA9PSAwKQogICAgICAgICAgICBfX3RfID0gMDsKICAgIH0KICAgIGlmIChlYykKICAgICAgICB0aHJvdyBzeXN0ZW1fZXJyb3IoZXJyb3JfY29kZShlYywgc3lzdGVtX2NhdGVnb3J5KCkpLCAidGhyZWFkOjpkZXRhY2ggZmFpbGVkIik7Cn0KCnVuc2lnbmVkCnRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKQp7CiAgICBpbnQgbjsKICAgIGludCBtaWJbMl0gPSB7Q1RMX0hXLCBIV19OQ1BVfTsKICAgIHN0ZDo6c2l6ZV90IHMgPSBzaXplb2Yobik7CiAgICBzeXNjdGwobWliLCAyLCAmbiwgJnMsIDAsIDApOwogICAgcmV0dXJuIG47Cn0KCm5hbWVzcGFjZSB0aGlzX3RocmVhZAp7Cgp2b2lkCnNsZWVwX2Zvcihjb25zdCBjaHJvbm86Om5hbm9zZWNvbmRzJiBucykKewogICAgdXNpbmcgbmFtZXNwYWNlIGNocm9ubzsKICAgIGlmIChucyA+PSBuYW5vc2Vjb25kczo6emVybygpKQogICAgewogICAgICAgIHRpbWVzcGVjIHRzOwogICAgICAgIHRzLnR2X3NlYyA9IHN0YXRpY19jYXN0PGRlY2x0eXBlKHRzLnR2X3NlYyk+KGR1cmF0aW9uX2Nhc3Q8c2Vjb25kcz4obnMpLmNvdW50KCkpOwogICAgICAgIHRzLnR2X25zZWMgPSBzdGF0aWNfY2FzdDxkZWNsdHlwZSh0cy50dl9uc2VjKT4oKG5zIC0gc2Vjb25kcyh0cy50dl9zZWMpKS5jb3VudCgpKTsKICAgICAgICBuYW5vc2xlZXAoJnRzLCAwKTsKICAgIH0KfQoKfSAgLy8gdGhpc190aHJlYWQKCl9MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQK