LyoKICogV2luZUJvb3QgRGFuaXNoIHJlc291cmNlcwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDggSmVucyBhbGJyZXRzZW4gPGplbnNAYWxicmV0c2VuLmRrPgogKiAgICAgICAgICAgICAgIDIwMTAgVGhvbWFzIExhcnNlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICoKICovCgojaW5jbHVkZSAicmVzb3VyY2UuaCIKCkxBTkdVQUdFIExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQKCklERF9FTkRUQVNLIERJQUxPRyAgMCwgMCwgMTg2LCA3MQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfTk9JRExFTVNHIHwgRFNfQ0VOVEVSIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJWZW50ZXIgcOUgcHJvZ3JhbSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgREVGUFVTSEJVVFRPTiAgICJBbm51bGxlciIsSURDQU5DRUwsMTI5LDQ5LDUwLDE1CiAgICBQVVNIQlVUVE9OICAgICAgIkFmc2x1dCBwcm9ncmFtIixJRE9LLDUxLDQ5LDcxLDE1CiAgICBMVEVYVCAgICAgICAgICAgIkVuIHNpbXVsZXJldCBnZW5zdGFydCBlciBpZ2FuZywgbWVuIGRldHRlIHByb2dyYW0gc3ZhcmVyIGlra2UuIiwKICAgICAgICAgICAgICAgICAgICBJRENfU1RBVElDLDcsNywxNzIsMTkKICAgIExURVhUICAgICAgICAgICAiSHZpcyBkdSBhZnNsdXR0ZXIgcHJvZ3JhbW1ldCBrYW4gZHUgbWlzdGUgZGUgZGF0YSBkZXIgaWtrZSBlciBnZW10LiIsCiAgICAgICAgICAgICAgICAgICAgSURDX1NUQVRJQyw3LDI4LDE3MiwxNQpFTkQKCklERF9XQUlURExHIERJQUxPRyAwLCAwLCAyMDAsIDUwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19OT0lETEVNU0cgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX0RJU0FCTEVECkNBUFRJT04gIldpbmUiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIElDT04gIiIsIElEQ19XQUlUSUNPTiwgMywgMywgMTAsIDEwCiAgICBMVEVYVCAiV2luZSBrb25maWd1cmF0aW9uZW4gaSAlcywgZXIgdmVkIGF0IGJsaXZlIG9wZGF0ZXJldCwgdmVudCB2ZW5saWdzdC4uLiIsCiAgICAgICAgICBJRENfV0FJVFRFWFQsIDQwLCA1LCAxNTAsIDQwLCBTU19OT1BSRUZJWApFTkQK