Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9zdGFibGVfcGFydGl0aW9uIHw5MAoKc3RhYmxlX3BhcnRpdGlvbgo9PT09PT09PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcQogICAgICAgICwgdHlwZW5hbWUgUHJlZAogICAgICAgICwgdHlwZW5hbWUgSW4xID0gfHVuc3BlY2lmaWVkfAogICAgICAgICwgdHlwZW5hbWUgSW4yID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCBzdGFibGVfcGFydGl0aW9uCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgcGFpciBvZiBzZXF1ZW5jZXMgdG9nZXRoZXIgY29udGFpbmluZyBhbGwgZWxlbWVudHMgaW4gdGhlIHJhbmdlIAp8YmVnaW4vZW5kPFNlcT58IHNwbGl0IGludG8gdHdvIGdyb3VwcyBiYXNlZCBvbiB0aGUgcHJlZGljYXRlIGBgUHJlZGBgLgpgYHN0YWJsZV9wYXJ0aXRpb25gYCBpcyBndWFyYW50ZWVkIHRvIHByZXNlcnZlIHRoZSByZWxhdGl2ZSBvcmRlciBvZiB0aGUgCmVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzLgoKCnx0cmFuc2Zvcm1hdGlvbiBhbGdvcml0aG0gZGlzY2xhaW1lcnwKCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvc3RhYmxlX3BhcnRpdGlvbi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXFgYCAgICAgICAgICAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBBbiBvcmlnaW5hbCBzZXF1ZW5jZS4gICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBQcmVkYGAgICAgICAgICAgfCBVbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258ICAgICAgICAgfCBBIHBhcnRpdGlvbmluZyBwcmVkaWNhdGUuICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbjFgYCwgYGBJbjJgYCAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgICAgICAgICAgfCBPdXRwdXQgaW5zZXJ0ZXJzLiAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfFJldmVyc2libGUgQWxnb3JpdGhtfC4KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhbiB1bmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgLCBhbmQgfEluc2VydGVyfFwgcyAKYGBpbjFgYCBhbmQgYGBpbjJgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBzdGFibGVfcGFydGl0aW9uPHMscHJlZCxpbjEsaW4yPjo6dHlwZSByOwoKOlJldHVybiB0eXBlOgogICAgQSB8cGFpcnwuCiAgICAKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBsYW1iZGE8cHJlZD46OnR5cGUgcDsKICAgICAgICB0eXBlZGVmIGxhbWJkYTxpbjE6Om9wZXJhdGlvbj46OnR5cGUgaW4xX29wOwogICAgICAgIHR5cGVkZWYgbGFtYmRhPGluMjo6b3BlcmF0aW9uPjo6dHlwZSBpbjJfb3A7CiAgICAgICAgCiAgICAgICAgdHlwZWRlZiBmb2xkPAogICAgICAgICAgICAgIHMKICAgICAgICAgICAgLCBwYWlyPCBpbjE6OnN0YXRlLCBpbjI6OnN0YXRlID4KICAgICAgICAgICAgLCBpZl88IAogICAgICAgICAgICAgICAgICBhcHBseV93cmFwXCBgYDFgYFw8cCxfMj4KICAgICAgICAgICAgICAgICwgcGFpcjwgYXBwbHlfd3JhcFwgYGAyYGBcPGluMV9vcCxmaXJzdDxfMT4sXzI+LCBzZWNvbmQ8XzE+ID4KICAgICAgICAgICAgICAgICwgcGFpcjwgZmlyc3Q8XzE+LCBhcHBseV93cmFwXCBgYDJgYFw8aW4yX29wLHNlY29uZDxfMT4sXzI+ID4KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgPjo6dHlwZSByOwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBFeGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBwcmVkYGAsIGFuZCBgYHNpemU8cz46OnZhbHVlYGAgCm9mIHN1bW1hcml6ZWQgYGBpbjE6Om9wZXJhdGlvbmBgIC8gYGBpbjI6Om9wZXJhdGlvbmBgIGFwcGxpY2F0aW9ucy4gCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBOID4gc3RydWN0IGlzX29kZCA6IGJvb2xfPChOOjp2YWx1ZSAlIDIpPiB7fTsKCiAgICB0eXBlZGVmIHN0YWJsZV9wYXJ0aXRpb248CiAgICAgICAgICByYW5nZV9jPGludCwwLDEwPiAKICAgICAgICAsIGlzX29kZDxfMT4KICAgICAgICAsIGJhY2tfaW5zZXJ0ZXI8IHZlY3Rvcjw+ID4KICAgICAgICAsIGJhY2tfaW5zZXJ0ZXI8IHZlY3Rvcjw+ID4KICAgICAgICA+Ojp0eXBlIHI7CgogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByOjpmaXJzdCwgdmVjdG9yX2M8aW50LDEsMyw1LDcsOT4gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDwgcjo6c2Vjb25kLCB2ZWN0b3JfYzxpbnQsMCwyLDQsNiw4PiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHxyZXZlcnNlX3N0YWJsZV9wYXJ0aXRpb258LCB8cGFydGl0aW9ufCwgfHNvcnR8LCB8dHJhbnNmb3JtfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK