Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9lcmFzZQoKZXJhc2UKPT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIEZpcnN0CiAgICAgICAgLCB0eXBlbmFtZSBMYXN0ID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCBlcmFzZQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KCmBgZXJhc2VgYCBwZXJmb3JtcyBhIHJlbW92YWwgb2Ygb25lIG9yIG1vcmUgYWRqYWNlbnQgZWxlbWVudHMgaW4gdGhlIHNlcXVlbmNlIApzdGFydGluZyBmcm9tIGFuIGFyYml0cmFyeSBwb3NpdGlvbi4KCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9lcmFzZS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxUYWcgRGlzcGF0Y2hlZCBNZXRhZnVuY3Rpb258CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgb3IgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIGVyYXNlIGZyb20uICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgfCB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgRmlyc3RgYCAgICAgfCB8Rm9yd2FyZCBJdGVyYXRvcnwgICAgICAgICAgICAgICAgfCBBbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZSB0byAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiZSBlcmFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgTGFzdGBgICAgICAgfCB8Rm9yd2FyZCBJdGVyYXRvcnwgICAgICAgICAgICAgICAgfCBBbiBpdGVyYXRvciBwYXN0LXRoZS1lbmQgb2YgdGhlIHJhbmdlIHRvIGJlICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcmFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgouLiBjb21wb3VuZDo6CiAgICA6Y2xhc3M6IGV4cHJlc3Npb24tc2VtYW50aWNzCgogICAgRm9yIGFueSB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgYGBzYGAsIGFuZCBpdGVyYXRvcnMgYGBwb3NgYCwgYGBmaXJzdGBgIGFuZCBgYGxhc3RgYCBpbnRvIGBgc2BgOgoKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgZXJhc2U8cyxmaXJzdCxsYXN0Pjo6dHlwZSByOyAKCiAgICA6UmV0dXJuIHR5cGU6CiAgICAgICAgfEV4dGVuc2libGUgU2VxdWVuY2V8LgoKICAgIDpQcmVjb25kaXRpb246CiAgICAgICAgYGBbZmlyc3QsbGFzdClgYCBpcyBhIHZhbGlkIHJhbmdlIGluIGBgc2BgLiAKICAgICAKICAgIDpTZW1hbnRpY3M6CiAgICAgICAgYGByYGAgaXMgYSBuZXcgc2VxdWVuY2UsIHxjb25jZXB0LWlkZW50aWNhbHwgdG8gYGBzYGAsIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CiAgICAgICAgW2BgYmVnaW48cz46OnR5cGVgYCwgYGBwb3NgYCksIFtgYGxhc3RgYCwgYGBlbmQ8cz46OnR5cGVgYCkuCgogICAgOlBvc3Rjb25kaXRpb246CiAgICAgICAgVGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiBgYHJgYCBpcyB0aGUgc2FtZSBhcyBpbiBgYHNgYDsKCiAgICAgICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICAgICBzaXplPHI+Ojp2YWx1ZSA9PSBzaXplPHM+Ojp2YWx1ZSAtIGRpc3RhbmNlPGZpcnN0LGxhc3Q+Ojp2YWx1ZQoKCiAgICAuLiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICB0eXBlZGVmIGVyYXNlPHMscG9zPjo6dHlwZSByOwoKICAgIDpSZXR1cm4gdHlwZToKICAgICAgICB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwuCiAgICAgICAgCiAgICA6UHJlY29uZGl0aW9uOgogICAgICAgIGBgcG9zYGAgaXMgYSBkZXJlZmVyZW5jZWFibGUgaXRlcmF0b3IgaW4gYGBzYGAuCgogICAgOlNlbWFudGljczoKICAgICAgICBFcXVpdmFsZW50IHRvIAogICAgICAgIAogICAgICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgICAgdHlwZWRlZiBlcmFzZTwgcyxwb3MsbmV4dDxwb3M+Ojp0eXBlID46OnR5cGUgcjsKCgoKLi4gY29tcG91bmQ6OgogICAgOmNsYXNzOiBleHByZXNzaW9uLXNlbWFudGljcwoKICAgIEZvciBhbnkgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8IGBgc2BgLCBhbmQgaXRlcmF0b3IgYGBwb3NgYCBpbnRvIGBgc2BgOgoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBlcmFzZTxzLHBvcz46OnR5cGUgcjsKCiAgICA6UmV0dXJuIHR5cGU6CiAgICAgICAgfEV4dGVuc2libGUgU2VxdWVuY2V8LgogICAgICAgIAogICAgOlByZWNvbmRpdGlvbjoKICAgICAgICBgYHBvc2BgIGlzIGEgZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIHRvIGBgc2BgLgoKICAgIDpTZW1hbnRpY3M6CiAgICAgICAgRXJhc2VzIHRoZSBlbGVtZW50IGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gYGBwb3NgYDsgZXF1aXZhbGVudCB0bwogICAgICAgIGBgZXJhc2Vfa2V5PHMsIGRlcmVmPHBvcz46OnR5cGUgPjo6dHlwZWBgLgoKICAgIDpQb3N0Y29uZGl0aW9uOgogICAgICAgIGBgc2l6ZTxyPjo6dmFsdWUgPT0gc2l6ZTxzPjo6dmFsdWUgLSAxYGAuIAoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBTZXF1ZW5jZSBhcmNoZXR5cGUgICAgICAgICAgICAgICAgICAgIHwgQ29tcGxleGl0eSAodGhlIHJhbmdlIGZvcm0pICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwgICAgIHwgQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgIHwgUXVhZHJhdGljIGluIHRoZSB3b3JzdCBjYXNlLCBsaW5lYXIgYXQgYmVzdC4gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3JfYzxpbnQsMSwwLDUsMSw3LDUsMCw1PiB2YWx1ZXM7CiAgICB0eXBlZGVmIGZpbmQ8IHZhbHVlcywgaW50ZWdyYWxfYzxpbnQsNz4gPjo6dHlwZSBwb3M7CiAgICB0eXBlZGVmIGVyYXNlPHZhbHVlcyxwb3M+Ojp0eXBlIHJlc3VsdDsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggc2l6ZTxyZXN1bHQ+Ojp2YWx1ZSwgPT0sIDcgKTsKICAgIAogICAgdHlwZWRlZiBmaW5kPHJlc3VsdCwgaW50ZWdyYWxfYzxpbnQsNz4gPjo6dHlwZSBpdGVyOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IGl0ZXIsIGVuZDxyZXN1bHQ+Ojp0eXBlID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxFeHRlbnNpYmxlIFNlcXVlbmNlfCwgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8LCB8ZXJhc2Vfa2V5fCwgfHBvcF9mcm9udHwsIHxwb3BfYmFja3wsIHxpbnNlcnR8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=