LyoKICogTU1JTyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IDE5OTggQW5kcmV3IFRheWxvcgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICogQ29weXJpZ2h0IDIwMDAsMjAwMiBFcmljIFBvdWVjaAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgovKiBTdGlsbCB0byBiZSBkb25lOgogKiAJKyBjb3JyZWN0IGhhbmRsaW5nIG9mIGdsb2JhbC9sb2NhbCBJT1Byb2NzIChhbmQgdGVtcG9yYXJ5IElPUHJvY3MpCiAqCSsgbW9kZSBvZiBtbWlvIG9iamVjdHMgaXMgbm90IHVzZWQgKHJlYWQgdnMgd3JpdGUgdnMgcmVhZHdyaXRlKQogKgkrIHRocmVhZCBzYWZlbmVzcwogKiAgICAgICsgMzIgQSA8PT4gVyBtZXNzYWdlIG1hcHBpbmcKICovCgoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiNpbmNsdWRlICJ3aW5lbW0uaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtbWlvKTsKCkxSRVNVTFQgICAgICAgICAoKnBGbk1taW9DYWxsYmFjazE2KShEV09SRCxMUE1NSU9JTkZPLFVJTlQsTFBBUkFNLExQQVJBTSkgLyogPSBOVUxMICovOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgCW1taW9Eb3NJT1Byb2MgICAgICAgICAgIAkJW2ludGVybmFsXQogKi8Kc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgbW1pb0Rvc0lPUHJvYyhMUE1NSU9JTkZPIGxwbW1pb2luZm8sIFVJTlQgdU1lc3NhZ2UsCgkJCQkgICAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCnsKICAgIExSRVNVTFQJcmV0ID0gTU1TWVNFUlJfTk9FUlJPUjsKCiAgICBUUkFDRSgiKCVwLCAlWCwgMHglbHgsIDB4JWx4KTtcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKCiAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CiAgICBjYXNlIE1NSU9NX09QRU46Cgl7CgkgICAgLyogUGFyYW1ldGVyczoKCSAgICAgKiBsUGFyYW0xID0gc3pGaWxlTmFtZSBwYXJhbWV0ZXIgZnJvbSBtbWlvT3BlbgoJICAgICAqIGxQYXJhbTIgPSByZXNlcnZlZAoJICAgICAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgoJICAgICAqIE5PVEU6IGxEaXNrT2Zmc2V0IGF1dG9tYXRpY2FsbHkgc2V0IHRvIHplcm8KCSAgICAgKi8KCSAgICBMUENTVFIgICAgICBzekZpbGVOYW1lID0gKExQQ1NUUilsUGFyYW0xOwoKCSAgICBpZiAobHBtbWlvaW5mby0+ZHdGbGFncyAmIE1NSU9fR0VUVEVNUCkgewoJCUZJWE1FKCJNTUlPX0dFVFRFTVAgbm90IGltcGxlbWVudGVkXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DQU5OT1RPUEVOOwoJICAgIH0KCgkgICAgLyogaWYgZmlsZW5hbWUgTlVMTCwgYXNzdW1lIG9wZW4gZmlsZSBoYW5kbGUgaW4gYWR3SW5mb1swXSAqLwoJICAgIGlmIChzekZpbGVOYW1lKSB7CiAgICAgICAgICAgICAgICBPRlNUUlVDVCAgICBvZnM7CiAgICAgICAgICAgICAgICBscG1taW9pbmZvLT5hZHdJbmZvWzBdID0gKERXT1JEKU9wZW5GaWxlKHN6RmlsZU5hbWUsICZvZnMsIGxwbW1pb2luZm8tPmR3RmxhZ3MgJiAweEZGRkYpOwogICAgICAgICAgICB9CgkgICAgaWYgKGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPT0gKERXT1JEKUhGSUxFX0VSUk9SKQoJCXJldCA9IE1NSU9FUlJfQ0FOTk9UT1BFTjsKCX0KCWJyZWFrOwoKICAgIGNhc2UgTU1JT01fQ0xPU0U6CgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IHdGbGFncyBwYXJhbWV0ZXIgZnJvbSBtbWlvQ2xvc2UKCSAqIGxQYXJhbTIgPSB1bnVzZWQKCSAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgoJICovCglpZiAoIShsUGFyYW0xICYgTU1JT19GSE9QRU4pKQoJICAgIF9sY2xvc2UoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0pOwoJYnJlYWs7CgogICAgY2FzZSBNTUlPTV9SRUFEOgoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gcmVhZCBidWZmZXIKCSAqIGxQYXJhbTIgPSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIDAgZm9yIEVPRiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlCgkgKgkgICBpbiB3RXJyb3JSZXQpCgkgKi8KCXJldCA9IF9scmVhZCgoSEZJTEUpbHBtbWlvaW5mby0+YWR3SW5mb1swXSwgKEhQU1RSKWxQYXJhbTEsIChMT05HKWxQYXJhbTIpOwoJaWYgKHJldCAhPSAtMSkKCSAgICBscG1taW9pbmZvLT5sRGlza09mZnNldCArPSByZXQ7CgoJYnJlYWs7CgogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDoKCS8qIG5vIGludGVybmFsIGJ1ZmZlcmluZywgc28gV1JJVEVGTFVTSCBoYW5kbGVkIHNhbWUgYXMgV1JJVEUgKi8KCgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IGh1Z2UgcG9pbnRlciB0byB3cml0ZSBidWZmZXIKCSAqIGxQYXJhbTIgPSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKCSAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcyB3cml0dGVuLCAtMSBmb3IgZXJyb3IgKGVycm9yIGNvZGUgaW4KCSAqCQl3RXJyb3JSZXQpCgkgKi8KCXJldCA9IF9od3JpdGUoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0sIChIUFNUUilsUGFyYW0xLCAoTE9ORylsUGFyYW0yKTsKCWlmIChyZXQgIT0gLTEpCgkgICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgKz0gcmV0OwoJYnJlYWs7CgogICAgY2FzZSBNTUlPTV9TRUVLOgoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBuZXcgcG9zaXRpb24KCSAqIGxQYXJhbTIgPSBmcm9tIHdoZW5jZSB0byBzZWVrIChTRUVLX1NFVCwgU0VFS19DVVIsIFNFRUtfRU5EKQoJICogUmV0dXJuczogbmV3IGZpbGUgcG9zdGlvbiwgLTEgb24gZXJyb3IKCSAqLwoJcmV0ID0gX2xsc2VlaygoSEZJTEUpbHBtbWlvaW5mby0+YWR3SW5mb1swXSwgKExPTkcpbFBhcmFtMSwgKExPTkcpbFBhcmFtMik7CglpZiAocmV0ICE9IC0xKQoJICAgIGxwbW1pb2luZm8tPmxEaXNrT2Zmc2V0ID0gcmV0OwoJcmV0dXJuIHJldDsKCiAgICBjYXNlIE1NSU9NX1JFTkFNRToKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gb2xkIG5hbWUKCSAqIGxQYXJhbTIgPSBuZXcgbmFtZQoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCgkgKi8KIAkgaWYgKCFNb3ZlRmlsZUEoKGNvbnN0IGNoYXIqKWxQYXJhbTEsIChjb25zdCBjaGFyKilsUGFyYW0yKSkKCSAgICAgcmV0ID0gTU1JT0VSUl9GSUxFTk9URk9VTkQ7CgkgYnJlYWs7CgogICAgZGVmYXVsdDoKCUZJWE1FKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgJXVcbiIsIHVNZXNzYWdlKTsKCXJldHVybiAwOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgIAltbWlvTWVtSU9Qcm9jICAgICAgICAgICAJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBMUkVTVUxUIENBTExCQUNLIG1taW9NZW1JT1Byb2MoTFBNTUlPSU5GTyBscG1taW9pbmZvLCBVSU5UIHVNZXNzYWdlLAoJCQkJICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQp7CiAgICBUUkFDRSgiKCVwLDB4JTA0eCwweCUwOGx4LDB4JTA4bHgpXG4iLCBscG1taW9pbmZvLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMik7CgogICAgc3dpdGNoICh1TWVzc2FnZSkgewoKICAgIGNhc2UgTU1JT01fT1BFTjoKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gZmlsZW5hbWUgKG11c3QgYmUgTlVMTCkKCSAqIGxQYXJhbTIgPSByZXNlcnZlZAoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCgkgKiBOT1RFOiBsRGlza09mZnNldCBhdXRvbWF0aWNhbGx5IHNldCB0byB6ZXJvCgkgKi8KCS8qIEZJWE1FOiBpbyBwcm9jIHNob3VsZG4ndCBjaGFuZ2UgaXQgKi8KCWlmICghKGxwbW1pb2luZm8tPmR3RmxhZ3MgJiBNTUlPX0NSRUFURSkpCgkgICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlOwogICAgICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPSBIRklMRV9FUlJPUjsKCXJldHVybiAwOwoKICAgIGNhc2UgTU1JT01fQ0xPU0U6CgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IHdGbGFncyBwYXJhbWV0ZXIgZnJvbSBtbWlvQ2xvc2UKCSAqIGxQYXJhbTIgPSB1bnVzZWQKCSAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgoJICovCglyZXR1cm4gMDsKCiAgICBjYXNlIE1NSU9NX1JFQUQ6CgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IGh1Z2UgcG9pbnRlciB0byByZWFkIGJ1ZmZlcgoJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byByZWFkCgkgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgMCBmb3IgRU9GLCAtMSBmb3IgZXJyb3IgKGVycm9yIGNvZGUKCSAqCSAgIGluIHdFcnJvclJldCkKCSAqIE5PVEU6IGxEaXNrT2Zmc2V0IHNob3VsZCBiZSB1cGRhdGVkCgkgKi8KCUZJWE1FKCJNTUlPTV9SRUFEIG9uIG1lbW9yeSBmaWxlcyBzaG91bGQgbm90IG9jY3VyLCBidWZmZXIgbWF5IGJlIGxvc3QhXG4iKTsKCXJldHVybiAwOwoKICAgIGNhc2UgTU1JT01fV1JJVEU6CiAgICBjYXNlIE1NSU9NX1dSSVRFRkxVU0g6CgkvKiBubyBpbnRlcm5hbCBidWZmZXJpbmcsIHNvIFdSSVRFRkxVU0ggaGFuZGxlZCBzYW1lIGFzIFdSSVRFICovCgoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gd3JpdGUgYnVmZmVyCgkgKiBsUGFyYW0yID0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCgkgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlIGluCgkgKgkJd0Vycm9yUmV0KQoJICogTk9URTogbERpc2tPZmZzZXQgc2hvdWxkIGJlIHVwZGF0ZWQKCSAqLwoJRklYTUUoIk1NSU9NX1dSSVRFIG9uIG1lbW9yeSBmaWxlcyBzaG91bGQgbm90IG9jY3VyLCBidWZmZXIgbWF5IGJlIGxvc3QhXG4iKTsKCXJldHVybiAwOwoKICAgIGNhc2UgTU1JT01fU0VFSzoKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gbmV3IHBvc2l0aW9uCgkgKiBsUGFyYW0yID0gZnJvbSB3aGVuY2UgdG8gc2VlayAoU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKCSAqIFJldHVybnM6IG5ldyBmaWxlIHBvc3Rpb24sIC0xIG9uIGVycm9yCgkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAoJICovCglGSVhNRSgiTU1JT01fU0VFSyBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gLTE7CgogICAgZGVmYXVsdDoKCUZJWE1FKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgJXVcbiIsIHVNZXNzYWdlKTsKCXJldHVybiAwOwogICAgfQp9CgovKiBUaGlzIGFycmF5IHdpbGwgYmUgdGhlIGVudGlyZSBsaXN0IGZvciBtb3N0IGFwcHMgCiAqIE5vdGUgdGhhdCB0ZW1wb3JhcnkgaW9Qcm9jcyB3aWxsIGJlIHN0b3JlZCB3aXRoIGEgMCBmb3VyQ0MgY29kZQogKi8KCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCBkZWZhdWx0UHJvY3NbXSA9IHsKICAgIHsmZGVmYXVsdFByb2NzWzFdLCBGT1VSQ0NfRE9TLCAoTFBNTUlPUFJPQyltbWlvRG9zSU9Qcm9jLCBNTUlPX1BST0NfMzJBLCAwfSwKICAgIHtOVUxMLCAgICAgICAgICAgICBGT1VSQ0NfTUVNLCAoTFBNTUlPUFJPQyltbWlvTWVtSU9Qcm9jLCBNTUlPX1BST0NfMzJBLCAwfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCoJcElPUHJvY0xpc3RBbmNob3IgPSAmZGVmYXVsdFByb2NzWzBdOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fRmluZFByb2NOb2RlIAkJCVtJTlRFUk5BTF0KICoKICogRmluZHMgdGhlIFByb2NMaXN0IG5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRk9VUkNDIGNvZGUuCiAqLwpzdGF0aWMgc3RydWN0IElPUHJvY0xpc3QqCU1NSU9fRmluZFByb2NOb2RlKEZPVVJDQyBmY2NJT1Byb2MpCnsKICAgIHN0cnVjdCBJT1Byb2NMaXN0KglwTGlzdE5vZGU7CgogICAgZm9yIChwTGlzdE5vZGUgPSBwSU9Qcm9jTGlzdEFuY2hvcjsgcExpc3ROb2RlOyBwTGlzdE5vZGUgPSBwTGlzdE5vZGUtPnBOZXh0KSB7CglpZiAocExpc3ROb2RlLT5mb3VyQ0MgPT0gZmNjSU9Qcm9jKSB7CgkgICAgcmV0dXJuIHBMaXN0Tm9kZTsKCX0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19JbnN0YWxsSU9Qcm9jIAkJCVtJTlRFUk5BTF0KICovCkxQTU1JT1BST0MgTU1JT19JbnN0YWxsSU9Qcm9jKEZPVVJDQyBmY2NJT1Byb2MsIExQTU1JT1BST0MgcElPUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywgZW51bSBtbWlvUHJvY1R5cGUgdHlwZSkKewogICAgTFBNTUlPUFJPQwkgICAgICAgIGxwUHJvYyA9IE5VTEw7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCogIHBMaXN0Tm9kZTsKICAgIHN0cnVjdCBJT1Byb2NMaXN0KiogcHBMaXN0Tm9kZTsKCiAgICBUUkFDRSgiKCUwOGx4LCAlcCwgJTA4bFgsICVpKVxuIiwgZmNjSU9Qcm9jLCBwSU9Qcm9jLCBkd0ZsYWdzLCB0eXBlKTsKCiAgICBpZiAoZHdGbGFncyAmIE1NSU9fR0xPQkFMUFJPQykKCUZJWE1FKCJHbG9iYWwgcHJvY2VkdXJlcyBub3QgaW1wbGVtZW50ZWRcbiIpOwoKICAgIC8qIGp1c3QgaGFuZGxlIHRoZSBrbm93biBwcm9jZWR1cmVzIGZvciBub3cgKi8KICAgIHN3aXRjaCAoZHdGbGFncyAmIChNTUlPX0lOU1RBTExQUk9DfE1NSU9fUkVNT1ZFUFJPQ3xNTUlPX0ZJTkRQUk9DKSkgewogICAgY2FzZSBNTUlPX0lOU1RBTExQUk9DOgoJLyogQ3JlYXRlIG5ldyBlbnRyeSBmb3IgdGhlIElPUHJvYyBsaXN0ICovCglwTGlzdE5vZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpwTGlzdE5vZGUpKTsKCWlmIChwTGlzdE5vZGUpIHsKCSAgICAvKiBGaWxsIGluIHRoaXMgbm9kZSAqLwoJICAgIHBMaXN0Tm9kZS0+Zm91ckNDID0gZmNjSU9Qcm9jOwoJICAgIHBMaXN0Tm9kZS0+cElPUHJvYyA9IHBJT1Byb2M7CgkgICAgcExpc3ROb2RlLT50eXBlID0gdHlwZTsKCSAgICBwTGlzdE5vZGUtPmNvdW50ID0gMDsKCgkgICAgLyogU3RpY2sgaXQgb24gdGhlIGVuZCBvZiB0aGUgbGlzdCAqLwoJICAgIHBMaXN0Tm9kZS0+cE5leHQgPSBwSU9Qcm9jTGlzdEFuY2hvcjsKCSAgICBwSU9Qcm9jTGlzdEFuY2hvciA9IHBMaXN0Tm9kZTsKCgkgICAgLyogUmV0dXJuIHRoaXMgSU9Qcm9jIC0gdGhhdCdzIGhvdyB0aGUgY2FsbGVyIGtub3dzIHdlIHN1Y2NlZWRlZCAqLwoJICAgIGxwUHJvYyA9IHBJT1Byb2M7Cgl9CglicmVhazsKCiAgICBjYXNlIE1NSU9fUkVNT1ZFUFJPQzoKCS8qCgkgKiBTZWFyY2ggZm9yIHRoZSBub2RlIHRoYXQgd2UncmUgdHJ5aW5nIHRvIHJlbW92ZQogICAgICAgICAqIFdlIHNlYXJjaCBmb3IgYSBtYXRjaGluZyBmb3VyQ0MgY29kZSBpZiBpdCdzIG5vbiBudWxsLCBvciB0aGUgcHJvYwogICAgICAgICAqIGFkZHJlc3Mgb3RoZXJ3aXNlCiAgICAgICAgICogbm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdvbid0IGZpbmQgdGhlIGZpcnN0IGl0ZW0gb24gdGhlIGxpc3QsIGJ1dAoJICogc2luY2UgdGhlIGZpcnN0IHR3byBpdGVtcyBvbiB0aGlzIGxpc3QgYXJlIG9uZXMgd2Ugd29uJ3QKCSAqIGxldCB0aGUgdXNlciBkZWxldGUgYW55d2F5LCB0aGF0J3Mgb2theQoJICovCglwcExpc3ROb2RlID0gJnBJT1Byb2NMaXN0QW5jaG9yOwoJd2hpbGUgKCgqcHBMaXN0Tm9kZSkgJiYgCiAgICAgICAgICAgICAgICgoZmNjSU9Qcm9jICE9IDApID8gCiAgICAgICAgICAgICAgICAoKnBwTGlzdE5vZGUpLT5mb3VyQ0MgIT0gZmNjSU9Qcm9jIDogCiAgICAgICAgICAgICAgICAoKnBwTGlzdE5vZGUpLT5wSU9Qcm9jICE9IHBJT1Byb2MpKQoJICAgIHBwTGlzdE5vZGUgPSAmKCgqcHBMaXN0Tm9kZSktPnBOZXh0KTsKCglpZiAoKnBwTGlzdE5vZGUpIHsgLyogZm91bmQgaXQgKi8KCSAgICAvKiBGSVhNRTogd2hhdCBzaG91bGQgYmUgZG9uZSBpZiBhbiBvcGVuIG1taW8gb2JqZWN0IHVzZXMgdGhpcyBwcm9jID8KCSAgICAgKiBzaGFsbCB3ZSByZXR1cm4gYW4gZXJyb3IsIG51a2UgdGhlIG1taW8gb2JqZWN0ID8KCSAgICAgKi8KCSAgICBpZiAoKCpwcExpc3ROb2RlKS0+Y291bnQpIHsKCQlFUlIoIkNhbm5vdCByZW1vdmUgYSBtbUlPUHJvYyB3aGlsZSBpbiB1c2VcbiIpOwoJCWJyZWFrOwoJICAgIH0KCSAgICAvKiByZW1vdmUgaXQsIGJ1dCBvbmx5IGlmIGl0IGlzbid0IGJ1aWx0aW4gKi8KCSAgICBpZiAoKCpwcExpc3ROb2RlKSA+PSBkZWZhdWx0UHJvY3MgJiYKCQkoKnBwTGlzdE5vZGUpIDwgZGVmYXVsdFByb2NzICsgc2l6ZW9mKGRlZmF1bHRQcm9jcykpIHsKCQlXQVJOKCJUcmllZCB0byByZW1vdmUgYnVpbHQtaW4gbW1pbyBwcm9jLiBTa2lwcGluZ1xuIik7CgkgICAgfSBlbHNlIHsKCQkvKiBPa2F5LCBudWtlIGl0ICovCgkJc3RydWN0IElPUHJvY0xpc3QqICBwdG1wTm9kZSA9ICpwcExpc3ROb2RlOwoJCWxwUHJvYyA9ICgqcHBMaXN0Tm9kZSktPnBJT1Byb2M7CgkJKnBwTGlzdE5vZGUgPSAoKnBwTGlzdE5vZGUpLT5wTmV4dDsKCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwdG1wTm9kZSk7CgkgICAgfQoJfQoJYnJlYWs7CgogICAgY2FzZSBNTUlPX0ZJTkRQUk9DOgoJaWYgKChwTGlzdE5vZGUgPSBNTUlPX0ZpbmRQcm9jTm9kZShmY2NJT1Byb2MpKSkgewoJICAgIGxwUHJvYyA9IHBMaXN0Tm9kZS0+cElPUHJvYzsKCX0KCWJyZWFrOwogICAgfQoKICAgIHJldHVybiBscFByb2M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgIAlzZW5kX21lc3NhZ2UgICAgCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExSRVNVTFQJc2VuZF9tZXNzYWdlKHN0cnVjdCBJT1Byb2NMaXN0KiBpb1Byb2MsIExQTU1JT0lORk8gbW1pb2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgd01zZywgTFBBUkFNIGxQYXJhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbTIsIGVudW0gbW1pb1Byb2NUeXBlIHR5cGUpCnsKICAgIExSRVNVTFQgCQlyZXN1bHQgPSBNTVNZU0VSUl9FUlJPUjsKICAgIExQQVJBTQkJbHAxID0gbFBhcmFtMSwgbHAyID0gbFBhcmFtMjsKCiAgICBpZiAoIWlvUHJvYykgewoJRVJSKCJicnJyXG4iKTsKCXJlc3VsdCA9IE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICB9CgogICAgc3dpdGNoIChpb1Byb2MtPnR5cGUpIHsKICAgIGNhc2UgTU1JT19QUk9DXzE2OgogICAgICAgIGlmIChwRm5NbWlvQ2FsbGJhY2sxNikKICAgICAgICAgICAgcmVzdWx0ID0gcEZuTW1pb0NhbGxiYWNrMTYoKERXT1JEKWlvUHJvYy0+cElPUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1pb2luZm8sIHdNc2csIGxwMSwgbHAyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU1JT19QUk9DXzMyQToKICAgIGNhc2UgTU1JT19QUk9DXzMyVzoKCWlmIChpb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIG1hcCAobFBhcmFtMSwgbFBhcmFtMikgaW50byAobHAxLCBscDIpIDMyIEE8PT5XICovCgkgICAgRklYTUUoIk5JWSAzMiBBPD0+VyBtYXBwaW5nXG4iKTsKCX0KCXJlc3VsdCA9IChpb1Byb2MtPnBJT1Byb2MpKChMUFNUUiltbWlvaW5mbywgd01zZywgbHAxLCBscDIpOwoKI2lmIDAKCWlmIChpb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIHVubWFwIChsUGFyYW0xLCBsUGFyYW0yKSBpbnRvIChscDEsIGxwMikgMzIgQTw9PlcgKi8KCX0KI2VuZGlmCglicmVhazsKICAgIGRlZmF1bHQ6CglGSVhNRSgiSW50ZXJuYWwgZXJyb3JcbiIpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIAkJCU1NSU9fUGFyc2VFeHRBIAkJICAgICAgICBbaW50ZXJuYWxdCiAqCiAqIFBhcnNlcyBhIGZpbGVuYW1lIGZvciB0aGUgZXh0ZW5zaW9uLgogKgogKiBSRVRVUk5TCiAqICBUaGUgRk9VUkNDIGNvZGUgZm9yIHRoZSBleHRlbnNpb24gaWYgZm91bmQsIGVsc2UgMC4KICovCnN0YXRpYyBGT1VSQ0MgTU1JT19QYXJzZUV4dEEoTFBDU1RSIHN6RmlsZU5hbWUpCnsKICAgIC8qIEZpbGVuYW1lcyBhcmUgb2YgdGhlIGZvcm0gZmlsZS5leHR7K0FCQ30KICAgICAgIEZvciBub3csIHdlIHRha2UgdGhlIGxhc3QgJysnIGlmIHByZXNlbnQgKi8KCiAgICBGT1VSQ0MgcmV0ID0gMDsKCiAgICAvKiBOb3RlIHRoYXQgZXh0e1N0YXJ0LEVuZH0gcG9pbnQgdG8gdGhlIC4gYW5kICsgcmVzcGVjdGl2ZWx5ICovCiAgICBMUFNUUiBleHRFbmQ7CiAgICBMUFNUUiBleHRTdGFydDsKCiAgICBUUkFDRSgiKCVzKVxuIiwgZGVidWdzdHJfYShzekZpbGVOYW1lKSk7CgogICAgaWYgKCFzekZpbGVOYW1lKQoJcmV0dXJuIHJldDsKCiAgICAvKiBGaW5kIHRoZSBsYXN0ICcuJyAqLwogICAgZXh0U3RhcnQgPSBzdHJyY2hyKHN6RmlsZU5hbWUsJy4nKTsKCiAgICBpZiAoIWV4dFN0YXJ0KSB7CiAgICAgICAgIEVSUigiTm8gLiBpbiBzekZpbGVOYW1lOiAlc1xuIiwgZGVidWdzdHJfYShzekZpbGVOYW1lKSk7CiAgICB9IGVsc2UgewogICAgICAgIENIQVIgZXh0WzVdOwoKICAgICAgICAvKiBGaW5kIHRoZSAnKycgYWZ0ZXJ3YXJkcyAqLwogICAgICAgIGV4dEVuZCA9IHN0cmNocihleHRTdGFydCwnKycpOwogICAgICAgIGlmIChleHRFbmQpIHsKCiAgICAgICAgICAgIGlmIChleHRFbmQgLSBleHRTdGFydCAtIDEgPiA0KQogICAgICAgICAgICAgICAgV0FSTigiRXh0ZW5zaW9uIGxlbmd0aCA+IDRcbiIpOwogICAgICAgICAgICBsc3RyY3B5bkEoZXh0LCBleHRTdGFydCArIDEsIG1pbihleHRFbmQtZXh0U3RhcnQsNSkpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBObyArIHNvIGp1c3QgYW4gZXh0ZW5zaW9uICovCiAgICAgICAgICAgIGlmIChzdHJsZW4oZXh0U3RhcnQpID4gNCkgewogICAgICAgICAgICAgICAgV0FSTigiRXh0ZW5zaW9uIGxlbmd0aCA+IDRcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxzdHJjcHluQShleHQsIGV4dFN0YXJ0ICsgMSwgNSk7CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJHb3QgZXh0ZW5zaW9uOiAlc1xuIiwgZGVidWdzdHJfYShleHQpKTsKCiAgICAgICAgLyogRk9VUkNDIGNvZGVzIGlkZW50aWZ5aW5nIGZpbGUtZXh0ZW5zaW9ucyBtdXN0IGJlIHVwcGVyY2FzZSAqLwogICAgICAgIHJldCA9IG1taW9TdHJpbmdUb0ZPVVJDQ0EoZXh0LCBNTUlPX1RPVVBQRVIpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCU1NSU9fR2V0CQkJW2ludGVybmFsXQogKgogKiBSZXRyaWV2ZXMgdGhlIG1taW8gb2JqZWN0IGZyb20gY3VycmVudCBwcm9jZXNzCiAqLwpMUFdJTkVfTU1JTwlNTUlPX0dldChITU1JTyBoKQp7CiAgICBMUFdJTkVfTU1JTwkJd20gPSBOVUxMOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZXSU5NTV9JRGF0YS0+Y3MpOwogICAgZm9yICh3bSA9IFdJTk1NX0lEYXRhLT5scE1NSU87IHdtOyB3bSA9IHdtLT5scE5leHQpIHsKCWlmICh3bS0+aW5mby5obW1pbyA9PSBoKQoJICAgIGJyZWFrOwogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJldJTk1NX0lEYXRhLT5jcyk7CiAgICByZXR1cm4gd207Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlNTUlPX0NyZWF0ZQkJCVtpbnRlcm5hbF0KICoKICogQ3JlYXRlcyBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBmb3IgYSBtbWlvIGluc3RhbmNlCiAqLwpzdGF0aWMJTFBXSU5FX01NSU8JCU1NSU9fQ3JlYXRlKHZvaWQpCnsKICAgIHN0YXRpYwlXT1JECU1NSU9fY291bnRlciA9IDA7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgd20gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFdJTkVfTU1JTykpOwogICAgaWYgKHdtKSB7CglFbnRlckNyaXRpY2FsU2VjdGlvbigmV0lOTU1fSURhdGEtPmNzKTsKICAgICAgICAvKiBsb29rdXAgbmV4dCB1bmFsbG9jYXRlZCBXT1JEIGhhbmRsZSwgd2l0aCBhIG5vbiBOVUxMIHZhbHVlICovCgl3aGlsZSAoKytNTUlPX2NvdW50ZXIgPT0gMCB8fCBNTUlPX0dldCgoSE1NSU8pKFVMT05HX1BUUilNTUlPX2NvdW50ZXIpKTsKCXdtLT5pbmZvLmhtbWlvID0gKEhNTUlPKShVTE9OR19QVFIpTU1JT19jb3VudGVyOwoJd20tPmxwTmV4dCA9IFdJTk1NX0lEYXRhLT5scE1NSU87CglXSU5NTV9JRGF0YS0+bHBNTUlPID0gd207CglMZWF2ZUNyaXRpY2FsU2VjdGlvbigmV0lOTU1fSURhdGEtPmNzKTsKICAgIH0KICAgIHJldHVybiB3bTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCU1NSU9fRGVzdHJveQkJCVtpbnRlcm5hbF0KICotCiAqIERlc3Ryb3lzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBhIG1taW8gaW5zdGFuY2UKICovCnN0YXRpYwlCT09MCQlNTUlPX0Rlc3Ryb3koTFBXSU5FX01NSU8gd20pCnsKICAgIExQV0lORV9NTUlPKgltOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZXSU5NTV9JRGF0YS0+Y3MpOwogICAgLyogc2VhcmNoIGZvciB0aGUgbWF0Y2hpbmcgb25lLi4uICovCiAgICBtID0gJihXSU5NTV9JRGF0YS0+bHBNTUlPKTsKICAgIHdoaWxlICgqbSAmJiAqbSAhPSB3bSkgbSA9ICYoKm0pLT5scE5leHQ7CiAgICAvKiAuLi5hbmQgZGVzdHJveSAqLwogICAgaWYgKCptKSB7CgkqbSA9ICgqbSktPmxwTmV4dDsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdtKTsKCXdtID0gTlVMTDsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZXSU5NTV9JRGF0YS0+Y3MpOwogICAgcmV0dXJuIHdtID8gRkFMU0UgOiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJCU1NSU9fRmx1c2ggCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljCU1NUkVTVUxUIE1NSU9fRmx1c2goV0lORV9NTUlPKiB3bSwgVUlOVCB1RmxhZ3MpCnsKICAgIGlmICh3bS0+aW5mby5jY2hCdWZmZXIgJiYgKHdtLT5pbmZvLmZjY0lPUHJvYyAhPSBGT1VSQ0NfTUVNKSkgewoJLyogbm90IHF1aXRlIHN1cmUgd2hhdCB0byBkbyBoZXJlLCBidXQgSSdsbCBndWVzcyAqLwoJaWYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0RJUlRZKSB7CiAgICAgICAgICAgIC8qIEZJWE1FOiBlcnJvciBoYW5kbGluZyAqLwoJICAgIHNlbmRfbWVzc2FnZSh3bS0+aW9Qcm9jLCAmd20tPmluZm8sIE1NSU9NX1NFRUssIAogICAgICAgICAgICAgICAgICAgICAgICAgd20tPmluZm8ubEJ1Zk9mZnNldCwgU0VFS19TRVQsIE1NSU9fUFJPQ18zMkEpOwoJICAgIHNlbmRfbWVzc2FnZSh3bS0+aW9Qcm9jLCAmd20tPmluZm8sIE1NSU9NX1dSSVRFLCAKICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pd20tPmluZm8ucGNoQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgd20tPmluZm8ucGNoTmV4dCAtIHdtLT5pbmZvLnBjaEJ1ZmZlciwgTU1JT19QUk9DXzMyQSk7Cgl9CglpZiAodUZsYWdzICYgTU1JT19FTVBUWUJVRikKCSAgICB3bS0+aW5mby5wY2hOZXh0ID0gd20tPmluZm8ucGNoRW5kUmVhZCA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKICAgIH0KICAgIHdtLT5pbmZvLmR3RmxhZ3MgJj0gfk1NSU9fRElSVFk7CgogICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX0dyYWJOZXh0QnVmZmVyCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExPTkcJTU1JT19HcmFiTmV4dEJ1ZmZlcihMUFdJTkVfTU1JTyB3bSwgaW50IGZvcl9yZWFkKQp7CiAgICBMT05HCXNpemUgPSB3bS0+aW5mby5jY2hCdWZmZXI7CgogICAgVFJBQ0UoImJvPSVseCBkbz0lbHggb2Y9JWx4XG4iLAoJICB3bS0+aW5mby5sQnVmT2Zmc2V0LCB3bS0+aW5mby5sRGlza09mZnNldCwKCSAgc2VuZF9tZXNzYWdlKHdtLT5pb1Byb2MsICZ3bS0+aW5mbywgTU1JT01fU0VFSywgMCwgU0VFS19DVVIsIE1NSU9fUFJPQ18zMkEpKTsKCiAgICB3bS0+aW5mby5sQnVmT2Zmc2V0ID0gd20tPmluZm8ubERpc2tPZmZzZXQ7CiAgICB3bS0+aW5mby5wY2hOZXh0ID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kUmVhZCA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKICAgIHdtLT5pbmZvLnBjaEVuZFdyaXRlID0gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyOwoKICAgIHdtLT5iQnVmZmVyTG9hZGVkID0gVFJVRTsKICAgIGlmIChmb3JfcmVhZCkgewoJc2l6ZSA9IHNlbmRfbWVzc2FnZSh3bS0+aW9Qcm9jLCAmd20tPmluZm8sIE1NSU9NX1JFQUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSl3bS0+aW5mby5wY2hCdWZmZXIsIHNpemUsIE1NSU9fUFJPQ18zMkEpOwoJaWYgKHNpemUgPiAwKQoJICAgIHdtLT5pbmZvLnBjaEVuZFJlYWQgKz0gc2l6ZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHdtLT5iQnVmZmVyTG9hZGVkID0gRkFMU0U7CiAgICB9CgogICAgcmV0dXJuIHNpemU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX1NldEJ1ZmZlciAJCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIE1NUkVTVUxUIE1NSU9fU2V0QnVmZmVyKFdJTkVfTU1JTyogd20sIHZvaWQqIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsCgkJCSAgICAgICBVSU5UIHVGbGFncykKewogICAgVFJBQ0UoIiglcCAlcCAlbGQgJXUpXG4iLCB3bSwgcGNoQnVmZmVyLCBjY2hCdWZmZXIsIHVGbGFncyk7CgogICAgaWYgKHVGbGFncykJCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgIGlmIChjY2hCdWZmZXIgPiAweEZGRkYpCglXQVJOKCJVbnRlc3RlZCBoYW5kbGluZyBvZiBodWdlIG1taW8gYnVmZmVycyAoJWxkID49IDY0aylcbiIsIGNjaEJ1ZmZlcik7CgogICAgaWYgKE1NSU9fRmx1c2god20sIDApICE9IE1NU1lTRVJSX05PRVJST1IpCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKCiAgICAvKiBmcmVlIHByZXZpb3VzIGJ1ZmZlciBpZiBhbGxvY2F0ZWQgKi8KICAgIGlmICh3bS0+aW5mby5kd0ZsYWdzICYgTU1JT19BTExPQ0JVRikgewogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdtLT5pbmZvLnBjaEJ1ZmZlcik7CiAgICAgICAgd20tPmluZm8ucGNoQnVmZmVyID0gTlVMTDsKCXdtLT5pbmZvLmR3RmxhZ3MgJj0gfk1NSU9fQUxMT0NCVUY7CiAgICB9CgogICAgaWYgKHBjaEJ1ZmZlcikgewogICAgICAgIHdtLT5pbmZvLnBjaEJ1ZmZlciA9IHBjaEJ1ZmZlcjsKICAgIH0gZWxzZSBpZiAoY2NoQnVmZmVyKSB7CglpZiAoISh3bS0+aW5mby5wY2hCdWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY2NoQnVmZmVyKSkpCgkgICAgcmV0dXJuIE1NSU9FUlJfT1VUT0ZNRU1PUlk7Cgl3bS0+aW5mby5kd0ZsYWdzIHw9IE1NSU9fQUxMT0NCVUY7CiAgICB9IGVsc2UgewoJd20tPmluZm8ucGNoQnVmZmVyID0gTlVMTDsKICAgIH0KCiAgICB3bS0+aW5mby5jY2hCdWZmZXIgPSBjY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hOZXh0ID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kUmVhZCA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKICAgIHdtLT5pbmZvLnBjaEVuZFdyaXRlID0gd20tPmluZm8ucGNoQnVmZmVyICsgY2NoQnVmZmVyOwogICAgd20tPmluZm8ubEJ1Zk9mZnNldCA9IDA7CiAgICB3bS0+YkJ1ZmZlckxvYWRlZCA9IEZBTFNFOwoKICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTU1JT19PcGVuICAgICAgIAkJCVtpbnRlcm5hbF0KICovCkhNTUlPIE1NSU9fT3BlbihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTyogcmVmbW1pbmZvLCBEV09SRCBkd09wZW5GbGFncywgCiAgICAgICAgICAgICAgICBlbnVtIG1taW9Qcm9jVHlwZSB0eXBlKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICBNTUlPSU5GTyAgICAJbW1pb2luZm87CgogICAgVFJBQ0UoIignJXMnLCAlcCwgJTA4bFgsICVkKTtcbiIsIHN6RmlsZU5hbWUsIHJlZm1taW5mbywgZHdPcGVuRmxhZ3MsIHR5cGUpOwoKICAgIGlmICghcmVmbW1pbmZvKSB7CiAgICAgICAgcmVmbW1pbmZvID0gJm1taW9pbmZvOwoKCW1taW9pbmZvLmZjY0lPUHJvYyA9IDA7CgltbWlvaW5mby5wSU9Qcm9jID0gTlVMTDsKCW1taW9pbmZvLnBjaEJ1ZmZlciA9IE5VTEw7CgltbWlvaW5mby5jY2hCdWZmZXIgPSAwOwogICAgICAgIHR5cGUgPSBNTUlPX1BST0NfMzJBOwogICAgfQoKICAgIGlmIChkd09wZW5GbGFncyAmIChNTUlPX1BBUlNFfE1NSU9fRVhJU1QpKSB7CgljaGFyCWJ1ZmZlcltNQVhfUEFUSF07CgoJaWYgKEdldEZ1bGxQYXRoTmFtZUEoc3pGaWxlTmFtZSwgc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlciwgTlVMTCkgPj0gc2l6ZW9mKGJ1ZmZlcikpCgkgICAgcmV0dXJuIChITU1JTylGQUxTRTsKCWlmICgoZHdPcGVuRmxhZ3MgJiBNTUlPX0VYSVNUKSAmJiAoR2V0RmlsZUF0dHJpYnV0ZXNBKGJ1ZmZlcikgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpKQoJICAgIHJldHVybiAoSE1NSU8pRkFMU0U7CglzdHJjcHkoc3pGaWxlTmFtZSwgYnVmZmVyKTsKCXJldHVybiAoSE1NSU8pVFJVRTsKICAgIH0KCiAgICBpZiAoKHdtID0gTU1JT19DcmVhdGUoKSkgPT0gTlVMTCkKCXJldHVybiAwOwoKICAgIC8qIElmIGJvdGggcGFyYW1zIGFyZSBOVUxMLCB0aGVuIHBhcnNlIHRoZSBmaWxlIG5hbWUgaWYgYXZhaWxhYmxlICovCiAgICBpZiAocmVmbW1pbmZvLT5mY2NJT1Byb2MgPT0gMCAmJiByZWZtbWluZm8tPnBJT1Byb2MgPT0gTlVMTCkgewoJd20tPmluZm8uZmNjSU9Qcm9jID0gTU1JT19QYXJzZUV4dEEoc3pGaWxlTmFtZSk7CgkvKiBIYW5kbGUgYW55IHVuaGFuZGxlZC9lcnJvciBjYXNlLiBBc3N1bWUgRE9TIGZpbGUgKi8KCWlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gMCkKCSAgICB3bS0+aW5mby5mY2NJT1Byb2MgPSBGT1VSQ0NfRE9TOwoJaWYgKCEod20tPmlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKHdtLT5pbmZvLmZjY0lPUHJvYykpKSB7CgkgICAgLyogSWYgbm90IGZvdW5kLCByZXRyeSB3aXRoIEZPVVJDQ19ET1MgKi8KCSAgICB3bS0+aW5mby5mY2NJT1Byb2MgPSBGT1VSQ0NfRE9TOwoJICAgIGlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkKCQlnb3RvIGVycm9yMjsKCX0KCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAocmVmbW1pbmZvLT5wSU9Qcm9jID09IE5VTEwpIHsKCXdtLT5pbmZvLmZjY0lPUHJvYyA9IHJlZm1taW5mby0+ZmNjSU9Qcm9jOwoJaWYgKCEod20tPmlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKHdtLT5pbmZvLmZjY0lPUHJvYykpKSBnb3RvIGVycm9yMjsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9CiAgICAvKiBpZiBJTyBwcm9jIHNwZWNpZmllZCwgdXNlIGl0IGFuZCBzcGVjaWZpZWQgZm91ciBjaGFyYWN0ZXIgY29kZSAqLwogICAgZWxzZSB7Cgl3bS0+aW5mby5mY2NJT1Byb2MgPSByZWZtbWluZm8tPmZjY0lPUHJvYzsKCU1NSU9fSW5zdGFsbElPUHJvYyh3bS0+aW5mby5mY2NJT1Byb2MsIHJlZm1taW5mby0+cElPUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1JT19JTlNUQUxMUFJPQywgdHlwZSk7CglpZiAoISh3bS0+aW9Qcm9jID0gTU1JT19GaW5kUHJvY05vZGUod20tPmluZm8uZmNjSU9Qcm9jKSkpIGdvdG8gZXJyb3IyOwoJYXNzZXJ0KHdtLT5pb1Byb2MtPnBJT1Byb2MgPT0gcmVmbW1pbmZvLT5wSU9Qcm9jKTsKCXdtLT5iVG1wSU9Qcm9jID0gVFJVRTsKICAgIH0KCiAgICB3bS0+YkJ1ZmZlckxvYWRlZCA9IEZBTFNFOwogICAgd20tPmlvUHJvYy0+Y291bnQrKzsKCiAgICBpZiAoZHdPcGVuRmxhZ3MgJiBNTUlPX0FMTE9DQlVGKSB7CglpZiAoKHJlZm1taW5mby0+d0Vycm9yUmV0ID0gTU1JT19TZXRCdWZmZXIod20sIE5VTEwsIE1NSU9fREVGQVVMVEJVRkZFUiwgMCkpKQoJICAgIGdvdG8gZXJyb3IxOwogICAgfSBlbHNlIGlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgewogICAgICAgIHJlZm1taW5mby0+d0Vycm9yUmV0ID0gTU1JT19TZXRCdWZmZXIod20sIHJlZm1taW5mby0+cGNoQnVmZmVyLCByZWZtbWluZm8tPmNjaEJ1ZmZlciwgMCk7CglpZiAocmVmbW1pbmZvLT53RXJyb3JSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikKCSAgICBnb3RvIGVycm9yMTsKCXdtLT5iQnVmZmVyTG9hZGVkID0gVFJVRTsKICAgIH0gLyogZWxzZSA9PiB1bmJ1ZmZlcmVkLCB3bS0+aW5mby5wY2hCdWZmZXIgPT0gTlVMTCAqLwoKICAgIC8qIHNlZSBtbWlvRG9zSU9Qcm9jIGZvciB0aGF0IG9uZSAqLwogICAgd20tPmluZm8uYWR3SW5mb1swXSA9IHJlZm1taW5mby0+YWR3SW5mb1swXTsKICAgIHdtLT5pbmZvLmR3RmxhZ3MgPSBkd09wZW5GbGFnczsKCiAgICAvKiBjYWxsIElPIHByb2MgdG8gYWN0dWFsbHkgb3BlbiBmaWxlICovCiAgICByZWZtbWluZm8tPndFcnJvclJldCA9IHNlbmRfbWVzc2FnZSh3bS0+aW9Qcm9jLCAmd20tPmluZm8sIE1NSU9NX09QRU4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlzekZpbGVOYW1lLCAwLCBNTUlPX1BST0NfMzJBKTsKCiAgICAvKiBncmFiIGZpbGUgc2l6ZSwgd2hlbiBwb3NzaWJsZSAqLwogICAgd20tPmR3RmlsZVNpemUgPSBHZXRGaWxlU2l6ZSgoSEFORExFKXdtLT5pbmZvLmFkd0luZm9bMF0sIE5VTEwpOwoKICAgIGlmIChyZWZtbWluZm8tPndFcnJvclJldCA9PSAwKQoJcmV0dXJuIHdtLT5pbmZvLmhtbWlvOwogZXJyb3IxOgogICAgaWYgKHdtLT5pb1Byb2MpIHdtLT5pb1Byb2MtPmNvdW50LS07CiBlcnJvcjI6CiAgICBNTUlPX0Rlc3Ryb3kod20pOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb09wZW5XICAgICAgIAkJW1dJTk1NLkBdCiAqLwpITU1JTyBXSU5BUEkgbW1pb09wZW5XKExQV1NUUiBzekZpbGVOYW1lLCBNTUlPSU5GTyogbHBtbWlvaW5mbywKCQkgICAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpCnsKICAgIEhNTUlPIAlyZXQ7CiAgICBMUFNUUglzekZuID0gTlVMTDsKCiAgICBpZiAoc3pGaWxlTmFtZSkKICAgIHsKICAgICAgICBJTlQgICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgc3pGaWxlTmFtZSwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwgKTsKICAgICAgICBzekZuID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKTsKICAgICAgICBpZiAoIXN6Rm4pIHJldHVybiBOVUxMOwogICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgc3pGaWxlTmFtZSwgLTEsIHN6Rm4sIGxlbiwgTlVMTCwgTlVMTCApOwogICAgfQoKICAgIHJldCA9IE1NSU9fT3BlbihzekZuLCBscG1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyVyk7CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pGbik7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9PcGVuQSAgICAgICAJCVtXSU5NTS5AXQogKi8KSE1NSU8gV0lOQVBJIG1taW9PcGVuQShMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTyogbHBtbWlvaW5mbywKCQkgICAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpCnsKICAgIHJldHVybiAgTU1JT19PcGVuKHN6RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMzJBKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQ2xvc2UgICAgICAJCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9DbG9zZShITU1JTyBobW1pbywgVUlOVCB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCXdtOwogICAgTU1SRVNVTFQgCXJlc3VsdDsKCiAgICBUUkFDRSgiKCVwLCAlMDRYKTtcbiIsIGhtbWlvLCB1RmxhZ3MpOwoKICAgIGlmICgod20gPSBNTUlPX0dldChobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgaWYgKChyZXN1bHQgPSBNTUlPX0ZsdXNoKHdtLCAwKSkgIT0gTU1TWVNFUlJfTk9FUlJPUikKCXJldHVybiByZXN1bHQ7CgogICAgcmVzdWx0ID0gc2VuZF9tZXNzYWdlKHdtLT5pb1Byb2MsICZ3bS0+aW5mbywgTU1JT01fQ0xPU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHVGbGFncywgMCwgTU1JT19QUk9DXzMyQSk7CgogICAgTU1JT19TZXRCdWZmZXIod20sIE5VTEwsIDAsIDApOwoKICAgIHdtLT5pb1Byb2MtPmNvdW50LS07CgogICAgaWYgKHdtLT5iVG1wSU9Qcm9jKQoJTU1JT19JbnN0YWxsSU9Qcm9jKHdtLT5pbmZvLmZjY0lPUHJvYywgd20tPmlvUHJvYy0+cElPUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1JT19SRU1PVkVQUk9DLCB3bS0+aW9Qcm9jLT50eXBlKTsKCiAgICBNTUlPX0Rlc3Ryb3kod20pOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlYWQJICAgICAgIAlbV0lOTU0uQF0KICovCkxPTkcgV0lOQVBJIG1taW9SZWFkKEhNTUlPIGhtbWlvLCBIUFNUUiBwY2gsIExPTkcgY2NoKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKICAgIExPTkcgCWNvdW50OwoKICAgIFRSQUNFKCIoJXAsICVwLCAlbGQpO1xuIiwgaG1taW8sIHBjaCwgY2NoKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIC0xOwoKICAgIC8qIHVuYnVmZmVyZWQgY2FzZSBmaXJzdCAqLwogICAgaWYgKCF3bS0+aW5mby5wY2hCdWZmZXIpCglyZXR1cm4gc2VuZF9tZXNzYWdlKHdtLT5pb1Byb2MsICZ3bS0+aW5mbywgTU1JT01fUkVBRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKXBjaCwgY2NoLCBNTUlPX1BST0NfMzJBKTsKCiAgICAvKiBmaXJzdCB0cnkgZnJvbSBjdXJyZW50IGJ1ZmZlciAqLwogICAgaWYgKHdtLT5pbmZvLnBjaE5leHQgIT0gd20tPmluZm8ucGNoRW5kUmVhZCkgewoJY291bnQgPSB3bS0+aW5mby5wY2hFbmRSZWFkIC0gd20tPmluZm8ucGNoTmV4dDsKCWlmIChjb3VudCA+IGNjaCB8fCBjb3VudCA8IDApIGNvdW50ID0gY2NoOwoJbWVtY3B5KHBjaCwgd20tPmluZm8ucGNoTmV4dCwgY291bnQpOwoJd20tPmluZm8ucGNoTmV4dCArPSBjb3VudDsKCXBjaCArPSBjb3VudDsKCWNjaCAtPSBjb3VudDsKICAgIH0gZWxzZQoJY291bnQgPSAwOwoKICAgIGlmIChjY2ggJiYgKHdtLT5pbmZvLmZjY0lPUHJvYyAhPSBGT1VSQ0NfTUVNKSkgewoJYXNzZXJ0KHdtLT5pbmZvLmNjaEJ1ZmZlcik7CgoJd2hpbGUgKGNjaCkgewoJICAgIExPTkcgc2l6ZTsKCgkgICAgc2l6ZSA9IE1NSU9fR3JhYk5leHRCdWZmZXIod20sIFRSVUUpOwoJICAgIGlmIChzaXplIDw9IDApIGJyZWFrOwoJICAgIGlmIChzaXplID4gY2NoKSBzaXplID0gY2NoOwoJICAgIG1lbWNweShwY2gsIHdtLT5pbmZvLnBjaEJ1ZmZlciwgc2l6ZSk7CgkgICAgd20tPmluZm8ucGNoTmV4dCArPSBzaXplOwoJICAgIHBjaCArPSBzaXplOwoJICAgIGNjaCAtPSBzaXplOwoJICAgIGNvdW50ICs9IHNpemU7Cgl9CiAgICB9CgogICAgVFJBQ0UoImNvdW50PSVsZFxuIiwgY291bnQpOwogICAgcmV0dXJuIGNvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9Xcml0ZSAgICAgIAkJW1dJTk1NLkBdCiAqLwpMT05HIFdJTkFQSSBtbWlvV3JpdGUoSE1NSU8gaG1taW8sIEhQQ1NUUiBwY2gsIExPTkcgY2NoKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKICAgIExPTkcJY291bnQ7CgogICAgVFJBQ0UoIiglcCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwoKICAgIGlmICgod20gPSBNTUlPX0dldChobW1pbykpID09IE5VTEwpCglyZXR1cm4gLTE7CgogICAgaWYgKHdtLT5pbmZvLmNjaEJ1ZmZlcikgewoJTE9ORwlieXRlc1cgPSAwOwoKICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgd2hpbGUgKGNjaCkgewogICAgICAgICAgICBpZiAod20tPmluZm8ucGNoTmV4dCAhPSB3bS0+aW5mby5wY2hFbmRXcml0ZSkgewogICAgICAgICAgICAgICAgY291bnQgPSB3bS0+aW5mby5wY2hFbmRXcml0ZSAtIHdtLT5pbmZvLnBjaE5leHQ7CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBjY2ggfHwgY291bnQgPCAwKSBjb3VudCA9IGNjaDsKICAgICAgICAgICAgICAgIG1lbWNweSh3bS0+aW5mby5wY2hOZXh0LCBwY2gsIGNvdW50KTsKICAgICAgICAgICAgICAgIHdtLT5pbmZvLnBjaE5leHQgKz0gY291bnQ7CiAgICAgICAgICAgICAgICBwY2ggKz0gY291bnQ7CiAgICAgICAgICAgICAgICBjY2ggLT0gY291bnQ7CiAgICAgICAgICAgICAgICBieXRlc1cgKz0gY291bnQ7CiAgICAgICAgICAgICAgICB3bS0+aW5mby5kd0ZsYWdzIHw9IE1NSU9fRElSVFk7CgkgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgewogICAgICAgICAgICAgICAgICAgIGlmICh3bS0+aW5mby5hZHdJbmZvWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyb20gd2hlcmUgd291bGQgd2UgZ2V0IHRoZSBtZW1vcnkgaGFuZGxlPyAqLwogICAgICAgICAgICAgICAgICAgICAgICBGSVhNRSgibWVtb3J5IGZpbGUgZXhwYW5zaW9uIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkgICAgfSBlbHNlIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAod20tPmluZm8ucGNoTmV4dCA9PSB3bS0+aW5mby5wY2hFbmRXcml0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRik7CiAgICAgICAgICAgICAgICBNTUlPX0dyYWJOZXh0QnVmZmVyKHdtLCBGQUxTRSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICB9Cgljb3VudCA9IGJ5dGVzVzsKICAgIH0gZWxzZSB7Cgljb3VudCA9IHNlbmRfbWVzc2FnZSh3bS0+aW9Qcm9jLCAmd20tPmluZm8sIE1NSU9NX1dSSVRFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKXBjaCwgY2NoLCBNTUlPX1BST0NfMzJBKTsKCXdtLT5pbmZvLmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIH0KCiAgICBUUkFDRSgiYnl0ZXMgd3JpdHRlbj0lbGRcbiIsIGNvdW50KTsKICAgIHJldHVybiBjb3VudDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VlawkJW1dJTk1NLkBdCiAqLwpMT05HIFdJTkFQSSBtbWlvU2VlayhITU1JTyBobW1pbywgTE9ORyBsT2Zmc2V0LCBJTlQgaU9yaWdpbikKewogICAgTFBXSU5FX01NSU8Jd207CiAgICBMT05HIAlvZmZzZXQ7CgogICAgVFJBQ0UoIiglcCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIC8qIG5vdCBidWZmZXJlZCwgZGlyZWN0IHNlZWsgb24gZmlsZSAqLwogICAgaWYgKCF3bS0+aW5mby5wY2hCdWZmZXIpCglyZXR1cm4gc2VuZF9tZXNzYWdlKHdtLT5pb1Byb2MsICZ3bS0+aW5mbywgTU1JT01fU0VFSywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsT2Zmc2V0LCBpT3JpZ2luLCBNTUlPX1BST0NfMzJBKTsKCiAgICBzd2l0Y2ggKGlPcmlnaW4pIHsKICAgIGNhc2UgU0VFS19TRVQ6CglvZmZzZXQgPSBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfQ1VSOgoJb2Zmc2V0ID0gd20tPmluZm8ubEJ1Zk9mZnNldCArICh3bS0+aW5mby5wY2hOZXh0IC0gd20tPmluZm8ucGNoQnVmZmVyKSArIGxPZmZzZXQ7CglicmVhazsKICAgIGNhc2UgU0VFS19FTkQ6CglvZmZzZXQgPSAoKHdtLT5pbmZvLmZjY0lPUHJvYyA9PSBGT1VSQ0NfTUVNKT8gd20tPmluZm8uY2NoQnVmZmVyIDogd20tPmR3RmlsZVNpemUpIC0gbE9mZnNldDsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiAtMTsKICAgIH0KCiAgICBpZiAob2Zmc2V0ICYmIG9mZnNldCA+PSB3bS0+ZHdGaWxlU2l6ZSAmJiB3bS0+aW5mby5mY2NJT1Byb2MgIT0gRk9VUkNDX01FTSkgewogICAgICAgIC8qIHNob3VsZCBjaGVjayB0aGF0IHdyaXRlIG1vZGUgZXhpc3RzICovCiAgICAgICAgaWYgKE1NSU9fRmx1c2god20sIDApICE9IE1NU1lTRVJSX05PRVJST1IpCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB3bS0+aW5mby5sQnVmT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIHdtLT5pbmZvLnBjaEVuZFJlYWQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICAgICAgd20tPmluZm8ucGNoRW5kV3JpdGUgPSB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXI7CiAgICAgICAgaWYgKCh3bS0+aW5mby5kd0ZsYWdzICYgTU1JT19SV01PREUpID09IE1NSU9fUkVBRCkgewogICAgICAgICAgICB3bS0+aW5mby5sRGlza09mZnNldCA9IHdtLT5kd0ZpbGVTaXplOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoKHdtLT5pbmZvLmNjaEJ1ZmZlciA+IDApICYmCgkoKG9mZnNldCA8IHdtLT5pbmZvLmxCdWZPZmZzZXQpIHx8CgkgKG9mZnNldCA+PSB3bS0+aW5mby5sQnVmT2Zmc2V0ICsgd20tPmluZm8uY2NoQnVmZmVyKSB8fAoJICF3bS0+YkJ1ZmZlckxvYWRlZCkpIHsKICAgICAgICAvKiBzdGF5IGluIHNhbWUgYnVmZmVyID8gKi8KICAgICAgICAvKiBzb21lIG1lbW9yeSBtYXBwZWQgYnVmZmVycyBhcmUgZGVmaW5lZCB3aXRoIC0xIGFzIGEgc2l6ZSAqLwoKCS8qIGNvbmRpdGlvbiB0byBjaGFuZ2UgYnVmZmVyICovCglpZiAoKHdtLT5pbmZvLmZjY0lPUHJvYyA9PSBGT1VSQ0NfTUVNKSB8fAoJICAgIE1NSU9fRmx1c2god20sIDApICE9IE1NU1lTRVJSX05PRVJST1IgfHwKCSAgICAvKiB0aGlzIGFsc28gc2V0cyB0aGUgd20tPmluZm8ubERpc2tPZmZzZXQgZmllbGQgKi8KCSAgICBzZW5kX21lc3NhZ2Uod20tPmlvUHJvYywgJndtLT5pbmZvLCBNTUlPTV9TRUVLLAogICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldCAvIHdtLT5pbmZvLmNjaEJ1ZmZlcikgKiB3bS0+aW5mby5jY2hCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSkgPT0gLTEpCgkgICAgcmV0dXJuIC0xOwoJTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgVFJVRSk7CiAgICB9CgogICAgd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChvZmZzZXQgLSB3bS0+aW5mby5sQnVmT2Zmc2V0KTsKCiAgICBUUkFDRSgiPT4gJWxkXG4iLCBvZmZzZXQpOwogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvR2V0SW5mbwkgICAgICAgCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9HZXRJbmZvKEhNTUlPIGhtbWlvLCBNTUlPSU5GTyogbHBtbWlvaW5mbywgVUlOVCB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKCVwLCVwLDB4JTA4eClcbiIsaG1taW8sbHBtbWlvaW5mbyx1RmxhZ3MpOwoKICAgIGlmICgod20gPSBNTUlPX0dldChobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgbWVtY3B5KGxwbW1pb2luZm8sICZ3bS0+aW5mbywgc2l6ZW9mKE1NSU9JTkZPKSk7CiAgICAvKiBkb24ndCBleHBvc2UgMTYgYml0IGlvcHJvYzpzICovCiAgICBpZiAod20tPmlvUHJvYy0+dHlwZSAhPSBNTUlPX1BST0NfMTYpCiAgICAgICAgbHBtbWlvaW5mby0+cElPUHJvYyA9IHdtLT5pb1Byb2MtPnBJT1Byb2M7CgogICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NldEluZm8gICAgCQlbV0lOTU0uQF0KICovCk1NUkVTVUxUIFdJTkFQSSBtbWlvU2V0SW5mbyhITU1JTyBobW1pbywgY29uc3QgTU1JT0lORk8qIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIiglcCwlcCwweCUwOHgpXG4iLGhtbWlvLGxwbW1pb2luZm8sdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIC8qIGNoZWNrIHBvaW50ZXJzIGNvaGVyZW5jZSAqLwogICAgaWYgKGxwbW1pb2luZm8tPnBjaE5leHQgPCB3bS0+aW5mby5wY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaE5leHQgPiB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPCB3bS0+aW5mby5wY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPiB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlIDwgd20tPmluZm8ucGNoQnVmZmVyIHx8CglscG1taW9pbmZvLT5wY2hFbmRXcml0ZSA+IHdtLT5pbmZvLnBjaEJ1ZmZlciArIHdtLT5pbmZvLmNjaEJ1ZmZlcikKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIHdtLT5pbmZvLnBjaE5leHQgPSBscG1taW9pbmZvLT5wY2hOZXh0OwogICAgd20tPmluZm8ucGNoRW5kUmVhZCA9IGxwbW1pb2luZm8tPnBjaEVuZFJlYWQ7CgogICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIAkJCQltbWlvU2V0QnVmZmVyCQlbV0lOTU0uQF0KKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9TZXRCdWZmZXIoSE1NSU8gaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIihobW1pbz0lcCwgcGNoQnVmPSVwLCBjY2hCdWY9JWxkLCB1RmxhZ3M9JSMwOHgpXG4iLAoJICBobW1pbywgcGNoQnVmZmVyLCBjY2hCdWZmZXIsIHVGbGFncyk7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICByZXR1cm4gTU1JT19TZXRCdWZmZXIod20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9GbHVzaCAgICAgIAkJW1dJTk1NLkBdCiAqLwpNTVJFU1VMVCBXSU5BUEkgbW1pb0ZsdXNoKEhNTUlPIGhtbWlvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCIoJXAsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIHJldHVybiBNTUlPX0ZsdXNoKHdtLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9BZHZhbmNlICAgICAgCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9BZHZhbmNlKEhNTUlPIGhtbWlvLCBNTUlPSU5GTyogbHBtbWlvaW5mbywgVUlOVCB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiaG1taW89JXAsIGxwbW1pb2luZm89JXAsIHVGbGFncz0lMDRYXG4iLCBobW1pbywgbHBtbWlvaW5mbywgdUZsYWdzKTsKCiAgICAvKiBOT1RFOiBtbWlvQWR2YW5jZTE2IGhlYXZpbHkgcmVsaWVzIG9uIHBhcmFtZXRlcnMgZnJvbSBscG1taW9pbmZvIHdlJ3JlIHVzaW5nCiAgICAgKiBoZXJlLiBiZSBzdXJlIGlmIHlvdSBjaGFuZ2Ugc29tZXRoaW5nIGhlcmUgdG8gY2hlY2sgbW1pb0FkdmFuY2UxNiBhcyB3ZWxsCiAgICAgKi8KICAgIGlmICgod20gPSBNTUlPX0dldChobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgaWYgKCF3bS0+aW5mby5jY2hCdWZmZXIpCglyZXR1cm4gTU1JT0VSUl9VTkJVRkZFUkVEOwoKICAgIGlmICh1RmxhZ3MgIT0gTU1JT19SRUFEICYmIHVGbGFncyAhPSBNTUlPX1dSSVRFKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CgogICAgaWYgKHVGbGFncyA9PSBNTUlPX1dSSVRFICYmIChscG1taW9pbmZvLT5kd0ZsYWdzICYgTU1JT19ESVJUWSkpCiAgICB7CiAgICAgICAgc2VuZF9tZXNzYWdlKHdtLT5pb1Byb2MsICZ3bS0+aW5mbywgTU1JT01fU0VFSywgCiAgICAgICAgICAgICAgICAgICAgIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQsIFNFRUtfU0VULCBNTUlPX1BST0NfMzJBKTsKICAgICAgICBzZW5kX21lc3NhZ2Uod20tPmlvUHJvYywgJndtLT5pbmZvLCBNTUlPTV9XUklURSwgCiAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pbHBtbWlvaW5mby0+cGNoQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICBscG1taW9pbmZvLT5wY2hOZXh0IC0gbHBtbWlvaW5mby0+cGNoQnVmZmVyLCBNTUlPX1BST0NfMzJBKTsKICAgICAgICBscG1taW9pbmZvLT5kd0ZsYWdzICY9IH5NTUlPX0RJUlRZOwogICAgfQogICAgaWYgKE1NSU9fRmx1c2god20sIDApICE9IE1NU1lTRVJSX05PRVJST1IpCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKCiAgICBpZiAobHBtbWlvaW5mbykgewoJd20tPmR3RmlsZVNpemUgPSBtYXgod20tPmR3RmlsZVNpemUsIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHBtbWlvaW5mby0+cGNoTmV4dCAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcikpOwogICAgfQogICAgTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgdUZsYWdzID09IE1NSU9fUkVBRCk7CgogICAgaWYgKGxwbW1pb2luZm8pIHsKCWxwbW1pb2luZm8tPnBjaE5leHQgPSBscG1taW9pbmZvLT5wY2hCdWZmZXI7CglscG1taW9pbmZvLT5wY2hFbmRSZWFkICA9IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciArCgkgICAgKHdtLT5pbmZvLnBjaEVuZFJlYWQgLSB3bS0+aW5mby5wY2hCdWZmZXIpOwoJbHBtbWlvaW5mby0+cGNoRW5kV3JpdGUgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKwoJICAgICh3bS0+aW5mby5wY2hFbmRXcml0ZSAtIHdtLT5pbmZvLnBjaEJ1ZmZlcik7CglscG1taW9pbmZvLT5sRGlza09mZnNldCA9IHdtLT5pbmZvLmxEaXNrT2Zmc2V0OwoJbHBtbWlvaW5mby0+bEJ1Zk9mZnNldCA9IHdtLT5pbmZvLmxCdWZPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU3RyaW5nVG9GT1VSQ0NBCVtXSU5NTS5AXQogKi8KRk9VUkNDIFdJTkFQSSBtbWlvU3RyaW5nVG9GT1VSQ0NBKExQQ1NUUiBzeiwgVUlOVCB1RmxhZ3MpCnsKICAgIENIQVIgY2NbNF07CiAgICBpbnQgaSA9IDA7CgogICAgZm9yIChpID0gMDsgaSA8IDQgJiYgc3pbaV07IGkrKykgewoJaWYgKHVGbGFncyAmIE1NSU9fVE9VUFBFUikgewoJICAgIGNjW2ldID0gdG91cHBlcihzeltpXSk7Cgl9IGVsc2UgewoJICAgIGNjW2ldID0gc3pbaV07Cgl9CiAgICB9CgogICAgLyogUGFkIHdpdGggc3BhY2VzICovCiAgICB3aGlsZSAoaSA8IDQpIGNjW2krK10gPSAnICc7CgogICAgVFJBQ0UoIkdvdCAnJS40cydcbiIsY2MpOwogICAgcmV0dXJuIG1taW9GT1VSQ0MoY2NbMF0sY2NbMV0sY2NbMl0sY2NbM10pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TdHJpbmdUb0ZPVVJDQ1cJW1dJTk1NLkBdCiAqLwpGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQ1coTFBDV1NUUiBzeiwgVUlOVCB1RmxhZ3MpCnsKICAgIGNoYXIJc3pBWzRdOwoKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgc3osIDQsIHN6QSwgc2l6ZW9mKHN6QSksIE5VTEwsIE5VTEwgKTsKICAgIHJldHVybiBtbWlvU3RyaW5nVG9GT1VSQ0NBKHN6QSx1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9JbnN0YWxsSU9Qcm9jQQkgICBbV0lOTU0uQF0KICovCkxQTU1JT1BST0MgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jQShGT1VSQ0MgZmNjSU9Qcm9jLAoJCQkJICAgICBMUE1NSU9QUk9DIHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCnsKICAgIHJldHVybiBNTUlPX0luc3RhbGxJT1Byb2MoZmNjSU9Qcm9jLCBwSU9Qcm9jLCBkd0ZsYWdzLCBNTUlPX1BST0NfMzJBKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvSW5zdGFsbElPUHJvY1cJICAgW1dJTk1NLkBdCiAqLwpMUE1NSU9QUk9DIFdJTkFQSSBtbWlvSW5zdGFsbElPUHJvY1coRk9VUkNDIGZjY0lPUHJvYywKCQkJCSAgICAgTFBNTUlPUFJPQyBwSU9Qcm9jLCBEV09SRCBkd0ZsYWdzKQp7CiAgICByZXR1cm4gTU1JT19JbnN0YWxsSU9Qcm9jKGZjY0lPUHJvYywgcElPUHJvYywgZHdGbGFncywgTU1JT19QUk9DXzMyVyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1NSU9fU2VuZE1lc3NhZ2UKICoKICoKICovCkxSRVNVTFQgICAgICAgICBNTUlPX1NlbmRNZXNzYWdlKEhNTUlPIGhtbWlvLCBVSU5UIHVNZXNzYWdlLCBMUEFSQU0gbFBhcmFtMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yLCBlbnVtIG1taW9Qcm9jVHlwZSB0eXBlKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIiglcCwgJXUsICVsZCwgJWxkLCAlZClcbiIsIGhtbWlvLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMiwgdHlwZSk7CgogICAgaWYgKHVNZXNzYWdlIDwgTU1JT01fVVNFUikKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIGlmICgod20gPSBNTUlPX0dldChobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgcmV0dXJuIHNlbmRfbWVzc2FnZSh3bS0+aW9Qcm9jLCAmd20tPmluZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yLCB0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VuZE1lc3NhZ2UJCVtXSU5NTS5AXQogKi8KTFJFU1VMVCBXSU5BUEkgbW1pb1NlbmRNZXNzYWdlKEhNTUlPIGhtbWlvLCBVSU5UIHVNZXNzYWdlLAoJCQkgICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQp7CiAgICByZXR1cm4gTU1JT19TZW5kTWVzc2FnZShobW1pbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIsIE1NSU9fUFJPQ18zMkEpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9EZXNjZW5kICAgICAgICAgCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9EZXNjZW5kKEhNTUlPIGhtbWlvLCBMUE1NQ0tJTkZPIGxwY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNTUNLSU5GTyogbHBja1BhcmVudCwgVUlOVCB1RmxhZ3MpCnsKICAgIERXT1JECQlkd09sZFBvczsKICAgIEZPVVJDQwkJc3JjaENrSWQ7CiAgICBGT1VSQ0MJCXNyY2hUeXBlOwoKCiAgICBUUkFDRSgiKCVwLCAlcCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIGxwY2tQYXJlbnQsIHVGbGFncyk7CgogICAgaWYgKGxwY2sgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIGR3T2xkUG9zID0gbW1pb1NlZWsoaG1taW8sIDAsIFNFRUtfQ1VSKTsKICAgIFRSQUNFKCJkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKCiAgICBpZiAobHBja1BhcmVudCAhPSBOVUxMKSB7CglUUkFDRSgic2VlayBpbnNpZGUgcGFyZW50IGF0ICVsZCAhXG4iLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQpOwoJLyogRVBQOiB3YXMgZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbyxscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQsU0VFS19TRVQpOyAqLwoJaWYgKGR3T2xkUG9zIDwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0IHx8CgkgICAgZHdPbGRQb3MgPj0gbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0ICsgbHBja1BhcmVudC0+Y2tzaXplKSB7CgkgICAgV0FSTigib3V0c2lkZSBwYXJlbnQgY2h1bmtcbiIpOwoJICAgIHJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7Cgl9CiAgICB9CgogICAgLyogVGhlIFNESyBkb2N1IHNheXMgJ2NraWQnIGlzIHVzZWQgZm9yIGFsbCBjYXNlcy4gUmVhbCBXb3JsZAogICAgICogZXhhbXBsZXMgZGlzYWdyZWUgLU1hcmN1cyw5OTAyMTYuCiAgICAgKi8KCiAgICBzcmNoVHlwZSA9IDA7CiAgICAvKiBmaW5kX2NodW5rIGxvb2tzIGZvciAnY2tpZCcgKi8KICAgIGlmICh1RmxhZ3MgJiBNTUlPX0ZJTkRDSFVOSykKCXNyY2hDa0lkID0gbHBjay0+Y2tpZDsKICAgIC8qIGZpbmRfcmlmZiBhbmQgZmluZF9saXN0IGxvb2sgZm9yICdmY2NUeXBlJyAqLwogICAgaWYgKHVGbGFncyAmIE1NSU9fRklORExJU1QpIHsKCXNyY2hDa0lkID0gRk9VUkNDX0xJU1Q7CglzcmNoVHlwZSA9IGxwY2stPmZjY1R5cGU7CiAgICB9CiAgICBpZiAodUZsYWdzICYgTU1JT19GSU5EUklGRikgewoJc3JjaENrSWQgPSBGT1VSQ0NfUklGRjsKCXNyY2hUeXBlID0gbHBjay0+ZmNjVHlwZTsKICAgIH0KCiAgICBpZiAodUZsYWdzICYgKE1NSU9fRklORENIVU5LfE1NSU9fRklORExJU1R8TU1JT19GSU5EUklGRikpIHsKCVRSQUNFKCJzZWFyY2hpbmcgZm9yICUuNHMuJS40c1xuIiwKCSAgICAgIChMUFNUUikmc3JjaENrSWQsCgkgICAgICBzcmNoVHlwZT8oTFBTVFIpJnNyY2hUeXBlOiJhbnkgIik7CgoJd2hpbGUgKFRSVUUpIHsKCSAgICBMT05HIGl4OwoKCSAgICBpeCA9IG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpOwoJICAgIGlmIChpeCA8IDIqc2l6ZW9mKERXT1JEKSkgewoJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwoJCVdBUk4oInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJICAgIH0KCSAgICBscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwoJICAgIGlmIChpeCA8IGxwY2stPmR3RGF0YU9mZnNldCAtIGR3T2xkUG9zKSB7CgkJbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7CgkJV0FSTigicmV0dXJuIENodW5rTm90Rm91bmRcbiIpOwoJCXJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7CgkgICAgfQoJICAgIFRSQUNFKCJja2lkPSUuNHMgZmNjPSUuNHMgY2tzaXplPSUwOGxYICFcbiIsCgkJICAoTFBTVFIpJmxwY2stPmNraWQsCgkJICBzcmNoVHlwZT8oTFBTVFIpJmxwY2stPmZjY1R5cGU6IjxuYT4iLAoJCSAgbHBjay0+Y2tzaXplKTsKCSAgICBpZiAoKHNyY2hDa0lkID09IGxwY2stPmNraWQpICYmCgkJKCFzcmNoVHlwZSB8fCAoc3JjaFR5cGUgPT0gbHBjay0+ZmNjVHlwZSkpCgkJKQoJCWJyZWFrOwoKCSAgICBkd09sZFBvcyA9IGxwY2stPmR3RGF0YU9mZnNldCArICgobHBjay0+Y2tzaXplICsgMSkgJiB+MSk7CgkgICAgbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7Cgl9CiAgICB9IGVsc2UgewoJLyogRklYTUU6IHVudmVyaWZpZWQsIGRvZXMgaXQgZG8gdGhpcz8gKi8KCS8qIE5COiBUaGlzIHBhcnQgaXMgdXNlZCBieSBXQVZFX21jaU9wZW4sIGFtb25nIG90aGVycyAqLwoJaWYgKG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpIDwgMyAqIHNpemVvZihEV09SRCkpIHsKCSAgICBtbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKCSAgICBXQVJOKCJyZXR1cm4gQ2h1bmtOb3RGb3VuZCAybmRcbiIpOwoJICAgIHJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7Cgl9CglscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwogICAgfQogICAgbHBjay0+ZHdGbGFncyA9IDA7CiAgICAvKiBJZiB3ZSB3ZXJlIGxvb2tpbmcgZm9yIFJJRkYvTElTVCBjaHVua3MsIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uCiAgICAgKiBpcyBhZnRlciB0aGUgY2h1bmtpZC4gSWYgd2Ugd2VyZSBqdXN0IGxvb2tpbmcgZm9yIHRoZSBjaHVuawogICAgICogaXQgaXMgYWZ0ZXIgdGhlIGNrc2l6ZS4gU28gYWRkIDQgaW4gUklGRi9MSVNUIGNhc2UuCiAgICAgKi8KICAgIGlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpCgltbWlvU2VlayhobW1pbywgbHBjay0+ZHdEYXRhT2Zmc2V0ICsgc2l6ZW9mKERXT1JEKSwgU0VFS19TRVQpOwogICAgZWxzZQoJbW1pb1NlZWsoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOwogICAgVFJBQ0UoImxwY2s6IGNraWQ9JS40cywgY2tzaXplPSVsZCwgZHdEYXRhT2Zmc2V0PSVsZCBmY2NUeXBlPSUwOGxYICglLjRzKSFcbiIsCgkgIChMUFNUUikmbHBjay0+Y2tpZCwgbHBjay0+Y2tzaXplLCBscGNrLT5kd0RhdGFPZmZzZXQsCgkgIGxwY2stPmZjY1R5cGUsIHNyY2hUeXBlPyhMUFNUUikmbHBjay0+ZmNjVHlwZToiIik7CiAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQXNjZW5kICAgICAJCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8gaG1taW8sIExQTU1DS0lORk8gbHBjaywgVUlOVCB1RmxhZ3MpCnsKICAgIFRSQUNFKCIoJXAsICVwLCAlMDRYKTtcbiIsIGhtbWlvLCBscGNrLCB1RmxhZ3MpOwoKICAgIGlmIChscGNrLT5kd0ZsYWdzICYgTU1JT19ESVJUWSkgewoJRFdPUkQJZHdPbGRQb3MsIGR3TmV3U2l6ZTsKCglUUkFDRSgiQ2h1bmsgaXMgZGlydHksIGNoZWNraW5nIGlmIGNodW5rJ3Mgc2l6ZSBpcyBjb3JyZWN0XG4iKTsKCWR3T2xkUG9zID0gbW1pb1NlZWsoaG1taW8sIDAsIFNFRUtfQ1VSKTsKCVRSQUNFKCJkd09sZFBvcz0lbGQgbHBjay0+ZHdEYXRhT2Zmc2V0ID0gJWxkXG4iLCBkd09sZFBvcywgbHBjay0+ZHdEYXRhT2Zmc2V0KTsKCWR3TmV3U2l6ZSA9IGR3T2xkUG9zIC0gbHBjay0+ZHdEYXRhT2Zmc2V0OwoJaWYgKGR3TmV3U2l6ZSAhPSBscGNrLT5ja3NpemUpIHsKCSAgICBUUkFDRSgiTm9wZTogbHBjay0+Y2tzaXplPSVsZCBkd05ld1NpemU9JWxkXG4iLCBscGNrLT5ja3NpemUsIGR3TmV3U2l6ZSk7CgkgICAgbHBjay0+Y2tzaXplID0gZHdOZXdTaXplOwoKCSAgICAvKiBwYWQgb2RkIHNpemUgd2l0aCAwICovCgkgICAgaWYgKGR3TmV3U2l6ZSAmIDEpIHsKCQljaGFyIGNoID0gMDsKCQltbWlvV3JpdGUoaG1taW8sICZjaCwgMSk7CgkgICAgfQoJICAgIG1taW9TZWVrKGhtbWlvLCBscGNrLT5kd0RhdGFPZmZzZXQgLSBzaXplb2YoRFdPUkQpLCBTRUVLX1NFVCk7CgkgICAgbW1pb1dyaXRlKGhtbWlvLCAoTFBTVFIpJmR3TmV3U2l6ZSwgc2l6ZW9mKERXT1JEKSk7Cgl9CglscGNrLT5kd0ZsYWdzID0gMDsKICAgIH0KCiAgICBtbWlvU2VlayhobW1pbywgbHBjay0+ZHdEYXRhT2Zmc2V0ICsgKChscGNrLT5ja3NpemUgKyAxKSAmIH4xKSwgU0VFS19TRVQpOwoKICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJbW1pb0NyZWF0ZUNodW5rCQkJCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9DcmVhdGVDaHVuayhITU1JTyBobW1pbywgTU1DS0lORk8qIGxwY2ssIFVJTlQgdUZsYWdzKQp7CiAgICBEV09SRAlkd09sZFBvczsKICAgIExPTkcgCXNpemU7CiAgICBMT05HIAlpeDsKCiAgICBUUkFDRSgiKCVwLCAlcCwgJTA0WCk7XG4iLCBobW1pbywgbHBjaywgdUZsYWdzKTsKCiAgICBkd09sZFBvcyA9IG1taW9TZWVrKGhtbWlvLCAwLCBTRUVLX0NVUik7CiAgICBUUkFDRSgiZHdPbGRQb3M9JWxkXG4iLCBkd09sZFBvcyk7CgogICAgaWYgKHVGbGFncyA9PSBNTUlPX0NSRUFURUxJU1QpCglscGNrLT5ja2lkID0gRk9VUkNDX0xJU1Q7CiAgICBlbHNlIGlmICh1RmxhZ3MgPT0gTU1JT19DUkVBVEVSSUZGKQoJbHBjay0+Y2tpZCA9IEZPVVJDQ19SSUZGOwoKICAgIFRSQUNFKCJja2lkPSUuNHNcbiIsIChMUFNUUikmbHBjay0+Y2tpZCk7CgogICAgc2l6ZSA9IDIgKiBzaXplb2YoRFdPUkQpOwogICAgbHBjay0+ZHdEYXRhT2Zmc2V0ID0gZHdPbGRQb3MgKyBzaXplOwoKICAgIGlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpCglzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBscGNrLT5kd0ZsYWdzID0gTU1JT19ESVJUWTsKCiAgICBpeCA9IG1taW9Xcml0ZShobW1pbywgKExQU1RSKWxwY2ssIHNpemUpOwogICAgVFJBQ0UoImFmdGVyIG1taW9Xcml0ZSBpeCA9ICVsZCByZXEgPSAlbGQsIGVycm5vID0gJWRcbiIsaXgsIHNpemUsIGVycm5vKTsKICAgIGlmIChpeCA8IHNpemUpIHsKCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwoJV0FSTigicmV0dXJuIENhbm5vdFdyaXRlXG4iKTsKCXJldHVybiBNTUlPRVJSX0NBTk5PVFdSSVRFOwogICAgfQoKICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZW5hbWVBICAgIAkJCVtXSU5NTS5AXQogKi8KTU1SRVNVTFQgV0lOQVBJIG1taW9SZW5hbWVBKExQQ1NUUiBzekZpbGVOYW1lLCBMUENTVFIgc3pOZXdGaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1NSU9JTkZPKiBscG1taW9pbmZvLCBEV09SRCBkd0ZsYWdzKQp7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCogIGlvUHJvYyA9IE5VTEw7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCAgIHRtcDsKICAgIEZPVVJDQyAgICAgICAgICAgICAgZmNjOwoKICAgIFRSQUNFKCIoJyVzJywgJyVzJywgJXAsICUwOGxYKTtcbiIsCgkgIGRlYnVnc3RyX2Eoc3pGaWxlTmFtZSksIGRlYnVnc3RyX2Eoc3pOZXdGaWxlTmFtZSksIGxwbW1pb2luZm8sIGR3RmxhZ3MpOwoKICAgIC8qIElmIGJvdGggcGFyYW1zIGFyZSBOVUxMLCB0aGVuIHBhcnNlIHRoZSBmaWxlIG5hbWUgKi8KICAgIGlmIChscG1taW9pbmZvICYmIGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKICAgIHsKCWZjYyA9IE1NSU9fUGFyc2VFeHRBKHN6RmlsZU5hbWUpOwogICAgICAgIGlmIChmY2MpIGlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKGZjYyk7CiAgICB9CgogICAgLyogSGFuZGxlIGFueSB1bmhhbmRsZWQvZXJyb3IgY2FzZSBmcm9tIGFib3ZlLiBBc3N1bWUgRE9TIGZpbGUgKi8KICAgIGlmICghbHBtbWlvaW5mbyB8fCAobHBtbWlvaW5mby0+ZmNjSU9Qcm9jID09IDAgJiYgbHBtbWlvaW5mby0+cElPUHJvYyA9PSBOVUxMICYmIGlvUHJvYyA9PSBOVUxMKSkKCWlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKEZPVVJDQ19ET1MpOwogICAgLyogaWYganVzdCB0aGUgZm91ciBjaGFyYWN0ZXIgY29kZSBpcyBwcmVzZW50LCBsb29rIHVwIElPIHByb2MgKi8KICAgIGVsc2UgaWYgKGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKICAgICAgICBpb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZShscG1taW9pbmZvLT5mY2NJT1Byb2MpOwogICAgZWxzZSAvKiB1c2UgcmVsZXZhbnQgaW9Qcm9jICovCiAgICB7CiAgICAgICAgaW9Qcm9jID0gJnRtcDsKICAgICAgICB0bXAuZm91ckNDID0gbHBtbWlvaW5mby0+ZmNjSU9Qcm9jOwogICAgICAgIHRtcC5wSU9Qcm9jID0gbHBtbWlvaW5mby0+cElPUHJvYzsKICAgICAgICB0bXAudHlwZSA9IE1NSU9fUFJPQ18zMkE7CiAgICAgICAgdG1wLmNvdW50ID0gMTsKICAgIH0KCiAgICAvKiBGSVhNRTogc2hvdWxkIHdlIGFjdHVhbGx5IHBhc3MgbHBtbWlvaW5mbyBkb3duIHRoZSBkcmFpbiA/Pz8KICAgICAqIG9yIG1ha2UgYSBjb3B5IG9mIGl0IGJlY2F1c2UgaXQncyBjb25zdCA/Pz8KICAgICAqLwogICAgcmV0dXJuIHNlbmRfbWVzc2FnZShpb1Byb2MsIChNTUlPSU5GTyopbHBtbWlvaW5mbywgTU1JT01fUkVOQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKXN6RmlsZU5hbWUsIChMUEFSQU0pc3pOZXdGaWxlTmFtZSwgTU1JT19QUk9DXzMyQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlbmFtZVcgICAgCQkJW1dJTk1NLkBdCiAqLwpNTVJFU1VMVCBXSU5BUEkgbW1pb1JlbmFtZVcoTFBDV1NUUiBzekZpbGVOYW1lLCBMUENXU1RSIHN6TmV3RmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNTUlPSU5GTyogbHBtbWlvaW5mbywgRFdPUkQgZHdGbGFncykKewogICAgTFBTVFIJc3pGbiA9IE5VTEw7CiAgICBMUFNUUglzem5GbiA9IE5VTEw7CiAgICBVSU5UCXJldCA9IE1NU1lTRVJSX05PTUVNOwogICAgSU5UICAgICAgICAgbGVuOwoKICAgIGlmIChzekZpbGVOYW1lKQogICAgewogICAgICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgc3pGaWxlTmFtZSwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwgKTsKICAgICAgICBzekZuID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKTsKICAgICAgICBpZiAoIXN6Rm4pIGdvdG8gZG9uZTsKICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9BQ1AsIDAsIHN6RmlsZU5hbWUsIC0xLCBzekZuLCBsZW4sIE5VTEwsIE5VTEwgKTsKICAgIH0KICAgIGlmIChzek5ld0ZpbGVOYW1lKQogICAgewogICAgICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgc3pOZXdGaWxlTmFtZSwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwgKTsKICAgICAgICBzem5GbiA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuICk7CiAgICAgICAgaWYgKCFzem5GbikgZ290byBkb25lOwogICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX0FDUCwgMCwgc3pOZXdGaWxlTmFtZSwgLTEsIHN6bkZuLCBsZW4sIE5VTEwsIE5VTEwgKTsKICAgIH0KCiAgICByZXQgPSBtbWlvUmVuYW1lQShzekZuLCBzem5GbiwgbHBtbWlvaW5mbywgZHdGbGFncyk7Cgpkb25lOgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6Rm4pOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6bkZuKTsKICAgIHJldHVybiByZXQ7Cn0K