Li4gQWxnb3JpdGhtcy9JdGVyYXRpb24gQWxnb3JpdGhtcy8vaXRlcl9mb2xkCgppdGVyX2ZvbGQKPT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBTdGF0ZQogICAgICAgICwgdHlwZW5hbWUgRm9yd2FyZE9wCiAgICAgICAgPgogICAgc3RydWN0IGl0ZXJfZm9sZAogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgc3VjY2Vzc2l2ZSBhcHBsaWNhdGlvbiBvZiBiaW5hcnkgYGBGb3J3YXJkT3BgYCB0byB0aGUgcmVzdWx0IApvZiB0aGUgcHJldmlvdXMgYGBGb3J3YXJkT3BgYCBpbnZvY2F0aW9uIChgYFN0YXRlYGAgaWYgaXQncyB0aGUgZmlyc3QgY2FsbCkgYW5kIGVhY2ggCml0ZXJhdG9yIGluIHRoZSByYW5nZSBbYGBiZWdpbjxTZXF1ZW5jZT46OnR5cGVgYCwgYGBlbmQ8U2VxdWVuY2U+Ojp0eXBlYGApIGluIG9yZGVyLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9pdGVyX2ZvbGQuaHBwPgoKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgIHwgQSBzZXF1ZW5jZSB0byBpdGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBTdGF0ZWBgICAgICB8IEFueSB0eXBlICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSBmaXJzdCBgYEZvcndhcmRPcGBgICAgICB8CnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBGb3J3YXJkT3BgYCB8IEJpbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258ICAgIHwgVGhlIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBvbiBmb3J3YXJkICAgICAgICAgICB8CnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhdmVyc2FsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBiaW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCBgYG9wYGAsIGFuZCBhbiAKYXJiaXRyYXJ5IHR5cGUgYGBzdGF0ZWBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGl0ZXJfZm9sZDxzLHN0YXRlLG9wPjo6dHlwZSB0OyAKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAogICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgYmVnaW48cz46OnR5cGUgaVwgOnN1YjpgMWA7CiAgICAgICAgdHlwZWRlZiBhcHBseTxvcCxzdGF0ZSxpXCA6c3ViOmAxYD46OnR5cGUgc3RhdGVcIDpzdWI6YDFgOwogICAgICAgIHR5cGVkZWYgbmV4dDxpXCA6c3ViOmAxYD46OnR5cGUgaVwgOnN1YjpgMmA7CiAgICAgICAgdHlwZWRlZiBhcHBseTxvcCxzdGF0ZVwgOnN1YjpgMWAsaVwgOnN1YjpgMmA+Ojp0eXBlIHN0YXRlXCA6c3ViOmAyYDsKICAgICAgICB8Li4ufAogICAgICAgIHR5cGVkZWYgYXBwbHk8b3Asc3RhdGVcIDpzdWI6YG4tMWAsaVwgOnN1YjpgbmA+Ojp0eXBlIHN0YXRlXCA6c3ViOmBuYDsgCiAgICAgICAgdHlwZWRlZiBuZXh0PGlcIDpzdWI6YG5gPjo6dHlwZSBsYXN0OyAKICAgICAgICB0eXBlZGVmIHN0YXRlXCA6c3ViOmBuYCB0OwogICAgICAgIAogICAgd2hlcmUgYGBuID09IHNpemU8cz46OnZhbHVlYGAgYW5kIGBgbGFzdGBgIGlzIGlkZW50aWNhbCB0byBgYGVuZDxzPjo6dHlwZWBgOyBlcXVpdmFsZW50IAogICAgdG8gYGB0eXBlZGVmIHN0YXRlIHQ7YGAgaWYgYGBlbXB0eTxzPjo6dmFsdWUgPT0gdHJ1ZWBgLiAKCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuIEV4YWN0bHkgYGBzaXplPHM+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiBgYG9wYGAuIAoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCw1LC0xLDAsNywyLDAsLTUsND4gbnVtYmVyczsKICAgIHR5cGVkZWYgaXRlcl9mb2xkPAogICAgICAgICAgbnVtYmVycwogICAgICAgICwgYmVnaW48bnVtYmVycz46OnR5cGUKICAgICAgICAsIGlmXzwgbGVzczwgZGVyZWY8XzE+LCBkZXJlZjxfMj4gPixfMixfMSA+CiAgICAgICAgPjo6dHlwZSBtYXhfZWxlbWVudF9pdGVyOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBkZXJlZjxtYXhfZWxlbWVudF9pdGVyPjo6dHlwZTo6dmFsdWUsID09LCA3ICk7CgoKClNlZSBhbHNvCi0tLS0tLS0tCgp8QWxnb3JpdGhtc3wsIHxyZXZlcnNlX2l0ZXJfZm9sZHwsIHxmb2xkfCwgfHJldmVyc2VfZm9sZHwsIHxjb3B5fAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK