LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCCpIDIwMDAtMjAwOCBBbGFjcml0ZWNoLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiAkSWQ6IHN4Z2RiZy5oLHYgMS4xIDIwMDgvMDYvMjcgMTI6NDk6MjggbW9vayBFeHAgJAogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwogKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFMQUNSSVRFQ0gsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBTEFDUklURUNILCBJTkMuIE9SCiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICoKICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uCiAqIGFyZSB0aG9zZSBvZiB0aGUgYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcKICogb2ZmaWNpYWwgcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgb2YgQWxhY3JpdGVjaCwgSW5jLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGSUxFTkFNRTogc3hnZGJnLmgKICoKICogQWxsIGRlYnVnIGFuZCBhc3NlcnRpb24tYmFzZWQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBhcmUgaW5jbHVkZWQKICogaW4gdGhpcyBmaWxlIGZvciB0aGUgU1hHT1NTIGRyaXZlci4KICovCiNpZm5kZWYgX1NYR19ERUJVR19IXwojZGVmaW5lIF9TWEdfREVCVUdfSF8KCiNkZWZpbmUgQVRLREJHICAxCiNkZWZpbmUgQVRLX1RSQUNFX0VOQUJMRUQgMAoKI2RlZmluZSBEQkdfRVJST1IobiwgYXJncy4uLikJcHJpbnRrKEtFUk5fV0FSTklORyBuLCAjI2FyZ3MpCgojaWZkZWYgQVNTRVJUCiN1bmRlZiBBU1NFUlQKI2VuZGlmCgojZGVmaW5lIFNYR19BU1NFUlRfRU5BQkxFRAojaWZkZWYgU1hHX0FTU0VSVF9FTkFCTEVECiNpZm5kZWYgQVNTRVJUCiNkZWZpbmUgQVNTRVJUKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmICghKGEpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIERCR19FUlJPUigiQVNTRVJUKCkgRmFpbHVyZTogZmlsZSAlcywgZnVuY3Rpb24gJXMgIGxpbmUgJWRcbiIsIFwKICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9CiNlbmRpZgojZWxzZQojaWZuZGVmIEFTU0VSVAojZGVmaW5lIEFTU0VSVChhKQojZW5kaWYKI2VuZGlmIC8qIFNYR19BU1NFUlRfRU5BQkxFRCAgKi8KCgojaWZkZWYgQVRLREJHCi8qCiAqICBHbG9iYWwgZm9yIHRpbWVyIGdyYW51bGFyaXR5OyBldmVyeSBkcml2ZXIgbXVzdCBoYXZlIGFuIGluc3RhbmNlCiAqICBvZiB0aGlzIGluaXRpYWxpemVkIHRvIDAKICovCgpleHRlcm4gdWxvbmcgQVRLVGltZXJEaXY7CgovKgogKiB0cmFjZV9lbnRyeSAtCiAqCiAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHRyYWNlIGJ1ZmZlci4gIFRoZQogKiBmaXJzdCBmZXcgZmllbGRzIG1lYW4gdGhlIHNhbWUgZnJvbSBlbnRyeSB0byBlbnRyeSwgd2hpbGUKICogdGhlIG1lYW5pbmcgb2YgbGFzdCBzZXZlcmFsIGZpZWxkcyBjaGFuZ2UgdG8gc3VpdCB0aGUKICogbmVlZHMgb2YgdGhlIHRyYWNlIGVudHJ5LiAgVHlwaWNhbGx5IHRoZXkgYXJlIGZ1bmN0aW9uIGNhbGwKICogcGFyYW1ldGVycy4KICovCnN0cnVjdCB0cmFjZV9lbnRyeSB7CiAgICAgICAgY2hhciAgICAgIAluYW1lWzhdOy8qIDggY2hhcmFjdGVyIG5hbWUgLSBsaWtlICdzJ2knbSdiJ2EncidjJ3YnICovCiAgICAgICAgdTMyICAgCQl0aW1lOyAgLyogQ3VycmVudCBjbG9jayB0aWMgKi8KICAgICAgICB1bnNpZ25lZCBjaGFyICAgY3B1OyAgIC8qIEN1cnJlbnQgQ1BVICovCiAgICAgICAgdW5zaWduZWQgY2hhciAgIGlycWw7ICAvKiBDdXJyZW50IElSUUwgKi8KICAgICAgICB1bnNpZ25lZCBjaGFyICAgZHJpdmVyOy8qIFRoZSBkcml2ZXIgd2hpY2ggYWRkZWQgdGhlIHRyYWNlIGNhbGwgKi8KCS8qIHBhZCB0byA0IGJ5dGUgYm91bmRhcnkgLSB3aWxsIHByb2JhYmx5IGdldCB1c2VkICovCiAgICAgICAgdW5zaWduZWQgY2hhciAgIHBhZDI7CiAgICAgICAgdTMyCQlhcmcxOyAgICAgICAgICAgLyogQ2FsbGVyIGFyZzEgKi8KICAgICAgICB1MzIJCWFyZzI7ICAgICAgICAgICAvKiBDYWxsZXIgYXJnMiAqLwogICAgICAgIHUzMgkJYXJnMzsgICAgICAgICAgIC8qIENhbGxlciBhcmczICovCiAgICAgICAgdTMyCQlhcmc0OyAgICAgICAgICAgLyogQ2FsbGVyIGFyZzQgKi8KfTsKCi8qIERyaXZlciB0eXBlcyBmb3IgZHJpdmVyIGZpZWxkIGluIHN0cnVjdCB0cmFjZV9lbnRyeSAqLwojZGVmaW5lIFRSQUNFX1NYRyAgICAgICAgICAgICAxCiNkZWZpbmUgVFJBQ0VfVlBDSSAgICAgICAgICAgIDIKI2RlZmluZSBUUkFDRV9TTElDICAgICAgICAgICAgMwoKI2RlZmluZSBUUkFDRV9FTlRSSUVTICAgMTAyNAoKc3RydWN0IHN4Z190cmFjZV9idWZmZXIgewoJLyogYWlkIGZvciB3aW5kYmcgZXh0ZW5zaW9uICovCgl1bnNpZ25lZCBpbnQgICAgICAgICAgICBzaXplOwoJdW5zaWduZWQgaW50ICAgICAgICAgICAgaW47ICAgICAgICAgICAgICAgICAgICAvKiBXaGVyZSB0byBhZGQgKi8KCXVuc2lnbmVkIGludCAgICAgICAgICAgIGxldmVsOyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBUcmFjZSBsZXZlbCAqLwoJc3BpbmxvY2tfdAkJbG9jazsgICAgICAgICAgICAgICAgICAvKiBGb3IgTVAgdHJhY2luZyAqLwoJc3RydWN0IHRyYWNlX2VudHJ5CWVudHJpZXNbVFJBQ0VfRU5UUklFU107LyogVGhlIGNpcmN1bGFyIGJ1ZmZlciAqLwp9OwoKLyoKICogVGhlIHRyYWNlIGxldmVscwogKgogKiBYWFggQXQgdGhlIG1vbWVudCBJIGFtIG9ubHkgZGVmaW5pbmcgY3JpdGljYWwsIGltcG9ydGFudCwgYW5kIG5vaXN5LgogKiBJIGFtIGxlYXZpbmcgcm9vbSBmb3IgbW9yZSBpZiBhbnlvbmUgd2FudHMgdGhlbS4KICovCiNkZWZpbmUgVFJBQ0VfTk9ORSAgICAgICAgICAgICAgMCAgIC8qIEZvciB0cmFjZSBsZXZlbCAtIGlmIG5vIHRyYWNpbmcgd2FudGVkICovCiNkZWZpbmUgVFJBQ0VfQ1JJVElDQUwgICAgICAgICAgMSAgIC8qIG1pbmltYWwgdHJhY2luZyAtIG9ubHkgY3JpdGljYWwgc3R1ZmYgKi8KI2RlZmluZSBUUkFDRV9JTVBPUlRBTlQgICAgICAgICA1ICAgLyogbW9yZSB0cmFjaW5nIC0gYW55dGhpbmcgaW1wb3J0YW50ICovCiNkZWZpbmUgVFJBQ0VfTk9JU1kgICAgICAgICAgICAgMTAgIC8qIEV2ZXJ5dGhpbmcgaW4gdGhlIHdvcmxkICovCgoKLyogVGhlIG1hY3JvcyB0aGVtc2VsdmVzICovCiNpZiBBVEtfVFJBQ0VfRU5BQkxFRAojZGVmaW5lIFNYR19UUkFDRV9JTklUKGJ1ZmZlciwgdGxldmVsKQkJCQlcCnsJCQkJCQkJCVwKCW1lbXNldCgoYnVmZmVyKSwgMCwgc2l6ZW9mKHN0cnVjdCBzeGdfdHJhY2VfYnVmZmVyKSk7CVwKCShidWZmZXIpLT5sZXZlbCA9ICh0bGV2ZWwpOwkJCQlcCgkoYnVmZmVyKS0+c2l6ZSA9IFRSQUNFX0VOVFJJRVM7CQkJCVwKCXNwaW5fbG9ja19pbml0KCYoYnVmZmVyKS0+bG9jayk7CQkJXAp9CiNlbHNlCiNkZWZpbmUgU1hHX1RSQUNFX0lOSVQoYnVmZmVyLCB0bGV2ZWwpCiNlbmRpZgoKLypUaGUgdHJhY2UgbWFjcm8uICBUaGlzIGlzIGFjdGl2ZSBvbmx5IGlmIEFUS19UUkFDRV9FTkFCTEVEIGlzIHNldC4gKi8KI2lmIEFUS19UUkFDRV9FTkFCTEVECiNkZWZpbmUgU1hHX1RSQUNFKHRkcml2ZXIsIGJ1ZmZlciwgdGxldmVsLCB0bmFtZSwgYTEsIGEyLCBhMywgYTQpIHsgICAgICAgIFwKICAgICAgICBpZiAoKGJ1ZmZlcikgJiYgKChidWZmZXIpLT5sZXZlbCA+PSAodGxldmVsKSkpIHsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgdHJhY2VfaXJxbCA9IDA7LyogPz8/Pz8/IEZJWCBUSElTICovXAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgdHJhY2VfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3RydWN0IHRyYWNlX2VudHJ5CSp0cmFjZV9lbnRyeTsJCQkgICAgXAogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHRpbWV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCWlmKHNwaW5fdHJ5bG9jaygmKGJ1ZmZlciktPmxvY2spKQl7CQkgICAgIFwKCSAgICAgICAgICAgICAgICB0cmFjZV9lbnRyeSA9ICYoYnVmZmVyKS0+ZW50cmllc1soYnVmZmVyKS0+aW5dOyAgICAgIFwKICAgICAgICAJICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnRpbWV2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCSAgICAgICAgICAgICAgICBtZW1zZXQodHJhY2VfZW50cnktPm5hbWUsIDAsIDgpOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAJICAgICAgICB0cmFjZV9sZW4gPSBzdHJsZW4odG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCSAgICAgICAgICAgICAgICB0cmFjZV9sZW4gPSB0cmFjZV9sZW4gPiA4ID8gOCA6IHRyYWNlX2xlbjsgICAgICAgICAgIFwKICAgICAgICAJICAgICAgICBtZW1jcHkodHJhY2VfZW50cnktPm5hbWUsICh0bmFtZSksIHRyYWNlX2xlbik7ICAgICAgIFwKCSAgICAgICAgICAgICAgICB0cmFjZV9lbnRyeS0+dGltZSA9IHRpbWV2LnR2X3VzZWM7ICAgICAgICAgICAgICAgICAgIFwKCQkJdHJhY2VfZW50cnktPmNwdSA9ICh1bnNpZ25lZCBjaGFyKShzbXBfcHJvY2Vzc29yX2lkKCkgJiAweEZGKTtcCgkgICAgICAgICAgICAgICAgdHJhY2VfZW50cnktPmRyaXZlciA9ICh0ZHJpdmVyKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgCSAgICAgICAgdHJhY2VfZW50cnktPmlycWwgPSB0cmFjZV9pcnFsOyAgICAgICAgICAgICAgICAgICAgICBcCgkgICAgICAgICAgICAgICAgdHJhY2VfZW50cnktPmFyZzEgPSAodWxvbmcpKGExKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgCSAgICAgICAgdHJhY2VfZW50cnktPmFyZzIgPSAodWxvbmcpKGEyKTsgICAgICAgICAgICAgICAgICAgICBcCgkgICAgICAgICAgICAgICAgdHJhY2VfZW50cnktPmFyZzMgPSAodWxvbmcpKGEzKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgCSAgICAgICAgdHJhY2VfZW50cnktPmFyZzQgPSAodWxvbmcpKGE0KTsgICAgICAgICAgICAgICAgICAgICBcCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgCSAgICAgICAgKGJ1ZmZlciktPmluKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAJaWYgKChidWZmZXIpLT5pbiA9PSBUUkFDRV9FTlRSSUVTKSAgICAgICAgICAgICAgICAgICBcCgkgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyKS0+aW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCgkJCXNwaW5fdW5sb2NrKCYoYnVmZmVyKS0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgXAogCSAgICAgICAJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCX0JCQkJCQkJCSAgICAgXAp9CiNlbHNlCiNkZWZpbmUgU1hHX1RSQUNFKHRkcml2ZXIsIGJ1ZmZlciwgdGxldmVsLCB0bmFtZSwgYTEsIGEyLCBhMywgYTQpCiNlbmRpZgoKI2VuZGlmCgojZW5kaWYgIC8qICBfU1hHX0RFQlVHX0hfICAqLwo=