LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgezE5OTYtMjAwMX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFVDT0xfSAojZGVmaW5lIFVDT0xfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCgojaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OCgojaW5jbHVkZSAidW5pY29kZS91bm9ybS5oIgojaW5jbHVkZSAidW5pY29kZS9wYXJzZWVyci5oIgojaW5jbHVkZSAidW5pY29kZS91bG9jLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VzZXQuaCIKCi8qKgogKiBcZmlsZQogKiBcYnJpZWYgQyBBUEk6IENvbGxhdG9yIAogKgogKiA8aDI+IENvbGxhdG9yIEMgQVBJIDwvaDI+CiAqCiAqIFRoZSBDIEFQSSBmb3IgQ29sbGF0b3IgcGVyZm9ybXMgbG9jYWxlLXNlbnNpdGl2ZQogKiBzdHJpbmcgY29tcGFyaXNvbi4gWW91IHVzZSB0aGlzIHNlcnZpY2UgdG8gYnVpbGQKICogc2VhcmNoaW5nIGFuZCBzb3J0aW5nIHJvdXRpbmVzIGZvciBuYXR1cmFsIGxhbmd1YWdlIHRleHQuCiAqIDxlbT5JbXBvcnRhbnQ6IDwvZW0+VGhlIElDVSBjb2xsYXRpb24gc2VydmljZSBoYXMgYmVlbiByZWltcGxlbWVudGVkIAogKiBpbiBvcmRlciB0byBhY2hpZXZlIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgVUNBIGNvbXBsaWFuY2UuIAogKiBGb3IgZGV0YWlscywgc2VlIHRoZSAKICogPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2N2cy9pY3UvfmNoZWNrb3V0fi9pY3VodG1sL2Rlc2lnbi9jb2xsYXRpb24vSUNVX2NvbGxhdGlvbl9kZXNpZ24uaHRtIj4KICogY29sbGF0aW9uIGRlc2lnbiBkb2N1bWVudDwvYT4uCiAqIDxwPgogKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGF0aW9uIHNlcnZpY2Ugc2VlIAogKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vaWN1L3VzZXJndWlkZS9Db2xsYXRlX0ludHJvLmh0bWwiPnRoZSB1c2VycyBndWlkZTwvYT4uCiAqIDxwPgogKiBDb2xsYXRpb24gc2VydmljZSBwcm92aWRlcyBjb3JyZWN0IHNvcnRpbmcgb3JkZXJzIGZvciBtb3N0IGxvY2FsZXMgc3VwcG9ydGVkIGluIElDVS4gCiAqIElmIHNwZWNpZmljIGRhdGEgZm9yIGEgbG9jYWxlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBvcmRlcnMgZXZlbnR1YWxseSBmYWxscyBiYWNrCiAqIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjEwLyI+VUNBIHNvcnQgb3JkZXI8L2E+LiAKICogPHA+CiAqIFNvcnQgb3JkZXJpbmcgbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcHJvdmlkaW5nIHlvdXIgb3duIHNldCBvZiBydWxlcy4gRm9yIG1vcmUgb24KICogdGhpcyBzdWJqZWN0IHNlZSB0aGUgCiAqIDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9pY3UvdXNlcmd1aWRlL0NvbGxhdGVfQ3VzdG9taXphdGlvbi5odG1sIj4KICogQ29sbGF0aW9uIGN1c3RvbWl6YXRpb248L2E+IHNlY3Rpb24gb2YgdGhlIHVzZXJzIGd1aWRlLgogKiA8cD4KICogQHNlZSAgICAgICAgIFVDb2xsYXRpb25SZXN1bHQKICogQHNlZSAgICAgICAgIFVOb3JtYWxpemF0aW9uTW9kZQogKiBAc2VlICAgICAgICAgVUNvbGxhdGlvblN0cmVuZ3RoCiAqIEBzZWUgICAgICAgICBVQ29sbGF0aW9uRWxlbWVudHMKICovCgovKiogQSBjb2xsYXRpb24gZWxlbWVudCBpdGVyYXRvci4KKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiovCnN0cnVjdCBjb2xsSXRlcmF0ZTsKLyoqIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgY29sbGF0aW9uIGVsZW1lbnQgaXRlcmF0b3IgaW5zdGFuY2UgCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KdHlwZWRlZiBzdHJ1Y3QgY29sbEl0ZXJhdGUgY29sbEl0ZXJhdGU7CgovKiogQSBjb2xsYXRvci4KKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiovCnN0cnVjdCBVQ29sbGF0b3I7Ci8qKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgY29sbGF0b3Igb2JqZWN0IGluc3RhbmNlIAogKiBAc3RhYmxlIElDVSAyLjAKICovCnR5cGVkZWYgc3RydWN0IFVDb2xsYXRvciBVQ29sbGF0b3I7CgoKLyoqCiAqIFVDT0xfTEVTUyBpcyByZXR1cm5lZCBpZiBzb3VyY2Ugc3RyaW5nIGlzIGNvbXBhcmVkIHRvIGJlIGxlc3MgdGhhbiB0YXJnZXQKICogc3RyaW5nIGluIHRoZSB1X3N0cmNvbGwoKSBtZXRob2QuCiAqIFVDT0xfRVFVQUwgaXMgcmV0dXJuZWQgaWYgc291cmNlIHN0cmluZyBpcyBjb21wYXJlZCB0byBiZSBlcXVhbCB0byB0YXJnZXQKICogc3RyaW5nIGluIHRoZSB1X3N0cmNvbGwoKSBtZXRob2QuCiAqIFVDT0xfR1JFQVRFUiBpcyByZXR1cm5lZCBpZiBzb3VyY2Ugc3RyaW5nIGlzIGNvbXBhcmVkIHRvIGJlIGdyZWF0ZXIgdGhhbgogKiB0YXJnZXQgc3RyaW5nIGluIHRoZSB1X3N0cmNvbGwoKSBtZXRob2QuCiAqIEBzZWUgdV9zdHJjb2xsKCkKICogPHA+CiAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgYSBjb21wYXJpc29uIHJlc3VsdCAKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwp0eXBlZGVmIGVudW0gewogIC8qKiBzdHJpbmcgYSA9PSBzdHJpbmcgYiAqLwogIFVDT0xfRVFVQUwgICAgPSAwLAogIC8qKiBzdHJpbmcgYSA+IHN0cmluZyBiICovCiAgVUNPTF9HUkVBVEVSICAgID0gMSwKICAvKiogc3RyaW5nIGEgPCBzdHJpbmcgYiAqLwogIFVDT0xfTEVTUyAgICA9IC0xCn0gVUNvbGxhdGlvblJlc3VsdCA7CgoKLyoqIEVudW0gY29udGFpbmluZyBhdHRyaWJ1dGUgdmFsdWVzIGZvciBjb250cm9saW5nIGNvbGxhdGlvbiBiZWhhdmlvci4KICogSGVyZSBhcmUgYWxsIHRoZSBhbGxvd2FibGUgdmFsdWVzLiBOb3QgZXZlcnkgYXR0cmlidXRlIGNhbiB0YWtlIGV2ZXJ5IHZhbHVlLiBUaGUgb25seQogKiB1bml2ZXJzYWwgdmFsdWUgaXMgVUNPTF9ERUZBVUxULCB3aGljaCByZXNldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byB0aGUgcHJlZGVmaW5lZCAgCiAqIHZhbHVlIGZvciB0aGF0IGxvY2FsZSAKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwp0eXBlZGVmIGVudW0gewogIC8qKiBhY2NlcHRlZCBieSBtb3N0IGF0dHJpYnV0ZXMgKi8KICBVQ09MX0RFRkFVTFQgPSAtMSwKCiAgLyoqIFByaW1hcnkgY29sbGF0aW9uIHN0cmVuZ3RoICovCiAgVUNPTF9QUklNQVJZID0gMCwKICAvKiogU2Vjb25kYXJ5IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfU0VDT05EQVJZID0gMSwKICAvKiogVGVydGlhcnkgY29sbGF0aW9uIHN0cmVuZ3RoICovCiAgVUNPTF9URVJUSUFSWSA9IDIsCiAgLyoqIERlZmF1bHQgY29sbGF0aW9uIHN0cmVuZ3RoICovCiAgVUNPTF9ERUZBVUxUX1NUUkVOR1RIID0gVUNPTF9URVJUSUFSWSwKICBVQ09MX0NFX1NUUkVOR1RIX0xJTUlULAogIC8qKiBRdWF0ZXJuYXJ5IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfUVVBVEVSTkFSWT0zLAogIC8qKiBJZGVudGljYWwgY29sbGF0aW9uIHN0cmVuZ3RoICovCiAgVUNPTF9JREVOVElDQUw9MTUsCiAgVUNPTF9TVFJFTkdUSF9MSU1JVCwKCiAgLyoqIFR1cm4gdGhlIGZlYXR1cmUgb2ZmIC0gd29ya3MgZm9yIFVDT0xfRlJFTkNIX0NPTExBVElPTiwgCiAgICAgIFVDT0xfQ0FTRV9MRVZFTCwgVUNPTF9ISVJBR0FOQV9RVUFURVJOQVJZX01PREUKICAgICAgJiBVQ09MX0RFQ09NUE9TSVRJT05fTU9ERSovCiAgVUNPTF9PRkYgPSAxNiwKICAvKiogVHVybiB0aGUgZmVhdHVyZSBvbiAtIHdvcmtzIGZvciBVQ09MX0ZSRU5DSF9DT0xMQVRJT04sIAogICAgICBVQ09MX0NBU0VfTEVWRUwsIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWV9NT0RFCiAgICAgICYgVUNPTF9ERUNPTVBPU0lUSU9OX01PREUqLwogIFVDT0xfT04gPSAxNywKICAKICAvKiogVmFsaWQgZm9yIFVDT0xfQUxURVJOQVRFX0hBTkRMSU5HLiBBbHRlcm5hdGUgaGFuZGxpbmcgd2lsbCBiZSBzaGlmdGVkICovCiAgVUNPTF9TSElGVEVEID0gMjAsCiAgLyoqIFZhbGlkIGZvciBVQ09MX0FMVEVSTkFURV9IQU5ETElORy4gQWx0ZXJuYXRlIGhhbmRsaW5nIHdpbGwgYmUgbm9uIGlnbm9yYWJsZSAqLwogIFVDT0xfTk9OX0lHTk9SQUJMRSA9IDIxLAoKICAvKiogVmFsaWQgZm9yIFVDT0xfQ0FTRV9GSVJTVCAtIAogICAgICBsb3dlciBjYXNlIHNvcnRzIGJlZm9yZSB1cHBlciBjYXNlICovCiAgVUNPTF9MT1dFUl9GSVJTVCA9IDI0LAogIC8qKiB1cHBlciBjYXNlIHNvcnRzIGJlZm9yZSBsb3dlciBjYXNlICovCiAgVUNPTF9VUFBFUl9GSVJTVCA9IDI1LAoKICBVQ09MX0FUVFJJQlVURV9WQUxVRV9DT1VOVAoKfSBVQ29sQXR0cmlidXRlVmFsdWU7CgovKioKICogQmFzZSBsZXR0ZXIgcmVwcmVzZW50cyBhIHByaW1hcnkgZGlmZmVyZW5jZS4gIFNldCBjb21wYXJpc29uCiAqIGxldmVsIHRvIFVDT0xfUFJJTUFSWSB0byBpZ25vcmUgc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeSBkaWZmZXJlbmNlcy4KICogVXNlIHRoaXMgdG8gc2V0IHRoZSBzdHJlbmd0aCBvZiBhIENvbGxhdG9yIG9iamVjdC4KICogRXhhbXBsZSBvZiBwcmltYXJ5IGRpZmZlcmVuY2UsICJhYmMiICZsdDsgImFiZCIKICogCiAqIERpYWNyaXRpY2FsIGRpZmZlcmVuY2VzIG9uIHRoZSBzYW1lIGJhc2UgbGV0dGVyIHJlcHJlc2VudCBhIHNlY29uZGFyeQogKiBkaWZmZXJlbmNlLiAgU2V0IGNvbXBhcmlzb24gbGV2ZWwgdG8gVUNPTF9TRUNPTkRBUlkgdG8gaWdub3JlIHRlcnRpYXJ5CiAqIGRpZmZlcmVuY2VzLiBVc2UgdGhpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIG9mIGEgQ29sbGF0b3Igb2JqZWN0LgogKiBFeGFtcGxlIG9mIHNlY29uZGFyeSBkaWZmZXJlbmNlLCAi5CIgPj4gImEiLgogKgogKiBVcHBlcmNhc2UgYW5kIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBhCiAqIHRlcnRpYXJ5IGRpZmZlcmVuY2UuICBTZXQgY29tcGFyaXNvbiBsZXZlbCB0byBVQ09MX1RFUlRJQVJZIHRvIGluY2x1ZGUKICogYWxsIGNvbXBhcmlzb24gZGlmZmVyZW5jZXMuIFVzZSB0aGlzIHRvIHNldCB0aGUgc3RyZW5ndGggb2YgYSBDb2xsYXRvcgogKiBvYmplY3QuCiAqIEV4YW1wbGUgb2YgdGVydGlhcnkgZGlmZmVyZW5jZSwgImFiYyIgJmx0OyZsdDsmbHQ7ICJBQkMiLgogKgogKiBUd28gY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCAiaWRlbnRpY2FsIiB3aGVuIHRoZXkgaGF2ZSB0aGUgc2FtZQogKiB1bmljb2RlIHNwZWxsaW5ncy4gIFVDT0xfSURFTlRJQ0FMLgogKiBGb3IgZXhhbXBsZSwgIuQiID09ICLkIi4KICoKICogVUNvbGxhdGlvblN0cmVuZ3RoIGlzIGFsc28gdXNlZCB0byBkZXRlcm1pbmUgdGhlIHN0cmVuZ3RoIG9mIHNvcnQga2V5cyAKICogZ2VuZXJhdGVkIGZyb20gVUNvbGxhdG9yIG9iamVjdHMKICogVGhlc2UgdmFsdWVzIGNhbiBiZSBub3cgZm91bmQgaW4gdGhlIFVDb2xBdHRyaWJ1dGVWYWx1ZSBlbnVtLgogKiBAc3RhYmxlIElDVSAyLjAKICoqLwp0eXBlZGVmIFVDb2xBdHRyaWJ1dGVWYWx1ZSBVQ29sbGF0aW9uU3RyZW5ndGg7CgovKiogQXR0cmlidXRlcyB0aGF0IGNvbGxhdGlvbiBzZXJ2aWNlIHVuZGVyc3RhbmRzLiBBbGwgdGhlIGF0dHJpYnV0ZXMgY2FuIHRha2UgVUNPTF9ERUZBVUxUCiAqIHZhbHVlLCBhcyB3ZWxsIGFzIHRoZSB2YWx1ZXMgc3BlY2lmaWMgdG8gZWFjaCBvbmUuIAogKiBAc3RhYmxlIElDVSAyLjAKICovCnR5cGVkZWYgZW51bSB7CiAgICAgLyoqIEF0dHJpYnV0ZSBmb3IgZGlyZWN0aW9uIG9mIHNlY29uZGFyeSB3ZWlnaHRzIC0gdXNlZCBpbiBGcmVuY2guXCAKICAgICAgKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmUgVUNPTF9PTiwgd2hpY2ggcmVzdWx0cyBpbiBzZWNvbmRhcnkgd2VpZ2h0cwogICAgICAqIGJlaW5nIGNvbnNpZGVyZWQgYmFja3dhcmRzIGFuZCBVQ09MX09GRiB3aGljaCB0cmVhdHMgc2Vjb25kYXJ5CiAgICAgICogd2VpZ2h0cyBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuKi8KICAgICBVQ09MX0ZSRU5DSF9DT0xMQVRJT04sIAogICAgIC8qKiBBdHRyaWJ1dGUgZm9yIGhhbmRsaW5nIHZhcmlhYmxlIGVsZW1lbnRzLlwgCiAgICAgICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIFVDT0xfTk9OX0lHTk9SQUJMRSAoZGVmYXVsdCkKICAgICAgKiB3aGljaCB0cmVhdHMgYWxsIHRoZSBjb2RlcG9pbnRzIHdpdGggbm9uLWlnbm9yYWJsZSAKICAgICAgKiBwcmltYXJ5IHdlaWdodHMgaW4gdGhlIHNhbWUgd2F5LAogICAgICAqIGFuZCBVQ09MX1NISUZURUQgd2hpY2ggY2F1c2VzIGNvZGVwb2ludHMgd2l0aCBwcmltYXJ5IAogICAgICAqIHdlaWdodHMgdGhhdCBhcmUgZXF1YWwgb3IgYmVsb3cgdGhlIHZhcmlhYmxlIHRvcCB2YWx1ZQogICAgICAqIHRvIGJlIGlnbm9yZWQgb24gcHJpbWFyeSBsZXZlbCBhbmQgbW92ZWQgdG8gdGhlIHF1YXRlcm5hcnkgCiAgICAgICogbGV2ZWwuKi8KICAgICBVQ09MX0FMVEVSTkFURV9IQU5ETElORywgCiAgICAgLyoqIENvbnRyb2xzIHRoZSBvcmRlcmluZyBvZiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLlwgCiAgICAgICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIFVDT0xfT0ZGIChkZWZhdWx0KSwgd2hpY2ggb3JkZXJzCiAgICAgICogdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycyBpbiBhY2NvcmRhbmNlIHRvIHRoZWlyIHRlcnRpYXJ5CiAgICAgICogd2VpZ2h0cywgVUNPTF9VUFBFUl9GSVJTVCB3aGljaCBmb3JjZXMgdXBwZXIgY2FzZSBsZXR0ZXJzIHRvIAogICAgICAqIHNvcnQgYmVmb3JlIGxvd2VyIGNhc2UgbGV0dGVycywgYW5kIFVDT0xfTE9XRVJfRklSU1Qgd2hpY2ggZG9lcyAKICAgICAgKiB0aGUgb3Bwb3NpdGUuICovCiAgICAgVUNPTF9DQVNFX0ZJUlNULCAKICAgICAvKiogQ29udHJvbHMgd2hldGhlciBhbiBleHRyYSBjYXNlIGxldmVsIChwb3NpdGlvbmVkIGJlZm9yZSB0aGUgdGhpcmQKICAgICAgKiBsZXZlbCkgaXMgZ2VuZXJhdGVkIG9yIG5vdC5cIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX09GRiAoZGVmYXVsdCksIAogICAgICAqIHdoZW4gY2FzZSBsZXZlbCBpcyBub3QgZ2VuZXJhdGVkLCBhbmQgVUNPTF9PTiB3aGljaCBjYXVzZXMgdGhlIGNhc2UKICAgICAgKiBsZXZlbCB0byBiZSBnZW5lcmF0ZWQuXCBDb250ZW50cyBvZiB0aGUgY2FzZSBsZXZlbCBhcmUgYWZmZWN0ZWQgYnkKICAgICAgKiB0aGUgdmFsdWUgb2YgVUNPTF9DQVNFX0ZJUlNUIGF0dHJpYnV0ZS5cIEEgc2ltcGxlIHdheSB0byBpZ25vcmUgCiAgICAgICogYWNjZW50IGRpZmZlcmVuY2VzIGluIGEgc3RyaW5nIGlzIHRvIHNldCB0aGUgc3RyZW5ndGggdG8gVUNPTF9QUklNQVJZCiAgICAgICogYW5kIGVuYWJsZSBjYXNlIGxldmVsLiAqLwogICAgIFVDT0xfQ0FTRV9MRVZFTCwKICAgICAvKiogQ29udHJvbHMgd2hldGhlciB0aGUgbm9ybWFsaXphdGlvbiBjaGVjayBhbmQgbmVjZXNzYXJ5IG5vcm1hbGl6YXRpb25zCiAgICAgICogYXJlIHBlcmZvcm1lZC5cIFdoZW4gc2V0IHRvIFVDT0xfT0ZGIChkZWZhdWx0KSBubyBub3JtYWxpemF0aW9uIGNoZWNrCiAgICAgICogaXMgcGVyZm9ybWVkLlwgVGhlIGNvcnJlY3RuZXNzIG9mIHRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCBvbmx5IGlmIHRoZSAKICAgICAgKiBpbnB1dCBkYXRhIGlzIGluIHNvLWNhbGxlZCBGQ0QgZm9ybSAoc2VlIHVzZXJzIG1hbnVhbCBmb3IgbW9yZSBpbmZvKS5cIAogICAgICAqIFdoZW4gc2V0IHRvIFVDT0xfT04sIGFuIGluY3JlbWVudGFsIGNoZWNrIGlzIHBlcmZvcm1lZCB0byBzZWUgd2hldGhlciB0aGUgaW5wdXQgZGF0YQogICAgICAqIGlzIGluIHRoZSBGQ0QgZm9ybS5cIElmIHRoZSBkYXRhIGlzIG5vdCBpbiB0aGUgRkNEIGZvcm0sIGluY3JlbWVudGFsIAogICAgICAqIE5GRCBub3JtYWxpemF0aW9uIGlzIHBlcmZvcm1lZC4gKi8KICAgICBVQ09MX05PUk1BTElaQVRJT05fTU9ERSwgCiAgICAgLyoqIEFuIGFsaWFzIGZvciBVQ09MX05PUk1BTElaQVRJT05fTU9ERSBhdHRyaWJ1dGUgKi8KICAgICBVQ09MX0RFQ09NUE9TSVRJT05fTU9ERSA9IFVDT0xfTk9STUFMSVpBVElPTl9NT0RFLAogICAgIC8qKiBUaGUgc3RyZW5ndGggYXR0cmlidXRlLlwgQ2FuIGJlIGVpdGhlciBVQ09MX1BSSU1BUlksIFVDT0xfU0VDT05EQVJZLAogICAgICAqIFVDT0xfVEVSVElBUlksIFVDT0xfUVVBVEVSTkFSWSBvciBVQ09MX0lERU5USUNBTC5cIFRoZSB1c3VhbCBzdHJlbmd0aAogICAgICAqIGZvciBtb3N0IGxvY2FsZXMgKGV4Y2VwdCBKYXBhbmVzZSkgaXMgdGVydGlhcnkuXCBRdWF0ZXJuYXJ5IHN0cmVuZ3RoIAogICAgICAqIGlzIHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggc2hpZnRlZCBzZXR0aW5nIGZvciBhbHRlcm5hdGUgaGFuZGxpbmcKICAgICAgKiBhdHRyaWJ1dGUgYW5kIGZvciBKSVMgeCA0MDYxIGNvbGxhdGlvbiwgd2hlbiBpdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoCiAgICAgICogYmV0d2VlbiBLYXRha2FuYSAgYW5kIEhpcmFnYW5hICh0aGlzIGlzIGFjaGlldmVkIGJ5IHNldHRpbmcgdGhlIAogICAgICAqIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWSBtb2RlIHRvIG9uLlwgT3RoZXJ3aXNlLCBxdWF0ZXJuYXJ5IGxldmVsCiAgICAgICogaXMgYWZmZWN0ZWQgb25seSBieSB0aGUgbnVtYmVyIG9mIG5vbiBpZ25vcmFibGUgY29kZSBwb2ludHMgaW4KICAgICAgKiB0aGUgc3RyaW5nLlwgSWRlbnRpY2FsIHN0cmVuZ3RoIGlzIHJhcmVseSB1c2VmdWwsIGFzIGl0IGFtb3VudHMgCiAgICAgICogdG8gY29kZXBvaW50cyBvZiB0aGUgTkZEIGZvcm0gb2YgdGhlIHN0cmluZy4gKi8KICAgICBVQ09MX1NUUkVOR1RILCAgCiAgICAgLyoqIHdoZW4gdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZSAKICAgICAgKiBwb3NpdGlvbnMgSGlyYWdhbmEgYmVmb3JlIGFsbCAgCiAgICAgICogbm9uLWlnbm9yYWJsZXMgb24gcXVhdGVybmFyeSBsZXZlbAogICAgICAqIFRoaXMgaXMgYSBzbmVha3kgd2F5IHRvIHByb2R1Y2UgSklTCiAgICAgICogc29ydCBvcmRlciAqLyAgICAgCiAgICAgVUNPTF9ISVJBR0FOQV9RVUFURVJOQVJZX01PREUsIAogICAgIFVDT0xfQVRUUklCVVRFX0NPVU5UCn0gVUNvbEF0dHJpYnV0ZTsKCi8qKiBPcHRpb25zIGZvciByZXRyaWV2aW5nIHRoZSBydWxlIHN0cmluZyAKICogIEBzdGFibGUgSUNVIDIuMAogKi8KdHlwZWRlZiBlbnVtIHsKICAvKiogUmV0cmlldmUgdGFpbG9yaW5nIG9ubHkgKi8KICBVQ09MX1RBSUxPUklOR19PTkxZLCAKICAvKiogUmV0cmlldmUgVUNBIHJ1bGVzIGFuZCB0YWlsb3JpbmcgKi8KICBVQ09MX0ZVTExfUlVMRVMgCn0gVUNvbFJ1bGVPcHRpb24gOwoKLyoqCiAqIE9wZW4gYSBVQ29sbGF0b3IgZm9yIGNvbXBhcmluZyBzdHJpbmdzLgogKiBUaGUgVUNvbGxhdG9yIHBvaW50ZXIgaXMgdXNlZCBpbiBhbGwgdGhlIGNhbGxzIHRvIHRoZSBDb2xsYXRpb24gCiAqIHNlcnZpY2UuIEFmdGVyIGZpbmlzaGVkLCBjb2xsYXRvciBtdXN0IGJlIGRpc3Bvc2VkIG9mIGJ5IGNhbGxpbmcKICogXFJlZnt1Y29sX2Nsb3NlfS4KICogQHBhcmFtIGxvYyBUaGUgbG9jYWxlIGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVkIGNvbGxhdGlvbiBydWxlcy4gCiAqICAgICAgICAgICAgU3BlY2lhbCB2YWx1ZXMgZm9yIGxvY2FsZXMgY2FuIGJlIHBhc3NlZCBpbiAtIAogKiAgICAgICAgICAgIGlmIE5VTEwgaXMgcGFzc2VkIGZvciB0aGUgbG9jYWxlLCB0aGUgZGVmYXVsdCBsb2NhbGUKICogICAgICAgICAgICBjb2xsYXRpb24gcnVsZXMgd2lsbCBiZSB1c2VkLiBJZiBlbXB0eSBzdHJpbmcgKCIiKSBvcgogKiAgICAgICAgICAgICJyb290IiBhcmUgcGFzc2VkLCBVQ0EgcnVsZXMgd2lsbCBiZSB1c2VkLgogKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVDb2xsYXRvciwgb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfc2FmZUNsb25lCiAqIEBzZWUgdWNvbF9jbG9zZQogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBVQ29sbGF0b3IqIFVfRVhQT1JUMiAKdWNvbF9vcGVuKGNvbnN0IGNoYXIgKmxvYywgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBQcm9kdWNlIGFuIFVDb2xsYXRvciBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHN1cHBsaWVkLgogKiBUaGUgcnVsZXMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IG9yZGVyaW5nLCBkZWZpbmVkIGluIHRoZQogKiBVQ0EgaW4gYSBwcm9jZXNzIGNhbGxlZCB0YWlsb3JpbmcuIFRoZSByZXN1bHRpbmcgVUNvbGxhdG9yIHBvaW50ZXIKICogY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvbmUgb2J0YWluZWQgYnkgXFJlZnt1Y29sX3N0cmNvbGx9LgogKiBAcGFyYW0gcnVsZXMgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29sbGF0aW9uIHJ1bGVzLiBGb3IgdGhlIHN5bnRheAogKiAgICAgICAgICAgICAgb2YgdGhlIHJ1bGVzIHBsZWFzZSBzZWUgdXNlcnMgZ3VpZGUuCiAqIEBwYXJhbSBydWxlc0xlbmd0aCBUaGUgbGVuZ3RoIG9mIHJ1bGVzLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBub3JtYWxpemF0aW9uTW9kZSBUaGUgbm9ybWFsaXphdGlvbiBtb2RlOiBPbmUgb2YKICogICAgICAgICAgICAgVUNPTF9PRkYgICAgIChleHBlY3QgdGhlIHRleHQgdG8gbm90IG5lZWQgbm9ybWFsaXphdGlvbiksCiAqICAgICAgICAgICAgIFVDT0xfT04gICAgICAobm9ybWFsaXplKSwgb3IKICogICAgICAgICAgICAgVUNPTF9ERUZBVUxUIChzZXQgdGhlIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcykKICogQHBhcmFtIHN0cmVuZ3RoIFRoZSBkZWZhdWx0IGNvbGxhdGlvbiBzdHJlbmd0aDsgb25lIG9mIFVDT0xfUFJJTUFSWSwgVUNPTF9TRUNPTkRBUlksCiAqIFVDT0xfVEVSVElBUlksIFVDT0xfSURFTlRJQ0FMLFVDT0xfREVGQVVMVF9TVFJFTkdUSCAtIGNhbiBiZSBhbHNvIHNldCBpbiB0aGUgcnVsZXMuCiAqIEBwYXJhbSBwYXJzZUVycm9yICBBIHBvaW50ZXIgdG8gVVBhcnNlRXJyb3IgdG8gcmVjaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMKICogICAgICAgICAgICAgICAgICAgIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nLiBUaGlzIGFyZ3VtZW50IGNhbiBjdXJyZW50bHkgYmUgc2V0CiAqICAgICAgICAgICAgICAgICAgICB0byBOVUxMLCBidXQgYXQgdXNlcnMgb3duIHJpc2suIFBsZWFzZSBwcm92aWRlIGEgcmVhbCBzdHJ1Y3R1cmUuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgVUNvbGxhdG9yLlwgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCBOVUxMIGJlIHJldHVybmVkIGluIGNhc2UKICogICAgICAgICBvZiBlcnJvciAtIHBsZWFzZSB1c2Ugc3RhdHVzIGFyZ3VtZW50IHRvIGNoZWNrIGZvciBlcnJvcnMuCiAqIEBzZWUgdWNvbF9vcGVuCiAqIEBzZWUgdWNvbF9zYWZlQ2xvbmUKICogQHNlZSB1Y29sX2Nsb3NlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVDb2xsYXRvciogVV9FWFBPUlQyIAp1Y29sX29wZW5SdWxlcyggY29uc3QgVUNoYXIgICAgICAgICpydWxlcywKICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBydWxlc0xlbmd0aCwKICAgICAgICAgICAgICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBub3JtYWxpemF0aW9uTW9kZSwKICAgICAgICAgICAgICAgIFVDb2xsYXRpb25TdHJlbmd0aCBzdHJlbmd0aCwKICAgICAgICAgICAgICAgIFVQYXJzZUVycm9yICAgICAgICAqcGFyc2VFcnJvciwKICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAgICAqc3RhdHVzKTsKCi8qKiAKICogQ2xvc2UgYSBVQ29sbGF0b3IuCiAqIE9uY2UgY2xvc2VkLCBhIFVDb2xsYXRvciBzaG91bGQgbm90IGJlIHVzZWQuXCBFdmVyeSBvcGVuIGNvbGxhdG9yIHNob3VsZAogKiBiZSBjbG9zZWQuXCBPdGhlcndpc2UsIGEgbWVtb3J5IGxlYWsgd2lsbCByZXN1bHQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gY2xvc2UuCiAqIEBzZWUgdWNvbF9vcGVuCiAqIEBzZWUgdWNvbF9vcGVuUnVsZXMKICogQHNlZSB1Y29sX3NhZmVDbG9uZQogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9jbG9zZShVQ29sbGF0b3IgKmNvbGwpOwoKLyoqCiAqIENvbXBhcmUgdHdvIHN0cmluZ3MuCiAqIFRoZSBzdHJpbmdzIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhlIG9wdGlvbnMgYWxyZWFkeSBzcGVjaWZpZWQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiBydWxlcy4KICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHN0cmluZy4KICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nLgogKiBAcGFyYW0gdGFyZ2V0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGFyZ2V0LCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIHN0cmluZ3M7IG9uZSBvZiBVQ09MX0VRVUFMLAogKiBVQ09MX0dSRUFURVIsIFVDT0xfTEVTUwogKiBAc2VlIHVjb2xfZ3JlYXRlcgogKiBAc2VlIHVjb2xfZ3JlYXRlck9yRXF1YWwKICogQHNlZSB1Y29sX2VxdWFsCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVDb2xsYXRpb25SZXN1bHQgVV9FWFBPUlQyIAp1Y29sX3N0cmNvbGwoICAgIGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgc291cmNlTGVuZ3RoLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqdGFyZ2V0LAogICAgICAgIGludDMyX3QgICAgICAgICAgICB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIERldGVybWluZSBpZiBvbmUgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gXFJlZnt1Y29sX3N0cmNvbGx9ID09IFVDT0xfR1JFQVRFUgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGdyZWF0ZXIgdGhhbiB0YXJnZXQsIEZBTFNFIG90aGVyd2lzZS4KICogQHNlZSB1Y29sX3N0cmNvbGwKICogQHNlZSB1Y29sX2dyZWF0ZXJPckVxdWFsCiAqIEBzZWUgdWNvbF9lcXVhbAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBVQm9vbCBVX0VYUE9SVDIgCnVjb2xfZ3JlYXRlcihjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIERldGVybWluZSBpZiBvbmUgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gXFJlZnt1Y29sX3N0cmNvbGx9ICE9IFVDT0xfTEVTUwogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0YXJnZXQsIEZBTFNFIG90aGVyd2lzZS4KICogQHNlZSB1Y29sX3N0cmNvbGwKICogQHNlZSB1Y29sX2dyZWF0ZXIKICogQHNlZSB1Y29sX2VxdWFsCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVCb29sIFVfRVhQT1JUMiAKdWNvbF9ncmVhdGVyT3JFcXVhbChjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICpzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqdGFyZ2V0LCBpbnQzMl90IHRhcmdldExlbmd0aCk7CgovKioKICogQ29tcGFyZSB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHkuCiAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBcUmVme3Vjb2xfc3RyY29sbH0gPT0gVUNPTF9FUVVBTAogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGVxdWFsIHRvIHRhcmdldCwgRkFMU0Ugb3RoZXJ3aXNlCiAqIEBzZWUgdWNvbF9zdHJjb2xsCiAqIEBzZWUgdWNvbF9ncmVhdGVyCiAqIEBzZWUgdWNvbF9ncmVhdGVyT3JFcXVhbAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBVQm9vbCBVX0VYUE9SVDIgCnVjb2xfZXF1YWwoY29uc3QgVUNvbGxhdG9yICpjb2xsLAogICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqc291cmNlLCBpbnQzMl90IHNvdXJjZUxlbmd0aCwKICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIEdldCB0aGUgY29sbGF0aW9uIHN0cmVuZ3RoIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBzdHJlbmd0aCBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHJldHVybiBUaGUgY29sbGF0aW9uIHN0cmVuZ3RoOyBvbmUgb2YgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICogVUNPTF9URVJUSUFSWSwgVUNPTF9RVUFURVJOQVJZLCBVQ09MX0lERU5USUNBTAogKiBAc2VlIHVjb2xfc2V0U3RyZW5ndGgKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgVUNvbGxhdGlvblN0cmVuZ3RoIFVfRVhQT1JUMiAKdWNvbF9nZXRTdHJlbmd0aChjb25zdCBVQ29sbGF0b3IgKmNvbGwpOwoKLyoqCiAqIFNldCB0aGUgY29sbGF0aW9uIHN0cmVuZ3RoIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBzdHJlbmd0aCBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBzZXQuCiAqIEBwYXJhbSBzdHJlbmd0aCBUaGUgZGVzaXJlZCBjb2xsYXRpb24gc3RyZW5ndGg7IG9uZSBvZiBVQ09MX1BSSU1BUlksIAogKiBVQ09MX1NFQ09OREFSWSwgVUNPTF9URVJUSUFSWSwgVUNPTF9RVUFURVJOQVJZLCBVQ09MX0lERU5USUNBTCwgVUNPTF9ERUZBVUxUCiAqIEBzZWUgdWNvbF9nZXRTdHJlbmd0aAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9zZXRTdHJlbmd0aChVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgVUNvbGxhdGlvblN0cmVuZ3RoIHN0cmVuZ3RoKTsKCi8qKgogKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBVQ29sbGF0b3IuCiAqIFRoZSBkaXNwbGF5IG5hbWUgaXMgc3VpdGFibGUgZm9yIHByZXNlbnRhdGlvbiB0byBhIHVzZXIuCiAqIEBwYXJhbSBvYmpMb2MgVGhlIGxvY2FsZSBvZiB0aGUgY29sbGF0b3IgaW4gcXVlc3Rpb24uCiAqIEBwYXJhbSBkaXNwTG9jIFRoZSBsb2NhbGUgZm9yIGRpc3BsYXkuCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLAogKiB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldERpc3BsYXlOYW1lKCAgICBjb25zdCAgICBjaGFyICAgICAgICAqb2JqTG9jLAogICAgICAgICAgICBjb25zdCAgICBjaGFyICAgICAgICAqZGlzcExvYywKICAgICAgICAgICAgVUNoYXIgICAgICAgICAgICAgKnJlc3VsdCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgKnN0YXR1cyk7CgovKioKICogR2V0IGEgbG9jYWxlIGZvciB3aGljaCBjb2xsYXRpb24gcnVsZXMgYXJlIGF2YWlsYWJsZS4KICogQSBVQ29sbGF0b3IgaW4gYSBsb2NhbGUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIGNvcnJlY3QKICogY29sbGF0aW9uIGZvciB0aGUgbG9jYWxlLgogKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGxvY2FsZS4KICogQHJldHVybiBBIGxvY2FsZSBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUsIG9yIDAgaWYgbm9uZS4KICogQHNlZSB1Y29sX2NvdW50QXZhaWxhYmxlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGNvbnN0IGNoYXIqIFVfRVhQT1JUMiAKdWNvbF9nZXRBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7CgovKioKICogRGV0ZXJtaW5lIGhvdyBtYW55IGxvY2FsZXMgaGF2ZSBjb2xsYXRpb24gcnVsZXMgYXZhaWxhYmxlLgogKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIGFzIGRldGVybWluaW5nIHRoZSBsb29wIGVuZGluZyBjb25kaXRpb24gZm9yCiAqIGNhbGxzIHRvIFxSZWZ7dWNvbF9nZXRBdmFpbGFibGV9LgogKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbG9jYWxlcyBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUuCiAqIEBzZWUgdWNvbF9nZXRBdmFpbGFibGUKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfY291bnRBdmFpbGFibGUodm9pZCk7CgovKioKICogR2V0IHRoZSBjb2xsYXRpb24gcnVsZXMgZnJvbSBhIFVDb2xsYXRvci4KICogVGhlIHJ1bGVzIHdpbGwgZm9sbG93IHRoZSBydWxlIHN5bnRheC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHBhcmFtIGxlbmd0aCAKICogQHJldHVybiBUaGUgY29sbGF0aW9uIHJ1bGVzLgogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBjb25zdCBVQ2hhciogVV9FWFBPUlQyIAp1Y29sX2dldFJ1bGVzKCAgICBjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsIAogICAgICAgIGludDMyX3QgICAgICAgICAgICAqbGVuZ3RoKTsKCi8qKgogKiBHZXQgYSBzb3J0IGtleSBmb3IgYSBzdHJpbmcgZnJvbSBhIFVDb2xsYXRvci4KICogU29ydCBrZXlzIG1heSBiZSBjb21wYXJlZCB1c2luZyA8VFQ+c3RyY21wPC9UVD4uCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgY29udGFpbmluZyB0aGUgY29sbGF0aW9uIHJ1bGVzLgogKiBAcGFyYW0gc291cmNlIFRoZSBzdHJpbmcgdG8gdHJhbnNmb3JtLgogKiBAcGFyYW0gc291cmVjTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHJldHVybiBUaGUgc2l6ZSBuZWVkZWQgdG8gZnVsbHkgc3RvcmUgdGhlIHNvcnQga2V5Li4KICogQHNlZSB1Y29sX2tleUhhc2hDb2RlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldFNvcnRLZXkoY29uc3QgICAgVUNvbGxhdG9yICAgICpjb2xsLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqc291cmNlLAogICAgICAgIGludDMyX3QgICAgICAgIHNvdXJjZUxlbmd0aCwKICAgICAgICB1aW50OF90ICAgICAgICAqcmVzdWx0LAogICAgICAgIGludDMyX3QgICAgICAgIHJlc3VsdExlbmd0aCk7CgovKiogZW51bSB0aGF0IGlzIHRha2VuIGJ5IHVjb2xfZ2V0Qm91bmQgQVBJIAogKiBTZWUgYmVsb3cgZm9yIGV4cGxhbmF0aW9uICAgICAgICAgICAgICAgIAogKiBkbyBub3QgY2hhbmdlIHRoZSB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIAogKiBtZW1iZXJzIG9mIHRoaXMgZW51bS4gVW5kZXJseWluZyBjb2RlICAgIAogKiBkZXBlbmRzIG9uIHRoZW0gaGF2aW5nIHRoZXNlIG51bWJlcnMgICAgIAogKiBAc3RhYmxlIElDVSAyLjAKICovCnR5cGVkZWYgZW51bSB7CiAgLyoqIGxvd2VyIGJvdW5kICovCiAgVUNPTF9CT1VORF9MT1dFUiA9IDAsCiAgLyoqIHVwcGVyIGJvdW5kIHRoYXQgd2lsbCBtYXRjaCBzdHJpbmdzIG9mIGV4YWN0IHNpemUgKi8KICBVQ09MX0JPVU5EX1VQUEVSID0gMSwKICAvKiogdXBwZXIgYm91bmQgdGhhdCB3aWxsIG1hdGNoIGFsbCB0aGUgc3RyaW5ncyB0aGF0IGhhdmUgdGhlIHNhbWUgaW5pdGlhbCBzdWJzdHJpbmcgYXMgdGhlIGdpdmVuIHN0cmluZyAqLwogIFVDT0xfQk9VTkRfVVBQRVJfTE9ORyA9IDIsCiAgVUNPTF9CT1VORF9WQUxVRV9DT1VOVAp9IFVDb2xCb3VuZE1vZGU7CgovKioKICogUHJvZHVjZSBhIGJvdW5kIGZvciBhIGdpdmVuIHNvcnRrZXkgYW5kIGEgbnVtYmVyIG9mIGxldmVscy4KICogUmV0dXJuIHZhbHVlIGlzIGFsd2F5cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgcmVnYXJkbGVzcyBvZiAKICogd2hldGhlciB0aGUgcmVzdWx0IGJ1ZmZlciB3YXMgYmlnIGVub3VnaCBvciBldmVuIHZhbGlkLjxicj4KICogUmVzdWx0aW5nIGJvdW5kcyBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgcmFuZ2Ugb2Ygc3RyaW5ncyB0aGF0IGFyZQogKiBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBib3VuZHMuIEZvciBleGFtcGxlLCBpZiBib3VuZHMgYXJlIHByb2R1Y2VkCiAqIGZvciBhIHNvcnRrZXkgb2Ygc3RyaW5nICJzbWl0aCIsIHN0cmluZ3MgYmV0d2VlbiB1cHBlciBhbmQgbG93ZXIgCiAqIGJvdW5kcyB3aXRoIG9uZSBsZXZlbCB3b3VsZCBpbmNsdWRlICJTbWl0aCIsICJTTUlUSCIsICJzTWlUaCIuPGJyPgogKiBUaGVyZSBhcmUgdHdvIHVwcGVyIGJvdW5kcyB0aGF0IGNhbiBiZSBwcm9kdWNlZC4gSWYgVUNPTF9CT1VORF9VUFBFUgogKiBpcyBwcm9kdWNlZCwgc3RyaW5ncyBtYXRjaGVkIHdvdWxkIGJlIGFzIGFib3ZlLiBIb3dldmVyLCBpZiBib3VuZAogKiBwcm9kdWNlZCB1c2luZyBVQ09MX0JPVU5EX1VQUEVSX0xPTkcgaXMgdXNlZCwgdGhlIGFib3ZlIGV4YW1wbGUgd2lsbAogKiBhbHNvIG1hdGNoICJTbWl0aHNvbmlhbiIgYW5kIHNpbWlsYXIuPGJyPgogKiBGb3IgbW9yZSBvbiB1c2FnZSwgc2VlIGV4YW1wbGUgaW4gY2ludGx0c3QvY2FwaXRzdC5jIGluIHByb2NlZHVyZQogKiBUZXN0Qm91bmRzLgogKiBTb3J0IGtleXMgbWF5IGJlIGNvbXBhcmVkIHVzaW5nIDxUVD5zdHJjbXA8L1RUPi4KICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHNvcnRrZXkuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4gCiAqICAgICAgICAgICAgICAgICAgICAgKElmIGFuIHVubW9kaWZpZWQgc29ydGtleSBpcyBwYXNzZWQsIGl0IGlzIGFsd2F5cyBudWxsIAogKiAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkKS4KICogQHBhcmFtIGJvdW5kVHlwZSBUeXBlIG9mIGJvdW5kIHJlcXVpcmVkLiBJdCBjYW4gYmUgVUNPTF9CT1VORF9MT1dFUiwgd2hpY2ggCiAqICAgICAgICAgICAgICAgICAgcHJvZHVjZXMgYSBsb3dlciBpbmNsdXNpdmUgYm91bmQsIFVDT0xfQk9VTkRfVVBQRVIsIHRoYXQgCiAqICAgICAgICAgICAgICAgICAgcHJvZHVjZXMgdXBwZXIgYm91bmQgdGhhdCBtYXRjaGVzIHN0cmluZ3Mgb2YgdGhlIHNhbWUgbGVuZ3RoIAogKiAgICAgICAgICAgICAgICAgIG9yIFVDT0xfQk9VTkRfVVBQRVJfTE9ORyB0aGF0IG1hdGNoZXMgc3RyaW5ncyB0aGF0IGhhdmUgdGhlIAogKiAgICAgICAgICAgICAgICAgIHNhbWUgc3RhcnRpbmcgc3Vic3RyaW5nIGFzIHRoZSBzb3VyY2Ugc3RyaW5nLgogKiBAcGFyYW0gbm9PZkxldmVscyAgTnVtYmVyIG9mIGxldmVscyByZXF1aXJlZCBpbiB0aGUgcmVzdWx0aW5nIGJvdW5kIChmb3IgbW9zdCAKICogICAgICAgICAgICAgICAgICAgIHVzZXMsIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSBpcyAxKS4gU2VlIHVzZXJzIGd1aWRlIGZvciAKICogICAgICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uIG9uIG51bWJlciBvZiBsZXZlbHMgYSBzb3J0a2V5IGNhbiBoYXZlLgogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSByZXN1bHRpbmcgc29ydGtleS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHBhcmFtIHN0YXR1cyBVc2VkIGZvciByZXR1cm5pbmcgZXJyb3IgY29kZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4gSWYgdGhlIAogKiAgICAgICAgICAgICAgIG51bWJlciBvZiBsZXZlbHMgcmVxdWVzdGVkIGlzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YgbGV2ZWxzCiAqICAgICAgICAgICAgICAgaW4gdGhlIHNvdXJjZSBrZXksIGEgd2FybmluZyAoVV9TT1JUX0tFWV9UT09fU0hPUlRfV0FSTklORykgaXMgCiAqICAgICAgICAgICAgICAgaXNzdWVkLgogKiBAcmV0dXJuIFRoZSBzaXplIG5lZWRlZCB0byBmdWxseSBzdG9yZSB0aGUgYm91bmQuIAogKiBAc2VlIHVjb2xfa2V5SGFzaENvZGUKICogQGRyYWZ0IElDVSAyLjEKICovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9nZXRCb3VuZChjb25zdCB1aW50OF90ICAgICAgICpzb3VyY2UsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzb3VyY2VMZW5ndGgsCiAgICAgICAgVUNvbEJvdW5kTW9kZSAgICAgICBib3VuZFR5cGUsCiAgICAgICAgdWludDMyX3QgICAgICAgICAgICBub09mTGV2ZWxzLAogICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnJlc3VsdCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICpzdGF0dXMpOwogICAgICAgIAovKioKICogR2V0cyB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYSBDb2xsYXRvci4gCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gcXVlcnkuCiAqIEBwYXJhbSBpbmZvIHRoZSB2ZXJzaW9uICMgaW5mb3JtYXRpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBmaWxsZWQgaW4KICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIKdWNvbF9nZXRWZXJzaW9uKGNvbnN0IFVDb2xsYXRvciogY29sbCwgVVZlcnNpb25JbmZvIGluZm8pOwoKCi8qKiAKICogTWVyZ2UgdHdvIHNvcnQga2V5cy4gVGhlIGxldmVscyBhcmUgbWVyZ2VkIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBjb3VudGVycGFydHMKICogKHByaW1hcmllcyB3aXRoIHByaW1hcmllcywgc2Vjb25kYXJpZXMgd2l0aCBzZWNvbmRhcmllcyBldGMuKS4gQmV0d2VlbiB0aGUgdmFsdWVzCiAqIGZyb20gdGhlIHNhbWUgbGV2ZWwgYSBzZXBhcmF0b3IgaXMgaW5zZXJ0ZWQuCiAqIGV4YW1wbGUgKHVuY29tcHJlc3NlZCk6IAogKiAxOTFCMUQgMDEgMDUwNTA1IDAxIDkxMDUwNSAwMCBhbmQgMUYyMTIzIDAxIDA1MDUwNSAwMSA5MTA1MDUgMDAKICogd2lsbCBiZSBtZXJnZWQgYXMgCiAqIDE5MUIxRCAwMiAxRjIxMjMwMSAwNTA1MDUgMDIgMDUwNTA1IDAxIDkxMDUwNSAwMiA5MTA1MDUgMDAKICogVGhpcyBhbGxvd3MgZm9yIGNvbmNhdGVuYXRpbmcgb2YgZmlyc3QgYW5kIGxhc3QgbmFtZXMgZm9yIHNvcnRpbmcsIGFtb25nIG90aGVyIHRoaW5ncy4KICogSWYgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyBub3QgYmlnIGVub3VnaCwgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZC4KICogQHBhcmFtIHNyYzEgcG9pbnRlciB0byB0aGUgZmlyc3Qgc29ydGtleQogKiBAcGFyYW0gc3JjMUxlbmd0aCBsZW5ndGggb2YgdGhlIGZpcnN0IHNvcnRrZXkKICogQHBhcmFtIHNyYzIgcG9pbnRlciB0byB0aGUgc2Vjb25kIHNvcnRrZXkKICogQHBhcmFtIHNyYzJMZW5ndGggbGVuZ3RoIG9mIHRoZSBzZWNvbmQgc29ydGtleQogKiBAcGFyYW0gZGVzdCBidWZmZXIgdG8gaG9sZCB0aGUgcmVzdWx0CiAqIEBwYXJhbSBkZXN0Q2FwYWNpdHkgc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CiAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgcmVzdWx0LiBJZiB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggc2l6ZSBpcyBhbHdheXMKICogICAgICAgICBzcmMxTGVuZ3RoK3NyYzJMZW5ndGgtMQogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9tZXJnZVNvcnRrZXlzKGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGludDMyX3Qgc3JjMUxlbmd0aCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludDMyX3Qgc3JjMkxlbmd0aCwKICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludDMyX3QgZGVzdENhcGFjaXR5KTsKCi8qKgogKiBVbml2ZXJzYWwgYXR0cmlidXRlIHNldHRlcgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBjaGFuZ2VkCiAqIEBwYXJhbSBhdHRyIGF0dHJpYnV0ZSB0eXBlIAogKiBAcGFyYW0gdmFsdWUgYXR0cmlidXRlIHZhbHVlCiAqIEBwYXJhbSBzdGF0dXMgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdlbnQgb24gc21vb3RobHkgb3IgdGhlcmUgd2VyZSBlcnJvcnMKICogQHNlZSBVQ29sQXR0cmlidXRlCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZVZhbHVlCiAqIEBzZWUgdWNvbF9nZXRBdHRyaWJ1dGUKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgCnVjb2xfc2V0QXR0cmlidXRlKFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVQ29sQXR0cmlidXRlVmFsdWUgdmFsdWUsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBnZXR0ZXIKICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggYXR0cmlidXRlcyBhcmUgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gYXR0ciBhdHRyaWJ1dGUgdHlwZQogKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZQogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZQogKiBAc2VlIFVDb2xBdHRyaWJ1dGVWYWx1ZQogKiBAc2VlIHVjb2xfc2V0QXR0cmlidXRlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVDb2xBdHRyaWJ1dGVWYWx1ZSAgVV9FWFBPUlQyIAp1Y29sX2dldEF0dHJpYnV0ZShjb25zdCBVQ29sbGF0b3IgKmNvbGwsIFVDb2xBdHRyaWJ1dGUgYXR0ciwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiBWYXJpYWJsZSB0b3AKICogaXMgYSB0d28gYnl0ZSBwcmltYXJ5IHZhbHVlIHdoaWNoIGNhdXNlcyBhbGwgdGhlIGNvZGVwb2ludHMgd2l0aCBwcmltYXJ5IHZhbHVlcyB0aGF0CiAqIGFyZSBsZXNzIG9yIGVxdWFsIHRoYW4gdGhlIHZhcmlhYmxlIHRvcCB0byBiZSBzaGlmdGVkIHdoZW4gYWx0ZXJuYXRlIGhhbmRsaW5nIGlzIHNldAogKiB0byBVQ09MX1NISUZURUQuCiAqIFNldHMgdGhlIHZhcmlhYmxlIHRvcCB0byBhIGNvbGxhdGlvbiBlbGVtZW50IHZhbHVlIG9mIGEgc3RyaW5nIHN1cHBsaWVkLiAKICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggdmFyaWFibGUgdG9wIG5lZWRzIHRvIGJlIGNoYW5nZWQKICogQHBhcmFtIHZhclRvcCBvbmUgb3IgbW9yZSAoaWYgY29udHJhY3Rpb24pIFVDaGFycyB0byB3aGljaCB0aGUgdmFyaWFibGUgdG9wIHNob3VsZCBiZSBzZXQKICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdmFyaWFibGUgdG9wIHN0cmluZy4gSWYgLTEgaXQgaXMgY29uc2lkZXJlZCB0byBiZSB6ZXJvIHRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBzdGF0dXMgZXJyb3IgY29kZS4gSWYgZXJyb3IgY29kZSBpcyBzZXQsIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLiAKICogICAgICAgICAgICAgICBFcnJvcnMgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gYXJlOiA8YnI+CiAqICAgIFVfQ0VfTk9UX0ZPVU5EX0VSUk9SIGlmIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHdhcyBwYXNzZWQgYW5kIHRoZXJlIGlzIG5vIHN1Y2ggCiAqICAgIGEgY29udHJhY3Rpb248YnI+CiAqICAgIFVfUFJJTUFSWV9UT09fTE9OR19FUlJPUiBpZiB0aGUgcHJpbWFyeSBmb3IgdGhlIHZhcmlhYmxlIHRvcCBoYXMgbW9yZSB0aGFuIHR3byBieXRlcwogKiBAcmV0dXJuIGEgMzIgYml0IHZhbHVlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0b3AgaW4gdXBwZXIgMTYgYml0cy4gCiAqICAgICAgICAgTG93ZXIgMTYgYml0cyBhcmUgdW5kZWZpbmVkCiAqIEBzZWUgdWNvbF9nZXRWYXJpYWJsZVRvcAogKiBAc2VlIHVjb2xfcmVzdG9yZVZhcmlhYmxlVG9wCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIHVpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9zZXRWYXJpYWJsZVRvcChVQ29sbGF0b3IgKmNvbGwsIAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICp2YXJUb3AsIGludDMyX3QgbGVuLCAKICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIAogKiBHZXRzIHRoZSB2YXJpYWJsZSB0b3AgdmFsdWUgb2YgYSBDb2xsYXRvci4gCiAqIExvd2VyIDE2IGJpdHMgYXJlIHVuZGVmaW5lZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCiAqIEBwYXJhbSBjb2xsIGNvbGxhdG9yIHdoaWNoIHZhcmlhYmxlIHRvcCBuZWVkcyB0byBiZSByZXRyaWV2ZWQKICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlIChub3QgY2hhbmdlZCBieSBmdW5jdGlvbikuIElmIGVycm9yIGNvZGUgaXMgc2V0LCAKICogICAgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4KICogQHJldHVybiB0aGUgdmFyaWFibGUgdG9wIHZhbHVlIG9mIGEgQ29sbGF0b3IuCiAqIEBzZWUgdWNvbF9zZXRWYXJpYWJsZVRvcAogKiBAc2VlIHVjb2xfcmVzdG9yZVZhcmlhYmxlVG9wCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIHVpbnQzMl90IFVfRVhQT1JUMiB1Y29sX2dldFZhcmlhYmxlVG9wKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiAKICogU2V0cyB0aGUgdmFyaWFibGUgdG9wIHRvIGEgY29sbGF0aW9uIGVsZW1lbnQgdmFsdWUgc3VwcGxpZWQuIFZhcmlhYmxlIHRvcCBpcyAKICogc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzLiAKICogTG93ZXIgMTYgYml0cyBhcmUgaWdub3JlZC4KICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggdmFyaWFibGUgdG9wIG5lZWRzIHRvIGJlIGNoYW5nZWQKICogQHBhcmFtIHZhclRvcCBDRSB2YWx1ZSwgYXMgcmV0dXJuZWQgYnkgdWNvbF9zZXRWYXJpYWJsZVRvcCBvciB1Y29sKWdldFZhcmlhYmxlVG9wCiAqIEBwYXJhbSBzdGF0dXMgZXJyb3IgY29kZSAobm90IGNoYW5nZWQgYnkgZnVuY3Rpb24pCiAqIEBzZWUgdWNvbF9nZXRWYXJpYWJsZVRvcAogKiBAc2VlIHVjb2xfc2V0VmFyaWFibGVUb3AKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgCnVjb2xfcmVzdG9yZVZhcmlhYmxlVG9wKFVDb2xsYXRvciAqY29sbCwgY29uc3QgdWludDMyX3QgdmFyVG9wLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIFRocmVhZCBzYWZlIGNsb25pbmcgb3BlcmF0aW9uLiBUaGUgcmVzdWx0IGlzIGEgY2xvbmUgb2YgYSBnaXZlbiBjb2xsYXRvci4KICogQHBhcmFtIGNvbGwgY29sbGF0b3IgdG8gYmUgY2xvbmVkCiAqIEBwYXJhbSBzdGFja0J1ZmZlciB1c2VyIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIG5ldyBjbG9uZS4gCiAqIElmIE5VTEwgbmV3IG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4gCiAqICBJZiBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCwgbmV3IG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4KICogIENsaWVudHMgY2FuIHVzZSB0aGUgVV9DT0xfU0FGRUNMT05FX0JVRkZFUlNJWkUuIAogKiAgVGhpcyB3aWxsIHByb2JhYmx5IGJlIGVub3VnaCB0byBhdm9pZCBtZW1vcnkgYWxsb2NhdGlvbnMuCiAqIEBwYXJhbSBwQnVmZmVyU2l6ZSBwb2ludGVyIHRvIHNpemUgb2YgYWxsb2NhdGVkIHNwYWNlLiAKICogIElmICpwQnVmZmVyU2l6ZSA9PSAwLCBhIHN1ZmZpY2llbnQgc2l6ZSBmb3IgdXNlIGluIGNsb25pbmcgd2lsbCAKICogIGJlIHJldHVybmVkICgncHJlLWZsaWdodGluZycpCiAqICBJZiAqcEJ1ZmZlclNpemUgaXMgbm90IGVub3VnaCBmb3IgYSBzdGFjay1iYXNlZCBzYWZlIGNsb25lLCAKICogIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQuCiAqIEBwYXJhbSBzdGF0dXMgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdlbnQgb24gc21vb3RobHkgb3IgdGhlcmUgd2VyZSBlcnJvcnMKICogICAgQW4gaW5mb3JtYXRpb25hbCBzdGF0dXMgdmFsdWUsIFVfU0FGRUNMT05FX0FMTE9DQVRFRF9FUlJPUiwgaXMgdXNlZCBpZiBhbnkKICogYWxsb2NhdGlvbnMgd2VyZSBuZWNlc3NhcnkuCiAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3IGNsb25lCiAqIEBzZWUgdWNvbF9vcGVuCiAqIEBzZWUgdWNvbF9vcGVuUnVsZXMKICogQHNlZSB1Y29sX2Nsb3NlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVDb2xsYXRvciogVV9FWFBPUlQyIAp1Y29sX3NhZmVDbG9uZShjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqc3RhY2tCdWZmZXIsCiAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAqcEJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAqc3RhdHVzKTsKCi8qKiBkZWZhdWx0IG1lbW9yeSBzaXplIGZvciB0aGUgbmV3IGNsb25lLiBJdCBuZWVkcyB0byBiZSB0aGlzIGxhcmdlIGZvciBvcy80MDAgbGFyZ2UgcG9pbnRlcnMgCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KI2RlZmluZSBVX0NPTF9TQUZFQ0xPTkVfQlVGRkVSU0laRSA1MTIKCi8qKgogKiBSZXR1cm5zIGN1cnJlbnQgcnVsZXMuIERlbHRhIGRlZmluZXMgd2hldGhlciBmdWxsIHJ1bGVzIGFyZSByZXR1cm5lZCBvciBqdXN0IHRoZSB0YWlsb3JpbmcuIAogKiBSZXR1cm5zIG51bWJlciBvZiBVQ2hhcnMgbmVlZGVkIHRvIHN0b3JlIHJ1bGVzLiBJZiBidWZmZXIgaXMgTlVMTCBvciBidWZmZXJMZW4gaXMgbm90IGVub3VnaCAKICogdG8gc3RvcmUgcnVsZXMsIHdpbGwgc3RvcmUgdXAgdG8gYXZhaWxhYmxlIHNwYWNlLgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB0byBnZXQgdGhlIHJ1bGVzIGZyb20KICogQHBhcmFtIGRlbHRhIG9uZSBvZiBVQ09MX1RBSUxPUklOR19PTkxZLCBVQ09MX0ZVTExfUlVMRVMuIAogKiBAcGFyYW0gYnVmZmVyIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBJZiBOVUxMLCB5b3UnbGwgZ2V0IG5vIHJ1bGVzLgogKiBAcGFyYW0gYnVmZmVyTGVuIGxlbmdodCBvZiBidWZmZXIgdG8gc3RvcmUgcnVsZXMgaW4uIElmIGxlc3MgdGhlbiBuZWVkZWQgeW91J2xsIGdldCBvbmx5IHRoZSBwYXJ0IHRoYXQgZml0cyBpbi4KICogQHJldHVybiBjdXJyZW50IHJ1bGVzCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldFJ1bGVzRXgoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVQ29sUnVsZU9wdGlvbiBkZWx0YSwgVUNoYXIgKmJ1ZmZlciwgaW50MzJfdCBidWZmZXJMZW4pOwoKLyoqCiAqIGdldHMgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBjb2xsYXRvci4gSWYgdGhlIGNvbGxhdG9yCiAqIGlzIGluc3RhbnRpYXRlZCBmcm9tIHRoZSBydWxlcywgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMKICogTlVMTC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBmb3Igd2hpY2ggdGhlIGxvY2FsZSBpcyBuZWVkZWQKICogQHBhcmFtIHR5cGUgWW91IGNhbiBjaG9vc2UgYmV0d2VlbiByZXF1ZXN0ZWQsIHZhbGlkIGFuZCBhY3R1YWwKICogICAgICAgICAgICAgbG9jYWxlLiBGb3IgZGVzY3JpcHRpb24gc2VlIHRoZSBkZWZpbml0aW9uIG9mCiAqICAgICAgICAgICAgIFVMb2NEYXRhTG9jYWxlVHlwZSBpbiB1bG9jLmgKICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlIG9mIHRoZSBvcGVyYXRpb24KICogQHJldHVybiByZWFsIGxvY2FsZSBuYW1lIGZyb20gd2hpY2ggdGhlIGNvbGxhdGlvbiBkYXRhIGNvbWVzLiAKICogICAgICAgICBJZiB0aGUgY29sbGF0b3Igd2FzIGluc3RhbnRpYXRlZCBmcm9tIHJ1bGVzLCByZXR1cm5zCiAqICAgICAgICAgTlVMTC4KICogQGRyYWZ0IElDVSAyLjEKICovClVfQ0FQSSBjb25zdCBjaGFyICogVV9FWFBPUlQyCnVjb2xfZ2V0TG9jYWxlKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUxvY0RhdGFMb2NhbGVUeXBlIHR5cGUsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgoKLyoqCiAqIEdldCBhbiBVbmljb2RlIHNldCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgY2hhcmFjdGVycyBhbmQgc2VxdWVuY2VzIHRhaWxvcmVkIGluIAogKiB0aGlzIGNvbGxhdG9yLiBUaGUgcmVzdWx0IG11c3QgYmUgZGlzcG9zZWQgb2YgYnkgdXNpbmcgdXNldF9jbG9zZS4KICogQHBhcmFtIGNvbGwgICAgICAgIFRoZSBVQ29sbGF0b3IgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IHRhaWxvcmVkIGNoYXJzCiAqIEBwYXJhbSBzdGF0dXMgICAgICBlcnJvciBjb2RlIG9mIHRoZSBvcGVyYXRpb24KICogQHJldHVybiBhIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBVU2V0LiBNdXN0IGJlIGJlIGRpc3Bvc2VkIGJ5IHVzaW5nIHVzZXRfY2xvc2UKICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVzZXRfY2xvc2UKICogQGRyYWZ0IElDVSAyLjQKICovClVfQ0FQSSBVU2V0ICogVV9FWFBPUlQyCnVjb2xfZ2V0VGFpbG9yZWRTZXQoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKI2lmZGVmIFVfVVNFX0RFUFJFQ0FURURfVUNPTF9BUEkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVwcmVjYXRlZCBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFRoaXMgaXMgdGhlIEMgQVBJIHdyYXBwZXIgZm9yIENvbGxhdGlvbkl0ZXJhdG9yIHRoYXQgZ290IGJvb3RlZCBvdXQgZnJvbSBoZXJlLCBpbmNsdWRpbmcganVzdCBmb3IgKi8KLyogaW5jbHVkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi8qKgogKiBUT0RPOiBSZW1vdmUgYWZ0ZXIgTm92IDIwMDIKICovCiNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCgovKioKICogT3BlbiBhIFVDb2xsYXRvciB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbi4KICogVGhpcyBpcyB0aGUgc2FtZSBhcyB1Y29sX29wZW4oKSBleGNlcHQgdGhhdCB1Y29sX2dldFZlcnNpb24oKSBvZgogKiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHZlcnNpb24KICogcGFyYW1ldGVyLgogKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgdG8gb3BlbiB0aGUgc2FtZSBjb2xsYXRvciBmb3IgYSBnaXZlbgogKiBsb2NhbGUgZXZlbiB3aGVuIElDVSBpcyB1cGRhdGVkLgogKiBUaGUgc2FtZSBsb2NhbGUgYW5kIHZlcnNpb24gZ3VhcmFudGVlcyB0aGUgc2FtZSBzb3J0IGtleXMgYW5kCiAqIGNvbXBhcmlzb24gcmVzdWx0cy4KICoKICogQHBhcmFtIGxvYyBUaGUgbG9jYWxlIElEIGZvciB3aGljaCB0byBvcGVuIGEgY29sbGF0b3IuCiAqIEBwYXJhbSB2ZXJzaW9uIFRoZSByZXF1ZXN0ZWQgY29sbGF0b3IgdmVyc2lvbi4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYSBVRXJyb3JDb2RlLAogKiAgICAgICAgICAgICAgIG11c3Qgbm90IGluZGljYXRlIGEgZmFpbHVyZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVDb2xsYXRvciwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAogKiAgICAgICAgIG9yIGEgY29sbGF0b3Igd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZS4KICoKICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX2dldFZlcnNpb24KICogQG9ic29sZXRlIElDVSAyLjQuIFVzZSBzdXBwb3J0IGZvciBydW5uaW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIElDVSBpbnN0ZWFkIHNpbmNlIHRoaXMgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGF0IHJlbGVhc2UuCiAqLwpVX0NBUEkgVUNvbGxhdG9yICogVV9FWFBPUlQyCnVjb2xfb3BlblZlcnNpb24oY29uc3QgY2hhciAqbG9jLAogICAgICAgICAgICAgICAgIFVWZXJzaW9uSW5mbyB2ZXJzaW9uLAogICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogR2V0IHRoZSBub3JtYWxpemF0aW9uIG1vZGUgdXNlZCBpbiBhIFVDb2xsYXRvci4KICogVGhlIG5vcm1hbGl6YXRpb24gbW9kZSBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHJldHVybiBUaGUgbm9ybWFsaXphdGlvbiBtb2RlLCBVTk9STV9OT05FIG9yIFVOT1JNX05GRC4KICogQHNlZSB1Y29sX3NldE5vcm1hbGl6YXRpb24KICogQG9ic29sZXRlIElDdSAyLjQuIFVzZSB1Y29sX2dldEF0dHJpYnV0ZSgpIGluc3RlYWQgc2luY2UgdGhpcyBBUEkgd2lsbCBiZSByZW1vdmVkIGluIHRoYXQgcmVsZWFzZS4KICovClVfQ0FQSSBVTm9ybWFsaXphdGlvbk1vZGUgVV9FWFBPUlQyIAp1Y29sX2dldE5vcm1hbGl6YXRpb24oY29uc3QgVUNvbGxhdG9yKiBjb2xsKTsKCi8qKgogKiBTZXQgdGhlIG5vcm1hbGl6YXRpb24gbW9kZSB1c2VkIGluIGEgVUNvbGxhdG9yLgogKiBUaGUgbm9ybWFsaXphdGlvbiBtb2RlIGluZmx1ZW5jZXMgaG93IHN0cmluZ3MgYXJlIGNvbXBhcmVkLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIHRvIHNldC4KICogQHBhcmFtIG1vZGUgVGhlIGRlc2lyZWQgbm9ybWFsaXphdGlvbiBtb2RlOiBPbmUgb2YKICogICAgICAgICAgICAgVU5PUk1fTk9ORSAoZXhwZWN0IHRoZSB0ZXh0IHRvIG5vdCBuZWVkIG5vcm1hbGl6YXRpb24pLAogKiAgICAgICAgICAgICBVTk9STV9ORkQgKG5vcm1hbGl6ZSkKICogQHNlZSB1Y29sX2dldE5vcm1hbGl6YXRpb24KICogQG9ic29sZXRlIElDVSAyLjQuIFVzZSB1Y29sX3NldEF0dHJpYnV0ZSgpIGluc3RlYWQgc2luY2UgdGhpcyBBUEkgd2lsbCBiZSByZW1vdmVkIGluIHRoYXQgcmVsZWFzZS4KICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9zZXROb3JtYWxpemF0aW9uKCAgVUNvbGxhdG9yICAgICAgICAqY29sbCwKICAgICAgICAgICAgVU5vcm1hbGl6YXRpb25Nb2RlICAgIG1vZGUpOwoKLyoqCiAqIFRPRE86IFJlbW92ZSBhZnRlciBBdWcgMjAwMgogKi8KI2lmICgoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gIT0gMikgfHwgKFVfSUNVX1ZFUlNJT05fTUlOT1JfTlVNICE9IDIpKQojICAgZXJyb3IgIklDVSB2ZXJzaW9uIGhhcyBjaGFuZ2VkLiBQbGVhc2UgcmVkZWZpbmUgdGhlIG1hY3JvcyB1bmRlciBVX1VTRV9ERVBSRUNBVEVEX0ZPUk1BVF9BUEkgcHJlLXByb2Nlc3NvciBkZWZpbml0aW9uIgojZWxzZSAKIyAgIGRlZmluZSB1Y29sX29wZW5SdWxlc18yXzIocnVsZXMscnVsZXNMZW5ndGgsbm9ybWFsaXphdGlvbk1vZGUsc3RyZW5ndGgsc3RhdHVzKSB1Y29sX29wZW5SdWxlcyhydWxlcyxydWxlc0xlbmd0aCwoVUNvbEF0dHJpYnV0ZVZhbHVlKW5vcm1hbGl6YXRpb25Nb2RlLHN0cmVuZ3RoLE5VTEwsc3RhdHVzKQojZW5kaWYKCiNlbmRpZgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04gKi8KCiNlbmRpZgo=