LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQogKiBGcmVlUlRPUytUcmFjZSB2Mi4zLjAgUmVjb3JkZXIgTGlicmFyeQ0KICogUGVyY2VwaW8gQUIsIHd3dy5wZXJjZXBpby5jb20NCiAqDQogKiB0cmNQb3J0LmgNCiAqDQogKiBDb250YWlucyB0b2dldGhlciB3aXRoIHRyY1BvcnQuYyBhbGwgcG9ydGFiaWxpdHkgaXNzdWVzIG9mIHRoZSB0cmFjZSByZWNvcmRlciANCiAqIGxpYnJhcnkuDQogKg0KICogVGVybXMgb2YgVXNlDQogKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCBQZXJjZXBpbyBBQi4gVGhlIHJlY29yZGVyIGxpYnJhcnkgaXMgZnJlZSBmb3INCiAqIHVzZSB0b2dldGhlciB3aXRoIFBlcmNlcGlvIHByb2R1Y3RzLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIHJlY29yZGVyIGxpYnJhcnkNCiAqIGluIGl0cyBvcmlnaW5hbCBmb3JtLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucyBpbiB0cmNQb3J0LmMgYW5kIHRyY1BvcnQuaA0KICogZ2l2ZW4gdGhhdCB0aGVzZSBtb2RpZmljYXRpb24gYXJlIGNsZWFybHkgbWFya2VkIGFzIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMNCiAqIGFuZCBkb2N1bWVudGVkIGluIHRoZSBpbml0aWFsIGNvbW1lbnQgc2VjdGlvbiBvZiB0aGVzZSBzb3VyY2UgZmlsZXMuIA0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIFBlcmNlcGlvIEFCIGFuZCBtYXkgbm90IGJlIA0KICogc29sZCBvciBpbiBvdGhlciB3YXlzIGNvbW1lcmNpYWxseSByZWRpc3RyaWJ1dGVkIHdpdGhvdXQgZXhwbGljaXQgd3JpdHRlbiANCiAqIHBlcm1pc3Npb24gYnkgUGVyY2VwaW8gQUIuDQogKg0KICogRGlzY2xhaW1lciANCiAqIFRoZSB0cmFjZSB0b29sIGFuZCByZWNvcmRlciBsaWJyYXJ5IGlzIGJlaW5nIGRlbGl2ZXJlZCB0byB5b3UgQVMgSVMgYW5kIA0KICogUGVyY2VwaW8gQUIgbWFrZXMgbm8gd2FycmFudHkgYXMgdG8gaXRzIHVzZSBvciBwZXJmb3JtYW5jZS4gUGVyY2VwaW8gQUIgZG9lcyANCiAqIG5vdCBhbmQgY2Fubm90IHdhcnJhbnQgdGhlIHBlcmZvcm1hbmNlIG9yIHJlc3VsdHMgeW91IG1heSBvYnRhaW4gYnkgdXNpbmcgdGhlIA0KICogc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbi4gUGVyY2VwaW8gQUIgbWFrZSBubyB3YXJyYW50aWVzLCBleHByZXNzIG9yIA0KICogaW1wbGllZCwgYXMgdG8gbm9uaW5mcmluZ2VtZW50IG9mIHRoaXJkIHBhcnR5IHJpZ2h0cywgbWVyY2hhbnRhYmlsaXR5LCBvciANCiAqIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEluIG5vIGV2ZW50IHdpbGwgUGVyY2VwaW8gQUIsIGl0cyANCiAqIHRlY2hub2xvZ3kgcGFydG5lcnMsIG9yIGRpc3RyaWJ1dG9ycyBiZSBsaWFibGUgdG8geW91IGZvciBhbnkgY29uc2VxdWVudGlhbCwgDQogKiBpbmNpZGVudGFsIG9yIHNwZWNpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBsb3N0IHByb2ZpdHMgb3IgbG9zdCBzYXZpbmdzLCANCiAqIGV2ZW4gaWYgYSByZXByZXNlbnRhdGl2ZSBvZiBQZXJjZXBpbyBBQiBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSANCiAqIG9mIHN1Y2ggZGFtYWdlcywgb3IgZm9yIGFueSBjbGFpbSBieSBhbnkgdGhpcmQgcGFydHkuIFNvbWUganVyaXNkaWN0aW9ucyBkbyANCiAqIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yIGxpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCwgY29uc2VxdWVudGlhbCBvciBzcGVjaWFsIA0KICogZGFtYWdlcywgb3IgdGhlIGV4Y2x1c2lvbiBvZiBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgbGltaXRhdGlvbnMgb24gaG93IGxvbmcgYW4gDQogKiBpbXBsaWVkIHdhcnJhbnR5IG1heSBsYXN0LCBzbyB0aGUgYWJvdmUgbGltaXRhdGlvbnMgbWF5IG5vdCBhcHBseSB0byB5b3UuDQogKg0KICogRnJlZVJUT1MrVHJhY2UgaXMgYXZhaWxhYmxlIGFzIEZyZWUgRWRpdGlvbiBhbmQgaW4gdHdvIHByZW1pdW0gZWRpdGlvbnMuDQogKiBZb3UgbWF5IHVzZSB0aGUgcHJlbWl1bSBmZWF0dXJlcyBkdXJpbmcgMzAgZGF5cyBmb3IgZXZhbHVhdGlvbi4NCiAqIERvd25sb2FkIEZyZWVSVE9TK1RyYWNlIGF0IGh0dHA6Ly93d3cucGVyY2VwaW8uY29tL3Byb2R1Y3RzL2Rvd25sb2Fkcy8NCiAqDQogKiBDb3B5cmlnaHQgUGVyY2VwaW8gQUIsIDIwMTIuDQogKiB3d3cucGVyY2VwaW8uY29tDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWZuZGVmIFRSQ1BPUlRfSA0KI2RlZmluZSBUUkNQT1JUX0gNCg0KLyogSWYgRnJlZVJUT1MgV2luMzIgcG9ydCAqLw0KI2lmZGVmIFdJTjMyDQoNCiAgICN1bmRlZiBfV0lOMzJfV0lOTlQNCiAgICNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDYwMA0KDQogICAvKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiAgICNpbmNsdWRlIDxzdGRpby5oPg0KICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4NCiAgICNpbmNsdWRlIDxkaXJlY3QuaD4NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRoZSBXaW4zMiBwb3J0IGJ5IGRlZmF1bHQgc2F2ZXMgdGhlIHRyYWNlIHRvIGZpbGUgYW5kIHRoZW4ga2lsbHMgdGhlDQogKiBwcm9ncmFtIHdoZW4gdGhlIHJlY29yZGVyIGlzIHN0b3BwZWQsIHRvIGZhY2lsaXRhdGUgcXVpY2ssIHNpbXBsZSB0ZXN0cw0KICogb2YgdGhlIHJlY29yZGVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgICNkZWZpbmUgV0lOMzJfUE9SVF9TQVZFX1dIRU5fU1RPUFBFRCAxDQogICAjZGVmaW5lIFdJTjMyX1BPUlRfRVhJVF9XSEVOX1NUT1BQRUQgMQ0KI2Vsc2UNCgkjZGVmaW5lIFdJTjMyX1BPUlRfU0FWRV9XSEVOX1NUT1BQRUQgMA0KCSNkZWZpbmUgV0lOMzJfUE9SVF9FWElUX1dIRU5fU1RPUFBFRCAwDQojZW5kaWYNCg0KI2RlZmluZSBESVJFQ1RJT05fSU5DUkVNRU5USU5HIDENCiNkZWZpbmUgRElSRUNUSU9OX0RFQ1JFTUVOVElORyAyDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFN1cHBvcnRlZCBwb3J0cw0KICogDQogKiBQT1JUX0hXSW5kZXBlbmRlbnQNCiAqIEEgaGFyZHdhcmUgaW5kZXBlbmRlbnQgZmFsbGJhY2sgb3B0aW9uIGZvciBldmVudCB0aW1lc3RhbXBpbmcuIFByb3ZpZGVzIGxvdyANCiAqIHJlc29sdXRpb24gdGltZXN0YW1wcyBiYXNlZCBvbiB0aGUgT1MgdGljay4NCiAqIFRoaXMgbWF5IGJlIHVzZWQgb24gdGhlIFdpbjMyIHBvcnQsIGJ1dCBtYXkgYWxzbyBiZSB1c2VkIG9uIGVtYmVkZGVkIGhhcmR3YXJlIA0KICogcGxhdGZvcm1zLiBOb3RlIHRoYXQgdGhpcyBnaXZlcyBzdWJvcHRpbWFsIGRpc3BsYXkgaW4gRnJlZVJUT1MrVHJhY2UuIEFsbCANCiAqIHRpbWUgZHVyYXRpb25zIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBPUyB0aWNrIGZyZXF1ZW5jeSwgdHlwaWNhbGx5IDEgS0h6LiANCiAqIFRoaXMgbWVhbnMgdGhhdCBhIHRhc2sgb3IgSVNSIHRoYXQgZXhlY3V0ZXMgaW4gbGVzcyB0aGFuIDEgbXMgZ2V0IGFuIGV4ZWN0aW9uIA0KICogdGltZSBvZiB6ZXJvLiBUaGV5IGFyZSBob3dldmVyIHN0aWxsIHZpc2libGUgaW4gRnJlZVJUT1MrVHJhY2UuIA0KICoNCiAqIFBPUlRfV2luMzINCiAqICJBY2N1cmF0ZSIgdGltZXN0YW1waW5nIGJhc2VkIG9uIHRoZSBXaW5kb3dzIHBlcm1hbmNlIGNvdW50ZXIuIE5vdGUgdGhhdA0KICogdGhpcyBnaXZlcyB0aGUgaG9zdCBtYWNoaW5lIHRpbWUsIG5vdCB0aGUgc2ltdWxhdGVkIEZyZWVSVE9TIHRpbWUgKHRpY2sgDQogKiBjb3VudCkuIFRoZSB0aW1pbmcgb2YgdGhlIFdpbjMyIEZyZWVSVE9TIGJ1aWxkIGlzIG5vdCByZWFsLXRpbWUsIHNpbmNlIGl0IA0KICogZGVwZW5kcyBvbiB0aGUgc2NoZWR1bGluZyBhbmQgdGljayByYXRlIG9mIFdpbmRvd3MsIHdoaWNoIGlzIHZlcnkgc2xvdy4NCiAqDQogKiBPZmZpY2lhbGx5IHN1cHBvcnRlZCBoYXJkd2FyZSB0aW1lciBwb3J0czoNCiAqIC0gUE9SVF9BdG1lbF9BVDkxU0FNNw0KICogLSBQT1JUX0F0bWVsX1VDM0EwDQogKiAtIFBPUlRfQVJNX0NvcnRleE0gDQogKiAtIFBPUlRfUmVuZXNhc19SWDYwMA0KICogLSBQT1JUX01pY3JvY2hpcF9kc1BJQ19BTkRfUElDMjQNCiAqDQogKiBXZSBhbHNvIHByb3ZpZGUgc2V2ZXJhbCAidW5vZmZpY2lhbCIgaGFyZHdhcmUtc3BlY2lmaWMgcG9ydHMuIFRoZXJlIGhhdmUgDQogKiBiZWVuIGRldmVsb3BlZCBieSBleHRlcm5hbCBjb250cmlidXRvcnMsIGFuZCBoYXZlIG5vdCB5ZXQgYmVlbiB2ZXJpZmllZCANCiAqIGJ5IFBlcmNlcGlvIEFCLiBMZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBwcm9ibGVtcyBnZXR0aW5nIHRoZXNlIHRvIHdvcmsuDQogKiANCiAqIFVub2ZmaWNhbCBoYXJkd2FyZSBzcGVjaWZpYyBwb3J0cyBwcm92aWRlZCBhcmU6DQogKiAtIFBPUlRfVEVYQVNfSU5TVFJVTUVOVFNfVE1TNTcwDQogKiAtIFBPUlRfVEVYQVNfSU5TVFJVTUVOVFNfTVNQNDMwDQogKiAtIFBPUlRfTUlDUk9DSElQX1BJQzMyDQogKiAtIFBPUlRfWElMSU5YX1BQQzQwNQ0KICogLSBQT1JUX1hJTElOWF9QUEM0NDANCiAqIC0gUE9SVF9YSUxJTlhfTUlDUk9CTEFaRQ0KICogLSBQT1JUX05YUF9MUEMyMTBYDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojZGVmaW5lIFBPUlRfTk9UX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgLTENCg0KLyoqKiBPZmZpY2lhbGx5IHN1cHBvcnRlZCBoYXJkd2FyZSB0aW1lciBwb3J0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSBQT1JUX0hXSW5kZXBlbmRlbnQgICAgICAgICAgICAgICAgICAgICAwDQojZGVmaW5lIFBPUlRfV2luMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDENCiNkZWZpbmUgUE9SVF9BdG1lbF9BVDkxU0FNNyAgICAgICAgICAgICAgICAgICAgMg0KI2RlZmluZSBQT1JUX0F0bWVsX1VDM0EwICAgICAgICAgICAgICAgICAgICAgICAzDQojZGVmaW5lIFBPUlRfQVJNX0NvcnRleE0gICAgICAgICAgICAgICAgICAgICAgIDQNCiNkZWZpbmUgUE9SVF9SZW5lc2FzX1JYNjAwICAgICAgICAgICAgICAgICAgICAgNQ0KI2RlZmluZSBQT1JUX01pY3JvY2hpcF9kc1BJQ19BTkRfUElDMjQgICAgICAgICA2DQoNCi8qKiogVW5vZmZpY2lhbCBwb3J0cywgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgZGV2ZWxvcGVycywgbm90IHlldCB2ZXJpZmllZCAqKioqKi8NCiNkZWZpbmUgUE9SVF9URVhBU19JTlNUUlVNRU5UU19UTVM1NzAgICAgICAgICAgNw0KI2RlZmluZSBQT1JUX1RFWEFTX0lOU1RSVU1FTlRTX01TUDQzMCAgICAgICAgICA4DQojZGVmaW5lIFBPUlRfTUlDUk9DSElQX1BJQzMyICAgICAgICAgICAgICAgICAgIDkNCiNkZWZpbmUgUE9SVF9YSUxJTlhfUFBDNDA1ICAgICAgICAgICAgICAgICAgICAxMA0KI2RlZmluZSBQT1JUX1hJTElOWF9QUEM0NDAgICAgICAgICAgICAgICAgICAgIDExDQojZGVmaW5lIFBPUlRfWElMSU5YX01JQ1JPQkxBWkUgICAgICAgICAgICAgICAgMTINCiNkZWZpbmUgUE9SVF9OWFBfTFBDMjEwWCAgICAgICAgICAgICAgICAgICAgICAxMw0KDQovKioqIFNlbGVjdCB5b3VyIHBvcnQgaGVyZSEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lIFNFTEVDVEVEX1BPUlQgUE9SVF9XaW4zMg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9OT1RfU0VUKSANCiNlcnJvciAiWW91IG5lZWQgdG8gZGVmaW5lIFNFTEVDVEVEX1BPUlQgaGVyZSEiDQojZW5kaWYNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIElSUV9QUklPUklUWV9PUkRFUg0KICoNCiAqIE1hY3JvIHdoaWNoIHNob3VsZCBiZSBkZWZpbmVkIGFzIGFuIGludGVnZXIgb2YgMCBvciAxLg0KICoNCiAqIFRoaXMgc2hvdWxkIGJlIDAgaWYgbG93ZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBpbXBsaWVzIGhpZ2hlciBwcmlvcml0eSANCiAqIGxldmVscywgc3VjaCBhcyBvbiBBUk0gQ29ydGV4IE0uIElmIHRoZSBvcHBvc2l0ZSBzY2hlbWUgaXMgdXNlZCwgaS5lLiwgDQogKiBpZiBoaWdoZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBtZWFucyBoaWdoZXIgcHJpb3JpdHksIHRoaXMgc2hvdWxkIGJlIDEuDQogKg0KICogVGhpcyBzZXR0aW5nIGlzIG5vdCBjcml0aWNhbC4gSXQgaXMgdXNlZCBvbmx5IHRvIHNvcnQgYW5kIGNvbG9yaXplIHRoZSANCiAqIGludGVycnVwdHMgaW4gcHJpb3JpdHkgb3JkZXIsIGluIGNhc2UgeW91IHJlY29yZCBpbnRlcnJ1cHRzIHVzaW5nDQogKiB0aGUgdlRyYWNlU3RvcmVJU1JCZWdpbiBhbmQgdlRyYWNlU3RvcmVJU1JFbmQgcm91dGluZXMuDQogKg0KICogV2UgcHJvdmlkZSB0aGlzIHNldHRpbmcgZm9yIHNvbWUgaGFyZHdhcmUgYXJjaGl0ZWN0dXJlcyBiZWxvdzoNCiAqIC0gQVJNIENvcnRleCBNOiAgICAgICAwIChsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBBdG1lbCBBVDkxU0FNN3g6ICAgIDEgKGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBBdG1lbCBBVlIzMjogICAgICAgIDEgKGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBSZW5lc2FzIFJYNjAwOiAgICAgIDEgKGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBNaWNyb2NoaXAgUElDMjQ6ICAgIDAgKGxvd2VyIGlycSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIE1pY3JvY2hpcCBkc1BJQzogICAgMCAobG93ZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gVEkgVE1TNTcwOiAgICAgICAgICAwIChsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBGcmVlc2NhbGUgSENTMDg6ICAgIDAgKGxvd2VyIGlycSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIEZyZWVzY2FsZSBIQ1MxMjogICAgMCAobG93ZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gUG93ZXJQQyA0MDU6ICAgICAgICAwIChsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICogLSBQb3dlclBDIDQ0MDogICAgICAgIDAgKGxvd2VyIGlycSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIEZyZWVzY2FsZSBDb2xkRmlyZTogMSAoaGlnaGVyIGlycSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQpDQogKiAtIE5YUCBMUEMyMTB4OiAgICAgICAgMCAobG93ZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudCkNCiAqIC0gTWljcm9CbGF6ZTogICAgICAgIDAgIChsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50KQ0KICoNCiAqIElmIHlvdXIgY2hpcCBpcyBub3Qgb24gdGhlIGFib3ZlIGxpc3QsIGFuZCB5b3UgcGVyaGFwcyBrbm93IHRoaXMgZGV0YWlsIGJ5IA0KICogaGVhcnQsIHBsZWFzZSBpbmZvcm0gdXMgYnkgZS1tYWlsIHRvIHN1cHBvcnRAcGVyY2VwaW8uY29tLg0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqDQogKiBIV1RDIE1hY3JvcyANCiAqDQogKiBUaGVzZSBmb3VyIEhXVEMgbWFjcm9zIHByb3ZpZGVzIGEgaGFyZHdhcmUgaXNvbGF0aW9uIGxheWVyIHJlcHJlc2VudGluZyBhIA0KICogZ2VuZXJpYyBoYXJkd2FyZSB0aW1lci9jb3VudGVyIHVzZWQgZm9yIGRyaXZpbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGljaywgDQogKiBzdWNoIGFzIHRoZSBTeXNUaWNrIGZlYXR1cmUgb2YgQVJNIENvcnRleCBNMy9NNCwgb3IgdGhlIFBJVCBvZiB0aGUgQXRtZWwgDQogKiBBVDkxU0FNN1guDQogKg0KICogSFdUQ19DT1VOVDogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIuIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgcmVzZXQgDQogKiBhIGVhY2ggdGljayBpbnRlcnJ1cHQuIFRodXMsIHdoZW4gdGhlIHRpY2sgaGFuZGxlciBzdGFydHMsIHRoZSBjb3VudGVyIGhhcyANCiAqIGFscmVhZHkgd3JhcHBlZC4NCiAqDQogKiBIV1RDX0NPVU5UX0RJUkVDVElPTjogU2hvdWxkIGJlIG9uZSBvZjoNCiAqIC0gRElSRUNUSU9OX0lOQ1JFTUVOVElORyAtIGZvciBoYXJkd2FyZSB0aW1lci9jb3VudGVycyBvZiBpbmNyZW1lbnRpbmcgdHlwZQ0KICogICBzdWNoIGFzIHRoZSBQSVQgb24gQXRtZWwgQVQ5MVNBTTdYLg0KICogICBXaGVuIHRoZSBjb3VudGVyIHZhbHVlIHJlYWNoIEhXVENfUEVSSU9ELCBpdCBpcyByZXNldCB0byB6ZXJvIGFuZCB0aGUNCiAqICAgaW50ZXJydXB0IGlzIHNpZ25hbGVkLg0KICogLSBESVJFQ1RJT05fREVDUkVNRU5USU5HIC0gZm9yIGhhcmR3YXJlIHRpbWVyL2NvdW50ZXJzIG9mIGRlY3JlbWVudGluZyB0eXBlDQogKiAgIHN1Y2ggYXMgdGhlIFN5c1RpY2sgb24gQVJNIENvcnRleCBNMy9NNCBjaGlwcy4NCiAqICAgV2hlbiB0aGUgY291bnRlciB2YWx1ZSByZWFjaCAwLCBpdCBpcyByZXNldCB0byBIV1RDX1BFUklPRCBhbmQgdGhlDQogKiAgIGludGVycnVwdCBpcyBzaWduYWxlZC4NCiAqDQogKiBIV1RDX1BFUklPRDogVGhlIG51bWJlciBvZiBpbmNyZW1lbnRzIG9yIGRlY3JlbWVudHMgb2YgSFdUQ19DT1VOVCBiZXR3ZWVuDQogKiB0d28gdGljayBpbnRlcnJ1cHRzLiBUaGlzIHNob3VsZCBwcmVmZXJhYmx5IGJlIG1hcHBlZCB0byB0aGUgcmVsb2FkDQogKiByZWdpc3RlciBvZiB0aGUgaGFyZHdhcmUgdGltZXIsIHRvIG1ha2UgaXQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIGNoaXBzIGluIHRoZSANCiAqIHNhbWUgZmFtaWx5LiBUaGUgbWFjcm8gc2hvdWxkIGluIG1vc3QgY2FzZXMgYmUgKHJlbG9hZCByZWdpc3RlciArIDEpLg0KICoNCiAqIEhXVENfRElWSVNPUjogSWYgdGhlIHRpbWVyIGZyZXF1ZW5jeSBpcyB2ZXJ5IGhpZ2gsIGxpa2Ugb24gdGhlIENvcnRleCBNIGNoaXBzDQogKiAod2hlcmUgdGhlIFN5c1RpY2sgcnVucyBhdCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kpLCB0aGUgImRpZmZlcmVudGlhbCANCiAqIHRpbWVzdGFtcGluZyIgdXNlZCBpbiB0aGUgcmVjb3JkZXIgd2lsbCBtb3JlIGZyZXF1ZW50bHkgaW5zZXJ0IGV4dHJhIFhUUyANCiAqIGV2ZW50cyB0byBzdG9yZSB0aGUgdGltZXN0YW1wcywgd2hpY2ggaW5jcmVhc2VzIHRoZSBldmVudCBidWZmZXIgdXNhZ2UuIA0KICogSW4gc3VjaCBjYXNlcywgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgWFRTIGV2ZW50cyBhbmQgdGhlcmVieSBnZXQgbG9uZ2VyIA0KICogdHJhY2VzLCB5b3UgdXNlIEhXVENfRElWSVNPUiB0byBzY2FsZSBkb3duIHRoZSB0aW1lc3RhbXBzIGFuZCBmcmVxdWVuY3kuDQogKiBBc3N1bWluZyBhIE9TIHRpY2sgcmF0ZSBvZiAxIEtIeiwgaXQgaXMgc3VnZ2VzdGVkIHRvIGtlZXAgdGhlIGVmZmVjdGl2ZSB0aW1lcg0KICogZnJlcXVlbmN5IGJlbG93IDY1IE1IeiB0byBhdm9pZCBhbiBleGNlc3NpdmUgYW1vdW50IG9mIFhUUyBldmVudHMuIFRodXMsIGENCiAqIENvcnRleCBNIGNoaXAgcnVubmluZyBhdCA3MiBNSFogc2hvdWxkIHVzZSBhIEhXVENfRElWSVNPUiBvZiAyLCB3aGlsZSBhIA0KICogZmFzdGVyIGNoaXAgcmVxdWlyZSBhIGhpZ2hlciBIV1RDX0RJVklTT1IgdmFsdWUuIA0KICoNCiAqIFRoZSBIV1RDIG1hY3JvcyBhbmQgdWlUcmFjZVBvcnRHZXRUaW1lU3RhbXAgaXMgdGhlIG1haW4gcG9ydGluZyBpc3N1ZQ0KICogb3IgdGhlIHRyYWNlIHJlY29yZGVyIGxpYnJhcnkuIFR5cGljYWxseSB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNoYW5nZQ0KICogdGhlIGNvZGUgb2YgdWlUcmFjZVBvcnRHZXRUaW1lU3RhbXAgaWYgdXNpbmcgdGhlIEhXVEMgbWFjcm9zLg0KICoNCiAqIEZSRUUgTElDRU5TRSBPRkZFUiBGUk9NIFBFUkNFUElPDQogKg0KICogRm9yIHNpbGljb24gY29tcGFuaWVzIGFuZCBub24tY29ycG9yYXRlIEZyZWVSVE9TIHVzZXJzIChyZXNlYXJjaGVycywgc3R1ZGVudHMsDQogKiBob2JieWlzdHMgb3IgZWFybHktcGhhc2Ugc3RhcnR1cHMpIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBvZmZlcjogDQogKiBQcm92aWRlIGEgaGFyZHdhcmUgcG9ydCBmb3Igb3VyIEZyZWVSVE9TIHJlY29yZGVyIGFuZCBnZXQgYSBGUkVFIHNpbmdsZS11c2VyDQogKiBsaWNlbnNlIGZvciBGcmVlUlRPUytUcmFjZSBQcm9mZXNzaW9uYWwgRWRpdGlvbi4gUmVhZCBtb3JlIGFib3V0IHRoaXMgb2ZmZXINCiAqIGF0IHd3dy5wZXJjZXBpby5jb20gb3IgY29udGFjdCB1cyBkaXJlY3RseSBhdCBzdXBwb3J0QHBlcmNlcGlvLmNvbS4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9XaW4zMikNCiAgICANCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgKHVsR2V0UnVuVGltZUNvdW50ZXJWYWx1ZSgpKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgMA0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCiAgICANCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAxICAvLyBQbGVhc2UgdXBkYXRlIGFjY29yZGluZyB0byB5b3VyIGhhcmR3YXJlLi4uDQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfSFdJbmRlcGVuZGVudCkNCiAgICANCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgMA0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgMQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDEgIC8vIFBsZWFzZSB1cGRhdGUgYWNjb3JkaW5nIHRvIHlvdXIgaGFyZHdhcmUuLi4NCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BdG1lbF9BVDkxU0FNNykNCg0KICAgIC8qIEhXVENfUEVSSU9EIGlzIGhhcmRjb2RlZCBmb3IgQVQ5MVNBTTdYMjU2LUVLIEJvYXJkICg0OCBNSHopDQogICAgQSBtb3JlIGdlbmVyaWMgc29sdXRpb24gaXMgdG8gZ2V0IHRoZSBwZXJpb2QgZnJvbSBweFBJVC0+UElUQ19QSU1SICovDQogICAgDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChBVDkxQ19CQVNFX1BJVEMtPlBJVENfUElJUiAmIDB4RkZGRkYpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCAyOTk1IA0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDEgIC8vIGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQXRtZWxfVUMzQTApIA0KICANCiAgICAvKiBGb3IgQXRtZWwgQVZSMzIgKEFUMzJVQzNBKSAqLw0KICANCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgc3lzcmVnX3JlYWQoQVZSMzJfQ09VTlQpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApDQogICAgI2RlZmluZSBIV1RDX0RJVklTT1IgMSAgICANCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDEgIC8vIGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQVJNX0NvcnRleE0pDQoNCiAgICAvKiBGb3IgYWxsIGNoaXBzIHVzaW5nIEFSTSBDb3J0ZXggTSBjb3JlcyAqLw0KDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fREVDUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UICgqKCh1aW50MzJfdCopMHhFMDAwRTAxOCkpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCAoKCoodWludDMyX3QqKTB4RTAwMEUwMTQpICsgMSkNCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAyDQogICAgDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMCAgLy8gbG93ZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudA0KDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX1JlbmVzYXNfUlg2MDApICAgIA0KDQogICAgI2luY2x1ZGUgImlvZGVmaW5lLmgiDQoNCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgKENNVDAuQ01DTlQpDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCAoKCgoY29uZmlnUEVSSVBIRVJBTF9DTE9DS19IWi9jb25maWdUSUNLX1JBVEVfSFopLTEpLzgpKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDEgIC8vIGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfTWljcm9jaGlwX2RzUElDX0FORF9QSUMyNCkgDQoNCiAgICAvKiBGb3IgTWljcm9jaGlwIFBJQzI0IGFuZCBkc1BJQyAoMTYgYml0KSAqLw0KDQogICAgLyogTm90ZTogVGhlIHRyYWNlIGxpYnJhcnkgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgZm9yIDMyLWJpdCBNQ1VzLCBhbmQgaXMgc2xvd2VyDQogICAgICAgdGhhbiBpbnRlbmRlZCBvbiAxNi1iaXQgTUNVcy4gU3RvcmluZyBhbiBldmVudCBvbiBhIFBJQzI0IHRha2VzIGFib3V0IDcwILVzLiANCiAgICAgICBJbiBjb21wYXJpc29uLCAzMi1iaXQgTUNVcyBhcmUgb2Z0ZW4gMTAtMjAgdGltZXMgZmFzdGVyLiBJZiByZWNvcmRpbmcgb3ZlcmhlYWQgDQogICAgICAgYmVjb21lcyBhIHByb2JsZW0gb24gUElDMjQsIHVzZSB0aGUgZmlsdGVycyB0byBleGNsdWRlIGxlc3MgaW50ZXJyZXN0aW5nIHRhc2tzIA0KICAgICAgIG9yIHN5c3RlbSBjYWxscy4gKi8NCg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVF9ESVJFQ1RJT04gRElSRUNUSU9OX0lOQ1JFTUVOVElORw0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAoVE1SMSkNCiAgICAjZGVmaW5lIEhXVENfUEVSSU9EIChQUjErMSkNCiAgICAjZGVmaW5lIEhXVENfRElWSVNPUiAxDQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwICAvLyBsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfTlhQX0xQQzIxMFgpDQogICAgLyogVU5PRkZJQ0lBTCBQT1JUIC0gTk9UIFlFVCBWRVJJRklFRCBCWSBQRVJDRVBJTyAqLw0KICAgIA0KICAgIC8qIFRlc3RlZCB3aXRoIExQQzIxMDYsIGJ1dCBzaG91bGQgd29yayB3aXRoIG1vc3QgTFBDMjFYWCBjaGlwcy4NCiAgICAgICBBc3N1bXB0aW9uOiBwcmVzY2FsZXIgaXMgMToxICh0aGlzIHNldHRpbmcgaXMgaGFyZGNvZGVkIGluIA0KICAgICAgIEZyZWVSVE9TIHBvcnQgZm9yIExQQzIxWFgpICovDQogICAgICANCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9JTkNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgICooKHVpbnQzMl90ICopMHhFMDAwNDAwOCApDQogICAgI2RlZmluZSBIV1RDX1BFUklPRCAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIA0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDEgICAgDQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwICAvLyBsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfVEVYQVNfSU5TVFJVTUVOVFNfVE1TNTcwKQ0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCg0KICAgICNkZWZpbmUgUlRJRlJDMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDMTApDQogICAgI2RlZmluZSBSVElDT01QMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDNTApDQogICAgI2RlZmluZSBSVElVRENQMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDNTQpDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChSVElGUkMwIC0gKFJUSUNPTVAwIC0gUlRJVURDUDApKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKFJUSVVEQ1AwKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDAgIC8vIGxvd2VyIGlycSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9URVhBU19JTlNUUlVNRU5UU19NU1A0MzApDQogICAgLyogVU5PRkZJQ0lBTCBQT1JUIC0gTk9UIFlFVCBWRVJJRklFRCBCWSBQRVJDRVBJTyAqLw0KDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fSU5DUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UIChUQTBSKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgY29uZmlnQ1BVX0NMT0NLU19QRVJfVElDSyAgICAgIA0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDEgIC8vIGhpZ2hlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfTUlDUk9DSElQX1BJQzMyKQ0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVF9ESVJFQ1RJT04gRElSRUNUSU9OX0lOQ1JFTUVOVElORw0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAoUmVhZFRpbWVyMSgpKSAgICAgLyogU2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBCU1AgKi8NCiAgICAjZGVmaW5lIEhXVENfUEVSSU9EIChSZWFkUGVyaW9kMSgpKzEpIC8qIFNob3VsZCBiZSBhdmFpbGFibGUgaW4gQlNQICovDQogICAgI2RlZmluZSBIV1RDX0RJVklTT1IgMQ0KDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMCAgLy8gbG93ZXIgaXJxIHByaW9yaXR5IHZhbHVlcyBhcmUgbW9yZSBzaWduaWZpY2FudA0KDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX1hJTElOWF9QUEM0MDUpIA0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVF9ESVJFQ1RJT04gRElSRUNUSU9OX0RFQ1JFTUVOVElORw0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAgbWZzcHIoIDB4M2RiKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDENCg0KICAgICNkZWZpbmUgSVJRX1BSSU9SSVRZX09SREVSIDAgIC8vIGxvd2VyIGlycSBwcmlvcml0eSB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQNCg0KI2VsaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9YSUxJTlhfUFBDNDQwKSANCiAgICAvKiBVTk9GRklDSUFMIFBPUlQgLSBOT1QgWUVUIFZFUklGSUVEIEJZIFBFUkNFUElPICovDQoNCiAgICAvKiBUaGlzIHNob3VsZCB3b3JrIHdpdGggbW9zdCBQb3dlclBDIGNoaXBzICovDQogICAgDQogICAgI2RlZmluZSBIV1RDX0NPVU5UX0RJUkVDVElPTiBESVJFQ1RJT05fREVDUkVNRU5USU5HDQogICAgI2RlZmluZSBIV1RDX0NPVU5UICBtZnNwciggMHgwMTYgKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDEgICAgDQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwICAvLyBsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQogICAgDQojZWxpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX1hJTElOWF9NSUNST0JMQVpFKQ0KICAgIC8qIFVOT0ZGSUNJQUwgUE9SVCAtIE5PVCBZRVQgVkVSSUZJRUQgQlkgUEVSQ0VQSU8gKi8NCg0KICAgIC8qIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCBtb3N0IE1pY3JvYmxhemUgY29uZmlndXJhdGlvbnMNCiAgICAgKiBUaGlzIHBvcnQgaXMgYmFzZWQgb24gdGhlIG9mZmljaWFsIEZyZWVSVE9TIE1pY3JvbGF6ZSBwb3J0IGFuZCBleGFtcGxlIGFwcGxpY2F0aW9uLg0KICAgICAqIEl0IHVzZXMgdGhlIEFYSSBUaW1lciAwIC0gdGhlIHRpY2sgaW50ZXJydXB0IHNvdXJjZS4NCiAgICAgKiBJZiBhbiBBWEkgVGltZXIgMCBwZXJpcGhlcmFsIGlzIGF2YWlsYWJsZSBvbiB5b3VyIGhhcmR3YXJlIHBsYXRmb3JtLCBubyBtb2RpZmljYXRpb25zIGFyZSByZXF1aXJlZC4NCiAgICAgKi8NCiAgICAjaW5jbHVkZSAieHRtcmN0cl9sLmgiDQoNCiAgICAjZGVmaW5lIEhXVENfQ09VTlRfRElSRUNUSU9OIERJUkVDVElPTl9ERUNSRU1FTlRJTkcNCiAgICAjZGVmaW5lIEhXVENfQ09VTlQgWFRtckN0cl9HZXRUaW1lckNvdW50ZXJSZWcoIFhQQVJfVE1SQ1RSXzBfQkFTRUFERFIsIDAgKQ0KICAgICNkZWZpbmUgSFdUQ19QRVJJT0QgKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKQ0KICAgICNkZWZpbmUgSFdUQ19ESVZJU09SIDE2DQoNCiAgICAjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwICAvLyBsb3dlciBpcnEgcHJpb3JpdHkgdmFsdWVzIGFyZSBtb3JlIHNpZ25pZmljYW50DQoNCiNlbGlmIChTRUxFQ1RFRF9QT1JUICE9IFBPUlRfTk9UX1NFVCkNCg0KICAgICNlcnJvciAiU0VMRUNURURfUE9SVCBoYWQgdW5zdXBwb3J0ZWQgdmFsdWUhIg0KICAgICNkZWZpbmUgU0VMRUNURURfUE9SVCBQT1JUX05PVF9TRVQNCg0KI2VuZGlmDQoNCiNpZiAoU0VMRUNURURfUE9SVCAhPSBQT1JUX05PVF9TRVQpDQogICAgDQogICAgI2lmbmRlZiBIV1RDX0NPVU5UX0RJUkVDVElPTg0KICAgICNlcnJvciAiSFdUQ19DT1VOVF9ESVJFQ1RJT04gaXMgbm90IHNldCEiDQogICAgI2VuZGlmIA0KICAgIA0KICAgICNpZm5kZWYgSFdUQ19DT1VOVA0KICAgICNlcnJvciAiSFdUQ19DT1VOVCBpcyBub3Qgc2V0ISIgICAgDQogICAgI2VuZGlmIA0KICAgIA0KICAgICNpZm5kZWYgSFdUQ19QRVJJT0QNCiAgICAjZXJyb3IgIkhXVENfUEVSSU9EIGlzIG5vdCBzZXQhIg0KICAgICNlbmRpZiANCiAgICANCiAgICAjaWZuZGVmIEhXVENfRElWSVNPUg0KICAgICNlcnJvciAiSFdUQ19ESVZJU09SIGlzIG5vdCBzZXQhIiAgICANCiAgICAjZW5kaWYgDQogICAgDQogICAgI2lmbmRlZiBJUlFfUFJJT1JJVFlfT1JERVINCiAgICAjZXJyb3IgIklSUV9QUklPUklUWV9PUkRFUiBpcyBub3Qgc2V0ISINCiAgICAjZWxpZiAoSVJRX1BSSU9SSVRZX09SREVSICE9IDApICYmIChJUlFfUFJJT1JJVFlfT1JERVIgIT0gMSkNCiAgICAjZXJyb3IgIklSUV9QUklPUklUWV9PUkRFUiBoYXMgYmFkIHZhbHVlISINCiAgICAjZW5kaWYgDQogICAgDQogICAgI2lmIChIV1RDX0RJVklTT1IgPCAxKQ0KICAgICNlcnJvciAiSFdUQ19ESVZJU09SIG11c3QgYmUgYSBub24temVybyBwb3NpdGl2ZSB2YWx1ZSEiDQogICAgI2VuZGlmIA0KDQojZW5kaWYNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDb25zb2xlTWVzc2FnZQ0KICoNCiAqIEEgd3JhcHBlciBmb3IgeW91ciBzeXN0ZW0tc3BlY2lmaWMgY29uc29sZSAicHJpbnRmIiBjb25zb2xlIG91dHB1dCBmdW5jdGlvbi4NCiAqIFRoaXMgbmVlZHMgdG8gYmUgY29ycmVjdGx5IGRlZmluZWQgdG8gc2VlIHN0YXR1cyByZXBvcnRzIGZyb20gdGhlIHRyYWNlIA0KICogc3RhdHVzIG1vbml0b3IgdGFzayAodGhpcyBpcyBkZWZpbmVkIGluIHRyY1VzZXIuYykuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgIA0KI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQXRtZWxfQVQ5MVNBTTcpDQovKiBQb3J0IHNwZWNpZmljIGluY2x1ZGVzICovDQojaW5jbHVkZSAiY29uc29sZS5oIg0KI2VuZGlmDQoNCiNkZWZpbmUgdlRyYWNlQ29uc29sZU1lc3NhZ2UgcHJpbnRmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlUG9ydEdldFRpbWVTdGFtcA0KICoNCiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBiYXNlZCBvbiB0aGUgSFdUQyBtYWNyb3Mgd2hpY2ggcHJvdmlkZSBhIGhhcmR3YXJlDQogKiBpc29sYXRpb24gbGF5ZXIgdG93YXJkcyB0aGUgaGFyZHdhcmUgdGltZXIvY291bnRlci4NCiAqDQogKiBUaGUgSFdUQyBtYWNyb3MgYW5kIHVpVHJhY2VQb3J0R2V0VGltZVN0YW1wIGlzIHRoZSBtYWluIHBvcnRpbmcgaXNzdWUNCiAqIG9yIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5LiBUeXBpY2FsbHkgeW91IHNob3VsZCBub3QgbmVlZCB0byBjaGFuZ2UNCiAqIHRoZSBjb2RlIG9mIHVpVHJhY2VQb3J0R2V0VGltZVN0YW1wIGlmIHVzaW5nIHRoZSBIV1RDIG1hY3Jvcy4NCiAqDQogKiBPRkZFUiBGUk9NIFBFUkNFUElPOg0KICogRm9yIHNpbGljb24gY29tcGFuaWVzIGFuZCBub24tY29ycG9yYXRlIEZyZWVSVE9TIHVzZXJzIChyZXNlYXJjaGVycywgDQogKiBzdHVkZW50cywgaG9iYnlpc3RzIG9yIGVhcmx5LXBoYXNlIHN0YXJ0dXBzKSB3ZSBoYXZlIGFuIGF0dHJhY3RpdmUgb2ZmZXI6IA0KICogUHJvdmlkZSBhIGhhcmR3YXJlIHRpbWVyIHBvcnQgYW5kIGdldCBhIEZSRUUgc2luZ2xlLXVzZXIgbGljZW5jZSBmb3INCiAqIEZyZWVSVE9TK1RyYWNlIFByb2Zlc3Npb25hbCBFZGl0aW9uLiBSZWFkIG1vcmUgYWJvdXQgdGhpcyBvZmZlciBhdCANCiAqIHd3dy5wZXJjZXBpby5jb20gb3IgY29udGFjdCB1cyBkaXJlY3RseSBhdCBzdXBwb3J0QHBlcmNlcGlvLmNvbS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHVpVHJhY2VQb3J0R2V0VGltZVN0YW1wKHVpbnQzMl90ICpwdWlUaW1lc3RhbXApOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlUG9ydEVuZA0KICogDQogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSByZWNvcmRlciBpcyBzdG9wcGVkIGR1ZSB0byBmdWxsIGJ1ZmZlci4NCiAqIE1haW5seSBpbnRlbmRlZCB0byBzaG93IGEgbWVzc2FnZSBpbiB0aGUgY29uc29sZS4NCiAqIFRoaXMgaXMgdXNlZCBieSB0aGUgV2luMzIgcG9ydCB0byBzdG9yZSB0aGUgdHJhY2UgdG8gYSBmaWxlLiBUaGUgZmlsZSBwYXRoIGlzDQogKiBzZXQgdXNpbmcgdlRyYWNlUG9ydFNldEZpbGVOYW1lLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlUG9ydEVuZCh2b2lkKTsNCg0KI2lmIChJTkNMVURFX1NBVkVfVE9fRklMRSA9PSAxKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlUG9ydFNldE91dEZpbGUNCiAqDQogKiBTZXRzIHRoZSBmaWxlbmFtZS9wYXRoIHVzZWQgaW4gdlRyYWNlUG9ydFNhdmUuDQogKiBUaGlzIGlzIHNldCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLCBzaW5jZSB0aGUgV2luMzIgcG9ydCBjYWxscyB2VHJhY2VQb3J0U2F2ZQ0KICogaW4gdlRyYWNlUG9ydEVuZCBpZiBXSU4zMl9QT1JUX1NBVkVfV0hFTl9TVE9QUEVEIGlzIHNldC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVBvcnRTZXRPdXRGaWxlKGNoYXIqIHBhdGgpOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VQb3J0U2F2ZQ0KICoNCiAqIFNhdmVzIHRoZSB0cmFjZSB0byBhIGZpbGUgb24gYSB0YXJnZXQtc2lkZSBmaWxlIHN5c3RlbS4gVGhlIHBhdGggaXMgc2V0IGluIGEgDQogKiBzZXBhcmF0ZSBmdW5jdGlvbiwgdlRyYWNlUG9ydFNldE91dEZpbGUsIHNpbmNlIHRoZSBXaW4zMiBwb3J0IG1heSBjYWxsDQogKiB2VHJhY2VQb3J0U2F2ZSBpbiB2VHJhY2VQb3J0RW5kLCBpZiB1c2luZyBXSU4zMl9QT1JUX1NBVkVfV0hFTl9TVE9QUEVELg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlUG9ydFNhdmUodm9pZCk7DQoNCiNlbmRpZg0KDQojZW5kaWYNCg==