Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9jb3B5IHwxMAoKY29weQo9PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBJbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgY29weQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZS4gCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2NvcHkuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8UmV2ZXJzaWJsZSBBbGdvcml0aG18CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgIHwgQSBzZXF1ZW5jZSB0byBjb3B5LiAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgSW5gYCAgICAgICAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgIHwgQW4gaW5zZXJ0ZXIuICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgp8U2VtYW50aWNzIGRpc2NsYWltZXIuLi58IHxSZXZlcnNpYmxlIEFsZ29yaXRobXwuCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYW5kIGFuIHxJbnNlcnRlcnwgYGBpbmBgOgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgY29weTxzLGluPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgICAgICAKICAgICAgICB0eXBlZGVmIGZvbGQ8IHMsaW46OnN0YXRlLGluOjpvcGVyYXRpb24gPjo6dHlwZSByOwoKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gRXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgaW46Om9wZXJhdGlvbmBgLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3JfYzxpbnQsMCwxLDIsMyw0LDUsNiw3LDgsOT4gbnVtYmVyczsKICAgIHR5cGVkZWYgY29weTwKICAgICAgICAgIHJhbmdlX2M8aW50LDEwLDIwPgogICAgICAgICwgYmFja19pbnNlcnRlcjwgbnVtYmVycyA+CiAgICAgICAgPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIHNpemU8cmVzdWx0Pjo6dmFsdWUsID09LCAyMCApOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByZXN1bHQscmFuZ2VfYzxpbnQsMCwyMD4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfFRyYW5zZm9ybWF0aW9uIEFsZ29yaXRobXN8LCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LCB8cmV2ZXJzZV9jb3B5fCwgfGNvcHlfaWZ8LCB8dHJhbnNmb3JtfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK