LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSB0Y29sZGF0YS5oCi8vCi8vIEludGVybmFsIGZpbGUuICBEZWZpbmVzIFRhYmxlQ29sbGF0aW9uRGF0YSwgYW4gaW50ZXJuYWwgY2xhc3Mgd2hpY2ggaXMgc2hhcmVkCi8vIGJ5IFRhYmxlQ29sbGF0aW9uIG9iamVjdHMsIGFuZCB3aGljaCBjb250YWlucyBhbGwgdGhlIGludmFyaWFudCAoYW5kIGxhcmdlKQovLyBwaWVjZXMgb2YgZGF0YS4gIE9uY2UgY3JlYXRlZCwgVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdHMgZG8gbm90IGNoYW5nZS4KLy8KLy8gQ3JlYXRlZCBieTogQWxhbiBMaXUKLy8KLy8gTW9kaWZpY2F0aW9uIEhpc3Rvcnk6Ci8vCi8vICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgovLyAgMi81Lzk3ICAgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCi8vICAzLzUvOTcgICAgICBhbGl1ICAgICAgICBEb24ndCBzdHJlYW0gcnVsZSB0YWJsZSBpbiBvciBvdXQuICBBZGRlZCBkYXRhIG1lbWJlcnMKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlzUnVsZVRhYmxlTG9hZGVkLCBkZXNpcmVkTG9jYWxlLCBhbmQgcmVhbExvY2FsZU5hbWUsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgcmVxdWlyZWQgZm9yIGR5bmFtaWMgcmVsb2FkaW5nIG9mIHRoZSBydWxlCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuICBXZSBzdGlsbCBrZWVwIHJ1bGVzIGluIHRoaXMgb2JqZWN0IHNvIHRoYXQKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY2FuIGJlIGhlbGQgaW4gdGhlIGluLW1lbW9yeSBjYWNoZS4KLy8gIDMvMjYvOTcgICAgIGhlbGVuYSAgICAgIFVwZGF0ZWQgd2l0aCBwbGF0Zm9ybSBpbmRlcGVuZGVudCBkYXRhIHR5cGVzLgovLyAgNi8yMC85NyAgICAgaGVsZW5hICAgICAgSmF2YSBjbGFzcyBuYW1lIGNoYW5nZS4KLy8gIDgvMTgvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgVENPTERBVEFfSAojZGVmaW5lIFRDT0xEQVRBX0gKCiNpbmNsdWRlICJ1Y21wMzIuaCIKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJjb2xjYWNoZS5oIgojaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKI2luY2x1ZGUgInVuaWNvZGUvbG9jaWQuaCIKI2luY2x1ZGUgImZpbGVzdHJtLmgiCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpjbGFzcyBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGU7CmNsYXNzIFZlY3Rvck9mUFRvRXhwYW5kVGFibGU7CmNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yOwpjbGFzcyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovKioKICogVGFibGVDb2xsYXRpb25EYXRhIGlzIGFuIGludGVybmFsIGNsYXNzIHVzZWQgYnkgVGFibGVDb2xsYXRpb24uICBJdAogKiBlbmNhcHN1bGF0ZXMgbW9zdCBvZiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBUYWJsZUNvbGxhdGlvbi4KICogVGhpcyBpbmNsdWRlcyB0aGUgbGFyZ2UgY29sbGF0aW9uIHRhYmxlcywgaW5jbHVkaW5nIHRoZSBjb250cmFjdAogKiBvcmRlciBhbmQgZXhwYW5kIG9yZGVyIHRhYmxlcywgYW5kIHNvbWUgc21hbGwgcGllY2VzIG9mIGRhdGEgdGhhdAogKiBkb24ndCBjaGFuZ2UsIHN1Y2ggYXMgdGhlIG1heGltdW0gc2Vjb25kYXJ5IG9yZGVyLiAgVGhlIGdlbmVyYWwKICogaWRlYSBpcyB0aGF0IHRoZSBUYWJsZUNvbGxhdGlvbiBvYmplY3Qgc2hvdWxkIGJlIGEgbGlnaHR3ZWlnaHQKICogb2JqZWN0LiAgSWYgdGhlcmUgYXJlIHR3byBUYWJsZUNvbGxhdGlvbiBvYmplY3RzLCB0aGV5IHdpbGwgZWFjaCBiZQogKiB2ZXJ5IHNtYWxsLCBhbmQgdXNlcnMgY2FuIGFsdGVyIHRoZSBzdHJlbmd0aCBvZiBlYWNoIG9iamVjdAogKiBpbmRlcGVuZGVudGx5LiAgSG93ZXZlciwgYm90aCBvYmplY3RzLCBpZiB0aGV5IGFyZSByZWZlcmluZyB0byB0aGUKICogc2FtZSB1bmRlcmx5aW5nIGNvbGxhdGlvbiwgd2lsbCBzaGFyZSBwb2ludGVycyB0byB0aGUgc2FtZQogKiBUYWJsZUNvbGxhdGlvbkRhdGEgb2JqZWN0LCB3aGljaCBkb2Vzbid0IGNoYW5nZS4gIDxQPgogKiBUYWJsZUNvbGxhdGlvbkRhdGEgb2JqZWN0cyBhcmUgdGhlcmVmb3JlIGdvb2QgY2FuZGlkYXRlcyBmb3IKICogY2FjaGluZyBpbiBtZW1vcnkgYW5kIHBvdGVudGlhbGx5IGZvciByZWZlcmVuY2UgY291bnRpbmcuICAqLwpjbGFzcyBUYWJsZUNvbGxhdGlvbkRhdGEKewpwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVDb2xsYXRpb25EYXRhKCk7CiAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICAgICAgflRhYmxlQ29sbGF0aW9uRGF0YSgpOwoKICAgIC8qKgogICAgICogQ2FjaGUgaW50ZXJmYWNlLiAgVGhlIGNhY2hlIHVzZXMgVW5pY29kZVN0cmluZyBvYmplY3RzIGFzIGtleXMuICBUaGVzZQogICAgICogYXJlIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LCBidXQgYXJlIHVzdWFsbHkgc29tZXRoaW5nIHVuaXF1ZWx5IGFzc29jaWF0ZWQKICAgICAqIHdpdGggZWFjaCBjb2xsYXRpb24sIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgZmFpcmx5IHNtYWxsLCBzdWNoIGFzIGEKICAgICAqIGxvY2FsZSBpZGVudGlmaWVyIHN0cmluZy4KICAgICAqIDxQPiBBZGRzIHRoZSBjb2xsYXRpb24gZGF0YSBvYmplY3QgdG8gdGhlIGNhY2hlIGxpc3QuCiAgICAgKiBAcGFyYW0ga2V5IHRoZSB1bmlxdWUga2V5IG9mIHRoZSBhc3NvY2lhdGVkIGNvbGxhdGlvbiBkYXRhIG9iamVjdC4KICAgICAqIEBwYXJhbSBkYXRhIHRoZSBjb2xsYXRpb24gZGF0YSBvYmplY3QuCiAgICAgKi8KICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBhZGRUb0NhY2hlKGNvbnN0IFVuaWNvZGVTdHJpbmcmIGtleSwgVGFibGVDb2xsYXRpb25EYXRhKiBkYXRhKTsKICAgIC8qKgogICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGNhY2hlZCBjb2xsYXRpb24gZGF0YS4KICAgICAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgb2YgdGhlIGFzc29jaWF0ZWQgY29sbGF0aW9uIGRhdGEgb2JqZWN0LgogICAgICogQHJldHVybnMgdGhlIGZvdW5kIGNvbGxhdGlvbiBkYXRhIG9iamVjdC4KICAgICAqLwogICAgc3RhdGljICBUYWJsZUNvbGxhdGlvbkRhdGEqIGZpbmRJbkNhY2hlKGNvbnN0IFVuaWNvZGVTdHJpbmcmIGtleSk7CgogICAgLyoqCiAgICAgKiBUaGUgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHJlYWQgYW5kIHdyaXRlIG9iamVjdHMgb2YgdGhpcwogICAgICogY2xhc3MgYXMgYmluYXJ5LCBwbGF0Zm9ybS1kZXBlbmRlbnQgZGF0YSBpbiB0aGUgaW9zdHJlYW0uICBUaGUgc3RyZWFtCiAgICAgKiBtdXN0IGJlIGluIGlvczo6YmluYXJ5IG1vZGUgZm9yIHRoaXMgdG8gd29yay4gIFRoZXNlIG1ldGhvZHMgYXJlIG5vdAogICAgICogaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVibGljIHVzZTsgdGhleSBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGltcHJvdmUKICAgICAqIHBlcmZvcm1hbmNlIGJ5IHN0b3JpbmcgY2VydGFpbiBvYmplY3RzIGluIGJpbmFyeSBmaWxlcy4KICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbUluKEZpbGVTdHJlYW0qIGlzKTsKICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBvYmplY3QgaXMgdmFsaWQuCiAgICAgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBvYmplY3QgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICAgICAgYm9vbF90ICAgICAgICAgICAgICBpc0JvZ3VzKCkgY29uc3Q7CnByaXZhdGU6CiAgICAvKioKICAgICAqIFRoZSBmb2xsb3dpbmcgYXJlIGRpc2FsbG93ZWQgb3BlcmF0aW9uczogbm90IGltcGxlbWVudGVkLgogICAgICovCiAgICBUYWJsZUNvbGxhdGlvbkRhdGEoY29uc3QgVGFibGVDb2xsYXRpb25EYXRhJik7CiAgICBUYWJsZUNvbGxhdGlvbkRhdGEmIG9wZXJhdG9yPShjb25zdCBUYWJsZUNvbGxhdGlvbkRhdGEmKTsKCnByaXZhdGU6CiAgICAvLyBEbyBub3QgYWNjZXNzIHRoZSBmZ0NhY2hlIG9iamVjdCBkaXJlY3RseTsgdXNlIGFkZFRvQ2FjaGUgYW5kIGZpbmRJbkNhY2hlLgogICAgc3RhdGljICBDb2xsYXRpb25DYWNoZSAgICAgIGZnQ2FjaGU7Cgpwcml2YXRlOgogICAgLyoqCiAgICAgKiBUaGUgVGFibGVDb2xsYXRpb24gY2xhc3MgZnJlZWx5IG1hbmlwdWxhdGVzIHRoZSBkYXRhIG1lbWJlcnMgd2l0aGluIGEKICAgICAqIFRhYmxlQ29sbGF0aW9uRGF0YSBvYmplY3QuICBUaGlzIGlzIGJlY2F1c2UgVGFibGVDb2xsYXRpb25EYXRhIGlzCiAgICAgKiBpbnRlbmRlZCB0byBiZSBhbiBpbnRlcm5hbCwgaW52aXNpYmxlIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIElmCiAgICAgKiBUYWJsZUNvbGxhdGlvbkRhdGEgZXZlcnkgYmVjb21lcyBhIG1vcmUgcHVibGljIEFQSSwgdGhlbiB0aGlzIHdpbGwgaGF2ZQogICAgICogdG8gY2hhbmdlLCBhbHRob3VnaCB0aGlzIGlzIG5vdCByZWFsbHkgYWR2aXNlZC4KICAgICAqLwogICAgZnJpZW5kIGNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yOwogICAgZnJpZW5kIGNsYXNzIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjsKCiAgICBib29sX3QgICAgICAgICAgICAgICAgICAgICAgaXNGcmVuY2hTZWM7CiAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgbWF4U2VjT3JkZXI7CiAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgbWF4VGVyT3JkZXI7CiAgICBDb21wYWN0SW50QXJyYXkqICAgICAgICAgICAgbWFwcGluZzsKICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZSogICBjb250cmFjdFRhYmxlOwogICAgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZSogICAgIGV4cGFuZFRhYmxlOwogICAgYm9vbF90ICAgICAgICAgICAgICAgICAgICAgIGZCb2d1czsKCiAgICAvKioKICAgICAqIFJ1bGUgc3RyaW5nIGRhdGEgaXMgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IHdoZW4gcmVxdWlyZWQgYnkgdGhlIFRhYmxlQ29sbGF0aW9uCiAgICAgKiBvYmplY3QuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIGEgYmluYXJ5IGZpbGUgaXMgY3JlYXRlZCwgdGhlIHJ1bGUgZGF0YSBpcwogICAgICogbm90IHN0cmVhbWVkIG91dCAtLSB0aGlzIGtlZXBzIHRoZSBiaW5hcnkgZmlsZSBzbWFsbC4gIEhvd2V2ZXIsIHR3byBwaWVjZXMKICAgICAqIG9mIGRhdGEgYXJlIGtlcHQgYXJvdW5kICh0aGUgZGVzaXJlZExvY2FsZSBhbmQgdGhlIHJlYWxMb2NhbGVOYW1lKSB3aGljaAogICAgICogYWxsb3cgbGF0ZXIgbG9hZGluZyBvZiB0aGUgcnVsZSBzdHJpbmcgZWZmaWNpZW50bHkuICBCeSBlZmZpY2llbnRseSwgd2UgbWVhbgogICAgICogdGhhdCB0aGUgdXN1YWwgc2VhcmNoIHByb2NlZHVyZSBpcyBzaG9ydGVuZWQsIGFuZCB0aGUgZmluYWwgZmlsZSB3aGljaAogICAgICogYWN0dWFsbHkgbGVkIHRvIHRoZSBzdWNjZXNzZnVsIGxvYWRpbmcgb2YgdGhlIGNvbGxhdGlvbiBlbGVtZW50cyBpcyBhY2Nlc3NlZAogICAgICogZGlyZWN0bHkuICBUaGUgYm9vbGVhbiBpc1J1bGVUYWJsZUxvYWRlZCBhbGxvd3MgdGhlIGNvbGxhdGlvbiBvYmplY3QgdG8KICAgICAqIGtub3cgd2hldGhlciBydWxlcyBoYXZlIGJlZW4gbG9hZGVkIChhbiBhbHRlcm5hdGl2ZSBpcyB0byB1c2UgYW4gZW1wdHkKICAgICAqIHJ1bGVUYWJsZSB0byBpbmRpY2F0ZSB0aGlzLCBidXQgdGhpcyB0aGVuIGRpc2FsbG93cyB0aGUgZW1wdHkgc3RyaW5nIGFzCiAgICAgKiBhIHZhbGlkIHJ1bGUgc3RyaW5nKS4gIE5vdGUgdGhhdCB3aGVuIGEgY29sbGF0aW9uIGlzIGNvbnN0cnVjdGVkICJmcm9tCiAgICAgKiBzY3JhdGNoIiAobm90IGxvYWRlZCBmcm9tIGEgYmluYXJ5IGZpbGUpLCB0aGUgcnVsZSB0YWJsZSBpcyBhbHJlYWR5IGluIHBsYWNlLAogICAgICogYW5kIGlzUnVsZVRhYmxlTG9hZGVkIGlzIHNldCB0byB0cnVlLgogICAgICoKICAgICAqIFNlZSBSdWxlQmFzZWRDb2xsYXRvcjo6Z2V0UnVsZXMoKS4KICAgICAqLwogICAgVW5pY29kZVN0cmluZyAgICAgICAgICAgICAgIHJ1bGVUYWJsZTsKICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgICAgICBpc1J1bGVUYWJsZUxvYWRlZDsKICAgIExvY2FsZSAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkTG9jYWxlOwogICAgVW5pY29kZVN0cmluZyAgICAgICAgICAgICAgIHJlYWxMb2NhbGVOYW1lOwp9OwoKI2VuZGlmIC8vX1RDT0xEQVRBCi8vZW9mCg==