cGFja2FnZSBvcmcuYXBhY2hlLnR1cmJpbmUuc2VydmljZXMueG1scnBjOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCiAqIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCiAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgogKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCiAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCiAqCiAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQKICogICAgIkFwYWNoZSBUdXJiaW5lIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwogKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yCiAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAqCiAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAogKiAgICAiQXBhY2hlIFR1cmJpbmUiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0CiAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCiAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KICovCgppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKCmltcG9ydCBqYXZhLm5ldC5VUkw7CgppbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKCmltcG9ydCBvcmcuYXBhY2hlLnR1cmJpbmUuc2VydmljZXMuU2VydmljZTsKaW1wb3J0IG9yZy5hcGFjaGUudHVyYmluZS51dGlsLlR1cmJpbmVFeGNlcHRpb247CgovKioKICogVGhlIGludGVyZmFjZSBhbiBYbWxScGNTZXJ2aWNlIGltcGxlbWVudHMuCiAqCiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpvc2hAc3RvbmVjb3R0YWdlLmNvbSI+Sm9zaCBMdWNhczwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bWFnbnVzQGhhbmR0b2x2dXIuaXMiPk1hZ276cyDe83IgVG9yZmFzb248L2E+CiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOlJhZmFsLktyemV3c2tpQGUtcG9pbnQucGwiPlJhZmFsIEtyemV3c2tpPC9hPgogKiBAYXV0aG9yIDxhIGhyZWY9Imp2YW56eWxAcGVyaWFwdC5jb20iPkphc29uIHZhbiBaeWw8L2E+CiAqIEB2ZXJzaW9uICRJZCQKICovCnB1YmxpYyBpbnRlcmZhY2UgWG1sUnBjU2VydmljZQogICAgICAgIGV4dGVuZHMgU2VydmljZQp7CiAgICAvKiogVHVyYmluZVhtbFJwY1NlcnZpY2UuICovCiAgICBTdHJpbmcgU0VSVklDRV9OQU1FID0gIlhtbFJwY1NlcnZpY2UiOwoKICAgIC8qKgogICAgICogRXhlY3V0ZSBhIHJlbW90ZSBwcm9jZWR1cmUgY2FsbC4KICAgICAqCiAgICAgKiBAcGFyYW0gdXJsIEEgVVJMLgogICAgICogQHBhcmFtIG1ldGhvZE5hbWUgQSBTdHJpbmcgd2l0aCB0aGUgbWV0aG9kIG5hbWUuCiAgICAgKiBAcGFyYW0gcGFyYW1zIEEgVmVjdG9yIHdpdGggdGhlIHBhcmFtZXRlcnMuCiAgICAgKiBAcmV0dXJuIEFuIE9iamVjdC4KICAgICAqIEBleGNlcHRpb24gVHVyYmluZUV4Y2VwdGlvbgogICAgICovCiAgICBPYmplY3QgZXhlY3V0ZVJwYyhVUkwgdXJsLAogICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwKICAgICAgICAgICAgVmVjdG9yIHBhcmFtcykKICAgICAgICAgICAgdGhyb3dzIFR1cmJpbmVFeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBFeGVjdXRlIGEgcmVtb3RlIHByb2NlZHVyZSBjYWxsIHRhaHQgcmVxdWlyZXMKICAgICAqIGF1dGhlbnRpY2F0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB1cmwgQSBVUkwuCiAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCiAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBBIFN0cmluZyB3aXRoIHRoZSBtZXRob2QgbmFtZS4KICAgICAqIEBwYXJhbSBwYXJhbXMgQSBWZWN0b3Igd2l0aCB0aGUgcGFyYW1ldGVycy4KICAgICAqIEByZXR1cm4gQW4gT2JqZWN0LgogICAgICogQGV4Y2VwdGlvbiBUdXJiaW5lRXhjZXB0aW9uCiAgICAgKi8KICAgIE9iamVjdCBleGVjdXRlQXV0aGVudGljYXRlZFJwYyhVUkwgdXJsLAogICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCwKICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsCiAgICAgICAgICAgIFZlY3RvciBwYXJhbXMpCiAgICAgICAgICAgIHRocm93cyBUdXJiaW5lRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogUmVnaXN0ZXIgYW4gb2JqZWN0IGFzIGEgaGFuZGxlciBmb3IgdGhlIFhtbFJwYyBTZXJ2ZXIgcGFydC4KICAgICAqCiAgICAgKiBAcGFyYW0gaGFuZGxlck5hbWUgVGhlIG5hbWUgdW5kZXIgd2hpY2ggd2Ugd2FudAogICAgICogdG8gcmVnaXN0ZXIgdGhlIHNlcnZpY2UKICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIG9iamVjdAogICAgICovCiAgICB2b2lkIHJlZ2lzdGVySGFuZGxlcihTdHJpbmcgaGFuZGxlck5hbWUsIE9iamVjdCBoYW5kbGVyKTsKCiAgICAvKioKICAgICAqIFJlZ2lzdGVyIGFuIG9iamVjdCBhcyBhIHRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yCiAgICAgKiB0aGUgWG1sUnBjIFNlcnZlciBwYXJ0LgogICAgICoKICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIG9iamVjdAogICAgICovCiAgICB2b2lkIHJlZ2lzdGVySGFuZGxlcihPYmplY3QgaGFuZGxlcik7CgogICAgLyoqCiAgICAgKiBVbnJlZ2lzdGVyIGEgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gaGFuZGxlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgdG8gdW5yZWdpc3Rlci4KICAgICAqLwogICAgdm9pZCB1bnJlZ2lzdGVySGFuZGxlcihTdHJpbmcgaGFuZGxlck5hbWUpOwoKICAgIC8qKgogICAgICogSGFuZGxlIGFuIFhNTC1SUEMgcmVxdWVzdCB1c2luZyB0aGUgZW5jYXBzdWxhdGVkIHNlcnZlci4KICAgICAqCiAgICAgKiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBoYW5kbGUgYSByZXF1ZXN0IGZyb20gd2l0aGluCiAgICAgKiBhIFR1cmJpbmUgc2NyZWVuLgogICAgICoKICAgICAqIEBwYXJhbSBpcyB0aGUgc3RyZWFtIHRvIHJlYWQgcmVxdWVzdCBkYXRhIGZyb20uCiAgICAgKiBAcmV0dXJuIHRoZSByZXNwb25zZSBib2R5IHRoYXQgbmVlZHMgdG8gYmUgc2VudCB0byB0aGUgY2xpZW50LgogICAgICovCiAgICBieXRlW10gaGFuZGxlUmVxdWVzdChJbnB1dFN0cmVhbSBpcyk7CgogICAgLyoqCiAgICAgKiBIYW5kbGUgYW4gWE1MLVJQQyByZXF1ZXN0IHVzaW5nIHRoZSBlbmNhcHN1bGF0ZWQgc2VydmVyIHdpdGggdXNlcgogICAgICogYXV0aGVudGljYXRpb24uCiAgICAgKgogICAgICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGEgcmVxdWVzdCBmcm9tIHdpdGhpbgogICAgICogYSBUdXJiaW5lIHNjcmVlbi4KICAgICAqCiAgICAgKiA8cD4gTm90ZSB0aGF0IHRoZSBoYW5kbGVycyBuZWVkIHRvIGltcGxlbWVudCBBdXRoZW50aWNhdGVkWG1sUnBjSGFuZGxlcgogICAgICogaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUgYXV0aGVudGljYXRpb24gaW5mb21yYXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIGlzIHRoZSBzdHJlYW0gdG8gcmVhZCByZXF1ZXN0IGRhdGEgZnJvbS4KICAgICAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIHRoYXQgaXMgbWFraW5nIHRoZSByZXF1ZXN0LgogICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBnaXZlbiBieSB1c2VyLgogICAgICogQHJldHVybiB0aGUgcmVzcG9uc2UgYm9keSB0aGF0IG5lZWRzIHRvIGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KICAgICAqLwogICAgYnl0ZVtdIGhhbmRsZVJlcXVlc3QoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpOwoKICAgIC8qKgogICAgICogTWV0aG9kIHRvIGFsbG93IGEgY2xpZW50IHRvIHNlbmQgYSBmaWxlIHRvIGEgc2VydmVyLgogICAgICoKICAgICAqIEBwYXJhbSBzZXJ2ZXJVUkwKICAgICAqIEBwYXJhbSBzb3VyY2VMb2NhdGlvblByb3BlcnR5CiAgICAgKiBAcGFyYW0gc291cmNlRmlsZU5hbWUKICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkxvY2F0aW9uUHJvcGVydHkKICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkZpbGVOYW1lCiAgICAgKiBAdGhyb3dzIFR1cmJpbmVFeGNlcHRpb24KICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbm90IHNjb3BlIG9mIHRoZSBTZXJ2aWNlIGl0c2VsZiBidXQgb2YgYW4KICAgICAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgdGhlIHNlcnZpY2UuCiAgICAgKi8KICAgIHZvaWQgc2VuZChTdHJpbmcgc2VydmVyVVJMLAogICAgICAgICAgICBTdHJpbmcgc291cmNlTG9jYXRpb25Qcm9wZXJ0eSwKICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGVOYW1lLAogICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25Mb2NhdGlvblByb3BlcnR5LAogICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25GaWxlTmFtZSkKICAgICAgICAgICAgdGhyb3dzIFR1cmJpbmVFeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gYWxsb3cgYSBjbGllbnQgdG8gc2VuZCBhIGZpbGUgdG8gYSBzZXJ2ZXIgdGhhdAogICAgICogcmVxdWlyZXMgYXV0aGVudGljYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc2VydmVyVVJMCiAgICAgKiBAcGFyYW0gdXNlcm5hbWUKICAgICAqIEBwYXJhbSBwYXNzd29yZAogICAgICogQHBhcmFtIHNvdXJjZUxvY2F0aW9uUHJvcGVydHkKICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZQogICAgICogQHBhcmFtIGRlc3RpbmF0aW9uTG9jYXRpb25Qcm9wZXJ0eQogICAgICogQHBhcmFtIGRlc3RpbmF0aW9uRmlsZU5hbWUKICAgICAqIEB0aHJvd3MgVHVyYmluZUV4Y2VwdGlvbgogICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBub3Qgc2NvcGUgb2YgdGhlIFNlcnZpY2UgaXRzZWxmIGJ1dCBvZiBhbgogICAgICogICAgICAgICAgICAgYXBwbGljYXRpb24gd2hpY2ggdXNlcyB0aGUgc2VydmljZS4KICAgICAqLwogICAgdm9pZCBzZW5kKFN0cmluZyBzZXJ2ZXJVUkwsCiAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkLAogICAgICAgICAgICBTdHJpbmcgc291cmNlTG9jYXRpb25Qcm9wZXJ0eSwKICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGVOYW1lLAogICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25Mb2NhdGlvblByb3BlcnR5LAogICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25GaWxlTmFtZSkKICAgICAgICAgICAgdGhyb3dzIFR1cmJpbmVFeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gYWxsb3cgYSBjbGllbnQgdG8gc2VuZCBhIGZpbGUgdG8gYSBzZXJ2ZXIuCiAgICAgKgogICAgICogQHBhcmFtIHNlcnZlclVSTAogICAgICogQHBhcmFtIHNvdXJjZUxvY2F0aW9uUHJvcGVydHkKICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZQogICAgICogQHBhcmFtIGRlc3RpbmF0aW9uTG9jYXRpb25Qcm9wZXJ0eQogICAgICogQHBhcmFtIGRlc3RpbmF0aW9uRmlsZU5hbWUKICAgICAqIEB0aHJvd3MgVHVyYmluZUV4Y2VwdGlvbgogICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBub3Qgc2NvcGUgb2YgdGhlIFNlcnZpY2UgaXRzZWxmIGJ1dCBvZiBhbgogICAgICogICAgICAgICAgICAgYXBwbGljYXRpb24gd2hpY2ggdXNlcyB0aGUgc2VydmljZS4KICAgICAqLwogICAgdm9pZCBnZXQoU3RyaW5nIHNlcnZlclVSTCwKICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUxvY2F0aW9uUHJvcGVydHksCiAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlTmFtZSwKICAgICAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uTG9jYXRpb25Qcm9wZXJ0eSwKICAgICAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uRmlsZU5hbWUpCiAgICAgICAgICAgIHRocm93cyBUdXJiaW5lRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogTWV0aG9kIHRvIGFsbG93IGEgY2xpZW50IHRvIHNlbmQgYSBmaWxlIHRvIGEgc2VydmVyIHRoYXQKICAgICAqIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uCiAgICAgKgogICAgICogQHBhcmFtIHNlcnZlclVSTAogICAgICogQHBhcmFtIHVzZXJuYW1lCiAgICAgKiBAcGFyYW0gcGFzc3dvcmQKICAgICAqIEBwYXJhbSBzb3VyY2VMb2NhdGlvblByb3BlcnR5CiAgICAgKiBAcGFyYW0gc291cmNlRmlsZU5hbWUKICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkxvY2F0aW9uUHJvcGVydHkKICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkZpbGVOYW1lCiAgICAgKiBAdGhyb3dzIFR1cmJpbmVFeGNlcHRpb24KICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbm90IHNjb3BlIG9mIHRoZSBTZXJ2aWNlIGl0c2VsZiBidXQgb2YgYW4KICAgICAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgdGhlIHNlcnZpY2UuCiAgICAgKi8KICAgIHZvaWQgZ2V0KFN0cmluZyBzZXJ2ZXJVUkwsCiAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkLAogICAgICAgICAgICBTdHJpbmcgc291cmNlTG9jYXRpb25Qcm9wZXJ0eSwKICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGVOYW1lLAogICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25Mb2NhdGlvblByb3BlcnR5LAogICAgICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25GaWxlTmFtZSkKICAgICAgICAgICAgdGhyb3dzIFR1cmJpbmVFeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gYWxsb3cgYSBjbGllbnQgdG8gcmVtb3ZlIGEgZmlsZSBmcm9tCiAgICAgKiB0aGUgc2VydmVyCiAgICAgKgogICAgICogQHBhcmFtIHNlcnZlclVSTAogICAgICogQHBhcmFtIHNvdXJjZUxvY2F0aW9uUHJvcGVydHkKICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZQogICAgICogQHRocm93cyBUdXJiaW5lRXhjZXB0aW9uCiAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdCBzY29wZSBvZiB0aGUgU2VydmljZSBpdHNlbGYgYnV0IG9mIGFuCiAgICAgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIHRoZSBzZXJ2aWNlLgogICAgICovCiAgICB2b2lkIHJlbW92ZShTdHJpbmcgc2VydmVyVVJMLAogICAgICAgICAgICBTdHJpbmcgc291cmNlTG9jYXRpb25Qcm9wZXJ0eSwKICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGVOYW1lKQogICAgICAgICAgICB0aHJvd3MgVHVyYmluZUV4Y2VwdGlvbjsKCiAgICAvKioKICAgICAqIE1ldGhvZCB0byBhbGxvdyBhIGNsaWVudCB0byByZW1vdmUgYSBmaWxlIGZyb20KICAgICAqIGEgc2VydmVyIHRoYXQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc2VydmVyVVJMCiAgICAgKiBAcGFyYW0gdXNlcm5hbWUKICAgICAqIEBwYXJhbSBwYXNzd29yZAogICAgICogQHBhcmFtIHNvdXJjZUxvY2F0aW9uUHJvcGVydHkKICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZQogICAgICogQHRocm93cyBUdXJiaW5lRXhjZXB0aW9uCiAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdCBzY29wZSBvZiB0aGUgU2VydmljZSBpdHNlbGYgYnV0IG9mIGFuCiAgICAgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIHRoZSBzZXJ2aWNlLgogICAgICovCiAgICB2b2lkIHJlbW92ZShTdHJpbmcgc2VydmVyVVJMLAogICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCwKICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUxvY2F0aW9uUHJvcGVydHksCiAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlTmFtZSkKICAgICAgICAgICAgdGhyb3dzIFR1cmJpbmVFeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBTd2l0Y2ggY2xpZW50IGZpbHRlcmluZyBvbi9vZmYuCiAgICAgKgogICAgICogQHBhcmFtIHN0YXRlCiAgICAgKiBAc2VlICNhY2NlcHRDbGllbnQoamF2YS5sYW5nLlN0cmluZykKICAgICAqIEBzZWUgI2RlbnlDbGllbnQoamF2YS5sYW5nLlN0cmluZykKICAgICAqLwogICAgdm9pZCBzZXRQYXJhbm9pZChib29sZWFuIHN0YXRlKTsKCiAgICAvKioKICAgICAqIEFkZCBhbiBJUCBhZGRyZXNzIHRvIHRoZSBsaXN0IG9mIGFjY2VwdGVkIGNsaWVudHMuIFRoZSBwYXJhbWV0ZXIgY2FuCiAgICAgKiBjb250YWluICcqJyBhcyB3aWxkY2FyZCBjaGFyYWN0ZXIsIGUuZy4gIjE5Mi4xNjguKi4qIi4gWW91IG11c3QKICAgICAqIGNhbGwgc2V0UGFyYW5vaWQodHJ1ZSkgaW4gb3JkZXIgZm9yIHRoaXMgdG8gaGF2ZQogICAgICogYW55IGVmZmVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gYWRkcmVzcwogICAgICogQHNlZSAjZGVueUNsaWVudChqYXZhLmxhbmcuU3RyaW5nKQogICAgICogQHNlZSAjc2V0UGFyYW5vaWQoYm9vbGVhbikKICAgICAqLwogICAgdm9pZCBhY2NlcHRDbGllbnQoU3RyaW5nIGFkZHJlc3MpOwoKICAgIC8qKgogICAgICogQWRkIGFuIElQIGFkZHJlc3MgdG8gdGhlIGxpc3Qgb2YgZGVuaWVkIGNsaWVudHMuIFRoZSBwYXJhbWV0ZXIgY2FuCiAgICAgKiBjb250YWluICcqJyBhcyB3aWxkY2FyZCBjaGFyYWN0ZXIsIGUuZy4gIjE5Mi4xNjguKi4qIi4gWW91IG11c3QgY2FsbAogICAgICogc2V0UGFyYW5vaWQodHJ1ZSkgaW4gb3JkZXIgZm9yIHRoaXMgdG8gaGF2ZSBhbnkgZWZmZWN0LgogICAgICoKICAgICAqIEBwYXJhbSBhZGRyZXNzCiAgICAgKiBAc2VlICNhY2NlcHRDbGllbnQoamF2YS5sYW5nLlN0cmluZykKICAgICAqIEBzZWUgI3NldFBhcmFub2lkKGJvb2xlYW4pCiAgICAgKi8KICAgIHZvaWQgZGVueUNsaWVudChTdHJpbmcgYWRkcmVzcyk7Cgp9Cg==