LyoKICogUG9ydHVndWVzZSByZXNvdXJjZXMgZm9yIE1TSQogKgogKiBDb3B5cmlnaHQgMjAwNSBNYXJjZWxvIER1YXJ0ZQogKiBDb3B5cmlnaHQgMjAwNiBBbelyaWNvIEpvc+kgTWVsbwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAid2luZGVmLmgiCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKCTQgIlRoZSBzcGVjaWZpZWQgaW5zdGFsbGF0aW9uIHBhY2thZ2UgY291bGQgbm90IGJlIG9wZW5lZC4gIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoIGFuZCB0cnkgYWdhaW4uIgoJNSAiY2FtaW5obyAlcyBu428gZW5jb250cmFkbyIKCTkgImluc2lyYSBkaXNjbyAlcyIKCTEwICJwYXLibWV0cm9zIGluduFsaWRvcyIKCTExICJlbnRyZSBxdWFsIHBhc3RhIGNvbnTpbSAlcyIKCTEyICJpbnN0YWxhciBmb250ZSBwYXJhIGNhcmFjdGVy7XN0aWNhIGZhbHRhbmRvIgoJMTMgImRyaXZlIGRlIHJlZGUgcGFyYSAgY2FyYWN0ZXLtc3RpY2EgZmFsdGFuZG8iCgkxNCAiY2FyYWN0ZXLtc3RpY2EgZGU6IgoJMTUgImVzY29saGEgcXVhbCBwYXN0YSBjb2506W0gJXMiCn0KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7Cgk0ICJUaGUgc3BlY2lmaWVkIGluc3RhbGxhdGlvbiBwYWNrYWdlIGNvdWxkIG5vdCBiZSBvcGVuZWQuICBQbGVhc2UgY2hlY2sgdGhlIGZpbGUgcGF0aCBhbmQgdHJ5IGFnYWluLiIKCTUgImxvY2FsaXph5+NvICVzIG7jbyBlbmNvbnRyYWRhIgoJOSAiaW5zaXJhIG8gZGlzY28gJXMiCgkxMCAicGFy4m1ldHJvcyBpbnbhbGlkb3MiCgkxMSAiaW5kaXF1ZSBxdWUgcGFzdGEgY29udOltICVzIgoJMTIgImluc3RhbGFyIGZvbnRlIHBhcmEgYSBvcOfjbyBlbSBmYWx0YSIKCTEzICJjb250cm9sYWRvciBkZSByZWRlIHBhcmEgYSBvcOfjbyBlbSBmYWx0YSIKCTE0ICJvcOfjbyBkZToiCgkxNSAiaW5kaXF1ZSBxdWUgcGFzdGEgY29udOltICVzIgp9Cg==