LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0NTAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0NTAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAxNy4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTSANCiAqIHByb2Nlc3NvciBiYXNlZCBtaWNyb2NvbnRyb2xsZXJzLiAgVGhpcyBmaWxlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgDQogKiB3aXRoaW4gZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBhcmUgc3VwcG9ydGluZyBzdWNoIEFSTSBiYXNlZCBwcm9jZXNzb3JzLiANCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAic3lzdGVtX1hNQzQ1MDAuaCINCiNpbmNsdWRlIDxYTUM0NTAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTEJCQkJIA0KI2RlZmluZSBISUJfQ0xPQ0tfT1NDVUxQCQkJCTINCg0KDQoNCg0KLyoNCi8vLS0tLS0tLS0gPDw8IFVzZSBDb25maWd1cmF0aW9uIFdpemFyZCBpbiBDb250ZXh0IE1lbnUgPj4+IC0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCg0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhdGNoZG9nIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBXYXRjaGRvZyBDb25maWd1cmF0aW9uDQovLyAgICAgPG8xLjA+IERpc2FibGUgV2F0Y2hkb2cNCi8vDQovLyA8L2U+DQoqLw0KI2RlZmluZSBXRFRfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lIFdEVEVOQl9uVmFsICAgICAgICAgICAgIDB4MDAwMDAwMDENCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0xPQ0sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IE1haW4gQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiBDUFUgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZDUFUgPSBmU1lTIA0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZQlTQ1VfQ1BVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQojZGVmaW5lCVNDVV9QQkNMS0NSX0RJVgkJICAgIDB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX0NDVUNMS0NSX0RJVgkJMHgwMDAwMDAwMA0KLyogbm90IGF2YWxpYmxlIGluIGNvbmZpZyB3aXp6YXJkKi8NCi8qCQkJCQ0KKiBtYW5kYXRvcnkgY2xvY2sgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgkJCQkNCioJCQkJDQoqIHNvdXJjZSBmb3IgY2xvY2sgZ2VuZXJhdGlvbgkJCQkNCiogcmFuZ2U6IFNDVV9DTE9DS19DUllTVEFMIChjcnlzdGFsIG9yIGV4dGVybmFsIGNsb2NrIGF0IGNyeXN0YWwgaW5wdXQpCQkJCQ0KKgkJCQkNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCQkNCi8vIFNlbGVjdGlvbiBvZiBpbXB1dCBsb2NrIGZvciBQTEwJCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQkxMjAwMDAwMDANCiNkZWZpbmUJQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kJMTIwMDAwMDAJCQ0KI2RlZmluZQlDTE9DS19CQUNLX1VQCQkJCQkJMjQwMDAwMDAJCQ0KCQkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBPU0NfSFAgc2V0dXAgcGFyYW1ldGVycyAqLwkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfT1NDX0hQX01PREUJMHhGMA0KI2RlZmluZQlTQ1VfT1NDSFBXREdESVYJMgkJDQoJCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIE1BSU4gUExMIHNldHVwIHBhcmFtZXRlcnMgKi8JCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vRGl2aWRlciBzZXR0aW5ncyBmb3IgZXh0ZXJuYWwgY3J5c3RhbCBAIDEyIE1IeiANCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxDQojZGVmaW5lIAlTQ1VfUExMX0syRElWCTMNCiNkZWZpbmUgCVNDVV9QTExfUERJVgkxDQojZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkNCgkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciB1c2Ugb2YgYmFja3VwIGNsb2NrIHNvdXJjZSB0cmltbWVkDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxCQkNCi8vI2RlZmluZSAJU0NVX1BMTF9LMkRJVgkzCQkNCi8vI2RlZmluZSAJU0NVX1BMTF9QRElWCTMJCQ0KLy8jZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQiBDTE9DSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBVU0IgQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8NCi8vIDwvZT4NCi8vIA0KKi8NCg0KI2RlZmluZSBTQ1VfVVNCX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KI2RlZmluZSAJU0NVX1VTQlBMTF9QRElWCTAJCQ0KI2RlZmluZSAJU0NVX1VTQlBMTF9ORElWCTMxCQkNCiNkZWZpbmUgCVNDVV9VU0JESVYJMwkJDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4zPiAgIEZsYXNoIFdhaXQgU3RhdGUNCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiAzIFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gNCBXUw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IDUgV1MgICAgIA0KLy8JCQkJCQkJCQkJIDwzPT4gNiBXUw0KLy8gPC9lPg0KLy8gDQoqLw0KDQojZGVmaW5lIFBNVV9GTEFTSCAgICAgICAgICAgICAxDQojZGVmaW5lCVBNVV9GTEFTSF9XUwkJCQkJMHgwMDAwMDAwMA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLT1VUIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBDbG9jayBPVVQgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiAgIENsb2Nrb3V0IFNvdXJjZSBTZWxlY3Rpb24NCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBTeXN0ZW0gQ2xvY2sNCi8vICAgICAgICAgICAgICAgICAgICAgPDI9PiBEaXZpZGVkIHZhbHVlIG9mIFVTQiBQTEwgb3V0cHV0DQovLyAgICAgICAgICAgICAgICAgICAgIDwzPT4gRGl2aWRlZCB2YWx1ZSBvZiBQTEwgQ2xvY2sNCi8vICAgICA8bzIuMC4uND4gICBDbG9ja291dCBkaXZpZGVyIDwxLTEwPjwjLTE+DQovLyAgICAgPG8zLjAuLjE+ICAgQ2xvY2tvdXQgUGluIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFAxLjE1DQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gUDAuOA0KLy8gICAgICAgICAgICAgICAgICAgICANCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLT1VUX1NFVFVQICAgICAgICAgICAgICAgMA0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfU09VUkNFCQkweDAwMDAwMDAzDQojZGVmaW5lCVNDVV9DTE9DS09VVF9ESVYJCTB4MDAwMDAwMDkNCiNkZWZpbmUJU0NVX0NMT0NLT1VUX1BJTgkJMHgwMDAwMDAwMQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANCnVpbnQzMl90IFN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0ZTWVM7DQojZWxzZQ0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfQkFDS19VUDsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgc3RhdGljIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCiNpZiAoU0NVX1VTQl9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBVU0JDbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCg0KLyoqDQogICogQGJyaWVmICBTZXR1cCB0aGUgbWljcm9jb250cm9sbGVyIHN5c3RlbS4NCiAgKiAgICAgICAgIEluaXRpYWxpemUgdGhlIFBMTCBhbmQgdXBkYXRlIHRoZSANCiAgKiAgICAgICAgIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtSW5pdCh2b2lkKQ0Kew0KaW50IHRlbXA7DQoJDQojaWYgKF9fRlBVX1BSRVNFTlQgPT0gMSkgJiYgKF9fRlBVX1VTRUQgPT0gMSkNClNDQi0+Q1BBQ1IgfD0gKCgzVUwgPDwgMTAqMikgfCAgICAgICAgICAgICAgICAgLyogc2V0IENQMTAgRnVsbCBBY2Nlc3MgKi8NCiAgICAgICAgICAgICAgICgzVUwgPDwgMTEqMikgICk7ICAgICAgICAgICAgICAgLyogc2V0IENQMTEgRnVsbCBBY2Nlc3MgKi8NCiNlbmRpZg0KDQovKiBFbmFibGUgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgLSBTQ0JfQ0NSLlVOQUxJR05fVFJQID0gMCAqLw0KU0NCLT5DQ1IgJj0gfihTQ0JfQ0NSX1VOQUxJR05fVFJQX01zayk7DQoJDQovKiBTZXR1cCB0aGUgV0RUICovDQojaWYgV0RUX1NFVFVQDQoNCldEVC0+Q1RSICY9IH5XRFRFTkJfblZhbDsgDQoNCiNlbmRpZg0KDQovKiBTZXR1cCB0aGUgRmxhc2ggV2FpdCBTdGF0ZSAqLw0KI2lmIFBNVV9GTEFTSA0KdGVtcCA9IEZMQVNIMC0+RkNPTjsgDQp0ZW1wICY9IH5GTEFTSF9GQ09OX1dTUEZMQVNIX01zazsNCnRlbXAgfD0gUE1VX0ZMQVNIX1dTKzM7DQpGTEFTSDAtPkZDT04gPSB0ZW1wOw0KI2VuZGlmDQoNCgkNCi8qIFNldHVwIHRoZSBjbG9ja291dCAqLw0KI2lmIFNDVV9DTE9DS09VVF9TRVRVUA0KDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfU09VUkNFOw0KLypzZXQgUExMIGRpdiBmb3IgY2xrb3V0ICovDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfRElWPDwxNjsNCg0KaWYgKFNDVV9DTE9DS09VVF9QSU4pIHsNCgkJCQkJCVBPUlQwLT5JT0NSOCA9IDB4MDAwMDAwODg7ICAgLypQMC44IC0tPiBBTFQxIHNlbGVjdCArICBIV1NFTCAqLw0KCQkJCQkgICAgUE9SVDAtPkhXU0VMICY9ICh+UE9SVDBfSFdTRUxfSFc4X01zayk7DQoJCQkJCSAgICAvL1BPUlQwLT5QRFIxICY9ICh+UE9SVDBfUERSMV9QRDhfTXNrKTsgIC8qc2V0IHRvIHN0cm9uZyBkcml2ZXIgKi8NCgkJCQkJCX0NCmVsc2Ugew0KCQlQT1JUMS0+SU9DUjEyID0gMHg4ODAwMDAwMDsgICAgICAgICAgICAgICAgICAgIC8qUDEuMTUtLT4gQUxUMSBzZWxlY3QgKi8NCgkgICAgLy9QT1JUMS0+UERSMSAmPSAoflBPUlQxX1BEUjFfUEQxNV9Nc2spOyAgLypzZXQgdG8gc3Ryb25nIGRyaXZlciAqLw0KCQl9DQoNCiNlbmRpZg0KDQoNCi8qIFNldHVwIHRoZSBTeXN0ZW0gY2xvY2sgKi8gDQojaWYgU0NVX0NMT0NLX1NFVFVQDQpTeXN0ZW1DbG9ja1NldHVwKCk7DQojZW5kaWYNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIENsb2NrIFZhcmlhYmxlIGRlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KU3lzdGVtQ29yZUNsb2NrVXBkYXRlKCk7LyohPCBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IChDb3JlIENsb2NrKSovDQoNCg0KLyogU2V0dXAgdGhlIFVTQiBQTCAqLyANCiNpZiBTQ1VfVVNCX0NMT0NLX1NFVFVQDQpVU0JDbG9ja1NldHVwKCk7DQojZW5kaWYNCg0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFVwZGF0ZSBTeXN0ZW1Db3JlQ2xvY2sgYWNjb3JkaW5nIHRvIENsb2NrIFJlZ2lzdGVyIFZhbHVlcw0KICAqIEBub3RlICAgLSAgDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFN5c3RlbUNvcmVDbG9ja1VwZGF0ZSh2b2lkKQ0Kew0KdW5zaWduZWQgaW50IFBESVY7DQp1bnNpZ25lZCBpbnQgTkRJVjsNCnVuc2lnbmVkIGludCBLMkRJVjsNCnVuc2lnbmVkIGludCBsb25nIFZDTzsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQppZiAoU0NVX0NMSy0+U1lTQ0xLQ1IgPT0gIDB4MDAwMTAwMDApDQp7DQoJaWYgKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spew0KCQkvKiBjaGVjayBpZiBQTEwgaXMgbG9ja2VkICovDQoJCS8qIHJlYWQgYmFjayBkaXZpZGVyIHNldHRpbmdzICovDQoJCSBQRElWID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX1BESVZfTXNrKT4+MjQpKzE7DQoJCSBORElWID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX05ESVZfTXNrKT4+OCkrMTsNCgkJIEsyRElWICA9ICgoU0NVX1BMTC0+UExMQ09OMSAmIFNDVV9QTExfUExMQ09OMV9LMkRJVl9Nc2spPj4xNikrMTsNCg0KCQlpZihTQ1VfUExMLT5QTExDT04yICYgU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2spew0KCQkvKiB0aGUgc2VsZWN0ZWQgY2xvY2sgaXMgdGhlIEJhY2t1cCBjbG9jayBmb2ZpICovDQoJCVZDTyA9IChDTE9DS19CQUNLX1VQL1BESVYpKk5ESVY7DQoJCVN5c3RlbUNvcmVDbG9jayA9IFZDTy9LMkRJVjsNCgkJLyogaW4gY2FzZSB0aGUgc3lzY2xvY2sgZGl2IGlzIHVzZWQgKi8NCgkJU3lzdGVtQ29yZUNsb2NrID0gU3lzdGVtQ29yZUNsb2NrLygoU0NVX0NMSy0+U1lTQ0xLQ1IgJiBTQ1VfQ0xLX1NZU0NMS0NSX1NZU0RJVl9Nc2spKzEpOw0KCQkNCgkJfQ0KCQllbHNlDQoJCXsNCgkJLyogdGhlIHNlbGVjdGVkIGNsb2NrIGlzIHRoZSBQTEwgZXh0ZXJuYWwgb3NjaWxsYXRvciAqLwkJDQoJCVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS9QRElWKSpORElWOw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBWQ08vSzJESVY7DQoJCS8qIGluIGNhc2UgdGhlIHN5c2Nsb2NrIGRpdiBpcyB1c2VkICovDQoJCVN5c3RlbUNvcmVDbG9jayA9IFN5c3RlbUNvcmVDbG9jay8oKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNESVZfTXNrKSsxKTsNCgkJfSANCgkNCgkNCgl9DQp9DQplbHNlDQp7DQpTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19CQUNLX1VQOw0KfQ0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0gIA0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KI2lmIChTQ1VfQ0xPQ0tfU0VUVVAgPT0gMSkNCnN0YXRpYyBpbnQgU3lzdGVtQ2xvY2tTZXR1cCh2b2lkKQ0Kew0KaW50IHRlbXA7DQp1bnNpZ25lZCBpbnQgbG9uZyBWQ089MDsNCmludCBzdGVwcGluZ19LMkRJVjsJDQoNCi8qIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkNCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCgkNCi8qIGNoZWNrIGlmIFBMTCBpcyBzd2l0Y2hlZCBvbiAqLw0KaWYgKChTQ1VfUExMLT5QTExDT04wICYoU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zaykpICE9IDApew0KLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICBTQ1VfUExMLT5QTExDT04wICY9IH4oU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zayk7DQoNCn0NCg0KLyogRW5hYmxlIE9TQ19IUCBpZiBub3QgYWxyZWFkeSBvbiovDQogIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKQ0KICB7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGV4dGVybmFsIGNyeXN0YWwgZm9yIFBMTCBjbG9jayBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KICAgaWYgKFNDVV9PU0MtPk9TQ0hQQ1RSTCAmIFNDVV9PU0NfT1NDSFBDVFJMX01PREVfTXNrKXsNCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgJj0gfihTQ1VfT1NDX0hQX01PREUpOwkgLyplbmFibGUgdGhlIE9TQ19IUCovDQoJICAgLyogc2V0dXAgT1NDIFdERyBkZXZpZGVyICovDQoJICAgU0NVX09TQy0+T1NDSFBDVFJMIHw9IChTQ1VfT1NDSFBXREdESVY8PDE2KTsgICAgICAgICANCgkgICAvKiBzZWxlY3QgZXh0ZXJuYWwgT1NDIGFzIFBMTCBpbnB1dCAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjIgJj0gflNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KCSAgIC8qIHJlc3RhcnQgT1NDIFdhdGNoZG9nICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ1JFU19Nc2s7ICANCg0KICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vcCB+MTUwbXMgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDUwMDAwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLwkJICANCgkgICBkbyANCgkgICB7DQogICAgICAgOy8qIHdhaXQgZm9yIH4xNTBtcyAgKi8NCgkgICB9d2hpbGUoKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkmJihTeXNUaWNrLT5WQUwgPj0gNTAwKSk7IA0KDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgaWYgKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkNCgkgICByZXR1cm4oMCk7LyogUmV0dXJuIEVycm9yICovDQoNCiAgICB9DQogIH0NCiAgZWxzZSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKQ0KCXsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgZmFjdG9yeSB0cmltbWluZyBCYWNrLXVwIGNsb2NrIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCS8qIFBMTCBCYWNrIHVwIGNsb2NrIHNlbGVjdGVkICovDQoJCVNDVV9QTEwtPlBMTENPTjIgfD0gU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoJCQkNCgl9DQogIGVsc2UgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKQ0KICB7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGF1dG9tYXRpYyB0cmltbWluZyBCYWNrLXVwIGNsb2NrIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogY2hlY2sgZm9yIEhJQiBEb21haW4gZW5hYmxlZCAgKi8NCglpZigoU0NVX1BPV0VSLT5QV1JTVEFUICYgU0NVX1BPV0VSX1BXUlNUQVRfSElCRU5fTXNrKSA9PSAwKQ0KCQlTQ1VfUE9XRVItPlBXUlNFVCB8PSBTQ1VfUE9XRVJfUFdSU0VUX0hJQl9Nc2s7IC8qZW5hYmxlIEhpYmVybmF0ZSBkb21haW4qLw0KDQogICAvKiBjaGVjayBmb3IgSElCIERvbWFpbiBpcyBub3QgaW4gcmVzZXQgc3RhdGUgICovDQoJaWYgKChTQ1VfUkVTRVQtPlJTVFNUQVQgJiBTQ1VfUkVTRVRfUlNUU1RBVF9ISUJSU19Nc2spPT0gMSkNCgkgICAgU0NVX1JFU0VULT5SU1RDTFIgfD0gU0NVX1JFU0VUX1JTVENMUl9ISUJSU19Nc2s7IC8qZGUtYXNzZXJ0IGhpYmVybmF0ZSByZXNldCovDQoNCgkJCS8qIFBMTCBCYWNrIHVwIGNsb2NrIHNlbGVjdGVkICovDQoJCVNDVV9QTEwtPlBMTENPTjIgfD0gU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoJDQoJCWlmIChTQ1VfU1RBTkRCWV9DTE9DSyA9PSBISUJfQ0xPQ0tfRk9TSSkNCgkJCXsNCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLyogICBVc2UgZk9TSSBhcyBzb3VyY2Ugb2YgdGhlIHN0YW5kYnkgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgJj0gflNDVV9ISUJFUk5BVEVfSERDUl9TVERCWVNFTF9Nc2s7DQoJCQkNCgkJCVNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9GT1RSX01zazsNCgkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoNCgkJCVNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX0FPVFJFTl9Nc2s7DQoJCQl9DQoJCWVsc2UgaWYgKFNDVV9TVEFOREJZX0NMT0NLID09IEhJQl9DTE9DS19PU0NVTFApDQoJCQl7DQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCS8qICAgVXNlIGZVTFAgYXMgc291cmNlIG9mIHRoZSBzdGFuZGJ5IGNsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCS8qY2hlY2sgT1NDVUwgaWYgcnVubmluZyBjb3JyZWN0Ki8NCgkJCWlmICgoU0NVX0hJQkVSTkFURS0+T1NDVUxDVFJMICYgU0NVX0hJQkVSTkFURV9PU0NVTENUUkxfTU9ERV9Nc2spIT0gMCkNCgkJCQl7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfT1NDVUxDVFJMX01zayk7DQoNCgkJCQkJU0NVX0hJQkVSTkFURS0+T1NDVUxDVFJMICY9IH5TQ1VfSElCRVJOQVRFX09TQ1VMQ1RSTF9NT0RFX01zazsgLyplbmFibGUgT1NDVUwqLw0KCQkJCQkvKm5vdyBjZWNrIGlmIHRoZSBjbG9jayBpcyBPSyB1c2luZyBPU0NVTFAgT3NjaWxsYXRvciBXYXRjaGRvZyAoVUxQV0RHKSovDQoJCQkJCS8qIHNlbGVjdCBPU0NVTCBjbG9jayBmb3IgUlRDKi8NCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ1JfUkNTX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENSX01zayk7DQoJCQkJCS8qZW5hYmxlIE9TQ1VMUCBXREcgQWxhcm0gRW5hYmxlKi8NCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ1JfVUxQV0RHRU5fTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCgkJCQkJLyp3YWl0IG5vdyBmb3IgY2xvY2sgaXMgc3RhYmxlICovDQoJCQkJCWRvDQoJCQkJCXsNCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDTFIgfD0gU0NVX0hJQkVSTkFURV9IRENMUl9VTFBXREdfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ0xSX01zayk7DQoJCQkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoJCQkJCX0NCgkJCQkJd2hpbGUgKChTQ1VfSElCRVJOQVRFLT5IRFNUQVQgJiBTQ1VfSElCRVJOQVRFX0hEU1RBVF9VTFBXREdfTXNrKT09U0NVX0hJQkVSTkFURV9IRFNUQVRfVUxQV0RHX01zayk7IA0KDQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ0xSIHw9IFNDVV9ISUJFUk5BVEVfSERDTFJfVUxQV0RHX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENMUl9Nc2spOw0KCQkJCX0JDQoJCQkvLyBub3cgT1NDVUxQIGlzIHJ1bm5pbmcgYW5kIGNhbiBiZSB1c2VkCSAJIA0KCQkJU0NVX0hJQkVSTkFURS0+SERDUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ1JfU1REQllTRUxfTXNrOw0KCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENSX01zayk7DQoJCQkNCgkJCVNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9GT1RSX01zazsNCgkJCS8qVFJJQUwgZm9yIGRlbGF5IGxvb3AqLw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCgkJCQ0KCQkJU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfQU9UUkVOX01zazsNCgkJCS8qVFJJQUwgZm9yIGRlbGF5IGxvb3AqLw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCgkJCQ0KCQkJfQ0KICB9DQoNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBTZXR1cCBhbmQgbG9vayB0aGUgbWFpbiBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KaWYgKCEoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykpew0KCS8qIFN5c3RlbiBpcyBzdGlsbCBydW5uaW5nIGZyb20gaW50ZXJuYWwgY2xvY2sgKi8NCgkJICAgLyogc2VsZWN0IEZPRkkgYXMgc3lzdGVtIGNsb2NrICovDQoJCSAgIGlmKChTQ1VfQ0xLLT5TWVNDTEtDUiAmIFNDVV9DTEtfU1lTQ0xLQ1JfU1lTU0VMX01zaykgIT0gMHgwKVNDVV9DTEstPlNZU0NMS0NSICY9IH5TQ1VfQ0xLX1NZU0NMS0NSX1NZU1NFTF9Nc2s7IC8qU2VsZWN0IEZPRkkqLw0KDQoNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCSANCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vMjQwMDAwMDApLTE7CQ0KCQkJIC8qIEdvIHRvIGJ5cGFzcyB0aGUgTWFpbiBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfVkNPQllQX01zazsNCgkJICAgLyogZGlzY29ubmVjdCBPU0NfSFAgdG8gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX0ZJTkRJU19Nc2s7DQoJCSAgIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSAgIC8qIHdlIG1heSBoYXZlIHRvIHNldCBPU0NESVNDRElTICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX09TQ0RJU0NESVNfTXNrOw0KCQkgICAvKiBjb25uZWN0IE9TQ19IUCB0byBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZJTkRJU19Nc2s7DQoJCSAgIC8qIHJlc3RhcnQgUExMIExvY2sgZGV0ZWN0aW9uICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX1JFU0xEX01zazsNCgkJICAgLyogd2FpdCBmb3IgUExMIExvY2sgKi8NCgkJICAgLyogc2V0dXAgdGltZSBvdXQgbG9vcCAqLw0KCSAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvbyB+MTUwbXMgKi8NCgkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgICBTeXNUaWNrLT5MT0FEICA9ICgoNTAwMDAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCQkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovCQkgIA0KCQkgICANCgkJICAgd2hpbGUgKCghKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsNCgkgICAgICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoNCgkJICAgaWYgKChTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKT09U0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKQ0KCQkgICAJCXsNCgkJCQkvKiBHbyBiYWNrIHRvIHRoZSBNYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9WQ09CWVBfTXNrOw0KCQkJCX0NCgkJCQllbHNlIHJldHVybigwKTsNCgkJIA0KCQ0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkgICBoZXJlIHdlIG5lZWQgdG8gc2V0dXAgdGhlIHN5c3RlbSBjbG9jayBkaXZpZGVyDQoJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQ0KCQlTQ1VfQ0xLLT5DUFVDTEtDUiA9IFNDVV9DUFVDTEtDUl9ESVY7DQoJCVNDVV9DTEstPlBCQ0xLQ1IgPSBTQ1VfUEJDTEtDUl9ESVY7CQ0KCQlTQ1VfQ0xLLT5DQ1VDTEtDUiA9IFNDVV9DQ1VDTEtDUl9ESVY7DQoJDQoNCgkJIC8qIFN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovDQoJICAgU0NVX0NMSy0+U1lTQ0xLQ1IgfD0gIDB4MDAwMTAwMDA7IA0KCQkJCQ0KCSAgIC8qIHdlIG1heSBoYXZlIHRvIHJlc2V0IE9TQ0RJU0NESVMgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDRElTQ0RJU19Nc2s7DQoJCQkJDQoJCQkJCQkJCQkJCQkJCQkJICANCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgU3lzVGljay0+TE9BRCAgPSAoKDEyNTArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCQkgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJCSBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkJCQkJCQkJCQkgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkNCgkJIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCQkgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgdGhlIHJhbXAgdXAgb2YgdGhlIHN5c3RlbSBjbG9jayBzdGFydHMgRlN5cyA8IDYwTUh6DQoJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQlpZiAoQ0xPQ0tfRlNZUyA+IDYwMDAwMDAwKXsNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCSANCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vNjAwMDAwMDApLTE7CQ0KDQoJCQkgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgfQ0KCQkgZWxzZQ0KCQkgew0KCQkJCS8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgkJCSAgcmV0dXJuKDEpOw0KCQkgfQ0KDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoMzAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsNCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkNCgkgICB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB0aGUgcmFtcCB1cCBvZiB0aGUgc3lzdGVtIGNsb2NrIHN0YXJ0cyBGU3lzIDwgOTBNSHoNCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCWlmIChDTE9DS19GU1lTID4gOTAwMDAwMDApew0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoNCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vOTAwMDAwMDApLTE7CQkJDQoNCgkJCSAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSB9DQoJCSBlbHNlDQoJCSB7DQoJCQkJLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJICAgICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgkJCQlyZXR1cm4oMSk7DQoJCSB9DQoJDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNDgwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsNCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkNCgkgICB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQoJICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkgICBTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJDQoJICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgl9DQogfS8qIGVuZCB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8JDQogICByZXR1cm4oMSk7DQoNCn0NCiNlbmRpZg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0gIA0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KI2lmIChTQ1VfVVNCX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFVTQkNsb2NrU2V0dXAodm9pZCkNCnsNCi8qIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkNCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCg0KCS8qIGNoZWNrIGlmIFBMTCBpcyBzd2l0Y2hlZCBvbiAqLw0KaWYgKChTQ1VfUExMLT5VU0JQTExDT04gJihTQ1VfUExMX1VTQlBMTENPTl9WQ09QV0RfTXNrIHwgU0NVX1BMTF9VU0JQTExDT05fUExMUFdEX01zaykpICE9IDApew0KCS8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgU0NVX1BMTC0+VVNCUExMQ09OICY9IH4oU0NVX1BMTF9VU0JQTExDT05fVkNPUFdEX01zayB8IFNDVV9QTExfVVNCUExMQ09OX1BMTFBXRF9Nc2spOw0KfQ0KDQovKiBjaGVjayBhbmQgaWYgbm90IGFscmVhZHkgcnVubmluZyBlbmFibGUgT1NDX0hQICovDQogICBpZiAoU0NVX09TQy0+T1NDSFBDVFJMICYgU0NVX09TQ19PU0NIUENUUkxfTU9ERV9Nc2spew0KCQkgLyogY2hlY2sgaWYgTWFpbiBQTEwgaXMgc3dpdGNoZWQgb24gZm9yIE9TQyBXRCovDQoJCSBpZiAoKFNDVV9QTEwtPlBMTENPTjAgJihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKSkgIT0gMCl7DQoJCQkvKiBlbmFibGUgUExMIGZpcnN0ICovDQogIAkJCVNDVV9QTEwtPlBMTENPTjAgJj0gfihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKTsNCgkJIH0NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgJj0gfihTQ1VfT1NDX0hQX01PREUpOwkgLyplbmFibGUgdGhlIE9TQ19IUCovDQoJICAgLyogc2V0dXAgT1NDIFdERyBkZXZpZGVyICovDQoJICAgU0NVX09TQy0+T1NDSFBDVFJMIHw9IChTQ1VfT1NDSFBXREdESVY8PDE2KTsgICAgICAgICANCgkgICAvKiByZXN0YXJ0IE9TQyBXYXRjaGRvZyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NSRVNfTXNrOyAgDQoJDQogICAgICAgLyogVGltZW91dCBmb3Igd2FpdCBsb29wIH4xNTBtcyAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNTAwMDAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovCQkgIA0KCSAgIGRvIA0KCSAgIHsNCiAgICAgICA7Lyogd2FpdCBmb3IgfjE1MG1zICAqLw0KCSAgIH13aGlsZSgoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsgDQoNCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICBpZiAoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKQ0KCSAgIHJldHVybigwKTsvKiBSZXR1cm4gRXJyb3IgKi8NCgkNCiAgfQ0KDQoNCi8qIFNldHVwIFVTQiBQTEwgKi8NCiAgIC8qIEdvIHRvIGJ5cGFzcyB0aGUgTWFpbiBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9WQ09CWVBfTXNrOw0KICAgLyogZGlzY29ubmVjdCBPU0NfRkkgdG8gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fRklORElTX01zazsNCiAgIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gPSAoKFNDVV9VU0JQTExfTkRJVjw8OCkgfCAoU0NVX1VTQlBMTF9QRElWPDwyNCkpOw0KICAgLyogU2V0dXAgVVNCRElWIHNldHRpbmdzIFVTQiBjbG9jayAqLw0KICAgU0NVX0NMSy0+VVNCQ0xLQ1IgPSBTQ1VfVVNCRElWOw0KICAgLyogd2UgbWF5IGhhdmUgdG8gc2V0IE9TQ0RJU0NESVMgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9PU0NESVNDRElTX01zazsNCiAgIC8qIGNvbm5lY3QgT1NDX0ZJIHRvIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OICY9IH5TQ1VfUExMX1VTQlBMTENPTl9GSU5ESVNfTXNrOw0KICAgLyogcmVzdGFydCBQTEwgTG9jayBkZXRlY3Rpb24gKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9SRVNMRF9Nc2s7DQogICAvKiB3YWl0IGZvciBQTEwgTG9jayAqLw0KICAgd2hpbGUgKCEoU0NVX1BMTC0+VVNCUExMU1RBVCAmIFNDVV9QTExfVVNCUExMU1RBVF9WQ09MT0NLX01zaykpOw0KCQ0KICB9LyogZW5kIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkgIA0KICAgcmV0dXJuKDEpOw0KDQp9DQojZW5kaWYNCg0K