Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX3JlbW92ZV9pZiB8MTcwCgpyZXZlcnNlX3JlbW92ZV9pZgo9PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgUHJlZAogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHJldmVyc2VfcmVtb3ZlX2lmCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgbmV3IHNlcXVlbmNlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHxiZWdpbi9lbmQ8U2VxdWVuY2U+fCByYW5nZSAKaW4gcmV2ZXJzZSBvcmRlciBleGNlcHQgdGhvc2UgdGhhdCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgYGBQcmVkYGAuCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvcmVtb3ZlX2lmLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfFJldmVyc2libGUgQWxnb3JpdGhtfAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNlcXVlbmNlYGAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICAgICAgICAgIHwgQW4gb3JpZ2luYWwgc2VxdWVuY2UuICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBQcmVkYGAgICAgICB8IFVuYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgICAgICB8IEEgcmVtb3ZhbCBjb25kaXRpb24uICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgSW5gYCAgICAgICAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgICAgICAgICAgfCBBbiBpbnNlcnRlci4gICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKfFNlbWFudGljcyBkaXNjbGFpbWVyLi4ufCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LgoKRm9yIGFueSB8Rm9yd2FyZCBTZXF1ZW5jZXwgYGBzYGAsIGFuZCBhbiB8SW5zZXJ0ZXJ8IGBgaW5gYCwgYW5kIGFuIHVuYXJ5IAp8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2VfcmVtb3ZlX2lmPHMscHJlZCxpbj46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgbGFtYmRhPHByZWQ+Ojp0eXBlIHA7CiAgICAgICAgdHlwZWRlZiBsYW1iZGE8aW46Om9wZXJhdGlvbj46OnR5cGUgb3A7CiAgICAgICAgCiAgICAgICAgdHlwZWRlZiByZXZlcnNlX2ZvbGQ8CiAgICAgICAgICAgICAgcwogICAgICAgICAgICAsIGluOjpzdGF0ZQogICAgICAgICAgICAsIGV2YWxfaWY8CiAgICAgICAgICAgICAgICAgIGFwcGx5X3dyYXBcIGBgMWBgXDxwLF8yPgogICAgICAgICAgICAgICAgLCBpZGVudGl0eTxfMT4KICAgICAgICAgICAgICAgICwgYXBwbHlfd3JhcFwgYGAyYGBcPG9wLF8xLF8yPgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICA+Ojp0eXBlIHI7CgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuIFBlcmZvcm1zIGV4YWN0bHkgYGBzaXplPHM+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiBgYHByZWRgYCwgYW5kIGF0IAptb3N0IGBgc2l6ZTxzPjo6dmFsdWVgYCBpbnNlcnRpb25zLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCwxLDQsNSwyLDcsNSwzLDU+Ojp0eXBlIG51bWJlcnM7CiAgICB0eXBlZGVmIHJldmVyc2VfcmVtb3ZlX2lmPCBudW1iZXJzLCBncmVhdGVyPF8saW50Xzw0PiA+ID46OnR5cGUgcmVzdWx0OwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggZXF1YWw8IHJlc3VsdCx2ZWN0b3JfYzxpbnQsMywyLDQsMT4sZXF1YWxfdG88XyxfPiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHxyZW1vdmVfaWZ8LCB8cmV2ZXJzZV9yZW1vdmV8LCAKfHJldmVyc2VfY29weV9pZnwsIHxyZXBsYWNlX2lmfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK