LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCi8qCiAqIE1NSU8gZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk4IEFuZHJldyBUYXlsb3IKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAwIEVyaWMgUG91ZWNoCiAqLwoKLyogU3RpbGwgdG8gYmUgZG9uZToKICogCSsgY29ycmVjdCBoYW5kbGluZyBvZiBnbG9iYWwvbG9jYWwgSU9Qcm9jcwogKgkrIG1vZGUgb2YgbW1pbyBvYmplY3RzIGlzIG5vdCB1c2VkIChyZWFkIHZzIHdyaXRlIHZzIHJlYWR3cml0ZSkKICoJKyBJTyBidWZmZXJpbmcgaXMgbGltaXRlZCB0byA2NGsKICoJKyBvcHRpbWl6YXRpb24gb2YgaW50ZXJuYWwgYnVmZmVycyAoc2VnIC8gbGluKQogKgkrIGV2ZW4gaW4gMzIgYml0IG9ubHksIGEgc2VnIHB0ciBJTyBidWZmZXIgaXMgYWxsb2NhdGVkIChhZnRlciB0aGlzIGlzIAogKgkgIGZpeGVkLCB3ZSdsbCBoYXZlIGEgcHJvcGVyIDMyLzE2IHNlcGFyYXRpb24pCiAqCSsgdGhyZWFkIHNhZmVuZXNzCiAqCSsgcmVuYW1lIG9wZXJhdGlvbiBpcyBicm9rZW4KICovCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmUvd2luYmFzZTE2LmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJ3aW5lbW0uaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChtbWlvKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgIAltbWlvRG9zSU9Qcm9jICAgICAgICAgICAJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBMUkVTVUxUIG1taW9Eb3NJT1Byb2MoTFBNTUlPSU5GTyBscG1taW9pbmZvLCBVSU5UIHVNZXNzYWdlLCAKCQkJICAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpIAp7CiAgICBMUkVTVUxUCXJldCA9IE1NU1lTRVJSX05PRVJST1I7CgogICAgVFJBQ0UoIiglcCwgJVgsICVsZCwgJWxkKTtcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgIAogICAgc3dpdGNoICh1TWVzc2FnZSkgewogICAgY2FzZSBNTUlPTV9PUEVOOiAKCXsKCSAgICAvKiBQYXJhbWV0ZXJzOgoJICAgICAqIGxQYXJhbTEgPSBzekZpbGVOYW1lIHBhcmFtZXRlciBmcm9tIG1taW9PcGVuCgkgICAgICogbFBhcmFtMiA9IHJlc2VydmVkICh3ZSB1c2UgaXQgZm9yIDE2LWJpdG5lc3MpCgkgICAgICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCgkgICAgICogTk9URTogbERpc2tPZmZzZXQgYXV0b21hdGljYWxseSBzZXQgdG8gemVybwoJICAgICAqLwoJICAgIE9GU1RSVUNUIG9mczsKCSAgICBMUENTVFIgc3pGaWxlTmFtZSA9IChMUENTVFIpbFBhcmFtMTsKCSAgICAKCSAgICBpZiAobHBtbWlvaW5mby0+ZHdGbGFncyAmIE1NSU9fR0VUVEVNUCkgewoJCUZJWE1FKCJNTUlPX0dFVFRFTVAgbm90IGltcGxlbWVudGVkXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DQU5OT1RPUEVOOwoJICAgIH0KCSAgICAKCSAgICAvKiBpZiBmaWxlbmFtZSBOVUxMLCBhc3N1bWUgb3BlbiBmaWxlIGhhbmRsZSBpbiBhZHdJbmZvWzBdICovCgkgICAgaWYgKCFzekZpbGVOYW1lKSB7CgkJaWYgKGxQYXJhbTIpIAoJCSAgICBscG1taW9pbmZvLT5hZHdJbmZvWzBdID0gRklMRV9HZXRIYW5kbGUobHBtbWlvaW5mby0+YWR3SW5mb1swXSk7CgkJYnJlYWs7CgkgICAgfQoJICAgIAoJICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPSAoRFdPUkQpT3BlbkZpbGUoc3pGaWxlTmFtZSwgJm9mcywgCgkJCQkJCSAgICAgbHBtbWlvaW5mby0+ZHdGbGFncyk7CgkgICAgaWYgKGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPT0gLTEpCgkJcmV0ID0gTU1JT0VSUl9DQU5OT1RPUEVOOwoJfQoJYnJlYWs7CiAgICAKICAgIGNhc2UgTU1JT01fQ0xPU0U6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSB3RmxhZ3MgcGFyYW1ldGVyIGZyb20gbW1pb0Nsb3NlCgkgKiBsUGFyYW0yID0gdW51c2VkCgkgKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKCSAqLwoJaWYgKCEobFBhcmFtMSAmIE1NSU9fRkhPUEVOKSkKCSAgICBfbGNsb3NlKChIRklMRSlscG1taW9pbmZvLT5hZHdJbmZvWzBdKTsKCWJyZWFrOwoJICAgIAogICAgY2FzZSBNTUlPTV9SRUFEOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHJlYWQgYnVmZmVyCgkgKiBsUGFyYW0yID0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKCSAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcyByZWFkLCAwIGZvciBFT0YsIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZQoJICoJICAgaW4gd0Vycm9yUmV0KQoJICovCglyZXQgPSBfbHJlYWQoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0sIChIUFNUUilsUGFyYW0xLCAoTE9ORylsUGFyYW0yKTsKCWlmIChyZXQgIT0gLTEpCgkgICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgKz0gcmV0OwoJCglicmVhazsKICAgIAogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDogCgkvKiBubyBpbnRlcm5hbCBidWZmZXJpbmcsIHNvIFdSSVRFRkxVU0ggaGFuZGxlZCBzYW1lIGFzIFdSSVRFICovCgkKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHdyaXRlIGJ1ZmZlcgoJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZSBpbgoJICoJCXdFcnJvclJldCkKCSAqLwoJcmV0ID0gX2h3cml0ZSgoSEZJTEUpbHBtbWlvaW5mby0+YWR3SW5mb1swXSwgKEhQU1RSKWxQYXJhbTEsIChMT05HKWxQYXJhbTIpOwoJaWYgKHJldCAhPSAtMSkKCSAgICBscG1taW9pbmZvLT5sRGlza09mZnNldCArPSByZXQ7CglicmVhazsKICAgIAogICAgY2FzZSBNTUlPTV9TRUVLOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gbmV3IHBvc2l0aW9uCgkgKiBsUGFyYW0yID0gZnJvbSB3aGVuY2UgdG8gc2VlayAoU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKCSAqIFJldHVybnM6IG5ldyBmaWxlIHBvc3Rpb24sIC0xIG9uIGVycm9yCgkgKi8KCXJldCA9IF9sbHNlZWsoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0sIChMT05HKWxQYXJhbTEsIChMT05HKWxQYXJhbTIpOwoJaWYgKHJldCAhPSAtMSkKCSAgICBscG1taW9pbmZvLT5sRGlza09mZnNldCA9IHJldDsKCXJldHVybiByZXQ7CiAgICAKICAgIGNhc2UgTU1JT01fUkVOQU1FOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gb2xkIG5hbWUKCSAqIGxQYXJhbTIgPSBuZXcgbmFtZQoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCgkgKi8KCUZJWE1FKCJNTUlPTV9SRU5BTUUgdW5pbXBsZW1lbnRlZFxuIik7CglyZXR1cm4gTU1JT0VSUl9GSUxFTk9URk9VTkQ7CiAgICAKICAgIGRlZmF1bHQ6CglGSVhNRSgidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CglyZXR1cm4gMDsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgCW1taW9NZW1JT1Byb2MgICAgICAgICAgIAkJW2ludGVybmFsXQogKi8Kc3RhdGljIExSRVNVTFQgbW1pb01lbUlPUHJvYyhMUE1NSU9JTkZPIGxwbW1pb2luZm8sIFVJTlQgdU1lc3NhZ2UsIAoJCQkgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikgCnsKICAgIFRSQUNFKCIoJXAsMHglMDR4LDB4JTA4bHgsMHglMDhseClcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKCiAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CgkKICAgIGNhc2UgTU1JT01fT1BFTjogCgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IGZpbGVuYW1lIChtdXN0IGJlIE5VTEwpCgkgKiBsUGFyYW0yID0gcmVzZXJ2ZWQgKHdlIHVzZSBpdCBmb3IgMTYtYml0bmVzcykKCSAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgoJICogTk9URTogbERpc2tPZmZzZXQgYXV0b21hdGljYWxseSBzZXQgdG8gemVybwoJICovCgkvKiBGSVhNRTogaW8gcHJvYyBzaG91bGRuJ3QgY2hhbmdlIGl0ICovCglpZiAoIShscG1taW9pbmZvLT5kd0ZsYWdzICYgTU1JT19DUkVBVEUpKQoJICAgIGxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPSBscG1taW9pbmZvLT5wY2hFbmRXcml0ZTsKCXJldHVybiAwOwoJCiAgICBjYXNlIE1NSU9NX0NMT1NFOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gd0ZsYWdzIHBhcmFtZXRlciBmcm9tIG1taW9DbG9zZQoJICogbFBhcmFtMiA9IHVudXNlZAoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCgkgKi8KCXJldHVybiAwOwoJCiAgICBjYXNlIE1NSU9NX1JFQUQ6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gcmVhZCBidWZmZXIKCSAqIGxQYXJhbTIgPSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIDAgZm9yIEVPRiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlCgkgKgkgICBpbiB3RXJyb3JSZXQpCgkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAoJICovCglGSVhNRSgiTU1JT01fUkVBRCBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gMDsKICAgIAogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDogCgkvKiBubyBpbnRlcm5hbCBidWZmZXJpbmcsIHNvIFdSSVRFRkxVU0ggaGFuZGxlZCBzYW1lIGFzIFdSSVRFICovCgkKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHdyaXRlIGJ1ZmZlcgoJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZSBpbgoJICoJCXdFcnJvclJldCkKCSAqIE5PVEU6IGxEaXNrT2Zmc2V0IHNob3VsZCBiZSB1cGRhdGVkCgkgKi8KCUZJWE1FKCJNTUlPTV9XUklURSBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gMDsKICAgIAogICAgY2FzZSBNTUlPTV9TRUVLOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gbmV3IHBvc2l0aW9uCgkgKiBsUGFyYW0yID0gZnJvbSB3aGVuY2UgdG8gc2VlayAoU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKCSAqIFJldHVybnM6IG5ldyBmaWxlIHBvc3Rpb24sIC0xIG9uIGVycm9yCgkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAoJICovCglGSVhNRSgiTU1JT01fU0VFSyBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gLTE7CiAgICAKICAgIGRlZmF1bHQ6CglGSVhNRSgidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CglyZXR1cm4gMDsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCgplbnVtIG1taW9Qcm9jVHlwZSB7TU1JT19QUk9DXzE2LE1NSU9fUFJPQ18zMkEsTU1JT19QUk9DXzMyV307CgpzdHJ1Y3QgSU9Qcm9jTGlzdAp7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCpwTmV4dDsgICAgICAgLyogTmV4dCBpdGVtIGluIGxpbmtlZCBsaXN0ICovCiAgICBGT1VSQ0MgICAgICAgICAgICBmb3VyQ0M7ICAgICAgLyogZm91ci1jaGFyYWN0ZXIgY29kZSBpZGVudGlmeWluZyBJT1Byb2MgKi8KICAgIExQTU1JT1BST0MJICAgICAgcElPUHJvYzsgICAgIC8qIHBvaW50ZXIgdG8gSVByb2MgKi8KICAgIGVudW0gbW1pb1Byb2NUeXBlIHR5cGU7ICAgICAgICAvKiAxNiwgMzJBIG9yIDMyVyAqLwogICAgaW50CQkgICAgICBjb3VudDsJICAgLyogbnVtYmVyIG9mIG9iamVjdHMgbGlua2VkIHRvIGl0ICovCn07CgovKiBUaGlzIGFycmF5IHdpbGwgYmUgdGhlIGVudGlyZSBsaXN0IGZvciBtb3N0IGFwcHMgKi8KCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCBkZWZhdWx0UHJvY3NbXSA9IHsKICAgIHsmZGVmYXVsdFByb2NzWzFdLCBGT1VSQ0NfRE9TLCAoTFBNTUlPUFJPQyltbWlvRG9zSU9Qcm9jLCBNTUlPX1BST0NfMzJBLCAwfSwKICAgIHtOVUxMLCAgICAgICAgICAgICBGT1VSQ0NfTUVNLCAoTFBNTUlPUFJPQyltbWlvTWVtSU9Qcm9jLCBNTUlPX1BST0NfMzJBLCAwfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCoJcElPUHJvY0xpc3RBbmNob3IgPSAmZGVmYXVsdFByb2NzWzBdOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fRmluZFByb2NOb2RlIAkJCVtJTlRFUk5BTF0KICoKICogRmluZHMgdGhlIFByb2NMaXN0IG5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRk9VUkNDIGNvZGUuCiAqLwpzdGF0aWMgc3RydWN0IElPUHJvY0xpc3QqCU1NSU9fRmluZFByb2NOb2RlKEZPVVJDQyBmY2NJT1Byb2MpIAp7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCoJcExpc3ROb2RlOwoKICAgIGZvciAocExpc3ROb2RlID0gcElPUHJvY0xpc3RBbmNob3I7IHBMaXN0Tm9kZTsgcExpc3ROb2RlID0gcExpc3ROb2RlLT5wTmV4dCkgewoJaWYgKHBMaXN0Tm9kZS0+Zm91ckNDID09IGZjY0lPUHJvYykgewoJICAgIHJldHVybiBwTGlzdE5vZGU7Cgl9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fSW5zdGFsbElPUHJvYyAJCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMgTFBNTUlPUFJPQyBNTUlPX0luc3RhbGxJT1Byb2MoRk9VUkNDIGZjY0lPUHJvYywgTFBNTUlPUFJPQyBwSU9Qcm9jLAoJCQkJICAgICBEV09SRCBkd0ZsYWdzLCBlbnVtIG1taW9Qcm9jVHlwZSB0eXBlKQp7CiAgICBMUE1NSU9QUk9DCSAgICAgICAgbHBQcm9jID0gTlVMTDsKICAgIHN0cnVjdCBJT1Byb2NMaXN0KiAgcExpc3ROb2RlOwogICAgc3RydWN0IElPUHJvY0xpc3QqKiBwcExpc3ROb2RlOwoKICAgIFRSQUNFKCIoJWxkLCAlcCwgJTA4bFgsICVpKVxuIiwgZmNjSU9Qcm9jLCBwSU9Qcm9jLCBkd0ZsYWdzLCB0eXBlKTsKCiAgICBpZiAoZHdGbGFncyAmIE1NSU9fR0xPQkFMUFJPQykKCUZJWE1FKCJHbG9iYWwgcHJvY2VkdXJlcyBub3QgaW1wbGVtZW50ZWRcbiIpOwoKICAgIC8qIGp1c3QgaGFuZGxlIHRoZSBrbm93biBwcm9jZWR1cmVzIGZvciBub3cgKi8KICAgIHN3aXRjaCAoZHdGbGFncyAmIChNTUlPX0lOU1RBTExQUk9DfE1NSU9fUkVNT1ZFUFJPQ3xNTUlPX0ZJTkRQUk9DKSkgewogICAgY2FzZSBNTUlPX0lOU1RBTExQUk9DOgoJLyogQ3JlYXRlIG5ldyBlbnRyeSBmb3IgdGhlIElPUHJvYyBsaXN0ICovCglwTGlzdE5vZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpwTGlzdE5vZGUpKTsKCWlmIChwTGlzdE5vZGUpIHsKCSAgICAvKiBGaWxsIGluIHRoaXMgbm9kZSAqLwoJICAgIHBMaXN0Tm9kZS0+Zm91ckNDID0gZmNjSU9Qcm9jOwoJICAgIHBMaXN0Tm9kZS0+cElPUHJvYyA9IHBJT1Byb2M7CgkgICAgcExpc3ROb2RlLT50eXBlID0gdHlwZTsKCSAgICAKCSAgICAvKiBTdGljayBpdCBvbiB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCgkgICAgcExpc3ROb2RlLT5wTmV4dCA9IHBJT1Byb2NMaXN0QW5jaG9yOwoJICAgIHBJT1Byb2NMaXN0QW5jaG9yID0gcExpc3ROb2RlOwoJICAgIAoJICAgIC8qIFJldHVybiB0aGlzIElPUHJvYyAtIHRoYXQncyBob3cgdGhlIGNhbGxlciBrbm93cyB3ZSBzdWNjZWVkZWQgKi8KCSAgICBscFByb2MgPSBwSU9Qcm9jOwoJfSAKCWJyZWFrOwoJICAgICAgICAgIAogICAgY2FzZSBNTUlPX1JFTU9WRVBST0M6CgkvKiAKCSAqIFNlYXJjaCBmb3IgdGhlIG5vZGUgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gcmVtb3ZlIC0gbm90ZQoJICogdGhhdCB0aGlzIG1ldGhvZCB3b24ndCBmaW5kIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0LCBidXQKCSAqIHNpbmNlIHRoZSBmaXJzdCB0d28gaXRlbXMgb24gdGhpcyBsaXN0IGFyZSBvbmVzIHdlIHdvbid0CgkgKiBsZXQgdGhlIHVzZXIgZGVsZXRlIGFueXdheSwgdGhhdCdzIG9rYXkKCSAqLwkgICAgCglwcExpc3ROb2RlID0gJnBJT1Byb2NMaXN0QW5jaG9yOwoJd2hpbGUgKCgqcHBMaXN0Tm9kZSkgJiYgKCpwcExpc3ROb2RlKS0+Zm91ckNDICE9IGZjY0lPUHJvYykKCSAgICBwcExpc3ROb2RlID0gJigoKnBwTGlzdE5vZGUpLT5wTmV4dCk7CgoJaWYgKCpwcExpc3ROb2RlKSB7IC8qIGZvdW5kIGl0ICovCgkgICAgLyogRklYTUU6IHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgYW4gb3BlbiBtbWlvIG9iamVjdCB1c2VzIHRoaXMgcHJvYyA/CgkgICAgICogc2hhbGwgd2UgcmV0dXJuIGFuIGVycm9yLCBudWtlIHRoZSBtbWlvIG9iamVjdCA/CgkgICAgICovCgkgICAgaWYgKCgqcHBMaXN0Tm9kZSktPmNvdW50KSB7CgkJRVJSKCJDYW5ub3QgcmVtb3ZlIGEgbW1JT1Byb2Mgd2hpbGUgaW4gdXNlXG4iKTsKCQlicmVhazsKCSAgICB9CgkgICAgLyogcmVtb3ZlIGl0LCBidXQgb25seSBpZiBpdCBpc24ndCBidWlsdGluICovCgkgICAgaWYgKCgqcHBMaXN0Tm9kZSkgPj0gZGVmYXVsdFByb2NzICYmIAoJCSgqcHBMaXN0Tm9kZSkgPCBkZWZhdWx0UHJvY3MgKyBzaXplb2YoZGVmYXVsdFByb2NzKSkgewoJCVdBUk4oIlRyaWVkIHRvIHJlbW92ZSBidWlsdC1pbiBtbWlvIHByb2MuIFNraXBwaW5nXG4iKTsKCSAgICB9IGVsc2UgewoJCS8qIE9rYXksIG51a2UgaXQgKi8KCQlscFByb2MgPSAoKnBwTGlzdE5vZGUpLT5wSU9Qcm9jOwoJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICpwcExpc3ROb2RlKTsKCQkqcHBMaXN0Tm9kZSA9ICgqcHBMaXN0Tm9kZSktPnBOZXh0OwoJICAgIH0KCX0KCWJyZWFrOwoJICAgIAogICAgY2FzZSBNTUlPX0ZJTkRQUk9DOgoJaWYgKChwTGlzdE5vZGUgPSBNTUlPX0ZpbmRQcm9jTm9kZShmY2NJT1Byb2MpKSkgewoJICAgIGxwUHJvYyA9IHBMaXN0Tm9kZS0+cElPUHJvYzsKCX0KCWJyZWFrOwogICAgfQogICAgCiAgICByZXR1cm4gbHBQcm9jOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJCU1NSU9fTWFwMzJUbzE2CQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExSRVNVTFQJTU1JT19NYXAzMlRvMTYoRFdPUkQgd01zZywgTFBBUkFNKiBscDEsIExQQVJBTSogbHAyKQp7CiAgICBzd2l0Y2ggKHdNc2cpIHsKICAgIGNhc2UgTU1JT01fT1BFTjoKCXsKCSAgICB2b2lkKglscCA9IFNFR1BUUl9BTExPQyhzdHJsZW4oKExQU1RSKSpscDEpICsgMSk7CgkgICAgaWYgKCFscCkgcmV0dXJuIE1NU1lTRVJSX05PTUVNOwoJICAgCgkgICAgc3RyY3B5KCh2b2lkKilTRUdQVFJfR0VUKGxwKSwgKExQU1RSKSpscDEpOwoJICAgICpscDEgPSAoTFBBUkFNKWxwOwoJfQoJYnJlYWs7CiAgICBjYXNlIE1NSU9NX0NMT1NFOgogICAgY2FzZSBNTUlPTV9TRUVLOgoJLyogbm90aGluZyB0byBkbyAqLwoJYnJlYWs7CiAgICBjYXNlIE1NSU9NX1JFQUQ6CiAgICBjYXNlIE1NSU9NX1dSSVRFOgogICAgY2FzZSBNTUlPTV9XUklURUZMVVNIOgoJewoJICAgIHZvaWQqCWxwID0gU0VHUFRSX0FMTE9DKCpscDIpOwoJICAgIGlmICghbHApIHJldHVybiBNTVNZU0VSUl9OT01FTTsKCSAgIAoJICAgIGlmICh3TXNnICE9IE1NSU9NX1JFQUQpCgkJbWVtY3B5KCh2b2lkKilTRUdQVFJfR0VUKGxwKSwgKHZvaWQqKSpscDEsICpscDIpOwoJICAgICpscDEgPSAoTFBBUkFNKWxwOwoJfQoJYnJlYWs7CiAgICBkZWZhdWx0OgoJVFJBQ0UoIk5vdCBhIG1hcHBhYmxlIG1lc3NhZ2UgKCVsZClcbiIsIHdNc2cpOwogICAgfQogICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgIAlNTUlPX1VuTWFwMzJUbzE2IAkJCVtJTlRFUk5BTF0KICovCnN0YXRpYyBMUkVTVUxUCU1NSU9fVW5NYXAzMlRvMTYoRFdPUkQgd01zZywgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yLAoJCQkJIExQQVJBTSBscDEsIExQQVJBTSBscDIpCnsKICAgIHN3aXRjaCAod01zZykgewogICAgY2FzZSBNTUlPTV9PUEVOOgoJaWYgKCFTRUdQVFJfRlJFRSgodm9pZCopbHAxKSkgewoJICAgIEZJWE1FKCJiYWQgZnJlZSBsaW5lPSVkXG4iLCBfX0xJTkVfXyk7Cgl9IAoJYnJlYWs7CiAgICBjYXNlIE1NSU9NX0NMT1NFOgogICAgY2FzZSBNTUlPTV9TRUVLOgoJLyogbm90aGluZyB0byBkbyAqLwoJYnJlYWs7CiAgICBjYXNlIE1NSU9NX1JFQUQ6CgltZW1jcHkoKHZvaWQqKWxQYXJhbTEsICh2b2lkKilTRUdQVFJfR0VUKCh2b2lkKilscDEpLCBscDIpOwoJLyogZmFsbCB0aHJ1ICovCiAgICBjYXNlIE1NSU9NX1dSSVRFOgogICAgY2FzZSBNTUlPTV9XUklURUZMVVNIOgoJaWYgKCFTRUdQVFJfRlJFRSgodm9pZCopbHAxKSkgewoJICAgIEZJWE1FKCJiYWQgZnJlZSBsaW5lPSVkXG4iLCBfX0xJTkVfXyk7Cgl9IAoJYnJlYWs7CiAgICBkZWZhdWx0OgoJVFJBQ0UoIk5vdCBhIG1hcHBhYmxlIG1lc3NhZ2UgKCVsZClcbiIsIHdNc2cpOwogICAgfQogICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgIAlNTUlPX0dlbmVyYXRlSW5mb0ZvcklPUHJvYyAJCVtJTlRFUk5BTF0KICovCnN0YXRpYwlTRUdQVFIJTU1JT19HZW5lcmF0ZUluZm9Gb3JJT1Byb2MoY29uc3QgV0lORV9NTUlPKiB3bSkKewogICAgU0VHUFRSCQlscCA9IChTRUdQVFIpU0VHUFRSX0FMTE9DKHNpemVvZihNTUlPSU5GTzE2KSk7CiAgICBMUE1NSU9JTkZPMTYJbW1pb0luZm8xNiA9IChMUE1NSU9JTkZPMTYpU0VHUFRSX0dFVCgodm9pZCopbHApOwoKICAgIG1lbXNldChtbWlvSW5mbzE2LCAwLCBzaXplb2YoTU1JT0lORk8xNikpOwoKICAgIG1taW9JbmZvMTYtPmxEaXNrT2Zmc2V0ID0gd20tPmluZm8ubERpc2tPZmZzZXQ7ICAgIAogICAgbW1pb0luZm8xNi0+YWR3SW5mb1swXSAgPSB3bS0+aW5mby5hZHdJbmZvWzBdOwogICAgbW1pb0luZm8xNi0+YWR3SW5mb1sxXSAgPSB3bS0+aW5mby5hZHdJbmZvWzFdOwogICAgbW1pb0luZm8xNi0+YWR3SW5mb1syXSAgPSB3bS0+aW5mby5hZHdJbmZvWzJdOwogICAgbW1pb0luZm8xNi0+YWR3SW5mb1szXSAgPSB3bS0+aW5mby5hZHdJbmZvWzNdOwoKICAgIHJldHVybiBscDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fVXBkYXRlSW5mb0ZvcklPUHJvYwkJW0lOVEVSTkFMXQogKi8Kc3RhdGljCUxSRVNVTFQgTU1JT19VcGRhdGVJbmZvRm9ySU9Qcm9jKFdJTkVfTU1JTyogd20sIFNFR1BUUiBzZWdtbWlvSW5mbzE2KQp7CiAgICBjb25zdCBNTUlPSU5GTzE2KgltbWlvSW5mbzE2OwoKICAgIG1taW9JbmZvMTYgPSAoY29uc3QgTU1JT0lORk8xNiopU0VHUFRSX0dFVCgodm9pZCopc2VnbW1pb0luZm8xNik7CgogICAgd20tPmluZm8ubERpc2tPZmZzZXQgPSBtbWlvSW5mbzE2LT5sRGlza09mZnNldDsKICAgIHdtLT5pbmZvLmFkd0luZm9bMF0gID0gbW1pb0luZm8xNi0+YWR3SW5mb1swXTsKICAgIHdtLT5pbmZvLmFkd0luZm9bMV0gID0gbW1pb0luZm8xNi0+YWR3SW5mb1sxXTsKICAgIHdtLT5pbmZvLmFkd0luZm9bMl0gID0gbW1pb0luZm8xNi0+YWR3SW5mb1syXTsKICAgIHdtLT5pbmZvLmFkd0luZm9bM10gID0gbW1pb0luZm8xNi0+YWR3SW5mb1szXTsKCiAgICBpZiAoIVNFR1BUUl9GUkVFKCh2b2lkKilzZWdtbWlvSW5mbzE2KSkgewoJRklYTUUoImJhZCBmcmVlIGxpbmU9JWRcbiIsIF9fTElORV9fKTsKICAgIH0gCgogICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgIAlNTUlPX1NlbmRNZXNzYWdlCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExSRVNVTFQJTU1JT19TZW5kTWVzc2FnZShMUFdJTkVfTU1JTyB3bSwgRFdPUkQgd01zZywgTFBBUkFNIGxQYXJhbTEsIAoJCQkJIExQQVJBTSBsUGFyYW0yLCBlbnVtIG1taW9Qcm9jVHlwZSB0eXBlKQp7CiAgICBMUkVTVUxUIAkJcmVzdWx0OwogICAgU0VHUFRSCQlzZWdtbWlvSW5mbzE2OwogICAgTFBBUkFNCQlscDEgPSBsUGFyYW0xLCBscDIgPSBsUGFyYW0yOwoKICAgIGlmICghd20tPmlvUHJvYyB8fCAhd20tPmluZm8ucElPUHJvYykgewoJRVJSKCJicnJyXG4iKTsKCXJlc3VsdCA9IE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICB9CgogICAgc3dpdGNoICh3bS0+aW9Qcm9jLT50eXBlKSB7CiAgICBjYXNlIE1NSU9fUFJPQ18xNjoKCXNlZ21taW9JbmZvMTYgPSBNTUlPX0dlbmVyYXRlSW5mb0ZvcklPUHJvYyh3bSk7CglpZiAod20tPmlvUHJvYy0+dHlwZSAhPSB0eXBlKSB7CgkgICAgLyogbWFwIChsUGFyYW0xLCBsUGFyYW0yKSBpbnRvIChscDEsIGxwMikgMzI9PjE2ICovCgkgICAgaWYgKChyZXN1bHQgPSBNTUlPX01hcDMyVG8xNih3TXNnLCAmbHAxLCAmbHAyKSkgIT0gTU1TWVNFUlJfTk9FUlJPUikKCQlyZXR1cm4gcmVzdWx0OwoJfQoJLyogRklYTUU6IGlzIHdtLT5pbmZvLnBJT1Byb2MgYSBzZWdtZW50ZWQgb3IgYSBsaW5lYXIgYWRkcmVzcyA/CgkgKiBzb3VuZHMgdG8gbWUgaXQncyBhIHNlZ21lbnRlZCBvbmUsIHNob3VsZCB1c2UgYSB0aHVuayBzb21ld2hlcmUKCSAqLwoJcmVzdWx0ID0gKChMUE1NSU9QUk9DMTYpd20tPmluZm8ucElPUHJvYykoKExQU1RSKXNlZ21taW9JbmZvMTYsIAoJCQkJCQkgIHdNc2csIGxwMSwgbHAyKTsKCQoJaWYgKHdtLT5pb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIE1NSU9fVW5NYXAzMlRvMTYod01zZywgbFBhcmFtMSwgbFBhcmFtMiwgbHAxLCBscDIpOwoJfQoJTU1JT19VcGRhdGVJbmZvRm9ySU9Qcm9jKHdtLCBzZWdtbWlvSW5mbzE2KTsKCWJyZWFrOwogICAgY2FzZSBNTUlPX1BST0NfMzJBOgogICAgY2FzZSBNTUlPX1BST0NfMzJXOgoJaWYgKHdtLT5pb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIG1hcCAobFBhcmFtMSwgbFBhcmFtMikgaW50byAobHAxLCBscDIpIDE2PT4zMiAqLwoJICAgIFdBUk4oIk5JWVxuIik7Cgl9CglyZXN1bHQgPSAod20tPmluZm8ucElPUHJvYykoKExQU1RSKSZ3bS0+aW5mbywgd01zZywgbHAxLCBscDIpOwoJCiNpZiAwCglpZiAod20tPmlvUHJvYy0+dHlwZSAhPSB0eXBlKSB7CgkgICAgLyogdW5tYXAgKGxQYXJhbTEsIGxQYXJhbTIpIGludG8gKGxwMSwgbHAyKSAxNj0+MzIgKi8KCX0KI2VuZGlmCglicmVhazsKICAgIGRlZmF1bHQ6ICAKCUZJWE1FKCJJbnRlcm5hbCBlcnJvclxuIik7CglyZXN1bHQgPSBNTVNZU0VSUl9FUlJPUjsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAJCQlNTUlPX1BhcnNlRXh0IAkJICAgICAgICBbaW50ZXJuYWxdCiAqCiAqIFBhcnNlcyBhIGZpbGVuYW1lIGZvciB0aGUgZXh0ZW5zaW9uLgogKgogKiBSRVRVUk5TCiAqICBUaGUgRk9VUkNDIGNvZGUgZm9yIHRoZSBleHRlbnNpb24gaWYgZm91bmQsIGVsc2UgMC4KICovCnN0YXRpYyBGT1VSQ0MgTU1JT19QYXJzZUV4dChMUENTVFIgc3pGaWxlTmFtZSkKewogICAgLyogRmlsZW5hbWVzIGFyZSBvZiB0aGUgZm9ybSBmaWxlLmV4dCtBQkMKICAgICAgIEZJWE1FOiBXaGF0IGlmIGEgJysnIGlzIHBhcnQgb2YgdGhlIGZpbGUgbmFtZT8KICAgICAgIEZvciBub3csIHdlIHRha2UgdGhlIGxhc3QgJysnIHByZXNlbnQgKi8KICAgIAogICAgRk9VUkNDIHJldCA9IDA7CiAgICAKICAgIC8qIE5vdGUgdGhhdCBleHR7U3RhcnQsRW5kfSBwb2ludCB0byB0aGUgLiBhbmQgKyByZXNwZWN0aXZlbHkgKi8KICAgIExQU1RSIGV4dEVuZDsKICAgIAogICAgVFJBQ0UoIiglcylcbiIsZGVidWdzdHJfYShzekZpbGVOYW1lKSk7CiAgICAKICAgIGV4dEVuZCA9IHN0cnJjaHIoc3pGaWxlTmFtZSwnKycpOwogICAgaWYgKGV4dEVuZCkgewoJLyogTmVlZCB0byBwYXJzZSB0byBmaW5kIHRoZSBleHRlbnNpb24gKi8KCUxQU1RSIGV4dFN0YXJ0OwoJCglleHRTdGFydCA9IGV4dEVuZDsKCXdoaWxlIChleHRTdGFydCA+IHN6RmlsZU5hbWUgJiYgZXh0U3RhcnRbMF0gIT0gJy4nKSB7CgkgICAgZXh0U3RhcnQtLTsKCX0KCQoJaWYgKGV4dFN0YXJ0ID09IHN6RmlsZU5hbWUpIHsKCSAgICBFUlIoIisgYnV0IG5vIC4gaW4gc3pGaWxlTmFtZTogJXNcbiIsIGRlYnVnc3RyX2Eoc3pGaWxlTmFtZSkpOwoJfSBlbHNlIHsKCSAgICBDSEFSIGV4dFs1XTsKCSAgICAKCSAgICBpZiAoZXh0RW5kIC0gZXh0U3RhcnQgLSAxID4gNCkKCQlXQVJOKCJFeHRlbnNpb24gbGVuZ3RoID4gNFxuIik7CgkgICAgbHN0cmNweW5BKGV4dCxleHRTdGFydCArIDEsbWluKGV4dEVuZC1leHRTdGFydCw1KSk7CgkgICAgVFJBQ0UoIkdvdCBleHRlbnNpb246ICVzXG4iLCBkZWJ1Z3N0cl9hKGV4dCkpOwoJICAgIC8qIEZPVVJDQyBjb2RlcyBpZGVudGlmeWluZyBmaWxlLWV4dGVudGlvbnMgbXVzdCBiZSB1cHBlcmNhc2UgKi8KCSAgICByZXQgPSBtbWlvU3RyaW5nVG9GT1VSQ0NBKGV4dCwgTU1JT19UT1VQUEVSKTsKCX0KICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlNTUlPX0dldAkJCVtpbnRlcm5hbF0KICoKICogUmV0aXJpZXZlcyBmcm9tIGN1cnJlbnQgcHJvY2VzcyB0aGUgbW1pbyBvYmplY3QKICovCnN0YXRpYwlMUFdJTkVfTU1JTwlNTUlPX0dldChMUFdJTkVfTU1fSURBVEEgaURhdGEsIEhNTUlPIGgpCnsKICAgIExQV0lORV9NTUlPCQl3bSA9IE5VTEw7CgogICAgaWYgKCFpRGF0YSkgaURhdGEgPSBNVUxUSU1FRElBX0dldElEYXRhKCk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmlEYXRhLT5jcyk7CiAgICBmb3IgKHdtID0gaURhdGEtPmxwTU1JTzsgd207IHdtID0gd20tPmxwTmV4dCkgewoJaWYgKHdtLT5pbmZvLmhtbWlvID09IGgpCgkgICAgYnJlYWs7CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKICAgIHJldHVybiB3bTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCU1NSU9fQ3JlYXRlCQkJW2ludGVybmFsXQogKgogKiBDcmVhdGVzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBhIG1taW8gaW5zdGFuY2UKICovCnN0YXRpYwlMUFdJTkVfTU1JTwkJTU1JT19DcmVhdGUodm9pZCkKewogICAgc3RhdGljCVdPUkQJTU1JT19jb3VudGVyID0gMDsKICAgIExQV0lORV9NTUlPCQl3bTsKICAgIExQV0lORV9NTV9JREFUQQlpRGF0YSA9IE1VTFRJTUVESUFfR2V0SURhdGEoKTsKCiAgICB3bSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoV0lORV9NTUlPKSk7CiAgICBpZiAod20pIHsKCUVudGVyQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwoJd2hpbGUgKE1NSU9fR2V0KGlEYXRhLCArK01NSU9fY291bnRlcikpOwoJd20tPmluZm8uaG1taW8gPSBNTUlPX2NvdW50ZXI7Cgl3bS0+bHBOZXh0ID0gaURhdGEtPmxwTU1JTzsKCWlEYXRhLT5scE1NSU8gPSB3bTsKCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwogICAgfQogICAgcmV0dXJuIHdtOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJTU1JT19EZXN0cm95CQkJW2ludGVybmFsXQogKi0KICogRGVzdHJveXMgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gZm9yIGEgbW1pbyBpbnN0YW5jZQogKi8Kc3RhdGljCUJPT0wJCU1NSU9fRGVzdHJveShMUFdJTkVfTU1JTyB3bSkKewogICAgTFBXSU5FX01NX0lEQVRBCWlEYXRhID0gTVVMVElNRURJQV9HZXRJRGF0YSgpOwogICAgTFBXSU5FX01NSU8qCW07CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmlEYXRhLT5jcyk7CiAgICBmb3IgKG0gPSAmKGlEYXRhLT5scE1NSU8pOyAqbSAmJiAqbSAhPSB3bTsgbSA9ICYoKm0pLT5scE5leHQpOwogICAgaWYgKCptKSB7CgkqbSA9ICgqbSktPmxwTmV4dDsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICptKTsKCXdtID0gTlVMTDsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwogICAgcmV0dXJuIHdtID8gRkFMU0UgOiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJCU1NSU9fRmx1c2ggCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljCUxSRVNVTFQJTU1JT19GbHVzaChXSU5FX01NSU8qIHdtLCBVSU5UIHVGbGFncykKewogICAgaWYgKCghd20tPmluZm8uY2NoQnVmZmVyKSB8fCAod20tPmluZm8uZmNjSU9Qcm9jID09IEZPVVJDQ19NRU0pKSB7CglyZXR1cm4gMDsKICAgIH0KCiAgICAvKiBub3QgcXVpdGUgc3VyZSB3aGF0IHRvIGRvIGhlcmUsIGJ1dCBJJ2xsIGd1ZXNzICovCiAgICBpZiAod20tPmluZm8uZHdGbGFncyAmIE1NSU9fRElSVFkpIHsKCU1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIHdtLT5pbmZvLmxCdWZPZmZzZXQsCgkJCSBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSk7CglNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9XUklURSwgKExQQVJBTSl3bS0+aW5mby5wY2hCdWZmZXIsCgkJCSB3bS0+aW5mby5wY2hOZXh0IC0gd20tPmluZm8ucGNoQnVmZmVyLCBNTUlPX1BST0NfMzJBKTsKCXdtLT5pbmZvLmR3RmxhZ3MgJj0gfk1NSU9fRElSVFk7CiAgICB9CiAgICBpZiAodUZsYWdzICYgTU1JT19FTVBUWUJVRikgewoJd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKCXdtLT5pbmZvLnBjaEVuZFJlYWQgPSB3bS0+aW5mby5wY2hCdWZmZXI7Cgl3bS0+aW5mby5wY2hFbmRXcml0ZSA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX0dyYWJOZXh0QnVmZmVyCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExPTkcJTU1JT19HcmFiTmV4dEJ1ZmZlcihMUFdJTkVfTU1JTyB3bSwgaW50IGZvcl9yZWFkKQp7CiAgICBMT05HCXNpemUgPSB3bS0+aW5mby5jY2hCdWZmZXI7CgogICAgVFJBQ0UoImJvPSVseCBkbz0lbHggb2Y9JWx4XG4iLCAKCSAgd20tPmluZm8ubEJ1Zk9mZnNldCwgd20tPmluZm8ubERpc2tPZmZzZXQsIAoJICBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCAwLCBTRUVLX0NVUiwgTU1JT19QUk9DXzMyQSkpOwoJICAKICAgIHdtLT5pbmZvLmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIHdtLT5pbmZvLnBjaE5leHQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kV3JpdGUgPSB3bS0+aW5mby5wY2hCdWZmZXI7CgogICAgaWYgKGZvcl9yZWFkKSB7CglzaXplID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fUkVBRCwgKExQQVJBTSl3bS0+aW5mby5wY2hCdWZmZXIsCgkJCQlzaXplLCBNTUlPX1BST0NfMzJBKTsKCWlmIChzaXplID4gMCkKCSAgICB3bS0+aW5mby5wY2hFbmRSZWFkICs9IHNpemU7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJCU1NSU9fU2V0QnVmZmVyIAkJCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMJVUlOVAlNTUlPX1NldEJ1ZmZlcihXSU5FX01NSU8qIHdtLCB2b2lkKiBwY2hCdWZmZXIsIExPTkcgY2NoQnVmZmVyLCAKCQkJICAgICAgIFVJTlQgdUZsYWdzLCBCT09MIGJGcm9tMzIpCnsKICAgIFRSQUNFKCIoJXAgJXAgJWxkICV1ICVkKVxuIiwgd20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MsIGJGcm9tMzIpOwoKICAgIGlmICh1RmxhZ3MpCQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICBpZiAoY2NoQnVmZmVyID4gMHhGRkZGKSB7CglGSVhNRSgiTm90IGhhbmRsaW5nIGh1Z2UgbW1pbyBidWZmZXJzIHlldCAoJWxkID49IDY0aylcbiIsIGNjaEJ1ZmZlcik7CglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgIH0KCQogICAgaWYgKE1NSU9fRmx1c2god20sIE1NSU9fRU1QVFlCVUYpICE9IDApCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKICAgIAogICAgaWYgKCghY2NoQnVmZmVyIHx8IHBjaEJ1ZmZlcikgJiYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0FMTE9DQlVGKSkgewoJR2xvYmFsVW5sb2NrMTYod20tPmhNZW0pOwoJR2xvYmFsRnJlZTE2KHdtLT5oTWVtKTsKCXdtLT5pbmZvLmR3RmxhZ3MgJj0gfk1NSU9fQUxMT0NCVUY7CiAgICB9CiAgICBpZiAocGNoQnVmZmVyKSB7CglpZiAoYkZyb20zMikgewoJICAgIHdtLT5pbmZvLnBjaEJ1ZmZlciA9IHBjaEJ1ZmZlcjsKCSAgICB3bS0+YnVmZmVyMTYgPSAwOwoJfSBlbHNlIHsKCSAgICB3bS0+aW5mby5wY2hCdWZmZXIgPSBQVFJfU0VHX1RPX0xJTihwY2hCdWZmZXIpOwoJICAgIHdtLT5idWZmZXIxNiA9IChTRUdQVFIpcGNoQnVmZmVyOwoJfQoJd20tPmhNZW0gPSAwOwogICAgfSBlbHNlIGlmIChjY2hCdWZmZXIgJiYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0FMTE9DQlVGKSkgewoJSEdMT0JBTDE2IGhOZXdCdWY7CglHbG9iYWxVbmxvY2sxNih3bS0+aE1lbSk7CgloTmV3QnVmID0gR2xvYmFsUmVBbGxvYzE2KHdtLT5oTWVtLCBjY2hCdWZmZXIsIDApOwoJaWYgKCFoTmV3QnVmKSB7CgkgICAgLyogRklYTUU6IHRoaXMgYXNzdW1lcyB0aGUgbWVtb3J5IGJsb2NrIGRpZG4ndCBtb3ZlICovCgkgICAgR2xvYmFsTG9jazE2KHdtLT5oTWVtKTsKCSAgICByZXR1cm4gTU1JT0VSUl9PVVRPRk1FTU9SWTsKCX0KCXdtLT5oTWVtID0gaE5ld0J1ZjsKICAgIH0gZWxzZSBpZiAoY2NoQnVmZmVyKSB7CglpZiAoISh3bS0+aE1lbSA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgY2NoQnVmZmVyKSkpCgkgICAgcmV0dXJuIE1NSU9FUlJfT1VUT0ZNRU1PUlk7Cgl3bS0+aW5mby5kd0ZsYWdzIHw9IE1NSU9fQUxMT0NCVUY7CiAgICB9IGVsc2UgewoJd20tPmluZm8ucGNoQnVmZmVyID0gTlVMTDsKCXdtLT5oTWVtID0gMDsKCXdtLT5idWZmZXIxNiA9IDA7CiAgICB9CgogICAgaWYgKHdtLT5oTWVtKSB7Cgl3bS0+YnVmZmVyMTYgPSBXSU4xNl9HbG9iYWxMb2NrMTYod20tPmhNZW0pOwoJd20tPmluZm8ucGNoQnVmZmVyID0gKHZvaWQqKVBUUl9TRUdfVE9fTElOKCh2b2lkKil3bS0+YnVmZmVyMTYpOwogICAgfQoKICAgIHdtLT5pbmZvLmNjaEJ1ZmZlciA9IGNjaEJ1ZmZlcjsKICAgIHdtLT5pbmZvLnBjaE5leHQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kV3JpdGUgPSB3bS0+aW5mby5wY2hCdWZmZXIgKyBjY2hCdWZmZXI7CiAgICB3bS0+aW5mby5sQnVmT2Zmc2V0ID0gMDsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1NSU9fT3BlbiAgICAgIAkJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgSE1NSU8gTU1JT19PcGVuKExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPKiByZWZtbWluZm8sIAoJCSAgICAgICBEV09SRCBkd09wZW5GbGFncywgZW51bSBtbWlvUHJvY1R5cGUgdHlwZSkKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCIoJyVzJywgJXAsICUwOGxYLCAlZCk7XG4iLCBzekZpbGVOYW1lLCByZWZtbWluZm8sIGR3T3BlbkZsYWdzLCB0eXBlKTsKICAgIAogICAgaWYgKGR3T3BlbkZsYWdzICYgKE1NSU9fUEFSU0V8TU1JT19FWElTVCkpIHsKCWNoYXIJYnVmZmVyW01BWF9QQVRIXTsKCQoJaWYgKEdldEZ1bGxQYXRoTmFtZUEoc3pGaWxlTmFtZSwgc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlciwgTlVMTCkgPj0gc2l6ZW9mKGJ1ZmZlcikpCgkgICAgcmV0dXJuIChITU1JTzE2KUZBTFNFOwoJaWYgKChkd09wZW5GbGFncyAmIE1NSU9fRVhJU1QpICYmIChHZXRGaWxlQXR0cmlidXRlc0EoYnVmZmVyKSA9PSAtMSkpCgkgICAgcmV0dXJuIChITU1JTylGQUxTRTsKCXN0cmNweShzekZpbGVOYW1lLCBidWZmZXIpOwoJcmV0dXJuIChITU1JTylUUlVFOwogICAgfQogICAgCiAgICBpZiAoKHdtID0gTU1JT19DcmVhdGUoKSkgPT0gTlVMTCkKCXJldHVybiAwOwoKICAgIC8qIElmIGJvdGggcGFyYW1zIGFyZSBOVUxMLCB0aGVuIHBhcnNlIHRoZSBmaWxlIG5hbWUgKi8KICAgIGlmIChyZWZtbWluZm8tPmZjY0lPUHJvYyA9PSAwICYmIHJlZm1taW5mby0+cElPUHJvYyA9PSBOVUxMKSB7Cgl3bS0+aW5mby5mY2NJT1Byb2MgPSBNTUlPX1BhcnNlRXh0KHN6RmlsZU5hbWUpOwoJLyogSGFuZGxlIGFueSB1bmhhbmRsZWQvZXJyb3IgY2FzZS4gQXNzdW1lIERPUyBmaWxlICovCglpZiAod20tPmluZm8uZmNjSU9Qcm9jID09IDApCgkgICAgd20tPmluZm8uZmNjSU9Qcm9jID0gRk9VUkNDX0RPUzsKCWlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkgZ290byBlcnJvcjI7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAocmVmbW1pbmZvLT5wSU9Qcm9jID09IE5VTEwpIHsJCgl3bS0+aW5mby5mY2NJT1Byb2MgPSByZWZtbWluZm8tPmZjY0lPUHJvYzsKCWlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkgZ290byBlcnJvcjI7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9IAogICAgLyogaWYgSU8gcHJvYyBzcGVjaWZpZWQsIHVzZSBpdCBhbmQgc3BlY2lmaWVkIGZvdXIgY2hhcmFjdGVyIGNvZGUgKi8KICAgIGVsc2UgewoJd20tPmluZm8uZmNjSU9Qcm9jID0gcmVmbW1pbmZvLT5mY2NJT1Byb2M7Cgl3bS0+aW5mby5wSU9Qcm9jID0gcmVmbW1pbmZvLT5wSU9Qcm9jOwoJTU1JT19JbnN0YWxsSU9Qcm9jKHdtLT5pbmZvLmZjY0lPUHJvYywgd20tPmluZm8ucElPUHJvYywgCgkJCSAgIE1NSU9fSU5TVEFMTFBST0MsIHR5cGUpOwoJaWYgKCEod20tPmlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKHdtLT5pbmZvLmZjY0lPUHJvYykpKSBnb3RvIGVycm9yMjsKCWFzc2VydCh3bS0+aW9Qcm9jLT5wSU9Qcm9jID09IHJlZm1taW5mby0+cElPUHJvYyk7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gVFJVRTsKICAgIH0KICAgIAogICAgd20tPmlvUHJvYy0+Y291bnQrKzsKICAgIGlmIChkd09wZW5GbGFncyAmIE1NSU9fQUxMT0NCVUYpIHsKCWlmICgocmVmbW1pbmZvLT53RXJyb3JSZXQgPSBtbWlvU2V0QnVmZmVyKHdtLT5pbmZvLmhtbWlvLCBOVUxMLCAKCQkJCQkJICBNTUlPX0RFRkFVTFRCVUZGRVIsIDApKSkKCSAgICBnb3RvIGVycm9yMTsKICAgIH0gZWxzZSBpZiAod20tPmluZm8uZmNjSU9Qcm9jID09IEZPVVJDQ19NRU0pIHsKCXJlZm1taW5mby0+d0Vycm9yUmV0ID0gTU1JT19TZXRCdWZmZXIod20sIHJlZm1taW5mby0+cGNoQnVmZmVyLCAKCQkJCQkgICAgICByZWZtbWluZm8tPmNjaEJ1ZmZlciwgMCwgCgkJCQkJICAgICAgdHlwZSAhPSBNTUlPX1BST0NfMTYpOwoJaWYgKHJlZm1taW5mby0+d0Vycm9yUmV0ICE9IE1NU1lTRVJSX05PRVJST1IpCgkgICAgZ290byBlcnJvcjE7CiAgICB9IC8qIGVsc2UgPT4gdW5idWZmZXJlZCwgd20tPmluZm8ucGNoQnVmZmVyID09IE5VTEwgKi8KICAgIAogICAgLyogc2VlIG1taW9Eb3NJT1Byb2MgZm9yIHRoYXQgb25lICovCiAgICB3bS0+aW5mby5hZHdJbmZvWzBdID0gcmVmbW1pbmZvLT5hZHdJbmZvWzBdOwogICAgd20tPmluZm8uZHdGbGFncyA9IGR3T3BlbkZsYWdzOwogICAgCiAgICAvKiBjYWxsIElPIHByb2MgdG8gYWN0dWFsbHkgb3BlbiBmaWxlICovCiAgICByZWZtbWluZm8tPndFcnJvclJldCA9IE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX09QRU4sIChMUEFSQU0pc3pGaWxlTmFtZSwgCgkJCQkJICAgIHR5cGUgPT0gTU1JT19QUk9DXzE2LCBNTUlPX1BST0NfMzJBKTsKICAgIAogICAgaWYgKHJlZm1taW5mby0+d0Vycm9yUmV0ID09IDApCglyZXR1cm4gd20tPmluZm8uaG1taW87CiBlcnJvcjE6CiAgICBpZiAod20tPmlvUHJvYykgd20tPmlvUHJvYy0+Y291bnQtLTsKIGVycm9yMjoKICAgIE1NSU9fRGVzdHJveSh3bSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvT3BlblcgICAgICAgCQlbV0lOTU0uMTIzXQogKi8KSE1NSU8gV0lOQVBJIG1taW9PcGVuVyhMUFdTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8qIGxwbW1pb2luZm8sCgkJICAgICAgIERXT1JEIGR3T3BlbkZsYWdzKQp7CiAgICBITU1JTyAJcmV0OwogICAgTFBTVFIJc3pGbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzekZpbGVOYW1lKTsKCiAgICBpZiAobHBtbWlvaW5mbykgewoJcmV0ID0gTU1JT19PcGVuKHN6Rm4sIGxwbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMzJXKTsKICAgIH0gZWxzZSB7CglNTUlPSU5GTwltbWlvaW5mbzsKCQoJbW1pb2luZm8uZmNjSU9Qcm9jID0gMDsKCW1taW9pbmZvLnBJT1Byb2MgPSBOVUxMOwoJbW1pb2luZm8ucGNoQnVmZmVyID0gTlVMTDsKCW1taW9pbmZvLmNjaEJ1ZmZlciA9IDA7CgkKCXJldCA9IE1NSU9fT3BlbihzekZuLCAmbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMzJXKTsKICAgIH0KCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzekZuKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb09wZW5BICAgICAgIAkJW1dJTk1NLjEyMl0KICovCkhNTUlPIFdJTkFQSSBtbWlvT3BlbkEoTFBTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8qIGxwbW1pb2luZm8sIAoJCSAgICAgICBEV09SRCBkd09wZW5GbGFncykKewogICAgSE1NSU8gCXJldDsKICAgIAogICAgaWYgKGxwbW1pb2luZm8pIHsKCXJldCA9IE1NSU9fT3BlbihzekZpbGVOYW1lLCBscG1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyQSk7CiAgICB9IGVsc2UgewoJTU1JT0lORk8JbW1pb2luZm87CgkKCW1taW9pbmZvLmZjY0lPUHJvYyA9IDA7CgltbWlvaW5mby5wSU9Qcm9jID0gTlVMTDsKCW1taW9pbmZvLnBjaEJ1ZmZlciA9IE5VTEw7CgltbWlvaW5mby5jY2hCdWZmZXIgPSAwOwoJCglyZXQgPSBNTUlPX09wZW4oc3pGaWxlTmFtZSwgJm1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyQSk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9PcGVuICAgICAgIAkJW01NU1lTVEVNLjEyMTBdCiAqLwpITU1JTzE2IFdJTkFQSSBtbWlvT3BlbjE2KExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPMTYqIGxwbW1pb2luZm8xNiwgCgkJCSAgRFdPUkQgZHdPcGVuRmxhZ3MpCnsKICAgIEhNTUlPIAlyZXQ7CiAgICBNTUlPSU5GTwltbWlvOwogICAgCiAgICBpZiAobHBtbWlvaW5mbzE2KSB7CglNTUlPSU5GTwltbWlvaW5mbzsKICAgICAgIAoJbWVtc2V0KCZtbWlvaW5mbywgMCwgc2l6ZW9mKG1taW9pbmZvKSk7CgoJbW1pb2luZm8uZHdGbGFncyAgICAgPSBscG1taW9pbmZvMTYtPmR3RmxhZ3M7IAoJbW1pb2luZm8uZmNjSU9Qcm9jICAgPSBscG1taW9pbmZvMTYtPmZjY0lPUHJvYzsgCgltbWlvaW5mby5wSU9Qcm9jICAgICA9IChMUE1NSU9QUk9DKWxwbW1pb2luZm8xNi0+cElPUHJvYzsgCgltbWlvaW5mby5jY2hCdWZmZXIgICA9IGxwbW1pb2luZm8xNi0+Y2NoQnVmZmVyOyAKCW1taW9pbmZvLnBjaEJ1ZmZlciAgID0gbHBtbWlvaW5mbzE2LT5wY2hCdWZmZXI7CgltbWlvaW5mby5hZHdJbmZvWzBdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1swXTsgCgltbWlvaW5mby5hZHdJbmZvWzFdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1sxXTsgCgltbWlvaW5mby5hZHdJbmZvWzJdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1syXTsgCgltbWlvaW5mby5hZHdJbmZvWzNdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1szXTsgCgkKCXJldCA9IE1NSU9fT3BlbihzekZpbGVOYW1lLCAmbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMTYpOwoKCW1taW9HZXRJbmZvMTYobW1pb2luZm8uaG1taW8sIGxwbW1pb2luZm8xNiwgMCk7CglscG1taW9pbmZvMTYtPndFcnJvclJldCA9IHJldDsKICAgIH0gZWxzZSB7CgltbWlvLmZjY0lPUHJvYyA9IDA7CgltbWlvLnBJT1Byb2MgPSBOVUxMOwoJbW1pby5wY2hCdWZmZXIgPSBOVUxMOwoJbW1pby5jY2hCdWZmZXIgPSAwOwoJcmV0ID0gTU1JT19PcGVuKHN6RmlsZU5hbWUsICZtbWlvLCBkd09wZW5GbGFncywgRkFMU0UpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9DbG9zZSAgICAgIAkJW1dJTk1NLjExNF0KICovCk1NUkVTVUxUIFdJTkFQSSBtbWlvQ2xvc2UoSE1NSU8gaG1taW8sIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKICAgIE1NUkVTVUxUIAlyZXN1bHQ7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA0WCk7XG4iLCBobW1pbywgdUZsYWdzKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKICAgIAogICAgaWYgKChyZXN1bHQgPSBNTUlPX0ZsdXNoKHdtLCBNTUlPX0VNUFRZQlVGKSkgIT0gMCkKCXJldHVybiByZXN1bHQ7CiAgICAKICAgIHJlc3VsdCA9IE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX0NMT1NFLCB1RmxhZ3MsIDAsIE1NSU9fUFJPQ18zMkEpOwogICAgCiAgICBtbWlvU2V0QnVmZmVyKGhtbWlvLCBOVUxMLCAwLCAwKTsKICAgIAogICAgd20tPmlvUHJvYy0+Y291bnQtLTsKCiAgICBpZiAod20tPmJUbXBJT1Byb2MpCglNTUlPX0luc3RhbGxJT1Byb2Mod20tPmluZm8uZmNjSU9Qcm9jLCBOVUxMLCAKCQkJICAgTU1JT19SRU1PVkVQUk9DLCB3bS0+aW9Qcm9jLT50eXBlKTsKCiAgICBNTUlPX0Rlc3Ryb3kod20pOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0Nsb3NlICAgICAgCQlbTU1TWVNURU0uMTIxMV0KICovCk1NUkVTVUxUMTYgV0lOQVBJIG1taW9DbG9zZTE2KEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpCnsKICAgIHJldHVybiBtbWlvQ2xvc2UoaG1taW8sIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlYWQJICAgICAgIAlbV0lOTU0uMTI0XQogKi8KTE9ORyBXSU5BUEkgbW1pb1JlYWQoSE1NSU8gaG1taW8sIEhQU1RSIHBjaCwgTE9ORyBjY2gpCnsKICAgIExQV0lORV9NTUlPCXdtOwogICAgTE9ORyAJY291bnQ7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIC0xOwoKICAgIC8qIHVuYnVmZmVyZWQgY2FzZSBmaXJzdCAqLwogICAgaWYgKCF3bS0+aW5mby5wY2hCdWZmZXIpCglyZXR1cm4gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fUkVBRCwgKExQQVJBTSlwY2gsIGNjaCwgTU1JT19QUk9DXzMyQSk7CgogICAgLyogZmlyc3QgdHJ5IGZyb20gY3VycmVudCBidWZmZXIgKi8KICAgIGlmICh3bS0+aW5mby5wY2hOZXh0ICE9IHdtLT5pbmZvLnBjaEVuZFJlYWQpIHsKCWNvdW50ID0gd20tPmluZm8ucGNoRW5kUmVhZCAtIHdtLT5pbmZvLnBjaE5leHQ7CglpZiAoY291bnQgPiBjY2ggfHwgY291bnQgPCAwKSBjb3VudCA9IGNjaDsKCW1lbWNweShwY2gsIHdtLT5pbmZvLnBjaE5leHQsIGNvdW50KTsKCXdtLT5pbmZvLnBjaE5leHQgKz0gY291bnQ7CglwY2ggKz0gY291bnQ7CgljY2ggLT0gY291bnQ7CiAgICB9IGVsc2UKCWNvdW50ID0gMDsKICAgIAogICAgaWYgKGNjaCAmJiAod20tPmluZm8uZmNjSU9Qcm9jICE9IEZPVVJDQ19NRU0pKSB7Cglhc3NlcnQod20tPmluZm8uY2NoQnVmZmVyKTsKCgl3aGlsZSAoY2NoKSB7CgkgICAgTE9ORyBzaXplOwoKCSAgICBzaXplID0gTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgVFJVRSk7CgkgICAgaWYgKHNpemUgPD0gMCkgYnJlYWs7CgkgICAgaWYgKHNpemUgPiBjY2gpIHNpemUgPSBjY2g7CgkgICAgbWVtY3B5KHBjaCwgd20tPmluZm8ucGNoQnVmZmVyLCBzaXplKTsKCSAgICB3bS0+aW5mby5wY2hOZXh0ICs9IHNpemU7CgkgICAgcGNoICs9IHNpemU7CgkgICAgY2NoIC09IHNpemU7CgkgICAgY291bnQgKz0gc2l6ZTsKCX0KICAgIH0KICAgIAogICAgVFJBQ0UoImNvdW50PSVsZFxuIiwgY291bnQpOwogICAgcmV0dXJuIGNvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZWFkCSAgICAgICAJW01NU1lTVEVNLjEyMTJdCiAqLwpMT05HIFdJTkFQSSBtbWlvUmVhZDE2KEhNTUlPMTYgaG1taW8sIEhQU1RSIHBjaCwgTE9ORyBjY2gpCnsKICAgIHJldHVybiBtbWlvUmVhZChobW1pbywgcGNoLCBjY2gpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9Xcml0ZSAgICAgIAkJW1dJTk1NLjEzM10KICovCkxPTkcgV0lOQVBJIG1taW9Xcml0ZShITU1JTyBobW1pbywgSFBDU1RSIHBjaCwgTE9ORyBjY2gpCnsKICAgIExQV0lORV9NTUlPCXdtOwogICAgTE9ORyBjb3VudDsKCiAgICBUUkFDRSgiKCUwNFgsICVwLCAlbGQpO1xuIiwgaG1taW8sIHBjaCwgY2NoKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIC0xOwogICAgCiAgICBpZiAod20tPmluZm8uY2NoQnVmZmVyKSB7Cgljb3VudCA9IDA7Cgl3aGlsZSAoY2NoKSB7CgkgICAgaWYgKHdtLT5pbmZvLnBjaE5leHQgIT0gd20tPmluZm8ucGNoRW5kV3JpdGUpIHsKCQljb3VudCA9IHdtLT5pbmZvLnBjaEVuZFdyaXRlIC0gd20tPmluZm8ucGNoTmV4dDsKCQlpZiAoY291bnQgPiBjY2ggfHwgY291bnQgPCAwKSBjb3VudCA9IGNjaDsKCQltZW1jcHkod20tPmluZm8ucGNoTmV4dCwgcGNoLCBjb3VudCk7CgkJd20tPmluZm8ucGNoTmV4dCArPSBjb3VudDsKCQlwY2ggKz0gY291bnQ7CgkJY2NoIC09IGNvdW50OwoJCXdtLT5pbmZvLmR3RmxhZ3MgfD0gTU1JT19ESVJUWTsKCSAgICB9IGVsc2UKCQlpZiAod20tPmluZm8uZmNjSU9Qcm9jID09IEZPVVJDQ19NRU0pIHsKCQkgICAgaWYgKHdtLT5pbmZvLmFkd0luZm9bMF0pIHsKCQkJLyogZnJvbSB3aGVyZSB3b3VsZCB3ZSBnZXQgdGhlIG1lbW9yeSBoYW5kbGU/ICovCgkJCUZJWE1FKCJtZW1vcnkgZmlsZSBleHBhbnNpb24gbm90IGltcGxlbWVudGVkIVxuIik7CgkJICAgIH0gZWxzZSBicmVhazsKCQl9CgkgICAgCgkgICAgaWYgKHdtLT5pbmZvLnBjaE5leHQgPT0gd20tPmluZm8ucGNoRW5kV3JpdGUgJiYgCgkJTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikpIGJyZWFrOwoJfQogICAgfSBlbHNlIHsKCWNvdW50ID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fV1JJVEUsIChMUEFSQU0pcGNoLCBjY2gsIE1NSU9fUFJPQ18zMkEpOwoJd20tPmluZm8ubEJ1Zk9mZnNldCA9IHdtLT5pbmZvLmxEaXNrT2Zmc2V0OwogICAgfQogICAgCiAgICBUUkFDRSgiY291bnQ9JWxkXG4iLCBjb3VudCk7CiAgICByZXR1cm4gY291bnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1dyaXRlICAgICAgCQlbTU1TWVNURU0uMTIxM10KICovCkxPTkcgV0lOQVBJIG1taW9Xcml0ZTE2KEhNTUlPMTYgaG1taW8sIEhQQ1NUUiBwY2gsIExPTkcgY2NoKQp7CiAgICByZXR1cm4gbW1pb1dyaXRlKGhtbWlvLHBjaCxjY2gpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZWVrICAgICAgIAkJW01NU1lTVEVNLjEyMTRdCiAqLwpMT05HIFdJTkFQSSBtbWlvU2VlayhITU1JTyBobW1pbywgTE9ORyBsT2Zmc2V0LCBJTlQgaU9yaWdpbikKewogICAgTFBXSU5FX01NSU8Jd207CiAgICBMT05HIAlvZmZzZXQ7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJWQpO1xuIiwgaG1taW8sIGxPZmZzZXQsIGlPcmlnaW4pOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIGlmICghd20tPmluZm8ucGNoQnVmZmVyKQoJcmV0dXJuIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIGxPZmZzZXQsIGlPcmlnaW4sIE1NSU9fUFJPQ18zMkEpOwoKICAgIHN3aXRjaCAoaU9yaWdpbikgewogICAgY2FzZSBTRUVLX1NFVDogCglvZmZzZXQgPSBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfQ1VSOiAKCW9mZnNldCA9IHdtLT5pbmZvLmxCdWZPZmZzZXQgKyAod20tPmluZm8ucGNoTmV4dCAtIHdtLT5pbmZvLnBjaEJ1ZmZlcikgKyBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfRU5EOiAKCWlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgewoJICAgIG9mZnNldCA9IHdtLT5pbmZvLmNjaEJ1ZmZlcjsKCX0gZWxzZSB7CgkgICAgYXNzZXJ0KE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIDAsIFNFRUtfQ1VSLCBNTUlPX1BST0NfMzJBKSA9PSB3bS0+aW5mby5sRGlza09mZnNldCk7CgkgICAgb2Zmc2V0ID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fU0VFSywgMCwgU0VFS19FTkQsIE1NSU9fUFJPQ18zMkEpOwoJICAgIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIHdtLT5pbmZvLmxEaXNrT2Zmc2V0LCBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSk7Cgl9CglvZmZzZXQgKz0gbE9mZnNldDsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiAtMTsKICAgIH0KCiAgICAvKiBzdGF5IGluIHNhbWUgYnVmZmVyID8gKi8KICAgIC8qIHNvbWUgbWVtb3J5IG1hcHBlZCBidWZmZXJzIGFyZSBkZWZpbmVkIHdpdGggLTEgYXMgYSBzaXplICovCiAgICBpZiAoKHdtLT5pbmZvLmNjaEJ1ZmZlciA+IDApICYmCgkoKG9mZnNldCA8IHdtLT5pbmZvLmxCdWZPZmZzZXQpIHx8CgkgKG9mZnNldCA+PSB3bS0+aW5mby5sQnVmT2Zmc2V0ICsgd20tPmluZm8uY2NoQnVmZmVyKSkpIHsKCgkvKiBjb25kaXRpb24gdG8gY2hhbmdlIGJ1ZmZlciAqLwoJaWYgKCh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgfHwgCgkgICAgTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikgfHwKCSAgICAvKiB0aGlzIGFsc28gc2V0cyB0aGUgd20tPmluZm8ubERpc2tPZmZzZXQgZmllbGQgKi8KCSAgICBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCAKCQkJICAgICAob2Zmc2V0IC8gd20tPmluZm8uY2NoQnVmZmVyKSAqIHdtLT5pbmZvLmNjaEJ1ZmZlciwKCQkJICAgICBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSkgPT0gLTEpCgkgICAgcmV0dXJuIC0xOwoJTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgVFJVRSk7CiAgICB9CgogICAgd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChvZmZzZXQgLSB3bS0+aW5mby5sQnVmT2Zmc2V0KTsKCiAgICBUUkFDRSgiPT4gJWxkXG4iLCBvZmZzZXQpOwogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VlayAgICAgICAJCVtNTVNZU1RFTS4xMjE0XQogKi8KTE9ORyBXSU5BUEkgbW1pb1NlZWsxNihITU1JTzE2IGhtbWlvLCBMT05HIGxPZmZzZXQsIElOVDE2IGlPcmlnaW4pCnsKICAgIHJldHVybiBtbWlvU2VlayhobW1pbywgbE9mZnNldCwgaU9yaWdpbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0dldEluZm8JICAgICAgIAlbTU1TWVNURU0uMTIxNV0KICovClVJTlQxNiBXSU5BUEkgbW1pb0dldEluZm8xNihITU1JTzE2IGhtbWlvLCBNTUlPSU5GTzE2KiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKCiAgICBUUkFDRSgibW1pb0dldEluZm9cbiIpOwoKICAgIGlmICgod20gPSBNTUlPX0dldChOVUxMLCBobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgaWYgKCF3bS0+YnVmZmVyMTYpCglyZXR1cm4gTU1TWVNFUlJfRVJST1I7CgogICAgbHBtbWlvaW5mby0+ZHdGbGFncyAgICAgPSB3bS0+aW5mby5kd0ZsYWdzOyAKICAgIGxwbW1pb2luZm8tPmZjY0lPUHJvYyAgID0gd20tPmluZm8uZmNjSU9Qcm9jOyAKICAgIGxwbW1pb2luZm8tPnBJT1Byb2MgICAgID0gKExQTU1JT1BST0MxNil3bS0+aW5mby5wSU9Qcm9jOyAKICAgIGxwbW1pb2luZm8tPndFcnJvclJldCAgID0gd20tPmluZm8ud0Vycm9yUmV0OyAKICAgIGxwbW1pb2luZm8tPmhUYXNrICAgICAgID0gd20tPmluZm8uaFRhc2s7IAogICAgbHBtbWlvaW5mby0+Y2NoQnVmZmVyICAgPSB3bS0+aW5mby5jY2hCdWZmZXI7IAogICAgbHBtbWlvaW5mby0+cGNoQnVmZmVyICAgPSAodm9pZCopd20tPmJ1ZmZlcjE2OwogICAgbHBtbWlvaW5mby0+cGNoTmV4dCAgICAgPSAodm9pZCopKHdtLT5idWZmZXIxNiArICh3bS0+aW5mby5wY2hOZXh0IC0gd20tPmluZm8ucGNoQnVmZmVyKSk7CiAgICBscG1taW9pbmZvLT5wY2hFbmRSZWFkICA9ICh2b2lkKikod20tPmJ1ZmZlcjE2ICsgKHdtLT5pbmZvLnBjaEVuZFJlYWQgLSB3bS0+aW5mby5wY2hCdWZmZXIpKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gKHZvaWQqKSh3bS0+YnVmZmVyMTYgKyAod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpKTsgCiAgICBscG1taW9pbmZvLT5sQnVmT2Zmc2V0ICA9IHdtLT5pbmZvLmxCdWZPZmZzZXQ7IAogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsgCiAgICBscG1taW9pbmZvLT5hZHdJbmZvWzBdICA9IHdtLT5pbmZvLmFkd0luZm9bMF07IAogICAgbHBtbWlvaW5mby0+YWR3SW5mb1sxXSAgPSB3bS0+aW5mby5hZHdJbmZvWzFdOyAKICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMl0gID0gd20tPmluZm8uYWR3SW5mb1syXTsgCiAgICBscG1taW9pbmZvLT5hZHdJbmZvWzNdICA9IHdtLT5pbmZvLmFkd0luZm9bM107IAogICAgbHBtbWlvaW5mby0+ZHdSZXNlcnZlZDEgPSAwOwogICAgbHBtbWlvaW5mby0+ZHdSZXNlcnZlZDIgPSAwOwogICAgbHBtbWlvaW5mby0+aG1taW8gPSB3bS0+aW5mby5obW1pbzsgCgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0dldEluZm8JICAgICAgIAlbV0lOTU0uMTE4XQogKi8KVUlOVCBXSU5BUEkgbW1pb0dldEluZm8oSE1NSU8gaG1taW8sIE1NSU9JTkZPKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwogICAgCiAgICBUUkFDRSgiKDB4JTA0eCwlcCwweCUwOHgpXG4iLGhtbWlvLGxwbW1pb2luZm8sdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIG1lbWNweShscG1taW9pbmZvLCAmd20tPmluZm8sIHNpemVvZihNTUlPSU5GTykpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZXRJbmZvMTYgIAkJW01NU1lTVEVNLjEyMTZdCiAqLwpVSU5UMTYgV0lOQVBJIG1taW9TZXRJbmZvMTYoSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvU2V0SW5mb1xuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICAvKiBjaGVjayBpZiBzZWcgYW5kIGxpbiBidWZmZXJzIGFyZSB0aGUgc2FtZSAqLwogICAgaWYgKHdtLT5pbmZvLmNjaEJ1ZmZlciAhPSBscG1taW9pbmZvLT5jY2hCdWZmZXIgfHwKCXdtLT5pbmZvLnBjaEJ1ZmZlciAhPSBQVFJfU0VHX1RPX0xJTigodm9pZCopd20tPmJ1ZmZlcjE2KSkKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoJCiAgICAvKiBjaGVjayBwb2ludGVycyBjb2hlcmVuY2UgKi8KICAgIGlmIChscG1taW9pbmZvLT5wY2hOZXh0IDwgbHBtbWlvaW5mby0+cGNoQnVmZmVyIHx8IAoJbHBtbWlvaW5mby0+cGNoTmV4dCA+IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciArIGxwbW1pb2luZm8tPmNjaEJ1ZmZlciB8fAoJbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA8IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPiBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyBscG1taW9pbmZvLT5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlIDwgbHBtbWlvaW5mby0+cGNoQnVmZmVyIHx8IAoJbHBtbWlvaW5mby0+cGNoRW5kV3JpdGUgPiBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyBscG1taW9pbmZvLT5jY2hCdWZmZXIpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICB3bS0+aW5mby5wY2hOZXh0ICAgICA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hOZXh0ICAgICAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkICA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hFbmRSZWFkICAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CiAgICB3bS0+aW5mby5wY2hFbmRXcml0ZSA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hFbmRXcml0ZSAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NldEluZm8gICAgCQlbV0lOTU0uMTMwXQogKi8KVUlOVCBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8gaG1taW8sIGNvbnN0IE1NSU9JTkZPKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvU2V0SW5mb1xuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKICAgIAogICAgLyogY2hlY2sgcG9pbnRlcnMgY29oZXJlbmNlICovCiAgICBpZiAobHBtbWlvaW5mby0+cGNoTmV4dCA8IHdtLT5pbmZvLnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaE5leHQgPiB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPCB3bS0+aW5mby5wY2hCdWZmZXIgfHwgCglscG1taW9pbmZvLT5wY2hFbmRSZWFkID4gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyIHx8CglscG1taW9pbmZvLT5wY2hFbmRXcml0ZSA8IHdtLT5pbmZvLnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID4gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CgogICAgd20tPmluZm8ucGNoTmV4dCA9IGxwbW1pb2luZm8tPnBjaE5leHQ7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gbHBtbWlvaW5mby0+cGNoRW5kUmVhZDsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogCQkJCW1taW9TZXRCdWZmZXIJCVtXSU5NTS4xMjldCiovClVJTlQgV0lOQVBJIG1taW9TZXRCdWZmZXIoSE1NSU8gaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIihobW1pbz0lMDR4LCBwY2hCdWY9JXAsIGNjaEJ1Zj0lbGQsIHVGbGFncz0lIzA4eClcbiIsCgkgIGhtbWlvLCBwY2hCdWZmZXIsIGNjaEJ1ZmZlciwgdUZsYWdzKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICByZXR1cm4gTU1JT19TZXRCdWZmZXIod20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MsIFRSVUUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZXRCdWZmZXIJCVtNTVNZU1RFTS4xMjE3XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyMTYoSE1NSU8xNiBobW1pbywgTFBTVFIgc2VncGNoQnVmZmVyLCAKCQkJICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKGhtbWlvPSUwNHgsIHNlZ3BjaEJ1Zj0lcCwgY2NoQnVmPSVsZCwgdUZsYWdzPSUjMDh4KVxuIiwKCSAgaG1taW8sIHNlZ3BjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MpOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIHJldHVybiBNTUlPX1NldEJ1ZmZlcih3bSwgc2VncGNoQnVmZmVyLCBjY2hCdWZmZXIsIHVGbGFncywgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9GbHVzaCAgICAgIAkJW1dJTk1NLjExN10KICovClVJTlQgV0lOQVBJIG1taW9GbHVzaChITU1JTyBobW1pbywgVUlOVCB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKCUwNFgsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogICAgICAgCiAgICByZXR1cm4gTU1JT19GbHVzaCh3bSwgdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvRmx1c2ggICAgICAJCVtNTVNZU1RFTS4xMjE4XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvRmx1c2gxNihITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0ZsdXNoKGhtbWlvLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9BZHZhbmNlICAgIAkJW01NU1lTVEVNLjEyMTldCiAqLwpVSU5UIFdJTkFQSSBtbWlvQWR2YW5jZShITU1JTyBobW1pbywgTU1JT0lORk8qIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICAKICAgIFRSQUNFKCJobW1pbz0lMDRYLCBscG1taW9pbmZvPSVwLCB1RmxhZ3M9JTA0WFxuIiwgaG1taW8sIGxwbW1pb2luZm8sIHVGbGFncyk7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICBpZiAoIXdtLT5pbmZvLmNjaEJ1ZmZlcikKCXJldHVybiBNTUlPRVJSX1VOQlVGRkVSRUQ7CgogICAgaWYgKHVGbGFncyAhPSBNTUlPX1JFQUQgJiYgdUZsYWdzICE9IE1NSU9fV1JJVEUpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICBpZiAoTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikpCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKCiAgICBNTUlPX0dyYWJOZXh0QnVmZmVyKHdtLCB1RmxhZ3MgPT0gTU1JT19SRUFEKTsKCiAgICBscG1taW9pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyOwogICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCAgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyAKCSh3bS0+aW5mby5wY2hFbmRSZWFkIC0gd20tPmluZm8ucGNoQnVmZmVyKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsgCgkod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpOwogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sQnVmT2Zmc2V0OwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqbSoqKioqKioqKioqKioqKioKICogCQkJCW1taW9BZHZhbmNlICAgIAkJW01NU1lTVEVNLjEyMTldCiAqLwpVSU5UMTYgV0lOQVBJIG1taW9BZHZhbmNlMTYoSE1NSU8xNiBobW1pbywgTU1JT0lORk8xNiogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvQWR2YW5jZVxuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICBpZiAoIXdtLT5pbmZvLmNjaEJ1ZmZlcikKCXJldHVybiBNTUlPRVJSX1VOQlVGRkVSRUQ7CgogICAgaWYgKHVGbGFncyAhPSBNTUlPX1JFQUQgJiYgdUZsYWdzICE9IE1NSU9fV1JJVEUpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICBpZiAoTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikpCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKCiAgICBNTUlPX0dyYWJOZXh0QnVmZmVyKHdtLCB1RmxhZ3MgPT0gTU1JT19SRUFEKTsKCQogICAgbHBtbWlvaW5mby0+cGNoTmV4dCA9IGxwbW1pb2luZm8tPnBjaEJ1ZmZlcjsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFJlYWQgID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsgCgkod20tPmluZm8ucGNoRW5kUmVhZCAtIHdtLT5pbmZvLnBjaEJ1ZmZlcik7CiAgICBscG1taW9pbmZvLT5wY2hFbmRXcml0ZSA9IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciArIAoJKHdtLT5pbmZvLnBjaEVuZFdyaXRlIC0gd20tPmluZm8ucGNoQnVmZmVyKTsKICAgIGxwbW1pb2luZm8tPmxEaXNrT2Zmc2V0ID0gd20tPmluZm8ubERpc2tPZmZzZXQ7CiAgICBscG1taW9pbmZvLT5sQnVmT2Zmc2V0ID0gd20tPmluZm8ubEJ1Zk9mZnNldDsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU3RyaW5nVG9GT1VSQ0NBCVtXSU5NTS4xMzFdCiAqLwpGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQ0EoTFBDU1RSIHN6LCBVSU5UIHVGbGFncykKewogICAgQ0hBUiBjY1s0XTsKICAgIGludCBpID0gMDsKICAgIAogICAgZm9yIChpID0gMDsgaSA8IDQgJiYgc3pbaV07IGkrKykgewoJaWYgKHVGbGFncyAmIE1NSU9fVE9VUFBFUikgewoJICAgIGNjW2ldID0gdG91cHBlcihzeltpXSk7Cgl9IGVsc2UgewoJICAgIGNjW2ldID0gc3pbaV07Cgl9CiAgICB9CiAgICAKICAgIC8qIFBhZCB3aXRoIHNwYWNlcyAqLwogICAgd2hpbGUgKGkgPCA0KSB7CgljY1tpXSA9ICcgJzsKCWkrKzsKICAgIH0KICAgIAogICAgVFJBQ0UoIkdvdCAlYyVjJWMlY1xuIixjY1swXSxjY1sxXSxjY1syXSxjY1szXSk7CiAgICByZXR1cm4gbW1pb0ZPVVJDQyhjY1swXSxjY1sxXSxjY1syXSxjY1szXSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1N0cmluZ1RvRk9VUkNDVwlbV0lOTU0uMTMyXQogKi8KRk9VUkNDIFdJTkFQSSBtbWlvU3RyaW5nVG9GT1VSQ0NXKExQQ1dTVFIgc3osIFVJTlQgdUZsYWdzKQp7CiAgICBMUFNUUglzekEgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6KTsKICAgIEZPVVJDQwlyZXQgPSBtbWlvU3RyaW5nVG9GT1VSQ0NBKHN6QSx1RmxhZ3MpOwogICAgCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3pBKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1N0cmluZ1RvRk9VUkNDCVtNTVNZU1RFTS4xMjIwXQogKi8KRk9VUkNDIFdJTkFQSSBtbWlvU3RyaW5nVG9GT1VSQ0MxNihMUENTVFIgc3osIFVJTlQxNiB1RmxhZ3MpCnsKICAgIHJldHVybiBtbWlvU3RyaW5nVG9GT1VSQ0NBKHN6LCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIG1taW9JbnN0YWxsSU9Qcm9jMTYgICAgW01NU1lTVEVNLjEyMjFdCiAqLwpMUE1NSU9QUk9DMTYgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMTYoRk9VUkNDIGZjY0lPUHJvYywgTFBNTUlPUFJPQzE2IHBJT1Byb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQp7CiAgICByZXR1cm4gKExQTU1JT1BST0MxNilNTUlPX0luc3RhbGxJT1Byb2MoZmNjSU9Qcm9jLCAoTFBNTUlPUFJPQylwSU9Qcm9jLCAKCQkJCQkgICAgZHdGbGFncywgTU1JT19QUk9DXzE2KTsgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0luc3RhbGxJT1Byb2NBCSAgIFtXSU5NTS4xMjBdCiAqLwpMUE1NSU9QUk9DIFdJTkFQSSBtbWlvSW5zdGFsbElPUHJvY0EoRk9VUkNDIGZjY0lPUHJvYywgCgkJCQkgICAgIExQTU1JT1BST0MgcElPUHJvYywgRFdPUkQgZHdGbGFncykKewogICAgcmV0dXJuIE1NSU9fSW5zdGFsbElPUHJvYyhmY2NJT1Byb2MsIHBJT1Byb2MsIGR3RmxhZ3MsIE1NSU9fUFJPQ18zMkEpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9JbnN0YWxsSU9Qcm9jVwkgICBbV0lOTU0uXQogKi8KTFBNTUlPUFJPQyBXSU5BUEkgbW1pb0luc3RhbGxJT1Byb2NXKEZPVVJDQyBmY2NJT1Byb2MsIAoJCQkJICAgICBMUE1NSU9QUk9DIHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCnsKICAgIHJldHVybiBNTUlPX0luc3RhbGxJT1Byb2MoZmNjSU9Qcm9jLCBwSU9Qcm9jLCBkd0ZsYWdzLCBNTUlPX1BST0NfMzJXKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VuZE1lc3NhZ2UxNglbTU1TWVNURU0uMTIyMl0KICovCkxSRVNVTFQgV0lOQVBJIG1taW9TZW5kTWVzc2FnZTE2KEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1TWVzc2FnZSwKCQkJCSBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAldSwgJWxkLCAlbGQpXG4iLCBobW1pbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIpOwoKICAgIGlmICh1TWVzc2FnZSA8IE1NSU9NX1VTRVIpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKICAgIAogICAgcmV0dXJuIE1NSU9fU2VuZE1lc3NhZ2Uod20sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yLCBNTUlPX1BST0NfMTYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZW5kTWVzc2FnZQkJW1dJTk1NLl0KICovCkxSRVNVTFQgV0lOQVBJIG1taW9TZW5kTWVzc2FnZShITU1JTyBobW1pbywgVUlOVCB1TWVzc2FnZSwKCQkJICAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKewogICAgTFBXSU5FX01NSU8JCXdtOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICV1LCAlbGQsICVsZClcbiIsIGhtbWlvLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMik7CgogICAgaWYgKHVNZXNzYWdlIDwgTU1JT01fVVNFUikKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogICAgCiAgICByZXR1cm4gTU1JT19TZW5kTWVzc2FnZSh3bSwgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIsIE1NSU9fUFJPQ18zMkEpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9EZXNjZW5kCSAgICAgICAJW01NU1lTVEVNLjEyMjNdCiAqLwpVSU5UIFdJTkFQSSBtbWlvRGVzY2VuZChITU1JTyBobW1pbywgTFBNTUNLSU5GTyBscGNrLAoJCQljb25zdCBNTUNLSU5GTyogbHBja1BhcmVudCwgVUlOVCB1RmxhZ3MpCnsKICAgIERXT1JECQlkd09sZFBvczsKICAgIEZPVVJDQwkJc3JjaENrSWQ7CiAgICBGT1VSQ0MJCXNyY2hUeXBlOwogICAgCiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXAsICVwLCAlMDRYKTtcbiIsIGhtbWlvLCBscGNrLCBscGNrUGFyZW50LCB1RmxhZ3MpOwogICAgCiAgICBpZiAobHBjayA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICAKICAgIGR3T2xkUG9zID0gbW1pb1NlZWsoaG1taW8sIDAsIFNFRUtfQ1VSKTsKICAgIFRSQUNFKCJkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKICAgIAogICAgaWYgKGxwY2tQYXJlbnQgIT0gTlVMTCkgewoJVFJBQ0UoInNlZWsgaW5zaWRlIHBhcmVudCBhdCAlbGQgIVxuIiwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0KTsKCS8qIEVQUDogd2FzIGR3T2xkUG9zID0gbW1pb1NlZWsoaG1taW8sbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0LFNFRUtfU0VUKTsgKi8KCWlmIChkd09sZFBvcyA8IGxwY2tQYXJlbnQtPmR3RGF0YU9mZnNldCB8fCAKCSAgICBkd09sZFBvcyA+PSBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQgKyBscGNrUGFyZW50LT5ja3NpemUpIHsKCSAgICBXQVJOKCJvdXRzaWRlIHBhcmVudCBjaHVua1xuIik7CgkgICAgcmV0dXJuIE1NSU9FUlJfQ0hVTktOT1RGT1VORDsKCX0KICAgIH0KICAgIAogICAgLyogVGhlIFNESyBkb2N1IHNheXMgJ2NraWQnIGlzIHVzZWQgZm9yIGFsbCBjYXNlcy4gUmVhbCBXb3JsZAogICAgICogZXhhbXBsZXMgZGlzYWdyZWUgLU1hcmN1cyw5OTAyMTYuIAogICAgICovCiAgICAKICAgIHNyY2hUeXBlID0gMDsKICAgIC8qIGZpbmRfY2h1bmsgbG9va3MgZm9yICdja2lkJyAqLwogICAgaWYgKHVGbGFncyAmIE1NSU9fRklORENIVU5LKQoJc3JjaENrSWQgPSBscGNrLT5ja2lkOwogICAgLyogZmluZF9yaWZmIGFuZCBmaW5kX2xpc3QgbG9vayBmb3IgJ2ZjY1R5cGUnICovCiAgICBpZiAodUZsYWdzICYgTU1JT19GSU5ETElTVCkgewoJc3JjaENrSWQgPSBGT1VSQ0NfTElTVDsKCXNyY2hUeXBlID0gbHBjay0+ZmNjVHlwZTsKICAgIH0KICAgIGlmICh1RmxhZ3MgJiBNTUlPX0ZJTkRSSUZGKSB7CglzcmNoQ2tJZCA9IEZPVVJDQ19SSUZGOwoJc3JjaFR5cGUgPSBscGNrLT5mY2NUeXBlOwogICAgfQogICAgCiAgICBpZiAodUZsYWdzICYgKE1NSU9fRklORENIVU5LfE1NSU9fRklORExJU1R8TU1JT19GSU5EUklGRikpIHsKCVRSQUNFKCJzZWFyY2hpbmcgZm9yICUuNHMuJS40c1xuIiwgCgkgICAgICAoTFBTVFIpJnNyY2hDa0lkLAoJICAgICAgc3JjaFR5cGU/KExQU1RSKSZzcmNoVHlwZToiYW55ICIpOwoJCgl3aGlsZSAoVFJVRSkgewoJICAgIExPTkcgaXg7CgkgICAgCgkgICAgaXggPSBtbWlvUmVhZChobW1pbywgKExQU1RSKWxwY2ssIDMgKiBzaXplb2YoRFdPUkQpKTsKCSAgICBpZiAoaXggPCAyKnNpemVvZihEV09SRCkpIHsKCQltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKCQlXQVJOKCJyZXR1cm4gQ2h1bmtOb3RGb3VuZFxuIik7CgkJcmV0dXJuIE1NSU9FUlJfQ0hVTktOT1RGT1VORDsKCSAgICB9CgkgICAgbHBjay0+ZHdEYXRhT2Zmc2V0ID0gZHdPbGRQb3MgKyAyICogc2l6ZW9mKERXT1JEKTsKCSAgICBpZiAoaXggPCBscGNrLT5kd0RhdGFPZmZzZXQgLSBkd09sZFBvcykgewoJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwoJCVdBUk4oInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJICAgIH0KCSAgICBUUkFDRSgiY2tpZD0lLjRzIGZjYz0lLjRzIGNrc2l6ZT0lMDhsWCAhXG4iLAoJCSAgKExQU1RSKSZscGNrLT5ja2lkLCAKCQkgIHNyY2hUeXBlPyhMUFNUUikmbHBjay0+ZmNjVHlwZToiPG5hPiIsCgkJICBscGNrLT5ja3NpemUpOwoJICAgIGlmICgoc3JjaENrSWQgPT0gbHBjay0+Y2tpZCkgJiYKCQkoIXNyY2hUeXBlIHx8IChzcmNoVHlwZSA9PSBscGNrLT5mY2NUeXBlKSkKCQkpCgkJYnJlYWs7CgkgICAgCgkgICAgZHdPbGRQb3MgPSBscGNrLT5kd0RhdGFPZmZzZXQgKyAoKGxwY2stPmNrc2l6ZSArIDEpICYgfjEpOwoJICAgIG1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwoJfQogICAgfSBlbHNlIHsKCS8qIEZJWE1FOiB1bnZlcmlmaWVkLCBkb2VzIGl0IGRvIHRoaXM/ICovCgkvKiBOQjogVGhpcyBwYXJ0IGlzIHVzZWQgYnkgV0FWRV9tY2lPcGVuLCBhbW9uZyBvdGhlcnMgKi8KCWlmIChtbWlvUmVhZChobW1pbywgKExQU1RSKWxwY2ssIDMgKiBzaXplb2YoRFdPUkQpKSA8IDMgKiBzaXplb2YoRFdPUkQpKSB7CgkgICAgbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7CgkgICAgV0FSTigicmV0dXJuIENodW5rTm90Rm91bmQgMm5kXG4iKTsKCSAgICByZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJfQoJbHBjay0+ZHdEYXRhT2Zmc2V0ID0gZHdPbGRQb3MgKyAyICogc2l6ZW9mKERXT1JEKTsKICAgIH0KICAgIGxwY2stPmR3RmxhZ3MgPSAwOwogICAgLyogSWYgd2Ugd2VyZSBsb29raW5nIGZvciBSSUZGL0xJU1QgY2h1bmtzLCB0aGUgZmluYWwgZmlsZSBwb3NpdGlvbgogICAgICogaXMgYWZ0ZXIgdGhlIGNodW5raWQuIElmIHdlIHdlcmUganVzdCBsb29raW5nIGZvciB0aGUgY2h1bmsKICAgICAqIGl0IGlzIGFmdGVyIHRoZSBja3NpemUuIFNvIGFkZCA0IGluIFJJRkYvTElTVCBjYXNlLgogICAgICovCiAgICBpZiAobHBjay0+Y2tpZCA9PSBGT1VSQ0NfUklGRiB8fCBscGNrLT5ja2lkID09IEZPVVJDQ19MSVNUKQoJbW1pb1NlZWsoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCArIHNpemVvZihEV09SRCksIFNFRUtfU0VUKTsKICAgIGVsc2UKCW1taW9TZWVrKGhtbWlvLCBscGNrLT5kd0RhdGFPZmZzZXQsIFNFRUtfU0VUKTsKICAgIFRSQUNFKCJscGNrOiBja2lkPSUuNHMsIGNrc2l6ZT0lbGQsIGR3RGF0YU9mZnNldD0lbGQgZmNjVHlwZT0lMDhsWCAoJS40cykhXG4iLCAKCSAgKExQU1RSKSZscGNrLT5ja2lkLCBscGNrLT5ja3NpemUsIGxwY2stPmR3RGF0YU9mZnNldCwgCgkgIGxwY2stPmZjY1R5cGUsIHNyY2hUeXBlPyhMUFNUUikmbHBjay0+ZmNjVHlwZToiIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvRGVzY2VuZDE2CSAgICAgICAJW01NU1lTVEVNLjEyMjNdCiAqLwpVSU5UMTYgV0lOQVBJIG1taW9EZXNjZW5kMTYoSE1NSU8xNiBobW1pbywgTFBNTUNLSU5GTyBscGNrLAoJCQkgICAgY29uc3QgTU1DS0lORk8qIGxwY2tQYXJlbnQsIFVJTlQxNiB1RmxhZ3MpCnsKICAgIHJldHVybiBtbWlvRGVzY2VuZChobW1pbywgbHBjaywgbHBja1BhcmVudCwgdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQXNjZW5kICAgICAJCVtXSU5NTS4xMTNdCiAqLwpVSU5UIFdJTkFQSSBtbWlvQXNjZW5kKEhNTUlPIGhtbWlvLCBMUE1NQ0tJTkZPIGxwY2ssIFVJTlQgdUZsYWdzKQp7CiAgICBUUkFDRSgiKCUwNFgsICVwLCAlMDRYKTtcbiIsIGhtbWlvLCBscGNrLCB1RmxhZ3MpOwogICAgCiAgICBpZiAobHBjay0+ZHdGbGFncyAmIE1NSU9fRElSVFkpIHsKCURXT1JECWR3T2xkUG9zLCBkd05ld1NpemUsIGR3U2l6ZVBvczsKCQoJVFJBQ0UoImNodW5rIGlzIG1hcmtlZCBNTUlPX0RJUlRZLCBjb3JyZWN0aW5nIGNodW5rIHNpemVcbiIpOwoJZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgMCwgU0VFS19DVVIpOwoJVFJBQ0UoImR3T2xkUG9zPSVsZFxuIiwgZHdPbGRQb3MpOwoJZHdOZXdTaXplID0gZHdPbGRQb3MgLSBscGNrLT5kd0RhdGFPZmZzZXQ7CglpZiAoZHdOZXdTaXplICE9IGxwY2stPmNrc2l6ZSkgewoJICAgIFRSQUNFKCJkd05ld1NpemU9JWxkXG4iLCBkd05ld1NpemUpOwoJICAgIGxwY2stPmNrc2l6ZSA9IGR3TmV3U2l6ZTsKCSAgICAKCSAgICBkd1NpemVQb3MgPSBscGNrLT5kd0RhdGFPZmZzZXQgLSBzaXplb2YoRFdPUkQpOwoJICAgIFRSQUNFKCJkd1NpemVQb3M9JWxkXG4iLCBkd1NpemVQb3MpOwoJICAgIAoJICAgIG1taW9TZWVrKGhtbWlvLCBkd1NpemVQb3MsIFNFRUtfU0VUKTsKCSAgICBtbWlvV3JpdGUoaG1taW8sIChMUFNUUikmZHdOZXdTaXplLCBzaXplb2YoRFdPUkQpKTsKCX0KICAgIH0KICAgIAogICAgbW1pb1NlZWsoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCArICgobHBjay0+Y2tzaXplICsgMSkgJiB+MSksIFNFRUtfU0VUKTsKICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0FzY2VuZCAgICAgCQlbTU1TWVNURU0uMTIyNF0KICovClVJTlQxNiBXSU5BUEkgbW1pb0FzY2VuZDE2KEhNTUlPMTYgaG1taW8sIE1NQ0tJTkZPKiBscGNrLCBVSU5UMTYgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0FzY2VuZChobW1pbyxscGNrLHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0NyZWF0ZUNodW5rCQlbTU1TWVNURU0uMTIyNV0KICovClVJTlQxNiBXSU5BUEkgbW1pb0NyZWF0ZUNodW5rMTYoSE1NSU8xNiBobW1pbywgTU1DS0lORk8qIGxwY2ssIFVJTlQxNiB1RmxhZ3MpCnsKICAgIERXT1JECWR3T2xkUG9zOwogICAgTE9ORyAJc2l6ZTsKICAgIExPTkcgCWl4OwogICAgCiAgICBUUkFDRSgiKCUwNFgsICVwLCAlMDRYKTtcbiIsIGhtbWlvLCBscGNrLCB1RmxhZ3MpOwogICAgCiAgICBkd09sZFBvcyA9IG1taW9TZWVrKGhtbWlvLCAwLCBTRUVLX0NVUik7CiAgICBUUkFDRSgiZHdPbGRQb3M9JWxkXG4iLCBkd09sZFBvcyk7CiAgICAKICAgIGlmICh1RmxhZ3MgPT0gTU1JT19DUkVBVEVMSVNUKQoJbHBjay0+Y2tpZCA9IEZPVVJDQ19MSVNUOwogICAgZWxzZSBpZiAodUZsYWdzID09IE1NSU9fQ1JFQVRFUklGRikKCWxwY2stPmNraWQgPSBGT1VSQ0NfUklGRjsKICAgIAogICAgVFJBQ0UoImNraWQ9JTA4bFhcbiIsIGxwY2stPmNraWQpOwogICAgCiAgICBzaXplID0gMiAqIHNpemVvZihEV09SRCk7CiAgICBscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIHNpemU7CiAgICAKICAgIGlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpIAoJc2l6ZSArPSBzaXplb2YoRFdPUkQpOwogICAgbHBjay0+ZHdGbGFncyA9IE1NSU9fRElSVFk7CiAgICAKICAgIGl4ID0gbW1pb1dyaXRlKGhtbWlvLCAoTFBTVFIpbHBjaywgc2l6ZSk7CiAgICBUUkFDRSgiYWZ0ZXIgbW1pb1dyaXRlIGl4ID0gJWxkIHJlcSA9ICVsZCwgZXJybm8gPSAlZFxuIixpeCwgc2l6ZSwgZXJybm8pOwogICAgaWYgKGl4IDwgc2l6ZSkgewoJbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7CglXQVJOKCJyZXR1cm4gQ2Fubm90V3JpdGVcbiIpOwoJcmV0dXJuIE1NSU9FUlJfQ0FOTk9UV1JJVEU7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJbW1pb0NyZWF0ZUNodW5rCQkJCVtXSU5NTS4xMTVdCiAqLwpVSU5UIFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8gaG1taW8sIE1NQ0tJTkZPKiBscGNrLCBVSU5UIHVGbGFncykKewogICAgcmV0dXJuIG1taW9DcmVhdGVDaHVuazE2KGhtbWlvLCBscGNrLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZW5hbWUgICAgIAkJW01NU1lTVEVNLjEyMjZdCiAqLwpVSU5UMTYgV0lOQVBJIG1taW9SZW5hbWUxNihMUENTVFIgc3pGaWxlTmFtZSwgTFBDU1RSIHN6TmV3RmlsZU5hbWUsCgkJCSAgIE1NSU9JTkZPMTYqIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCnsKICAgIFVJTlQxNiAJCXJlc3VsdCA9IE1NU1lTRVJSX0VSUk9SOwogICAgTFBNTUlPUFJPQzE2CWlvUHJvYzsKCiAgICBUUkFDRSgiKCclcycsICclcycsICVwLCAlMDhsWCk7XG4iLAoJICBzekZpbGVOYW1lLCBzek5ld0ZpbGVOYW1lLCBscG1taW9pbmZvLCBkd1JlbmFtZUZsYWdzKTsKICAgIAogICAgLyogSWYgYm90aCBwYXJhbXMgYXJlIE5VTEwsIHRoZW4gcGFyc2UgdGhlIGZpbGUgbmFtZSAqLwogICAgaWYgKGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKCWxwbW1pb2luZm8tPmZjY0lPUHJvYyA9IE1NSU9fUGFyc2VFeHQoc3pGaWxlTmFtZSk7CgogICAgLyogSGFuZGxlIGFueSB1bmhhbmRsZWQvZXJyb3IgY2FzZSBmcm9tIGFib3ZlLiBBc3N1bWUgRE9TIGZpbGUgKi8KICAgIGlmIChscG1taW9pbmZvLT5mY2NJT1Byb2MgPT0gMCAmJiBscG1taW9pbmZvLT5wSU9Qcm9jID09IE5VTEwpCglpb1Byb2MgPSAoTFBNTUlPUFJPQzE2KW1taW9Eb3NJT1Byb2M7CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAobHBtbWlvaW5mby0+cElPUHJvYyA9PSBOVUxMKQoJaW9Qcm9jID0gbW1pb0luc3RhbGxJT1Byb2MxNihscG1taW9pbmZvLT5mY2NJT1Byb2MsIE5VTEwsIE1NSU9fRklORFBST0MpOwogICAgZWxzZQogCWlvUHJvYyA9IGxwbW1pb2luZm8tPnBJT1Byb2M7CgogICAgLyogRklYTUU6IGlvUHJvYyBpcyBsaWtlbHkgYSBzZWdtZW50ZWQgYWRkcmVzcywgdGh1cyBuZWVkaW5nIGEKICAgICAqIHRodW5rIHNvbWV3aGVyZS4gVGhlIG1haW4gaXNzdWUgaXMgdGhhdCBXaW5lJ3MgY3VycmVudCB0aHVua2luZwogICAgICogMzIgdG8gMTYgb25seSBzdXBwb3J0cyBwYXNjYWwgY2FsbGluZyBjb252ZW50aW9uCiAgICAgKi8KICAgIGlmIChpb1Byb2MpIAoJcmVzdWx0ID0gKGlvUHJvYykoMCwgTU1JT01fUkVOQU1FLCAKCQkJICAoTFBBUkFNKXN6RmlsZU5hbWUsIChMUEFSQU0pc3pOZXdGaWxlTmFtZSk7CiAgICAKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlbmFtZUEgICAgCQkJW1dJTk1NLjEyNV0KICovClVJTlQgV0lOQVBJIG1taW9SZW5hbWVBKExQQ1NUUiBzekZpbGVOYW1lLCBMUENTVFIgc3pOZXdGaWxlTmFtZSwKCQkJTU1JT0lORk8qIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCnsKICAgIFVJTlQJcmVzdWx0ID0gTU1TWVNFUlJfRVJST1I7CiAgICBMUE1NSU9QUk9DCWlvUHJvYzsKCiAgICBUUkFDRSgiKCclcycsICclcycsICVwLCAlMDhsWCk7XG4iLAoJICBzekZpbGVOYW1lLCBzek5ld0ZpbGVOYW1lLCBscG1taW9pbmZvLCBkd1JlbmFtZUZsYWdzKTsKICAgIAogICAgLyogSWYgYm90aCBwYXJhbXMgYXJlIE5VTEwsIHRoZW4gcGFyc2UgdGhlIGZpbGUgbmFtZSAqLwogICAgaWYgKGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKCWxwbW1pb2luZm8tPmZjY0lPUHJvYyA9IE1NSU9fUGFyc2VFeHQoc3pGaWxlTmFtZSk7CgogICAgLyogSGFuZGxlIGFueSB1bmhhbmRsZWQvZXJyb3IgY2FzZSBmcm9tIGFib3ZlLiBBc3N1bWUgRE9TIGZpbGUgKi8KICAgIGlmIChscG1taW9pbmZvLT5mY2NJT1Byb2MgPT0gMCAmJiBscG1taW9pbmZvLT5wSU9Qcm9jID09IE5VTEwpCglpb1Byb2MgPSAoTFBNTUlPUFJPQyltbWlvRG9zSU9Qcm9jOwogICAgLyogaWYganVzdCB0aGUgZm91ciBjaGFyYWN0ZXIgY29kZSBpcyBwcmVzZW50LCBsb29rIHVwIElPIHByb2MgKi8KICAgIGVsc2UgaWYgKGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKCWlvUHJvYyA9IE1NSU9fSW5zdGFsbElPUHJvYyhscG1taW9pbmZvLT5mY2NJT1Byb2MsIE5VTEwsIAoJCQkJICAgIE1NSU9fRklORFBST0MsIE1NSU9fUFJPQ18zMkEpOwogICAgZWxzZQogCWlvUHJvYyA9IGxwbW1pb2luZm8tPnBJT1Byb2M7CgogICAgaWYgKGlvUHJvYykgCglyZXN1bHQgPSAoaW9Qcm9jKSgwLCBNTUlPTV9SRU5BTUUsIAoJCQkgIChMUEFSQU0pc3pGaWxlTmFtZSwgKExQQVJBTSlzek5ld0ZpbGVOYW1lKTsKICAgIAogICAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvUmVuYW1lVyAgICAJCQlbV0lOTU0uMTI2XQogKi8KVUlOVCBXSU5BUEkgbW1pb1JlbmFtZVcoTFBDV1NUUiBzekZpbGVOYW1lLCBMUENXU1RSIHN6TmV3RmlsZU5hbWUsCgkJCU1NSU9JTkZPKiBscG1taW9pbmZvLCBEV09SRCBkd1JlbmFtZUZsYWdzKQp7CiAgICBMUFNUUglzekZuID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksIDAsIHN6RmlsZU5hbWUpOwogICAgTFBTVFIJc3puRm4gPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pOZXdGaWxlTmFtZSk7CiAgICBVSU5UCXJldCA9IG1taW9SZW5hbWVBKHN6Rm4sIHN6bkZuLCBscG1taW9pbmZvLCBkd1JlbmFtZUZsYWdzKTsKICAgIAogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6Rm4pOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6bkZuKTsKICAgIHJldHVybiByZXQ7Cn0K