Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKLy8gPGNvbXBsZXg+CgovLyB0ZW1wbGF0ZTxjbGFzcyBUPiAgICAgIGNvbXBsZXg8VD4gIGNvbmooY29uc3QgY29tcGxleDxUPiYpOwovLyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIGNvbmoobG9uZyBkb3VibGUpOwovLyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIGNvbmooZG91YmxlKTsKLy8gdGVtcGxhdGU8SW50ZWdyYWwgVD4gICBkb3VibGUgICAgICBjb25qKFQpOwovLyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgIGNvbmooZmxvYXQpOwoKI2luY2x1ZGUgPGNvbXBsZXg+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGNhc3NlcnQ+CgojaW5jbHVkZSAiLi4vY2FzZXMuaCIKCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkCnRlc3QoVCB4LCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZT46OnR5cGUqID0gMCkKewogICAgc3RhdGljX2Fzc2VydCgoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0ZDo6Y29uaih4KSksIGRvdWJsZT46OnZhbHVlKSwgIiIpOwogICAgYXNzZXJ0KHN0ZDo6Y29uaih4KSA9PSBjb25qKHN0ZDo6Y29tcGxleDxkb3VibGU+KHgsIDApKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkCnRlc3QoVCB4LCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZT46OnR5cGUqID0gMCkKewogICAgc3RhdGljX2Fzc2VydCgoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0ZDo6Y29uaih4KSksIFQ+Ojp2YWx1ZSksICIiKTsKICAgIGFzc2VydChzdGQ6OmNvbmooeCkgPT0gY29uaihzdGQ6OmNvbXBsZXg8VD4oeCwgMCkpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQKdGVzdChUIHgsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlPjo6dHlwZSogPSAwKQp7CiAgICBzdGF0aWNfYXNzZXJ0KChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoc3RkOjpjb25qKHgpKSwgc3RkOjpjb21wbGV4PFQ+ID46OnZhbHVlKSwgIiIpOwogICAgYXNzZXJ0KHN0ZDo6Y29uaih4KSA9PSBjb25qKHN0ZDo6Y29tcGxleDxUPih4LCAwKSkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZAp0ZXN0KCkKewogICAgdGVzdDxUPigwKTsKICAgIHRlc3Q8VD4oMSk7CiAgICB0ZXN0PFQ+KDEwKTsKfQoKCmludCBtYWluKCkKewogICAgdGVzdDxmbG9hdD4oKTsKICAgIHRlc3Q8ZG91YmxlPigpOwogICAgdGVzdDxsb25nIGRvdWJsZT4oKTsKICAgIHRlc3Q8aW50PigpOwogICAgdGVzdDx1bnNpZ25lZD4oKTsKICAgIHRlc3Q8bG9uZyBsb25nPigpOwp9Cg==