Ly89PS0tLSBsbHZtL0NvZGVHZW4vUmVhY2hpbmdEZWZBbmFseXNpcy5oIC0gUmVhY2hpbmcgRGVmIEFuYWx5c2lzIC0qLSBDKysgLSotLS09PS8vCi8vCi8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLy8KLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLy8KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8vIFxmaWxlIFJlYWNoaW5nIERlZnMgQW5hbHlzaXMgcGFzcy4KLy8vCi8vLyBUaGlzIHBhc3MgdHJhY2tzIGZvciBlYWNoIGluc3RydWN0aW9uIHdoYXQgaXMgdGhlIJNjbG9zZXN0lCByZWFjaGluZyBkZWYgb2YKLy8vIGEgZ2l2ZW4gcmVnaXN0ZXIuIEl0IGlzIHVzZWQgYnkgQnJlYWtGYWxzZURlcHMgKGZvciBjbGVhcmFuY2UgY2FsY3VsYXRpb24pCi8vLyBhbmQgRXhlY3V0aW9uRG9tYWluRml4IChmb3IgYXJiaXRyYXRpbmcgY29uZmxpY3RpbmcgZG9tYWlucykuCi8vLwovLy8gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIHVzdWFsIGRlZmluaXRpb24gbm90aW9uIG9mIGxpdmVuZXNzLgovLy8gVGhlIENQVSBkb2Vzbid0IGNhcmUgd2hldGhlciBvciBub3Qgd2UgY29uc2lkZXIgYSByZWdpc3RlciBraWxsZWQuCi8vLwovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2lmbmRlZiBMTFZNX0NPREVHRU5fUkVBQ0hJTkdERUZTQU5BTFlTSVNfSAojZGVmaW5lIExMVk1fQ09ERUdFTl9SRUFDSElOR0RFRlNBTkFMWVNJU19ICgojaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTG9vcFRyYXZlcnNhbC5oIgojaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKCm5hbWVzcGFjZSBsbHZtIHsKCmNsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOwpjbGFzcyBNYWNoaW5lSW5zdHI7CgovLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgcmVhY2hpbmcgZGVmIGFuYWx5c2lzLgpjbGFzcyBSZWFjaGluZ0RlZkFuYWx5c2lzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3Mgewpwcml2YXRlOgogIE1hY2hpbmVGdW5jdGlvbiAqTUY7CiAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CiAgdW5zaWduZWQgTnVtUmVnVW5pdHM7CiAgLy8vIEluc3RydWN0aW9uIHRoYXQgZGVmaW5lZCBlYWNoIHJlZ2lzdGVyLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQogIC8vLyBjdXJyZW50IGJhc2ljIGJsb2NrLiAgV2hlbiBhIExpdmVSZWdzRGVmSW5mbyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhCiAgLy8vIGxpdmUtb3V0IHJlZ2lzdGVyLCB0aGlzIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGJhc2ljIGJsb2NrLAogIC8vLyBzbyBpdCB3aWxsIGJlIGEgbmVnYXRpdmUgbnVtYmVyLgogIHVzaW5nIExpdmVSZWdzRGVmSW5mbyA9IHN0ZDo6dmVjdG9yPGludD47CiAgTGl2ZVJlZ3NEZWZJbmZvIExpdmVSZWdzOwoKICAvLy8gS2VlcHMgY2xlYXJhbmNlIGluZm9ybWF0aW9uIGZvciBhbGwgcmVnaXN0ZXJzLiBOb3RlIHRoYXQgdGhpcwogIC8vLyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdXN1YWwgZGVmaW5pdGlvbiBub3Rpb24gb2YgbGl2ZW5lc3MuIFRoZSBDUFUKICAvLy8gZG9lc24ndCBjYXJlIHdoZXRoZXIgb3Igbm90IHdlIGNvbnNpZGVyIGEgcmVnaXN0ZXIga2lsbGVkLgogIHVzaW5nIE91dFJlZ3NJbmZvTWFwID0gU21hbGxWZWN0b3I8TGl2ZVJlZ3NEZWZJbmZvLCA0PjsKICBPdXRSZWdzSW5mb01hcCBNQkJPdXRSZWdzSW5mb3M7CgogIC8vLyBDdXJyZW50IGluc3RydWN0aW9uIG51bWJlci4KICAvLy8gVGhlIGZpcnN0IGluc3RydWN0aW9uIGluIGVhY2ggYmFzaWMgYmxvY2sgaXMgMC4KICBpbnQgQ3VySW5zdHI7CgogIC8vLyBNYXBzIGluc3RydWN0aW9ucyB0byB0aGVpciBpbnN0cnVjdGlvbiBJZHMsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbmluZyBvZgogIC8vLyB0aGVpciBiYXNpYyBibG9ja3MuCiAgRGVuc2VNYXA8TWFjaGluZUluc3RyICosIGludD4gSW5zdElkczsKCiAgLy8vIEFsbCByZWFjaGluZyBkZWZzIG9mIGEgZ2l2ZW4gUmVnVW5pdCBmb3IgYSBnaXZlbiBNQkIuCiAgdXNpbmcgTUJCUmVnVW5pdERlZnMgPSBTbWFsbFZlY3RvcjxpbnQsIDE+OwogIC8vLyBBbGwgcmVhY2hpbmcgZGVmcyBvZiBhbGwgcmVnIHVuaXRzIGZvciBhIGdpdmVuIE1CQgogIHVzaW5nIE1CQkRlZnNJbmZvID0gc3RkOjp2ZWN0b3I8TUJCUmVnVW5pdERlZnM+OwogIC8vLyBBbGwgcmVhY2hpbmcgZGVmcyBvZiBhbGwgcmVnIHVuaXRzIGZvciBhIGFsbCBNQkJzCiAgdXNpbmcgTUJCUmVhY2hpbmdEZWZzSW5mbyA9IFNtYWxsVmVjdG9yPE1CQkRlZnNJbmZvLCA0PjsKICBNQkJSZWFjaGluZ0RlZnNJbmZvIE1CQlJlYWNoaW5nRGVmczsKCiAgLy8vIERlZmF1bHQgdmFsdWVzIGFyZSAnbm90aGluZyBoYXBwZW5lZCBhIGxvbmcgdGltZSBhZ28nLgogIGNvbnN0IGludCBSZWFjaGluZ0RlZkRlZmF1bHRWYWwgPSAtKDEgPDwgMjApOwoKcHVibGljOgogIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCgogIFJlYWNoaW5nRGVmQW5hbHlzaXMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHsKICAgIGluaXRpYWxpemVSZWFjaGluZ0RlZkFuYWx5c2lzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CiAgfQogIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOwoKICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOwogICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CiAgfQoKICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOwoKICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFJlcXVpcmVkUHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkuc2V0KAogICAgICAgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpOb1ZSZWdzKTsKICB9CgogIC8vLyBQcm92aWRlcyB0aGUgaW5zdHJ1Y3Rpb24gaWQgb2YgdGhlIGNsb3Nlc3QgcmVhY2hpbmcgZGVmIGluc3RydWN0aW9uIG9mCiAgLy8vIFBoeXNSZWcgdGhhdCByZWFjaGVzIE1JLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5pbmcgb2YgTUkncyBiYXNpYyBibG9jay4KICBpbnQgZ2V0UmVhY2hpbmdEZWYoTWFjaGluZUluc3RyICpNSSwgaW50IFBoeXNSZWcpOwoKICAvLy8gUHJvdmlkZXMgdGhlIGNsZWFyYW5jZSAtIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHNpbmNlIHRoZSBjbG9zZXN0CiAgLy8vIHJlYWNoaW5nIGRlZiBpbnN0dWN0aW9uIG9mIFBoeXNSZWcgdGhhdCByZWFjaGVzIE1JLgogIGludCBnZXRDbGVhcmFuY2UoTWFjaGluZUluc3RyICpNSSwgTUNQaHlzUmVnIFBoeXNSZWcpOwoKcHJpdmF0ZToKICAvLy8gU2V0IHVwIExpdmVSZWdzIGJ5IG1lcmdpbmcgcHJlZGVjZXNzb3IgbGl2ZS1vdXQgdmFsdWVzLgogIHZvaWQgZW50ZXJCYXNpY0Jsb2NrKGNvbnN0IExvb3BUcmF2ZXJzYWw6OlRyYXZlcnNlZE1CQkluZm8gJlRyYXZlcnNlZE1CQik7CgogIC8vLyBVcGRhdGUgbGl2ZS1vdXQgdmFsdWVzLgogIHZvaWQgbGVhdmVCYXNpY0Jsb2NrKGNvbnN0IExvb3BUcmF2ZXJzYWw6OlRyYXZlcnNlZE1CQkluZm8gJlRyYXZlcnNlZE1CQik7CgogIC8vLyBQcm9jZXNzIGhlIGdpdmVuIGJhc2ljIGJsb2NrLgogIHZvaWQgcHJvY2Vzc0Jhc2ljQmxvY2soY29uc3QgTG9vcFRyYXZlcnNhbDo6VHJhdmVyc2VkTUJCSW5mbyAmVHJhdmVyc2VkTUJCKTsKCiAgLy8vIFVwZGF0ZSBkZWYtYWdlcyBmb3IgcmVnaXN0ZXJzIGRlZmluZWQgYnkgTUkuCiAgLy8vIEFsc28gYnJlYWsgZGVwZW5kZW5jaWVzIG9uIHBhcnRpYWwgZGVmcyBhbmQgdW5kZWYgdXNlcy4KICB2b2lkIHByb2Nlc3NEZWZzKE1hY2hpbmVJbnN0ciAqKTsKfTsKCn0gLy8gbmFtZXNwYWNlIGxsdm0KCiNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUkVBQ0hJTkdERUZTQU5BTFlTSVNfSAo=