LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMTEvMTcvOTkgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KI2lmbmRlZiBVTklUT0hFWF9ICiNkZWZpbmUgVU5JVE9IRVhfSAoKI2luY2x1ZGUgInVuaWNvZGUvdHJhbnNsaXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCgpjbGFzcyBVbmljb2RlRmlsdGVyOwoKLyoqCiAqIEEgdHJhbnNsaXRlcmF0b3IgdGhhdCBjb252ZXJ0cyBmcm9tIFVuaWNvZGUgY2hhcmFjdGVycyB0byAKICogaGV4YWRlY2ltYWwgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzLiAgSXQgb3V0cHV0cyBhCiAqIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBvcHRpb25hbGx5IGNvbnZlcnRzIHRoZSBoZXgKICogZGlnaXRzIHRvIHVwcGVyY2FzZS4KICoKICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIHNldCBieSBhIHBhdHRlcm4uICBUaGlzIHBhdHRlcm4KICogZm9sbG93cyB0aGUgc2FtZSBzeW50YXggYXMgPGNvZGU+SGV4VG9Vbmljb2RlVHJhbnNsaXRlcmF0b3I8L2NvZGU+LAogKiBleGNlcHQgaXQgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgc3BlY2lmaWNhdGlvbnMuICBUaGUgcGF0dGVybiBzZXRzCiAqIHRoZSBwcmVmaXggc3RyaW5nLCBzdWZmaXggc3RyaW5nLCBhbmQgbWluaW11bSBhbmQgbWF4aW11bSBkaWdpdAogKiBjb3VudC4gIFRoZXJlIGFyZSBubyBzZXR0ZXJzIG9yIGdldHRlcnMgZm9yIHRoZXNlIGF0dHJpYnV0ZXM7IHRoZXkKICogYXJlIHNldCBvbmx5IHRocm91Z2ggdGhlIHBhdHRlcm4uCiAqCiAqIDxwPlRoZSBzZXRVcHBlcmNhc2UoKSBhbmQgaXNVcHBlcmNhc2UoKSBtZXRob2RzIGNvbnRyb2wgd2hldGhlciAnYScKICogdGhyb3VnaCAnZicgb3IgJ0EnIHRocm91Z2ggJ0YnIGFyZSBvdXRwdXQgYXMgaGV4IGRpZ2l0cy4gIFRoaXMgaXMKICogbm90IGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgcGF0dGVybjsgb25seSB0aHJvdWdoIHRoZSBtZXRob2RzLiAgVGhlCiAqIGRlZmF1bHQgaXMgdXBwZXJjYXNlLgogKgogKiBAYXV0aG9yIEFsYW4gTGl1CiAqLwpjbGFzcyBVX0kxOE5fQVBJIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yIDogcHVibGljIFRyYW5zbGl0ZXJhdG9yIHsKCnByaXZhdGU6CgogICAgLy8gQ2hhcmFjdGVyIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUgdG8gYXZvaWQgQVNDSUkgZGVwZW5kZW5jeQogICAgZW51bSB7CiAgICAgICAgWkVSTyAgICAgID0gMHgwMDMwLCAvLyAnMCcKICAgICAgICBQT1VORCAgICAgPSAweDAwMjMsIC8vICcjJwogICAgICAgIEJBQ0tTTEFTSCA9IDB4MDA1QyAgLy8gJ1xcJwogICAgfTsKCiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEVYX0RJR0lUU1szMl07CgogICAgLyoqCiAgICAgKiBJRCBmb3IgdGhpcyB0cmFuc2xpdGVyYXRvci4KICAgICAqLwogICAgc3RhdGljIGNvbnN0IGNoYXIqIF9JRDsKCiAgICAvKioKICAgICAqIFRoZSBwYXR0ZXJuIHNldCBieSBhcHBseVBhdHRlcm4oKSBhbmQgcmV0dXJuZWQgYnkgdG9QYXR0ZXJuKCkuCiAgICAgKi8KICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKCiAgICAvKioKICAgICAqIFRoZSBzdHJpbmcgcHJlY2VkaW5nIHRoZSBoZXggZGlnaXRzLCBwYXJzZWQgZnJvbSB0aGUgcGF0dGVybi4KICAgICAqLwogICAgVW5pY29kZVN0cmluZyBwcmVmaXg7CgogICAgLyoqCiAgICAgKiBUaGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgaGV4IGRpZ2l0cywgcGFyc2VkIGZyb20gdGhlIHBhdHRlcm4uCiAgICAgKi8KICAgIFVuaWNvZGVTdHJpbmcgc3VmZml4OwoKICAgIC8qKgogICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGhleCBkaWdpdHMgdG8gb3V0cHV0LCBiZXR3ZWVuIDEgYW5kIDQsCiAgICAgKiBpbmNsdXNpdmUuICBQYXJzZWQgZnJvbSB0aGUgcGF0dGVybi4KICAgICAqLwogICAgaW50OF90IG1pbkRpZ2l0czsKCiAgICAvKioKICAgICAqIElmIFRSVUUsIG91dHB1dCB1cHBlcmNhc2UgaGV4IGRpZ2l0czsgb3RoZXJ3aXNlIG91dHB1dAogICAgICogbG93ZXJjYXNlLiAgU2V0IGJ5IHNldFVwcGVyY2FzZSgpIGFuZCByZXR1cm5lZCBieSBpc1VwcGVyY2FzZSgpLgogICAgICovCiAgICBVQm9vbCB1cHBlcmNhc2U7CgpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgdHJhbnNsaXRlcmF0b3IuCiAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiBmb3IgdGhpcyB0cmFuc2xpdGVyYXRvci4gIFNlZQogICAgICogYXBwbHlQYXR0ZXJuKCkgZm9yIHBhdHRlcm4gc3ludGF4LgogICAgICogQHBhcmFtIHVwcGVyY2FzZSBpZiB0cnVlLCB0aGUgZm91ciBoZXggZGlnaXRzIHdpbGwgYmUKICAgICAqIGNvbnZlcnRlZCB0byB1cHBlcmNhc2U7IG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgbG93ZXJjYXNlLgogICAgICogQHBhcmFtIGFkb3B0ZWRGaWx0ZXIgdGhlIGZpbHRlciBmb3IgdGhpcyB0cmFuc2xpdGVyYXRvciwgb3IKICAgICAqIE5VTEwgaWYgbm9uZS4gIEFkb3B0ZWQgYnkgdGhpcyB0cmFuc2xpdGVyYXRvci4KICAgICAqIEBwYXJhbSBzdGF0dXMgRXJyb3IgY29kZSBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZQogICAgICogdG8gcGFyc2UgcGF0dGVybi4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoY29uc3QgVW5pY29kZVN0cmluZyYgcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIGlzVXBwZXJjYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZUZpbHRlciogYWRvcHRlZEZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIHVwcGVyY2FzZSB0cmFuc2xpdGVyYXRvciB3aXRoIG5vIGZpbHRlci4KICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGZvciB0aGlzIHRyYW5zbGl0ZXJhdG9yLiAgU2VlCiAgICAgKiBhcHBseVBhdHRlcm4oKSBmb3IgcGF0dGVybiBzeW50YXguCiAgICAgKiBAcGFyYW0gc3RhdHVzIEVycm9yIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUKICAgICAqIHRvIHBhcnNlIHBhdHRlcm4uCiAgICAgKi8KICAgIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIHRyYW5zbGl0ZXJhdG9yIHdpdGggdGhlIGRlZmF1bHQgcHJlZml4ICJcdSIKICAgICAqIHRoYXQgb3V0cHV0cyB1cHBlcmNhc2UgaGV4IGRpZ2l0cy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoVW5pY29kZUZpbHRlciogYWRvcHRlZEZpbHRlciA9IDApOwoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCB+VW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoKTsKCiAgICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yKGNvbnN0IFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yJik7CgogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yJik7CgogICAgLyoqCiAgICAgKiBUcmFuc2xpdGVyYXRvciBBUEkuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgVHJhbnNsaXRlcmF0b3IqIGNsb25lKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogU2V0IHRoZSBwYXR0ZXJuIHJlY29nbml6ZWQgYnkgdGhpcyB0cmFuc2xpdGVyYXRvci4gIFRoZSBwYXR0ZXJuCiAgICAgKiBtdXN0IGNvbnRhaW4gemVybyBvciBtb3JlIHByZWZpeCBjaGFyYWN0ZXJzLCBvbmUgb3IgbW9yZSBkaWdpdAogICAgICogY2hhcmFjdGVycywgYW5kIHplcm8gb3IgbW9yZSBzdWZmaXggY2hhcmFjdGVycy4gIFRoZSBkaWdpdAogICAgICogY2hhcmFjdGVycyBpbmRpY2F0ZXMgb3B0aW9uYWwgZGlnaXRzICgnIycpIGZvbGxvd2VkIGJ5IHJlcXVpcmVkCiAgICAgKiBkaWdpdHMgKCcwJykuICBUaGUgdG90YWwgbnVtYmVyIG9mIGRpZ2l0cyBjYW5ub3QgZXhjZWVkIDQsIGFuZAogICAgICogbXVzdCBiZSBhdCBsZWFzdCAxIHJlcXVpcmVkIGRpZ2l0LiAgVXNlIGEgYmFja3NsYXNoICgnXFwnKSB0bwogICAgICogZXNjYXBlIGFueSBvZiB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzLiAgQW4gZW1wdHkgcGF0dGVybiBpcyBub3QKICAgICAqIGFsbG93ZWQuCiAgICAgKgogICAgICogPHA+RXhhbXBsZTogIlUrMDAwMCIgc3BlY2lmaWVzIGEgcHJlZml4IG9mICJVKyIsIGV4YWN0bHkgZm91cgogICAgICogZGlnaXRzLCBhbmQgbm8gc3VmZml4LiAgIjwjIyMwPiIgaGFzIGEgcHJlZml4IG9mICI8IiwgYmV0d2VlbgogICAgICogb25lIGFuZCBmb3VyIGRpZ2l0cywgYW5kIGEgc3VmZml4IG9mICI+Ii4KICAgICAqCiAgICAgKiA8cD48cHJlPgogICAgICogcGF0dGVybiA6PSBwcmVmaXgtY2hhciogZGlnaXQtc3BlYyBzdWZmaXgtY2hhcioKICAgICAqIGRpZ2l0LXNwZWMgOj0gJyMnKiAnMCcrCiAgICAgKiBwcmVmaXgtY2hhciA6PSBbXnNwZWNpYWwtY2hhcl0gfCAnXFwnIHNwZWNpYWwtY2hhcgogICAgICogc3VmZml4LWNoYXIgOj0gW15zcGVjaWFsLWNoYXJdIHwgJ1xcJyBzcGVjaWFsLWNoYXIKICAgICAqIHNwZWNpYWwtY2hhciA6PSAnOycgfCAnMCcgfCAnIycgfCAnXFwnCiAgICAgKiA8L3ByZT4KICAgICAqCiAgICAgKiA8cD5MaW1pdGF0aW9uczogVGhlcmUgaXMgbm8gd2F5IHRvIHNldCB0aGUgdXBwZXJjYXNlIGF0dHJpYnV0ZQogICAgICogaW4gdGhlIHBhdHRlcm4uICAoYXBwbHlQYXR0ZXJuKCkgZG9lcyBub3QgYWx0ZXIgdGhlIHVwcGVyY2FzZQogICAgICogYXR0cmlidXRlLikKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBhcHBseVBhdHRlcm4oY29uc3QgVW5pY29kZVN0cmluZyYgdGhlUGF0dGVybiwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGlzIHRyYW5zbGl0ZXJhdG9yJ3MgcGF0dGVybi4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgY29uc3QgVW5pY29kZVN0cmluZyYgdG9QYXR0ZXJuKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNsaXRlcmF0b3Igb3V0cHV0cyB1cHBlcmNhc2UgaGV4IGRpZ2l0cy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBVQm9vbCBpc1VwcGVyY2FzZSh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFNldHMgaWYgdGhpcyB0cmFuc2xpdGVyYXRvciBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgc2V0VXBwZXJjYXNlKFVCb29sIG91dHB1dFVwcGVyY2FzZSk7CgogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBUcmFuc2xpdGVyYXRvciNoYW5kbGVUcmFuc2xpdGVyYXRlfS4KICAgICAqIEBkcmFmdAogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlVHJhbnNsaXRlcmF0ZShSZXBsYWNlYWJsZSYgdGV4dCwgUG9zaXRpb24mIG9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCBpc0luY3JlbWVudGFsKSBjb25zdDsKfTsKCmlubGluZSBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcjo6flVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yKCkge30KCiNlbmRpZgo=