LyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgSHVtYXggQ28uLCBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIEh1bWF4IENvLiwgTHRkLiAoIkh1bWF4IikgaGVyZWJ5IHByb3ZpZGVzIHBlcm1pc3Npb24sIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkKICogcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb3VyY2UgY29kZSwgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcwogKiBzb3VyY2UgY29kZSB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCiAqIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSFVNQVggIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywKICogQ1VSUkVOQ1ksIEFWQUlMQUJJTElUWSwgVElUTEUgT1IgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgSFVNQVggT1IKICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CiAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAogKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgogKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSElTCiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKiBUaGUgdmlld3MgYW5kIGNvbmNsdXNpb24gY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBhcmUKICogdGhvc2Ugb2YgdGhlIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsCiAqIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQsIG9mIEh1bWF4LgogKgogKiBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZSB0aGlzCiAqIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgSHVtYXi/cyBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhIGxpY2Vuc2UKICogb3RoZXIgdGhhbiB0aGUgYWJvdmUgbGljZW5zZSwgd2l0aG91dCBIdW1heCdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbiBjb25zZW50LgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRmlsZSBOYW1lOiAgICAgICAgICAgJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guYyAgJAogKiBWZXJzaW9uOiAgICAgICAgICAgICAkUmV2aXNpb246ICAgMS4wICAkCiAqIE9yaWdpbmFsIEF1dGhvcjogICAgIFlhbmcgSHl1biBVayAkCiAqIEN1cnJlbnQgQXV0aG9yOiAgICAgICRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKICogRGF0ZTogICAgICAgICAgICAgICAgJERhdGU6IDIwMTEuMDkuMzAKICogRmlsZSBEZXNjcmlwdGlvbjogICAgSHVtYXggVXBncmFkZSBBUElzCiAqIE1vZHVsZToKICogUmVtYXJrczoKICovCgovKioKICogQGRlZmdyb3VwIFVQR1JBREVfRkxBU0ggRmxhc2hpbmcgQVBJcyBmb3IgVXBncmFkZSBNb2R1bGUKICogQGluZ3JvdXAgVVBHUkFERQogKgogKi8KCi8qKgogKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQogKiBAZGF0ZSAzMCBTZXB0IDIwMTEKICovCgogLypAeyovCgovKioKICogQGZpbGUgaG14X3VwZ3JhZGVfZmxhc2guYwogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPgovKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCAjZGVmaW5lICovCi8qIHRoaXMgaXMgZm9yIHRlc3QgKi8KI2RlZmluZSBUQVJHRVRfTlZSQU1fTVREICAgICAgICAiL2Rldi9tdGQvaG52cmFtIgovKiBFbmQgI2RlZmluZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogU3RhcnQgdHlwZWRlZiAqLwovKiBFbmQgdHlwZWRlZiAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLwppbnQgbGlidXBncmFkZV92ZXJib3NlID0gMTsKLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLwppbnQgZmRfbnZyYW0gPSAtMTsKCnN0YXRpYyB1bnNpZ25lZCBsb25nICAgIHNfRmxhc2hUb3RhbFNpemU7CnN0YXRpYyB1bnNpZ25lZCBsb25nICAgIHNfRmxhc2hCbG9ja1NpemU7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICpzX0Jsb2NrQnVmZjsKLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IEhNWF9VUEdSQURFX05WUkFNX1dyaXRlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplICkKewogIGludCByZXQ7CgogIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7CgogIGlmICggZmRfbnZyYW0gPCAwICkgewogICAgZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7CiAgICBpZiggZmRfbnZyYW0gPCAwICkgewogICAgICBwZXJyb3IoVEFSR0VUX05WUkFNX01URCk7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9CgogIHJldCA9IGxzZWVrKGZkX252cmFtLCBvZmZzZXQsIFNFRUtfU0VUKTsKICBpZihyZXQgPCAwKSB7CiAgICBwZXJyb3IoImxzZWVrIik7CiAgICByZXR1cm4gLTE7CiAgfQoKICByZXQgPSB3cml0ZShmZF9udnJhbSwgZGF0YSwgc2l6ZSk7CiAgaWYocmV0IDwgMCkgewogICAgcGVycm9yKCJ3cml0ZSIpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgLyogV3JpdGVzIHRvIC9kZXYvbXRkYmxvY2tYIGFyZSBjYWNoZWQgaW5kZWZpbml0ZWx5IHVudGlsIHRoZSBsYXN0IGZpbGUKICAgKiBkZXNjcmlwdG9yIGlzIGNsb3NlZC4gRmx1c2ggdGhpcyBjYWNoZSBhZnRlciB3cml0aW5nLiBUaGUgdXNlciBkZXBlbmRzIG9uCiAgICogZGF0YSBiZWluZyBwaHlzaWNhbGx5IHdyaXR0ZW4gdG8gZmxhc2ggd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCiAgICogUmVxdWlyZXMgQ0FQX1NZU19BRE1JTi4gKi8KICByZXQgPSBpb2N0bChmZF9udnJhbSwgQkxLRkxTQlVGLCAwKTsKICBpZihyZXQgPCAwKSB7CiAgICBwZXJyb3IoImlvY3RsKGhudnJhbSwgQkxLRkxTQlVGLCAwKSIpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgcmV0dXJuIDA7Cn0KCmludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUgKQp7CiAgaW50IHJldDsKICB1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7CiAgdW5zaWduZWQgbG9uZyBtb3Zfb2Zmc2V0LCByZW1haW5fc2l6ZTsKCiAgaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKCiAgLyogKi8KICBpZiAoIGZkX252cmFtIDwgMCApIHsKICAgIGZkX252cmFtID0gb3BlbihUQVJHRVRfTlZSQU1fTVRELCAoT19SRFdSIHwgT19TWU5DKSApOwogICAgaWYoIGZkX252cmFtIDwgMCApIHsKICAgICAgcGVycm9yKFRBUkdFVF9OVlJBTV9NVEQpOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgfQoKCiAgcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG9mZnNldCwgU0VFS19TRVQpOwogIGlmKHJldCA8IDApIHsKICAgIHBlcnJvcigibHNlZWsiKTsKICAgIHJldHVybiAtMTsKICB9CgogIHJldCA9IHJlYWQoZmRfbnZyYW0sIGRhdGEsIHNpemUpOwogIGlmKHJldCA8IDApIHsKICAgIHBlcnJvcigicmVhZCIpOwogICAgcmV0dXJuIHJldDsKICB9CgogIHJldHVybiAwOwp9CgoKLypAfSovCg==