LyoKICogR2VybWFuIHJlc291cmNlcyBmb3IgVHdhaW4KICoKICogQ29weXJpZ2h0IDIwMDYgRnJhbmsgUmljaHRlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicmVzb3VyY2UuaCIKCkxBTkdVQUdFIExBTkdfR0VSTUFOLCBTVUJMQU5HX05FVVRSQUwKCklERF9DQU1FUkFVSSBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDM3MiwgMjczClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19TRVRGT1JFR1JPVU5EIHwgRFNfQ0VOVEVSIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgCiAgICBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJEYXRlaWVuIGF1ZiBkZXIgS2FtZXJhIgpNRU5VIDIwNTQ1CkZPTlQgOCwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCglDT05UUk9MICAgICAgICAgIkxpc3QxIixJRENfTElTVDEsIlN5c0xpc3RWaWV3MzIiLCBMVlNfSUNPTiB8IFdTX0JPUkRFUiB8CldTX1RBQlNUT1AsNyw3LDM1OCwyMjkKICAgIERFRlBVU0hCVVRUT04gICAiR2V35GhsdGUgaW1wb3J0aWVyZW4iLElEQ19JTVBPUlQsMTUyLDI1Miw3MiwxNAogICAgUFVTSEJVVFRPTiAgICAgICJQcmV2aWV3IixJRENfRkVUQ0gsNywyNTIsNjQsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQWxsZSBpbXBvcnRpZXJlbiIsSURDX0lNUE9SVEFMTCw4MCwyNTIsNjQsMTQKICAgIENPTlRST0wgICAgICAgICAiU2tpcCBUaGlzIERpYWxvZyIsSURDX1NLSVAsIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AsMjMwLDI1Miw3NiwxNAogICAgUFVTSEJVVFRPTiAgICAgICJCZWVuZGVuIixJRENfRVhJVCwzMTUsMjUyLDUwLDE0CkVORAoKSUREX0RJQUxPRzEgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDE4NiwgNDYKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFIHwgRFNfQ0VOVEVSIHwgRFNfU0VURk9SRUdST1VORApDQVBUSU9OICLcYmVydHJhZ3VuZyIKRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICAgIExURVhUICAgItxiZXJ0cmFnZS4uLiBCaXR0ZSBXYXJ0ZW4iLElEQ19TVEFUSUMsNSwxOSwxNzYsOCwgU1NfQ0VOVEVSCkVORAoKSUREX0NPTk5FQ1RJTkcgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAyODAsIDExNgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVXwgV1NfVklTSUJMRSB8IERTX0NFTlRFUgpDQVBUSU9OICJWZXJiaW5kZSBtaXQgS2FtZXJhIgpGT05UIDgsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgogICAgQ09OVFJPTCAgICAgICAgICIiLElEQ19CSVRNQVAsIlN0YXRpYyIsU1NfQklUTUFQfFNTX0NFTlRFUklNQUdFLDQsNCwxMTAsMTEwCiAgICBMVEVYVCAgICAgICAgICAgIlZlcmJpbmRlIG1pdCBLYW1lcmEuLi4gQml0dGUgV2FydGVuIixJRENfU1RBVElDLDEyOCw1OCwKICAgICAgICAgICAgICAgICAgICAxMTYsOApFTkQK