LyoKICogQ09NIGludGVyZmFjZXMgZm9yIHNoZWxsIG9iamVjdHMKICoKICogQ29weXJpZ2h0IChDKSAyMDA0IE1heGltZSBCZWxsZW5n6QogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgppbXBvcnQgIm9iamlkbC5pZGwiOwppbXBvcnQgIm9sZWlkbC5pZGwiOwppbXBvcnQgIm9haWRsLmlkbCI7CmltcG9ydCAic2h0eXBlcy5pZGwiOwppbXBvcnQgInNlcnZwcm92LmlkbCI7CmltcG9ydCAiY29tY2F0LmlkbCI7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZSBpbnRlcmZhY2UKICovClsKICAgIG9iamVjdCwKICAgIHV1aWQoMDBiYjI3NjItNmE3Ny0xMWQwLWE1MzUtMDBjMDRmZDdkMDYyKSwKICAgIHBvaW50ZXJfZGVmYXVsdCh1bmlxdWUpCl0KaW50ZXJmYWNlIElBdXRvQ29tcGxldGUgOiBJVW5rbm93bgp7CiAgICB0eXBlZGVmIElBdXRvQ29tcGxldGUgKkxQQVVUT0NPTVBMRVRFOwoKICAgIEhSRVNVTFQgSW5pdCggW2luXSBIV05EIGh3bmRFZGl0LAoJCSAgW2luXSBJVW5rbm93biAqcHVua0FDTCwKCQkgIFtpbl0gTFBDT0xFU1RSIHB3c3pSZWdLZXlQYXRoLAoJCSAgW2luXSBMUENPTEVTVFIgcHdzelF1aWNrQ29tcGxldGUpOwogICAgCiAgICBIUkVTVUxUIEVuYWJsZSggW2luXSBCT09MIGZFbmFibGUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGUyIGludGVyZmFjZQogKi8KWwogICAgb2JqZWN0LAogICAgdXVpZChlYWMwNGJjMC0zNzkxLTExZDItYmI5NS0wMDYwOTc3YjQ2NGMpLAogICAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgSUF1dG9Db21wbGV0ZTIgOiBJQXV0b0NvbXBsZXRlCnsKICAgIHR5cGVkZWYgSUF1dG9Db21wbGV0ZTIgKkxQQVVUT0NPTVBMRVRFMjsKCiAgICB0eXBlZGVmIGVudW0gX3RhZ0FVVE9DT01QTEVURU9QVElPTlMKCXsKCSAgICBBQ09fTk9ORSAgICAgICAgICAgPSAweDAwLCAgICAgIC8qIE5vIEF1dG9Db21wbGV0ZSAqLwoJICAgIEFDT19BVVRPU1VHR0VTVCAgICA9IDB4MDEsICAgICAgLyogZW5hYmxlIGF1dG9zdWdnZXN0IGRyb3Bkb3duICovCgkgICAgQUNPX0FVVE9BUFBFTkQgICAgID0gMHgwMiwgICAgICAvKiBlbmFibGUgYXV0b2FwcGVuZCAqLwoJICAgIEFDT19TRUFSQ0ggICAgICAgICA9IDB4MDQsICAgICAgLyogYWRkIHNlYXJjaCBlbnRyeSB0byBjb21wbGV0aW9uIGxpc3QgKi8KCSAgICBBQ09fRklMVEVSUFJFRklYRVMgPSAweDA4LCAgICAgIC8qIGRvbid0IG1hdGNoIGNvbW1vbiBwcmVmaXhlcyAod3d3LiwgaHR0cDovLywgZXRjKSAqLwoJICAgIEFDT19VU0VUQUIgICAgICAgICA9IDB4MTAsICAgICAgLyogdXNlIHRhYiB0byBzZWxlY3QgYXV0b3N1Z2dlc3QgZW50cmllcyAqLwoJICAgIEFDT19VUERPV05LRVlEUk9QU0xJU1QgPSAweDIwLCAgLyogdXAvZG93biBhcnJvdyBrZXkgaW52b2tlcyBhdXRvc3VnZ2VzdCBkcm9wZG93biAoaWYgZW5hYmxlZCkgKi8KCSAgICBBQ09fUlRMUkVBRElORyAgICAgPSAweDQwLCAgICAgIC8qIGVuYWJsZSBSVEwgcmVhZGluZyBvcmRlciBmb3IgZHJvcGRvd24gKi8KCX0gQVVUT0NPTVBMRVRFT1BUSU9OUzsKCiAgICBIUkVTVUxUIFNldE9wdGlvbnMoIFtpbl0gRFdPUkQgZHdGbGFnKTsKCiAgICBIUkVTVUxUIEdldE9wdGlvbnMoIFtvdXRdIERXT1JEICpwZHdGbGFnKTsKfQoKWwogICAgb2JqZWN0LAogICAgdXVpZCg5YmEwNTk3MC1mNmE4LTExY2YtYTQ0Mi0wMGEwYzkwYThmMzkpLAogICAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgSUZvbGRlclZpZXdPQyA6IElEaXNwYXRjaAp7CiAgICBIUkVTVUxUIFNldEZvbGRlclZpZXcoIFtpbl0gSURpc3BhdGNoICpwZGlzcCApOwp9CgpbCiAgICB1dWlkKDliYTA1OTcxLWY2YTgtMTFjZi1hNDQyLTAwYTBjOTBhOGYzOSksCiAgICBoaWRkZW4KXQpjb2NsYXNzIFNoZWxsRm9sZGVyVmlld09DCnsKICAgIFtkZWZhdWx0XSAgICAgICAgIGludGVyZmFjZSAgICAgSUZvbGRlclZpZXdPQzsKICAgIFtkZWZhdWx0LCBzb3VyY2VdIGRpc3BpbnRlcmZhY2UgRFNoZWxsRm9sZGVyVmlld0V2ZW50czsKfQo=