LyoKICogQ29weXJpZ2h0IDIwMDUgTWlsa28gS3JhY2hvdW5vdgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgoKTEFOR1VBR0UgTEFOR19CVUxHQVJJQU4sIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX0hUTUxESVNBQkxFRCAgICAiSFRNTCDo5+7h8ODn/+Lg7eXy7iDlIOjn6uv+9+Xt7i4iCiAgICBJRFNfSFRNTERPQ1VNRU5UICAgICJIVE1MIOTu6vPs5e3yIgogICAgSURTX0RPV05MT0FESU5HICAgICAiyOfy5ePr/+3lLi4uIgogICAgSURTX0lOU1RBTExJTkcgICAgICAiyO3x8uDr6PDg7eUuLi4iCn0KCgpJRF9EV0xfRElBTE9HIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFICAwLCAwLCAyNjAsIDg1ClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJXaW5lIEdlY2tvIEluc3RhbGxlciIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiAgICBMVEVYVCAiz/Do6+7m5e3o5fLuIPHlIO7v6PLi4CDk4CDv7urg5uUgSFRNTCDx8vDg7ej24C4gx+Ag5OAg4frk5SDv7urg5+Dt4CDx8vDg7ej24PLgLCAiIFwKICAgICAgICAgICLy8P/h4uAg5OAg6Ozg8uUgR2Vja28gKEhUTUwg7OD46O3g8uAg7eAgTW96aWxsYSkg6O3x8uDr6PDg7S4gxuXr4OXy5SDr6CBHZWNrbyAiIFwKICAgICAgICAgICLk4CDh+uTlIOjn8uXj6+XtIOgg6O3x8uDr6PDg7T8iLCBJRF9EV0xfU1RBVFVTLCAxMCwgMTAsIDI0MCwgMzAsIFNTX0xFRlQKICAgIENPTlRST0wgIs3g7/Dl5PrqIiwgSURfRFdMX1BST0dSRVNTLCBQUk9HUkVTU19DTEFTU0EsIFdTX0JPUkRFUnxQQlNfU01PT1RILCAxMCwgNDAsIDI0MCwgMTIKICAgIERFRlBVU0hCVVRUT04gIsjt8fLg6+jw4OkiLCBJRF9EV0xfSU5TVEFMTCwgMjAwLCA2MCwgNTAsIDE1LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICAgIFBVU0hCVVRUT04gIs7y6uDnIiwgSURDQU5DRUwsIDE0MCwgNjAsIDUwLCAxNSwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0K