VGhpcyBmaWxlcyBsaXN0IHRoZSBwZW9wbGUsIG91dHNpZGUgb2YgdGhlIG9yaWdpbmFsIGRldmVsb3BtZW50IHRlYW0gdGhhdCBoZWxwIGluIHRoZSBwcm9qZWN0LgpUaGVpciBjb250cmlidXRpb25zIHdlcmUgdmVyeSBoZWxwZnVsLCBzbyBJIGd1ZXNzIHRoZXkgc2hvdWxkIGhhdmUgdGhlaXIgbmFtZXMgbGlzdGVkIHNvbWV3aGVyZS4KClRoYW5rcyB0bzoKICAgQ29udHJpYnV0b3JzIHRoYXQgYXJlIG5vdCBjb2xsZWFndWVzIG9yIHN0dWRlbnRzCgktIFRvbSAic3BvdCIgQ2FsbGF3YXkgPHRjYWxsYXdhQHJlZGhhdC5jb20+LCBmb3IgaGlzIGV4cGVyaWVuY2UgYW5kIHdpc2VuZXNzIGluIFJQTSBwYWNrYWdpbmcuIAoJLSBQZW9wbGUgZnJvbSBtYWxpbmctbGlzdCBuZnN2NEBsaW51eC1uZnMub3JnICh3aXRoIHNwZWNpYWwgYXR0ZW50aW9uIHRvIEouIEJydWNlIEZpZWxkcyAKCSAgYW5kIFRyb25kIE15a2xlYnVzdCkgZm9yIHRoZWlyIGhlbHAgdW5kZXJzdGFuZGluZyB0aGUgY29tcGxleCBsb2dpYyB3aXRoaW4gTkZTdjQKCS0gRXJpYyBTZXN0ZXJoZW5uIDxlcmljLnNlc3Rlcmhlbm5AbHNleHBlcnRzLmRlPiB3aG8gcHJvdmlkZWQgYSBuaWNlIHBhdGNoIGZpeGluZyBtZW1sZWFrcy4KCS0gRXJpayBMZXZpbnNvbiA8ZXJpa0BjYW5lcmlzLmNvbT4gd2hvIGRpZCBsb3RzIG9mIHdvcmsgdG8gbWFrZSBsaWJuZnNpZG1hcCB3b3JrIHdpdGggZ3NzcnBjIGluIG5mcy1nYW5lc2hhCgktIFNlYW4gRGFndWUgPGphcGhAdXMuaWJtLmNvbT4gd2hvIHByb3ZpZGVzIG1lIHdpdGggc2V2ZXJhbCB0eXBvcyBhbmQgbWVtbGVha3MgcGF0Y2hlcwoJLSBBbmVlc2ggS3VtYXIgSy4gVi4gPGFuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb20+IHdobyBpbXBsZW1lbnRlZCBOTE12NCBzdXBwb3J0IChsb2NraW5nIGZvciBORlN2MykKCS0gRnJhbmsgRmlseiA8ZmZpbHpsbnhAdXMuaWJtLmNvbT4gd2hvIHByb3ZpZGVkIG1lIHdpdGggc2V2ZXJhbCBzbWFsbCBmaXhlcyBvbiB0aGUgc2VydmVyJ3MgYmVoYXZpb3IuIEhlIGlkZXNpZ25lZCBpCiAgICAgICAgICBhbmQgd3JvdGUgYXMgd2VsbCB0aGUgbmV3IExvZyBsYXllciBBUEkuCgogICBTdHVkZW50cyB0aGF0IGNhbWUgdG8gbWFrZSBhbiBpbnRlcnNoaXAgd2l0aCB1cyBhbmQgd29ya2VkIG9uIHRoZSBwcm9qZWN0CgktIE1pY2thZWwgR3VlcmluIHdobyB3cm90ZSB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGUgRlNBTF9QT1NJWAoJLSBMYXVyZWxpbmUgUHJvdm9zdCB3aG8gd3JvdGUgYSBQRVJMIGxpYnJhcnkgdGhhdCBoYWQgYmVlbiB2ZXJ5IHVzZWZ1bCB0byBxdWlja2x5IHdyaXRlIGJlbmNobWFya3MgCiAgICAgICAgICBhbmQgbm9uLXJlZ3Jlc3Npb24gdGVzdAoJLSBDZWRyaWMgQ2FiZXNzYSB3aG8gd29ya2VkIG9uIHRoZSBTTk1QIGFkbWluIG1vZHVsZQoJLSBBZHJpZW4gR3JlbGxpZXIgd2hvIHByb3ZpZGVkIHVzIHdpdGggdGhlIGZpcnN0IFRJLVJQQyBzdXBwb3J0IGluIHRoZSBwcm9kdWN0CiAgICAgICAgLSBS6W1pIER1cmFmZm9ydCB3aG8gd3JvdGUgdGhlIEZTQUxfWkZTIGltcGxlbWVudGF0aW9uIGFzIHdlbGwgYXMgdGhlIGxpYnpmc3dyYXAgY29udHJpYi4gSGUgZml4ZWQgbWFueSBvdGhlciBzbWFsbCBidWdzIHRvbwoK