Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy90cmFuc2Zvcm0gfDMwCgp0cmFuc2Zvcm0KPT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBPcAogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHRyYW5zZm9ybQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcTEKICAgICAgICAsIHR5cGVuYW1lIFNlcTIKICAgICAgICAsIHR5cGVuYW1lIEJpbmFyeU9wCiAgICAgICAgLCB0eXBlbmFtZSBJbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgdHJhbnNmb3JtCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpgYHRyYW5zZm9ybWBgIGlzIGFuIHxvdmVybG9hZGVkIG5hbWV8OgoKKiBgYHRyYW5zZm9ybTxTZXF1ZW5jZSxPcD5gYCByZXR1cm5zIGEgdHJhbnNmb3JtZWQgY29weSBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgCiAgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYW4gdW5hcnkgdHJhbnNmb3JtYXRpb24gYGBPcGBgIHRvIGV2ZXJ5IGVsZW1lbnQgCiAgaW4gdGhlIHxiZWdpbi9lbmQ8U2VxdWVuY2U+fCByYW5nZS4KCiogYGB0cmFuc2Zvcm08U2VxMSxTZXEyLEJpbmFyeU9wPmBgIHJldHVybnMgYSBuZXcgc2VxdWVuY2UgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYQogIGJpbmFyeSB0cmFuc2Zvcm1hdGlvbiBgYEJpbmFyeU9wYGAgdG8gYSBwYWlyIG9mIGVsZW1lbnRzIChlXCA6c3ViOmAxYCwgZTJcIDpzdWI6YDFgKSAKICBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHxiZWdpbi9lbmQ8U2VxMT58IGFuZCB8YmVnaW4vZW5kPFNlcTI+fCByYW5nZXMuCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3RyYW5zZm9ybS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgLCAgICAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBTZXF1ZW5jZXMgdG8gdHJhbnNmb3JtLiAgICAgICAgICAgfAp8IGBgU2VxMWBgLCBgYFNlcTJgYHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBPcGBgLCAgICAgICAgICAgfCB8TGFtYmRhIEV4cHJlc3Npb258ICAgICAgICAgICAgICAgfCBBIHRyYW5zZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgfAp8IGBgQmluYXJ5T3BgYCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbmBgICAgICAgICAgICAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgICAgICAgICAgfCBBbiBpbnNlcnRlci4gICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKfFNlbWFudGljcyBkaXNjbGFpbWVyLi4ufCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LgoKRm9yIGFueSB8Rm9yd2FyZCBTZXF1ZW5jZXxcIHMgYGBzYGAsIGBgczFgYCBhbmQgYGBzMmBgLCB8TGFtYmRhIEV4cHJlc3Npb258XCBzIGBgb3BgYCBhbmQgYGBvcDJgYCwgCmFuZCBhbiB8SW5zZXJ0ZXJ8IGBgaW5gYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHRyYW5zZm9ybTxzLG9wLGluPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KICAgIAo6UG9zdGNvbmRpdGlvbjoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAgICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgbGFtYmRhPG9wPjo6dHlwZSBmOwogICAgICAgIHR5cGVkZWYgbGFtYmRhPGluOjpvcGVyYXRpb24+Ojp0eXBlIGluX29wOwogICAgICAgIAogICAgICAgIHR5cGVkZWYgZm9sZDwgCiAgICAgICAgICAgICAgcwogICAgICAgICAgICAsIGluOjpzdGF0ZQogICAgICAgICAgICAsIGJpbmQ8IGluX29wLCBfMSwgYmluZDxmLCBfMj4gPiAKICAgICAgICAgICAgPjo6dHlwZSByOwoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHRyYW5zZm9ybTxzMSxzMixvcCxpbj46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCiAgICAKOlBvc3Rjb25kaXRpb246CiAgICBFcXVpdmFsZW50IHRvIAogICAgICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICB0eXBlZGVmIGxhbWJkYTxvcDI+Ojp0eXBlIGY7CiAgICAgICAgdHlwZWRlZiBsYW1iZGE8aW46Om9wZXJhdGlvbj46OnR5cGUgaW5fb3A7CgogICAgICAgIHR5cGVkZWYgZm9sZDwgCiAgICAgICAgICAgICAgcGFpcl92aWV3PHMxLHMyPgogICAgICAgICAgICAsIGluOjpzdGF0ZQogICAgICAgICAgICAsIGJpbmQ8IAogICAgICAgICAgICAgICAgICBpbl9vcAogICAgICAgICAgICAgICAgLCBfMQogICAgICAgICAgICAgICAgLCBiaW5kPGYsIGJpbmQ8Zmlyc3Q8PixfMj4sIGJpbmQ8c2Vjb25kPD4sXzI+ID4KICAgICAgICAgICAgICAgID4gCiAgICAgICAgICAgID46OnR5cGUgcjsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gRXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgLyBgYHNpemU8czE+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiAKYGBvcGBgIC8gYGBvcDJgYCBhbmQgYGBpbjo6b3BlcmF0aW9uYGAuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yPGNoYXIsc2hvcnQsaW50LGxvbmcsZmxvYXQsZG91YmxlPiB0eXBlczsKICAgIHR5cGVkZWYgdmVjdG9yPGNoYXIqLHNob3J0KixpbnQqLGxvbmcqLGZsb2F0Kixkb3VibGUqPiBwb2ludGVyczsKICAgIHR5cGVkZWYgdHJhbnNmb3JtPCB0eXBlcyxib29zdDo6YWRkX3BvaW50ZXI8XzE+ID46OnR5cGUgcmVzdWx0OwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggZXF1YWw8cmVzdWx0LHBvaW50ZXJzPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfFRyYW5zZm9ybWF0aW9uIEFsZ29yaXRobXN8LCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LCB8cmV2ZXJzZV90cmFuc2Zvcm18LCB8Y29weXwsIHxyZXBsYWNlX2lmfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK