LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgICAgICAgICAgICAgICAgKgoqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgovKioKKiBGaWxlIGNvbGwuaAoqIAoqIENyZWF0ZWQgYnk6IEhlbGVuYSBTaGloCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqIDAyLzUvOTcgICAgICBhbGl1ICAgICAgICBNb2RpZmllZCBjcmVhdGVEZWZhdWx0IHRvIGxvYWQgY29sbGF0aW9uIGRhdGEgZnJvbQoqICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnkgZmlsZXMgd2hlbiBwb3NzaWJsZS4gIEFkZGVkIHJlbGF0ZWQgbWV0aG9kcwoqICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb2xsYXRpb25Gcm9tRmlsZSwgY2hvcExvY2FsZSwgY3JlYXRlUGF0aE5hbWUuCiogMDIvMTEvOTcgICAgIGFsaXUgICAgICAgIEFkZGVkIG1lbWJlcnMgYWRkVG9DYWNoZSwgZmluZEluQ2FjaGUsIGFuZCBmZ0NhY2hlLgoqIDAyLzEyLzk3ICAgICBhbGl1ICAgICAgICBNb2RpZmllZCB0byBjcmVhdGUgb2JqZWN0cyBmcm9tIFJ1bGVCYXNlZENvbGxhdG9yIGNhY2hlLgoqICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlZCBjYWNoZSBvdXQgb2YgQ29sbGF0aW9uIGNsYXNzLgoqIDAyLzEzLzk3ICAgICBhbGl1ICAgICAgICBNb3ZlZCBzZXZlcmFsIG1ldGhvZHMgb3V0IG9mIHRoaXMgY2xhc3MgYW5kIGludG8KKiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IsIHdpdGggbW9kaWZpY2F0aW9ucy4gIE1vZGlmaWVkCiogICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHQoKSB0byBjYWxsIG5ldyBSdWxlQmFzZWRDb2xsYXRvcihMb2NhbGUmKQoqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci4gIEdlbmVyYWwgY2xlYW4gdXAgYW5kIGRvY3VtZW50YXRpb24uCiogMDIvMjAvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGNsb25lLCBvcGVyYXRvcj09LCBvcGVyYXRvciE9LCBvcGVyYXRvcj0sIGNvcHkKKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgYW5kIGdldER5bmFtaWNDbGFzc0lELgoqIDAzLzI1Lzk3ICAgICBoZWxlbmEgICAgICBVcGRhdGVkIHdpdGggcGxhdGZvcm0gaW5kZXBlbmRlbnQgZGF0YSB0eXBlcy4KKiAwNS8wNi85NyAgICAgaGVsZW5hICAgICAgQWRkZWQgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgZGV0ZWN0aW9uLgoqIDA2LzIwLzk3ICAgICBoZWxlbmEgICAgICBKYXZhIGNsYXNzIG5hbWUgY2hhbmdlLgoqIDA5LzAzLzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBjcmVhdGVDb2xsYXRpb25LZXlWYWx1ZXMoKS4KKiAwMi8xMC85OCAgICAgZGFtaWJhICAgICAgQWRkZWQgY29tcGFyZSgpIHdpdGggbGVuZ3RoIGFzIHBhcmFtZXRlci4KKiAwNC8yMy85OSAgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBFRGVjb21wb3NpdGlvbk1vZGUsIG1lcmdlZCB3aXRoCiogICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZXI6OkVNb2RlLgoqIDExLzAyLzk5ICAgICBoZWxlbmEgICAgICBDb2xsYXRvciBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMuICBFbGltaW5hdGVzIHRoZSAKKiAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBjb25zdHJ1Y3Rpb24gYW5kIHNwZWNpYWwgY2FzZSBmb3IgTk9fT1AuCiogMTEvMjMvOTkgICAgIHNybCAgICAgICAgIE1vcmUgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLiBJbmxpbmluZyBvZgoqICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0aWNhbCBhY2Nlc3NvcnMuCiogMDUvMTUvMDAgICAgIGhlbGVuYSAgICAgIEFkZGVkIHZlcnNpb24gaW5mb3JtYXRpb24gQVBJLiAKKiAwMS8yOS8wMSAgICAgc3lud2VlICAgICAgTW9kaWZpZWQgaW50byBhIEMrKyB3cmFwcGVyIHdoaWNoIGNhbGxzIEMgYXBpcyAKKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjb2xsLmgpLiAKKi8KCiNpZm5kZWYgQ09MTF9ICiNkZWZpbmUgQ09MTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCiNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04KCiNpbmNsdWRlICJ1bmljb2RlL3VvYmplY3QuaCIKI2luY2x1ZGUgInVuaWNvZGUvdWNvbC5oIgojaW5jbHVkZSAidW5pY29kZS9ub3JtbHpyLmgiCiNpbmNsdWRlICJ1bmljb2RlL2xvY2lkLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaXNldC5oIgoKVV9OQU1FU1BBQ0VfQkVHSU4KCi8qKgoqIEBzdGFibGUgSUNVIDIuMAoqLwpjbGFzcyBDb2xsYXRpb25LZXk7CgovKioKKiBUaGUgPGNvZGU+Q29sbGF0b3I8L2NvZGU+IGNsYXNzIHBlcmZvcm1zIGxvY2FsZS1zZW5zaXRpdmUgc3RyaW5nIAoqIGNvbXBhcmlzb24uPGJyPgoqIFlvdSB1c2UgdGhpcyBjbGFzcyB0byBidWlsZCBzZWFyY2hpbmcgYW5kIHNvcnRpbmcgcm91dGluZXMgZm9yIG5hdHVyYWwgCiogbGFuZ3VhZ2UgdGV4dC48YnI+CiogPGVtPkltcG9ydGFudDogPC9lbT5UaGUgSUNVIGNvbGxhdGlvbiBzZXJ2aWNlIGhhcyBiZWVuIHJlaW1wbGVtZW50ZWQgCiogaW4gb3JkZXIgdG8gYWNoaWV2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIFVDQSBjb21wbGlhbmNlLiAKKiBGb3IgZGV0YWlscywgc2VlIHRoZSAKKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2ljdWh0bWwvZGVzaWduL2NvbGxhdGlvbi9JQ1VfY29sbGF0aW9uX2Rlc2lnbi5odG0iPgoqIGNvbGxhdGlvbiBkZXNpZ24gZG9jdW1lbnQ8L2E+LgoqIDxwPgoqIDxjb2RlPkNvbGxhdG9yPC9jb2RlPiBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzLiBTdWJjbGFzc2VzIGltcGxlbWVudCAKKiBzcGVjaWZpYyBjb2xsYXRpb24gc3RyYXRlZ2llcy4gT25lIHN1YmNsYXNzLCAKKiA8Y29kZT5SdWxlQmFzZWRDb2xsYXRvcjwvY29kZT4sIGlzIGN1cnJlbnRseSBwcm92aWRlZCBhbmQgaXMgYXBwbGljYWJsZSAKKiB0byBhIHdpZGUgc2V0IG9mIGxhbmd1YWdlcy4gT3RoZXIgc3ViY2xhc3NlcyBtYXkgYmUgY3JlYXRlZCB0byBoYW5kbGUgbW9yZSAKKiBzcGVjaWFsaXplZCBuZWVkcy4KKiA8cD4KKiBMaWtlIG90aGVyIGxvY2FsZS1zZW5zaXRpdmUgY2xhc3NlcywgeW91IGNhbiB1c2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZCwgCiogPGNvZGU+Y3JlYXRlSW5zdGFuY2U8L2NvZGU+LCB0byBvYnRhaW4gdGhlIGFwcHJvcHJpYXRlIAoqIDxjb2RlPkNvbGxhdG9yPC9jb2RlPiBvYmplY3QgZm9yIGEgZ2l2ZW4gbG9jYWxlLiBZb3Ugd2lsbCBvbmx5IG5lZWQgdG8gCiogbG9vayBhdCB0aGUgc3ViY2xhc3NlcyBvZiA8Y29kZT5Db2xsYXRvcjwvY29kZT4gaWYgeW91IG5lZWQgdG8gCiogdW5kZXJzdGFuZCB0aGUgZGV0YWlscyBvZiBhIHBhcnRpY3VsYXIgY29sbGF0aW9uIHN0cmF0ZWd5IG9yIGlmIHlvdSBuZWVkIHRvIAoqIG1vZGlmeSB0aGF0IHN0cmF0ZWd5LgoqIDxwPgoqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gY29tcGFyZSB0d28gc3RyaW5ncyB1c2luZyB0aGUgCiogPGNvZGU+Q29sbGF0b3I8L2NvZGU+IGZvciB0aGUgZGVmYXVsdCBsb2NhbGUuCiogPGJsb2NrcXVvdGU+CiogPHByZT4KKiBcY29kZQoqIC8vIENvbXBhcmUgdHdvIHN0cmluZ3MgaW4gdGhlIGRlZmF1bHQgbG9jYWxlCiogVUVycm9yQ29kZSBzdWNjZXNzID0gVV9aRVJPX0VSUk9SOwoqIENvbGxhdG9yKiBteUNvbGxhdG9yID0gQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKHN1Y2Nlc3MpOwoqIGlmIChteUNvbGxhdG9yLT5jb21wYXJlKCJhYmMiLCAiQUJDIikgPCAwKQoqICAgY291dCA8PCAiYWJjIGlzIGxlc3MgdGhhbiBBQkMiIDw8IGVuZGw7CiogZWxzZQoqICAgY291dCA8PCAiYWJjIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBBQkMiIDw8IGVuZGw7CiogXGVuZGNvZGUKKiA8L3ByZT4KKiA8L2Jsb2NrcXVvdGU+CiogPHA+CiogWW91IGNhbiBzZXQgYSA8Y29kZT5Db2xsYXRvcjwvY29kZT4ncyA8ZW0+c3RyZW5ndGg8L2VtPiBwcm9wZXJ0eSB0byAKKiBkZXRlcm1pbmUgdGhlIGxldmVsIG9mIGRpZmZlcmVuY2UgY29uc2lkZXJlZCBzaWduaWZpY2FudCBpbiBjb21wYXJpc29ucy4gCiogRml2ZSBzdHJlbmd0aHMgYXJlIHByb3ZpZGVkOiA8Y29kZT5QUklNQVJZPC9jb2RlPiwgPGNvZGU+U0VDT05EQVJZPC9jb2RlPiwgCiogPGNvZGU+VEVSVElBUlk8L2NvZGU+LCA8Y29kZT5RVUFURVJOQVJZPC9jb2RlPiBhbmQgPGNvZGU+SURFTlRJQ0FMPC9jb2RlPi4gVGhlIGV4YWN0IGFzc2lnbm1lbnQgb2YgCiogc3RyZW5ndGhzIHRvIGxhbmd1YWdlIGZlYXR1cmVzIGlzIGxvY2FsZSBkZXBlbmRhbnQuIEZvciBleGFtcGxlLCBpbiBDemVjaCwgCiogImUiIGFuZCAiZiIgYXJlIGNvbnNpZGVyZWQgcHJpbWFyeSBkaWZmZXJlbmNlcywgd2hpbGUgImUiIGFuZCAiXHUwMEVBIiBhcmUgCiogc2Vjb25kYXJ5IGRpZmZlcmVuY2VzLCAiZSIgYW5kICJFIiBhcmUgdGVydGlhcnkgZGlmZmVyZW5jZXMgYW5kICJlIiBhbmQgImUiIAoqIGFyZSBpZGVudGljYWwuIFRoZSBmb2xsb3dpbmcgc2hvd3MgaG93IGJvdGggY2FzZSBhbmQgYWNjZW50cyBjb3VsZCBiZSAKKiBpZ25vcmVkIGZvciBVUyBFbmdsaXNoLgoqIDxibG9ja3F1b3RlPgoqIDxwcmU+CiogXGNvZGUKKiAvL0dldCB0aGUgQ29sbGF0b3IgZm9yIFVTIEVuZ2xpc2ggYW5kIHNldCBpdHMgc3RyZW5ndGggdG8gUFJJTUFSWSAKKiBVRXJyb3JDb2RlIHN1Y2Nlc3MgPSBVX1pFUk9fRVJST1I7CiogQ29sbGF0b3IqIHVzQ29sbGF0b3IgPSAKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2UoTG9jYWxlOjpVUywgc3VjY2Vzcyk7CiogdXNDb2xsYXRvci0+c2V0U3RyZW5ndGgoQ29sbGF0b3I6OlBSSU1BUlkpOwoqIGlmICh1c0NvbGxhdG9yLT5jb21wYXJlKCJhYmMiLCAiQUJDIikgPT0gMCkKKiAgIGNvdXQgPDwgCiogIidhYmMnIGFuZCAnQUJDJyBzdHJpbmdzIGFyZSBlcXVpdmFsZW50IHdpdGggc3RyZW5ndGggUFJJTUFSWSIgPDwgCiogZW5kbDsKKiBcZW5kY29kZQoqIDwvcHJlPgoqIDwvYmxvY2txdW90ZT4KKiA8cD4KKiBGb3IgY29tcGFyaW5nIHN0cmluZ3MgZXhhY3RseSBvbmNlLCB0aGUgPGNvZGU+Y29tcGFyZTwvY29kZT4gbWV0aG9kIAoqIHByb3ZpZGVzIHRoZSBiZXN0IHBlcmZvcm1hbmNlLiBXaGVuIHNvcnRpbmcgYSBsaXN0IG9mIHN0cmluZ3MgaG93ZXZlciwgaXQgCiogaXMgZ2VuZXJhbGx5IG5lY2Vzc2FyeSB0byBjb21wYXJlIGVhY2ggc3RyaW5nIG11bHRpcGxlIHRpbWVzLiBJbiB0aGlzIGNhc2UsIAoqIHNvcnQga2V5cyBwcm92aWRlIGJldHRlciBwZXJmb3JtYW5jZS4gVGhlIDxjb2RlPmdldFNvcnRLZXk8L2NvZGU+IG1ldGhvZHMgCiogY29udmVydCBhIHN0cmluZyB0byBhIHNlcmllcyBvZiBieXRlcyB0aGF0IGNhbiBiZSBjb21wYXJlZCBiaXR3aXNlIGFnYWluc3QgCiogb3RoZXIgc29ydCBrZXlzIHVzaW5nIDxjb2RlPnN0cmNtcCgpPC9jb2RlPi4gU29ydCBrZXlzIGFyZSB3cml0dGVuIGFzIAoqIHplcm8tdGVybWluYXRlZCBieXRlIHN0cmluZ3MuIFRoZXkgY29uc2lzdCBvZiBzZXZlcmFsIHN1YnN0cmluZ3MsIG9uZSBmb3IgCiogZWFjaCBjb2xsYXRpb24gc3RyZW5ndGggbGV2ZWwsIHRoYXQgYXJlIGRlbGltaXRlZCBieSAweDAxIGJ5dGVzLgoqIElmIHRoZSBzdHJpbmcgY29kZSBwb2ludHMgYXJlIGFwcGVuZGVkIGZvciBVQ09MX0lERU5USUNBTCwgdGhlbiB0aGV5IGFyZSAKKiBwcm9jZXNzZWQgZm9yIGNvcnJlY3QgY29kZSBwb2ludCBvcmRlciBjb21wYXJpc29uIGFuZCBtYXkgY29udGFpbiAweDAxIAoqIGJ5dGVzIGJ1dCBub3QgemVybyBieXRlcy4KKiA8L3A+CiogPHA+CiogQW4gb2xkZXIgc2V0IG9mIEFQSXMgcmV0dXJucyBhIDxjb2RlPkNvbGxhdGlvbktleTwvY29kZT4gb2JqZWN0IHRoYXQgd3JhcHMgCiogdGhlIHNvcnQga2V5IGJ5dGVzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBieXRlcyB0aGVtc2VsdmVzLgoqIEl0cyB1c2UgaXMgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIHN0aWxsIGF2YWlsYWJsZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIAoqIEphdmEuCiogPC9wPgoqIDxwPgoqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gPGNvZGU+Q29sbGF0b3I8L2NvZGU+cyB3aXRoIGRpZmZlcmVudCBMb2NhbGUsCiogYW5kIENvbGxhdGlvblN0cmVuZ3RoIHNldHRpbmdzIHdpbGwgcmV0dXJuIGRpZmZlcmVudCBzb3J0IAoqIG9yZGVycyBmb3IgdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIExvY2FsZXMgaGF2ZSBzcGVjaWZpYyBjb2xsYXRpb24gcnVsZXMsIAoqIGFuZCB0aGUgd2F5IGluIHdoaWNoIHNlY29uZGFyeSBhbmQgdGVydGlhcnkgZGlmZmVyZW5jZXMgYXJlIHRha2VuIGludG8gCiogYWNjb3VudCwgZm9yIGV4YW1wbGUsIHdpbGwgcmVzdWx0IGluIGEgZGlmZmVyZW50IHNvcnRpbmcgb3JkZXIgZm9yIHNhbWUgCiogc3RyaW5ncy4KKiA8L3A+CiogQHNlZSAgICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yCiogQHNlZSAgICAgICAgIENvbGxhdGlvbktleQoqIEBzZWUgICAgICAgICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IKKiBAc2VlICAgICAgICAgTG9jYWxlCiogQHNlZSAgICAgICAgIE5vcm1hbGl6ZXIKKiBAdmVyc2lvbiAgICAgMi4wIDExLzE1LzAxCiovCgpjbGFzcyBVX0kxOE5fQVBJIENvbGxhdG9yIDogcHVibGljIFVPYmplY3QgewpwdWJsaWM6CgogIC8vIENvbGxhdG9yIHB1YmxpYyBlbnVtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAqIEJhc2UgbGV0dGVyIHJlcHJlc2VudHMgYSBwcmltYXJ5IGRpZmZlcmVuY2UuIFNldCBjb21wYXJpc29uIGxldmVsIHRvIAogICogUFJJTUFSWSB0byBpZ25vcmUgc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeSBkaWZmZXJlbmNlcy48YnI+CiAgKiBVc2UgdGhpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIG9mIGEgQ29sbGF0b3Igb2JqZWN0Ljxicj4KICAqIEV4YW1wbGUgb2YgcHJpbWFyeSBkaWZmZXJlbmNlLCAiYWJjIiAmbHQ7ICJhYmQiCiAgKiAKICAqIERpYWNyaXRpY2FsIGRpZmZlcmVuY2VzIG9uIHRoZSBzYW1lIGJhc2UgbGV0dGVyIHJlcHJlc2VudCBhIHNlY29uZGFyeQogICogZGlmZmVyZW5jZS4gU2V0IGNvbXBhcmlzb24gbGV2ZWwgdG8gU0VDT05EQVJZIHRvIGlnbm9yZSB0ZXJ0aWFyeQogICogZGlmZmVyZW5jZXMuIFVzZSB0aGlzIHRvIHNldCB0aGUgc3RyZW5ndGggb2YgYSBDb2xsYXRvciBvYmplY3QuPGJyPgogICogRXhhbXBsZSBvZiBzZWNvbmRhcnkgZGlmZmVyZW5jZSwgIuQiID4+ICJhIi4KICAqCiAgKiBVcHBlcmNhc2UgYW5kIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBhCiAgKiB0ZXJ0aWFyeSBkaWZmZXJlbmNlLiAgU2V0IGNvbXBhcmlzb24gbGV2ZWwgdG8gVEVSVElBUlkgdG8gaW5jbHVkZSBhbGwgCiAgKiBjb21wYXJpc29uIGRpZmZlcmVuY2VzLiBVc2UgdGhpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIG9mIGEgQ29sbGF0b3IKICAqIG9iamVjdC48YnI+CiAgKiBFeGFtcGxlIG9mIHRlcnRpYXJ5IGRpZmZlcmVuY2UsICJhYmMiICZsdDsmbHQ7Jmx0OyAiQUJDIi4KICAqCiAgKiBUd28gY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCAiaWRlbnRpY2FsIiB3aGVuIHRoZXkgaGF2ZSB0aGUgc2FtZSB1bmljb2RlIAogICogc3BlbGxpbmdzLjxicj4KICAqIEZvciBleGFtcGxlLCAi5CIgPT0gIuQiLgogICoKICAqIFVDb2xsYXRpb25TdHJlbmd0aCBpcyBhbHNvIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdHJlbmd0aCBvZiBzb3J0IGtleXMgCiAgKiBnZW5lcmF0ZWQgZnJvbSBDb2xsYXRvciBvYmplY3RzLgogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICBlbnVtIEVDb2xsYXRpb25TdHJlbmd0aCAKICB7CiAgICBQUklNQVJZICAgID0gMCwKICAgIFNFQ09OREFSWSAgPSAxLCAKICAgIFRFUlRJQVJZICAgPSAyLAogICAgUVVBVEVSTkFSWSA9IDMsCiAgICBJREVOVElDQUwgID0gMTUKICB9OwogIAogIC8qKgogICogTEVTUyBpcyByZXR1cm5lZCBpZiBzb3VyY2Ugc3RyaW5nIGlzIGNvbXBhcmVkIHRvIGJlIGxlc3MgdGhhbiB0YXJnZXQKICAqIHN0cmluZyBpbiB0aGUgY29tcGFyZSgpIG1ldGhvZC4KICAqIEVRVUFMIGlzIHJldHVybmVkIGlmIHNvdXJjZSBzdHJpbmcgaXMgY29tcGFyZWQgdG8gYmUgZXF1YWwgdG8gdGFyZ2V0CiAgKiBzdHJpbmcgaW4gdGhlIGNvbXBhcmUoKSBtZXRob2QuCiAgKiBHUkVBVEVSIGlzIHJldHVybmVkIGlmIHNvdXJjZSBzdHJpbmcgaXMgY29tcGFyZWQgdG8gYmUgZ3JlYXRlciB0aGFuCiAgKiB0YXJnZXQgc3RyaW5nIGluIHRoZSBjb21wYXJlKCkgbWV0aG9kLgogICogQHNlZSBDb2xsYXRvciNjb21wYXJlCiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIGVudW0gRUNvbXBhcmlzb25SZXN1bHQgCiAgewogICAgTEVTUyA9IC0xLAogICAgRVFVQUwgPSAwLAogICAgR1JFQVRFUiA9IDEKICB9OwogIAogIC8vIENvbGxhdG9yIHB1YmxpYyBkZXN0cnVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgCiAgLyoqCiAgKiBEZXN0cnVjdG9yCiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIHZpcnR1YWwgfkNvbGxhdG9yKCk7CgogIC8vIENvbGxhdG9yIHB1YmxpYyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICogUmV0dXJucyB0cnVlIGlmICJvdGhlciIgaXMgdGhlIHNhbWUgYXMgInRoaXMiCiAgKiBAcGFyYW0gb3RoZXIgQ29sbGF0b3Igb2JqZWN0IHRvIGJlIGNvbXBhcmVkCiAgKiBAcmV0dXJuIHRydWUgaWYgb3RoZXIgaXMgdGhlIHNhbWUgYXMgdGhpcy4KICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgdmlydHVhbCBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbGxhdG9yJiBvdGhlcikgY29uc3Q7CgogIC8qKgogICogUmV0dXJucyB0cnVlIGlmICJvdGhlciIgaXMgbm90IHRoZSBzYW1lIGFzICJ0aGlzIi4KICAqIEBwYXJhbSBvdGhlciBDb2xsYXRvciBvYmplY3QgdG8gYmUgY29tcGFyZWQKICAqIEByZXR1cm4gdHJ1ZSBpZiBvdGhlciBpcyBub3QgdGhlIHNhbWUgYXMgdGhpcy4KICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgdmlydHVhbCBVQm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbGxhdG9yJiBvdGhlcikgY29uc3Q7CgogIC8qKgogICogTWFrZXMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgogICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBvYmplY3QKICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgdmlydHVhbCBDb2xsYXRvciogY2xvbmUodm9pZCkgY29uc3QgPSAwOwoKICAvKioKICAqIENyZWF0ZXMgdGhlIENvbGxhdG9yIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZGVmYXVsdCBsb2NhbGUuCiAgKiBUaGUgZGVmYXVsdCBsb2NhbGUgaXMgZGV0ZXJtaW5lZCBieSBMb2NhbGU6OmdldERlZmF1bHQuCiAgKiBUaGUgVUVycm9yQ29kZSYgZXJyIHBhcmFtZXRlciBpcyB1c2VkIHRvIHJldHVybiBzdGF0dXMgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuCiAgKiBUbyBjaGVjayB3aGV0aGVyIHRoZSBjb25zdHJ1Y3Rpb24gc3VjY2VlZGVkIG9yIG5vdCwgeW91IHNob3VsZCBjaGVjayB0aGUgCiAgKiB2YWx1ZSBvZiBVX1NVQ0NFU1MoZXJyKS4gIElmIHlvdSB3aXNoIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24sIHlvdSBjYW4gCiAgKiBjaGVjayBmb3IgaW5mb3JtYXRpb25hbCBlcnJvciByZXN1bHRzIHdoaWNoIHN0aWxsIGluZGljYXRlIHN1Y2Nlc3MuCiAgKiBVX1VTSU5HX0ZBTExCQUNLX0VSUk9SIGluZGljYXRlcyB0aGF0IGEgZmFsbCBiYWNrIGxvY2FsZSB3YXMgdXNlZC4gRm9yCiAgKiBleGFtcGxlLCAnZGVfQ0gnIHdhcyByZXF1ZXN0ZWQsIGJ1dCBub3RoaW5nIHdhcyBmb3VuZCB0aGVyZSwgc28gJ2RlJyB3YXMKICAqIHVzZWQuIFVfVVNJTkdfREVGQVVMVF9FUlJPUiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCBsb2NhbGUgZGF0YSB3YXMKICAqIHVzZWQ7IG5laXRoZXIgdGhlIHJlcXVlc3RlZCBsb2NhbGUgbm9yIGFueSBvZiBpdHMgZmFsbCBiYWNrIGxvY2FsZXMKICAqIGNvdWxkIGJlIGZvdW5kLgogICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCBvYmplY3QgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyBpdC4KICAqCiAgKiBAcGFyYW0gZXJyICAgIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEByZXR1cm4gICAgICAgdGhlIGNvbGxhdGlvbiBvYmplY3Qgb2YgdGhlIGRlZmF1bHQgbG9jYWxlLihmb3IgZXhhbXBsZSwgZW5fVVMpCiAgKiBAc2VlIExvY2FsZSNnZXREZWZhdWx0CiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIHN0YXRpYyBDb2xsYXRvciogY3JlYXRlSW5zdGFuY2UoVUVycm9yQ29kZSYgIGVycik7CgogIC8qKgogICogR2V0cyB0aGUgdGFibGUtYmFzZWQgY29sbGF0aW9uIG9iamVjdCBmb3IgdGhlIGRlc2lyZWQgbG9jYWxlLiBUaGUKICAqIHJlc291cmNlIG9mIHRoZSBkZXNpcmVkIGxvY2FsZSB3aWxsIGJlIGxvYWRlZCBieSBSZXNvdXJjZUxvYWRlci4gCiAgKiBMb2NhbGU6OkVOR0xJU0ggaXMgdGhlIGJhc2UgY29sbGF0aW9uIHRhYmxlIGFuZCBhbGwgb3RoZXIgbGFuZ3VhZ2VzIGFyZSAKICAqIGJ1aWx0IG9uIHRvcCBvZiBpdCB3aXRoIGFkZGl0aW9uYWwgbGFuZ3VhZ2Utc3BlY2lmaWMgbW9kaWZpY2F0aW9ucy4KICAqIFRoZSBVRXJyb3JDb2RlJiBlcnIgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci4KICAqIFRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnN0cnVjdGlvbiBzdWNjZWVkZWQgb3Igbm90LCB5b3Ugc2hvdWxkIGNoZWNrCiAgKiB0aGUgdmFsdWUgb2YgVV9TVUNDRVNTKGVycikuICBJZiB5b3Ugd2lzaCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLCB5b3UKICAqIGNhbiBjaGVjayBmb3IgaW5mb3JtYXRpb25hbCBlcnJvciByZXN1bHRzIHdoaWNoIHN0aWxsIGluZGljYXRlIHN1Y2Nlc3MuCiAgKiBVX1VTSU5HX0ZBTExCQUNLX0VSUk9SIGluZGljYXRlcyB0aGF0IGEgZmFsbCBiYWNrIGxvY2FsZSB3YXMgdXNlZC4gIEZvcgogICogZXhhbXBsZSwgJ2RlX0NIJyB3YXMgcmVxdWVzdGVkLCBidXQgbm90aGluZyB3YXMgZm91bmQgdGhlcmUsIHNvICdkZScgd2FzCiAgKiB1c2VkLiAgVV9VU0lOR19ERUZBVUxUX0VSUk9SIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IGxvY2FsZSBkYXRhIHdhcwogICogdXNlZDsgbmVpdGhlciB0aGUgcmVxdWVzdGVkIGxvY2FsZSBub3IgYW55IG9mIGl0cyBmYWxsIGJhY2sgbG9jYWxlcwogICogY291bGQgYmUgZm91bmQuCiAgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIG9iamVjdCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIGl0LgogICogQHBhcmFtIGxvYyAgICBUaGUgbG9jYWxlIElEIGZvciB3aGljaCB0byBvcGVuIGEgY29sbGF0b3IuCiAgKiBAcGFyYW0gZXJyICAgIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEByZXR1cm4gICAgICAgdGhlIGNyZWF0ZWQgdGFibGUtYmFzZWQgY29sbGF0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgZGVzaXJlZAogICogICAgICAgICAgICAgICBsb2NhbGUuCiAgKiBAc2VlIExvY2FsZQogICogQHNlZSBSZXNvdXJjZUxvYWRlcgogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICBzdGF0aWMgQ29sbGF0b3IqIGNyZWF0ZUluc3RhbmNlKGNvbnN0IExvY2FsZSYgbG9jLCBVRXJyb3JDb2RlJiBlcnIpOwoKICAvKioKICAgKiBDcmVhdGUgYSBDb2xsYXRvciB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbi4KICAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNyZWF0ZUluc3RhbmNlKGxvYywgZXJyKSBleGNlcHQgdGhhdCBnZXRWZXJzaW9uKCkgb2YKICAgKiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHZlcnNpb24KICAgKiBwYXJhbWV0ZXIuCiAgICogVGhpcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHRvIG9wZW4gdGhlIHNhbWUgY29sbGF0b3IgZm9yIGEgZ2l2ZW4KICAgKiBsb2NhbGUgZXZlbiB3aGVuIElDVSBpcyB1cGRhdGVkLgogICAqIFRoZSBzYW1lIGxvY2FsZSBhbmQgdmVyc2lvbiBndWFyYW50ZWVzIHRoZSBzYW1lIHNvcnQga2V5cyBhbmQKICAgKiBjb21wYXJpc29uIHJlc3VsdHMuCiAgICoKICAgKiBAcGFyYW0gbG9jIFRoZSBsb2NhbGUgSUQgZm9yIHdoaWNoIHRvIG9wZW4gYSBjb2xsYXRvci4KICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgcmVxdWVzdGVkIGNvbGxhdG9yIHZlcnNpb24uCiAgICogQHBhcmFtIGVyciBBIHJlZmVyZW5jZSB0byBhIFVFcnJvckNvZGUsCiAgICogICAgICAgICAgICBtdXN0IG5vdCBpbmRpY2F0ZSBhIGZhaWx1cmUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICAgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIENvbGxhdG9yLCBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkCiAgICogICAgICAgICBvciBhIGNvbGxhdG9yIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUuCiAgICoKICAgKiBAc2VlIGdldFZlcnNpb24KICAgKiBAc3RhYmxlIElDVSAyLjIKICAgKi8KICBzdGF0aWMgQ29sbGF0b3IgKmNyZWF0ZUluc3RhbmNlKGNvbnN0IExvY2FsZSAmbG9jLCBVVmVyc2lvbkluZm8gdmVyc2lvbiwgVUVycm9yQ29kZSAmZXJyKTsKCiAgLyoqCiAgKiBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBjb21wYXJlcyB0aGUgY2hhcmFjdGVyIGRhdGEgc3RvcmVkIGluIHR3bwogICogZGlmZmVyZW50IHN0cmluZ3MuIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBhIHN0cmluZyBpcyBsZXNzIAogICogdGhhbiwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIgc3RyaW5nLgogICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZyB0byBiZSBjb21wYXJlZCB3aXRoLgogICogQHBhcmFtIHRhcmdldCB0aGUgc3RyaW5nIHRoYXQgaXMgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGUgc291cmNlIHN0cmluZy4KICAqIEByZXR1cm4gUmV0dXJucyBhIGJ5dGUgdmFsdWUuIEdSRUFURVIgaWYgc291cmNlIGlzIGdyZWF0ZXIKICAqIHRoYW4gdGFyZ2V0OyBFUVVBTCBpZiBzb3VyY2UgaXMgZXF1YWwgdG8gdGFyZ2V0OyBMRVNTIGlmIHNvdXJjZSBpcyBsZXNzCiAgKiB0aGFuIHRhcmdldAogICogQHN0YWJsZSBJQ1UgMi4wCiAgKiovCiAgdmlydHVhbCBFQ29tcGFyaXNvblJlc3VsdCBjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHRhcmdldCkgY29uc3QgPSAwOwoKICAvKioKICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgY29tcGFyZSBidXQgbGltaXRzIHRoZSBjb21wYXJpc29uIHRvIGEgc3BlY2lmaWVkIAogICogbGVuZ3RoCiAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nIHRvIGJlIGNvbXBhcmVkIHdpdGguCiAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBzdHJpbmcgdGhhdCBpcyB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBzb3VyY2Ugc3RyaW5nLgogICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIHRoZSBjb21wYXJpc29uIGlzIGxpbWl0dGVkIHRvCiAgKiBAcmV0dXJuIFJldHVybnMgYSBieXRlIHZhbHVlLiBHUkVBVEVSIGlmIHNvdXJjZSAodXAgdG8gdGhlIHNwZWNpZmllZCAKICAqICAgICAgICAgbGVuZ3RoKSBpcyBncmVhdGVyIHRoYW4gdGFyZ2V0OyBFUVVBTCBpZiBzb3VyY2UgKHVwIHRvIHNwZWNpZmllZCAKICAqICAgICAgICAgbGVuZ3RoKSBpcyBlcXVhbCB0byB0YXJnZXQ7IExFU1MgaWYgc291cmNlICh1cCB0byB0aGUgc3BlY2lmaWVkIAogICogICAgICAgICBsZW5ndGgpIGlzIGxlc3MgIHRoYW4gdGFyZ2V0LiAgIAogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICB2aXJ0dWFsIEVDb21wYXJpc29uUmVzdWx0IGNvbXBhcmUoY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nJiB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoKSBjb25zdCA9IDA7CiAgICAKICAvKioKICAqIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGNvbXBhcmVzIHRoZSBjaGFyYWN0ZXIgZGF0YSBzdG9yZWQgaW4gdHdvCiAgKiBkaWZmZXJlbnQgc3RyaW5nIGFycmF5cy4gUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIGEgc3RyaW5nIGFycmF5IAogICogaXMgbGVzcyB0aGFuLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYW5vdGhlciBzdHJpbmcgYXJyYXkuCiAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nIGFycmF5IHRvIGJlIGNvbXBhcmVkIHdpdGguCiAgKiBAcGFyYW0gc291cmNlTGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBzdHJpbmcgYXJyYXkuICBJZiB0aGlzIHZhbHVlCiAgKiAgICAgICAgaXMgZXF1YWwgdG8gLTEsIHRoZSBzdHJpbmcgYXJyYXkgaXMgbnVsbC10ZXJtaW5hdGVkLgogICogQHBhcmFtIHRhcmdldCB0aGUgc3RyaW5nIHRoYXQgaXMgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGUgc291cmNlIHN0cmluZy4KICAqIEBwYXJhbSB0YXJnZXRMZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHN0cmluZyBhcnJheS4gIElmIHRoaXMgdmFsdWUKICAqICAgICAgICBpcyBlcXVhbCB0byAtMSwgdGhlIHN0cmluZyBhcnJheSBpcyBudWxsLXRlcm1pbmF0ZWQuCiAgKiBAcmV0dXJuIFJldHVybnMgYSBieXRlIHZhbHVlLiBHUkVBVEVSIGlmIHNvdXJjZSBpcyBncmVhdGVyIHRoYW4gdGFyZ2V0OyAKICAqICAgICAgICAgRVFVQUwgaWYgc291cmNlIGlzIGVxdWFsIHRvIHRhcmdldDsgTEVTUyBpZiBzb3VyY2UgaXMgbGVzcyB0aGFuIAogICogICAgICAgICB0YXJnZXQKICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgdmlydHVhbCBFQ29tcGFyaXNvblJlc3VsdCBjb21wYXJlKGNvbnN0IFVDaGFyKiBzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogdGFyZ2V0LCBpbnQzMl90IHRhcmdldExlbmd0aCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ID0gMDsKCiAgLyoqIAogICogVHJhbnNmb3JtcyB0aGUgc3RyaW5nIGludG8gYSBzZXJpZXMgb2YgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSBjb21wYXJlZAogICogd2l0aCBDb2xsYXRpb25LZXk6OmNvbXBhcmVUby4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsCiAgKiBzdHJpbmcgZnJvbSB0aGUgY2hhcnMgaW4gdGhlIHNvcnQga2V5LiAgVGhlIGdlbmVyYXRlZCBzb3J0IGtleSBoYW5kbGVzIAogICogb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGlnbm9yYWJsZSBjaGFyYWN0ZXJzLgogICogPHA+VXNlIENvbGxhdGlvbktleTo6ZXF1YWxzIG9yIENvbGxhdGlvbktleTo6Y29tcGFyZSB0byBjb21wYXJlIHRoZQogICogZ2VuZXJhdGVkIHNvcnQga2V5cy4KICAqIElmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG51bGwsIGEgbnVsbCBjb2xsYXRpb24ga2V5IHdpbGwgYmUgcmV0dXJuZWQuCiAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYSBzb3J0IGtleS4KICAqIEBwYXJhbSBrZXkgdGhlIGNvbGxhdGlvbiBrZXkgdG8gYmUgZmlsbGVkIGluCiAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEByZXR1cm4gdGhlIGNvbGxhdGlvbiBrZXkgb2YgdGhlIHN0cmluZyBiYXNlZCBvbiB0aGUgY29sbGF0aW9uIHJ1bGVzLgogICogQHNlZSBDb2xsYXRpb25LZXkjY29tcGFyZQogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICB2aXJ0dWFsIENvbGxhdGlvbktleSYgZ2V0Q29sbGF0aW9uS2V5KGNvbnN0IFVuaWNvZGVTdHJpbmcmICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRpb25LZXkmIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3QgPSAwOwoKICAvKiogCiAgKiBUcmFuc2Zvcm1zIHRoZSBzdHJpbmcgaW50byBhIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGNvbXBhcmVkCiAgKiB3aXRoIENvbGxhdGlvbktleTo6Y29tcGFyZVRvLiBJdCBpcyBub3QgcG9zc2libGUgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwKICAqIHN0cmluZyBmcm9tIHRoZSBjaGFycyBpbiB0aGUgc29ydCBrZXkuICBUaGUgZ2VuZXJhdGVkIHNvcnQga2V5IGhhbmRsZXMgCiAgKiBvbmx5IGEgbGltaXRlZCBudW1iZXIgb2YgaWdub3JhYmxlIGNoYXJhY3RlcnMuCiAgKiA8cD5Vc2UgQ29sbGF0aW9uS2V5OjplcXVhbHMgb3IgQ29sbGF0aW9uS2V5Ojpjb21wYXJlIHRvIGNvbXBhcmUgdGhlCiAgKiBnZW5lcmF0ZWQgc29ydCBrZXlzLgogICogPHA+SWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgbnVsbCwgYSBudWxsIGNvbGxhdGlvbiBrZXkgd2lsbCBiZSByZXR1cm5lZC4KICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBhIHNvcnQga2V5LgogICogQHBhcmFtIHNvdXJjZUxlbmd0aCBsZW5ndGggb2YgdGhlIGNvbGxhdGlvbiBrZXkKICAqIEBwYXJhbSBrZXkgdGhlIGNvbGxhdGlvbiBrZXkgdG8gYmUgZmlsbGVkIGluCiAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEByZXR1cm4gdGhlIGNvbGxhdGlvbiBrZXkgb2YgdGhlIHN0cmluZyBiYXNlZCBvbiB0aGUgY29sbGF0aW9uIHJ1bGVzLgogICogQHNlZSBDb2xsYXRpb25LZXkjY29tcGFyZQogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICB2aXJ0dWFsIENvbGxhdGlvbktleSYgZ2V0Q29sbGF0aW9uS2V5KGNvbnN0IFVDaGFyKnNvdXJjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhdGlvbktleSYga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdCA9IDA7CiAgLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIGNvbGxhdGlvbiBvYmplY3QKICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgdmlydHVhbCBpbnQzMl90IGhhc2hDb2RlKHZvaWQpIGNvbnN0ID0gMDsKCiAgLyoqCiAgKiBHZXRzIHRoZSBsb2NhbGUgb2YgdGhlIENvbGxhdG9yCiAgKgogICogQHBhcmFtIHR5cGUgY2FuIGJlIGVpdGhlciByZXF1ZXN0ZWQsIHZhbGlkIG9yIGFjdHVhbCBsb2NhbGUuIEZvciBtb3JlCiAgKiAgICAgICAgICAgICBpbmZvcm1hdGlvbiBzZWUgdGhlIGRlZmluaXRpb24gb2YgVUxvY0RhdGFMb2NhbGVUeXBlIGluCiAgKiAgICAgICAgICAgICB1bG9jLmgKICAqIEByZXR1cm4gbG9jYWxlIHdoZXJlIHRoZSBjb2xsYXRpb24gZGF0YSBsaXZlcy4gSWYgdGhlIGNvbGxhdG9yCiAgKiAgICAgICAgIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBydWxlcywgbG9jYWxlIGlzIGVtcHR5LgogICogQGRyYWZ0IElDVSAyLjEKICAqLwogIHZpcnR1YWwgY29uc3QgTG9jYWxlIGdldExvY2FsZShVTG9jRGF0YUxvY2FsZVR5cGUgdHlwZSwgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdCA9IDA7CgogIC8qKgogICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb21wYXJpbmcgdHdvIHN0cmluZ3MgYmFzZWQgb24gdGhlIGNvbGxhdGlvbiBydWxlcy4KICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcgdG8gYmUgY29tcGFyZWQgd2l0aC4KICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBzdHJpbmcgdG8gYmUgY29tcGFyZWQgd2l0aC4KICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3Qgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIG9uZSwKICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBjb2xsYXRpb24gcnVsZXMuIGZhbHNlLCBvdGhlcndpc2UuCiAgKiBAc2VlIENvbGxhdG9yI2NvbXBhcmUKICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgVUJvb2wgZ3JlYXRlcihjb25zdCBVbmljb2RlU3RyaW5nJiBzb3VyY2UsIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHRhcmdldCkgCiAgICAgICAgICAgICAgICBjb25zdDsKCiAgLyoqCiAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNvbXBhcmluZyB0d28gc3RyaW5ncyBiYXNlZCBvbiB0aGUgY29sbGF0aW9uIHJ1bGVzLgogICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZyB0byBiZSBjb21wYXJlZCB3aXRoLgogICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IHN0cmluZyB0byBiZSBjb21wYXJlZCB3aXRoLgogICogQHJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQgCiAgKiAgICAgICAgIG9uZSwgYWNjb3JkaW5nIHRvIHRoZSBjb2xsYXRpb24gcnVsZXMuIGZhbHNlLCBvdGhlcndpc2UuCiAgKiBAc2VlIENvbGxhdG9yI2NvbXBhcmUKICAqIEBzdGFibGUgSUNVIDIuMAogICovCiAgVUJvb2wgZ3JlYXRlck9yRXF1YWwoY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLCAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nJiB0YXJnZXQpIGNvbnN0OwogIC8qKgogICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb21wYXJpbmcgdHdvIHN0cmluZ3MgYmFzZWQgb24gdGhlIGNvbGxhdGlvbiBydWxlcy4KICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcgdG8gYmUgY29tcGFyZWQgd2l0aC4KICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBzdHJpbmcgdG8gYmUgY29tcGFyZWQgd2l0aC4KICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5ncyBhcmUgZXF1YWwgYWNjb3JkaW5nIHRvIHRoZSBjb2xsYXRpb24gcnVsZXMuICAKICAqICAgICAgICAgZmFsc2UsIG90aGVyd2lzZS4KICAqIEBzZWUgQ29sbGF0b3IjY29tcGFyZQogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICBVQm9vbCBlcXVhbHMoY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLCBjb25zdCBVbmljb2RlU3RyaW5nJiB0YXJnZXQpIGNvbnN0OwogICAgICAgIAogIC8qKgogICogRGV0ZXJtaW5lcyB0aGUgbWluaW11bSBzdHJlbmd0aCB0aGF0IHdpbGwgYmUgdXNlIGluIGNvbXBhcmlzb24gb3IKICAqIHRyYW5zZm9ybWF0aW9uLgogICogPHA+RS5nLiB3aXRoIHN0cmVuZ3RoID09IFNFQ09OREFSWSwgdGhlIHRlcnRpYXJ5IGRpZmZlcmVuY2UgaXMgaWdub3JlZAogICogPHA+RS5nLiB3aXRoIHN0cmVuZ3RoID09IFBSSU1BUlksIHRoZSBzZWNvbmRhcnkgYW5kIHRlcnRpYXJ5IGRpZmZlcmVuY2UKICAqIGFyZSBpZ25vcmVkLgogICogQHJldHVybiB0aGUgY3VycmVudCBjb21wYXJpc29uIGxldmVsLgogICogQHNlZSBDb2xsYXRvciNzZXRTdHJlbmd0aAogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICB2aXJ0dWFsIEVDb2xsYXRpb25TdHJlbmd0aCBnZXRTdHJlbmd0aCh2b2lkKSBjb25zdCA9IDA7CiAgCiAgLyoqCiAgKiBTZXRzIHRoZSBtaW5pbXVtIHN0cmVuZ3RoIHRvIGJlIHVzZWQgaW4gY29tcGFyaXNvbiBvciB0cmFuc2Zvcm1hdGlvbi4KICAqIDxwPkV4YW1wbGUgb2YgdXNlOgogICogPHByZT4KICAqICBcY29kZQogICogIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICogIENvbGxhdG9yKm15Q29sbGF0aW9uID0gQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKExvY2FsZTo6VVMsIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwogICogIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuOwogICogIG15Q29sbGF0aW9uLT5zZXRTdHJlbmd0aChDb2xsYXRvcjo6UFJJTUFSWSk7CiAgKiAgLy8gcmVzdWx0IHdpbGwgYmUgImFiYyIgPT0gIkFCQyIKICAqICAvLyB0ZXJ0aWFyeSBkaWZmZXJlbmNlcyB3aWxsIGJlIGlnbm9yZWQKICAqICBDb2xsYXRvcjo6Q29tcGFyaXNvblJlc3VsdCByZXN1bHQgPSBteUNvbGxhdGlvbi0+Y29tcGFyZSgiYWJjIiwgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQyIpOwogICogXGVuZGNvZGUgCiAgKiA8L3ByZT4KICAqIEBzZWUgQ29sbGF0b3IjZ2V0U3RyZW5ndGgKICAqIEBwYXJhbSBuZXdTdHJlbmd0aCB0aGUgbmV3IGNvbXBhcmlzb24gbGV2ZWwuCiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIHZpcnR1YWwgdm9pZCBzZXRTdHJlbmd0aChFQ29sbGF0aW9uU3RyZW5ndGggbmV3U3RyZW5ndGgpID0gMDsKCiAgLyoqCiAgKiBHZXQgbmFtZSBvZiB0aGUgb2JqZWN0IGZvciB0aGUgZGVzaXJlZCBMb2NhbGUsIGluIHRoZSBkZXNpcmVkIGxhbmdhdWdlCiAgKiBAcGFyYW0gb2JqZWN0TG9jYWxlIG11c3QgYmUgZnJvbSBnZXRBdmFpbGFibGVMb2NhbGVzCiAgKiBAcGFyYW0gZGlzcGxheUxvY2FsZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgbG9jYWxlIGZvciBvdXRwdXQKICAqIEBwYXJhbSBuYW1lIHRoZSBmaWxsLWluIHBhcmFtZXRlciBvZiB0aGUgcmV0dXJuIHZhbHVlCiAgKiBAcmV0dXJuIGRpc3BsYXktYWJsZSBuYW1lIG9mIHRoZSBvYmplY3QgZm9yIHRoZSBvYmplY3QgbG9jYWxlIGluIHRoZQogICogICAgICAgICBkZXNpcmVkIGxhbmd1YWdlCiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIHN0YXRpYyBVbmljb2RlU3RyaW5nJiBnZXREaXNwbGF5TmFtZShjb25zdCBMb2NhbGUmIG9iamVjdExvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYWxlJiBkaXNwbGF5TG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiBuYW1lKTsKICAvKioKICAqIEdldCBuYW1lIG9mIHRoZSBvYmplY3QgZm9yIHRoZSBkZXNpcmVkIExvY2FsZSwgaW4gdGhlIGxhbmdhdWdlIG9mIHRoZQogICogZGVmYXVsdCBsb2NhbGUuCiAgKiBAcGFyYW0gb2JqZWN0TG9jYWxlIG11c3QgYmUgZnJvbSBnZXRBdmFpbGFibGVMb2NhbGVzCiAgKiBAcGFyYW0gbmFtZSB0aGUgZmlsbC1pbiBwYXJhbWV0ZXIgb2YgdGhlIHJldHVybiB2YWx1ZQogICogQHJldHVybiBuYW1lIG9mIHRoZSBvYmplY3QgZm9yIHRoZSBkZXNpcmVkIGxvY2FsZSBpbiB0aGUgZGVmYXVsdCBsYW5ndWFnZQogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICBzdGF0aWMgVW5pY29kZVN0cmluZyYgZ2V0RGlzcGxheU5hbWUoY29uc3QgTG9jYWxlJiBvYmplY3RMb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmIG5hbWUpOwoKICAvKioKICAqIEdldCB0aGUgc2V0IG9mIExvY2FsZXMgZm9yIHdoaWNoIENvbGxhdGlvbnMgYXJlIGluc3RhbGxlZAogICogQHBhcmFtIGNvdW50IHRoZSBvdXRwdXQgcGFyYW1ldGVyIG9mIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbG9jYWxlIGxpc3QKICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2FsZXMgd2hpY2ggY29sbGF0aW9ucyBhcmUgaW5zdGFsbGVkCiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIHN0YXRpYyBjb25zdCBMb2NhbGUqIGdldEF2YWlsYWJsZUxvY2FsZXMoaW50MzJfdCYgY291bnQpOwoKICAvKioKICAqIEdldHMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGEgQ29sbGF0b3IuIAogICogQHBhcmFtIGluZm8gdGhlIHZlcnNpb24gIyBpbmZvcm1hdGlvbiwgdGhlIHJlc3VsdCB3aWxsIGJlIGZpbGxlZCBpbgogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICB2aXJ0dWFsIHZvaWQgZ2V0VmVyc2lvbihVVmVyc2lvbkluZm8gaW5mbykgY29uc3QgPSAwOwoKICAvKioKICAqIFJldHVybnMgYSB1bmlxdWUgY2xhc3MgSUQgUE9MWU1PUlBISUNBTExZLiBQdXJlIHZpcnR1YWwgbWV0aG9kLgogICogVGhpcyBtZXRob2QgaXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIHZlcnNpb24gb2YgUlRUSSwgc2luY2Ugbm90IGFsbCBDKysgCiAgKiBjb21waWxlcnMgc3VwcG9ydCBnZW51aW5lIFJUVEkuIFBvbHltb3JwaGljIG9wZXJhdG9yPT0oKSBhbmQgY2xvbmUoKSAKICAqIG1ldGhvZHMgY2FsbCB0aGlzIG1ldGhvZC4KICAqIENvbmNyZXRlIHN1YmNsYXNzZXMgb2YgRm9ybWF0IG11c3QgaW1wbGVtZW50IGdldER5bmFtaWNDbGFzc0lEKCkgYW5kIGFsc28gCiAgKiBhIHN0YXRpYyBtZXRob2QgYW5kIGRhdGEgbWVtYmVyOgogICogICBzdGF0aWMgVUNsYXNzSUQgZ2V0U3RhdGljQ2xhc3NJRCgpIAogICogICB7IAogICogICAgICByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IAogICogICB9CiAgKiAgIHN0YXRpYyBjaGFyIGZnQ2xhc3NJRDsKICAqIEByZXR1cm4gVGhlIGNsYXNzIElEIGZvciB0aGlzIG9iamVjdC4gQWxsIG9iamVjdHMgb2YgYSBnaXZlbiBjbGFzcyBoYXZlIAogICogICAgICAgICB0aGUgc2FtZSBjbGFzcyBJRC4gIE9iamVjdHMgb2Ygb3RoZXIgY2xhc3NlcyBoYXZlIGRpZmZlcmVudCBjbGFzcyAKICAqICAgICAgICAgSURzLgogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICB2aXJ0dWFsIFVDbGFzc0lEIGdldER5bmFtaWNDbGFzc0lEKHZvaWQpIGNvbnN0ID0gMDsKCiAgLyoqCiAgKiBVbml2ZXJzYWwgYXR0cmlidXRlIHNldHRlcgogICogQHBhcmFtIGF0dHIgYXR0cmlidXRlIHR5cGUgCiAgKiBAcGFyYW0gdmFsdWUgYXR0cmlidXRlIHZhbHVlCiAgKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIAogICogICAgICAgIHRoZXJlIHdlcmUgZXJyb3JzCiAgKiBAc3RhYmxlIElDVSAyLjIKICAqLwogIHZpcnR1YWwgdm9pZCBzZXRBdHRyaWJ1dGUoVUNvbEF0dHJpYnV0ZSBhdHRyLCBVQ29sQXR0cmlidXRlVmFsdWUgdmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKSA9IDA7CgogIC8qKgogICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBnZXR0ZXIKICAqIEBwYXJhbSBhdHRyIGF0dHJpYnV0ZSB0eXBlCiAgKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIAogICogICAgICAgIHRoZXJlIHdlcmUgZXJyb3JzCiAgKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZQogICogQHN0YWJsZSBJQ1UgMi4yCiAgKi8KICB2aXJ0dWFsIFVDb2xBdHRyaWJ1dGVWYWx1ZSBnZXRBdHRyaWJ1dGUoVUNvbEF0dHJpYnV0ZSBhdHRyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKSA9IDA7CgogIC8qKiAKICAgKiBTZXRzIHRoZSB2YXJpYWJsZSB0b3AgdG8gYSBjb2xsYXRpb24gZWxlbWVudCB2YWx1ZSBvZiBhIHN0cmluZyBzdXBwbGllZC4gCiAgICogQHBhcmFtIHZhclRvcCBvbmUgb3IgbW9yZSAoaWYgY29udHJhY3Rpb24pIFVDaGFycyB0byB3aGljaCB0aGUgdmFyaWFibGUgdG9wIHNob3VsZCBiZSBzZXQKICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2YXJpYWJsZSB0b3Agc3RyaW5nLiBJZiAtMSBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIHplcm8gdGVybWluYXRlZC4KICAgKiBAcGFyYW0gc3RhdHVzIGVycm9yIGNvZGUuIElmIGVycm9yIGNvZGUgaXMgc2V0LCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4gRXJyb3JzIHNldCBieSB0aGlzIGZ1bmN0aW9uIGFyZTogPGJyPgogICAqICAgIFVfQ0VfTk9UX0ZPVU5EX0VSUk9SIGlmIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHdhcyBwYXNzZWQgYW5kIHRoZXJlIGlzIG5vIHN1Y2ggYSBjb250cmFjdGlvbjxicj4KICAgKiAgICBVX1BSSU1BUllfVE9PX0xPTkdfRVJST1IgaWYgdGhlIHByaW1hcnkgZm9yIHRoZSB2YXJpYWJsZSB0b3AgaGFzIG1vcmUgdGhhbiB0d28gYnl0ZXMKICAgKiBAcmV0dXJuIGEgMzIgYml0IHZhbHVlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0b3AgaW4gdXBwZXIgMTYgYml0cy4gTG93ZXIgMTYgYml0cyBhcmUgdW5kZWZpbmVkCiAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICovCiAgdmlydHVhbCB1aW50MzJfdCBzZXRWYXJpYWJsZVRvcChjb25zdCBVQ2hhciAqdmFyVG9wLCBpbnQzMl90IGxlbiwgVUVycm9yQ29kZSAmc3RhdHVzKSA9IDA7CgogIC8qKiAKICAgKiBTZXRzIHRoZSB2YXJpYWJsZSB0b3AgdG8gYSBjb2xsYXRpb24gZWxlbWVudCB2YWx1ZSBvZiBhIHN0cmluZyBzdXBwbGllZC4gCiAgICogQHBhcmFtIHZhclRvcCBhbiBVbmljb2RlU3RyaW5nIHNpemUgMSBvciBtb3JlIChpZiBjb250cmFjdGlvbikgb2YgVUNoYXJzIHRvIHdoaWNoIHRoZSB2YXJpYWJsZSB0b3Agc2hvdWxkIGJlIHNldAogICAqIEBwYXJhbSBzdGF0dXMgZXJyb3IgY29kZS4gSWYgZXJyb3IgY29kZSBpcyBzZXQsIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLiBFcnJvcnMgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gYXJlOiA8YnI+CiAgICogICAgVV9DRV9OT1RfRk9VTkRfRVJST1IgaWYgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgd2FzIHBhc3NlZCBhbmQgdGhlcmUgaXMgbm8gc3VjaCBhIGNvbnRyYWN0aW9uPGJyPgogICAqICAgIFVfUFJJTUFSWV9UT09fTE9OR19FUlJPUiBpZiB0aGUgcHJpbWFyeSBmb3IgdGhlIHZhcmlhYmxlIHRvcCBoYXMgbW9yZSB0aGFuIHR3byBieXRlcwogICAqIEByZXR1cm4gYSAzMiBiaXQgdmFsdWUgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvcCBpbiB1cHBlciAxNiBiaXRzLiBMb3dlciAxNiBiaXRzIGFyZSB1bmRlZmluZWQKICAgKiBAc3RhYmxlIElDVSAyLjAKICAgKi8KICB2aXJ0dWFsIHVpbnQzMl90IHNldFZhcmlhYmxlVG9wKGNvbnN0IFVuaWNvZGVTdHJpbmcgdmFyVG9wLCBVRXJyb3JDb2RlICZzdGF0dXMpID0gMDsKCiAgLyoqIAogICAqIFNldHMgdGhlIHZhcmlhYmxlIHRvcCB0byBhIGNvbGxhdGlvbiBlbGVtZW50IHZhbHVlIHN1cHBsaWVkLiBWYXJpYWJsZSB0b3AgaXMgc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzLiAKICAgKiBMb3dlciAxNiBiaXRzIGFyZSBpZ25vcmVkLgogICAqIEBwYXJhbSB2YXJUb3AgQ0UgdmFsdWUsIGFzIHJldHVybmVkIGJ5IHNldFZhcmlhYmxlVG9wIG9yIHVjb2wpZ2V0VmFyaWFibGVUb3AKICAgKiBAcGFyYW0gc3RhdHVzIGVycm9yIGNvZGUgKG5vdCBjaGFuZ2VkIGJ5IGZ1bmN0aW9uKQogICAqIEBzdGFibGUgSUNVIDIuMAogICAqLwogIHZpcnR1YWwgdm9pZCBzZXRWYXJpYWJsZVRvcChjb25zdCB1aW50MzJfdCB2YXJUb3AsIFVFcnJvckNvZGUgJnN0YXR1cykgPSAwOwoKICAvKiogCiAgICogR2V0cyB0aGUgdmFyaWFibGUgdG9wIHZhbHVlIG9mIGEgQ29sbGF0b3IuIAogICAqIExvd2VyIDE2IGJpdHMgYXJlIHVuZGVmaW5lZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCiAgICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlIChub3QgY2hhbmdlZCBieSBmdW5jdGlvbikuIElmIGVycm9yIGNvZGUgaXMgc2V0LCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4KICAgKiBAc3RhYmxlIElDVSAyLjAKICAgKi8KICB2aXJ0dWFsIHVpbnQzMl90IGdldFZhcmlhYmxlVG9wKFVFcnJvckNvZGUgJnN0YXR1cykgY29uc3QgPSAwOwoKICAvKioKICAgKiBHZXQgYW4gVW5pY29kZVNldCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgY2hhcmFjdGVycyBhbmQgc2VxdWVuY2VzIAogICAqIHRhaWxvcmVkIGluIHRoaXMgY29sbGF0b3IuCiAgICogQHBhcmFtIHN0YXR1cyAgICAgIGVycm9yIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgogICAqIEByZXR1cm4gYSBwb2ludGVyIHRvIGEgVW5pY29kZVNldCBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIAogICAqICAgICAgICAgY29kZSBwb2ludHMgYW5kIHNlcXVlbmNlcyB0aGF0IG1heSBzb3J0IGRpZmZlcmVudGx5IHRoYW4KICAgKiAgICAgICAgIGluIHRoZSBVQ0EuIFRoZSBvYmplY3QgbXVzdCBiZSBkaXNwb3NlZCBvZiBieSB1c2luZyBkZWxldGUKICAgKiBAZHJhZnQgSUNVIDIuNAogICAqLwogIHZpcnR1YWwgVW5pY29kZVNldCAqZ2V0VGFpbG9yZWRTZXQoVUVycm9yQ29kZSAmc3RhdHVzKSBjb25zdDsKCgogIC8qKgogICogVGhyZWFkIHNhZmUgY2xvbmluZyBvcGVyYXRpb24KICAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3IGNsb25lLCB1c2VyIHNob3VsZCByZW1vdmUgaXQuCiAgKiBAc3RhYmxlIElDVSAyLjIKICAqLwogIHZpcnR1YWwgQ29sbGF0b3IqIHNhZmVDbG9uZSh2b2lkKSA9IDA7CgogIC8qKgogICogR2V0IHRoZSBzb3J0IGtleSBhcyBhbiBhcnJheSBvZiBieXRlcyBmcm9tIGFuIFVuaWNvZGVTdHJpbmcuCiAgKiBTb3J0IGtleSBieXRlIGFycmF5cyBhcmUgemVyby10ZXJtaW5hdGVkIGFuZCBjYW4gYmUgY29tcGFyZWQgdXNpbmcgCiAgKiBzdHJjbXAoKS4KICAqIEBwYXJhbSBzb3VyY2Ugc3RyaW5nIHRvIGJlIHByb2Nlc3NlZC4KICAqIEBwYXJhbSByZXN1bHQgYnVmZmVyIHRvIHN0b3JlIHJlc3VsdCBpbi4gSWYgTlVMTCwgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCAKICAqICAgICAgICB3aWxsIGJlIHJldHVybmVkLgogICogQHBhcmFtIHJlc3VsdExlbmd0aCBsZW5ndGggb2YgdGhlIHJlc3VsdCBidWZmZXIuIElmIGlmIG5vdCBlbm91Z2ggdGhlIAogICogICAgICAgIGJ1ZmZlciB3aWxsIGJlIGZpbGxlZCB0byBjYXBhY2l0eS4gCiAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIHN0b3JpbmcgdGhlIHNvcnQga2V5CiAgKiBAc3RhYmxlIElDVSAyLjIKICAqLwogIHZpcnR1YWwgaW50MzJfdCBnZXRTb3J0S2V5KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0TGVuZ3RoKSBjb25zdCA9IDA7CgogIC8qKgogICogR2V0IHRoZSBzb3J0IGtleSBhcyBhbiBhcnJheSBvZiBieXRlcyBmcm9tIGFuIFVDaGFyIGJ1ZmZlci4KICAqIFNvcnQga2V5IGJ5dGUgYXJyYXlzIGFyZSB6ZXJvLXRlcm1pbmF0ZWQgYW5kIGNhbiBiZSBjb21wYXJlZCB1c2luZyAKICAqIHN0cmNtcCgpLgogICogQHBhcmFtIHNvdXJjZSBzdHJpbmcgdG8gYmUgcHJvY2Vzc2VkLgogICogQHBhcmFtIHNvdXJjZUxlbmd0aCBsZW5ndGggb2Ygc3RyaW5nIHRvIGJlIHByb2Nlc3NlZC4gCiAgKiAgICAgICAgSWYgLTEsIHRoZSBzdHJpbmcgaXMgMCB0ZXJtaW5hdGVkIGFuZCBsZW5ndGggd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSAKICAqICAgICAgICBmdW5jdGlvbi4KICAqIEBwYXJhbSByZXN1bHQgYnVmZmVyIHRvIHN0b3JlIHJlc3VsdCBpbi4gSWYgTlVMTCwgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCAKICAqICAgICAgICB3aWxsIGJlIHJldHVybmVkLgogICogQHBhcmFtIHJlc3VsdExlbmd0aCBsZW5ndGggb2YgdGhlIHJlc3VsdCBidWZmZXIuIElmIGlmIG5vdCBlbm91Z2ggdGhlIAogICogICAgICAgIGJ1ZmZlciB3aWxsIGJlIGZpbGxlZCB0byBjYXBhY2l0eS4gCiAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIHN0b3JpbmcgdGhlIHNvcnQga2V5CiAgKiBAc3RhYmxlIElDVSAyLjIKICAqLwogIHZpcnR1YWwgaW50MzJfdCBnZXRTb3J0S2V5KGNvbnN0IFVDaGFyKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCpyZXN1bHQsIGludDMyX3QgcmVzdWx0TGVuZ3RoKSBjb25zdCA9IDA7CgojaWZkZWYgSUNVX05PUk1BTElaRVJfVVNFX0RFUFJFQ0FURVMKICAvLyBzdGFydCBvYnNvbGV0ZSBBUElzCiAgLyoqCiAgKiBHZXQgdGhlIGRlY29tcG9zaXRpb24gbW9kZSBvZiB0aGUgQ29sbGF0b3Igb2JqZWN0LgogICogQHJldHVybiB0aGUgZGVjb21wb3NpdGlvbiBtb2RlCiAgKiBAc2VlIENvbGxhdG9yI3NldERlY29tcG9zaXRpb24KICAqIEBvYnNvbGV0ZSBJQ1UgMi40IFVzZSBnZXRBdHRyaWJ1dGUoKSBpbnN0ZWFkIHNpbmNlIHRoaXMgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGF0IHJlbGVhc2UuCiAgKi8KICB2aXJ0dWFsIE5vcm1hbGl6ZXI6OkVNb2RlIGdldERlY29tcG9zaXRpb24odm9pZCkgY29uc3QgPSAwOwoKICAvKioKICAqIFNldCB0aGUgZGVjb21wb3NpdGlvbiBtb2RlIG9mIHRoZSBDb2xsYXRvciBvYmplY3QuIHN1Y2Nlc3MgaXMgZXF1YWwgdG8gCiAgKiBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IgaWYgZXJyb3Igb2NjdXJzLgogICogQHBhcmFtIHRoZSBuZXcgZGVjb21wb3NpdGlvbiBtb2RlCiAgKiBAc2VlIENvbGxhdG9yI2dldERlY29tcG9zaXRpb24KICAqIEBvYnNvbGV0ZSBJQ1UgMi40IFVzZSBzZXRBdHRyaWJ1dGUoKSBpbnN0ZWFkIHNpbmNlIHRoaXMgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGF0IHJlbGVhc2UuCiAgKi8KICB2aXJ0dWFsIHZvaWQgc2V0RGVjb21wb3NpdGlvbihOb3JtYWxpemVyOjpFTW9kZSAgbW9kZSkgPSAwOwojZW5kaWYgLyogSUNVX05PUk1BTElaRVJfVVNFX0RFUFJFQ0FURVMgKi8KCgogICAgLyoqCiAgICAgKiBQcm9kdWNlIGEgYm91bmQgZm9yIGEgZ2l2ZW4gc29ydGtleSBhbmQgYSBudW1iZXIgb2YgbGV2ZWxzLgogICAgICogUmV0dXJuIHZhbHVlIGlzIGFsd2F5cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgcmVnYXJkbGVzcyBvZiAKICAgICAqIHdoZXRoZXIgdGhlIHJlc3VsdCBidWZmZXIgd2FzIGJpZyBlbm91Z2ggb3IgZXZlbiB2YWxpZC48YnI+CiAgICAgKiBSZXN1bHRpbmcgYm91bmRzIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UgYSByYW5nZSBvZiBzdHJpbmdzIHRoYXQgYXJlCiAgICAgKiBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBib3VuZHMuIEZvciBleGFtcGxlLCBpZiBib3VuZHMgYXJlIHByb2R1Y2VkCiAgICAgKiBmb3IgYSBzb3J0a2V5IG9mIHN0cmluZyAic21pdGgiLCBzdHJpbmdzIGJldHdlZW4gdXBwZXIgYW5kIGxvd2VyIAogICAgICogYm91bmRzIHdpdGggb25lIGxldmVsIHdvdWxkIGluY2x1ZGUgIlNtaXRoIiwgIlNNSVRIIiwgInNNaVRoIi48YnI+CiAgICAgKiBUaGVyZSBhcmUgdHdvIHVwcGVyIGJvdW5kcyB0aGF0IGNhbiBiZSBwcm9kdWNlZC4gSWYgVUNPTF9CT1VORF9VUFBFUgogICAgICogaXMgcHJvZHVjZWQsIHN0cmluZ3MgbWF0Y2hlZCB3b3VsZCBiZSBhcyBhYm92ZS4gSG93ZXZlciwgaWYgYm91bmQKICAgICAqIHByb2R1Y2VkIHVzaW5nIFVDT0xfQk9VTkRfVVBQRVJfTE9ORyBpcyB1c2VkLCB0aGUgYWJvdmUgZXhhbXBsZSB3aWxsCiAgICAgKiBhbHNvIG1hdGNoICJTbWl0aHNvbmlhbiIgYW5kIHNpbWlsYXIuPGJyPgogICAgICogRm9yIG1vcmUgb24gdXNhZ2UsIHNlZSBleGFtcGxlIGluIGNpbnRsdHN0L2NhcGl0c3QuYyBpbiBwcm9jZWR1cmUKICAgICAqIFRlc3RCb3VuZHMuCiAgICAgKiBTb3J0IGtleXMgbWF5IGJlIGNvbXBhcmVkIHVzaW5nIDxUVD5zdHJjbXA8L1RUPi4KICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzb3J0a2V5LgogICAgICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLiAKICAgICAqICAgICAgICAgICAgICAgICAgICAgKElmIGFuIHVubW9kaWZpZWQgc29ydGtleSBpcyBwYXNzZWQsIGl0IGlzIGFsd2F5cyBudWxsIAogICAgICogICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCkuCiAgICAgKiBAcGFyYW0gYm91bmRUeXBlIFR5cGUgb2YgYm91bmQgcmVxdWlyZWQuIEl0IGNhbiBiZSBVQ09MX0JPVU5EX0xPV0VSLCB3aGljaCAKICAgICAqICAgICAgICAgICAgICAgICAgcHJvZHVjZXMgYSBsb3dlciBpbmNsdXNpdmUgYm91bmQsIFVDT0xfQk9VTkRfVVBQRVIsIHRoYXQgCiAgICAgKiAgICAgICAgICAgICAgICAgIHByb2R1Y2VzIHVwcGVyIGJvdW5kIHRoYXQgbWF0Y2hlcyBzdHJpbmdzIG9mIHRoZSBzYW1lIGxlbmd0aCAKICAgICAqICAgICAgICAgICAgICAgICAgb3IgVUNPTF9CT1VORF9VUFBFUl9MT05HIHRoYXQgbWF0Y2hlcyBzdHJpbmdzIHRoYXQgaGF2ZSB0aGUgCiAgICAgKiAgICAgICAgICAgICAgICAgIHNhbWUgc3RhcnRpbmcgc3Vic3RyaW5nIGFzIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICogQHBhcmFtIG5vT2ZMZXZlbHMgIE51bWJlciBvZiBsZXZlbHMgcmVxdWlyZWQgaW4gdGhlIHJlc3VsdGluZyBib3VuZCAoZm9yIG1vc3QgCiAgICAgKiAgICAgICAgICAgICAgICAgICAgdXNlcywgdGhlIHJlY29tbWVuZGVkIHZhbHVlIGlzIDEpLiBTZWUgdXNlcnMgZ3VpZGUgZm9yIAogICAgICogICAgICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uIG9uIG51bWJlciBvZiBsZXZlbHMgYSBzb3J0a2V5IGNhbiBoYXZlLgogICAgICogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVzdWx0aW5nIHNvcnRrZXkuCiAgICAgKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgogICAgICogQHBhcmFtIHN0YXR1cyBVc2VkIGZvciByZXR1cm5pbmcgZXJyb3IgY29kZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4gSWYgdGhlIAogICAgICogICAgICAgICAgICAgICBudW1iZXIgb2YgbGV2ZWxzIHJlcXVlc3RlZCBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGxldmVscwogICAgICogICAgICAgICAgICAgICBpbiB0aGUgc291cmNlIGtleSwgYSB3YXJuaW5nIChVX1NPUlRfS0VZX1RPT19TSE9SVF9XQVJOSU5HKSBpcyAKICAgICAqICAgICAgICAgICAgICAgaXNzdWVkLgogICAgICogQHJldHVybiBUaGUgc2l6ZSBuZWVkZWQgdG8gZnVsbHkgc3RvcmUgdGhlIGJvdW5kLiAKICAgICAqIEBzZWUgdWNvbF9rZXlIYXNoQ29kZQogICAgICogQGRyYWZ0IElDVSAyLjEKICAgICAqLwogICAgc3RhdGljIGludDMyX3QgZ2V0Qm91bmQoY29uc3QgdWludDhfdCAgICAgICAqc291cmNlLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNvdXJjZUxlbmd0aCwKICAgICAgICAgICAgVUNvbEJvdW5kTW9kZSAgICAgICBib3VuZFR5cGUsCiAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbm9PZkxldmVscywKICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAqcmVzdWx0LAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgICAmc3RhdHVzKTsKCgpwcm90ZWN0ZWQ6CgogIC8vIENvbGxhdG9yIHByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAqIERlZmF1bHQgY29uc3RydWN0b3IuCiAgKiBDb25zdHJ1Y3RvciBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGRlZmF1bHQgQ29sbGF0b3IgY29uc3RydWN0b3IuCiAgKiBUaGUgdGFzayBmb3IgZGV0ZXJtaW5nIHRoZSBkZWZhdWx0IGNvbGxhdGlvbiBzdHJlbmd0aCBhbmQgbm9ybWFsaXphdGlvbiAKICAqIG1vZGUgaXMgbGVmdCB0byB0aGUgY2hpbGQgY2xhc3MuCiAgKiBAc3RhYmxlIElDVSAyLjAKICAqLwogIENvbGxhdG9yKCk7CgogIC8qKgogICogQ29uc3RydWN0b3IuCiAgKiBFbXB0eSBjb25zdHJ1Y3RvciwgZG9lcyBub3QgaGFuZGxlIHRoZSBhcmd1bWVudHMuCiAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGRvbmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAxLjcgYW5kIDEuOC4KICAqIFRoZSB0YXNrIGZvciBoYW5kbGluZyB0aGUgYXJndW1lbnQgY29sbGF0aW9uIHN0cmVuZ3RoIGFuZCBub3JtYWxpemF0aW9uIAogICogbW9kZSBpcyBsZWZ0IHRvIHRoZSBjaGlsZCBjbGFzcy4KICAqIEBwYXJhbSBjb2xsYXRpb25TdHJlbmd0aCBjb2xsYXRpb24gc3RyZW5ndGgKICAqIEBwYXJhbSBkZWNvbXBvc2l0aW9uTW9kZSAKICAqIEBkZXByZWNhdGVkIElDVSAyLjQuIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICogaW5zdGVhZCBhbmQgaGFuZGxlIHRoZSBzdHJlbmd0aCBhbmQgbm9ybWFsaXphdGlvbiBtb2RlIHRoZW1zZWx2ZXMuCiAgKi8KICBDb2xsYXRvcihVQ29sbGF0aW9uU3RyZW5ndGggY29sbGF0aW9uU3RyZW5ndGgsIAogICAgICAgICAgIFVOb3JtYWxpemF0aW9uTW9kZSBkZWNvbXBvc2l0aW9uTW9kZSk7CiAgCiAgLyoqCiAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICogQHBhcmFtIG90aGVyIENvbGxhdG9yIG9iamVjdCB0byBiZSBjb3BpZWQgZnJvbQogICogQHN0YWJsZSBJQ1UgMi4wCiAgKi8KICBDb2xsYXRvcihjb25zdCBDb2xsYXRvciYgb3RoZXIpOwogIAogIC8vIENvbGxhdG9yIHByb3RlY3RlZCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpwcml2YXRlOgogIC8qKgogICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuIFByaXZhdGUgZm9yIG5vdy4KICAgKiBAaW50ZXJuYWwKICAgKi8KICBDb2xsYXRvciYgb3BlcmF0b3I9KGNvbnN0IENvbGxhdG9yJiBvdGhlcik7CgoKIAogIC8vIENvbGxhdG9yIHByaXZhdGUgZGF0YSBtZW1iZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKgogIHN5bndlZSA6IHJlbW92ZWQgYXMgYXR0cmlidXRlcyB0byBiZSBoYW5kbGVkIGJ5IGNoaWxkIGNsYXNzCiAgVUNvbGxhdGlvblN0cmVuZ3RoICBzdHJlbmd0aDsKICBOb3JtYWxpemVyOjpFTW9kZSAgZGVjbXA7CiAgKi8KICAgIC8qIFRoaXMgaXMgdXNlbGVzcyBpbmZvcm1hdGlvbiAqLwovKiAgc3RhdGljIGNvbnN0IFVWZXJzaW9uSW5mbyBmVmVyc2lvbjsqLwp9OwoKLy8gQ29sbGF0b3IgaW5saW5lIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlubGluZSBVQm9vbCBDb2xsYXRvcjo6b3BlcmF0b3I9PShjb25zdCBDb2xsYXRvciYgb3RoZXIpIGNvbnN0CnsKICByZXR1cm4gKFVCb29sKSh0aGlzID09ICZvdGhlcik7Cn0KCmlubGluZSBVQm9vbCBDb2xsYXRvcjo6b3BlcmF0b3IhPShjb25zdCBDb2xsYXRvciYgb3RoZXIpIGNvbnN0CnsKICByZXR1cm4gKFVCb29sKSEoKnRoaXMgPT0gb3RoZXIpOwp9CgppbmxpbmUgVW5pY29kZVNldCAqQ29sbGF0b3I6OmdldFRhaWxvcmVkU2V0KFVFcnJvckNvZGUgJnN0YXR1cykgY29uc3QKewogIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgLy8gZXZlcnl0aGluZyBjYW4gYmUgY2hhbmdlZAogIHJldHVybiBuZXcgVW5pY29kZVNldCgwLCAweDEwRkZGRik7Cn0KCi8qCnN5bndlZSA6IHJlbW92ZWQgc2luY2UgdGhlcmUncyBubyBhdHRyaWJ1dGUgdG8gYmUgcmV0cmlldmVkIGhlcmUKaW5saW5lIFVDb2xsYXRpb25TdHJlbmd0aCBDb2xsYXRvcjo6Z2V0U3RyZW5ndGgoKSBjb25zdAp7CiAgcmV0dXJuIHN0cmVuZ3RoOwp9CgppbmxpbmUgTm9ybWFsaXplcjo6RU1vZGUgQ29sbGF0b3I6OmdldERlY29tcG9zaXRpb24oKSBjb25zdAp7CiAgcmV0dXJuIGRlY21wOwp9CiovClVfTkFNRVNQQUNFX0VORAoKI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04gKi8KCiNlbmRpZgo=