Li4gTWV0YWZ1bmN0aW9ucy9Db21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZy8vcXVvdGUgfDQwCgpxdW90ZQo9PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBQMSA+IGNsYXNzIEYKICAgICAgICAsIHR5cGVuYW1lIFRhZyA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgcXVvdGUxCiAgICB7CiAgICAgICAgLy8gfHVuc3BlY2lmaWVkfAogICAgICAgIC8vIHwuLi58CiAgICB9OyAgICAKCiAgICB8Li4ufAogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBQMSxcIHwuLi58IHR5cGVuYW1lIFBcICpuKiA+IGNsYXNzIEYKICAgICAgICAsIHR5cGVuYW1lIFRhZyA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgcXVvdGVcICpuKgogICAgewogICAgICAgIC8vIHx1bnNwZWNpZmllZHwKICAgICAgICAvLyB8Li4ufAogICAgfTsgICAgCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KCmBgcXVvdGVgYFwgKm4qIGlzIGEgaGlnaGVyLW9yZGVyIHByaW1pdGl2ZSB0aGF0IHdyYXBzIGFuICpuKi1hcnkgfE1ldGFmdW5jdGlvbnwgdG8gY3JlYXRlIAphIGNvcnJlc3BvbmRpbmcgfE1ldGFmdW5jdGlvbiBDbGFzc3wuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3F1b3RlLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbiBDbGFzc3wKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBGYGAgICAgICAgICB8IHxNZXRhZnVuY3Rpb258ICAgICAgICB8IEEgbWV0YWZ1bmN0aW9uIHRvIHdyYXAuICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBUYWdgYCAgICAgICB8IEFueSB0eXBlICAgICAgICAgICAgICB8IEEgdGFnIGRldGVybWluaW5nIHdyYXAgc2VtYW50aWNzLiAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgKm4qLWFyeSB8TWV0YWZ1bmN0aW9ufCBgYGZgYCBhbmQgYXJiaXRyYXJ5IHR5cGUgYGB0YWdgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBxdW90ZVwgKm4qXCA8Zj4gZzsKICAgIHR5cGVkZWYgcXVvdGVcICpuKlwgPGYsdGFnPiBnOwoKOlJldHVybiB0eXBlOgogICAgfE1ldGFmdW5jdGlvbiBDbGFzc3wKCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHN0cnVjdCBnCiAgICAgICAgewogICAgICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgQTEsXCB8Li4ufCB0eXBlbmFtZSBBXCAqbiogPiBzdHJ1Y3QgYXBwbHkKICAgICAgICAgICAgICAgIDogZjxBMSxcIHwuLi58XCBBXCAqbipcID4KICAgICAgICAgICAgewogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgCiAgICBpZiBgYGY8QTEsLi4uQW4+YGAgaGFzIGEgbmVzdGVkIHR5cGUgbWVtYmVyIGBgOjp0eXBlYGAsIGFuZCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHN0cnVjdCBnCiAgICAgICAgewogICAgICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgQTEsXCB8Li4ufCB0eXBlbmFtZSBBXCAqbiogPiBzdHJ1Y3QgYXBwbHkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHlwZWRlZiBmPEExLFwgfC4uLnxcIEFcICpuKlwgPiB0eXBlOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgb3RoZXJ3aXNlLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4gc3RydWN0IGYxCiAgICB7CiAgICAgICAgdHlwZWRlZiBUIHR5cGU7CiAgICB9OwoKICAgIHRlbXBsYXRlPAogICAgICAgIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNQogICAgICAgID4KICAgIHN0cnVjdCBmNQogICAgewogICAgICAgIC8vIG5vICd0eXBlJyBtZW1iZXIhCiAgICB9OwoKICAgIHR5cGVkZWYgcXVvdGVcIGBgMWBgXDxmMT46OmFwcGx5PGludD46OnR5cGUgdDE7CiAgICB0eXBlZGVmIHF1b3RlXCBgYDVgYFw8ZjU+OjphcHBseTxjaGFyLHNob3J0LGludCxsb25nLGZsb2F0Pjo6dHlwZSB0NTsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IHQxLCBpbnQgPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCB0NSwgZjU8Y2hhcixzaG9ydCxpbnQsbG9uZyxmbG9hdD4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfENvbXBvc2l0aW9uIGFuZCBBcmd1bWVudCBCaW5kaW5nfCwgfEludm9jYXRpb258LCB8YmluZHwsIHxsYW1iZGF8LCB8cHJvdGVjdHwsIHxhcHBseXwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==