LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCBOLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7IHlvdSBtYXkKICogbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIHd3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsIFdJVEhPVVQKICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiAgICAgIE5hbWU6ICAgIGNtc2lzX29zMi5jCiAqICAgICAgUHVycG9zZTogQ01TSVMgUlRPUzIgd3JhcHBlciBmb3IgRnJlZVJUT1MKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgImNtc2lzX29zMi5oIiAgICAgICAgICAgICAgICAgIC8vIDo6Q01TSVM6UlRPUzIKI2luY2x1ZGUgImNtc2lzX2NvbXBpbGVyLmgiCgojaW5jbHVkZSAiRnJlZVJUT1MuaCIgICAgICAgICAgICAgICAgICAgLy8gQVJNLkZyZWVSVE9TOjpSVE9TOkNvcmUKI2luY2x1ZGUgInRhc2suaCIgICAgICAgICAgICAgICAgICAgICAgIC8vIEFSTS5GcmVlUlRPUzo6UlRPUzpDb3JlCiNpbmNsdWRlICJldmVudF9ncm91cHMuaCIgICAgICAgICAgICAgICAvLyBBUk0uRnJlZVJUT1M6OlJUT1M6RXZlbnQgR3JvdXBzCiNpbmNsdWRlICJzZW1waHIuaCIgICAgICAgICAgICAgICAgICAgICAvLyBBUk0uRnJlZVJUT1M6OlJUT1M6Q29yZQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZuZGVmIF9fQVJNX0FSQ0hfNk1fXwogICNkZWZpbmUgX19BUk1fQVJDSF82TV9fICAgICAgICAgMAojZW5kaWYKI2lmbmRlZiBfX0FSTV9BUkNIXzdNX18KICAjZGVmaW5lIF9fQVJNX0FSQ0hfN01fXyAgICAgICAgIDAKI2VuZGlmCiNpZm5kZWYgX19BUk1fQVJDSF83RU1fXwogICNkZWZpbmUgX19BUk1fQVJDSF83RU1fXyAgICAgICAgMAojZW5kaWYKI2lmbmRlZiBfX0FSTV9BUkNIXzhNX01BSU5fXwogICNkZWZpbmUgX19BUk1fQVJDSF84TV9NQUlOX18gICAgMAojZW5kaWYKI2lmbmRlZiBfX0FSTV9BUkNIXzdBX18KICAjZGVmaW5lIF9fQVJNX0FSQ0hfN0FfXyAgICAgICAgIDAKI2VuZGlmCgojaWYgICAoKF9fQVJNX0FSQ0hfN01fXyAgICAgID09IDFVKSB8fCBcCiAgICAgICAoX19BUk1fQVJDSF83RU1fXyAgICAgPT0gMVUpIHx8IFwKICAgICAgIChfX0FSTV9BUkNIXzhNX01BSU5fXyA9PSAxVSkpCiNkZWZpbmUgSVNfSVJRX01BU0tFRCgpICAgICAgICAgICAoKF9fZ2V0X1BSSU1BU0soKSAhPSAwVSkgfHwgKF9fZ2V0X0JBU0VQUkkoKSAhPSAwVSkpCiNlbGlmICAoX19BUk1fQVJDSF82TV9fICAgICAgPT0gMVUpCiNkZWZpbmUgSVNfSVJRX01BU0tFRCgpICAgICAgICAgICAoX19nZXRfUFJJTUFTSygpICE9IDBVKQojZWxpZiAoX19BUk1fQVJDSF83QV9fICAgICAgID09IDFVKQovKiBDUFNSIG1hc2sgYml0cyAqLwojZGVmaW5lIENQU1JfTUFTS0JJVF9JICAgICAgICAgICAgMHg4MFUKCiNkZWZpbmUgSVNfSVJRX01BU0tFRCgpICAgICAgICAgICAoKF9fZ2V0X0NQU1IoKSAmIENQU1JfTUFTS0JJVF9JKSAhPSAwVSkKI2Vsc2UKI2RlZmluZSBJU19JUlFfTUFTS0VEKCkgICAgICAgICAgIChfX2dldF9QUklNQVNLKCkgIT0gMFUpCiNlbmRpZgoKI2lmICAgIChfX0FSTV9BUkNIXzdBX18gICAgICA9PSAxVSkKLyogQ1BTUiBtb2RlIGJpdG1hc2tzICovCiNkZWZpbmUgQ1BTUl9NT0RFX1VTRVIgICAgICAgICAgICAweDEwVQojZGVmaW5lIENQU1JfTU9ERV9TWVNURU0gICAgICAgICAgMHgxRlUKCiNkZWZpbmUgSVNfSVJRX01PREUoKSAgICAgICAgICAgICAoKF9fZ2V0X21vZGUoKSAhPSBDUFNSX01PREVfVVNFUikgJiYgKF9fZ2V0X21vZGUoKSAhPSBDUFNSX01PREVfU1lTVEVNKSkKI2Vsc2UKI2RlZmluZSBJU19JUlFfTU9ERSgpICAgICAgICAgICAgIChfX2dldF9JUFNSKCkgIT0gMFUpCiNlbmRpZgoKI2RlZmluZSBJU19JUlEoKSAgICAgICAgICAgICAgICAgIChJU19JUlFfTU9ERSgpIHx8IChJU19JUlFfTUFTS0VEKCkgJiYgKEtlcm5lbFN0YXRlID09IG9zS2VybmVsUnVubmluZykpKQoKLyogTGltaXRzICovCiNkZWZpbmUgTUFYX0JJVFNfVEFTS19OT1RJRlkgICAgICAzMVUKI2RlZmluZSBNQVhfQklUU19FVkVOVF9HUk9VUFMgICAgIDI0VQoKI2RlZmluZSBUSFJFQURfRkxBR1NfSU5WQUxJRF9CSVRTICh+KCgxVUwgPDwgTUFYX0JJVFNfVEFTS19OT1RJRlkpICAtIDFVKSkKI2RlZmluZSBFVkVOVF9GTEFHU19JTlZBTElEX0JJVFMgICh+KCgxVUwgPDwgTUFYX0JJVFNfRVZFTlRfR1JPVVBTKSAtIDFVKSkKCi8qIEtlcm5lbCB2ZXJzaW9uIGFuZCBpZGVudGlmaWNhdGlvbiBzdHJpbmcgZGVmaW5pdGlvbiAobWFqb3IubWlub3IucmV2OiBtbW5ubnJycnIgZGVjKSAqLwojZGVmaW5lIEtFUk5FTF9WRVJTSU9OICAgICAgICAgICAgKCgodWludDMyX3QpdHNrS0VSTkVMX1ZFUlNJT05fTUFKT1IgKiAxMDAwMDAwMFVMKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXRza0tFUk5FTF9WRVJTSU9OX01JTk9SICogICAgMTAwMDBVTCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCl0c2tLRVJORUxfVkVSU0lPTl9CVUlMRCAqICAgICAgICAxVUwpKQoKI2RlZmluZSBLRVJORUxfSUQgICAgICAgICAgICAgICAgICgiRnJlZVJUT1MgIiB0c2tLRVJORUxfVkVSU0lPTl9OVU1CRVIpCgovKiBUaW1lciBjYWxsYmFjayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgb3NUaW1lckZ1bmNfdCBmdW5jOwogIHZvaWQgICAgICAgICAqYXJnOwp9IFRpbWVyQ2FsbGJhY2tfdDsKCi8qIEtlcm5lbCBpbml0aWFsaXphdGlvbiBzdGF0ZSAqLwpzdGF0aWMgb3NLZXJuZWxTdGF0ZV90IEtlcm5lbFN0YXRlID0gb3NLZXJuZWxJbmFjdGl2ZTsKCi8qCiAgSGVhcCByZWdpb24gZGVmaW5pdGlvbiB1c2VkIGJ5IGhlYXBfNSB2YXJpYW50CgogIERlZmluZSBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCBhcyBub256ZXJvIHZhbHVlIGluIEZyZWVSVE9TQ29uZmlnLmggaWYKICBoZWFwIHJlZ2lvbnMgYXJlIGFscmVhZHkgZGVmaW5lZCBhbmQgdlBvcnREZWZpbmVIZWFwUmVnaW9ucyBpcyBjYWxsZWQgaW4gYXBwbGljYXRpb24uCgogIE90aGVyd2lzZSB2UG9ydERlZmluZUhlYXBSZWdpb25zIHdpbGwgYmUgY2FsbGVkIGJ5IG9zS2VybmVsSW5pdGlhbGl6ZSB1c2luZwogIGRlZmluaXRpb24gY29uZmlnSEVBUF81X1JFR0lPTlMgYXMgcGFyYW1ldGVyLiBPdmVycmlkaW5nIGNvbmZpZ0hFQVBfNV9SRUdJT05TCiAgaXMgcG9zc2libGUgYnkgZGVmaW5pbmcgaXQgZ2xvYmFsbHkgb3IgaW4gRnJlZVJUT1NDb25maWcuaC4KKi8KI2lmIGRlZmluZWQoVVNFX0ZSRUVSVE9TX0hFQVBfNSkKI2lmIChjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCA9PSAwKQogIC8qCiAgICBGcmVlUlRPUyBoZWFwIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAgIFNpbmdsZSByZWdpb24gb2Ygc2l6ZSBjb25maWdUT1RBTF9IRUFQX1NJWkUgKGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCkKICAgIGlzIHByb3ZpZGVkIGJ5IGRlZmF1bHQuIERlZmluZSBjb25maWdIRUFQXzVfUkVHSU9OUyB0byBwcm92aWRlIGN1c3RvbQogICAgSGVhcFJlZ2lvbl90IGFycmF5LgogICovCiAgI2RlZmluZSBIRUFQXzVfUkVHSU9OX1NFVFVQICAgMQogIAogICNpZm5kZWYgY29uZmlnSEVBUF81X1JFR0lPTlMKICAgICNkZWZpbmUgY29uZmlnSEVBUF81X1JFR0lPTlMgeEhlYXBSZWdpb25zCgogICAgc3RhdGljIHVpbnQ4X3QgdWNIZWFwW2NvbmZpZ1RPVEFMX0hFQVBfU0laRV07CgogICAgc3RhdGljIEhlYXBSZWdpb25fdCB4SGVhcFJlZ2lvbnNbXSA9IHsKICAgICAgeyB1Y0hlYXAsIGNvbmZpZ1RPVEFMX0hFQVBfU0laRSB9LAogICAgICB7IE5VTEwsICAgMCAgICAgICAgICAgICAgICAgICAgIH0KICAgIH07CiAgI2Vsc2UKICAgIC8qIEdsb2JhbCBkZWZpbml0aW9uIGlzIHByb3ZpZGVkIHRvIG92ZXJyaWRlIGRlZmF1bHQgaGVhcCBhcnJheSAqLwogICAgZXh0ZXJuIEhlYXBSZWdpb25fdCBjb25maWdIRUFQXzVfUkVHSU9OU1tdOwogICNlbmRpZgojZWxzZQogIC8qCiAgICBUaGUgYXBwbGljYXRpb24gYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgRnJlZVJUT1MgaGVhcCBhbmQKICAgIGNhbGxlZCB2UG9ydERlZmluZUhlYXBSZWdpb25zIHRvIGluaXRpYWxpemUgaGVhcC4KICAqLwogICNkZWZpbmUgSEVBUF81X1JFR0lPTl9TRVRVUCAgIDAKI2VuZGlmIC8qIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQICovCiNlbmRpZiAvKiBVU0VfRlJFRVJUT1NfSEVBUF81ICovCgojaWYgZGVmaW5lZChTeXNUaWNrKQojdW5kZWYgU3lzVGlja19IYW5kbGVyCgovKiBDTVNJUyBTeXNUaWNrIGludGVycnVwdCBoYW5kbGVyIHByb3RvdHlwZSAqLwpleHRlcm4gdm9pZCBTeXNUaWNrX0hhbmRsZXIgICAgICh2b2lkKTsKLyogRnJlZVJUT1MgdGljayB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciBwcm90b3R5cGUgKi8KZXh0ZXJuIHZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciAodm9pZCk7CgovKgogIFN5c1RpY2sgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsc28gY2xlYXJzIG92ZXJmbG93IGZsYWcuCiovCnZvaWQgU3lzVGlja19IYW5kbGVyICh2b2lkKSB7CiAgLyogQ2xlYXIgb3ZlcmZsb3cgZmxhZyAqLwogIFN5c1RpY2stPkNUUkw7CgogIGlmICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgIT0gdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRCkgewogICAgLyogQ2FsbCB0aWNrIGhhbmRsZXIgKi8KICAgIHhQb3J0U3lzVGlja0hhbmRsZXIoKTsKICB9Cn0KI2VuZGlmIC8qIFN5c1RpY2sgKi8KCi8qCiAgU2V0dXAgU1ZDIHRvIHJlc2V0IHZhbHVlLgoqLwpfX1NUQVRJQ19JTkxJTkUgdm9pZCBTVkNfU2V0dXAgKHZvaWQpIHsKI2lmIChfX0FSTV9BUkNIXzdBX18gPT0gMFUpCiAgLyogU2VydmljZSBDYWxsIGludGVycnVwdCBtaWdodCBiZSBjb25maWd1cmVkIGJlZm9yZSBrZXJuZWwgc3RhcnQgICAgICovCiAgLyogYW5kIHdoZW4gaXRzIHByaW9yaXR5IGlzIGxvd2VyIG9yIGVxdWFsIHRvIEJBU0VQUkksIHN2YyBpbnRydWN0aW9uICovCiAgLyogY2F1c2VzIGEgSGFyZCBGYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogLyogCiAgKiB0aGUgY2FsbCBiZWxvdyBoYXMgaW50cm9kdWNlZCBhIHJlZ3Jlc3Npb24gY29tcGFyZWQgdG8gcmV2aW91cyByZWxlYXNlCiAgKiBUaGUgaXNzdWUgd2FzIGxvZ2dlZCB1bmRlcjpodHRwczovL2dpdGh1Yi5jb20vQVJNLXNvZnR3YXJlL0NNU0lTLUZyZWVSVE9TL2lzc3Vlcy8zNQogICogdW50aWwgaXQgaXMgY29ycmVjdGx5IGZpeGVkLCB0aGUgY29kZSBiZWxvdyBpcyBjb21tZW50ZWQKICAqLwovKiAgICBOVklDX1NldFByaW9yaXR5IChTVkNhbGxfSVJRbiwgMFUpOyAqLwojZW5kaWYKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKb3NTdGF0dXNfdCBvc0tlcm5lbEluaXRpYWxpemUgKHZvaWQpIHsKICBvc1N0YXR1c190IHN0YXQ7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgewogICAgaWYgKEtlcm5lbFN0YXRlID09IG9zS2VybmVsSW5hY3RpdmUpIHsKICAgICAgI2lmIGRlZmluZWQoVVNFX0ZSRUVSVE9TX0hFQVBfNSkgJiYgKEhFQVBfNV9SRUdJT05fU0VUVVAgPT0gMSkKICAgICAgICB2UG9ydERlZmluZUhlYXBSZWdpb25zIChjb25maWdIRUFQXzVfUkVHSU9OUyk7CiAgICAgICNlbmRpZgogICAgICBLZXJuZWxTdGF0ZSA9IG9zS2VybmVsUmVhZHk7CiAgICAgIHN0YXQgPSBvc09LOwogICAgfSBlbHNlIHsKICAgICAgc3RhdCA9IG9zRXJyb3I7CiAgICB9CiAgfQoKICByZXR1cm4gKHN0YXQpOwp9Cgpvc1N0YXR1c190IG9zS2VybmVsR2V0SW5mbyAob3NWZXJzaW9uX3QgKnZlcnNpb24sIGNoYXIgKmlkX2J1ZiwgdWludDMyX3QgaWRfc2l6ZSkgewoKICBpZiAodmVyc2lvbiAhPSBOVUxMKSB7CiAgICAvKiBWZXJzaW9uIGVuY29kaW5nIGlzIG1ham9yLm1pbm9yLnJldjogbW1ubm5ycnJyIGRlYyAqLwogICAgdmVyc2lvbi0+YXBpICAgID0gS0VSTkVMX1ZFUlNJT047CiAgICB2ZXJzaW9uLT5rZXJuZWwgPSBLRVJORUxfVkVSU0lPTjsKICB9CgogIGlmICgoaWRfYnVmICE9IE5VTEwpICYmIChpZF9zaXplICE9IDBVKSkgewogICAgaWYgKGlkX3NpemUgPiBzaXplb2YoS0VSTkVMX0lEKSkgewogICAgICBpZF9zaXplID0gc2l6ZW9mKEtFUk5FTF9JRCk7CiAgICB9CiAgICBtZW1jcHkoaWRfYnVmLCBLRVJORUxfSUQsIGlkX3NpemUpOwogIH0KCiAgcmV0dXJuIChvc09LKTsKfQoKb3NLZXJuZWxTdGF0ZV90IG9zS2VybmVsR2V0U3RhdGUgKHZvaWQpIHsKICBvc0tlcm5lbFN0YXRlX3Qgc3RhdGU7CgogIHN3aXRjaCAoeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSgpKSB7CiAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfUlVOTklORzoKICAgICAgc3RhdGUgPSBvc0tlcm5lbFJ1bm5pbmc7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQ6CiAgICAgIHN0YXRlID0gb3NLZXJuZWxMb2NrZWQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRDoKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChLZXJuZWxTdGF0ZSA9PSBvc0tlcm5lbFJlYWR5KSB7CiAgICAgICAgc3RhdGUgPSBvc0tlcm5lbFJlYWR5OwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRlID0gb3NLZXJuZWxJbmFjdGl2ZTsKICAgICAgfQogICAgICBicmVhazsKICB9CgogIHJldHVybiAoc3RhdGUpOwp9Cgpvc1N0YXR1c190IG9zS2VybmVsU3RhcnQgKHZvaWQpIHsKICBvc1N0YXR1c190IHN0YXQ7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgewogICAgaWYgKEtlcm5lbFN0YXRlID09IG9zS2VybmVsUmVhZHkpIHsKICAgICAgLyogRW5zdXJlIFNWQyBwcmlvcml0eSBpcyBhdCB0aGUgcmVzZXQgdmFsdWUgKi8KICAgICAgU1ZDX1NldHVwKCk7CiAgICAgIC8qIENoYW5nZSBzdGF0ZSB0byBlbmFibGUgSVJRIG1hc2tpbmcgY2hlY2sgKi8KICAgICAgS2VybmVsU3RhdGUgPSBvc0tlcm5lbFJ1bm5pbmc7CiAgICAgIC8qIFN0YXJ0IHRoZSBrZXJuZWwgc2NoZWR1bGVyICovCiAgICAgIHZUYXNrU3RhcnRTY2hlZHVsZXIoKTsKICAgICAgc3RhdCA9IG9zT0s7CiAgICB9IGVsc2UgewogICAgICBzdGF0ID0gb3NFcnJvcjsKICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCmludDMyX3Qgb3NLZXJuZWxMb2NrICh2b2lkKSB7CiAgaW50MzJfdCBsb2NrOwoKICBpZiAoSVNfSVJRKCkpIHsKICAgIGxvY2sgPSAoaW50MzJfdClvc0Vycm9ySVNSOwogIH0KICBlbHNlIHsKICAgIHN3aXRjaCAoeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSgpKSB7CiAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQ6CiAgICAgICAgbG9jayA9IDE7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfUlVOTklORzoKICAgICAgICB2VGFza1N1c3BlbmRBbGwoKTsKICAgICAgICBsb2NrID0gMDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRDoKICAgICAgZGVmYXVsdDoKICAgICAgICBsb2NrID0gKGludDMyX3Qpb3NFcnJvcjsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHJldHVybiAobG9jayk7Cn0KCmludDMyX3Qgb3NLZXJuZWxVbmxvY2sgKHZvaWQpIHsKICBpbnQzMl90IGxvY2s7CgogIGlmIChJU19JUlEoKSkgewogICAgbG9jayA9IChpbnQzMl90KW9zRXJyb3JJU1I7CiAgfQogIGVsc2UgewogICAgc3dpdGNoICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkpIHsKICAgICAgY2FzZSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRDoKICAgICAgICBsb2NrID0gMTsKCiAgICAgICAgaWYgKHhUYXNrUmVzdW1lQWxsKCkgIT0gcGRUUlVFKSB7CiAgICAgICAgICBpZiAoeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSgpID09IHRhc2tTQ0hFRFVMRVJfU1VTUEVOREVEKSB7CiAgICAgICAgICAgIGxvY2sgPSAoaW50MzJfdClvc0Vycm9yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9SVU5OSU5HOgogICAgICAgIGxvY2sgPSAwOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSB0YXNrU0NIRURVTEVSX05PVF9TVEFSVEVEOgogICAgICBkZWZhdWx0OgogICAgICAgIGxvY2sgPSAoaW50MzJfdClvc0Vycm9yOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgcmV0dXJuIChsb2NrKTsKfQoKaW50MzJfdCBvc0tlcm5lbFJlc3RvcmVMb2NrIChpbnQzMl90IGxvY2spIHsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBsb2NrID0gKGludDMyX3Qpb3NFcnJvcklTUjsKICB9CiAgZWxzZSB7CiAgICBzd2l0Y2ggKHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSkgewogICAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfU1VTUEVOREVEOgogICAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfUlVOTklORzoKICAgICAgICBpZiAobG9jayA9PSAxKSB7CiAgICAgICAgICB2VGFza1N1c3BlbmRBbGwoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAobG9jayAhPSAwKSB7CiAgICAgICAgICAgIGxvY2sgPSAoaW50MzJfdClvc0Vycm9yOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICh4VGFza1Jlc3VtZUFsbCgpICE9IHBkVFJVRSkgewogICAgICAgICAgICAgIGlmICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgIT0gdGFza1NDSEVEVUxFUl9SVU5OSU5HKSB7CiAgICAgICAgICAgICAgICBsb2NrID0gKGludDMyX3Qpb3NFcnJvcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfTk9UX1NUQVJURUQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgbG9jayA9IChpbnQzMl90KW9zRXJyb3I7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gKGxvY2spOwp9Cgp1aW50MzJfdCBvc0tlcm5lbEdldFRpY2tDb3VudCAodm9pZCkgewogIFRpY2tUeXBlX3QgdGlja3M7CgogIGlmIChJU19JUlEoKSkgewogICAgdGlja3MgPSB4VGFza0dldFRpY2tDb3VudEZyb21JU1IoKTsKICB9IGVsc2UgewogICAgdGlja3MgPSB4VGFza0dldFRpY2tDb3VudCgpOwogIH0KCiAgcmV0dXJuICh0aWNrcyk7Cn0KCnVpbnQzMl90IG9zS2VybmVsR2V0VGlja0ZyZXEgKHZvaWQpIHsKICByZXR1cm4gKGNvbmZpZ1RJQ0tfUkFURV9IWik7Cn0KCnVpbnQzMl90IG9zS2VybmVsR2V0U3lzVGltZXJDb3VudCAodm9pZCkgewogIHVpbnQzMl90IGlycW1hc2sgPSBJU19JUlFfTUFTS0VEKCk7CiAgVGlja1R5cGVfdCB0aWNrczsKICB1aW50MzJfdCB2YWw7CgogIF9fZGlzYWJsZV9pcnEoKTsKCiAgdGlja3MgPSB4VGFza0dldFRpY2tDb3VudCgpOwoKICB2YWwgPSB0aWNrcyAqICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7CiAgaWYgKGlycW1hc2sgPT0gMFUpIHsKICAgIF9fZW5hYmxlX2lycSgpOwogIH0KCiAgcmV0dXJuICh2YWwpOwp9Cgp1aW50MzJfdCBvc0tlcm5lbEdldFN5c1RpbWVyRnJlcSAodm9pZCkgewogIHJldHVybiAoY29uZmlnQ1BVX0NMT0NLX0haKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKb3NUaHJlYWRJZF90IG9zVGhyZWFkTmV3IChvc1RocmVhZEZ1bmNfdCBmdW5jLCB2b2lkICphcmd1bWVudCwgY29uc3Qgb3NUaHJlYWRBdHRyX3QgKmF0dHIpIHsKICBjb25zdCBjaGFyICpuYW1lOwogIHVpbnQzMl90IHN0YWNrOwogIFRhc2tIYW5kbGVfdCBoVGFzazsKICBVQmFzZVR5cGVfdCBwcmlvOwogIGludDMyX3QgbWVtOwoKICBoVGFzayA9IE5VTEw7CgogIGlmICghSVNfSVJRKCkgJiYgKGZ1bmMgIT0gTlVMTCkpIHsKICAgIHN0YWNrID0gY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFOwogICAgcHJpbyAgPSAoVUJhc2VUeXBlX3Qpb3NQcmlvcml0eU5vcm1hbDsKCiAgICBuYW1lID0gTlVMTDsKICAgIG1lbSAgPSAtMTsKCiAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgIGlmIChhdHRyLT5uYW1lICE9IE5VTEwpIHsKICAgICAgICBuYW1lID0gYXR0ci0+bmFtZTsKICAgICAgfQogICAgICBpZiAoYXR0ci0+cHJpb3JpdHkgIT0gb3NQcmlvcml0eU5vbmUpIHsKICAgICAgICBwcmlvID0gKFVCYXNlVHlwZV90KWF0dHItPnByaW9yaXR5OwogICAgICB9CgogICAgICBpZiAoKHByaW8gPCBvc1ByaW9yaXR5SWRsZSkgfHwgKHByaW8gPiBvc1ByaW9yaXR5SVNSKSB8fCAoKGF0dHItPmF0dHJfYml0cyAmIG9zVGhyZWFkSm9pbmFibGUpID09IG9zVGhyZWFkSm9pbmFibGUpKSB7CiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgfQoKICAgICAgaWYgKGF0dHItPnN0YWNrX3NpemUgPiAwVSkgewogICAgICAgIC8qIEluIEZyZWVSVE9TIHN0YWNrIGlzIG5vdCBpbiBieXRlcywgYnV0IGluIHNpemVvZihTdGFja1R5cGVfdCkgd2hpY2ggaXMgNCBvbiBBUk0gcG9ydHMuICAgICAgICovCiAgICAgICAgLyogU3RhY2sgc2l6ZSBzaG91bGQgYmUgdGhlcmVmb3JlIDQgYnl0ZSBhbGlnbmVkIGluIG9yZGVyIHRvIGF2b2lkIGRpdmlzaW9uIGNhdXNlZCBzaWRlIGVmZmVjdHMgKi8KICAgICAgICBzdGFjayA9IGF0dHItPnN0YWNrX3NpemUgLyBzaXplb2YoU3RhY2tUeXBlX3QpOwogICAgICB9CgogICAgICBpZiAoKGF0dHItPmNiX21lbSAgICAhPSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSAgICA+PSBzaXplb2YoU3RhdGljVGFza190KSkgJiYKICAgICAgICAgIChhdHRyLT5zdGFja19tZW0gIT0gTlVMTCkgJiYgKGF0dHItPnN0YWNrX3NpemUgPiAgMFUpKSB7CiAgICAgICAgbWVtID0gMTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAoKGF0dHItPmNiX21lbSA9PSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA9PSAwVSkgJiYgKGF0dHItPnN0YWNrX21lbSA9PSBOVUxMKSkgewogICAgICAgICAgbWVtID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICBtZW0gPSAwOwogICAgfQoKICAgIGlmIChtZW0gPT0gMSkgewogICAgICBoVGFzayA9IHhUYXNrQ3JlYXRlU3RhdGljICgoVGFza0Z1bmN0aW9uX3QpZnVuYywgbmFtZSwgc3RhY2ssIGFyZ3VtZW50LCBwcmlvLCAoU3RhY2tUeXBlX3QgICopYXR0ci0+c3RhY2tfbWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdGljVGFza190ICopYXR0ci0+Y2JfbWVtKTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAobWVtID09IDApIHsKICAgICAgICBpZiAoeFRhc2tDcmVhdGUgKChUYXNrRnVuY3Rpb25fdClmdW5jLCBuYW1lLCAodWludDE2X3Qpc3RhY2ssIGFyZ3VtZW50LCBwcmlvLCAmaFRhc2spICE9IHBkUEFTUykgewogICAgICAgICAgaFRhc2sgPSBOVUxMOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuICgob3NUaHJlYWRJZF90KWhUYXNrKTsKfQoKY29uc3QgY2hhciAqb3NUaHJlYWRHZXROYW1lIChvc1RocmVhZElkX3QgdGhyZWFkX2lkKSB7CiAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CiAgY29uc3QgY2hhciAqbmFtZTsKCiAgaWYgKElTX0lSUSgpIHx8IChoVGFzayA9PSBOVUxMKSkgewogICAgbmFtZSA9IE5VTEw7CiAgfSBlbHNlIHsKICAgIG5hbWUgPSBwY1Rhc2tHZXROYW1lIChoVGFzayk7CiAgfQoKICByZXR1cm4gKG5hbWUpOwp9Cgpvc1RocmVhZElkX3Qgb3NUaHJlYWRHZXRJZCAodm9pZCkgewogIG9zVGhyZWFkSWRfdCBpZDsKCiAgaWQgPSAob3NUaHJlYWRJZF90KXhUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoKTsKCiAgcmV0dXJuIChpZCk7Cn0KCm9zVGhyZWFkU3RhdGVfdCBvc1RocmVhZEdldFN0YXRlIChvc1RocmVhZElkX3QgdGhyZWFkX2lkKSB7CiAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CiAgb3NUaHJlYWRTdGF0ZV90IHN0YXRlOwoKICBpZiAoSVNfSVJRKCkgfHwgKGhUYXNrID09IE5VTEwpKSB7CiAgICBzdGF0ZSA9IG9zVGhyZWFkRXJyb3I7CiAgfQogIGVsc2UgewogICAgc3dpdGNoIChlVGFza0dldFN0YXRlIChoVGFzaykpIHsKICAgICAgY2FzZSBlUnVubmluZzogICBzdGF0ZSA9IG9zVGhyZWFkUnVubmluZzsgICAgYnJlYWs7CiAgICAgIGNhc2UgZVJlYWR5OiAgICAgc3RhdGUgPSBvc1RocmVhZFJlYWR5OyAgICAgIGJyZWFrOwogICAgICBjYXNlIGVCbG9ja2VkOgogICAgICBjYXNlIGVTdXNwZW5kZWQ6IHN0YXRlID0gb3NUaHJlYWRCbG9ja2VkOyAgICBicmVhazsKICAgICAgY2FzZSBlRGVsZXRlZDogICBzdGF0ZSA9IG9zVGhyZWFkVGVybWluYXRlZDsgYnJlYWs7CiAgICAgIGNhc2UgZUludmFsaWQ6CiAgICAgIGRlZmF1bHQ6ICAgICAgICAgc3RhdGUgPSBvc1RocmVhZEVycm9yOyAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgcmV0dXJuIChzdGF0ZSk7Cn0KCnVpbnQzMl90IG9zVGhyZWFkR2V0U3RhY2tTcGFjZSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCkgewogIFRhc2tIYW5kbGVfdCBoVGFzayA9IChUYXNrSGFuZGxlX3QpdGhyZWFkX2lkOwogIHVpbnQzMl90IHN6OwoKICBpZiAoSVNfSVJRKCkgfHwgKGhUYXNrID09IE5VTEwpKSB7CiAgICBzeiA9IDBVOwogIH0gZWxzZSB7CiAgICBzeiA9ICh1aW50MzJfdCl1eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgKGhUYXNrKTsKICB9CgogIHJldHVybiAoc3opOwp9Cgpvc1N0YXR1c190IG9zVGhyZWFkU2V0UHJpb3JpdHkgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQsIG9zUHJpb3JpdHlfdCBwcmlvcml0eSkgewogIFRhc2tIYW5kbGVfdCBoVGFzayA9IChUYXNrSGFuZGxlX3QpdGhyZWFkX2lkOwogIG9zU3RhdHVzX3Qgc3RhdDsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoKGhUYXNrID09IE5VTEwpIHx8IChwcmlvcml0eSA8IG9zUHJpb3JpdHlJZGxlKSB8fCAocHJpb3JpdHkgPiBvc1ByaW9yaXR5SVNSKSkgewogICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIGVsc2UgewogICAgc3RhdCA9IG9zT0s7CiAgICB2VGFza1ByaW9yaXR5U2V0IChoVGFzaywgKFVCYXNlVHlwZV90KXByaW9yaXR5KTsKICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCm9zUHJpb3JpdHlfdCBvc1RocmVhZEdldFByaW9yaXR5IChvc1RocmVhZElkX3QgdGhyZWFkX2lkKSB7CiAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CiAgb3NQcmlvcml0eV90IHByaW87CgogIGlmIChJU19JUlEoKSB8fCAoaFRhc2sgPT0gTlVMTCkpIHsKICAgIHByaW8gPSBvc1ByaW9yaXR5RXJyb3I7CiAgfSBlbHNlIHsKICAgIHByaW8gPSAob3NQcmlvcml0eV90KXV4VGFza1ByaW9yaXR5R2V0IChoVGFzayk7CiAgfQoKICByZXR1cm4gKHByaW8pOwp9Cgpvc1N0YXR1c190IG9zVGhyZWFkWWllbGQgKHZvaWQpIHsKICBvc1N0YXR1c190IHN0YXQ7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfSBlbHNlIHsKICAgIHN0YXQgPSBvc09LOwogICAgdGFza1lJRUxEKCk7CiAgfQoKICByZXR1cm4gKHN0YXQpOwp9Cgpvc1N0YXR1c190IG9zVGhyZWFkU3VzcGVuZCAob3NUaHJlYWRJZF90IHRocmVhZF9pZCkgewogIFRhc2tIYW5kbGVfdCBoVGFzayA9IChUYXNrSGFuZGxlX3QpdGhyZWFkX2lkOwogIG9zU3RhdHVzX3Qgc3RhdDsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoaFRhc2sgPT0gTlVMTCkgewogICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIGVsc2UgewogICAgc3RhdCA9IG9zT0s7CiAgICB2VGFza1N1c3BlbmQgKGhUYXNrKTsKICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCm9zU3RhdHVzX3Qgb3NUaHJlYWRSZXN1bWUgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpIHsKICBUYXNrSGFuZGxlX3QgaFRhc2sgPSAoVGFza0hhbmRsZV90KXRocmVhZF9pZDsKICBvc1N0YXR1c190IHN0YXQ7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgaWYgKGhUYXNrID09IE5VTEwpIHsKICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIHsKICAgIHN0YXQgPSBvc09LOwogICAgdlRhc2tSZXN1bWUgKGhUYXNrKTsKICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCl9fTk9fUkVUVVJOIHZvaWQgb3NUaHJlYWRFeGl0ICh2b2lkKSB7CiNpZm5kZWYgVVNFX0ZyZWVSVE9TX0hFQVBfMQogIHZUYXNrRGVsZXRlIChOVUxMKTsKI2VuZGlmCiAgZm9yICg7Oyk7Cn0KCm9zU3RhdHVzX3Qgb3NUaHJlYWRUZXJtaW5hdGUgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpIHsKICBUYXNrSGFuZGxlX3QgaFRhc2sgPSAoVGFza0hhbmRsZV90KXRocmVhZF9pZDsKICBvc1N0YXR1c190IHN0YXQ7CiNpZm5kZWYgVVNFX0ZyZWVSVE9TX0hFQVBfMQogIGVUYXNrU3RhdGUgdHN0YXRlOwoKICBpZiAoSVNfSVJRKCkpIHsKICAgIHN0YXQgPSBvc0Vycm9ySVNSOwogIH0KICBlbHNlIGlmIChoVGFzayA9PSBOVUxMKSB7CiAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICB0c3RhdGUgPSBlVGFza0dldFN0YXRlIChoVGFzayk7CgogICAgaWYgKHRzdGF0ZSAhPSBlRGVsZXRlZCkgewogICAgICBzdGF0ID0gb3NPSzsKICAgICAgdlRhc2tEZWxldGUgKGhUYXNrKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CiAgICB9CiAgfQojZWxzZQogIHN0YXQgPSBvc0Vycm9yOwojZW5kaWYKCiAgcmV0dXJuIChzdGF0KTsKfQoKdWludDMyX3Qgb3NUaHJlYWRHZXRDb3VudCAodm9pZCkgewogIHVpbnQzMl90IGNvdW50OwoKICBpZiAoSVNfSVJRKCkpIHsKICAgIGNvdW50ID0gMFU7CiAgfSBlbHNlIHsKICAgIGNvdW50ID0gdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcygpOwogIH0KCiAgcmV0dXJuIChjb3VudCk7Cn0KCnVpbnQzMl90IG9zVGhyZWFkRW51bWVyYXRlIChvc1RocmVhZElkX3QgKnRocmVhZF9hcnJheSwgdWludDMyX3QgYXJyYXlfaXRlbXMpIHsKICB1aW50MzJfdCBpLCBjb3VudDsKICBUYXNrU3RhdHVzX3QgKnRhc2s7CgogIGlmIChJU19JUlEoKSB8fCAodGhyZWFkX2FycmF5ID09IE5VTEwpIHx8IChhcnJheV9pdGVtcyA9PSAwVSkpIHsKICAgIGNvdW50ID0gMFU7CiAgfSBlbHNlIHsKICAgIHZUYXNrU3VzcGVuZEFsbCgpOwoKICAgIGNvdW50ID0gdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcygpOwogICAgdGFzayAgPSBwdlBvcnRNYWxsb2MgKGNvdW50ICogc2l6ZW9mKFRhc2tTdGF0dXNfdCkpOwoKICAgIGlmICh0YXNrICE9IE5VTEwpIHsKICAgICAgY291bnQgPSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSAodGFzaywgY291bnQsIE5VTEwpOwoKICAgICAgZm9yIChpID0gMFU7IChpIDwgY291bnQpICYmIChpIDwgYXJyYXlfaXRlbXMpOyBpKyspIHsKICAgICAgICB0aHJlYWRfYXJyYXlbaV0gPSAob3NUaHJlYWRJZF90KXRhc2tbaV0ueEhhbmRsZTsKICAgICAgfQogICAgICBjb3VudCA9IGk7CiAgICB9CiAgICAodm9pZCl4VGFza1Jlc3VtZUFsbCgpOwoKICAgIHZQb3J0RnJlZSAodGFzayk7CiAgfQoKICByZXR1cm4gKGNvdW50KTsKfQoKdWludDMyX3Qgb3NUaHJlYWRGbGFnc1NldCAob3NUaHJlYWRJZF90IHRocmVhZF9pZCwgdWludDMyX3QgZmxhZ3MpIHsKICBUYXNrSGFuZGxlX3QgaFRhc2sgPSAoVGFza0hhbmRsZV90KXRocmVhZF9pZDsKICB1aW50MzJfdCByZmxhZ3M7CiAgQmFzZVR5cGVfdCB5aWVsZDsKCiAgaWYgKChoVGFzayA9PSBOVUxMKSB8fCAoKGZsYWdzICYgVEhSRUFEX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpKSB7CiAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcjsKCiAgICBpZiAoSVNfSVJRKCkpIHsKICAgICAgeWllbGQgPSBwZEZBTFNFOwoKICAgICAgKHZvaWQpeFRhc2tOb3RpZnlGcm9tSVNSIChoVGFzaywgZmxhZ3MsIGVTZXRCaXRzLCAmeWllbGQpOwogICAgICAodm9pZCl4VGFza05vdGlmeUFuZFF1ZXJ5RnJvbUlTUiAoaFRhc2ssIDAsIGVOb0FjdGlvbiwgJnJmbGFncywgTlVMTCk7CgogICAgICBwb3J0WUlFTERfRlJPTV9JU1IgKHlpZWxkKTsKICAgIH0KICAgIGVsc2UgewogICAgICAodm9pZCl4VGFza05vdGlmeSAoaFRhc2ssIGZsYWdzLCBlU2V0Qml0cyk7CiAgICAgICh2b2lkKXhUYXNrTm90aWZ5QW5kUXVlcnkgKGhUYXNrLCAwLCBlTm9BY3Rpb24sICZyZmxhZ3MpOwogICAgfQogIH0KICAvKiBSZXR1cm4gZmxhZ3MgYWZ0ZXIgc2V0dGluZyAqLwogIHJldHVybiAocmZsYWdzKTsKfQoKdWludDMyX3Qgb3NUaHJlYWRGbGFnc0NsZWFyICh1aW50MzJfdCBmbGFncykgewogIFRhc2tIYW5kbGVfdCBoVGFzazsKICB1aW50MzJfdCByZmxhZ3MsIGNmbGFnczsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoKGZsYWdzICYgVEhSRUFEX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpIHsKICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIHsKICAgIGhUYXNrID0geFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpOwoKICAgIGlmICh4VGFza05vdGlmeUFuZFF1ZXJ5IChoVGFzaywgMCwgZU5vQWN0aW9uLCAmY2ZsYWdzKSA9PSBwZFBBU1MpIHsKICAgICAgcmZsYWdzID0gY2ZsYWdzOwogICAgICBjZmxhZ3MgJj0gfmZsYWdzOwoKICAgICAgaWYgKHhUYXNrTm90aWZ5IChoVGFzaywgY2ZsYWdzLCBlU2V0VmFsdWVXaXRoT3ZlcndyaXRlKSAhPSBwZFBBU1MpIHsKICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcjsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yOwogICAgfQogIH0KCiAgLyogUmV0dXJuIGZsYWdzIGJlZm9yZSBjbGVhcmluZyAqLwogIHJldHVybiAocmZsYWdzKTsKfQoKdWludDMyX3Qgb3NUaHJlYWRGbGFnc0dldCAodm9pZCkgewogIFRhc2tIYW5kbGVfdCBoVGFzazsKICB1aW50MzJfdCByZmxhZ3M7CgogIGlmIChJU19JUlEoKSkgewogICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JJU1I7CiAgfQogIGVsc2UgewogICAgaFRhc2sgPSB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCk7CgogICAgaWYgKHhUYXNrTm90aWZ5QW5kUXVlcnkgKGhUYXNrLCAwLCBlTm9BY3Rpb24sICZyZmxhZ3MpICE9IHBkUEFTUykgewogICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcjsKICAgIH0KICB9CgogIHJldHVybiAocmZsYWdzKTsKfQoKdWludDMyX3Qgb3NUaHJlYWRGbGFnc1dhaXQgKHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBvcHRpb25zLCB1aW50MzJfdCB0aW1lb3V0KSB7CiAgdWludDMyX3QgcmZsYWdzLCBudmFsOwogIHVpbnQzMl90IGNsZWFyOwogIFRpY2tUeXBlX3QgdDAsIHRkLCB0b3V0OwogIEJhc2VUeXBlX3QgcnZhbDsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoKGZsYWdzICYgVEhSRUFEX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpIHsKICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIHsKICAgIGlmICgob3B0aW9ucyAmIG9zRmxhZ3NOb0NsZWFyKSA9PSBvc0ZsYWdzTm9DbGVhcikgewogICAgICBjbGVhciA9IDBVOwogICAgfSBlbHNlIHsKICAgICAgY2xlYXIgPSBmbGFnczsKICAgIH0KCiAgICByZmxhZ3MgPSAwVTsKICAgIHRvdXQgICA9IHRpbWVvdXQ7CgogICAgdDAgPSB4VGFza0dldFRpY2tDb3VudCgpOwogICAgZG8gewogICAgICBydmFsID0geFRhc2tOb3RpZnlXYWl0ICgwLCBjbGVhciwgJm52YWwsIHRvdXQpOwoKICAgICAgaWYgKHJ2YWwgPT0gcGRQQVNTKSB7CiAgICAgICAgcmZsYWdzICY9IGZsYWdzOwogICAgICAgIHJmbGFncyB8PSBudmFsOwoKICAgICAgICBpZiAoKG9wdGlvbnMgJiBvc0ZsYWdzV2FpdEFsbCkgPT0gb3NGbGFnc1dhaXRBbGwpIHsKICAgICAgICAgIGlmICgoZmxhZ3MgJiByZmxhZ3MpID09IGZsYWdzKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMFUpIHsKICAgICAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKChmbGFncyAmIHJmbGFncykgIT0gMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDBVKSB7CiAgICAgICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogVXBkYXRlIHRpbWVvdXQgKi8KICAgICAgICB0ZCA9IHhUYXNrR2V0VGlja0NvdW50KCkgLSB0MDsKCiAgICAgICAgaWYgKHRkID4gdG91dCkgewogICAgICAgICAgdG91dCAgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b3V0IC09IHRkOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7CiAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclRpbWVvdXQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB3aGlsZSAocnZhbCAhPSBwZEZBSUwpOwogIH0KCiAgLyogUmV0dXJuIGZsYWdzIGJlZm9yZSBjbGVhcmluZyAqLwogIHJldHVybiAocmZsYWdzKTsKfQoKb3NTdGF0dXNfdCBvc0RlbGF5ICh1aW50MzJfdCB0aWNrcykgewogIG9zU3RhdHVzX3Qgc3RhdDsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSB7CiAgICBzdGF0ID0gb3NPSzsKCiAgICBpZiAodGlja3MgIT0gMFUpIHsKICAgICAgdlRhc2tEZWxheSh0aWNrcyk7CiAgICB9CiAgfQoKICByZXR1cm4gKHN0YXQpOwp9Cgpvc1N0YXR1c190IG9zRGVsYXlVbnRpbCAodWludDMyX3QgdGlja3MpIHsKICBUaWNrVHlwZV90IHRjbnQsIGRlbGF5OwogIG9zU3RhdHVzX3Qgc3RhdDsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSB7CiAgICBzdGF0ID0gb3NPSzsKICAgIHRjbnQgPSB4VGFza0dldFRpY2tDb3VudCgpOwoKICAgIC8qIERldGVybWluZSByZW1haW5pbmcgbnVtYmVyIG9mIHRpY2tzIHRvIGRlbGF5ICovCiAgICBkZWxheSA9IChUaWNrVHlwZV90KXRpY2tzIC0gdGNudDsKCiAgICAvKiBDaGVjayBpZiB0YXJnZXQgdGljayBoYXMgbm90IGV4cGlyZWQgKi8KICAgIGlmKChkZWxheSAhPSAwVSkgJiYgKDAgPT0gKGRlbGF5ID4+ICg4ICogc2l6ZW9mKFRpY2tUeXBlX3QpIC0gMSkpKSkgewogICAgICB2VGFza0RlbGF5VW50aWwgKCZ0Y250LCBkZWxheSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIE5vIGRlbGF5IG9yIGFscmVhZHkgZXhwaXJlZCAqLwogICAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnN0YXRpYyB2b2lkIFRpbWVyQ2FsbGJhY2sgKFRpbWVySGFuZGxlX3QgaFRpbWVyKSB7CiAgVGltZXJDYWxsYmFja190ICpjYWxsYjsKCiAgY2FsbGIgPSAoVGltZXJDYWxsYmFja190ICopcHZUaW1lckdldFRpbWVySUQgKGhUaW1lcik7CgogIGlmIChjYWxsYiAhPSBOVUxMKSB7CiAgICBjYWxsYi0+ZnVuYyAoY2FsbGItPmFyZyk7CiAgfQp9Cgpvc1RpbWVySWRfdCBvc1RpbWVyTmV3IChvc1RpbWVyRnVuY190IGZ1bmMsIG9zVGltZXJUeXBlX3QgdHlwZSwgdm9pZCAqYXJndW1lbnQsIGNvbnN0IG9zVGltZXJBdHRyX3QgKmF0dHIpIHsKICBjb25zdCBjaGFyICpuYW1lOwogIFRpbWVySGFuZGxlX3QgaFRpbWVyOwogIFRpbWVyQ2FsbGJhY2tfdCAqY2FsbGI7CiAgVUJhc2VUeXBlX3QgcmVsb2FkOwogIGludDMyX3QgbWVtOwoKICBoVGltZXIgPSBOVUxMOwoKICBpZiAoIUlTX0lSUSgpICYmIChmdW5jICE9IE5VTEwpKSB7CiAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGFyZ3VtZW50ICovCiAgICBjYWxsYiA9IHB2UG9ydE1hbGxvYyAoc2l6ZW9mKFRpbWVyQ2FsbGJhY2tfdCkpOwoKICAgIGlmIChjYWxsYiAhPSBOVUxMKSB7CiAgICAgIGNhbGxiLT5mdW5jID0gZnVuYzsKICAgICAgY2FsbGItPmFyZyAgPSBhcmd1bWVudDsKCiAgICAgIGlmICh0eXBlID09IG9zVGltZXJPbmNlKSB7CiAgICAgICAgcmVsb2FkID0gcGRGQUxTRTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWxvYWQgPSBwZFRSVUU7CiAgICAgIH0KCiAgICAgIG1lbSAgPSAtMTsKICAgICAgbmFtZSA9IE5VTEw7CgogICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKGF0dHItPm5hbWUgIT0gTlVMTCkgewogICAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGF0dHItPmNiX21lbSAhPSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA+PSBzaXplb2YoU3RhdGljVGltZXJfdCkpKSB7CiAgICAgICAgICBtZW0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtID09IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID09IDBVKSkgewogICAgICAgICAgICBtZW0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBtZW0gPSAwOwogICAgICB9CgogICAgICBpZiAobWVtID09IDEpIHsKICAgICAgICBoVGltZXIgPSB4VGltZXJDcmVhdGVTdGF0aWMgKG5hbWUsIDEsIHJlbG9hZCwgY2FsbGIsIFRpbWVyQ2FsbGJhY2ssIChTdGF0aWNUaW1lcl90ICopYXR0ci0+Y2JfbWVtKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAobWVtID09IDApIHsKICAgICAgICAgIGhUaW1lciA9IHhUaW1lckNyZWF0ZSAobmFtZSwgMSwgcmVsb2FkLCBjYWxsYiwgVGltZXJDYWxsYmFjayk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gKChvc1RpbWVySWRfdCloVGltZXIpOwp9Cgpjb25zdCBjaGFyICpvc1RpbWVyR2V0TmFtZSAob3NUaW1lcklkX3QgdGltZXJfaWQpIHsKICBUaW1lckhhbmRsZV90IGhUaW1lciA9IChUaW1lckhhbmRsZV90KXRpbWVyX2lkOwogIGNvbnN0IGNoYXIgKnA7CgogIGlmIChJU19JUlEoKSB8fCAoaFRpbWVyID09IE5VTEwpKSB7CiAgICBwID0gTlVMTDsKICB9IGVsc2UgewogICAgcCA9IHBjVGltZXJHZXROYW1lIChoVGltZXIpOwogIH0KCiAgcmV0dXJuIChwKTsKfQoKb3NTdGF0dXNfdCBvc1RpbWVyU3RhcnQgKG9zVGltZXJJZF90IHRpbWVyX2lkLCB1aW50MzJfdCB0aWNrcykgewogIFRpbWVySGFuZGxlX3QgaFRpbWVyID0gKFRpbWVySGFuZGxlX3QpdGltZXJfaWQ7CiAgb3NTdGF0dXNfdCBzdGF0OwoKICBpZiAoSVNfSVJRKCkpIHsKICAgIHN0YXQgPSBvc0Vycm9ySVNSOwogIH0KICBlbHNlIGlmIChoVGltZXIgPT0gTlVMTCkgewogICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIGVsc2UgewogICAgaWYgKHhUaW1lckNoYW5nZVBlcmlvZCAoaFRpbWVyLCB0aWNrcywgMCkgPT0gcGRQQVNTKSB7CiAgICAgIHN0YXQgPSBvc09LOwogICAgfSBlbHNlIHsKICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCm9zU3RhdHVzX3Qgb3NUaW1lclN0b3AgKG9zVGltZXJJZF90IHRpbWVyX2lkKSB7CiAgVGltZXJIYW5kbGVfdCBoVGltZXIgPSAoVGltZXJIYW5kbGVfdCl0aW1lcl9pZDsKICBvc1N0YXR1c190IHN0YXQ7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgaWYgKGhUaW1lciA9PSBOVUxMKSB7CiAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICBpZiAoeFRpbWVySXNUaW1lckFjdGl2ZSAoaFRpbWVyKSA9PSBwZEZBTFNFKSB7CiAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKHhUaW1lclN0b3AgKGhUaW1lciwgMCkgPT0gcGRQQVNTKSB7CiAgICAgICAgc3RhdCA9IG9zT0s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhdCA9IG9zRXJyb3I7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCnVpbnQzMl90IG9zVGltZXJJc1J1bm5pbmcgKG9zVGltZXJJZF90IHRpbWVyX2lkKSB7CiAgVGltZXJIYW5kbGVfdCBoVGltZXIgPSAoVGltZXJIYW5kbGVfdCl0aW1lcl9pZDsKICB1aW50MzJfdCBydW5uaW5nOwoKICBpZiAoSVNfSVJRKCkgfHwgKGhUaW1lciA9PSBOVUxMKSkgewogICAgcnVubmluZyA9IDBVOwogIH0gZWxzZSB7CiAgICBydW5uaW5nID0gKHVpbnQzMl90KXhUaW1lcklzVGltZXJBY3RpdmUgKGhUaW1lcik7CiAgfQoKICByZXR1cm4gKHJ1bm5pbmcpOwp9Cgpvc1N0YXR1c190IG9zVGltZXJEZWxldGUgKG9zVGltZXJJZF90IHRpbWVyX2lkKSB7CiAgVGltZXJIYW5kbGVfdCBoVGltZXIgPSAoVGltZXJIYW5kbGVfdCl0aW1lcl9pZDsKICBvc1N0YXR1c190IHN0YXQ7CiNpZm5kZWYgVVNFX0ZyZWVSVE9TX0hFQVBfMQogIFRpbWVyQ2FsbGJhY2tfdCAqY2FsbGI7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgaWYgKGhUaW1lciA9PSBOVUxMKSB7CiAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICBjYWxsYiA9IChUaW1lckNhbGxiYWNrX3QgKilwdlRpbWVyR2V0VGltZXJJRCAoaFRpbWVyKTsKCiAgICBpZiAoeFRpbWVyRGVsZXRlIChoVGltZXIsIDApID09IHBkUEFTUykgewogICAgICB2UG9ydEZyZWUgKGNhbGxiKTsKICAgICAgc3RhdCA9IG9zT0s7CiAgICB9IGVsc2UgewogICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOwogICAgfQogIH0KI2Vsc2UKICBzdGF0ID0gb3NFcnJvcjsKI2VuZGlmCgogIHJldHVybiAoc3RhdCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCm9zRXZlbnRGbGFnc0lkX3Qgb3NFdmVudEZsYWdzTmV3IChjb25zdCBvc0V2ZW50RmxhZ3NBdHRyX3QgKmF0dHIpIHsKICBFdmVudEdyb3VwSGFuZGxlX3QgaEV2ZW50R3JvdXA7CiAgaW50MzJfdCBtZW07CgogIGhFdmVudEdyb3VwID0gTlVMTDsKCiAgaWYgKCFJU19JUlEoKSkgewogICAgbWVtID0gLTE7CgogICAgaWYgKGF0dHIgIT0gTlVMTCkgewogICAgICBpZiAoKGF0dHItPmNiX21lbSAhPSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA+PSBzaXplb2YoU3RhdGljRXZlbnRHcm91cF90KSkpIHsKICAgICAgICBtZW0gPSAxOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtID09IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID09IDBVKSkgewogICAgICAgICAgbWVtID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICBtZW0gPSAwOwogICAgfQoKICAgIGlmIChtZW0gPT0gMSkgewogICAgICBoRXZlbnRHcm91cCA9IHhFdmVudEdyb3VwQ3JlYXRlU3RhdGljIChhdHRyLT5jYl9tZW0pOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmIChtZW0gPT0gMCkgewogICAgICAgIGhFdmVudEdyb3VwID0geEV2ZW50R3JvdXBDcmVhdGUoKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuICgob3NFdmVudEZsYWdzSWRfdCloRXZlbnRHcm91cCk7Cn0KCnVpbnQzMl90IG9zRXZlbnRGbGFnc1NldCAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCwgdWludDMyX3QgZmxhZ3MpIHsKICBFdmVudEdyb3VwSGFuZGxlX3QgaEV2ZW50R3JvdXAgPSAoRXZlbnRHcm91cEhhbmRsZV90KWVmX2lkOwogIHVpbnQzMl90IHJmbGFnczsKICBCYXNlVHlwZV90IHlpZWxkOwoKICBpZiAoKGhFdmVudEdyb3VwID09IE5VTEwpIHx8ICgoZmxhZ3MgJiBFVkVOVF9GTEFHU19JTlZBTElEX0JJVFMpICE9IDBVKSkgewogICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIGVsc2UgaWYgKElTX0lSUSgpKSB7CiAgICB5aWVsZCA9IHBkRkFMU0U7CgogICAgaWYgKHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IgKGhFdmVudEdyb3VwLCAoRXZlbnRCaXRzX3QpZmxhZ3MsICZ5aWVsZCkgPT0gcGRGQUlMKSB7CiAgICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yUmVzb3VyY2U7CiAgICB9IGVsc2UgewogICAgICByZmxhZ3MgPSBmbGFnczsKICAgICAgcG9ydFlJRUxEX0ZST01fSVNSICh5aWVsZCk7CiAgICB9CiAgfQogIGVsc2UgewogICAgcmZsYWdzID0geEV2ZW50R3JvdXBTZXRCaXRzIChoRXZlbnRHcm91cCwgKEV2ZW50Qml0c190KWZsYWdzKTsKICB9CgogIHJldHVybiAocmZsYWdzKTsKfQoKdWludDMyX3Qgb3NFdmVudEZsYWdzQ2xlYXIgKG9zRXZlbnRGbGFnc0lkX3QgZWZfaWQsIHVpbnQzMl90IGZsYWdzKSB7CiAgRXZlbnRHcm91cEhhbmRsZV90IGhFdmVudEdyb3VwID0gKEV2ZW50R3JvdXBIYW5kbGVfdCllZl9pZDsKICB1aW50MzJfdCByZmxhZ3M7CgogIGlmICgoaEV2ZW50R3JvdXAgPT0gTlVMTCkgfHwgKChmbGFncyAmIEVWRU5UX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpKSB7CiAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSBpZiAoSVNfSVJRKCkpIHsKICAgIHJmbGFncyA9IHhFdmVudEdyb3VwR2V0Qml0c0Zyb21JU1IgKGhFdmVudEdyb3VwKTsKCiAgICBpZiAoeEV2ZW50R3JvdXBDbGVhckJpdHNGcm9tSVNSIChoRXZlbnRHcm91cCwgKEV2ZW50Qml0c190KWZsYWdzKSA9PSBwZEZBSUwpIHsKICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKICAgIH0KICB9CiAgZWxzZSB7CiAgICByZmxhZ3MgPSB4RXZlbnRHcm91cENsZWFyQml0cyAoaEV2ZW50R3JvdXAsIChFdmVudEJpdHNfdClmbGFncyk7CiAgfQoKICByZXR1cm4gKHJmbGFncyk7Cn0KCnVpbnQzMl90IG9zRXZlbnRGbGFnc0dldCAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCkgewogIEV2ZW50R3JvdXBIYW5kbGVfdCBoRXZlbnRHcm91cCA9IChFdmVudEdyb3VwSGFuZGxlX3QpZWZfaWQ7CiAgdWludDMyX3QgcmZsYWdzOwoKICBpZiAoZWZfaWQgPT0gTlVMTCkgewogICAgcmZsYWdzID0gMFU7CiAgfQogIGVsc2UgaWYgKElTX0lSUSgpKSB7CiAgICByZmxhZ3MgPSB4RXZlbnRHcm91cEdldEJpdHNGcm9tSVNSIChoRXZlbnRHcm91cCk7CiAgfQogIGVsc2UgewogICAgcmZsYWdzID0geEV2ZW50R3JvdXBHZXRCaXRzIChoRXZlbnRHcm91cCk7CiAgfQoKICByZXR1cm4gKHJmbGFncyk7Cn0KCnVpbnQzMl90IG9zRXZlbnRGbGFnc1dhaXQgKG9zRXZlbnRGbGFnc0lkX3QgZWZfaWQsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBvcHRpb25zLCB1aW50MzJfdCB0aW1lb3V0KSB7CiAgRXZlbnRHcm91cEhhbmRsZV90IGhFdmVudEdyb3VwID0gKEV2ZW50R3JvdXBIYW5kbGVfdCllZl9pZDsKICBCYXNlVHlwZV90IHdhaXRfYWxsOwogIEJhc2VUeXBlX3QgZXhpdF9jbHI7CiAgdWludDMyX3QgcmZsYWdzOwoKICBpZiAoKGhFdmVudEdyb3VwID09IE5VTEwpIHx8ICgoZmxhZ3MgJiBFVkVOVF9GTEFHU19JTlZBTElEX0JJVFMpICE9IDBVKSkgewogICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIGVsc2UgaWYgKElTX0lSUSgpKSB7CiAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcklTUjsKICB9CiAgZWxzZSB7CiAgICBpZiAob3B0aW9ucyAmIG9zRmxhZ3NXYWl0QWxsKSB7CiAgICAgIHdhaXRfYWxsID0gcGRUUlVFOwogICAgfSBlbHNlIHsKICAgICAgd2FpdF9hbGwgPSBwZEZBSUw7CiAgICB9CgogICAgaWYgKG9wdGlvbnMgJiBvc0ZsYWdzTm9DbGVhcikgewogICAgICBleGl0X2NsciA9IHBkRkFJTDsKICAgIH0gZWxzZSB7CiAgICAgIGV4aXRfY2xyID0gcGRUUlVFOwogICAgfQoKICAgIHJmbGFncyA9IHhFdmVudEdyb3VwV2FpdEJpdHMgKGhFdmVudEdyb3VwLCAoRXZlbnRCaXRzX3QpZmxhZ3MsIGV4aXRfY2xyLCB3YWl0X2FsbCwgKFRpY2tUeXBlX3QpdGltZW91dCk7CgogICAgaWYgKG9wdGlvbnMgJiBvc0ZsYWdzV2FpdEFsbCkgewogICAgICBpZiAoZmxhZ3MgIT0gcmZsYWdzKSB7CiAgICAgICAgaWYgKHRpbWVvdXQgPiAwVSkgewogICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JUaW1lb3V0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGlmICgoZmxhZ3MgJiByZmxhZ3MpID09IDBVKSB7CiAgICAgICAgaWYgKHRpbWVvdXQgPiAwVSkgewogICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JUaW1lb3V0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIChyZmxhZ3MpOwp9Cgpvc1N0YXR1c190IG9zRXZlbnRGbGFnc0RlbGV0ZSAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCkgewogIEV2ZW50R3JvdXBIYW5kbGVfdCBoRXZlbnRHcm91cCA9IChFdmVudEdyb3VwSGFuZGxlX3QpZWZfaWQ7CiAgb3NTdGF0dXNfdCBzdGF0OwoKI2lmbmRlZiBVU0VfRnJlZVJUT1NfSEVBUF8xCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoaEV2ZW50R3JvdXAgPT0gTlVMTCkgewogICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIGVsc2UgewogICAgc3RhdCA9IG9zT0s7CiAgICB2RXZlbnRHcm91cERlbGV0ZSAoaEV2ZW50R3JvdXApOwogIH0KI2Vsc2UKICBzdGF0ID0gb3NFcnJvcjsKI2VuZGlmCgogIHJldHVybiAoc3RhdCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCm9zTXV0ZXhJZF90IG9zTXV0ZXhOZXcgKGNvbnN0IG9zTXV0ZXhBdHRyX3QgKmF0dHIpIHsKICBTZW1hcGhvcmVIYW5kbGVfdCBoTXV0ZXg7CiAgdWludDMyX3QgdHlwZTsKICB1aW50MzJfdCBybXR4OwogIGludDMyX3QgIG1lbTsKICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQogIGNvbnN0IGNoYXIgKm5hbWU7CiAgI2VuZGlmCgogIGhNdXRleCA9IE5VTEw7CgogIGlmICghSVNfSVJRKCkpIHsKICAgIGlmIChhdHRyICE9IE5VTEwpIHsKICAgICAgdHlwZSA9IGF0dHItPmF0dHJfYml0czsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGUgPSAwVTsKICAgIH0KCiAgICBpZiAoKHR5cGUgJiBvc011dGV4UmVjdXJzaXZlKSA9PSBvc011dGV4UmVjdXJzaXZlKSB7CiAgICAgIHJtdHggPSAxVTsKICAgIH0gZWxzZSB7CiAgICAgIHJtdHggPSAwVTsKICAgIH0KCiAgICBpZiAoKHR5cGUgJiBvc011dGV4Um9idXN0KSAhPSBvc011dGV4Um9idXN0KSB7CiAgICAgIG1lbSA9IC0xOwoKICAgICAgaWYgKGF0dHIgIT0gTlVMTCkgewogICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtICE9IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID49IHNpemVvZihTdGF0aWNTZW1hcGhvcmVfdCkpKSB7CiAgICAgICAgICBtZW0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtID09IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID09IDBVKSkgewogICAgICAgICAgICBtZW0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBtZW0gPSAwOwogICAgICB9CgogICAgICBpZiAobWVtID09IDEpIHsKICAgICAgICBpZiAocm10eCAhPSAwVSkgewogICAgICAgICAgaE11dGV4ID0geFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4U3RhdGljIChhdHRyLT5jYl9tZW0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGhNdXRleCA9IHhTZW1hcGhvcmVDcmVhdGVNdXRleFN0YXRpYyAoYXR0ci0+Y2JfbWVtKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKG1lbSA9PSAwKSB7CiAgICAgICAgICBpZiAocm10eCAhPSAwVSkgewogICAgICAgICAgICBoTXV0ZXggPSB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXggKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoTXV0ZXggPSB4U2VtYXBob3JlQ3JlYXRlTXV0ZXggKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQogICAgICBpZiAoaE11dGV4ICE9IE5VTEwpIHsKICAgICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgICAgICBuYW1lID0gYXR0ci0+bmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZSA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIHZRdWV1ZUFkZFRvUmVnaXN0cnkgKGhNdXRleCwgbmFtZSk7CiAgICAgIH0KICAgICAgI2VuZGlmCgogICAgICBpZiAoKGhNdXRleCAhPSBOVUxMKSAmJiAocm10eCAhPSAwVSkpIHsKICAgICAgICBoTXV0ZXggPSAoU2VtYXBob3JlSGFuZGxlX3QpKCh1aW50MzJfdCloTXV0ZXggfCAxVSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiAoKG9zTXV0ZXhJZF90KWhNdXRleCk7Cn0KCm9zU3RhdHVzX3Qgb3NNdXRleEFjcXVpcmUgKG9zTXV0ZXhJZF90IG11dGV4X2lkLCB1aW50MzJfdCB0aW1lb3V0KSB7CiAgU2VtYXBob3JlSGFuZGxlX3QgaE11dGV4OwogIG9zU3RhdHVzX3Qgc3RhdDsKICB1aW50MzJfdCBybXR4OwoKICBoTXV0ZXggPSAoU2VtYXBob3JlSGFuZGxlX3QpKCh1aW50MzJfdCltdXRleF9pZCAmIH4xVSk7CgogIHJtdHggPSAodWludDMyX3QpbXV0ZXhfaWQgJiAxVTsKCiAgc3RhdCA9IG9zT0s7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgaWYgKGhNdXRleCA9PSBOVUxMKSB7CiAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICBpZiAocm10eCAhPSAwVSkgewogICAgICBpZiAoeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUgKGhNdXRleCwgdGltZW91dCkgIT0gcGRQQVNTKSB7CiAgICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKICAgICAgICAgIHN0YXQgPSBvc0Vycm9yVGltZW91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICBpZiAoeFNlbWFwaG9yZVRha2UgKGhNdXRleCwgdGltZW91dCkgIT0gcGRQQVNTKSB7CiAgICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKICAgICAgICAgIHN0YXQgPSBvc0Vycm9yVGltZW91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCm9zU3RhdHVzX3Qgb3NNdXRleFJlbGVhc2UgKG9zTXV0ZXhJZF90IG11dGV4X2lkKSB7CiAgU2VtYXBob3JlSGFuZGxlX3QgaE11dGV4OwogIG9zU3RhdHVzX3Qgc3RhdDsKICB1aW50MzJfdCBybXR4OwoKICBoTXV0ZXggPSAoU2VtYXBob3JlSGFuZGxlX3QpKCh1aW50MzJfdCltdXRleF9pZCAmIH4xVSk7CgogIHJtdHggPSAodWludDMyX3QpbXV0ZXhfaWQgJiAxVTsKCiAgc3RhdCA9IG9zT0s7CgogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgaWYgKGhNdXRleCA9PSBOVUxMKSB7CiAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICBpZiAocm10eCAhPSAwVSkgewogICAgICBpZiAoeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUgKGhNdXRleCkgIT0gcGRQQVNTKSB7CiAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGlmICh4U2VtYXBob3JlR2l2ZSAoaE11dGV4KSAhPSBwZFBBU1MpIHsKICAgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gKHN0YXQpOwp9Cgpvc1RocmVhZElkX3Qgb3NNdXRleEdldE93bmVyIChvc011dGV4SWRfdCBtdXRleF9pZCkgewogIFNlbWFwaG9yZUhhbmRsZV90IGhNdXRleDsKICBvc1RocmVhZElkX3Qgb3duZXI7CgogIGhNdXRleCA9IChTZW1hcGhvcmVIYW5kbGVfdCkoKHVpbnQzMl90KW11dGV4X2lkICYgfjFVKTsKCiAgaWYgKElTX0lSUSgpIHx8IChoTXV0ZXggPT0gTlVMTCkpIHsKICAgIG93bmVyID0gTlVMTDsKICB9IGVsc2UgewogICAgb3duZXIgPSAob3NUaHJlYWRJZF90KXhTZW1hcGhvcmVHZXRNdXRleEhvbGRlciAoaE11dGV4KTsKICB9CgogIHJldHVybiAob3duZXIpOwp9Cgpvc1N0YXR1c190IG9zTXV0ZXhEZWxldGUgKG9zTXV0ZXhJZF90IG11dGV4X2lkKSB7CiAgb3NTdGF0dXNfdCBzdGF0OwojaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKICBTZW1hcGhvcmVIYW5kbGVfdCBoTXV0ZXg7CgogIGhNdXRleCA9IChTZW1hcGhvcmVIYW5kbGVfdCkoKHVpbnQzMl90KW11dGV4X2lkICYgfjFVKTsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoaE11dGV4ID09IE5VTEwpIHsKICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIHsKICAgICNpZiAoY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDApCiAgICB2UXVldWVVbnJlZ2lzdGVyUXVldWUgKGhNdXRleCk7CiAgICAjZW5kaWYKICAgIHN0YXQgPSBvc09LOwogICAgdlNlbWFwaG9yZURlbGV0ZSAoaE11dGV4KTsKICB9CiNlbHNlCiAgc3RhdCA9IG9zRXJyb3I7CiNlbmRpZgoKICByZXR1cm4gKHN0YXQpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpvc1NlbWFwaG9yZUlkX3Qgb3NTZW1hcGhvcmVOZXcgKHVpbnQzMl90IG1heF9jb3VudCwgdWludDMyX3QgaW5pdGlhbF9jb3VudCwgY29uc3Qgb3NTZW1hcGhvcmVBdHRyX3QgKmF0dHIpIHsKICBTZW1hcGhvcmVIYW5kbGVfdCBoU2VtYXBob3JlOwogIGludDMyX3QgbWVtOwogICNpZiAoY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDApCiAgY29uc3QgY2hhciAqbmFtZTsKICAjZW5kaWYKCiAgaFNlbWFwaG9yZSA9IE5VTEw7CgogIGlmICghSVNfSVJRKCkgJiYgKG1heF9jb3VudCA+IDBVKSAmJiAoaW5pdGlhbF9jb3VudCA8PSBtYXhfY291bnQpKSB7CiAgICBtZW0gPSAtMTsKCiAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgIGlmICgoYXR0ci0+Y2JfbWVtICE9IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID49IHNpemVvZihTdGF0aWNTZW1hcGhvcmVfdCkpKSB7CiAgICAgICAgbWVtID0gMTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAoKGF0dHItPmNiX21lbSA9PSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA9PSAwVSkpIHsKICAgICAgICAgIG1lbSA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgbWVtID0gMDsKICAgIH0KCiAgICBpZiAobWVtICE9IC0xKSB7CiAgICAgIGlmIChtYXhfY291bnQgPT0gMVUpIHsKICAgICAgICBpZiAobWVtID09IDEpIHsKICAgICAgICAgIGhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5U3RhdGljICgoU3RhdGljU2VtYXBob3JlX3QgKilhdHRyLT5jYl9tZW0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGhTZW1hcGhvcmUgIT0gTlVMTCkgJiYgKGluaXRpYWxfY291bnQgIT0gMFUpKSB7CiAgICAgICAgICBpZiAoeFNlbWFwaG9yZUdpdmUgKGhTZW1hcGhvcmUpICE9IHBkUEFTUykgewogICAgICAgICAgICB2U2VtYXBob3JlRGVsZXRlIChoU2VtYXBob3JlKTsKICAgICAgICAgICAgaFNlbWFwaG9yZSA9IE5VTEw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChtZW0gPT0gMSkgewogICAgICAgICAgaFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZ1N0YXRpYyAobWF4X2NvdW50LCBpbml0aWFsX2NvdW50LCAoU3RhdGljU2VtYXBob3JlX3QgKilhdHRyLT5jYl9tZW0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcgKG1heF9jb3VudCwgaW5pdGlhbF9jb3VudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQogICAgICBpZiAoaFNlbWFwaG9yZSAhPSBOVUxMKSB7CiAgICAgICAgaWYgKGF0dHIgIT0gTlVMTCkgewogICAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5hbWUgPSBOVUxMOwogICAgICAgIH0KICAgICAgICB2UXVldWVBZGRUb1JlZ2lzdHJ5IChoU2VtYXBob3JlLCBuYW1lKTsKICAgICAgfQogICAgICAjZW5kaWYKICAgIH0KICB9CgogIHJldHVybiAoKG9zU2VtYXBob3JlSWRfdCloU2VtYXBob3JlKTsKfQoKb3NTdGF0dXNfdCBvc1NlbWFwaG9yZUFjcXVpcmUgKG9zU2VtYXBob3JlSWRfdCBzZW1hcGhvcmVfaWQsIHVpbnQzMl90IHRpbWVvdXQpIHsKICBTZW1hcGhvcmVIYW5kbGVfdCBoU2VtYXBob3JlID0gKFNlbWFwaG9yZUhhbmRsZV90KXNlbWFwaG9yZV9pZDsKICBvc1N0YXR1c190IHN0YXQ7CiAgQmFzZVR5cGVfdCB5aWVsZDsKCiAgc3RhdCA9IG9zT0s7CgogIGlmIChoU2VtYXBob3JlID09IE5VTEwpIHsKICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIGlmIChJU19JUlEoKSkgewogICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKICAgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeWllbGQgPSBwZEZBTFNFOwoKICAgICAgaWYgKHhTZW1hcGhvcmVUYWtlRnJvbUlTUiAoaFNlbWFwaG9yZSwgJnlpZWxkKSAhPSBwZFBBU1MpIHsKICAgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOwogICAgICB9IGVsc2UgewogICAgICAgIHBvcnRZSUVMRF9GUk9NX0lTUiAoeWllbGQpOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgewogICAgaWYgKHhTZW1hcGhvcmVUYWtlIChoU2VtYXBob3JlLCAoVGlja1R5cGVfdCl0aW1lb3V0KSAhPSBwZFBBU1MpIHsKICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKICAgICAgICBzdGF0ID0gb3NFcnJvclRpbWVvdXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIChzdGF0KTsKfQoKb3NTdGF0dXNfdCBvc1NlbWFwaG9yZVJlbGVhc2UgKG9zU2VtYXBob3JlSWRfdCBzZW1hcGhvcmVfaWQpIHsKICBTZW1hcGhvcmVIYW5kbGVfdCBoU2VtYXBob3JlID0gKFNlbWFwaG9yZUhhbmRsZV90KXNlbWFwaG9yZV9pZDsKICBvc1N0YXR1c190IHN0YXQ7CiAgQmFzZVR5cGVfdCB5aWVsZDsKCiAgc3RhdCA9IG9zT0s7CgogIGlmIChoU2VtYXBob3JlID09IE5VTEwpIHsKICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIGlmIChJU19JUlEoKSkgewogICAgeWllbGQgPSBwZEZBTFNFOwoKICAgIGlmICh4U2VtYXBob3JlR2l2ZUZyb21JU1IgKGhTZW1hcGhvcmUsICZ5aWVsZCkgIT0gcGRUUlVFKSB7CiAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CiAgICB9IGVsc2UgewogICAgICBwb3J0WUlFTERfRlJPTV9JU1IgKHlpZWxkKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBpZiAoeFNlbWFwaG9yZUdpdmUgKGhTZW1hcGhvcmUpICE9IHBkUEFTUykgewogICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOwogICAgfQogIH0KCiAgcmV0dXJuIChzdGF0KTsKfQoKdWludDMyX3Qgb3NTZW1hcGhvcmVHZXRDb3VudCAob3NTZW1hcGhvcmVJZF90IHNlbWFwaG9yZV9pZCkgewogIFNlbWFwaG9yZUhhbmRsZV90IGhTZW1hcGhvcmUgPSAoU2VtYXBob3JlSGFuZGxlX3Qpc2VtYXBob3JlX2lkOwogIHVpbnQzMl90IGNvdW50OwoKICBpZiAoaFNlbWFwaG9yZSA9PSBOVUxMKSB7CiAgICBjb3VudCA9IDBVOwogIH0KICBlbHNlIGlmIChJU19JUlEoKSkgewogICAgY291bnQgPSB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nRnJvbUlTUiAoaFNlbWFwaG9yZSk7CiAgfSBlbHNlIHsKICAgIGNvdW50ID0gKHVpbnQzMl90KXV4U2VtYXBob3JlR2V0Q291bnQgKGhTZW1hcGhvcmUpOwogIH0KCiAgcmV0dXJuIChjb3VudCk7Cn0KCm9zU3RhdHVzX3Qgb3NTZW1hcGhvcmVEZWxldGUgKG9zU2VtYXBob3JlSWRfdCBzZW1hcGhvcmVfaWQpIHsKICBTZW1hcGhvcmVIYW5kbGVfdCBoU2VtYXBob3JlID0gKFNlbWFwaG9yZUhhbmRsZV90KXNlbWFwaG9yZV9pZDsKICBvc1N0YXR1c190IHN0YXQ7CgojaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKICBpZiAoSVNfSVJRKCkpIHsKICAgIHN0YXQgPSBvc0Vycm9ySVNSOwogIH0KICBlbHNlIGlmIChoU2VtYXBob3JlID09IE5VTEwpIHsKICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIHsKICAgICNpZiAoY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDApCiAgICB2UXVldWVVbnJlZ2lzdGVyUXVldWUgKGhTZW1hcGhvcmUpOwogICAgI2VuZGlmCgogICAgc3RhdCA9IG9zT0s7CiAgICB2U2VtYXBob3JlRGVsZXRlIChoU2VtYXBob3JlKTsKICB9CiNlbHNlCiAgc3RhdCA9IG9zRXJyb3I7CiNlbmRpZgoKICByZXR1cm4gKHN0YXQpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpvc01lc3NhZ2VRdWV1ZUlkX3Qgb3NNZXNzYWdlUXVldWVOZXcgKHVpbnQzMl90IG1zZ19jb3VudCwgdWludDMyX3QgbXNnX3NpemUsIGNvbnN0IG9zTWVzc2FnZVF1ZXVlQXR0cl90ICphdHRyKSB7CiAgUXVldWVIYW5kbGVfdCBoUXVldWU7CiAgaW50MzJfdCBtZW07CiAgI2lmIChjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMCkKICBjb25zdCBjaGFyICpuYW1lOwogICNlbmRpZgoKICBoUXVldWUgPSBOVUxMOwoKICBpZiAoIUlTX0lSUSgpICYmIChtc2dfY291bnQgPiAwVSkgJiYgKG1zZ19zaXplID4gMFUpKSB7CiAgICBtZW0gPSAtMTsKCiAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgIGlmICgoYXR0ci0+Y2JfbWVtICE9IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID49IHNpemVvZihTdGF0aWNRdWV1ZV90KSkgJiYKICAgICAgICAgIChhdHRyLT5tcV9tZW0gIT0gTlVMTCkgJiYgKGF0dHItPm1xX3NpemUgPj0gKG1zZ19jb3VudCAqIG1zZ19zaXplKSkpIHsKICAgICAgICBtZW0gPSAxOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtID09IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID09IDBVKSAmJgogICAgICAgICAgICAoYXR0ci0+bXFfbWVtID09IE5VTEwpICYmIChhdHRyLT5tcV9zaXplID09IDBVKSkgewogICAgICAgICAgbWVtID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICBtZW0gPSAwOwogICAgfQoKICAgIGlmIChtZW0gPT0gMSkgewogICAgICBoUXVldWUgPSB4UXVldWVDcmVhdGVTdGF0aWMgKG1zZ19jb3VudCwgbXNnX3NpemUsIGF0dHItPm1xX21lbSwgYXR0ci0+Y2JfbWVtKTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAobWVtID09IDApIHsKICAgICAgICBoUXVldWUgPSB4UXVldWVDcmVhdGUgKG1zZ19jb3VudCwgbXNnX3NpemUpOwogICAgICB9CiAgICB9CgogICAgI2lmIChjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMCkKICAgIGlmIChoUXVldWUgIT0gTlVMTCkgewogICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9IE5VTEw7CiAgICAgIH0KICAgICAgdlF1ZXVlQWRkVG9SZWdpc3RyeSAoaFF1ZXVlLCBuYW1lKTsKICAgIH0KICAgICNlbmRpZgoKICB9CgogIHJldHVybiAoKG9zTWVzc2FnZVF1ZXVlSWRfdCloUXVldWUpOwp9Cgpvc1N0YXR1c190IG9zTWVzc2FnZVF1ZXVlUHV0IChvc01lc3NhZ2VRdWV1ZUlkX3QgbXFfaWQsIGNvbnN0IHZvaWQgKm1zZ19wdHIsIHVpbnQ4X3QgbXNnX3ByaW8sIHVpbnQzMl90IHRpbWVvdXQpIHsKICBRdWV1ZUhhbmRsZV90IGhRdWV1ZSA9IChRdWV1ZUhhbmRsZV90KW1xX2lkOwogIG9zU3RhdHVzX3Qgc3RhdDsKICBCYXNlVHlwZV90IHlpZWxkOwoKICAodm9pZCltc2dfcHJpbzsgLyogTWVzc2FnZSBwcmlvcml0eSBpcyBpZ25vcmVkICovCgogIHN0YXQgPSBvc09LOwoKICBpZiAoSVNfSVJRKCkpIHsKICAgIGlmICgoaFF1ZXVlID09IE5VTEwpIHx8IChtc2dfcHRyID09IE5VTEwpIHx8ICh0aW1lb3V0ICE9IDBVKSkgewogICAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICAgIH0KICAgIGVsc2UgewogICAgICB5aWVsZCA9IHBkRkFMU0U7CgogICAgICBpZiAoeFF1ZXVlU2VuZFRvQmFja0Zyb21JU1IgKGhRdWV1ZSwgbXNnX3B0ciwgJnlpZWxkKSAhPSBwZFRSVUUpIHsKICAgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOwogICAgICB9IGVsc2UgewogICAgICAgIHBvcnRZSUVMRF9GUk9NX0lTUiAoeWllbGQpOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgewogICAgaWYgKChoUXVldWUgPT0gTlVMTCkgfHwgKG1zZ19wdHIgPT0gTlVMTCkpIHsKICAgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKHhRdWV1ZVNlbmRUb0JhY2sgKGhRdWV1ZSwgbXNnX3B0ciwgKFRpY2tUeXBlX3QpdGltZW91dCkgIT0gcGRQQVNTKSB7CiAgICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKICAgICAgICAgIHN0YXQgPSBvc0Vycm9yVGltZW91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCm9zU3RhdHVzX3Qgb3NNZXNzYWdlUXVldWVHZXQgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCwgdm9pZCAqbXNnX3B0ciwgdWludDhfdCAqbXNnX3ByaW8sIHVpbnQzMl90IHRpbWVvdXQpIHsKICBRdWV1ZUhhbmRsZV90IGhRdWV1ZSA9IChRdWV1ZUhhbmRsZV90KW1xX2lkOwogIG9zU3RhdHVzX3Qgc3RhdDsKICBCYXNlVHlwZV90IHlpZWxkOwoKICAodm9pZCltc2dfcHJpbzsgLyogTWVzc2FnZSBwcmlvcml0eSBpcyBpZ25vcmVkICovCgogIHN0YXQgPSBvc09LOwoKICBpZiAoSVNfSVJRKCkpIHsKICAgIGlmICgoaFF1ZXVlID09IE5VTEwpIHx8IChtc2dfcHRyID09IE5VTEwpIHx8ICh0aW1lb3V0ICE9IDBVKSkgewogICAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICAgIH0KICAgIGVsc2UgewogICAgICB5aWVsZCA9IHBkRkFMU0U7CgogICAgICBpZiAoeFF1ZXVlUmVjZWl2ZUZyb21JU1IgKGhRdWV1ZSwgbXNnX3B0ciwgJnlpZWxkKSAhPSBwZFBBU1MpIHsKICAgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOwogICAgICB9IGVsc2UgewogICAgICAgIHBvcnRZSUVMRF9GUk9NX0lTUiAoeWllbGQpOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgewogICAgaWYgKChoUXVldWUgPT0gTlVMTCkgfHwgKG1zZ19wdHIgPT0gTlVMTCkpIHsKICAgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKHhRdWV1ZVJlY2VpdmUgKGhRdWV1ZSwgbXNnX3B0ciwgKFRpY2tUeXBlX3QpdGltZW91dCkgIT0gcGRQQVNTKSB7CiAgICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKICAgICAgICAgIHN0YXQgPSBvc0Vycm9yVGltZW91dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiAoc3RhdCk7Cn0KCnVpbnQzMl90IG9zTWVzc2FnZVF1ZXVlR2V0Q2FwYWNpdHkgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCkgewogIFN0YXRpY1F1ZXVlX3QgKm1xID0gKFN0YXRpY1F1ZXVlX3QgKiltcV9pZDsKICB1aW50MzJfdCBjYXBhY2l0eTsKCiAgaWYgKG1xID09IE5VTEwpIHsKICAgIGNhcGFjaXR5ID0gMFU7CiAgfSBlbHNlIHsKICAgIC8qIGNhcGFjaXR5ID0gcHhRdWV1ZS0+dXhMZW5ndGggKi8KICAgIGNhcGFjaXR5ID0gbXEtPnV4RHVtbXk0WzFdOwogIH0KCiAgcmV0dXJuIChjYXBhY2l0eSk7Cn0KCnVpbnQzMl90IG9zTWVzc2FnZVF1ZXVlR2V0TXNnU2l6ZSAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CiAgU3RhdGljUXVldWVfdCAqbXEgPSAoU3RhdGljUXVldWVfdCAqKW1xX2lkOwogIHVpbnQzMl90IHNpemU7CgogIGlmIChtcSA9PSBOVUxMKSB7CiAgICBzaXplID0gMFU7CiAgfSBlbHNlIHsKICAgIC8qIHNpemUgPSBweFF1ZXVlLT51eEl0ZW1TaXplICovCiAgICBzaXplID0gbXEtPnV4RHVtbXk0WzJdOwogIH0KCiAgcmV0dXJuIChzaXplKTsKfQoKdWludDMyX3Qgb3NNZXNzYWdlUXVldWVHZXRDb3VudCAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CiAgUXVldWVIYW5kbGVfdCBoUXVldWUgPSAoUXVldWVIYW5kbGVfdCltcV9pZDsKICBVQmFzZVR5cGVfdCBjb3VudDsKCiAgaWYgKGhRdWV1ZSA9PSBOVUxMKSB7CiAgICBjb3VudCA9IDBVOwogIH0KICBlbHNlIGlmIChJU19JUlEoKSkgewogICAgY291bnQgPSB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nRnJvbUlTUiAoaFF1ZXVlKTsKICB9CiAgZWxzZSB7CiAgICBjb3VudCA9IHV4UXVldWVNZXNzYWdlc1dhaXRpbmcgKGhRdWV1ZSk7CiAgfQoKICByZXR1cm4gKCh1aW50MzJfdCljb3VudCk7Cn0KCnVpbnQzMl90IG9zTWVzc2FnZVF1ZXVlR2V0U3BhY2UgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCkgewogIFN0YXRpY1F1ZXVlX3QgKm1xID0gKFN0YXRpY1F1ZXVlX3QgKiltcV9pZDsKICB1aW50MzJfdCBzcGFjZTsKICB1aW50MzJfdCBpc3JtOwoKICBpZiAobXEgPT0gTlVMTCkgewogICAgc3BhY2UgPSAwVTsKICB9CiAgZWxzZSBpZiAoSVNfSVJRKCkpIHsKICAgIGlzcm0gPSB0YXNrRU5URVJfQ1JJVElDQUxfRlJPTV9JU1IoKTsKCiAgICAvKiBzcGFjZSA9IHB4UXVldWUtPnV4TGVuZ3RoIC0gcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmc7ICovCiAgICBzcGFjZSA9IG1xLT51eER1bW15NFsxXSAtIG1xLT51eER1bW15NFswXTsKCiAgICB0YXNrRVhJVF9DUklUSUNBTF9GUk9NX0lTUihpc3JtKTsKICB9CiAgZWxzZSB7CiAgICBzcGFjZSA9ICh1aW50MzJfdCl1eFF1ZXVlU3BhY2VzQXZhaWxhYmxlICgoUXVldWVIYW5kbGVfdCltcSk7CiAgfQoKICByZXR1cm4gKHNwYWNlKTsKfQoKb3NTdGF0dXNfdCBvc01lc3NhZ2VRdWV1ZVJlc2V0IChvc01lc3NhZ2VRdWV1ZUlkX3QgbXFfaWQpIHsKICBRdWV1ZUhhbmRsZV90IGhRdWV1ZSA9IChRdWV1ZUhhbmRsZV90KW1xX2lkOwogIG9zU3RhdHVzX3Qgc3RhdDsKCiAgaWYgKElTX0lSUSgpKSB7CiAgICBzdGF0ID0gb3NFcnJvcklTUjsKICB9CiAgZWxzZSBpZiAoaFF1ZXVlID09IE5VTEwpIHsKICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBlbHNlIHsKICAgIHN0YXQgPSBvc09LOwogICAgKHZvaWQpeFF1ZXVlUmVzZXQgKGhRdWV1ZSk7CiAgfQoKICByZXR1cm4gKHN0YXQpOwp9Cgpvc1N0YXR1c190IG9zTWVzc2FnZVF1ZXVlRGVsZXRlIChvc01lc3NhZ2VRdWV1ZUlkX3QgbXFfaWQpIHsKICBRdWV1ZUhhbmRsZV90IGhRdWV1ZSA9IChRdWV1ZUhhbmRsZV90KW1xX2lkOwogIG9zU3RhdHVzX3Qgc3RhdDsKCiNpZm5kZWYgVVNFX0ZyZWVSVE9TX0hFQVBfMQogIGlmIChJU19JUlEoKSkgewogICAgc3RhdCA9IG9zRXJyb3JJU1I7CiAgfQogIGVsc2UgaWYgKGhRdWV1ZSA9PSBOVUxMKSB7CiAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgZWxzZSB7CiAgICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQogICAgdlF1ZXVlVW5yZWdpc3RlclF1ZXVlIChoUXVldWUpOwogICAgI2VuZGlmCgogICAgc3RhdCA9IG9zT0s7CiAgICB2UXVldWVEZWxldGUgKGhRdWV1ZSk7CiAgfQojZWxzZQogIHN0YXQgPSBvc0Vycm9yOwojZW5kaWYKCiAgcmV0dXJuIChzdGF0KTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwpleHRlcm4gdm9pZCB2QXBwbGljYXRpb25JZGxlSG9vayAodm9pZCk7CmV4dGVybiB2b2lkIHZBcHBsaWNhdGlvblRpY2tIb29rICh2b2lkKTsKZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vayAodm9pZCk7CmV4dGVybiB2b2lkIHZBcHBsaWNhdGlvbkRhZW1vblRhc2tTdGFydHVwSG9vayAodm9pZCk7CmV4dGVybiB2b2lkIHZBcHBsaWNhdGlvblN0YWNrT3ZlcmZsb3dIb29rIChUYXNrSGFuZGxlX3QgeFRhc2ssIHNpZ25lZCBjaGFyICpwY1Rhc2tOYW1lKTsKCi8qKgogIER1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB2QXBwbGljYXRpb25JZGxlSG9vaygpLgoqLwojaWYgKGNvbmZpZ1VTRV9JRExFX0hPT0sgPT0gMSkKX19XRUFLIHZvaWQgdkFwcGxpY2F0aW9uSWRsZUhvb2sgKHZvaWQpe30KI2VuZGlmCgovKioKICBEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdkFwcGxpY2F0aW9uVGlja0hvb2soKS4KKi8KI2lmIChjb25maWdVU0VfVElDS19IT09LID09IDEpCiBfX1dFQUsgdm9pZCB2QXBwbGljYXRpb25UaWNrSG9vayAodm9pZCl7fQojZW5kaWYKCi8qKgogIER1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCkuCiovCiNpZiAoY29uZmlnVVNFX01BTExPQ19GQUlMRURfSE9PSyA9PSAxKQpfX1dFQUsgdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rICh2b2lkKXt9CiNlbmRpZgoKLyoqCiAgRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHZBcHBsaWNhdGlvbkRhZW1vblRhc2tTdGFydHVwSG9vaygpLgoqLwojaWYgKGNvbmZpZ1VTRV9EQUVNT05fVEFTS19TVEFSVFVQX0hPT0sgPT0gMSkKX19XRUFLIHZvaWQgdkFwcGxpY2F0aW9uRGFlbW9uVGFza1N0YXJ0dXBIb29rICh2b2lkKXt9CiNlbmRpZgoKLyoqCiAgRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHZBcHBsaWNhdGlvblN0YWNrT3ZlcmZsb3dIb29rKCkuCiovCiNpZiAoY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMCkKX19XRUFLIHZvaWQgdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2sgKFRhc2tIYW5kbGVfdCB4VGFzaywgc2lnbmVkIGNoYXIgKnBjVGFza05hbWUpIHsKICAodm9pZCl4VGFzazsKICAodm9pZClwY1Rhc2tOYW1lOwp9CiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogRXh0ZXJuYWwgSWRsZSBhbmQgVGltZXIgdGFzayBzdGF0aWMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zICovCmV4dGVybiB2b2lkIHZBcHBsaWNhdGlvbkdldElkbGVUYXNrTWVtb3J5ICAoU3RhdGljVGFza190ICoqcHB4SWRsZVRhc2tUQ0JCdWZmZXIsICBTdGFja1R5cGVfdCAqKnBweElkbGVUYXNrU3RhY2tCdWZmZXIsICB1aW50MzJfdCAqcHVsSWRsZVRhc2tTdGFja1NpemUpOwpleHRlcm4gdm9pZCB2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkgKFN0YXRpY1Rhc2tfdCAqKnBweFRpbWVyVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhUaW1lclRhc2tTdGFja0J1ZmZlciwgdWludDMyX3QgKnB1bFRpbWVyVGFza1N0YWNrU2l6ZSk7CgovKiBJZGxlIHRhc2sgY29udHJvbCBibG9jayBhbmQgc3RhY2sgKi8Kc3RhdGljIFN0YXRpY1Rhc2tfdCBJZGxlX1RDQjsKc3RhdGljIFN0YWNrVHlwZV90ICBJZGxlX1N0YWNrW2NvbmZpZ01JTklNQUxfU1RBQ0tfU0laRV07CgovKiBUaW1lciB0YXNrIGNvbnRyb2wgYmxvY2sgYW5kIHN0YWNrICovCnN0YXRpYyBTdGF0aWNUYXNrX3QgVGltZXJfVENCOwpzdGF0aWMgU3RhY2tUeXBlX3QgIFRpbWVyX1N0YWNrW2NvbmZpZ1RJTUVSX1RBU0tfU1RBQ0tfREVQVEhdOwoKLyoKICB2QXBwbGljYXRpb25HZXRJZGxlVGFza01lbW9yeSBnZXRzIGNhbGxlZCB3aGVuIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04KICBlcXVhbHMgdG8gMSBhbmQgaXMgcmVxdWlyZWQgZm9yIHN0YXRpYyBtZW1vcnkgYWxsb2NhdGlvbiBzdXBwb3J0LgoqLwp2b2lkIHZBcHBsaWNhdGlvbkdldElkbGVUYXNrTWVtb3J5IChTdGF0aWNUYXNrX3QgKipwcHhJZGxlVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhJZGxlVGFza1N0YWNrQnVmZmVyLCB1aW50MzJfdCAqcHVsSWRsZVRhc2tTdGFja1NpemUpIHsKICAqcHB4SWRsZVRhc2tUQ0JCdWZmZXIgICA9ICZJZGxlX1RDQjsKICAqcHB4SWRsZVRhc2tTdGFja0J1ZmZlciA9ICZJZGxlX1N0YWNrWzBdOwogICpwdWxJZGxlVGFza1N0YWNrU2l6ZSAgID0gKHVpbnQzMl90KWNvbmZpZ01JTklNQUxfU1RBQ0tfU0laRTsKfQoKLyoKICB2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkgZ2V0cyBjYWxsZWQgd2hlbiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OCiAgZXF1YWxzIHRvIDEgYW5kIGlzIHJlcXVpcmVkIGZvciBzdGF0aWMgbWVtb3J5IGFsbG9jYXRpb24gc3VwcG9ydC4KKi8Kdm9pZCB2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkgKFN0YXRpY1Rhc2tfdCAqKnBweFRpbWVyVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhUaW1lclRhc2tTdGFja0J1ZmZlciwgdWludDMyX3QgKnB1bFRpbWVyVGFza1N0YWNrU2l6ZSkgewogICpwcHhUaW1lclRhc2tUQ0JCdWZmZXIgICA9ICZUaW1lcl9UQ0I7CiAgKnBweFRpbWVyVGFza1N0YWNrQnVmZmVyID0gJlRpbWVyX1N0YWNrWzBdOwogICpwdWxUaW1lclRhc2tTdGFja1NpemUgICA9ICh1aW50MzJfdCljb25maWdUSU1FUl9UQVNLX1NUQUNLX0RFUFRIOwp9Cg==