Li4gTWV0YWZ1bmN0aW9ucy9Db21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZy8vYmluZCB8MzAKCmJpbmQKPT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRgogICAgICAgID4KICAgIHN0cnVjdCBiaW5kMAogICAgewogICAgICAgIC8vIHx1bnNwZWNpZmllZHwKICAgICAgICAvLyB8Li4ufAogICAgfTsKCiAgICB0ZW1wbGF0ZTwgCiAgICAgICAgICB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMQogICAgICAgID4KICAgIHN0cnVjdCBiaW5kMQogICAgewogICAgICAgIC8vIHx1bnNwZWNpZmllZHwKICAgICAgICAvLyB8Li4ufAogICAgfTsKICAgIAogICAgfC4uLnwKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsXCB8Li4ufCB0eXBlbmFtZSBBbgogICAgICAgID4KICAgIHN0cnVjdCBiaW5kXCAqbioKICAgIHsKICAgICAgICAvLyB8dW5zcGVjaWZpZWR8CiAgICAgICAgLy8gfC4uLnwKICAgIH07CiAgICAKICAgIHRlbXBsYXRlPCAKICAgICAgICAgIHR5cGVuYW1lIEYKICAgICAgICAsIHR5cGVuYW1lIEExID0gfHVuc3BlY2lmaWVkfAogICAgICAgIHwuLi58CiAgICAgICAgLCB0eXBlbmFtZSBBbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgYmluZAogICAgewogICAgICAgIC8vIHx1bnNwZWNpZmllZHwKICAgICAgICAvLyB8Li4ufAogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKYGBiaW5kYGAgaXMgYSBoaWdoZXItb3JkZXIgcHJpbWl0aXZlIGZvciB8TWV0YWZ1bmN0aW9uIENsYXNzfCBjb21wb3NpdGlvbiAKYW5kIGFyZ3VtZW50IGJpbmRpbmcuIEluIGVzc2VuY2UsIGl0J3MgYSBjb21waWxlLXRpbWUgY291bnRlcnBhcnQgb2YgCnRoZSBzaW1pbGFyIHJ1bi10aW1lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgfEJvb3N0LkJpbmR8IGFuZCB8Qm9vc3QuTGFtYmRhfApsaWJyYXJpZXMuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2JpbmQuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8TWV0YWZ1bmN0aW9uIENsYXNzfAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYEZgYCAgICAgICAgIHwgfE1ldGFmdW5jdGlvbiBDbGFzc3wgICAgICAgICAgICAgIHwgQW4gbWV0YWZ1bmN0aW9uIGNsYXNzIHRvIHBlcmZvcm0gYmluZGluZyBvbi4gIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB8QTEuLi5BbnwgICAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXJndW1lbnRzIHRvIGJpbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8TWV0YWZ1bmN0aW9uIENsYXNzfCBgYGZgYCBhbmQgYXJiaXRyYXJ5IHR5cGVzIHxhMS4uLmFufDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGJpbmQ8ZixhMSwuLi5hXCAqbipcID4gZzsKICAgIHR5cGVkZWYgYmluZFwgKm4qXCA8ZixhMSwuLi5hXCAqbipcID4gZzsKCjpSZXR1cm4gdHlwZToKICAgIHxNZXRhZnVuY3Rpb24gQ2xhc3N8CgouLiBfYGJpbmQgc2VtYW50aWNzYDoKCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgc3RydWN0IGcKICAgICAgICB7CiAgICAgICAgICAgIHRlbXBsYXRlPCAKICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVTEgPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgICAgICAgICB8Li4ufAogICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBVXCAqbiogPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgIHN0cnVjdCBhcHBseQogICAgICAgICAgICAgICAgOiBhcHBseV93cmFwXCAqbipcIDwKICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGgwPGYsVTEsXCB8Li4ufFwgVVwgKm4qPjo6dHlwZSAKICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIGgxPGExLFUxLFwgfC4uLnxcIFVcICpuKj46OnR5cGUgCiAgICAgICAgICAgICAgICAgICAgfC4uLnwKICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIGhcICpuKlwgPGFcICpuKlwgLFUxLFwgfC4uLnxcIFVcICpuKj46OnR5cGUgCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICB7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICB3aGVyZSBgYGhgYFwgKmsqIGlzIGVxdWl2YWxlbnQgdG8gCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBYLCB0eXBlbmFtZSBVMSxcIHwuLi58IHR5cGVuYW1lIFVcICpuKiA+IHN0cnVjdCBoXCAqayoKICAgICAgICAgICAgOiBhcHBseV93cmFwXCAqbipcIDxYLFUxLFwgfC4uLnxcIFVcICpuKj4KICAgICAgICB7CiAgICAgICAgfTsKCiAgICBpZiBgYGZgYCBvciBgYGFgYFwgKmsqIGlzIGEgfGJpbmQgZXhwcmVzc2lvbnwgb3IgYSB8cGxhY2Vob2xkZXJ8LCBhbmQKICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdGVtcGxhdGU8IHR5cGVuYW1lIFgsIHR5cGVuYW1lIFUxLFwgfC4uLnwgdHlwZW5hbWUgVVwgKm4qID4gc3RydWN0IGhcICprKgogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBYIHR5cGU7CiAgICAgICAgfTsKICAgIAogICAgb3RoZXJ3aXNlLiB8Tm90ZTp8IEV2ZXJ5IGBgbmBgXHRoIGFwcGVhcmFuY2Ugb2YgdGhlIGB1bm5hbWVkIHBsYWNlaG9sZGVyYF9fIAogICAgaW4gdGhlIGBgYmluZDxmLGExLC4uLmFuPmBgIHNwZWNpYWxpemF0aW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKICAgIG51bWJlcmVkIHBsYWNlaG9sZGVyIGBgX2BgXCAqbiogfC0tIGVuZCBub3RlfAoKX18gYFBsYWNlaG9sZGVyc2BfCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHN0cnVjdCBmMQogICAgewogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUMSA+IHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBUMSB0eXBlOwogICAgICAgIH07CiAgICB9OwoKICAgIHN0cnVjdCBmNQogICAgewogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUgPgogICAgICAgIHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBUNSB0eXBlOwogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0eXBlZGVmIGFwcGx5X3dyYXBcIGBgMWBgXDwgCiAgICAgICAgICBiaW5kXCBgYDFgYFw8ZjEsXzE+CiAgICAgICAgLCBpbnQgCiAgICAgICAgPjo6dHlwZSByMTE7CiAgICAKICAgIHR5cGVkZWYgYXBwbHlfd3JhcFwgYGA1YGBcPCAKICAgICAgICAgIGJpbmRcIGBgMWBgXDxmMSxfNT4KICAgICAgICAsIHZvaWQsdm9pZCx2b2lkLHZvaWQsaW50IAogICAgICAgID46OnR5cGUgcjEyOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTxyMTEsaW50PiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPHIxMixpbnQ+ICkpOwogICAgCiAgICB0eXBlZGVmIGFwcGx5X3dyYXBcIGBgNWBgXDwgCiAgICAgICAgICBiaW5kXCBgYDVgYFw8ZjUsXzEsXzIsXzMsXzQsXzU+CiAgICAgICAgLCB2b2lkLHZvaWQsdm9pZCx2b2lkLGludCAKICAgICAgICA+Ojp0eXBlIHI1MTsKICAgIAogICAgdHlwZWRlZiBhcHBseV93cmFwXCBgYDVgYFw8CiAgICAgICAgICBiaW5kXCBgYDVgYFw8ZjUsXzUsXzQsXzMsXzIsXzE+CiAgICAgICAgLCBpbnQsdm9pZCx2b2lkLHZvaWQsdm9pZAogICAgICAgID46OnR5cGUgcjUyOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTxyNTEsaW50PiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPHI1MixpbnQ+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8Q29tcG9zaXRpb24gYW5kIEFyZ3VtZW50IEJpbmRpbmd8LCB8SW52b2NhdGlvbnwsIHxQbGFjZWhvbGRlcnN8LCB8bGFtYmRhfCwgfHF1b3RlfCwgCnxwcm90ZWN0fCwgfGFwcGx5fCwgfGFwcGx5X3dyYXB8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=