LyoKICogTkRSIGNsaWVudCBzdHVmZgogKgogKiBDb3B5cmlnaHQgMjAwMSBPdmUgS+V2ZW4sIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogVE9ETzoKICogIC0gRXhjZXB0aW9uIGhhbmRsaW5nCiAqICAtIENvbnRleHQgc3R1ZmYKICogIC0gV2hvIGtub3dzCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgInJwYy5oIgojaW5jbHVkZSAicnBjbmRyLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgIm5kcl9taXNjLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5vdGU6IHRoaXMgc2hvdWxkIHJldHVybiBhIENMSUVOVF9DQUxMX1JFVFVSTiwgYnV0IGNhbGxpbmcgY29udmVudGlvbiBmb3IKICogcmV0dXJuaW5nIHN0cnVjdHVyZXMvdW5pb25zIGlzIGRpZmZlcmVudCBiZXR3ZWVuIFdpbmRvd3MgYW5kIGdjYyBvbiBpMzg2LgogKi8KTE9OR19QVFIgUlBDUlQ0X05kckNsaWVudENhbGwyKFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2MsIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsIHZhX2xpc3QgYXJncykKewoKICBSUENfQ0xJRU5UX0lOVEVSRkFDRSAqcnBjX2NsaV9pZiA9IChSUENfQ0xJRU5UX0lOVEVSRkFDRSAqKShwU3R1YkRlc2MtPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uKTsKICBMT05HX1BUUiByZXQgPSAwOwovKgogIFJQQ19CSU5ESU5HX0hBTkRMRSBoYW5kbGUgPSAwOwogIFJQQ19NRVNTQUdFIHJwY21zZzsKICBNSURMX1NUVUJfTUVTU0FHRSBzdHVibXNnOwoqLwoKICBGSVhNRSgiKHBTdHViRGVjID09IF4lcCxwRm9ybWF0ID0gXiVwLC4uLik6IHN0dWJcbiIsIHBTdHViRGVzYywgcEZvcm1hdCk7CiAgaWYgKHJwY19jbGlfaWYpIC8qIE5VTEwgZm9yIG9iamVjdHMgKi8gewogICAgVFJBQ0UoIiAgKnJwY19jbGlfaWYgKD09IF4lcCkgPT0gKFJQQ19DTElFTlRfSU5URVJGQUNFKTpcbiIsIHBTdHViRGVzYyk7CiAgICBUUkFDRSgiICAgIExlbmd0aCA9PSAlZFxuIiwgcnBjX2NsaV9pZi0+TGVuZ3RoKTsKICAgIFRSQUNFKCIgICAgSW50ZXJmYWNlSUQgPT0gJXMgKCVkLiVkKVxuIiwgZGVidWdzdHJfZ3VpZCgmcnBjX2NsaV9pZi0+SW50ZXJmYWNlSWQuU3ludGF4R1VJRCksIAogICAgICBycGNfY2xpX2lmLT5JbnRlcmZhY2VJZC5TeW50YXhWZXJzaW9uLk1ham9yVmVyc2lvbiwgcnBjX2NsaV9pZi0+SW50ZXJmYWNlSWQuU3ludGF4VmVyc2lvbi5NaW5vclZlcnNpb24pOwogICAgVFJBQ0UoIiAgICBUcmFuc2ZlclN5bnRheCA9PSAlcyAoJWQuJWQpXG4iLCBkZWJ1Z3N0cl9ndWlkKCZycGNfY2xpX2lmLT5UcmFuc2ZlclN5bnRheC5TeW50YXhHVUlEKSwKICAgICAgcnBjX2NsaV9pZi0+VHJhbnNmZXJTeW50YXguU3ludGF4VmVyc2lvbi5NYWpvclZlcnNpb24sIHJwY19jbGlfaWYtPlRyYW5zZmVyU3ludGF4LlN5bnRheFZlcnNpb24uTWlub3JWZXJzaW9uKTsKICAgIFRSQUNFKCIgICAgRGlzcGF0Y2hUYWJsZSA9PSBeJXBcbiIsIHJwY19jbGlfaWYtPkRpc3BhdGNoVGFibGUpOwogICAgVFJBQ0UoIiAgICBScGNQcm90c2VxRW5kcG9pbnRDb3VudCA9PSBeJWRcbiIsIHJwY19jbGlfaWYtPlJwY1Byb3RzZXFFbmRwb2ludENvdW50KTsKICAgIFRSQUNFKCIgICAgUnBjUHJvdHNlcUVuZHBvaW50ID09IF4lcFxuIiwgcnBjX2NsaV9pZi0+UnBjUHJvdHNlcUVuZHBvaW50KTsKICAgIFRSQUNFKCIgICAgRmxhZ3MgPT0gXiVkXG4iLCBycGNfY2xpX2lmLT5GbGFncyk7CiAgfQoKICAvKiBmb3Igbm93LCB3aGlsZSB0aGVzZSBmdW5jdG9ucyBhcmUgdW5kZXIgZGV2ZWxvcG1lbnQsIHRoaXMgaXMgdG9vIHNrZXRjaHkuICBjb21tZW50ZWQgb3V0LiAqLwogIC8qCiAgTmRyQ2xpZW50SW5pdGlhbGl6ZU5ldyggJnJwY21zZywgJnN0dWJtc2csIHBTdHViRGVzYywgMCApOwogICAgICAgIAogIGhhbmRsZSA9IChSUENfQklORElOR19IQU5ETEUpMHhkZWFkYmVlZjsgKi8gLyogRklYTUUgKi8KCiAgLyogc3R1Ym1zZy5CdWZmZXJMZW5ndGggPSAwOyovIC8qIEZJWE1FICovCiAgLyoKICBOZHJHZXRCdWZmZXIoICZzdHVibXNnLCBzdHVibXNnLkJ1ZmZlckxlbmd0aCwgaGFuZGxlICk7CiAgTmRyU2VuZFJlY2VpdmUoICZzdHVibXNnLCBzdHVibXNnLkJ1ZmZlciAgKTsKICBOZHJGcmVlQnVmZmVyKCAmc3R1Ym1zZyApOwogICovCiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJDbGllbnRDYWxsMiBbUlBDUlQ0LkBdCiAqCiAqIE5vdGU6IHRoaXMgc2hvdWxkIHJldHVybiBhIENMSUVOVF9DQUxMX1JFVFVSTiwgYnV0IGNhbGxpbmcgY29udmVudGlvbiBmb3IKICogcmV0dXJuaW5nIHN0cnVjdHVyZXMvdW5pb25zIGlzIGRpZmZlcmVudCBiZXR3ZWVuIFdpbmRvd3MgYW5kIGdjYyBvbiBpMzg2LgogKi8KTE9OR19QVFIgV0lOQVBJViBOZHJDbGllbnRDYWxsMihQTUlETF9TVFVCX0RFU0MgcFN0dWJEZXNjLAogIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsIC4uLikKewogICAgTE9OR19QVFIgcmV0OwogICAgdmFfbGlzdCBhcmdzOwoKICAgIFRSQUNFKCIoJXAsJXAsLi4uKVxuIiwgcFN0dWJEZXNjLCBwRm9ybWF0KTsKCiAgICB2YV9zdGFydChhcmdzLCBwRm9ybWF0KTsKICAgIHJldCA9IFJQQ1JUNF9OZHJDbGllbnRDYWxsMihwU3R1YkRlc2MsIHBGb3JtYXQsIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwogICAgcmV0dXJuIHJldDsKfQo=