Li4gTWV0YWZ1bmN0aW9ucy9JbnZvY2F0aW9uLy9hcHBseV93cmFwIHwyMAoKYXBwbHlfd3JhcAo9PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHRlbXBsYXRlPCAKICAgICAgICAgIHR5cGVuYW1lIEYKICAgICAgICA+CiAgICBzdHJ1Y3QgYXBwbHlfd3JhcDAKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEKICAgICAgICA+CiAgICBzdHJ1Y3QgYXBwbHlfd3JhcDEKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CiAgICAKICAgIHwuLi58CiAgICAKICAgIHRlbXBsYXRlPCAKICAgICAgICAgIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLFwgfC4uLnwgdHlwZW5hbWUgQW4KICAgICAgICA+CiAgICBzdHJ1Y3QgYXBwbHlfd3JhcFwgKm4qCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKSW52b2tlcyBhIHxNZXRhZnVuY3Rpb24gQ2xhc3N8IGBgRmBgIHdpdGggYXJndW1lbnRzIGBgQTFgYCwuLi4gYGBBbmBgLiAKCkluIGVzc2VuY2UsIGBgYXBwbHlfd3JhcGBgIGZvcm1zIGFyZSBub3RoaW5nIG1vcmUgdGhhbiBzeW50YWN0aWMgd3JhcHBlcnMgYXJvdW5kIApgYEY6OmFwcGx5PEExLC4uLiBBbj46OnR5cGVgYCAvIGBgRjo6YXBwbHk6OnR5cGVgYCBleHByZXNzaW9ucyAoaGVuY2UgdGhlIG5hbWUpLiAKVGhleSBwcm92aWRlIGEgbW9yZSBjb25jaXNlIG5vdGF0aW9uIGFuZCBoaWdoZXIgcG9ydGFiaWxpdHkgdGhhbiB0aGVpciAKdW5kZXJsYXlpbmcgY29uc3RydWN0cyBhdCB0aGUgY29zdCBvZiBhbiBleHRyYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9hcHBseV93cmFwLmhwcD4KCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBGYGAgICAgICAgICB8IHxNZXRhZnVuY3Rpb24gQ2xhc3N8ICAgICAgICAgICAgICB8IEEgbWV0YWZ1bmN0aW9uIGNsYXNzIHRvIGludm9rZS4gICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgfEExLi4uQW58ICAgICB8IEFueSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludm9jYXRpb24gYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfE1ldGFmdW5jdGlvbiBDbGFzc3wgYGBmYGAgYW5kIGFyYml0cmFyeSB0eXBlcyB8YTEuLi5hbnw6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgYXBwbHlfd3JhcFwgKm4qXCA8ZixhMSxcIHwuLi58XCBhbj46OnR5cGUgdDsKCjpSZXR1cm4gdHlwZToKICAgIEFueSB0eXBlLgoKOlNlbWFudGljczoKICAgIElmIGBgbiA+IDBgYCwgZXF1aXZhbGVudCB0byBgYHR5cGVkZWYgZjo6YXBwbHk8YTEsLi4uIGFuPjo6dHlwZSB0O2BgLAogICAgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gZWl0aGVyIGBgdHlwZWRlZiBmOjphcHBseTo6dHlwZSB0O2BgIG9yCiAgICBgYHR5cGVkZWYgZjo6YXBwbHk8Pjo6dHlwZSB0O2BgIGRlcGVuZGluZyBvbiB3aGV0aGVyIGBgZjo6YXBwbHlgYCBpcyAKICAgIGEgY2xhc3Mgb3IgYSBjbGFzcyB0ZW1wbGF0ZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICBzdHJ1Y3QgZjAKICAgIHsKICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA9IGludCA+IHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBjaGFyIHR5cGU7CiAgICAgICAgfTsKICAgIH07CiAgICAgICAgCiAgICBzdHJ1Y3QgZzAKICAgIHsKICAgICAgICBzdHJ1Y3QgYXBwbHkgeyB0eXBlZGVmIGNoYXIgdHlwZTsgfTsKICAgIH07CgogICAgc3RydWN0IGYyCiAgICB7CiAgICAgICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+IHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBUMiB0eXBlOwogICAgICAgIH07CiAgICB9OwoKICAgIAogICAgdHlwZWRlZiBhcHBseV93cmFwXCBgYDBgYFwgPCBmMCA+Ojp0eXBlIHIxOwogICAgdHlwZWRlZiBhcHBseV93cmFwXCBgYDBgYFwgPCBnMCA+Ojp0eXBlIHIyOwogICAgdHlwZWRlZiBhcHBseV93cmFwXCBgYDJgYFwgPCBmMixpbnQsY2hhciA+Ojp0eXBlIHIzOwoKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPHIxLGNoYXI+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8cjIsY2hhcj4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTxyMyxjaGFyPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnN8LCB8SW52b2NhdGlvbnwsIHxhcHBseXwsIHxsYW1iZGF8LCB8cXVvdGV8LCB8YmluZHwsIHxwcm90ZWN0fAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK