LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgezE5OTYtMjAwMX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFVDT0xfSAojZGVmaW5lIFVDT0xfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3Vub3JtLmgiCiNpbmNsdWRlICJ1bmljb2RlL3BhcnNlZXJyLmgiCgovKioKICogXGZpbGUKICogXGJyaWVmIEMgQVBJOiBDb2xsYXRvciAKICoKICogPGgyPiBDb2xsYXRvciBDIEFQSSA8L2gyPgogKgogKiBUaGUgQyBBUEkgZm9yIENvbGxhdG9yIHBlcmZvcm1zIGxvY2FsZS1zZW5zaXRpdmUKICogc3RyaW5nIGNvbXBhcmlzb24uIFlvdSB1c2UgdGhpcyBjbGFzcyB0byBidWlsZAogKiBzZWFyY2hpbmcgYW5kIHNvcnRpbmcgcm91dGluZXMgZm9yIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dC4KICogPGVtPkltcG9ydGFudDogPC9lbT5UaGUgSUNVIGNvbGxhdGlvbiBzZXJ2aWNlIGhhcyBiZWVuIHJlaW1wbGVtZW50ZWQgCiAqIGluIG9yZGVyIHRvIGFjaGlldmUgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBVQ0EgY29tcGxpYW5jZS4gCiAqIEZvciBkZXRhaWxzLCBzZWUgdGhlIAogKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2ljdWh0bWwvZGVzaWduL2NvbGxhdGlvbi9JQ1VfY29sbGF0aW9uX2Rlc2lnbi5odG0iPgogKiBjb2xsYXRpb24gZGVzaWduIGRvY3VtZW50PC9hPi4KICogPHA+CiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xsYXRpb24gc2VydmljZSBzZWUgCiAqIDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9pY3UvdXNlcmd1aWRlL0NvbGxhdGVfSW50cm8uaHRtbCI+dGhlIHVzZXJzIGd1aWRlPC9hPi4KICogPHA+CiAqIENvbGxhdGlvbiBzZXJ2aWNlIHByb3ZpZGVzIGNvcnJlY3Qgc29ydGluZyBvcmRlcnMgZm9yIG1vc3QgbG9jYWxlcyBzdXBwb3J0ZWQgaW4gSUNVLiAKICogSWYgc3BlY2lmaWMgZGF0YSBmb3IgYSBsb2NhbGUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIG9yZGVycyBldmVudHVhbGx5IGZhbGxzIGJhY2sKICogdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTAvIj5VQ0Egc29ydCBvcmRlcjwvYT4uIAogKiA8cD4KICogU29ydCBvcmRlcmluZyBtYXkgYmUgY3VzdG9taXplZCBieSBwcm92aWRpbmcgeW91ciBvd24gc2V0IG9mIHJ1bGVzLiBGb3IgbW9yZSBvbgogKiB0aGlzIHN1YmplY3Qgc2VlIHRoZSAKICogPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2ljdS91c2VyZ3VpZGUvQ29sbGF0ZV9DdXN0b21pemF0aW9uLmh0bWwiPgogKiBDb2xsYXRpb24gY3VzdG9taXphdGlvbjwvYT4gc2VjdGlvbiBvZiB0aGUgdXNlcnMgZ3VpZGUuCiAqIDxwPgogKiBAc2VlICAgICAgICAgVUNvbGxhdGlvblJlc3VsdAogKiBAc2VlICAgICAgICAgVU5vcm1hbGl6YXRpb25Nb2RlCiAqIEBzZWUgICAgICAgICAgICBVQ29sbGF0aW9uU3RyZW5ndGgKICogQHNlZSAgICAgICAgIFVDb2xsYXRpb25FbGVtZW50cwogKi8KCi8qKiBBIGNvbGxhdGlvbiBlbGVtZW50IGl0ZXJhdG9yLgoqICBGb3IgdXNhZ2UgaW4gQyBwcm9ncmFtcy4KKi8Kc3RydWN0IGNvbGxJdGVyYXRlOwovKiogc3RydWN0dXJlIHJlcHJlc2VudGluZyBjb2xsYXRpb24gZWxlbWVudCBpdGVyYXRvciBpbnN0YW5jZSAqLwp0eXBlZGVmIHN0cnVjdCBjb2xsSXRlcmF0ZSBjb2xsSXRlcmF0ZTsKCi8qKiBBIGNvbGxhdG9yLgoqICBGb3IgdXNhZ2UgaW4gQyBwcm9ncmFtcy4KKi8Kc3RydWN0IFVDb2xsYXRvcjsKLyoqIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBjb2xsYXRvciBvYmplY3QgaW5zdGFuY2UgKi8KdHlwZWRlZiBzdHJ1Y3QgVUNvbGxhdG9yIFVDb2xsYXRvcjsKCgovKioKICogVUNPTF9MRVNTIGlzIHJldHVybmVkIGlmIHNvdXJjZSBzdHJpbmcgaXMgY29tcGFyZWQgdG8gYmUgbGVzcyB0aGFuIHRhcmdldAogKiBzdHJpbmcgaW4gdGhlIHVfc3RyY29sbCgpIG1ldGhvZC4KICogVUNPTF9FUVVBTCBpcyByZXR1cm5lZCBpZiBzb3VyY2Ugc3RyaW5nIGlzIGNvbXBhcmVkIHRvIGJlIGVxdWFsIHRvIHRhcmdldAogKiBzdHJpbmcgaW4gdGhlIHVfc3RyY29sbCgpIG1ldGhvZC4KICogVUNPTF9HUkVBVEVSIGlzIHJldHVybmVkIGlmIHNvdXJjZSBzdHJpbmcgaXMgY29tcGFyZWQgdG8gYmUgZ3JlYXRlciB0aGFuCiAqIHRhcmdldCBzdHJpbmcgaW4gdGhlIHVfc3RyY29sbCgpIG1ldGhvZC4KICogQHNlZSB1X3N0cmNvbGwoKQogKiA8cD4KICogUG9zc2libGUgdmFsdWVzIGZvciBhIGNvbXBhcmlzb24gcmVzdWx0ICovCnR5cGVkZWYgZW51bSB7CiAgLyoqIHN0cmluZyBhID09IHN0cmluZyBiICovCiAgVUNPTF9FUVVBTCAgICA9IDAsCiAgLyoqIHN0cmluZyBhID4gc3RyaW5nIGIgKi8KICBVQ09MX0dSRUFURVIgICAgPSAxLAogIC8qKiBzdHJpbmcgYSA8IHN0cmluZyBiICovCiAgVUNPTF9MRVNTICAgID0gLTEKfSBVQ29sbGF0aW9uUmVzdWx0IDsKCgovKiogRW51bSBjb250YWluaW5nIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGNvbnRyb2xpbmcgY29sbGF0aW9uIGJlaGF2aW9yLiAqLwovKiBIZXJlIGFyZSBhbGwgdGhlIGFsbG93YWJsZSB2YWx1ZXMuIE5vdCBldmVyeSBhdHRyaWJ1dGUgY2FuIHRha2UgZXZlcnkgdmFsdWUuIFRoZSBvbmx5ICovCi8qIHVuaXZlcnNhbCB2YWx1ZSBpcyBVQ09MX0RFRkFVTFQsIHdoaWNoIHJlc2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIHRoZSBwcmVkZWZpbmVkICAqLwovKiB2YWx1ZSBmb3IgdGhhdCBsb2NhbGUgKi8KdHlwZWRlZiBlbnVtIHsKICAvKiogYWNjZXB0ZWQgYnkgbW9zdCBhdHRyaWJ1dGVzICovCiAgVUNPTF9ERUZBVUxUID0gLTEsCgogIC8qKiBQcmltYXJ5IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfUFJJTUFSWSA9IDAsCiAgLyoqIFNlY29uZGFyeSBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX1NFQ09OREFSWSA9IDEsCiAgLyoqIFRlcnRpYXJ5IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfVEVSVElBUlkgPSAyLAogIC8qKiBEZWZhdWx0IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfREVGQVVMVF9TVFJFTkdUSCA9IFVDT0xfVEVSVElBUlksCiAgVUNPTF9DRV9TVFJFTkdUSF9MSU1JVCwKICAvKiogUXVhdGVybmFyeSBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX1FVQVRFUk5BUlk9MywKICAvKiogSWRlbnRpY2FsIGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfSURFTlRJQ0FMPTE1LAogIFVDT0xfU1RSRU5HVEhfTElNSVQsCgogIC8qKiBUdXJuIHRoZSBmZWF0dXJlIG9mZiAtIHdvcmtzIGZvciBVQ09MX0ZSRU5DSF9DT0xMQVRJT04sIAogICAgICBVQ09MX0NBU0VfTEVWRUwsIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWV9NT0RFCiAgICAgICYgVUNPTF9ERUNPTVBPU0lUSU9OX01PREUqLwogIFVDT0xfT0ZGID0gMTYsCiAgLyoqIFR1cm4gdGhlIGZlYXR1cmUgb24gLSB3b3JrcyBmb3IgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCAKICAgICAgVUNPTF9DQVNFX0xFVkVMLCBVQ09MX0hJUkFHQU5BX1FVQVRFUk5BUllfTU9ERQogICAgICAmIFVDT0xfREVDT01QT1NJVElPTl9NT0RFKi8KICBVQ09MX09OID0gMTcsCiAgCiAgLyoqIFZhbGlkIGZvciBVQ09MX0FMVEVSTkFURV9IQU5ETElORy4gQWx0ZXJuYXRlIGhhbmRsaW5nIHdpbGwgYmUgc2hpZnRlZCAqLwogIFVDT0xfU0hJRlRFRCA9IDIwLAogIC8qKiBWYWxpZCBmb3IgVUNPTF9BTFRFUk5BVEVfSEFORExJTkcuIEFsdGVybmF0ZSBoYW5kbGluZyB3aWxsIGJlIG5vbiBpZ25vcmFibGUgKi8KICBVQ09MX05PTl9JR05PUkFCTEUgPSAyMSwKCiAgLyoqIFZhbGlkIGZvciBVQ09MX0NBU0VfRklSU1QgLSAKICAgICAgbG93ZXIgY2FzZSBzb3J0cyBiZWZvcmUgdXBwZXIgY2FzZSAqLwogIFVDT0xfTE9XRVJfRklSU1QgPSAyNCwKICAvKiogdXBwZXIgY2FzZSBzb3J0cyBiZWZvcmUgbG93ZXIgY2FzZSAqLwogIFVDT0xfVVBQRVJfRklSU1QgPSAyNSwKCiAgLyoqIFZhbGlkIGZvciBVQ09MX05PUk1BTElaQVRJT05fTU9ERSAKICAgICAgVUNPTF9PTiAmIFVDT0xfT0ZGIGFyZSBhbHNvIGFsbG93ZWQgCiAgICAgIGZvciB0aGlzIGF0dHJpYnV0ZSAqLwogIFVDT0xfT05fV0lUSE9VVF9IQU5HVUwgPSAyOCwKCiAgVUNPTF9BVFRSSUJVVEVfVkFMVUVfQ09VTlQKCn0gVUNvbEF0dHJpYnV0ZVZhbHVlOwoKICAgIC8qKgogICAgICogQmFzZSBsZXR0ZXIgcmVwcmVzZW50cyBhIHByaW1hcnkgZGlmZmVyZW5jZS4gIFNldCBjb21wYXJpc29uCiAgICAgKiBsZXZlbCB0byBVQ09MX1BSSU1BUlkgdG8gaWdub3JlIHNlY29uZGFyeSBhbmQgdGVydGlhcnkgZGlmZmVyZW5jZXMuCiAgICAgKiBVc2UgdGhpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIG9mIGEgQ29sbGF0b3Igb2JqZWN0LgogICAgICogRXhhbXBsZSBvZiBwcmltYXJ5IGRpZmZlcmVuY2UsICJhYmMiICZsdDsgImFiZCIKICAgICAqIAogICAgICogRGlhY3JpdGljYWwgZGlmZmVyZW5jZXMgb24gdGhlIHNhbWUgYmFzZSBsZXR0ZXIgcmVwcmVzZW50IGEgc2Vjb25kYXJ5CiAgICAgKiBkaWZmZXJlbmNlLiAgU2V0IGNvbXBhcmlzb24gbGV2ZWwgdG8gVUNPTF9TRUNPTkRBUlkgdG8gaWdub3JlIHRlcnRpYXJ5CiAgICAgKiBkaWZmZXJlbmNlcy4gVXNlIHRoaXMgdG8gc2V0IHRoZSBzdHJlbmd0aCBvZiBhIENvbGxhdG9yIG9iamVjdC4KICAgICAqIEV4YW1wbGUgb2Ygc2Vjb25kYXJ5IGRpZmZlcmVuY2UsICLkIiA+PiAiYSIuCiAgICAgKgogICAgICogVXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgdmVyc2lvbnMgb2YgdGhlIHNhbWUgY2hhcmFjdGVyIHJlcHJlc2VudHMgYQogICAgICogdGVydGlhcnkgZGlmZmVyZW5jZS4gIFNldCBjb21wYXJpc29uIGxldmVsIHRvIFVDT0xfVEVSVElBUlkgdG8gaW5jbHVkZQogICAgICogYWxsIGNvbXBhcmlzb24gZGlmZmVyZW5jZXMuIFVzZSB0aGlzIHRvIHNldCB0aGUgc3RyZW5ndGggb2YgYSBDb2xsYXRvcgogICAgICogb2JqZWN0LgogICAgICogRXhhbXBsZSBvZiB0ZXJ0aWFyeSBkaWZmZXJlbmNlLCAiYWJjIiAmbHQ7Jmx0OyZsdDsgIkFCQyIuCiAgICAgKgogICAgICogVHdvIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgImlkZW50aWNhbCIgd2hlbiB0aGV5IGhhdmUgdGhlIHNhbWUKICAgICAqIHVuaWNvZGUgc3BlbGxpbmdzLiAgVUNPTF9JREVOVElDQUwuCiAgICAgKiBGb3IgZXhhbXBsZSwgIuQiID09ICLkIi4KICAgICAqCiAgICAgKiBVQ29sbGF0aW9uU3RyZW5ndGggaXMgYWxzbyB1c2VkIHRvIGRldGVybWluZSB0aGUgc3RyZW5ndGggb2Ygc29ydCBrZXlzIAogICAgICogZ2VuZXJhdGVkIGZyb20gVUNvbGxhdG9yIG9iamVjdHMKICAgICAqIFRoZXNlIHZhbHVlcyBjYW4gYmUgbm93IGZvdW5kIGluIHRoZSBVQ29sQXR0cmlidXRlVmFsdWUgZW51bS4KICAgICAqKi8KdHlwZWRlZiBVQ29sQXR0cmlidXRlVmFsdWUgVUNvbGxhdGlvblN0cmVuZ3RoOwoKLyoqIEF0dHJpYnV0ZXMgdGhhdCBjb2xsYXRpb24gc2VydmljZSB1bmRlcnN0YW5kcy4gQWxsIHRoZSBhdHRyaWJ1dGVzIGNhbiB0YWtlIFVDT0xfREVGQVVMVAogKiB2YWx1ZSwgYXMgd2VsbCBhcyB0aGUgdmFsdWVzIHNwZWNpZmljIHRvIGVhY2ggb25lLiAqLwp0eXBlZGVmIGVudW0gewogICAgIC8qKiBBdHRyaWJ1dGUgZm9yIGRpcmVjdGlvbiBvZiBzZWNvbmRhcnkgd2VpZ2h0cyAtIHVzZWQgaW4gRnJlbmNoLlwgCiAgICAgICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIFVDT0xfT04sIHdoaWNoIHJlc3VsdHMgaW4gc2Vjb25kYXJ5IHdlaWdodHMKICAgICAgKiBiZWluZyBjb25zaWRlcmVkIGJhY2t3YXJkcyBhbmQgVUNPTF9PRkYgd2hpY2ggdHJlYXRzIHNlY29uZGFyeQogICAgICAqIHdlaWdodHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyLiovCiAgICAgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCAKICAgICAvKiogQXR0cmlidXRlIGZvciBoYW5kbGluZyB2YXJpYWJsZSBlbGVtZW50cy5cIAogICAgICAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX05PTl9JR05PUkFCTEUgKGRlZmF1bHQpCiAgICAgICogd2hpY2ggdHJlYXRzIGFsbCB0aGUgY29kZXBvaW50cyB3aXRoIG5vbi1pZ25vcmFibGUgCiAgICAgICogcHJpbWFyeSB3ZWlnaHRzIGluIHRoZSBzYW1lIHdheSwKICAgICAgKiBhbmQgVUNPTF9TSElGVEVEIHdoaWNoIGNhdXNlcyBjb2RlcG9pbnRzIHdpdGggcHJpbWFyeSAKICAgICAgKiB3ZWlnaHRzIHRoYXQgYXJlIGVxdWFsIG9yIGJlbG93IHRoZSB2YXJpYWJsZSB0b3AgdmFsdWUKICAgICAgKiB0byBiZSBpZ25vcmVkIG9uIHByaW1hcnkgbGV2ZWwgYW5kIG1vdmVkIHRvIHRoZSBxdWF0ZXJuYXJ5IAogICAgICAqIGxldmVsLiovCiAgICAgVUNPTF9BTFRFUk5BVEVfSEFORExJTkcsIAogICAgIC8qKiBDb250cm9scyB0aGUgb3JkZXJpbmcgb2YgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycy5cIAogICAgICAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX09GRiAoZGVmYXVsdCksIHdoaWNoIG9yZGVycwogICAgICAqIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMgaW4gYWNjb3JkYW5jZSB0byB0aGVpciB0ZXJ0aWFyeQogICAgICAqIHdlaWdodHMsIFVDT0xfVVBQRVJfRklSU1Qgd2hpY2ggZm9yY2VzIHVwcGVyIGNhc2UgbGV0dGVycyB0byAKICAgICAgKiBzb3J0IGJlZm9yZSBsb3dlciBjYXNlIGxldHRlcnMsIGFuZCBVQ09MX0xPV0VSX0ZJUlNUIHdoaWNoIGRvZXMgCiAgICAgICogdGhlIG9wcG9zaXRlLiAqLwogICAgIFVDT0xfQ0FTRV9GSVJTVCwgCiAgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgYW4gZXh0cmEgY2FzZSBsZXZlbCAocG9zaXRpb25lZCBiZWZvcmUgdGhlIHRoaXJkCiAgICAgICogbGV2ZWwpIGlzIGdlbmVyYXRlZCBvciBub3QuXCBBY2NlcHRhYmxlIHZhbHVlcyBhcmUgVUNPTF9PRkYgKGRlZmF1bHQpLCAKICAgICAgKiB3aGVuIGNhc2UgbGV2ZWwgaXMgbm90IGdlbmVyYXRlZCwgYW5kIFVDT0xfT04gd2hpY2ggY2F1c2VzIHRoZSBjYXNlCiAgICAgICogbGV2ZWwgdG8gYmUgZ2VuZXJhdGVkLlwgQ29udGVudHMgb2YgdGhlIGNhc2UgbGV2ZWwgYXJlIGFmZmVjdGVkIGJ5CiAgICAgICogdGhlIHZhbHVlIG9mIFVDT0xfQ0FTRV9GSVJTVCBhdHRyaWJ1dGUuXCBBIHNpbXBsZSB3YXkgdG8gaWdub3JlIAogICAgICAqIGFjY2VudCBkaWZmZXJlbmNlcyBpbiBhIHN0cmluZyBpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIHRvIFVDT0xfUFJJTUFSWQogICAgICAqIGFuZCBlbmFibGUgY2FzZSBsZXZlbC4gKi8KICAgICBVQ09MX0NBU0VfTEVWRUwsCiAgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIG5vcm1hbGl6YXRpb24gY2hlY2sgYW5kIG5lY2Vzc2FyeSBub3JtYWxpemF0aW9ucwogICAgICAqIGFyZSBwZXJmb3JtZWQuXCBXaGVuIHNldCB0byBVQ09MX09GRiAoZGVmYXVsdCkgbm8gbm9ybWFsaXphdGlvbiBjaGVjawogICAgICAqIGlzIHBlcmZvcm1lZC5cIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgb25seSBpZiB0aGUgCiAgICAgICogaW5wdXQgZGF0YSBpcyBpbiBzby1jYWxsZWQgRkNEIGZvcm0gKHNlZSB1c2VycyBtYW51YWwgZm9yIG1vcmUgaW5mbykuXCAKICAgICAgKiBXaGVuIHNldCB0byBVQ09MX09OLCBhbiBpbmNyZW1lbnRhbCBjaGVjayBpcyBwZXJmb3JtZWQgdG8gc2VlIHdoZXRoZXIgdGhlIGlucHV0IGRhdGEKICAgICAgKiBpcyBpbiB0aGUgRkNEIGZvcm0uXCBJZiB0aGUgZGF0YSBpcyBub3QgaW4gdGhlIEZDRCBmb3JtLCBpbmNyZW1lbnRhbCAKICAgICAgKiBORkQgbm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQuICovCiAgICAgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUsIAogICAgIC8qKiBBbiBhbGlhcyBmb3IgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUgYXR0cmlidXRlICovCiAgICAgVUNPTF9ERUNPTVBPU0lUSU9OX01PREUgPSBVQ09MX05PUk1BTElaQVRJT05fTU9ERSwKICAgICAvKiogVGhlIHN0cmVuZ3RoIGF0dHJpYnV0ZS5cIENhbiBiZSBlaXRoZXIgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICAgICAgKiBVQ09MX1RFUlRJQVJZLCBVQ09MX1FVQVRFUk5BUlkgb3IgVUNPTF9JREVOVElDQUwuXCBUaGUgdXN1YWwgc3RyZW5ndGgKICAgICAgKiBmb3IgbW9zdCBsb2NhbGVzIChleGNlcHQgSmFwYW5lc2UpIGlzIHRlcnRpYXJ5LlwgUXVhdGVybmFyeSBzdHJlbmd0aCAKICAgICAgKiBpcyB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHNoaWZ0ZWQgc2V0dGluZyBmb3IgYWx0ZXJuYXRlIGhhbmRsaW5nCiAgICAgICogYXR0cmlidXRlIGFuZCBmb3IgSklTIHggNDA2MSBjb2xsYXRpb24sIHdoZW4gaXQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaAogICAgICAqIGJldHdlZW4gS2F0YWthbmEgIGFuZCBIaXJhZ2FuYSAodGhpcyBpcyBhY2hpZXZlZCBieSBzZXR0aW5nIHRoZSAKICAgICAgKiBVQ09MX0hJUkFHQU5BX1FVQVRFUk5BUlkgbW9kZSB0byBvbi5cIE90aGVyd2lzZSwgcXVhdGVybmFyeSBsZXZlbAogICAgICAqIGlzIGFmZmVjdGVkIG9ubHkgYnkgdGhlIG51bWJlciBvZiBub24gaWdub3JhYmxlIGNvZGUgcG9pbnRzIGluCiAgICAgICogdGhlIHN0cmluZy5cIElkZW50aWNhbCBzdHJlbmd0aCBpcyByYXJlbHkgdXNlZnVsLCBhcyBpdCBhbW91bnRzIAogICAgICAqIHRvIGNvZGVwb2ludHMgb2YgdGhlIE5GRCBmb3JtIG9mIHRoZSBzdHJpbmcuICovCiAgICAgVUNPTF9TVFJFTkdUSCwgIAogICAgIC8qKiB3aGVuIHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUgCiAgICAgICogcG9zaXRpb25zIEhpcmFnYW5hIGJlZm9yZSBhbGwgIAogICAgICAqIG5vbi1pZ25vcmFibGVzIG9uIHF1YXRlcm5hcnkgbGV2ZWwKICAgICAgKiBUaGlzIGlzIGEgc25lYWt5IHdheSB0byBwcm9kdWNlIEpJUwogICAgICAqIHNvcnQgb3JkZXIgKi8gICAgIAogICAgIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWV9NT0RFLCAKICAgICBVQ09MX0FUVFJJQlVURV9DT1VOVAp9IFVDb2xBdHRyaWJ1dGU7CgovKiogT3B0aW9ucyBmb3IgcmV0cmlldmluZyB0aGUgcnVsZSBzdHJpbmcgKi8KdHlwZWRlZiBlbnVtIHsKICBVQ09MX1RBSUxPUklOR19PTkxZLCAvKiogUmV0cmlldmUgdGFpbG9yaW5nIG9ubHkgKi8KICBVQ09MX0ZVTExfUlVMRVMgLyoqIFJldHJpZXZlIFVDQSBydWxlcyBhbmQgdGFpbG9yaW5nICovCn0gIFVDb2xSdWxlT3B0aW9uIDsKCi8qKgogKiBPcGVuIGEgVUNvbGxhdG9yIGZvciBjb21wYXJpbmcgc3RyaW5ncy4KICogVGhlIFVDb2xsYXRvciBwb2ludGVyIGlzIHVzZWQgaW4gYWxsIHRoZSBjYWxscyB0byB0aGUgQ29sbGF0aW9uIAogKiBzZXJ2aWNlLiBBZnRlciBmaW5pc2hlZCwgY29sbGF0b3IgbXVzdCBiZSBkaXNwb3NlZCBvZiBieSBjYWxsaW5nCiAqIFxSZWZ7dWNvbF9jbG9zZX0uCiAqIEBwYXJhbSBsb2MgVGhlIGxvY2FsZSBjb250YWluaW5nIHRoZSByZXF1aXJlZCBjb2xsYXRpb24gcnVsZXMuIAogKiAgICAgICAgICAgIGlmIE5VTEwgaXMgcGFzc2VkIGZvciB0aGUgbG9jYWxlLCBVQ0EgcnVsZXMgd2lsbCBiZSAKICogICAgICAgICAgICB1c2VkLgogKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVDb2xsYXRvciwgb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfc2FmZUNsb25lCiAqIEBzZWUgdWNvbF9jbG9zZQogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVUNvbGxhdG9yKiBVX0VYUE9SVDIgCnVjb2xfb3Blbihjb25zdCBjaGFyICpsb2MsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogUHJvZHVjZSBhbiBVQ29sbGF0b3IgaW5zdGFuY2UgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBzdXBwbGllZC4KICogVGhlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBvcmRlcmluZywgZGVmaW5lZCBpbiB0aGUKICogVUNBIGluIGEgcHJvY2VzcyBjYWxsZWQgdGFpbG9yaW5nLiBUaGUgcmVzdWx0aW5nIFVDb2xsYXRvciBwb2ludGVyCiAqIGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb25lIG9idGFpbmVkIGJ5IFxSZWZ7dWNvbF9zdHJjb2xsfS4KICogQHBhcmFtIHJ1bGVzIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbGxhdGlvbiBydWxlcy4gRm9yIHRoZSBzeW50YXgKICogICAgICAgICAgICAgIG9mIHRoZSBydWxlcyBwbGVhc2Ugc2VlIHVzZXJzIGd1aWRlLgogKiBAcGFyYW0gcnVsZXNMZW5ndGggVGhlIGxlbmd0aCBvZiBydWxlcywgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gbm9ybWFsaXphdGlvbk1vZGUgVGhlIG5vcm1hbGl6YXRpb24gbW9kZTogT25lIG9mCiAqICAgICAgICAgICAgIFVDT0xfT0ZGICAgICAoZXhwZWN0IHRoZSB0ZXh0IHRvIG5vdCBuZWVkIG5vcm1hbGl6YXRpb24pLAogKiAgICAgICAgICAgICBVQ09MX09OICAgICAgKG5vcm1hbGl6ZSksIG9yCiAqICAgICAgICAgICAgIFVDT0xfREVGQVVMVCAoc2V0IHRoZSBtb2RlIGFjY29yZGluZyB0byB0aGUgcnVsZXMpCiAqIEBwYXJhbSBzdHJlbmd0aCBUaGUgZGVmYXVsdCBjb2xsYXRpb24gc3RyZW5ndGg7IG9uZSBvZiBVQ09MX1BSSU1BUlksIFVDT0xfU0VDT05EQVJZLAogKiBVQ09MX1RFUlRJQVJZLCBVQ09MX0lERU5USUNBTCxVQ09MX0RFRkFVTFRfU1RSRU5HVEggLSBjYW4gYmUgYWxzbyBzZXQgaW4gdGhlIHJ1bGVzLgogKiBAcGFyYW0gcGFyc2VFcnJvciAgQSBwb2ludGVyIHRvIFVQYXJzZUVycm9yIHRvIHJlY2lldmUgaW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzCiAqICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZy4gVGhpcyBhcmd1bWVudCBjYW4gY3VycmVudGx5IGJlIHNldAogKiAgICAgICAgICAgICAgICAgICAgdG8gTlVMTCwgYnV0IGF0IHVzZXJzIG93biByaXNrLiBQbGVhc2UgcHJvdmlkZSBhIHJlYWwgc3RydWN0dXJlLgogKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVDb2xsYXRvci5cIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgTlVMTCBiZSByZXR1cm5lZCBpbiBjYXNlCiAqICAgICAgICAgb2YgZXJyb3IgLSBwbGVhc2UgdXNlIHN0YXR1cyBhcmd1bWVudCB0byBjaGVjayBmb3IgZXJyb3JzLgogKiBAc2VlIHVjb2xfb3BlbgogKiBAc2VlIHVjb2xfc2FmZUNsb25lCiAqIEBzZWUgdWNvbF9jbG9zZQogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVUNvbGxhdG9yKiBVX0VYUE9SVDIgCnVjb2xfb3BlblJ1bGVzKCBjb25zdCBVQ2hhciAgICAgICAgKnJ1bGVzLAogICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHJ1bGVzTGVuZ3RoLAogICAgICAgICAgICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIG5vcm1hbGl6YXRpb25Nb2RlLAogICAgICAgICAgICAgICAgVUNvbGxhdGlvblN0cmVuZ3RoIHN0cmVuZ3RoLAogICAgICAgICAgICAgICAgVVBhcnNlRXJyb3IgICAgICAgICpwYXJzZUVycm9yLAogICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgICpzdGF0dXMpOwoKLyoqIAogKiBDbG9zZSBhIFVDb2xsYXRvci4KICogT25jZSBjbG9zZWQsIGEgVUNvbGxhdG9yIHNob3VsZCBub3QgYmUgdXNlZC5cIEV2ZXJ5IG9wZW4gY29sbGF0b3Igc2hvdWxkCiAqIGJlIGNsb3NlZC5cIE90aGVyd2lzZSwgYSBtZW1vcnkgbGVhayB3aWxsIHJlc3VsdC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBjbG9zZS4KICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfc2FmZUNsb25lCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9jbG9zZShVQ29sbGF0b3IgKmNvbGwpOwoKLyoqCiAqIENvbXBhcmUgdHdvIHN0cmluZ3MuCiAqIFRoZSBzdHJpbmdzIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhlIG9wdGlvbnMgYWxyZWFkeSBzcGVjaWZpZWQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiBydWxlcy4KICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHN0cmluZy4KICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nLgogKiBAcGFyYW0gdGFyZ2V0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGFyZ2V0LCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIHN0cmluZ3M7IG9uZSBvZiBVQ09MX0VRVUFMLAogKiBVQ09MX0dSRUFURVIsIFVDT0xfTEVTUwogKiBAc2VlIHVjb2xfZ3JlYXRlcgogKiBAc2VlIHVjb2xfZ3JlYXRlck9yRXF1YWwKICogQHNlZSB1Y29sX2VxdWFsCiAqIEBzdGFibGUKICovClVfQ0FQSSBVQ29sbGF0aW9uUmVzdWx0IFVfRVhQT1JUMiAKdWNvbF9zdHJjb2xsKCAgICBjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsCiAgICAgICAgY29uc3QgICAgVUNoYXIgICAgICAgICpzb3VyY2UsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHNvdXJjZUxlbmd0aCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnRhcmdldCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgdGFyZ2V0TGVuZ3RoKTsKCi8qKgogKiBEZXRlcm1pbmUgaWYgb25lIHN0cmluZyBpcyBncmVhdGVyIHRoYW4gYW5vdGhlci4KICogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIFxSZWZ7dWNvbF9zdHJjb2xsfSA9PSBVQ09MX0dSRUFURVIKICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJ1bGVzLgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugc3RyaW5nLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmcuCiAqIEBwYXJhbSB0YXJnZXRMZW5ndGggVGhlIGxlbmd0aCBvZiB0YXJnZXQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHJldHVybiBUUlVFIGlmIHNvdXJjZSBpcyBncmVhdGVyIHRoYW4gdGFyZ2V0LCBGQUxTRSBvdGhlcndpc2UuCiAqIEBzZWUgdWNvbF9zdHJjb2xsCiAqIEBzZWUgdWNvbF9ncmVhdGVyT3JFcXVhbAogKiBAc2VlIHVjb2xfZXF1YWwKICogQHN0YWJsZQogKi8KVV9DQVBJIFVCb29sIFVfRVhQT1JUMiAKdWNvbF9ncmVhdGVyKGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqc291cmNlLCBpbnQzMl90IHNvdXJjZUxlbmd0aCwKICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqdGFyZ2V0LCBpbnQzMl90IHRhcmdldExlbmd0aCk7CgovKioKICogRGV0ZXJtaW5lIGlmIG9uZSBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuCiAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBcUmVme3Vjb2xfc3RyY29sbH0gIT0gVUNPTF9MRVNTCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiBydWxlcy4KICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHN0cmluZy4KICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nLgogKiBAcGFyYW0gdGFyZ2V0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGFyZ2V0LCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEByZXR1cm4gVFJVRSBpZiBzb3VyY2UgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRhcmdldCwgRkFMU0Ugb3RoZXJ3aXNlLgogKiBAc2VlIHVjb2xfc3RyY29sbAogKiBAc2VlIHVjb2xfZ3JlYXRlcgogKiBAc2VlIHVjb2xfZXF1YWwKICogQHN0YWJsZQogKi8KVV9DQVBJIFVCb29sIFVfRVhQT1JUMiAKdWNvbF9ncmVhdGVyT3JFcXVhbChjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICpzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqdGFyZ2V0LCBpbnQzMl90IHRhcmdldExlbmd0aCk7CgovKioKICogQ29tcGFyZSB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHkuCiAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBcUmVme3Vjb2xfc3RyY29sbH0gPT0gVUNPTF9FUVVBTAogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGVxdWFsIHRvIHRhcmdldCwgRkFMU0Ugb3RoZXJ3aXNlCiAqIEBzZWUgdWNvbF9zdHJjb2xsCiAqIEBzZWUgdWNvbF9ncmVhdGVyCiAqIEBzZWUgdWNvbF9ncmVhdGVyT3JFcXVhbAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVUJvb2wgVV9FWFBPUlQyIAp1Y29sX2VxdWFsKGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICp0YXJnZXQsIGludDMyX3QgdGFyZ2V0TGVuZ3RoKTsKCi8qKgogKiBHZXQgdGhlIGNvbGxhdGlvbiBzdHJlbmd0aCB1c2VkIGluIGEgVUNvbGxhdG9yLgogKiBUaGUgc3RyZW5ndGggaW5mbHVlbmNlcyBob3cgc3RyaW5ncyBhcmUgY29tcGFyZWQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gcXVlcnkuCiAqIEByZXR1cm4gVGhlIGNvbGxhdGlvbiBzdHJlbmd0aDsgb25lIG9mIFVDT0xfUFJJTUFSWSwgVUNPTF9TRUNPTkRBUlksCiAqIFVDT0xfVEVSVElBUlksIFVDT0xfUVVBVEVSTkFSWSwgVUNPTF9JREVOVElDQUwKICogQHNlZSB1Y29sX3NldFN0cmVuZ3RoCiAqIEBzdGFibGUKICovClVfQ0FQSSBVQ29sbGF0aW9uU3RyZW5ndGggVV9FWFBPUlQyIAp1Y29sX2dldFN0cmVuZ3RoKGNvbnN0IFVDb2xsYXRvciAqY29sbCk7CgovKioKICogU2V0IHRoZSBjb2xsYXRpb24gc3RyZW5ndGggdXNlZCBpbiBhIFVDb2xsYXRvci4KICogVGhlIHN0cmVuZ3RoIGluZmx1ZW5jZXMgaG93IHN0cmluZ3MgYXJlIGNvbXBhcmVkLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIHRvIHNldC4KICogQHBhcmFtIHN0cmVuZ3RoIFRoZSBkZXNpcmVkIGNvbGxhdGlvbiBzdHJlbmd0aDsgb25lIG9mIFVDT0xfUFJJTUFSWSwgCiAqIFVDT0xfU0VDT05EQVJZLCBVQ09MX1RFUlRJQVJZLCBVQ09MX1FVQVRFUk5BUlksIFVDT0xfSURFTlRJQ0FMLCBVQ09MX0RFRkFVTFQKICogQHNlZSB1Y29sX2dldFN0cmVuZ3RoCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9zZXRTdHJlbmd0aChVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgVUNvbGxhdGlvblN0cmVuZ3RoIHN0cmVuZ3RoKTsKCi8qKgogKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBVQ29sbGF0b3IuCiAqIFRoZSBkaXNwbGF5IG5hbWUgaXMgc3VpdGFibGUgZm9yIHByZXNlbnRhdGlvbiB0byBhIHVzZXIuCiAqIEBwYXJhbSBvYmpMb2MgVGhlIGxvY2FsZSBvZiB0aGUgY29sbGF0b3IgaW4gcXVlc3Rpb24uCiAqIEBwYXJhbSBkaXNwTG9jIFRoZSBsb2NhbGUgZm9yIGRpc3BsYXkuCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLAogKiB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiAqIEBzdGFibGUKICovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9nZXREaXNwbGF5TmFtZSggICAgY29uc3QgICAgY2hhciAgICAgICAgKm9iakxvYywKICAgICAgICAgICAgY29uc3QgICAgY2hhciAgICAgICAgKmRpc3BMb2MsCiAgICAgICAgICAgIFVDaGFyICAgICAgICAgICAgICpyZXN1bHQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICByZXN1bHRMZW5ndGgsCiAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAgICpzdGF0dXMpOwoKLyoqCiAqIEdldCBhIGxvY2FsZSBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUuCiAqIEEgVUNvbGxhdG9yIGluIGEgbG9jYWxlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2lsbCBwZXJmb3JtIHRoZSBjb3JyZWN0CiAqIGNvbGxhdGlvbiBmb3IgdGhlIGxvY2FsZS4KICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBsb2NhbGUuCiAqIEByZXR1cm4gQSBsb2NhbGUgZm9yIHdoaWNoIGNvbGxhdGlvbiBydWxlcyBhcmUgYXZhaWxhYmxlLCBvciAwIGlmIG5vbmUuCiAqIEBzZWUgdWNvbF9jb3VudEF2YWlsYWJsZQogKiBAc3RhYmxlCiAqLwpVX0NBUEkgY29uc3QgY2hhciogVV9FWFBPUlQyIAp1Y29sX2dldEF2YWlsYWJsZShpbnQzMl90IGluZGV4KTsKCi8qKgogKiBEZXRlcm1pbmUgaG93IG1hbnkgbG9jYWxlcyBoYXZlIGNvbGxhdGlvbiBydWxlcyBhdmFpbGFibGUuCiAqIFRoaXMgZnVuY3Rpb24gaXMgbW9zdCB1c2VmdWwgYXMgZGV0ZXJtaW5pbmcgdGhlIGxvb3AgZW5kaW5nIGNvbmRpdGlvbiBmb3IKICogY2FsbHMgdG8gXFJlZnt1Y29sX2dldEF2YWlsYWJsZX0uCiAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBsb2NhbGVzIGZvciB3aGljaCBjb2xsYXRpb24gcnVsZXMgYXJlIGF2YWlsYWJsZS4KICogQHNlZSB1Y29sX2dldEF2YWlsYWJsZQogKiBAc3RhYmxlCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfY291bnRBdmFpbGFibGUodm9pZCk7CgovKioKICogR2V0IHRoZSBjb2xsYXRpb24gcnVsZXMgZnJvbSBhIFVDb2xsYXRvci4KICogVGhlIHJ1bGVzIHdpbGwgZm9sbG93IHRoZSBydWxlIHN5bnRheC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHBhcmFtIGxlbmd0aCAKICogQHJldHVybiBUaGUgY29sbGF0aW9uIHJ1bGVzLgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgY29uc3QgVUNoYXIqIFVfRVhQT1JUMiAKdWNvbF9nZXRSdWxlcyggICAgY29uc3QgICAgVUNvbGxhdG9yICAgICpjb2xsLCAKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgKmxlbmd0aCk7CgovKioKICogR2V0IGEgc29ydCBrZXkgZm9yIGEgc3RyaW5nIGZyb20gYSBVQ29sbGF0b3IuCiAqIFNvcnQga2V5cyBtYXkgYmUgY29tcGFyZWQgdXNpbmcgPFRUPnN0cmNtcDwvVFQ+LgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbGxhdGlvbiBydWxlcy4KICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyaW5nIHRvIHRyYW5zZm9ybS4KICogQHBhcmFtIHNvdXJlY0xlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiAqIEByZXR1cm4gVGhlIHNpemUgbmVlZGVkIHRvIGZ1bGx5IHN0b3JlIHRoZSBzb3J0IGtleS4uCiAqIEBzZWUgdWNvbF9rZXlIYXNoQ29kZQogKiBAc3RhYmxlCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfZ2V0U29ydEtleShjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsCiAgICAgICAgY29uc3QgICAgVUNoYXIgICAgICAgICpzb3VyY2UsCiAgICAgICAgaW50MzJfdCAgICAgICAgc291cmNlTGVuZ3RoLAogICAgICAgIHVpbnQ4X3QgICAgICAgICpyZXN1bHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgcmVzdWx0TGVuZ3RoKTsKCgoKLyoqCiAqIEdldHMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGEgQ29sbGF0b3IuIAogKiBAcGFyYW0gaW5mbyB0aGUgdmVyc2lvbiAjIGluZm9ybWF0aW9uLCB0aGUgcmVzdWx0IHdpbGwgYmUgZmlsbGVkIGluCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMgp1Y29sX2dldFZlcnNpb24oY29uc3QgVUNvbGxhdG9yKiBjb2xsLCBVVmVyc2lvbkluZm8gaW5mbyk7CgoKLyoqIAogKiBNZXJnZSB0d28gc29ydCBrZXlzLiBUaGUgbGV2ZWxzIGFyZSBtZXJnZWQgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGNvdW50ZXJwYXJ0cwogKiAocHJpbWFyaWVzIHdpdGggcHJpbWFyaWVzLCBzZWNvbmRhcmllcyB3aXRoIHNlY29uZGFyaWVzIGV0Yy4pLiBCZXR3ZWVuIHRoZSB2YWx1ZXMKICogZnJvbSB0aGUgc2FtZSBsZXZlbCBhIHNlcGFyYXRvciBpcyBpbnNlcnRlZC4KICogZXhhbXBsZSAodW5jb21wcmVzc2VkKTogCiAqIDE5MUIxRCAwMSAwNTA1MDUgMDEgOTEwNTA1IDAwIGFuZCAxRjIxMjMgMDEgMDUwNTA1IDAxIDkxMDUwNSAwMAogKiB3aWxsIGJlIG1lcmdlZCBhcyAKICogMTkxQjFEIDAyIDFGMjEyMzAxIDA1MDUwNSAwMiAwNTA1MDUgMDEgOTEwNTA1IDAyIDkxMDUwNSAwMAogKiBUaGlzIGFsbG93cyBmb3IgY29uY2F0ZW5hdGluZyBvZiBmaXJzdCBhbmQgbGFzdCBuYW1lcyBmb3Igc29ydGluZywgYW1vbmcgb3RoZXIgdGhpbmdzLgogKiBJZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdCBiaWcgZW5vdWdoLCB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgogKiBAcGFyYW0gc3JjMSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzb3J0a2V5CiAqIEBwYXJhbSBzcmMxTGVuZ3RoIGxlbmd0aCBvZiB0aGUgZmlyc3Qgc29ydGtleQogKiBAcGFyYW0gc3JjMiBwb2ludGVyIHRvIHRoZSBzZWNvbmQgc29ydGtleQogKiBAcGFyYW0gc3JjMkxlbmd0aCBsZW5ndGggb2YgdGhlIHNlY29uZCBzb3J0a2V5CiAqIEBwYXJhbSBkZXN0IGJ1ZmZlciB0byBob2xkIHRoZSByZXN1bHQKICogQHBhcmFtIGRlc3RDYXBhY2l0eSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICogQHJldHVybiBzaXplIG9mIHRoZSByZXN1bHQuIElmIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCBzaXplIGlzIGFsd2F5cwogKiAgICAgICAgIHNyYzFMZW5ndGgrc3JjMkxlbmd0aC0xCiAqIEBkcmFmdCBJQ1UgMi4wCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfbWVyZ2VTb3J0a2V5cyhjb25zdCB1aW50OF90ICpzcmMxLCBpbnQzMl90IHNyYzFMZW5ndGgsCiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQzMl90IHNyYzJMZW5ndGgsCiAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSk7CgovKioKICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBzZXR0ZXIKICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggYXR0cmlidXRlcyBhcmUgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gYXR0ciBhdHRyaWJ1dGUgdHlwZSAKICogQHBhcmFtIHZhbHVlIGF0dHJpYnV0ZSB2YWx1ZQogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZQogKiBAc2VlIFVDb2xBdHRyaWJ1dGVWYWx1ZQogKiBAc2VlIHVjb2xfZ2V0QXR0cmlidXRlCiAqIEBkcmFmdCBJQ1UgMS44CiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgCnVjb2xfc2V0QXR0cmlidXRlKFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVQ29sQXR0cmlidXRlVmFsdWUgdmFsdWUsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBnZXR0ZXIKICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggYXR0cmlidXRlcyBhcmUgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gYXR0ciBhdHRyaWJ1dGUgdHlwZQogKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZQogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZQogKiBAc2VlIFVDb2xBdHRyaWJ1dGVWYWx1ZQogKiBAc2VlIHVjb2xfc2V0QXR0cmlidXRlCiAqIEBkcmFmdCBJQ1UgMS44CiAqLwpVX0NBUEkgVUNvbEF0dHJpYnV0ZVZhbHVlICBVX0VYUE9SVDIgCnVjb2xfZ2V0QXR0cmlidXRlKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIFZhcmlhYmxlIHRvcAogKiBpcyBhIHR3byBieXRlIHByaW1hcnkgdmFsdWUgd2hpY2ggY2F1c2VzIGFsbCB0aGUgY29kZXBvaW50cyB3aXRoIHByaW1hcnkgdmFsdWVzIHRoYXQKICogYXJlIGxlc3Mgb3IgZXF1YWwgdGhhbiB0aGUgdmFyaWFibGUgdG9wIHRvIGJlIHNoaWZ0ZWQgd2hlbiBhbHRlcm5hdGUgaGFuZGxpbmcgaXMgc2V0CiAqIHRvIFVDT0xfU0hJRlRFRC4KICogU2V0cyB0aGUgdmFyaWFibGUgdG9wIHRvIGEgY29sbGF0aW9uIGVsZW1lbnQgdmFsdWUgb2YgYSBzdHJpbmcgc3VwcGxpZWQuIAogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCB2YXJpYWJsZSB0b3AgbmVlZHMgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gdmFyVG9wIG9uZSBvciBtb3JlIChpZiBjb250cmFjdGlvbikgVUNoYXJzIHRvIHdoaWNoIHRoZSB2YXJpYWJsZSB0b3Agc2hvdWxkIGJlIHNldAogKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2YXJpYWJsZSB0b3Agc3RyaW5nLiBJZiAtMSBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIHplcm8gdGVybWluYXRlZC4KICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlLiBJZiBlcnJvciBjb2RlIGlzIHNldCwgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuIAogKiAgICAgICAgICAgICAgIEVycm9ycyBzZXQgYnkgdGhpcyBmdW5jdGlvbiBhcmU6IDxicj4KICogICAgVV9DRV9OT1RfRk9VTkRfRVJST1IgaWYgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgd2FzIHBhc3NlZCBhbmQgdGhlcmUgaXMgbm8gc3VjaCAKICogICAgYSBjb250cmFjdGlvbjxicj4KICogICAgVV9QUklNQVJZX1RPT19MT05HX0VSUk9SIGlmIHRoZSBwcmltYXJ5IGZvciB0aGUgdmFyaWFibGUgdG9wIGhhcyBtb3JlIHRoYW4gdHdvIGJ5dGVzCiAqIEByZXR1cm4gYSAzMiBiaXQgdmFsdWUgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvcCBpbiB1cHBlciAxNiBiaXRzLiAKICogICAgICAgICBMb3dlciAxNiBiaXRzIGFyZSB1bmRlZmluZWQKICogQHNlZSB1Y29sX2dldFZhcmlhYmxlVG9wCiAqIEBzZWUgdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AKICogQGRyYWZ0IElDVSAyLjAKICovClVfQ0FQSSB1aW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfc2V0VmFyaWFibGVUb3AoVUNvbGxhdG9yICpjb2xsLCAKCQkgICAgY29uc3QgVUNoYXIgKnZhclRvcCwgaW50MzJfdCBsZW4sIAoJCSAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIAogKiBHZXRzIHRoZSB2YXJpYWJsZSB0b3AgdmFsdWUgb2YgYSBDb2xsYXRvci4gCiAqIExvd2VyIDE2IGJpdHMgYXJlIHVuZGVmaW5lZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCiAqIEBwYXJhbSBjb2xsIGNvbGxhdG9yIHdoaWNoIHZhcmlhYmxlIHRvcCBuZWVkcyB0byBiZSByZXRyaWV2ZWQKICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlIChub3QgY2hhbmdlZCBieSBmdW5jdGlvbikuIElmIGVycm9yIGNvZGUgaXMgc2V0LCAKICogICAgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4KICogQHNlZSB1Y29sX3NldFZhcmlhYmxlVG9wCiAqIEBzZWUgdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AKICogQGRyYWZ0IElDVSAyLjAKICovClVfQ0FQSSB1aW50MzJfdCB1Y29sX2dldFZhcmlhYmxlVG9wKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiAKICogU2V0cyB0aGUgdmFyaWFibGUgdG9wIHRvIGEgY29sbGF0aW9uIGVsZW1lbnQgdmFsdWUgc3VwcGxpZWQuIFZhcmlhYmxlIHRvcCBpcyAKICogc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzLiAKICogTG93ZXIgMTYgYml0cyBhcmUgaWdub3JlZC4KICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggdmFyaWFibGUgdG9wIG5lZWRzIHRvIGJlIGNoYW5nZWQKICogQHBhcmFtIHZhclRvcCBDRSB2YWx1ZSwgYXMgcmV0dXJuZWQgYnkgdWNvbF9zZXRWYXJpYWJsZVRvcCBvciB1Y29sKWdldFZhcmlhYmxlVG9wCiAqIEBwYXJhbSBzdGF0dXMgZXJyb3IgY29kZSAobm90IGNoYW5nZWQgYnkgZnVuY3Rpb24pCiAqIEBzZWUgdWNvbF9nZXRWYXJpYWJsZVRvcAogKiBAc2VlIHVjb2xfc2V0VmFyaWFibGVUb3AKICogQGRyYWZ0IElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AoVUNvbGxhdG9yICpjb2xsLCBjb25zdCB1aW50MzJfdCB2YXJUb3AsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogVGhyZWFkIHNhZmUgY2xvbmluZyBvcGVyYXRpb24uIFRoZSByZXN1bHQgaXMgYSBjbG9uZSBvZiBhIGdpdmVuIGNvbGxhdG9yLgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB0byBiZSBjbG9uZWQKICogQHBhcmFtIHN0YWNrQnVmZmVyIHVzZXIgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgbmV3IGNsb25lLiAKICogSWYgTlVMTCBuZXcgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkLiAKICoJSWYgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gsIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQuCiAqCUNsaWVudHMgY2FuIHVzZSB0aGUgVV9DT0xfU0FGRUNMT05FX0JVRkZFUlNJWkUuIAogKglUaGlzIHdpbGwgcHJvYmFibHkgYmUgZW5vdWdoIHRvIGF2b2lkIG1lbW9yeSBhbGxvY2F0aW9ucy4KICogQHBhcmFtIHBCdWZmZXJTaXplIHBvaW50ZXIgdG8gc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UuIAogKglJZiAqcEJ1ZmZlclNpemUgPT0gMCwgYSBzdWZmaWNpZW50IHNpemUgZm9yIHVzZSBpbiBjbG9uaW5nIHdpbGwgCiAqCWJlIHJldHVybmVkICgncHJlLWZsaWdodGluZycpCiAqCUlmICpwQnVmZmVyU2l6ZSBpcyBub3QgZW5vdWdoIGZvciBhIHN0YWNrLWJhc2VkIHNhZmUgY2xvbmUsIAogKgluZXcgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkLgogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqICAgIEFuIGluZm9ybWF0aW9uYWwgc3RhdHVzIHZhbHVlLCBVX1NBRkVDTE9ORV9BTExPQ0FURURfRVJST1IsIGlzIHVzZWQgaWYgYW55CiAqIGFsbG9jYXRpb25zIHdlcmUgbmVjZXNzYXJ5LgogKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIG5ldyBjbG9uZQogKiBAc2VlIHVjb2xfb3BlbgogKiBAc2VlIHVjb2xfb3BlblJ1bGVzCiAqIEBzZWUgdWNvbF9jbG9zZQogKiBAZHJhZnQgSUNVIDEuOAogKi8KVV9DQVBJIFVDb2xsYXRvciogVV9FWFBPUlQyIAp1Y29sX3NhZmVDbG9uZShjb25zdCBVQ29sbGF0b3IgKmNvbGwsCgkgICAgICAgdm9pZCAgICAgICAgICAgICpzdGFja0J1ZmZlciwKCSAgICAgICBpbnQzMl90ICAgICAgICAgKnBCdWZmZXJTaXplLAoJICAgICAgIFVFcnJvckNvZGUgICAgICAqc3RhdHVzKTsKCi8qKiBkZWZhdWx0IG1lbW9yeSBzaXplIGZvciB0aGUgbmV3IGNsb25lICovCiNkZWZpbmUgVV9DT0xfU0FGRUNMT05FX0JVRkZFUlNJWkUgMzg0CgovKioKICogUmV0dXJucyBjdXJyZW50IHJ1bGVzLiBEZWx0YSBkZWZpbmVzIHdoZXRoZXIgZnVsbCBydWxlcyBhcmUgcmV0dXJuZWQgb3IganVzdCB0aGUgdGFpbG9yaW5nLiAKICogUmV0dXJucyBudW1iZXIgb2YgVUNoYXJzIG5lZWRlZCB0byBzdG9yZSBydWxlcy4gSWYgYnVmZmVyIGlzIE5VTEwgb3IgYnVmZmVyTGVuIGlzIG5vdCBlbm91Z2ggCiAqIHRvIHN0b3JlIHJ1bGVzLCB3aWxsIHN0b3JlIHVwIHRvIGF2YWlsYWJsZSBzcGFjZS4KICogQHBhcmFtIGNvbGwgY29sbGF0b3IgdG8gZ2V0IHRoZSBydWxlcyBmcm9tCiAqIEBwYXJhbSBkZWx0YSBvbmUgb2YgCVVDT0xfVEFJTE9SSU5HX09OTFksIFVDT0xfRlVMTF9SVUxFUy4gCiAqIEBwYXJhbSBidWZmZXIgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIE5VTEwsIHlvdSdsbCBnZXQgbm8gcnVsZXMuCiAqIEBwYXJhbSBidWZmZXJMZW4gbGVuZ2h0IG9mIGJ1ZmZlciB0byBzdG9yZSBydWxlcyBpbi4gSWYgbGVzcyB0aGVuIG5lZWRlZCB5b3UnbGwgZ2V0IG9ubHkgdGhlIHBhcnQgdGhhdCBmaXRzIGluLgogKiBAZHJhZnQgSUNVIDEuOAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldFJ1bGVzRXgoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVQ29sUnVsZU9wdGlvbiBkZWx0YSwgVUNoYXIgKmJ1ZmZlciwgaW50MzJfdCBidWZmZXJMZW4pOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVwcmVjYXRlZCBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFRoaXMgaXMgdGhlIEMgQVBJIHdyYXBwZXIgZm9yIENvbGxhdGlvbkl0ZXJhdG9yIHRoYXQgZ290IGJvb3RlZCBvdXQgZnJvbSBoZXJlLCBpbmNsdWRpbmcganVzdCBmb3IgKi8KLyogaW5jbHVkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi8qIEBkZXByZWNhdGVkIHJlbW92ZSBhZnRlciBub3YtMjAwMiAqLwojaW5jbHVkZSAidW5pY29kZS91Y29sZWl0ci5oIgoKLyoqCiAqIE9wZW4gYSBVQ29sbGF0b3Igd2l0aCBhIHNwZWNpZmljIHZlcnNpb24uCiAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgdWNvbF9vcGVuKCkgZXhjZXB0IHRoYXQgdWNvbF9nZXRWZXJzaW9uKCkgb2YKICogdGhlIHJldHVybmVkIG9iamVjdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSB2ZXJzaW9uCiAqIHBhcmFtZXRlci4KICogVGhpcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHRvIG9wZW4gdGhlIHNhbWUgY29sbGF0b3IgZm9yIGEgZ2l2ZW4KICogbG9jYWxlIGV2ZW4gd2hlbiBJQ1UgaXMgdXBkYXRlZC4KICogVGhlIHNhbWUgbG9jYWxlIGFuZCB2ZXJzaW9uIGd1YXJhbnRlZXMgdGhlIHNhbWUgc29ydCBrZXlzIGFuZAogKiBjb21wYXJpc29uIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSBsb2MgVGhlIGxvY2FsZSBJRCBmb3Igd2hpY2ggdG8gb3BlbiBhIGNvbGxhdG9yLgogKiBAcGFyYW0gdmVyc2lvbiBUaGUgcmVxdWVzdGVkIGNvbGxhdG9yIHZlcnNpb24uCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGEgVUVycm9yQ29kZSwKICogICAgICAgICAgICAgICBtdXN0IG5vdCBpbmRpY2F0ZSBhIGZhaWx1cmUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBVQ29sbGF0b3IsIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQKICogICAgICAgICBvciBhIGNvbGxhdG9yIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUuCiAqCiAqIEBzZWUgdWNvbF9vcGVuCiAqIEBzZWUgdWNvbF9nZXRWZXJzaW9uCiAqIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgYnkgbm92LTIwMDIuIFVzZSBzdXBwb3J0IGZvciBydW5uaW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIElDVQogKi8KVV9DQVBJIFVDb2xsYXRvciAqIFVfRVhQT1JUMgp1Y29sX29wZW5WZXJzaW9uKGNvbnN0IGNoYXIgKmxvYywKICAgICAgICAgICAgICAgICBVVmVyc2lvbkluZm8gdmVyc2lvbiwKICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIEdldCB0aGUgbm9ybWFsaXphdGlvbiBtb2RlIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBub3JtYWxpemF0aW9uIG1vZGUgaW5mbHVlbmNlcyBob3cgc3RyaW5ncyBhcmUgY29tcGFyZWQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gcXVlcnkuCiAqIEByZXR1cm4gVGhlIG5vcm1hbGl6YXRpb24gbW9kZSwgVU5PUk1fTk9ORSBvciBVTk9STV9ORkQuCiAqIEBzZWUgdWNvbF9zZXROb3JtYWxpemF0aW9uCiAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgYWZ0ZXIgMjAwMi1zZXAtMzA7IHVzZSB1Y29sX2dldEF0dHJpYnV0ZSgpLgogKi8KVV9DQVBJIFVOb3JtYWxpemF0aW9uTW9kZSBVX0VYUE9SVDIgCnVjb2xfZ2V0Tm9ybWFsaXphdGlvbihjb25zdCBVQ29sbGF0b3IqIGNvbGwpOwoKLyoqCiAqIFNldCB0aGUgbm9ybWFsaXphdGlvbiBtb2RlIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBub3JtYWxpemF0aW9uIG1vZGUgaW5mbHVlbmNlcyBob3cgc3RyaW5ncyBhcmUgY29tcGFyZWQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gc2V0LgogKiBAcGFyYW0gbW9kZSBUaGUgZGVzaXJlZCBub3JtYWxpemF0aW9uIG1vZGU6IE9uZSBvZgogKiAgICAgICAgICAgICBVTk9STV9OT05FIChleHBlY3QgdGhlIHRleHQgdG8gbm90IG5lZWQgbm9ybWFsaXphdGlvbiksCiAqICAgICAgICAgICAgIFVOT1JNX05GRCAobm9ybWFsaXplKQogKiBAc2VlIHVjb2xfZ2V0Tm9ybWFsaXphdGlvbgogKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGFmdGVyIDIwMDItc2VwLTMwOyB1c2UgdWNvbF9zZXRBdHRyaWJ1dGUoKS4KICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9zZXROb3JtYWxpemF0aW9uKCAgVUNvbGxhdG9yICAgICAgICAqY29sbCwKICAgICAgICAgICAgVU5vcm1hbGl6YXRpb25Nb2RlICAgIG1vZGUpOwoKLyoqCiAqQGRlcHJlY2F0ZWQgUmVtb3ZlIGFmdGVyIEF1ZyAyMDAyCiAqLwojaWZkZWYgVV9VU0VfREVQUkVDQVRFRF9GT1JNQVRfQVBJCgojaWYgKChVX0lDVV9WRVJTSU9OX01BSk9SX05VTSAhPSAyKSB8fCAoVV9JQ1VfVkVSU0lPTl9NSU5PUl9OVU0gIT0wKSkKIyAgIGVycm9yICJJQ1UgdmVyc2lvbiBoYXMgY2hhbmdlZC4gUGxlYXNlIHJlZGVmaW5lIHRoZSBtYWNyb3MgdW5kZXIgVV9VU0VfREVQUkVDQVRFRF9GT1JNQVRfQVBJIHByZS1wcm9jZXNzb3IgZGVmaW5pdGlvbiIKI2Vsc2UgCiMgICBkZWZpbmUgdWNvbF9vcGVuUnVsZXNfMl8wKHJ1bGVzLHJ1bGVzTGVuZ3RoLG5vcm1hbGl6YXRpb25Nb2RlLHN0cmVuZ3RoLHN0YXR1cykgdWNvbF9vcGVuUnVsZXMocnVsZXMscnVsZXNMZW5ndGgsKFVDb2xBdHRyaWJ1dGVWYWx1ZSlub3JtYWxpemF0aW9uTW9kZSxzdHJlbmd0aCxOVUxMLHN0YXR1cykKI2VuZGlmCgojZW5kaWYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNlbmRpZgo=