Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKLy8gPHN0cmluZz4KCi8vIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsdHJhaXRzLEFsbG9jYXRvcj4mIHN0ciwgCi8vICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbiA9IG5wb3MsIAovLyAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdG9yJiBhID0gQWxsb2NhdG9yKCkpOwoKI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CgojaW5jbHVkZSAiLi4vdGVzdF9hbGxvY2F0b3IuaCIKCnRlbXBsYXRlIDxjbGFzcyBTPgp2b2lkCnRlc3QoUyBzdHIsIHVuc2lnbmVkIHBvcykKewogICAgdHlwZWRlZiB0eXBlbmFtZSBTOjp0cmFpdHNfdHlwZSBUOwogICAgdHlwZWRlZiB0eXBlbmFtZSBTOjphbGxvY2F0b3JfdHlwZSBBOwogICAgdHJ5CiAgICB7CiAgICAgICAgUyBzMihzdHIsIHBvcyk7CiAgICAgICAgYXNzZXJ0KHMyLl9faW52YXJpYW50cygpKTsKICAgICAgICBhc3NlcnQocG9zIDw9IHN0ci5zaXplKCkpOwogICAgICAgIHVuc2lnbmVkIHJsZW4gPSBzdHIuc2l6ZSgpIC0gcG9zOwogICAgICAgIGFzc2VydChzMi5zaXplKCkgPT0gcmxlbik7CiAgICAgICAgYXNzZXJ0KFQ6OmNvbXBhcmUoczIuZGF0YSgpLCBzdHIuZGF0YSgpICsgcG9zLCBybGVuKSA9PSAwKTsKICAgICAgICBhc3NlcnQoczIuZ2V0X2FsbG9jYXRvcigpID09IEEoKSk7CiAgICAgICAgYXNzZXJ0KHMyLmNhcGFjaXR5KCkgPj0gczIuc2l6ZSgpKTsKICAgIH0KICAgIGNhdGNoIChzdGQ6Om91dF9vZl9yYW5nZSYpCiAgICB7CiAgICAgICAgYXNzZXJ0KHBvcyA+IHN0ci5zaXplKCkpOwogICAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgUz4Kdm9pZAp0ZXN0KFMgc3RyLCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pCnsKICAgIHR5cGVkZWYgdHlwZW5hbWUgUzo6dHJhaXRzX3R5cGUgVDsKICAgIHR5cGVkZWYgdHlwZW5hbWUgUzo6YWxsb2NhdG9yX3R5cGUgQTsKICAgIHRyeQogICAgewogICAgICAgIFMgczIoc3RyLCBwb3MsIG4pOwogICAgICAgIGFzc2VydChzMi5fX2ludmFyaWFudHMoKSk7CiAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdHIuc2l6ZSgpKTsKICAgICAgICB1bnNpZ25lZCBybGVuID0gc3RkOjptaW4oc3RyLnNpemUoKSAtIHBvcywgbik7CiAgICAgICAgYXNzZXJ0KHMyLnNpemUoKSA9PSBybGVuKTsKICAgICAgICBhc3NlcnQoVDo6Y29tcGFyZShzMi5kYXRhKCksIHN0ci5kYXRhKCkgKyBwb3MsIHJsZW4pID09IDApOwogICAgICAgIGFzc2VydChzMi5nZXRfYWxsb2NhdG9yKCkgPT0gQSgpKTsKICAgICAgICBhc3NlcnQoczIuY2FwYWNpdHkoKSA+PSBzMi5zaXplKCkpOwogICAgfQogICAgY2F0Y2ggKHN0ZDo6b3V0X29mX3JhbmdlJikKICAgIHsKICAgICAgICBhc3NlcnQocG9zID4gc3RyLnNpemUoKSk7CiAgICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBTPgp2b2lkCnRlc3QoUyBzdHIsIHVuc2lnbmVkIHBvcywgdW5zaWduZWQgbiwgY29uc3QgdHlwZW5hbWUgUzo6YWxsb2NhdG9yX3R5cGUmIGEpCnsKICAgIHR5cGVkZWYgdHlwZW5hbWUgUzo6dHJhaXRzX3R5cGUgVDsKICAgIHR5cGVkZWYgdHlwZW5hbWUgUzo6YWxsb2NhdG9yX3R5cGUgQTsKICAgIHRyeQogICAgewogICAgICAgIFMgczIoc3RyLCBwb3MsIG4sIGEpOwogICAgICAgIGFzc2VydChzMi5fX2ludmFyaWFudHMoKSk7CiAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdHIuc2l6ZSgpKTsKICAgICAgICB1bnNpZ25lZCBybGVuID0gc3RkOjptaW4oc3RyLnNpemUoKSAtIHBvcywgbik7CiAgICAgICAgYXNzZXJ0KHMyLnNpemUoKSA9PSBybGVuKTsKICAgICAgICBhc3NlcnQoVDo6Y29tcGFyZShzMi5kYXRhKCksIHN0ci5kYXRhKCkgKyBwb3MsIHJsZW4pID09IDApOwogICAgICAgIGFzc2VydChzMi5nZXRfYWxsb2NhdG9yKCkgPT0gYSk7CiAgICAgICAgYXNzZXJ0KHMyLmNhcGFjaXR5KCkgPj0gczIuc2l6ZSgpKTsKICAgIH0KICAgIGNhdGNoIChzdGQ6Om91dF9vZl9yYW5nZSYpCiAgICB7CiAgICAgICAgYXNzZXJ0KHBvcyA+IHN0ci5zaXplKCkpOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHR5cGVkZWYgdGVzdF9hbGxvY2F0b3I8Y2hhcj4gQTsKICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgQT4gUzsKCiAgICB0ZXN0KFMoQSgzKSksIDApOwogICAgdGVzdChTKEEoMykpLCAxKTsKICAgIHRlc3QoUygiMSIsIEEoNSkpLCAwKTsKICAgIHRlc3QoUygiMSIsIEEoNSkpLCAxKTsKICAgIHRlc3QoUygiMSIsIEEoNSkpLCAyKTsKICAgIHRlc3QoUygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsIEEoNykpLCAwKTsKICAgIHRlc3QoUygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsIEEoNykpLCA1KTsKICAgIHRlc3QoUygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsIEEoNykpLCA1MCk7CiAgICB0ZXN0KFMoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCBBKDcpKSwgNTAwKTsKCiAgICB0ZXN0KFMoQSgzKSksIDAsIDApOwogICAgdGVzdChTKEEoMykpLCAwLCAxKTsKICAgIHRlc3QoUyhBKDMpKSwgMSwgMCk7CiAgICB0ZXN0KFMoQSgzKSksIDEsIDEpOwogICAgdGVzdChTKEEoMykpLCAxLCAyKTsKICAgIHRlc3QoUygiMSIsIEEoNSkpLCAwLCAwKTsKICAgIHRlc3QoUygiMSIsIEEoNSkpLCAwLCAxKTsKICAgIHRlc3QoUygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsIEEoNykpLCA1MCwgMCk7CiAgICB0ZXN0KFMoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCBBKDcpKSwgNTAsIDEpOwogICAgdGVzdChTKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgQSg3KSksIDUwLCAxMCk7CiAgICB0ZXN0KFMoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCBBKDcpKSwgNTAsIDEwMCk7CgogICAgdGVzdChTKEEoMykpLCAwLCAwLCBBKDQpKTsKICAgIHRlc3QoUyhBKDMpKSwgMCwgMSwgQSg0KSk7CiAgICB0ZXN0KFMoQSgzKSksIDEsIDAsIEEoNCkpOwogICAgdGVzdChTKEEoMykpLCAxLCAxLCBBKDQpKTsKICAgIHRlc3QoUyhBKDMpKSwgMSwgMiwgQSg0KSk7CiAgICB0ZXN0KFMoIjEiLCBBKDUpKSwgMCwgMCwgQSg2KSk7CiAgICB0ZXN0KFMoIjEiLCBBKDUpKSwgMCwgMSwgQSg2KSk7CiAgICB0ZXN0KFMoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCBBKDcpKSwgNTAsIDAsIEEoOCkpOwogICAgdGVzdChTKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgQSg3KSksIDUwLCAxLCBBKDgpKTsKICAgIHRlc3QoUygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsIEEoNykpLCA1MCwgMTAsIEEoOCkpOwogICAgdGVzdChTKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgQSg3KSksIDUwLCAxMDAsIEEoOCkpOwp9Cg==