LyoKICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDYtMjAwNyBBbelyaWNvIEpvc+kgTWVsbwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX0NPTlRFWFRIRUxQIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFCkNBUFRJT04gIlByb3ByaWVkYWRlcyBwYXJhICVzIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiT0siLCAgICAgSURPSyw0LDEyMiw1MCwxNCwgV1NfVEFCU1RPUCB8IFdTX0dST1VQCiAgUFVTSEJVVFRPTiAgICAiQ2FuY2VsYXIiLCBJRENBTkNFTCw1OCwxMjIsNTAsMTQKICBQVVNIQlVUVE9OICAgICImQXBsaWNhciIsIElEQ19BUFBMWV9CVVRUT04sMTEyLDEyMiw1MCwxNCxXU19ESVNBQkxFRAogIFBVU0hCVVRUT04gICAgIkFqdWRhIiwgICBJREhFTFAsMTY2LDEyMiw1MCwxNCxXU19UQUJTVE9QfFdTX0dST1VQCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgSURDX1RBQkNPTlRST0wsIlN5c1RhYkNvbnRyb2wzMiIsV1NfQ0xJUFNJQkxJTkdTfFdTX0dST1VQfFdTX1RBQlNUT1B8VENTX01VTFRJTElORSw0LDQsMjEyLDExNApFTkQKCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFCgpJRERfUFJPUFNIRUVUIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyMjAsIDE0MApTVFlMRSBEU19DT05URVhUSEVMUCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRQpDQVBUSU9OICJQcm9wcmllZGFkZXMgZGUgJXMiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBERUZQVVNIQlVUVE9OICJPSyIsICAgICBJRE9LLDQsMTIyLDUwLDE0LCBXU19UQUJTVE9QIHwgV1NfR1JPVVAKICBQVVNIQlVUVE9OICAgICJDYW5jZWxhciIsIElEQ0FOQ0VMLDU4LDEyMiw1MCwxNAogIFBVU0hCVVRUT04gICAgIiZBcGxpY2FyIiwgSURDX0FQUExZX0JVVFRPTiwxMTIsMTIyLDUwLDE0LFdTX0RJU0FCTEVECiAgUFVTSEJVVFRPTiAgICAiQWp1ZGEiLCAgIElESEVMUCwxNjYsMTIyLDUwLDE0LFdTX1RBQlNUT1B8V1NfR1JPVVAKICBDT05UUk9MICAgICAgICJTZXBhcmFkb3IiLCAgICBJRENfVEFCQ09OVFJPTCwiU3lzVGFiQ29udHJvbDMyIixXU19DTElQU0lCTElOR1N8V1NfR1JPVVB8V1NfVEFCU1RPUHxUQ1NfTVVMVElMSU5FLDQsNCwyMTIsMTE0CkVORAoKCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKSUREX1dJWkFSRCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjkwLCAxNTkKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFCkNBUFRJT04gIkFzc2lzdGVudGUiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBQVVNIQlVUVE9OICAgICI8ICZWb2x0YXIiLCBJRENfQkFDS19CVVRUT04sNzEsMTM4LDUwLDE0CiAgREVGUFVTSEJVVFRPTiAiJkF2YW7nYXIgPiIsIElEQ19ORVhUX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgREVGUFVTSEJVVFRPTiAiRmluYWxpemFyIiwgIElEQ19GSU5JU0hfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICJDYW5jZWxhciIsICBJRENBTkNFTCwxNzgsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiQWp1ZGEiLCAgICBJREhFTFAsMjM1LDEzOCw1MCwxNCxXU19HUk9VUAogIExURVhUICAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkUsNywxMjksMjc4LDEsU1NfU1VOS0VOCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgIElEQ19UQUJDT05UUk9MLCJTeXNUYWJDb250cm9sMzIiLFdTX0NMSVBTSUJMSU5HUyB8IFdTX0RJU0FCTEVELDcsNywyNTgsNQogIExURVhUCSAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkVIRUFERVIsMCwzNSwyOTAsMSxTU19MRUZUIHwgU1NfU1VOS0VOIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCkVORAoKCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKSUREX1RCQ1VTVE9NSVpFIERJQUxPRyBESVNDQVJEQUJMRSAxMCwgMjAsIDM1NywgMTI1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJQZXJzb25hbGl6YXIgYmFycmEgZGUgZmVycmFtZW50YXMiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBERUZQVVNIQlVUVE9OICImRmVjaGFyIiwgICAgIElEQ0FOQ0VMLDMwOCw2LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiUiZlc3RhdXJhciIsICAgICBJRENfUkVTRVRfQlROLDMwOCwyMyw0NCwxNAogIFBVU0hCVVRUT04gICAgIiZBanVkYSIsICAgICAgSURDX0hFTFBfQlROLDMwOCw0MCw0NCwxNAogIFBVU0hCVVRUT04gICAgIkEmY2ltYSIsICAgSURDX01PVkVVUF9CVE4sMzA4LDc0LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiQSZiYWl4byIsIElEQ19NT1ZFRE5fQlROLDMwOCw5MSw0NCwxNAogIExURVhUICAgICAgICAgIkJvdPVlcyAmZGlzcG9u7XZlaXM6IiwgLTEsNCw1LDg0LDEwCiAgTElTVEJPWCAgICAgICBJRENfQVZBSUxCVE5fTEJPWCw0LDE3LDEyMCwxMDAsIExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUAogIFBVU0hCVVRUT04gICAgIiZBZGljaW9uYXIgLT4iLCAgICBJRE9LLCAxMzEsIDQyLCA0NCwgMTQKICBQVVNIQlVUVE9OICAgICI8LSAmUmVtb3ZlciIsIElEQ19SRU1PVkVfQlROLDEzMSw2Miw0NCwxNAogIExURVhUICAgICAgICAgIiZCb3T1ZXMgZGEgYmFycmEgZGUgZmVycmFtZW50YXM6IiwgLTEsMTgyLDUsNzgsMTAKICBMSVNUQk9YICAgICAgIElEQ19UT09MQkFSQlROX0xCT1gsIDE4MiwxNywxMjAsMTAwLExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUApFTkQKCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19DTE9TRSAgICAiRmVjaGFyIgp9CgoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRE1fVE9EQVkgICAgIkhvamU6IgogICAgSURNX0dPVE9EQVkgICJJciBwYXJhIGhvamUiCn0KCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19TRVBBUkFUT1IgIlNlcGFyYWRvciIKfQoKCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSEtZX05PTkUgIk5lbmh1bSIKfQo=