LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guYyAgJAogKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQKICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQKICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKICogRGF0ZToJCQkkRGF0ZTogMjAxMS4wOS4zMAogKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMKICogTW9kdWxlOgogKiBSZW1hcmtzOgogKi8KCi8qKgogKiBAZGVmZ3JvdXAgVVBHUkFERV9GTEFTSCBGbGFzaGluZyBBUElzIGZvciBVcGdyYWRlIE1vZHVsZQogKiBAaW5ncm91cCBVUEdSQURFCiAqCiAqLwoKLyoqCiAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pCiAqIEBkYXRlIDMwIFNlcHQgMjAxMQogKi8KCi8qKgogKiBAbm90ZQogKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbgogKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQogKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlCiAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4KICovCgogLypAeyovCgovKioKICogQGZpbGUgaG14X3VwZ3JhZGVfZmxhc2guYwogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPgojaW5jbHVkZSAiaG14X3VwZ3JhZGVfZmxhc2guaCIKLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRW5kICNkZWZpbmUgKi8KLyogdGhpcyBpcyBmb3IgdGVzdCAqLwojZGVmaW5lIFRBUkdFVF9CT09UX0xPQURFUl9NVEQJIi9kZXYvbXRkYmxvY2swIgoKI2RlZmluZSBUQVJHRVRfTlZSQU1fTVRECSIvZGV2L210ZGJsb2NrMSIKI2RlZmluZSBUQVJHRVRfTlZSQU1fTVREQwkiL2Rldi9tdGQxIgoKLyogdGhpcyBpcyBmb3IgdGVzdCAqLwojZGVmaW5lIFRBUkdFVF9LRVJORUxfTVRECSIvZGV2L210ZGJsb2NrMTAiCgovKiB0aGlzIGlzIGZvciB0ZXN0IHViaSBtYXBwZWQgKi8KI2RlZmluZSBUQVJHRVRfUk9PVEZTX1VCSV9NVEQJIi9kZXYvbXRkYmxvY2sxMSIKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IHR5cGVkZWYgKi8KLyogRW5kIHR5cGVkZWYgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8KaW50IGxpYnVwZ3JhZGVfdmVyYm9zZSA9IDE7Ci8qIEVuZCBnbG9iYWwgdmFyaWFibGUgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCBzdGF0aWMgdmFyaWFibGUgKi8KaW50IGZkX2tlcm5lbCA9IDA7CmludCBmZF9yb290ZnMgPSAwOwppbnQgZmRfYm9vcmxvYWRlciA9IDA7CmludCBmZF9udnJhbSA9IDA7CmludCBmZF9udnJhbV9jID0gLTE7CgpzdGF0aWMgdW5zaWduZWQgbG9uZwlzX0ZsYXNoVG90YWxTaXplOwpzdGF0aWMgdW5zaWduZWQgbG9uZwlzX0ZsYXNoQmxvY2tTaXplOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqc19CbG9ja0J1ZmY7CgovKiBFbmQgc3RhdGljIHZhcmlhYmxlICovCmludCBITVhfVVBHUkFERV9GbGFzaF9LZXJuZWwodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOwppbnQgSE1YX1VQR1JBREVfRmxhc2hfUm9vdGZzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsKaW50IEhNWF9VUEdSQURFX0ZsYXNoX0Jvb3RMb2FkZXIodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOwoKCgp1bnNpZ25lZCBjaGFyICogSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX0tlcm5lbF9NVEQodm9pZCkKewoJcmV0dXJuIFRBUkdFVF9LRVJORUxfTVREOwp9Cgp1bnNpZ25lZCBjaGFyICogSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX1Jvb3Rmc19NVEQodm9pZCkKewoJcmV0dXJuIFRBUkdFVF9ST09URlNfVUJJX01URDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludCBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICkKewoJaW50IHJldDsKCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87Cgl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7Cgl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOwoKCWlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKCgkvKiAqLwoJaWYgKCBmZF9udnJhbSA9PSAwICkKCXsKCQlmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKCQlpZiggZmRfbnZyYW0gPCAwICkKCQl7CgkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOwoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCWlmICggZmRfbnZyYW1fYyA8IDAgKQoJewoJCWZkX252cmFtX2MgPSBvcGVuKFRBUkdFVF9OVlJBTV9NVERDLCAoT19SRFdSIHwgT19TWU5DKSApOwoJCWlmKCBmZF9udnJhbV9jIDwgMCApCgkJewoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCglyZXQgPSBpb2N0bChmZF9udnJhbV9jLCBNRU1HRVRJTkZPLCh2b2lkICopJmluZm8pOwoJaWYocmV0IDwgMCkKCXsKCQlwcmludGYoImNhbid0IGdldCBpbmZvIGRhdGEhICglZClcbiIsIHJldCk7CgkJcmV0dXJuIC0xOwoJfQoKCXJlbWFpbl9zaXplID0gc2l6ZTsKCW1vdl9vZmZzZXQgPSBvZmZzZXQ7CgoJd2hpbGUocmVtYWluX3NpemUgPiAwKQoJewoJCS8qIG9mZnNldMDMIGJsb2NrILPRvu68rbjpIL7Itci02S4uICovCgkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOwoJCXdyaXRlX3NpemUgLT0gKChtb3Zfb2Zmc2V0ICsgaW5mby5lcmFzZXNpemUpJWluZm8uZXJhc2VzaXplKTsKCgkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLwoJCWlmKCByZW1haW5fc2l6ZSA8IHdyaXRlX3NpemUpCgkJewoJCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7CgkJfQoKCQlpZiAobGlidXBncmFkZV92ZXJib3NlKSBwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOwoKCQlyZXQgPSBsc2VlayhmZF9udnJhbSwgbW92X29mZnNldCwgU0VFS19TRVQpOwoJCWlmKHJldCA8IDApCgkJewoJCQlwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7CgkJCXJldHVybiAtMTsKCQl9CgoJCXJldCA9IHdyaXRlKGZkX252cmFtLCBkYXRhKyhtb3Zfb2Zmc2V0LW9mZnNldCksIHdyaXRlX3NpemUpOwoJCWlmKHJldCA8IDApCgkJewoJCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7CgkJCXJldHVybiAtMTsKCQl9CgoJCW1vdl9vZmZzZXQgKz0gd3JpdGVfc2l6ZTsKCQlyZW1haW5fc2l6ZSAtPSB3cml0ZV9zaXplOwoJfQoKCXJldHVybiAwOwp9CgppbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICkKewoJaW50IHJldDsKCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87Cgl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7Cgl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOwoKCWlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKCgkvKiAqLwoJaWYgKCBmZF9udnJhbSA9PSAwICkKCXsKCQlmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKCQlpZiggZmRfbnZyYW0gPCAwICkKCQl7CgkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOwoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCglyZXQgPSBsc2VlayhmZF9udnJhbSwgb2Zmc2V0LCBTRUVLX1NFVCk7CglpZihyZXQgPCAwKQoJewoJCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7CglpZihyZXQgPCAwKQoJewoJCXByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOwoJCXJldHVybiByZXQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCgoKaW50IEhNWF9VUEdSQURFX0ZsYXNoX0tlcm5lbCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkKewoJaW50IHJldDsKCXVuc2lnbmVkIGNoYXIgKiBjb21fYnVmOwoKCXByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKCS8qICovCglpZiAoIGZkX2tlcm5lbCA9PSAwICkKCXsKCQlmZF9rZXJuZWwgPSBvcGVuKEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9LZXJuZWxfTVREKCksIChPX1JEV1IgfCBPX1NZTkMpICk7CgkJaWYoIGZkX2tlcm5lbCA8IDAgKQoJCXsKCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4gZmRfa2VybmVsIVxuIiApOwoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCXJldCA9IGxzZWVrKGZkX2tlcm5lbCwgb2Zmc2V0LCBTRUVLX1NFVCk7CglpZihyZXQgPCAwKQoJewoJCXByaW50ZigiZmFpbGVkIHNlZWtpbmcgcG9zaXRpb24hICglZClcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCglyZXQgPSB3cml0ZShmZF9rZXJuZWwsIGRhdGEsIHNpemUpOwoJaWYocmV0IDwgMCkKCXsKCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCgkvKiBSZWFkIGFuZCBDb21wYXJlICovCglyZXQgPSBsc2VlayhmZF9rZXJuZWwsIG9mZnNldCwgU0VFS19TRVQpOwoJaWYocmV0IDwgMCkKCXsKCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOwoJCXJldHVybiByZXQ7Cgl9CgoJY29tX2J1ZiA9IG1hbGxvYyhzaXplKTsKCWlmIChjb21fYnVmID09IE5VTEwgKQoJewoJCXByaW50ZigibWFsbG9jIGZhaWVkISEhIFxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCXJldCA9IHJlYWQoZmRfa2VybmVsLCBjb21fYnVmLCBzaXplKTsKCWlmKHJldCA8IDApCgl7CgkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCglpZiAoIG1lbWNtcChkYXRhLCBjb21fYnVmLCBzaXplKSAhPSAwICkKCXsKCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOwoJCXJldHVybiAtMTsKCX0KCglmcmVlKGNvbV9idWYpOwoKCXJldHVybiAwOwp9CgppbnQgSE1YX1VQR1JBREVfRmxhc2hfQm9vdExvYWRlcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkKewoJaW50IHJldDsKCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87Cgl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7Cgl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOwoKCXByaW50ZiAoICJTS0lQIEJPT1QgTE9BREVSLi4uIFxuIik7CglwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7CgoJcmV0dXJuIDA7CgoJLyogKi8KCWlmICggZmRfYm9vcmxvYWRlciA9PSAwICkKCXsKCQlmZF9ib29ybG9hZGVyID0gb3BlbihUQVJHRVRfQk9PVF9MT0FERVJfTVRELCAoT19SRFdSIHwgT19TWU5DKSApOwoJCWlmKCBmZF9ib29ybG9hZGVyIDwgMCApCgkJewoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCglyZXQgPSBpb2N0bChmZF9ib29ybG9hZGVyLCBNRU1HRVRJTkZPLCh2b2lkICopJmluZm8pOwoJaWYocmV0IDwgMCkKCXsKCQlwcmludGYoImNhbid0IGdldCBpbmZvIGRhdGEhICglZClcbiIsIHJldCk7CgkJcmV0dXJuIC0xOwoJfQoKCXJlbWFpbl9zaXplID0gc2l6ZTsKCW1vdl9vZmZzZXQgPSBvZmZzZXQ7CgoJd2hpbGUocmVtYWluX3NpemUgPiAwKQoJewoJCS8qIG9mZnNldMDMIGJsb2NrILPRvu68rbjpIL7Itci02S4uICovCgkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOwoJCXdyaXRlX3NpemUgLT0gKChtb3Zfb2Zmc2V0ICsgaW5mby5lcmFzZXNpemUpJWluZm8uZXJhc2VzaXplKTsKCgkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLwoJCWlmKCByZW1haW5fc2l6ZSA8IHdyaXRlX3NpemUpCgkJewoJCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7CgkJfQoKCQlwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOwoKCQlyZXQgPSBsc2VlayhmZF9ib29ybG9hZGVyLCBtb3Zfb2Zmc2V0LCBTRUVLX1NFVCk7CgkJaWYocmV0IDwgMCkKCQl7CgkJCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJcmV0ID0gd3JpdGUoZmRfYm9vcmxvYWRlciwgZGF0YSsobW92X29mZnNldC1vZmZzZXQpLCB3cml0ZV9zaXplKTsKCQlpZihyZXQgPCAwKQoJCXsKCQkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQltb3Zfb2Zmc2V0ICs9IHdyaXRlX3NpemU7CgkJcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsKCX0KCglyZXR1cm4gMDsKfQoKaW50IEhNWF9VUEdSQURFX0ZsYXNoX1Jvb3Rmcyh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkKewoJaW50IHJldDsKCXVuc2lnbmVkIGNoYXIgKiBjb21fYnVmOwoJcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOwoKCS8qICovCglpZiAoIGZkX3Jvb3RmcyA9PSAwICkKCXsKCQlmZF9yb290ZnMgPSBvcGVuKEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9Sb290ZnNfTVREKCksIChPX1JEV1IgfCBPX1NZTkMpICk7CgkJaWYoIGZkX3Jvb3RmcyA8IDAgKQoJCXsKCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4gZmRfa2VybmVsIVxuIiApOwoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCXJldCA9IGxzZWVrKGZkX3Jvb3Rmcywgb2Zmc2V0LCBTRUVLX1NFVCk7CglpZihyZXQgPCAwKQoJewoJCXByaW50ZigiZmFpbGVkIHNlZWtpbmcgcG9zaXRpb24hICglZClcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCglyZXQgPSB3cml0ZShmZF9yb290ZnMsIGRhdGEsIHNpemUpOwoJaWYocmV0IDwgMCkKCXsKCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCgkvKiBSZWFkIGFuZCBDb21wYXJlICovCglyZXQgPSBsc2VlayhmZF9yb290ZnMsIG9mZnNldCwgU0VFS19TRVQpOwoJaWYocmV0IDwgMCkKCXsKCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOwoJCXJldHVybiByZXQ7Cgl9CgoJY29tX2J1ZiA9IG1hbGxvYyhzaXplKTsKCWlmIChjb21fYnVmID09IE5VTEwgKQoJewoJCXByaW50ZigibWFsbG9jIGZhaWVkISEhIFxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCXJldCA9IHJlYWQoZmRfcm9vdGZzLCBjb21fYnVmLCBzaXplKTsKCWlmKHJldCA8IDApCgl7CgkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7CgkJcmV0dXJuIHJldDsKCX0KCglpZiAoIG1lbWNtcChkYXRhLCBjb21fYnVmLCBzaXplKSAhPSAwICkKCXsKCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOwoJCXJldHVybiAtMTsKCX0KCglmcmVlKGNvbV9idWYpOwoKCXJldHVybiAwOwoKCn0KCgoKLypAfSovCg==