LyoKICogU3RhcnQgKER1dGNoIHJlc291cmNlcykKICoKICogQ29weXJpZ2h0IDIwMDMgSGFucyBMZWlkZWtrZXIKICogQ29weXJpZ2h0IDIwMDggRnJhbnMgS29vbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicmVzb3VyY2VzLmgiCgpMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFCnsKU1RSSU5HX1VTQUdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0IGVlbiBwcm9ncmFtbWEsIG9mIG9wZW4gZWVuIGRvY3VtZW50IG1ldCBoZXQgcHJvZ3JhbW1hIGRhdCBub3JtYWFsIHZvb3IgYmVzdGFuZGVuIG1ldCBkaWUgZXh0ZW5zaWUgZ2VicnVpa3Qgd29yZHQuXG5cCkdlYnJ1aWs6XG5cCnN0YXJ0IFtvcHRpZXNdIHByb2dyYW1tYV9uYWFtIFsuLi5dXG5cCnN0YXJ0IFtvcHRpZXNdIGRvY3VtZW50X25hYW1cblwKXG5cCk9wdGllczpcblwKL01baW5pbWl6ZWRdIFN0YXJ0IGhldCBwcm9ncmFtbWEgZ2VtaW5pbWFsaXNlZXJkLlxuXAovTUFYW2ltaXplZF0gU3RhcnQgaGV0IHByb2dyYW1tYSBnZW1heGltYWxpc2VlcmQuXG5cCi9SW2VzdG9yZWRdICBTdGFydCBoZXQgcHJvZ3JhbW1hIG5vcm1hYWwgKG5vY2ggZ2VtaW5pbWFsaXNlZXJkIG5vY2ggZ2VtYXhpbWFsaXNlZXJkKS5cblwKL1dbYWl0XSAgICAgIFdhY2h0IHRvdGRhdCBoZXQgZ2VzdGFydGUgcHJvZ3JhbW1hIGlzIGJl62luZGlnZCwgZWluZGlnIGRhbiBtZXQgZGUgZXhpdCBjb2RlIHZhbiBkYXQgcHJvZ3JhbW1hLlxuXAovVW5peCAgICAgICAgR2VicnVpayBlZW4gVW5peCBiZXN0YW5kc25hYW0gZW4gc3RhcnQgaGV0IGJlc3RhbmQgYWxzIGRlIFdpbmRvd3MgdmVya2VubmVyLlxuXAovUHJvZ0lET3BlbiAgT3BlbiBlZW4gZG9jdW1lbnQgbWV0IGJlaHVscCB2YW4gaGV0IHZvbGdlbmRlIHByb2dJRC5cblwKL0wgICAgICAgICAgIExhYXQgZGUgZ2VicnVpa2Vyc2xpY2VudGllIHppZW4uXG5cClxuXApzdGFydC5leGUgdmVyc2lvbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWxcblwKU3RhcnQgd29yZHQgdSBBQlNPTFVVVCBaT05ERVIgR0FSQU5USUUgYWFuZ2Vib2RlbjsgZHJhYWkgZGl0IHByb2dyYW1tYSBtZXQgZGUgL0wgb3B0aWUgdm9vciBkZXRhaWxzLlxuXApEaXQgaXMgdnJpamUgc29mdHdhcmUsIGVuIHUgd29yZHQgdWl0Z2Vub2RpZ2Qgb20gaGV0IHZlcmRlciB0ZSB2ZXJzcHJlaWRlblxuXApvbmRlciBiZXBhYWxkZSB2b29yd2FhcmRlbjsgZHJhYWkgJ3N0YXJ0IC9MJyB2b29yIGRldGFpbHMuXG5cCiIKClNUUklOR19MSUNFTlNFLCAic3RhcnQuZXhlIHZlcnNpZSAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWxcblwKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuXAptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjFcblwKb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cClxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcblwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcblwKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cClxuXApZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG5cCkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG5cClxuXApCZWtpamsgaGV0IENPUFlJTkcuTElCIGJlc3RhbmQgdm9vciBpbmZvcm1hdGllIG92ZXIgZGUgbGljZW50aWUuXG5cCiIKClNUUklOR19FWEVDRkFJTCAiUHJvZ3JhbW1hIGthbiBuaWV0IHdvcmRlbiBnZXN0YXJ0LCBvZiBlciBpcyBnZWVuIHByb2dyYW1tYSB2ZXJib25kZW4gbWV0IGhldCBvcGdlZ2V2ZW4gYmVzdGFuZC5cblNoZWxsRXhlY3V0ZUV4IGlzIG1pc2x1a3QiCgpTVFJJTkdfVU5JWEZBSUwgIktvbiBkZSBvcGdlZ2V2ZW4gVW5peCBiZXN0YW5kc25hYW0gbmlldCBvbXpldHRlbiBuYWFyIGVlbiBET1MgYmVzdGFuZHNuYWFtLiIKfQo=