Li4gQWxnb3JpdGhtcy9JdGVyYXRpb24gQWxnb3JpdGhtcy8vcmV2ZXJzZV9pdGVyX2ZvbGQKCnJldmVyc2VfaXRlcl9mb2xkCj09PT09PT09PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBTdGF0ZQogICAgICAgICwgdHlwZW5hbWUgQmFja3dhcmRPcAogICAgICAgICwgdHlwZW5hbWUgRm9yd2FyZE9wID0gXzEKICAgICAgICA+CiAgICBzdHJ1Y3QgcmV2ZXJzZV9pdGVyX2ZvbGQKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgIHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWNjZXNzaXZlIGFwcGxpY2F0aW9uIG9mIGJpbmFyeSBgYEJhY2t3YXJkT3BgYCB0byB0aGUgCnJlc3VsdCBvZiB0aGUgcHJldmlvdXMgYGBCYWNrd2FyZE9wYGAgaW52b2NhdGlvbiAoYGBTdGF0ZWBgIGlmIGl0J3MgdGhlIGZpcnN0IGNhbGwpIAphbmQgZWFjaCBpdGVyYXRvciBpbiB0aGUgcmFuZ2UgW2BgYmVnaW48U2VxdWVuY2U+Ojp0eXBlYGAsIGBgZW5kPFNlcXVlbmNlPjo6dHlwZWBgKSAKaW4gcmV2ZXJzZSBvcmRlci4gSWYgYGBGb3J3YXJkT3BgYCBpcyBwcm92aWRlZCwgdGhlbiBpdCdzIGFwcGxpZWQgb24gZm9yd2FyZCAKdHJhdmVyc2FsIHRvIGZvcm0gdGhlIHJlc3VsdCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGZpcnN0IGBgQmFja3dhcmRPcGBgIGNhbGwuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3JldmVyc2VfaXRlcl9mb2xkLmhwcD4KCgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICB8IEEgc2VxdWVuY2UgdG8gaXRlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFN0YXRlYGAgICAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGZpcnN0IGBgQmFja3dhcmRPcGBgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC8gYGBGb3J3YXJkT3BgYCBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEJhY2t3YXJkT3BgYHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGJhY2t3YXJkICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYXZlcnNhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEZvcndhcmRPcGBgIHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGZvcndhcmQgICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYXZlcnNhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8Rm9yd2FyZCBTZXF1ZW5jZXwgYGBzYGAsIGJpbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgYmFja3dhcmRfb3BgYCBhbmQgYGBmb3J3YXJkX29wYGAsIAphbmQgYXJiaXRyYXJ5IHR5cGUgYGBzdGF0ZWBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2VfaXRlcl9mb2xkPCBzLHN0YXRlLGJhY2t3YXJkX29wID46OnR5cGUgdDsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgYmVnaW48cz46OnR5cGUgaVwgOnN1YjpgMWA7CiAgICAgICAgdHlwZWRlZiBuZXh0PGlcIDpzdWI6YDFgPjo6dHlwZSBpXCA6c3ViOmAyYDsKICAgICAgICB8Li4ufAogICAgICAgIHR5cGVkZWYgbmV4dDxpXCA6c3ViOmBuYD46OnR5cGUgbGFzdDsKICAgICAgICB0eXBlZGVmIGFwcGx5PGJhY2t3YXJkX29wLHN0YXRlLGlcIDpzdWI6YG5gPjo6dHlwZSBzdGF0ZVwgOnN1YjpgbmA7CiAgICAgICAgdHlwZWRlZiBhcHBseTxiYWNrd2FyZF9vcCxzdGF0ZVwgOnN1YjpgbmAsaVwgOnN1Yjpgbi0xYD46OnR5cGUgc3RhdGVcIDpzdWI6YG4tMWA7IAogICAgICAgIHwuLi58CiAgICAgICAgdHlwZWRlZiBhcHBseTxiYWNrd2FyZF9vcCxzdGF0ZVwgOnN1YjpgMmAsaVwgOnN1YjpgMWA+Ojp0eXBlIHN0YXRlXCA6c3ViOmAxYDsgCiAgICAgICAgdHlwZWRlZiBzdGF0ZVwgOnN1YjpgMWAgdDsKICAgICAgICAKICAgIHdoZXJlIGBgbiA9PSBzaXplPHM+Ojp2YWx1ZWBgIGFuZCBgYGxhc3RgYCBpcyBpZGVudGljYWwgdG8gYGBlbmQ8cz46OnR5cGVgYDsgZXF1aXZhbGVudCAKICAgIHRvIGBgdHlwZWRlZiBzdGF0ZSB0O2BgIGlmIGBgZW1wdHk8cz46OnZhbHVlID09IHRydWVgYC4gCgoKLi4gfn5+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+fgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2VfaXRlcl9mb2xkPCBzLHN0YXRlLGJhY2t3YXJkX29wLGZvcndhcmRfb3AgPjo6dHlwZSB0OyAKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAogICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcl9mb2xkPAogICAgICAgICAgICAgIFNlcXVlbmNlCiAgICAgICAgICAgICwgaXRlcl9mb2xkPHMsc3RhdGUsZm9yd2FyZF9vcD46OnR5cGUKICAgICAgICAgICAgLCBiYWNrd2FyZF9vcAogICAgICAgICAgICA+Ojp0eXBlIHQ7IAoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBFeGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBiYWNrd2FyZF9vcGBgIGFuZCBgYGZvcndhcmRfb3BgYC4gCgoKRXhhbXBsZQotLS0tLS0tCgpCdWlsZCBhIGxpc3Qgb2YgaXRlcmF0b3JzIHRvIHRoZSBuZWdhdGl2ZSBlbGVtZW50cyBpbiBhIHNlcXVlbmNlLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCw1LC0xLDAsLTcsLTIsMCwtNSw0PiBudW1iZXJzOwogICAgdHlwZWRlZiBsaXN0X2M8aW50LC0xLC03LC0yLC01PiBuZWdhdGl2ZXM7CiAgICB0eXBlZGVmIHJldmVyc2VfaXRlcl9mb2xkPAogICAgICAgICAgbnVtYmVycwogICAgICAgICwgbGlzdDw+CiAgICAgICAgLCBpZl88IGxlc3M8IGRlcmVmPF8yPixpbnRfPDA+ID4sIHB1c2hfZnJvbnQ8XzEsXzI+LCBfMSA+CiAgICAgICAgPjo6dHlwZSBpdGVyczsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCAKICAgICAgICAgIG5lZ2F0aXZlcwogICAgICAgICwgdHJhbnNmb3JtX3ZpZXc8IGl0ZXJzLGRlcmVmPF8xPiA+CiAgICAgICAgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEFsZ29yaXRobXN8LCB8aXRlcl9mb2xkfCwgfHJldmVyc2VfZm9sZHwsIHxmb2xkfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK