Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKLy8gPHRocmVhZD4KCi8vIGNsYXNzIHRocmVhZAoKLy8gdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIC4uLkFyZ3M+IHRocmVhZChGJiYgZiwgQXJncyYmLi4uIGFyZ3MpOwoKI2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPG5ldz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKdW5zaWduZWQgdGhyb3dfb25lID0gMHhGRkZGOwoKdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IHMpIHRocm93KHN0ZDo6YmFkX2FsbG9jKQp7CiAgICBpZiAodGhyb3dfb25lID09IDApCiAgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgIC0tdGhyb3dfb25lOwogICAgcmV0dXJuIHN0ZDo6bWFsbG9jKHMpOwp9Cgp2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCogcCkgdGhyb3coKQp7CiAgICBzdGQ6OmZyZWUocCk7Cn0KCmJvb2wgZl9ydW4gPSBmYWxzZTsKCnZvaWQgZigpCnsKICAgIGZfcnVuID0gdHJ1ZTsKfQoKY2xhc3MgRwp7CiAgICBpbnQgYWxpdmVfOwpwdWJsaWM6CiAgICBzdGF0aWMgaW50IG5fYWxpdmU7CiAgICBzdGF0aWMgYm9vbCBvcF9ydW47CgogICAgRygpIDogYWxpdmVfKDEpIHsrK25fYWxpdmU7fQogICAgRyhjb25zdCBHJiBnKSA6IGFsaXZlXyhnLmFsaXZlXykgeysrbl9hbGl2ZTt9CiAgICB+RygpIHthbGl2ZV8gPSAwOyAtLW5fYWxpdmU7fQoKICAgIHZvaWQgb3BlcmF0b3IoKSgpCiAgICB7CiAgICAgICAgYXNzZXJ0KGFsaXZlXyA9PSAxKTsKICAgICAgICBhc3NlcnQobl9hbGl2ZSA+PSAxKTsKICAgICAgICBvcF9ydW4gPSB0cnVlOwogICAgfQoKICAgIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgZG91YmxlIGopCiAgICB7CiAgICAgICAgYXNzZXJ0KGFsaXZlXyA9PSAxKTsKICAgICAgICBhc3NlcnQobl9hbGl2ZSA+PSAxKTsKICAgICAgICBhc3NlcnQoaSA9PSA1KTsKICAgICAgICBhc3NlcnQoaiA9PSA1LjUpOwogICAgICAgIG9wX3J1biA9IHRydWU7CiAgICB9Cn07CgppbnQgRzo6bl9hbGl2ZSA9IDA7CmJvb2wgRzo6b3BfcnVuID0gZmFsc2U7CgppbnQgbWFpbigpCnsKICAgIHsKICAgICAgICBzdGQ6OnRocmVhZCB0KGYpOwogICAgICAgIHQuam9pbigpOwogICAgICAgIGFzc2VydChmX3J1biA9PSB0cnVlKTsKICAgIH0KICAgIGZfcnVuID0gZmFsc2U7CiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aHJvd19vbmUgPSAwOwogICAgICAgICAgICBzdGQ6OnRocmVhZCB0KGYpOwogICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoLi4uKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3dfb25lID0gMHhGRkZGOwogICAgICAgICAgICBhc3NlcnQoIWZfcnVuKTsKICAgICAgICB9CiAgICB9CiAgICB7CiAgICAgICAgYXNzZXJ0KEc6Om5fYWxpdmUgPT0gMCk7CiAgICAgICAgYXNzZXJ0KCFHOjpvcF9ydW4pOwogICAgICAgIHN0ZDo6dGhyZWFkIHQoKEcoKSkpOwogICAgICAgIHQuam9pbigpOwogICAgICAgIGFzc2VydChHOjpuX2FsaXZlID09IDApOwogICAgICAgIGFzc2VydChHOjpvcF9ydW4pOwogICAgfQogICAgRzo6b3BfcnVuID0gZmFsc2U7CiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aHJvd19vbmUgPSAwOwogICAgICAgICAgICBhc3NlcnQoRzo6bl9hbGl2ZSA9PSAwKTsKICAgICAgICAgICAgYXNzZXJ0KCFHOjpvcF9ydW4pOwogICAgICAgICAgICBzdGQ6OnRocmVhZCB0KChHKCkpKTsKICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKC4uLikKICAgICAgICB7CiAgICAgICAgICAgIHRocm93X29uZSA9IDB4RkZGRjsKICAgICAgICAgICAgYXNzZXJ0KEc6Om5fYWxpdmUgPT0gMCk7CiAgICAgICAgICAgIGFzc2VydCghRzo6b3BfcnVuKTsKICAgICAgICB9CiAgICB9CiNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCiAgICB7CiAgICAgICAgYXNzZXJ0KEc6Om5fYWxpdmUgPT0gMCk7CiAgICAgICAgYXNzZXJ0KCFHOjpvcF9ydW4pOwogICAgICAgIHN0ZDo6dGhyZWFkIHQoRygpLCA1LCA1LjUpOwogICAgICAgIHQuam9pbigpOwogICAgICAgIGFzc2VydChHOjpuX2FsaXZlID09IDApOwogICAgICAgIGFzc2VydChHOjpvcF9ydW4pOwogICAgfQojZW5kaWYKfQo=