LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0MjAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0MDAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAyNi4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTQ0KICogcHJvY2Vzc29yIGJhc2VkIG1pY3JvY29udHJvbGxlcnMuICBUaGlzIGZpbGUgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZA0KICogd2l0aGluIGRldmVsb3BtZW50IHRvb2xzIHRoYXQgYXJlIHN1cHBvcnRpbmcgc3VjaCBBUk0gYmFzZWQgcHJvY2Vzc29ycy4NCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3lzdGVtX1hNQzQyMDAuaD4NCiNpbmNsdWRlIDxYTUM0MjAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTENCiNkZWZpbmUgSElCX0NMT0NLX09TQ1VMUAkJCQkyDQoNCg0KDQoNCi8qDQovLy0tLS0tLS0tIDw8PCBVc2UgQ29uZmlndXJhdGlvbiBXaXphcmQgaW4gQ29udGV4dCBNZW51ID4+PiAtLS0tLS0tLS0tLS0tLS0tLS0NCiovDQoNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXRjaGRvZyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyA8ZT4gV2F0Y2hkb2cgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wPiBEaXNhYmxlIFdhdGNoZG9nDQovLw0KLy8gPC9lPg0KKi8NCiNkZWZpbmUgV0RUX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZSBXRFRFTkJfblZhbCAgICAgICAgICAgICAweDAwMDAwMDAxDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBNYWluIENsb2NrIENvbmZpZ3VyYXRpb24NCi8vICAgICA8bzEuMC4uMT4gQ1BVIGNsb2NrIGRpdmlkZXINCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBmQ1BVID0gZlNZUw0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfQ0xPQ0tfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lCVNDVV9DUFVDTEtDUl9ESVYJCTB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX1BCQ0xLQ1JfRElWCQkgICAgMHgwMDAwMDAwMA0KI2RlZmluZQlTQ1VfQ0NVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KLyoNCiogbWFuZGF0b3J5IGNsb2NrIHBhcmFtZXRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioNCiogc291cmNlIGZvciBjbG9jayBnZW5lcmF0aW9uDQoqIHJhbmdlOiBTQ1VfQ0xPQ0tfQ1JZU1RBTCAoY3J5c3RhbCBvciBleHRlcm5hbCBjbG9jayBhdCBjcnlzdGFsIGlucHV0KQ0KKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLyBTZWxlY3Rpb24gb2YgaW1wdXQgbG9jayBmb3IgUExMDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQk4MDAwMDAwMA0KI2RlZmluZQlDTE9DS19DUllTVEFMX0ZSRVFVRU5DWQkxMjAwMDAwMA0KI2RlZmluZQlDTE9DS19CQUNLX1VQCQkJCQkJMjQwMDAwMDANCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBPU0NfSFAgc2V0dXAgcGFyYW1ldGVycyAqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lCVNDVV9PU0NfSFBfTU9ERQkweEYwDQojZGVmaW5lCVNDVV9PU0NIUFdER0RJVgkyDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogTUFJTiBQTEwgc2V0dXAgcGFyYW1ldGVycyAqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovL0RpdmlkZXIgc2V0dGluZ3MgZm9yIGV4dGVybmFsIGNyeXN0YWwgQCAxMiBNSHoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxDQojZGVmaW5lIAlTQ1VfUExMX0sxRElWCTENCiNkZWZpbmUgCVNDVV9QTExfSzJESVYJNQ0KI2RlZmluZSAJU0NVX1BMTF9QRElWCTENCiNkZWZpbmUgCVNDVV9QTExfTkRJVgk3OQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vRGl2aWRlciBzZXR0aW5ncyBmb3IgdXNlIG9mIGJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1lZA0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLyNkZWZpbmUgCVNDVV9QTExfSzFESVYJMQ0KLy8jZGVmaW5lIAlTQ1VfUExMX0syRElWCTUNCi8vI2RlZmluZSAJU0NVX1BMTF9QRElWCTMNCi8vI2RlZmluZSAJU0NVX1BMTF9ORElWCTc5DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0IgQ0xPQ0sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyA8ZT4gVVNCIENsb2NrIENvbmZpZ3VyYXRpb24NCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfVVNCX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KI2RlZmluZSAJU0NVX1VTQlBMTF9QRElWCTANCiNkZWZpbmUgCVNDVV9VU0JQTExfTkRJVgkzMQ0KI2RlZmluZSAJU0NVX1VTQkRJVgkzDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4zPiAgIEZsYXNoIFdhaXQgU3RhdGUNCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiAzIFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gNCBXUw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IDUgV1MNCi8vCQkJCQkJCQkJCSA8Mz0+IDYgV1MNCi8vIDwvZT4NCi8vDQoqLw0KDQojZGVmaW5lIFBNVV9GTEFTSCAgICAgICAgICAgICAxDQojZGVmaW5lCVBNVV9GTEFTSF9XUwkJCQkJMHgwMDAwMDAwMA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLT1VUIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBDbG9jayBPVVQgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiAgIENsb2Nrb3V0IFNvdXJjZSBTZWxlY3Rpb24NCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBTeXN0ZW0gQ2xvY2sNCi8vICAgICAgICAgICAgICAgICAgICAgPDI9PiBEaXZpZGVkIHZhbHVlIG9mIFVTQiBQTEwgb3V0cHV0DQovLyAgICAgICAgICAgICAgICAgICAgIDwzPT4gRGl2aWRlZCB2YWx1ZSBvZiBQTEwgQ2xvY2sNCi8vICAgICA8bzIuMC4uND4gICBDbG9ja291dCBkaXZpZGVyIDwxLTEwPjwjLTE+DQovLyAgICAgPG8zLjAuLjE+ICAgQ2xvY2tvdXQgUGluIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFAxLjE1DQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gUDAuOA0KLy8NCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfQ0xPQ0tPVVRfU0VUVVAgICAgICAgICAgICAgICAwDQojZGVmaW5lCVNDVV9DTE9DS09VVF9TT1VSQ0UJCTB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX0NMT0NLT1VUX0RJVgkJMHgwMDAwMDAwOQ0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfUElOCQkweDAwMDAwMDAxDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KI2lmIFNDVV9DTE9DS19TRVRVUA0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfRlNZUzsNCiNlbHNlDQp1aW50MzJfdCBTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19CQUNLX1VQOw0KI2VuZGlmDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBzdGF0aWMgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpZiAoU0NVX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFN5c3RlbUNsb2NrU2V0dXAodm9pZCk7DQojZW5kaWYNCg0KI2lmIChTQ1VfVVNCX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFVTQkNsb2NrU2V0dXAodm9pZCk7DQojZW5kaWYNCg0KDQovKioNCiAgKiBAYnJpZWYgIFNldHVwIHRoZSBtaWNyb2NvbnRyb2xsZXIgc3lzdGVtLg0KICAqICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgUExMIGFuZCB1cGRhdGUgdGhlDQogICogICAgICAgICBTeXN0ZW1Db3JlQ2xvY2sgdmFyaWFibGUuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFN5c3RlbUluaXQodm9pZCkNCnsNCmludCB0ZW1wOw0KDQojaWYgKF9fRlBVX1BSRVNFTlQgPT0gMSkgJiYgKF9fRlBVX1VTRUQgPT0gMSkNClNDQi0+Q1BBQ1IgfD0gKCgzVUwgPDwgMTAqMikgfCAgICAgICAgICAgICAgICAgLyogc2V0IENQMTAgRnVsbCBBY2Nlc3MgKi8NCiAgICAgICAgICAgICAgICgzVUwgPDwgMTEqMikgICk7ICAgICAgICAgICAgICAgLyogc2V0IENQMTEgRnVsbCBBY2Nlc3MgKi8NCiNlbmRpZg0KDQovKiBFbmFibGUgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgLSBTQ0JfQ0NSLlVOQUxJR05fVFJQID0gMCAqLw0KU0NCLT5DQ1IgJj0gfihTQ0JfQ0NSX1VOQUxJR05fVFJQX01zayk7DQoNCi8qIFNldHVwIHRoZSBXRFQgKi8NCiNpZiBXRFRfU0VUVVANCg0KV0RULT5DVFIgJj0gfldEVEVOQl9uVmFsOw0KDQojZW5kaWYNCg0KDQovKiBTZXR1cCB0aGUgRmxhc2ggV2FpdCBTdGF0ZSAqLw0KI2lmIFBNVV9GTEFTSA0KdGVtcCA9IEZMQVNIMC0+RkNPTjsNCnRlbXAgJj0gfkZMQVNIX0ZDT05fV1NQRkxBU0hfTXNrOw0KdGVtcCB8PSBQTVVfRkxBU0hfV1MrMzsNCkZMQVNIMC0+RkNPTiA9IHRlbXA7DQojZW5kaWYNCg0KDQovKiBTZXR1cCB0aGUgY2xvY2tvdXQgKi8NCiNpZiBTQ1VfQ0xPQ0tPVVRfU0VUVVANCg0KU0NVX0NMSy0+RVhUQ0xLQ1IJfD0gU0NVX0NMT0NLT1VUX1NPVVJDRTsNCi8qc2V0IFBMTCBkaXYgZm9yIGNsa291dCAqLw0KU0NVX0NMSy0+RVhUQ0xLQ1IJfD0gU0NVX0NMT0NLT1VUX0RJVjw8MTY7DQoNCmlmIChTQ1VfQ0xPQ0tPVVRfUElOKSB7DQoJCQkJCQlQT1JUMC0+SU9DUjggPSAweDAwMDAwMDg4OyAgIC8qUDAuOCAtLT4gQUxUMSBzZWxlY3QgKyAgSFdTRUwgKi8NCgkJCQkJICAgIFBPUlQwLT5IV1NFTCAmPSAoflBPUlQwX0hXU0VMX0hXOF9Nc2spOw0KCQkJCQkgICAgUE9SVDAtPlBEUjEgJj0gKH5QT1JUMF9QRFIxX1BEOF9Nc2spOyAgLypzZXQgdG8gc3Ryb25nIGRyaXZlciAqLw0KCQkJCQkJfQ0KZWxzZSB7DQoJCVBPUlQxLT5JT0NSMTIgPSAweDg4MDAwMDAwOyAgICAgICAgICAgICAgICAgICAgLypQMS4xNS0tPiBBTFQxIHNlbGVjdCAqLw0KCSAgICBQT1JUMS0+UERSMSAmPSAoflBPUlQxX1BEUjFfUEQxNV9Nc2spOyAgLypzZXQgdG8gc3Ryb25nIGRyaXZlciAqLw0KCQl9DQoNCiNlbmRpZg0KDQoNCi8qIFNldHVwIHRoZSBTeXN0ZW0gY2xvY2sgKi8NCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANClN5c3RlbUNsb2NrU2V0dXAoKTsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUoKTsvKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCg0KDQovKiBTZXR1cCB0aGUgVVNCIFBMICovDQojaWYgU0NVX1VTQl9DTE9DS19TRVRVUA0KVVNCQ2xvY2tTZXR1cCgpOw0KI2VuZGlmDQoNCg0KDQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBVcGRhdGUgU3lzdGVtQ29yZUNsb2NrIGFjY29yZGluZyB0byBDbG9jayBSZWdpc3RlciBWYWx1ZXMNCiAgKiBAbm90ZSAgIC0NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKHZvaWQpDQp7DQp1bnNpZ25lZCBpbnQgUERJVjsNCnVuc2lnbmVkIGludCBORElWOw0KdW5zaWduZWQgaW50IEsyRElWOw0KdW5zaWduZWQgaW50IGxvbmcgVkNPOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmlmIChTQ1VfQ0xLLT5TWVNDTEtDUiA9PSAgMHgwMDAxMDAwMCkNCnsNCglpZiAoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zayl7DQoJCS8qIGNoZWNrIGlmIFBMTCBpcyBsb2NrZWQgKi8NCgkJLyogcmVhZCBiYWNrIGRpdmlkZXIgc2V0dGluZ3MgKi8NCgkJIFBESVYgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfUERJVl9Nc2spPj4yNCkrMTsNCgkJIE5ESVYgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfTkRJVl9Nc2spPj44KSsxOw0KCQkgSzJESVYgID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX0syRElWX01zayk+PjE2KSsxOw0KDQoJCWlmKFNDVV9QTEwtPlBMTENPTjIgJiBTQ1VfUExMX1BMTENPTjJfUElOU0VMX01zayl7DQoJCS8qIHRoZSBzZWxlY3RlZCBjbG9jayBpcyB0aGUgQmFja3VwIGNsb2NrIGZvZmkgKi8NCgkJVkNPID0gKENMT0NLX0JBQ0tfVVAvUERJVikqTkRJVjsNCgkJU3lzdGVtQ29yZUNsb2NrID0gVkNPL0syRElWOw0KCQkvKiBpbiBjYXNlIHRoZSBzeXNjbG9jayBkaXYgaXMgdXNlZCAqLw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBTeXN0ZW1Db3JlQ2xvY2svKChTQ1VfQ0xLLT5TWVNDTEtDUiAmIFNDVV9DTEtfU1lTQ0xLQ1JfU1lTRElWX01zaykrMSk7DQoNCgkJfQ0KCQllbHNlDQoJCXsNCgkJLyogdGhlIHNlbGVjdGVkIGNsb2NrIGlzIHRoZSBQTEwgZXh0ZXJuYWwgb3NjaWxsYXRvciAqLw0KCQlWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvUERJVikqTkRJVjsNCgkJU3lzdGVtQ29yZUNsb2NrID0gVkNPL0syRElWOw0KCQkvKiBpbiBjYXNlIHRoZSBzeXNjbG9jayBkaXYgaXMgdXNlZCAqLw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBTeXN0ZW1Db3JlQ2xvY2svKChTQ1VfQ0xLLT5TWVNDTEtDUiAmIFNDVV9DTEtfU1lTQ0xLQ1JfU1lTRElWX01zaykrMSk7DQoJCX0NCg0KDQoJfQ0KfQ0KZWxzZQ0Kew0KU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfQkFDS19VUDsNCn0NCg0KDQp9DQoNCg0KLyoqDQogICogQGJyaWVmICAtDQogICogQG5vdGUgICAtDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpDQp7DQppbnQgdGVtcDsNCnVuc2lnbmVkIGludCBsb25nIFZDTzsNCmludCBzdGVwcGluZ19LMkRJVjsNCg0KLyogdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovDQppZihBbGxvd1BMTEluaXRCeVN0YXJ0dXAoKSl7DQoNCi8qIGNoZWNrIGlmIFBMTCBpcyBzd2l0Y2hlZCBvbiAqLw0KaWYgKChTQ1VfUExMLT5QTExDT04wICYoU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zaykpICE9IDApew0KLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICBTQ1VfUExMLT5QTExDT04wICY9IH4oU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zayk7DQoNCn0NCg0KLyogRW5hYmxlIE9TQ19IUCBpZiBub3QgYWxyZWFkeSBvbiovDQogIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKQ0KICB7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGV4dGVybmFsIGNyeXN0YWwgZm9yIFBMTCBjbG9jayBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KICAgaWYgKFNDVV9PU0MtPk9TQ0hQQ1RSTCAmIFNDVV9PU0NfT1NDSFBDVFJMX01PREVfTXNrKXsNCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgJj0gfihTQ1VfT1NDX0hQX01PREUpOwkgLyplbmFibGUgdGhlIE9TQ19IUCovDQoJICAgLyogc2V0dXAgT1NDIFdERyBkZXZpZGVyICovDQoJICAgU0NVX09TQy0+T1NDSFBDVFJMIHw9IChTQ1VfT1NDSFBXREdESVY8PDE2KTsNCgkgICAvKiBzZWxlY3QgZXh0ZXJuYWwgT1NDIGFzIFBMTCBpbnB1dCAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjIgJj0gflNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KCSAgIC8qIHJlc3RhcnQgT1NDIFdhdGNoZG9nICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ1JFU19Nc2s7DQoNCiAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvb3AgfjE1MG1zICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkgICBkbw0KCSAgIHsNCiAgICAgICA7Lyogd2FpdCBmb3IgfjE1MG1zICAqLw0KCSAgIH13aGlsZSgoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsNCg0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIGlmICgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApDQoJICAgcmV0dXJuKDApOy8qIFJldHVybiBFcnJvciAqLw0KDQogICAgfQ0KICB9DQogIGVsc2UgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkNCgl7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGZhY3RvcnkgdHJpbW1pbmcgQmFjay11cCBjbG9jayBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkvKiBQTEwgQmFjayB1cCBjbG9jayBzZWxlY3RlZCAqLw0KCQlTQ1VfUExMLT5QTExDT04yIHw9IFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KDQoJfQ0KICBlbHNlIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykNCiAgew0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFVzZSBhdXRvbWF0aWMgdHJpbW1pbmcgQmFjay11cCBjbG9jayBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qIGNoZWNrIGZvciBISUIgRG9tYWluIGVuYWJsZWQgICovDQoJaWYoKFNDVV9QT1dFUi0+UFdSU1RBVCAmIFNDVV9QT1dFUl9QV1JTVEFUX0hJQkVOX01zaykgPT0gMCkNCgkJU0NVX1BPV0VSLT5QV1JTRVQgfD0gU0NVX1BPV0VSX1BXUlNFVF9ISUJfTXNrOyAvKmVuYWJsZSBIaWJlcm5hdGUgZG9tYWluKi8NCg0KICAgLyogY2hlY2sgZm9yIEhJQiBEb21haW4gaXMgbm90IGluIHJlc2V0IHN0YXRlICAqLw0KCWlmICgoU0NVX1JFU0VULT5SU1RTVEFUICYgU0NVX1JFU0VUX1JTVFNUQVRfSElCUlNfTXNrKT09IDEpDQoJICAgIFNDVV9SRVNFVC0+UlNUQ0xSIHw9IFNDVV9SRVNFVF9SU1RDTFJfSElCUlNfTXNrOyAvKmRlLWFzc2VydCBoaWJlcm5hdGUgcmVzZXQqLw0KDQoJCQkvKiBQTEwgQmFjayB1cCBjbG9jayBzZWxlY3RlZCAqLw0KCQlTQ1VfUExMLT5QTExDT04yIHw9IFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KDQoJCWlmIChTQ1VfU1RBTkRCWV9DTE9DSyA9PSBISUJfQ0xPQ0tfRk9TSSkNCgkJCXsNCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLyogICBVc2UgZk9TSSBhcyBzb3VyY2Ugb2YgdGhlIHN0YW5kYnkgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgJj0gflNDVV9ISUJFUk5BVEVfSERDUl9TVERCWVNFTF9Nc2s7DQoNCgkJCVNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9GT1RSX01zazsNCgkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoNCgkJCVNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX0FPVFJFTl9Nc2s7DQoJCQl9DQoJCWVsc2UgaWYgKFNDVV9TVEFOREJZX0NMT0NLID09IEhJQl9DTE9DS19PU0NVTFApDQoJCQl7DQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCS8qICAgVXNlIGZVTFAgYXMgc291cmNlIG9mIHRoZSBzdGFuZGJ5IGNsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCS8qY2hlY2sgT1NDVUwgaWYgcnVubmluZyBjb3JyZWN0Ki8NCgkJCWlmICgoU0NVX0hJQkVSTkFURS0+T1NDVUxDVFJMICYgU0NVX0hJQkVSTkFURV9PU0NVTENUUkxfTU9ERV9Nc2spIT0gMCkNCgkJCQl7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfT1NDVUxDVFJMX01zayk7DQoNCgkJCQkJU0NVX0hJQkVSTkFURS0+T1NDVUxDVFJMICY9IH5TQ1VfSElCRVJOQVRFX09TQ1VMQ1RSTF9NT0RFX01zazsgLyplbmFibGUgT1NDVUwqLw0KCQkJCQkvKm5vdyBjZWNrIGlmIHRoZSBjbG9jayBpcyBPSyB1c2luZyBPU0NVTFAgT3NjaWxsYXRvciBXYXRjaGRvZyAoVUxQV0RHKSovDQoJCQkJCS8qIHNlbGVjdCBPU0NVTCBjbG9jayBmb3IgUlRDKi8NCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ1JfUkNTX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENSX01zayk7DQoJCQkJCS8qZW5hYmxlIE9TQ1VMUCBXREcgQWxhcm0gRW5hYmxlKi8NCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ1JfVUxQV0RHRU5fTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCgkJCQkJLyp3YWl0IG5vdyBmb3IgY2xvY2sgaXMgc3RhYmxlICovDQoJCQkJCWRvDQoJCQkJCXsNCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDTFIgfD0gU0NVX0hJQkVSTkFURV9IRENMUl9VTFBXREdfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ0xSX01zayk7DQoJCQkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoJCQkJCX0NCgkJCQkJd2hpbGUgKChTQ1VfSElCRVJOQVRFLT5IRFNUQVQgJiBTQ1VfSElCRVJOQVRFX0hEU1RBVF9VTFBXREdfTXNrKT09U0NVX0hJQkVSTkFURV9IRFNUQVRfVUxQV0RHX01zayk7DQoNCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDTFIgfD0gU0NVX0hJQkVSTkFURV9IRENMUl9VTFBXREdfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ0xSX01zayk7DQoJCQkJfQ0KCQkJLy8gbm93IE9TQ1VMUCBpcyBydW5uaW5nIGFuZCBjYW4gYmUgdXNlZA0KCQkJU0NVX0hJQkVSTkFURS0+SERDUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ1JfU1REQllTRUxfTXNrOw0KCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENSX01zayk7DQoNCgkJCVNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9GT1RSX01zazsNCgkJCS8qVFJJQUwgZm9yIGRlbGF5IGxvb3AqLw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfQU9UUkVOX01zazsNCgkJCS8qVFJJQUwgZm9yIGRlbGF5IGxvb3AqLw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCg0KCQkJfQ0KICB9DQoNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBTZXR1cCBhbmQgbG9vayB0aGUgbWFpbiBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KaWYgKCEoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykpew0KCS8qIFN5c3RlbiBpcyBzdGlsbCBydW5uaW5nIGZyb20gaW50ZXJuYWwgY2xvY2sgKi8NCgkJICAgLyogc2VsZWN0IEZPRkkgYXMgc3lzdGVtIGNsb2NrICovDQoJCSAgIGlmKChTQ1VfQ0xLLT5TWVNDTEtDUiAmIFNDVV9DTEtfU1lTQ0xLQ1JfU1lTU0VMX01zaykgIT0gMHgwKVNDVV9DTEstPlNZU0NMS0NSICY9IH5TQ1VfQ0xLX1NZU0NMS0NSX1NZU1NFTF9Nc2s7IC8qU2VsZWN0IEZPRkkqLw0KDQoNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzI0MDAwMDAwKS0xOw0KCQkJIC8qIEdvIHRvIGJ5cGFzcyB0aGUgTWFpbiBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfVkNPQllQX01zazsNCgkJICAgLyogZGlzY29ubmVjdCBPU0NfSFAgdG8gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX0ZJTkRJU19Nc2s7DQoJCSAgIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSAgIC8qIHdlIG1heSBoYXZlIHRvIHNldCBPU0NESVNDRElTICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX09TQ0RJU0NESVNfTXNrOw0KCQkgICAvKiBjb25uZWN0IE9TQ19IUCB0byBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZJTkRJU19Nc2s7DQoJCSAgIC8qIHJlc3RhcnQgUExMIExvY2sgZGV0ZWN0aW9uICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX1JFU0xEX01zazsNCgkJICAgLyogd2FpdCBmb3IgUExMIExvY2sgKi8NCgkJICAgLyogc2V0dXAgdGltZSBvdXQgbG9vcCAqLw0KCSAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvbyB+MTUwbXMgKi8NCgkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgICBTeXNUaWNrLT5MT0FEICA9ICgoNTAwMDAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCQkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoNCgkJICAgd2hpbGUgKCghKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsNCgkgICAgICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoNCgkJICAgaWYgKChTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKT09U0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKQ0KCQkgICAJCXsNCgkJCQkvKiBHbyBiYWNrIHRvIHRoZSBNYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9WQ09CWVBfTXNrOw0KCQkJCX0NCgkJCQllbHNlIHJldHVybigwKTsNCg0KDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgd2UgbmVlZCB0byBzZXR1cCB0aGUgc3lzdGVtIGNsb2NrIGRpdmlkZXINCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCgkJU0NVX0NMSy0+Q1BVQ0xLQ1IgPSBTQ1VfQ1BVQ0xLQ1JfRElWOw0KCQlTQ1VfQ0xLLT5QQkNMS0NSID0gU0NVX1BCQ0xLQ1JfRElWOw0KCQlTQ1VfQ0xLLT5DQ1VDTEtDUiA9IFNDVV9DQ1VDTEtDUl9ESVY7DQoNCg0KICAJCS8qIFN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovDQoJICAgU0NVX0NMSy0+U1lTQ0xLQ1IgfD0gIDB4MDAwMTAwMDA7DQoNCgkgICAvKiB3ZSBtYXkgaGF2ZSB0byByZXNldCBPU0NESVNDRElTICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ0RJU0NESVNfTXNrOw0KDQoNCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgU3lzVGljay0+TE9BRCAgPSAoKDEyNTArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCQkgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJCSBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkJCQkJCQkJCQkgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCg0KCQkgd2hpbGUgKFN5c1RpY2stPlZBTCA+PSAxMDApOwkJCQkJCQkJICAgLyogd2FpdCBmb3IgfjUwtXMgICovDQoJCSBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB0aGUgcmFtcCB1cCBvZiB0aGUgc3lzdGVtIGNsb2NrIHN0YXJ0cyBGU3lzIDwgNjBNSHoNCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCWlmIChDTE9DS19GU1lTID4gNjAwMDAwMDApew0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoNCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vNjAwMDAwMDApLTE7DQoNCgkJCSAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSB9DQoJCSBlbHNlDQoJCSB7DQoJCQkJLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSAgICBTQ1VfVFJBUC0+VFJBUENMUiA9IFNDVV9UUkFQX1RSQVBDTFJfU09TQ1dER1RfTXNrIHwgU0NVX1RSQVBfVFJBUENMUl9TVkNPTENLVF9Nc2s7ICAvKiBjbGVhciByZXF1ZXN0IGZvciBTeXN0ZW0gT0NTIFdhdGNoZG9nIFRyYXAgYW5kIFN5c3RlbSBWQ08gTG9jayBUcmFwICAqLw0KCQkJICByZXR1cm4oMSk7DQoJCSB9DQoNCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCgzMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KDQoJICAgd2hpbGUgKFN5c1RpY2stPlZBTCA+PSAxMDApOwkJCQkJCQkJICAgLyogd2FpdCBmb3IgfjUwtXMgICovDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB0aGUgcmFtcCB1cCBvZiB0aGUgc3lzdGVtIGNsb2NrIHN0YXJ0cyBGU3lzIDwgOTBNSHoNCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCWlmIChDTE9DS19GU1lTID4gOTAwMDAwMDApew0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoNCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vOTAwMDAwMDApLTE7DQoNCgkJCSAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSB9DQoJCSBlbHNlDQoJCSB7DQoJCQkJLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJICAgICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgkJCQlyZXR1cm4oMSk7DQoJCSB9DQoNCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg0ODAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KDQoJICAgd2hpbGUgKFN5c1RpY2stPlZBTCA+PSAxMDApOwkJCQkJCQkJICAgLyogd2FpdCBmb3IgfjUwtXMgICovDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoJICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkgICBTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoNCgkgICBTQ1VfVFJBUC0+VFJBUENMUiA9IFNDVV9UUkFQX1RSQVBDTFJfU09TQ1dER1RfTXNrIHwgU0NVX1RSQVBfVFJBUENMUl9TVkNPTENLVF9Nc2s7ICAvKiBjbGVhciByZXF1ZXN0IGZvciBTeXN0ZW0gT0NTIFdhdGNoZG9nIFRyYXAgYW5kIFN5c3RlbSBWQ08gTG9jayBUcmFwICAqLw0KCX0NCiB9LyogZW5kIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLw0KICAgcmV0dXJuKDEpOw0KDQp9DQojZW5kaWYNCg0KLyoqDQogICogQGJyaWVmICAtDQogICogQG5vdGUgICAtDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQojaWYgKFNDVV9VU0JfQ0xPQ0tfU0VUVVAgPT0gMSkNCnN0YXRpYyBpbnQgVVNCQ2xvY2tTZXR1cCh2b2lkKQ0Kew0KLyogdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovDQppZihBbGxvd1BMTEluaXRCeVN0YXJ0dXAoKSl7DQoNCi8qIGNoZWNrIGlmIFBMTCBpcyBzd2l0Y2hlZCBvbiAqLw0KaWYgKChTQ1VfUExMLT5VU0JQTExDT04gJihTQ1VfUExMX1VTQlBMTENPTl9WQ09QV0RfTXNrIHwgU0NVX1BMTF9VU0JQTExDT05fUExMUFdEX01zaykpICE9IDApew0KCS8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgU0NVX1BMTC0+VVNCUExMQ09OICY9IH4oU0NVX1BMTF9VU0JQTExDT05fVkNPUFdEX01zayB8IFNDVV9QTExfVVNCUExMQ09OX1BMTFBXRF9Nc2spOw0KfQ0KDQovKiBjaGVjayBhbmQgaWYgbm90IGFscmVhZHkgcnVubmluZyBlbmFibGUgT1NDX0hQICovDQogICBpZiAoU0NVX09TQy0+T1NDSFBDVFJMICYgU0NVX09TQ19PU0NIUENUUkxfTU9ERV9Nc2spew0KCQkgLyogY2hlY2sgaWYgTWFpbiBQTEwgaXMgc3dpdGNoZWQgb24gZm9yIE9TQyBXRCovDQoJCSBpZiAoKFNDVV9QTEwtPlBMTENPTjAgJihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKSkgIT0gMCl7DQoJCQkvKiBlbmFibGUgUExMIGZpcnN0ICovDQogIAkJCVNDVV9QTEwtPlBMTENPTjAgJj0gfihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKTsNCgkJIH0NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgJj0gfihTQ1VfT1NDX0hQX01PREUpOwkgLyplbmFibGUgdGhlIE9TQ19IUCovDQoJICAgLyogc2V0dXAgT1NDIFdERyBkZXZpZGVyICovDQoJICAgU0NVX09TQy0+T1NDSFBDVFJMIHw9IChTQ1VfT1NDSFBXREdESVY8PDE2KTsNCgkgICAvKiByZXN0YXJ0IE9TQyBXYXRjaGRvZyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NSRVNfTXNrOw0KDQogICAgICAgLyogVGltZW91dCBmb3Igd2FpdCBsb29wIH4xNTBtcyAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNTAwMDAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoJICAgZG8NCgkgICB7DQogICAgICAgOy8qIHdhaXQgZm9yIH4xNTBtcyAgKi8NCgkgICB9d2hpbGUoKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkmJihTeXNUaWNrLT5WQUwgPj0gNTAwKSk7DQoNCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICBpZiAoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKQ0KCSAgIHJldHVybigwKTsvKiBSZXR1cm4gRXJyb3IgKi8NCg0KICB9DQoNCg0KLyogU2V0dXAgVVNCIFBMTCAqLw0KICAgLyogR28gdG8gYnlwYXNzIHRoZSBNYWluIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX1ZDT0JZUF9Nc2s7DQogICAvKiBkaXNjb25uZWN0IE9TQ19GSSB0byBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9GSU5ESVNfTXNrOw0KICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiA9ICgoU0NVX1VTQlBMTF9ORElWPDw4KSB8IChTQ1VfVVNCUExMX1BESVY8PDI0KSk7DQogICAvKiBTZXR1cCBVU0JESVYgc2V0dGluZ3MgVVNCIGNsb2NrICovDQogICBTQ1VfQ0xLLT5VU0JDTEtDUiA9IFNDVV9VU0JESVY7DQogICAvKiB3ZSBtYXkgaGF2ZSB0byBzZXQgT1NDRElTQ0RJUyAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX09TQ0RJU0NESVNfTXNrOw0KICAgLyogY29ubmVjdCBPU0NfRkkgdG8gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gJj0gflNDVV9QTExfVVNCUExMQ09OX0ZJTkRJU19Nc2s7DQogICAvKiByZXN0YXJ0IFBMTCBMb2NrIGRldGVjdGlvbiAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX1JFU0xEX01zazsNCiAgIC8qIHdhaXQgZm9yIFBMTCBMb2NrICovDQogICB3aGlsZSAoIShTQ1VfUExMLT5VU0JQTExTVEFUICYgU0NVX1BMTF9VU0JQTExTVEFUX1ZDT0xPQ0tfTXNrKSk7DQoNCiB9LyogZW5kIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLw0KICAgcmV0dXJuKDEpOw0KDQp9DQojZW5kaWYNCg0K