LyoKICogU3RhcnQgKFJ1c3NpYW4gcmVzb3VyY2VzKQogKgogKiBDb3B5cmlnaHQgMjAwMyBJZ29yIFN0ZXBpbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQKewpTVFJJTkdfVVNBR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAix+Dv8/Hq4OXyIO/w7uPw4Ozs+yDo6+gg7vLq8Pvi4OXyIOTu6vPs5e3y+yDv8Ojr7ubl7ejl7CwgXG5cCu7h+/ft7iDo8e/u6/zn8+Xs++wg5Ov/IPTg6evu4iDxIOTg7e377CDw4PH46PDl7ejl7C4gXG5cblwKyPHv7uv85+7i4O3o5TogXG5cCnN0YXJ0IFtvcHRpb25zXSDo7P9f9ODp6+Bf7/Du4/Dg7Oz7IFsuLi5dIFxuXApzdGFydCBbb3B0aW9uc10g6Oz/X/Tg6evgX+Tu6vPs5e3y4CBcblwKIFxuXArO7/bo6DogXG5cCi9NW2luaW1pemVkXSDH4O/z8fLo8vwg7/Du4/Dg7OzzIOzo7ejs6Ofo8O7i4O3t7ukuIFxuXAovTUFYW2ltaXplZF0gx+Dv8/Hy6PL8IO/w7uPw4Ozs8yDs4Orx6Ozo5+jw7uLg7e3u6S4gXG5cCi9SW2VzdG9yZWRdICDH4O/z8fLo8vwg7/Du4/Dg7OzzIO3u8Ozg6/zt7iAo7eUg7ODq8ejs6Ofo8O7i4O3t7iDoIO3lIOzo7ejs6Ofo8O7i4O3t7ikuIFxuXAovV1thaXRdICAgICAgzubo5ODy/CDn4OLl8Pjl7ej/IOfg7/P55e3t7ukg7/Du4/Dg7Oz7IOgg4vvp8ugg8SDq7uTu7CDluCDi+/Xu5OAuIFxuXAovVW5peCAgICAgICAgyPHv7uv85+7i4PL8IO/z8vwgVW5peCDk6/8g5+Dv8/Hq4CDv8O7j8ODs+yDq4Oog4ujt5O7i8SDv8O7i7uTt6OouXG5cCi9MICAgICAgICAgICDP7urg5+Dy/CDr6Pbl7efo/iDq7u3l9+3u4+4g7+7r/Ofu4uDy5ev/LiBcblwKIFxuXApzdGFydC5leGUg4uXw8ej/IDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbCBcblwKU3RhcnQg6OTl8iDBxccgysDKyNUty8jBziDDwNDAzdLIyTsg7+7k8O7h7e7x8ugg7/DoIOfg7/Px6uUg8SDu7/bo5ekgL0wuIFxuXArd8u4g8eLu4e7k7eD/IO/w7uPw4Ozs4Cwg6CDi+yDs7ubl8uUg5bgg8ODx7/Du8fLw4O3/8vwg7eAg7u/w5eTl67jt7fv1IFxuXArz8evu4uj/9Tsg7+7k8O7h7e7x8ugg7/DoIOfg7/Px6uUg8SDu7/bo5ekgL0wuIFxuXAoiCgpTVFJJTkdfTElDRU5TRSwgInN0YXJ0LmV4ZSDi5fDx6P8gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsIFxuXArd8u4g7/Du4/Dg7OzgIPDg8e/w7vHy8ODt/+Xy8f8g7+4g6+j25e3n6OggR05VIExlc3NlciBQdWJsaWMgTGljZW5zZSBcblwK6CD/4uv/5fLx/yDx4u7h7uTt++wg7/Du4/Dg7Ozt++wg7/Du5PPq8u7sLiBcblwKXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBcblwKIFxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIFxuXAogXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIFxuXApGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiBcblwKIFxuXApTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uIFxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIs/w6Ovu5uXt6OUg7eUg7O7m5fIg4fvy/CDn4O/z+eXt7iDo6+gg7eUg4PHx7vbo6PDu4uDt7iDv8Ojr7ubl7ejpIPEg8ujv7uwg5ODt7e7j7iDk7urz7OXt8uAuXG7C++fu4iBTaGVsbEV4ZWN1dGVFeCDv8O7i4Ovo6/H/IgoKU1RSSU5HX1VOSVhGQUlMICLN5eLu5+zu5u3uIO/l8OXi5fHy6CDo7P8g7/Du4/Dg7Oz7IFVOSVgg4iDo7P8gRE9TLiIKfQo=