LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0NTAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0NTAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAxNy4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTQ0KICogcHJvY2Vzc29yIGJhc2VkIG1pY3JvY29udHJvbGxlcnMuICBUaGlzIGZpbGUgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZA0KICogd2l0aGluIGRldmVsb3BtZW50IHRvb2xzIHRoYXQgYXJlIHN1cHBvcnRpbmcgc3VjaCBBUk0gYmFzZWQgcHJvY2Vzc29ycy4NCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAic3lzdGVtX1hNQzQ1MDAuaCINCiNpbmNsdWRlIDxYTUM0NTAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTENCiNkZWZpbmUgSElCX0NMT0NLX09TQ1VMUAkJCQkyDQoNCg0KDQoNCi8qDQovLy0tLS0tLS0tIDw8PCBVc2UgQ29uZmlndXJhdGlvbiBXaXphcmQgaW4gQ29udGV4dCBNZW51ID4+PiAtLS0tLS0tLS0tLS0tLS0tLS0NCiovDQoNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXRjaGRvZyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyA8ZT4gV2F0Y2hkb2cgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wPiBEaXNhYmxlIFdhdGNoZG9nDQovLw0KLy8gPC9lPg0KKi8NCiNkZWZpbmUgV0RUX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZSBXRFRFTkJfblZhbCAgICAgICAgICAgICAweDAwMDAwMDAxDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBNYWluIENsb2NrIENvbmZpZ3VyYXRpb24NCi8vICAgICA8bzEuMC4uMT4gQ1BVIGNsb2NrIGRpdmlkZXINCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBmQ1BVID0gZlNZUw0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfQ0xPQ0tfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lCVNDVV9DUFVDTEtDUl9ESVYJCTB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX1BCQ0xLQ1JfRElWCQkgICAgMHgwMDAwMDAwMA0KI2RlZmluZQlTQ1VfQ0NVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KLyoNCiogbWFuZGF0b3J5IGNsb2NrIHBhcmFtZXRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioNCiogc291cmNlIGZvciBjbG9jayBnZW5lcmF0aW9uDQoqIHJhbmdlOiBTQ1VfQ0xPQ0tfQ1JZU1RBTCAoY3J5c3RhbCBvciBleHRlcm5hbCBjbG9jayBhdCBjcnlzdGFsIGlucHV0KQ0KKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLyBTZWxlY3Rpb24gb2YgaW1wdXQgbG9jayBmb3IgUExMDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQkxMjAwMDAwMDANCiNkZWZpbmUJQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kJMTIwMDAwMDANCiNkZWZpbmUJQ0xPQ0tfQkFDS19VUAkJCQkJCTI0MDAwMDAwDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogT1NDX0hQIHNldHVwIHBhcmFtZXRlcnMgKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfT1NDX0hQX01PREUJMHhGMA0KI2RlZmluZQlTQ1VfT1NDSFBXREdESVYJMg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIE1BSU4gUExMIHNldHVwIHBhcmFtZXRlcnMgKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciBleHRlcm5hbCBjcnlzdGFsIEAgMTIgTUh6DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgCVNDVV9QTExfSzFESVYJMQ0KI2RlZmluZSAJU0NVX1BMTF9LMkRJVgkzDQojZGVmaW5lIAlTQ1VfUExMX1BESVYJMQ0KI2RlZmluZSAJU0NVX1BMTF9ORElWCTc5DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciB1c2Ugb2YgYmFja3VwIGNsb2NrIHNvdXJjZSB0cmltbWVkDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxDQovLyNkZWZpbmUgCVNDVV9QTExfSzJESVYJMw0KLy8jZGVmaW5lIAlTQ1VfUExMX1BESVYJMw0KLy8jZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0IgQ0xPQ0sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyA8ZT4gVVNCIENsb2NrIENvbmZpZ3VyYXRpb24NCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfVVNCX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KI2RlZmluZSAJU0NVX1VTQlBMTF9QRElWCTANCiNkZWZpbmUgCVNDVV9VU0JQTExfTkRJVgkzMQ0KI2RlZmluZSAJU0NVX1VTQkRJVgkzDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4zPiAgIEZsYXNoIFdhaXQgU3RhdGUNCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiAzIFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gNCBXUw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IDUgV1MNCi8vCQkJCQkJCQkJCSA8Mz0+IDYgV1MNCi8vIDwvZT4NCi8vDQoqLw0KDQojZGVmaW5lIFBNVV9GTEFTSCAgICAgICAgICAgICAxDQojZGVmaW5lCVBNVV9GTEFTSF9XUwkJCQkJMHgwMDAwMDAwMA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLT1VUIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBDbG9jayBPVVQgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiAgIENsb2Nrb3V0IFNvdXJjZSBTZWxlY3Rpb24NCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBTeXN0ZW0gQ2xvY2sNCi8vICAgICAgICAgICAgICAgICAgICAgPDI9PiBEaXZpZGVkIHZhbHVlIG9mIFVTQiBQTEwgb3V0cHV0DQovLyAgICAgICAgICAgICAgICAgICAgIDwzPT4gRGl2aWRlZCB2YWx1ZSBvZiBQTEwgQ2xvY2sNCi8vICAgICA8bzIuMC4uND4gICBDbG9ja291dCBkaXZpZGVyIDwxLTEwPjwjLTE+DQovLyAgICAgPG8zLjAuLjE+ICAgQ2xvY2tvdXQgUGluIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFAxLjE1DQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gUDAuOA0KLy8NCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfQ0xPQ0tPVVRfU0VUVVAgICAgICAgICAgICAgICAwDQojZGVmaW5lCVNDVV9DTE9DS09VVF9TT1VSQ0UJCTB4MDAwMDAwMDMNCiNkZWZpbmUJU0NVX0NMT0NLT1VUX0RJVgkJMHgwMDAwMDAwOQ0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfUElOCQkweDAwMDAwMDAxDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KI2lmIFNDVV9DTE9DS19TRVRVUA0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfRlNZUzsNCiNlbHNlDQp1aW50MzJfdCBTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19CQUNLX1VQOw0KI2VuZGlmDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBzdGF0aWMgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpZiAoU0NVX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFN5c3RlbUNsb2NrU2V0dXAodm9pZCk7DQojZW5kaWYNCg0KI2lmIChTQ1VfVVNCX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFVTQkNsb2NrU2V0dXAodm9pZCk7DQojZW5kaWYNCg0KDQovKioNCiAgKiBAYnJpZWYgIFNldHVwIHRoZSBtaWNyb2NvbnRyb2xsZXIgc3lzdGVtLg0KICAqICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgUExMIGFuZCB1cGRhdGUgdGhlDQogICogICAgICAgICBTeXN0ZW1Db3JlQ2xvY2sgdmFyaWFibGUuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFN5c3RlbUluaXQodm9pZCkNCnsNCmludCB0ZW1wOw0KDQojaWYgKF9fRlBVX1BSRVNFTlQgPT0gMSkgJiYgKF9fRlBVX1VTRUQgPT0gMSkNClNDQi0+Q1BBQ1IgfD0gKCgzVUwgPDwgMTAqMikgfCAgICAgICAgICAgICAgICAgLyogc2V0IENQMTAgRnVsbCBBY2Nlc3MgKi8NCiAgICAgICAgICAgICAgICgzVUwgPDwgMTEqMikgICk7ICAgICAgICAgICAgICAgLyogc2V0IENQMTEgRnVsbCBBY2Nlc3MgKi8NCiNlbmRpZg0KDQovKiBFbmFibGUgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgLSBTQ0JfQ0NSLlVOQUxJR05fVFJQID0gMCAqLw0KU0NCLT5DQ1IgJj0gfihTQ0JfQ0NSX1VOQUxJR05fVFJQX01zayk7DQoNCi8qIFNldHVwIHRoZSBXRFQgKi8NCiNpZiBXRFRfU0VUVVANCg0KV0RULT5DVFIgJj0gfldEVEVOQl9uVmFsOw0KDQojZW5kaWYNCg0KLyogU2V0dXAgdGhlIEZsYXNoIFdhaXQgU3RhdGUgKi8NCiNpZiBQTVVfRkxBU0gNCnRlbXAgPSBGTEFTSDAtPkZDT047DQp0ZW1wICY9IH5GTEFTSF9GQ09OX1dTUEZMQVNIX01zazsNCnRlbXAgfD0gUE1VX0ZMQVNIX1dTKzM7DQpGTEFTSDAtPkZDT04gPSB0ZW1wOw0KI2VuZGlmDQoNCg0KLyogU2V0dXAgdGhlIGNsb2Nrb3V0ICovDQojaWYgU0NVX0NMT0NLT1VUX1NFVFVQDQoNClNDVV9DTEstPkVYVENMS0NSCXw9IFNDVV9DTE9DS09VVF9TT1VSQ0U7DQovKnNldCBQTEwgZGl2IGZvciBjbGtvdXQgKi8NClNDVV9DTEstPkVYVENMS0NSCXw9IFNDVV9DTE9DS09VVF9ESVY8PDE2Ow0KDQppZiAoU0NVX0NMT0NLT1VUX1BJTikgew0KCQkJCQkJUE9SVDAtPklPQ1I4ID0gMHgwMDAwMDA4ODsgICAvKlAwLjggLS0+IEFMVDEgc2VsZWN0ICsgIEhXU0VMICovDQoJCQkJCSAgICBQT1JUMC0+SFdTRUwgJj0gKH5QT1JUMF9IV1NFTF9IVzhfTXNrKTsNCgkJCQkJICAgIC8vUE9SVDAtPlBEUjEgJj0gKH5QT1JUMF9QRFIxX1BEOF9Nc2spOyAgLypzZXQgdG8gc3Ryb25nIGRyaXZlciAqLw0KCQkJCQkJfQ0KZWxzZSB7DQoJCVBPUlQxLT5JT0NSMTIgPSAweDg4MDAwMDAwOyAgICAgICAgICAgICAgICAgICAgLypQMS4xNS0tPiBBTFQxIHNlbGVjdCAqLw0KCSAgICAvL1BPUlQxLT5QRFIxICY9ICh+UE9SVDFfUERSMV9QRDE1X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCX0NCg0KI2VuZGlmDQoNCg0KLyogU2V0dXAgdGhlIFN5c3RlbSBjbG9jayAqLw0KI2lmIFNDVV9DTE9DS19TRVRVUA0KU3lzdGVtQ2xvY2tTZXR1cCgpOw0KI2VuZGlmDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NClN5c3RlbUNvcmVDbG9ja1VwZGF0ZSgpOy8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KDQoNCi8qIFNldHVwIHRoZSBVU0IgUEwgKi8NCiNpZiBTQ1VfVVNCX0NMT0NLX1NFVFVQDQpVU0JDbG9ja1NldHVwKCk7DQojZW5kaWYNCg0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFVwZGF0ZSBTeXN0ZW1Db3JlQ2xvY2sgYWNjb3JkaW5nIHRvIENsb2NrIFJlZ2lzdGVyIFZhbHVlcw0KICAqIEBub3RlICAgLQ0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUodm9pZCkNCnsNCnVuc2lnbmVkIGludCBQRElWOw0KdW5zaWduZWQgaW50IE5ESVY7DQp1bnNpZ25lZCBpbnQgSzJESVY7DQp1bnNpZ25lZCBpbnQgbG9uZyBWQ087DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIENsb2NrIFZhcmlhYmxlIGRlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KaWYgKFNDVV9DTEstPlNZU0NMS0NSID09ICAweDAwMDEwMDAwKQ0Kew0KCWlmIChTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKXsNCgkJLyogY2hlY2sgaWYgUExMIGlzIGxvY2tlZCAqLw0KCQkvKiByZWFkIGJhY2sgZGl2aWRlciBzZXR0aW5ncyAqLw0KCQkgUERJViA9ICgoU0NVX1BMTC0+UExMQ09OMSAmIFNDVV9QTExfUExMQ09OMV9QRElWX01zayk+PjI0KSsxOw0KCQkgTkRJViA9ICgoU0NVX1BMTC0+UExMQ09OMSAmIFNDVV9QTExfUExMQ09OMV9ORElWX01zayk+PjgpKzE7DQoJCSBLMkRJViAgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfSzJESVZfTXNrKT4+MTYpKzE7DQoNCgkJaWYoU0NVX1BMTC0+UExMQ09OMiAmIFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrKXsNCgkJLyogdGhlIHNlbGVjdGVkIGNsb2NrIGlzIHRoZSBCYWNrdXAgY2xvY2sgZm9maSAqLw0KCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC9QRElWKSpORElWOw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBWQ08vSzJESVY7DQoJCS8qIGluIGNhc2UgdGhlIHN5c2Nsb2NrIGRpdiBpcyB1c2VkICovDQoJCVN5c3RlbUNvcmVDbG9jayA9IFN5c3RlbUNvcmVDbG9jay8oKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNESVZfTXNrKSsxKTsNCg0KCQl9DQoJCWVsc2UNCgkJew0KCQkvKiB0aGUgc2VsZWN0ZWQgY2xvY2sgaXMgdGhlIFBMTCBleHRlcm5hbCBvc2NpbGxhdG9yICovDQoJCVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS9QRElWKSpORElWOw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBWQ08vSzJESVY7DQoJCS8qIGluIGNhc2UgdGhlIHN5c2Nsb2NrIGRpdiBpcyB1c2VkICovDQoJCVN5c3RlbUNvcmVDbG9jayA9IFN5c3RlbUNvcmVDbG9jay8oKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNESVZfTXNrKSsxKTsNCgkJfQ0KDQoNCgl9DQp9DQplbHNlDQp7DQpTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19CQUNLX1VQOw0KfQ0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCiNpZiAoU0NVX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFN5c3RlbUNsb2NrU2V0dXAodm9pZCkNCnsNCmludCB0ZW1wOw0KdW5zaWduZWQgaW50IGxvbmcgVkNPOw0KaW50IHN0ZXBwaW5nX0syRElWOw0KDQovKiB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8NCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCg0KLyogY2hlY2sgaWYgUExMIGlzIHN3aXRjaGVkIG9uICovDQppZiAoKFNDVV9QTEwtPlBMTENPTjAgJihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKSkgIT0gMCl7DQovKiBlbmFibGUgUExMIGZpcnN0ICovDQogIFNDVV9QTEwtPlBMTENPTjAgJj0gfihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKTsNCg0KfQ0KDQovKiBFbmFibGUgT1NDX0hQIGlmIG5vdCBhbHJlYWR5IG9uKi8NCiAgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpDQogIHsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgZXh0ZXJuYWwgY3J5c3RhbCBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQogICBpZiAoU0NVX09TQy0+T1NDSFBDVFJMICYgU0NVX09TQ19PU0NIUENUUkxfTU9ERV9Nc2spew0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCAmPSB+KFNDVV9PU0NfSFBfTU9ERSk7CSAvKmVuYWJsZSB0aGUgT1NDX0hQKi8NCgkgICAvKiBzZXR1cCBPU0MgV0RHIGRldmlkZXIgKi8NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgfD0gKFNDVV9PU0NIUFdER0RJVjw8MTYpOw0KCSAgIC8qIHNlbGVjdCBleHRlcm5hbCBPU0MgYXMgUExMIGlucHV0ICovDQoJICAgU0NVX1BMTC0+UExMQ09OMiAmPSB+U0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoJICAgLyogcmVzdGFydCBPU0MgV2F0Y2hkb2cgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDUkVTX01zazsNCg0KICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vcCB+MTUwbXMgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDUwMDAwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KCSAgIGRvDQoJICAgew0KICAgICAgIDsvKiB3YWl0IGZvciB+MTUwbXMgICovDQoJICAgfXdoaWxlKCgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApJiYoU3lzVGljay0+VkFMID49IDUwMCkpOw0KDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgaWYgKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkNCgkgICByZXR1cm4oMCk7LyogUmV0dXJuIEVycm9yICovDQoNCiAgICB9DQogIH0NCiAgZWxzZSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKQ0KCXsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgZmFjdG9yeSB0cmltbWluZyBCYWNrLXVwIGNsb2NrIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCS8qIFBMTCBCYWNrIHVwIGNsb2NrIHNlbGVjdGVkICovDQoJCVNDVV9QTEwtPlBMTENPTjIgfD0gU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoNCgl9DQogIGVsc2UgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKQ0KICB7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGF1dG9tYXRpYyB0cmltbWluZyBCYWNrLXVwIGNsb2NrIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogY2hlY2sgZm9yIEhJQiBEb21haW4gZW5hYmxlZCAgKi8NCglpZigoU0NVX1BPV0VSLT5QV1JTVEFUICYgU0NVX1BPV0VSX1BXUlNUQVRfSElCRU5fTXNrKSA9PSAwKQ0KCQlTQ1VfUE9XRVItPlBXUlNFVCB8PSBTQ1VfUE9XRVJfUFdSU0VUX0hJQl9Nc2s7IC8qZW5hYmxlIEhpYmVybmF0ZSBkb21haW4qLw0KDQogICAvKiBjaGVjayBmb3IgSElCIERvbWFpbiBpcyBub3QgaW4gcmVzZXQgc3RhdGUgICovDQoJaWYgKChTQ1VfUkVTRVQtPlJTVFNUQVQgJiBTQ1VfUkVTRVRfUlNUU1RBVF9ISUJSU19Nc2spPT0gMSkNCgkgICAgU0NVX1JFU0VULT5SU1RDTFIgfD0gU0NVX1JFU0VUX1JTVENMUl9ISUJSU19Nc2s7IC8qZGUtYXNzZXJ0IGhpYmVybmF0ZSByZXNldCovDQoNCgkJCS8qIFBMTCBCYWNrIHVwIGNsb2NrIHNlbGVjdGVkICovDQoJCVNDVV9QTEwtPlBMTENPTjIgfD0gU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoNCgkJaWYgKFNDVV9TVEFOREJZX0NMT0NLID09IEhJQl9DTE9DS19GT1NJKQ0KCQkJew0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKiAgIFVzZSBmT1NJIGFzIHNvdXJjZSBvZiB0aGUgc3RhbmRieSBjbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJU0NVX0hJQkVSTkFURS0+SERDUiAmPSB+U0NVX0hJQkVSTkFURV9IRENSX1NUREJZU0VMX01zazsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZPVFJfTXNrOw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfQU9UUkVOX01zazsNCgkJCX0NCgkJZWxzZSBpZiAoU0NVX1NUQU5EQllfQ0xPQ0sgPT0gSElCX0NMT0NLX09TQ1VMUCkNCgkJCXsNCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLyogICBVc2UgZlVMUCBhcyBzb3VyY2Ugb2YgdGhlIHN0YW5kYnkgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLypjaGVjayBPU0NVTCBpZiBydW5uaW5nIGNvcnJlY3QqLw0KCQkJaWYgKChTQ1VfSElCRVJOQVRFLT5PU0NVTENUUkwgJiBTQ1VfSElCRVJOQVRFX09TQ1VMQ1RSTF9NT0RFX01zaykhPSAwKQ0KCQkJCXsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19PU0NVTENUUkxfTXNrKTsNCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5PU0NVTENUUkwgJj0gflNDVV9ISUJFUk5BVEVfT1NDVUxDVFJMX01PREVfTXNrOyAvKmVuYWJsZSBPU0NVTCovDQoJCQkJCS8qbm93IGNlY2sgaWYgdGhlIGNsb2NrIGlzIE9LIHVzaW5nIE9TQ1VMUCBPc2NpbGxhdG9yIFdhdGNoZG9nIChVTFBXREcpKi8NCgkJCQkJLyogc2VsZWN0IE9TQ1VMIGNsb2NrIGZvciBSVEMqLw0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9SQ1NfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCgkJCQkJLyplbmFibGUgT1NDVUxQIFdERyBBbGFybSBFbmFibGUqLw0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9VTFBXREdFTl9Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJCQkvKndhaXQgbm93IGZvciBjbG9jayBpcyBzdGFibGUgKi8NCgkJCQkJZG8NCgkJCQkJew0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCgkJCQkJfQ0KCQkJCQl3aGlsZSAoKFNDVV9ISUJFUk5BVEUtPkhEU1RBVCAmIFNDVV9ISUJFUk5BVEVfSERTVEFUX1VMUFdER19Nc2spPT1TQ1VfSElCRVJOQVRFX0hEU1RBVF9VTFBXREdfTXNrKTsNCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQl9DQoJCQkvLyBub3cgT1NDVUxQIGlzIHJ1bm5pbmcgYW5kIGNhbiBiZSB1c2VkDQoJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9TVERCWVNFTF9Nc2s7DQoJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZPVFJfTXNrOw0KCQkJLypUUklBTCBmb3IgZGVsYXkgbG9vcCovDQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KDQoJCQlTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9BT1RSRU5fTXNrOw0KCQkJLypUUklBTCBmb3IgZGVsYXkgbG9vcCovDQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KDQoJCQl9DQogIH0NCg0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFNldHVwIGFuZCBsb29rIHRoZSBtYWluIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQppZiAoIShTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKSl7DQoJLyogU3lzdGVuIGlzIHN0aWxsIHJ1bm5pbmcgZnJvbSBpbnRlcm5hbCBjbG9jayAqLw0KCQkgICAvKiBzZWxlY3QgRk9GSSBhcyBzeXN0ZW0gY2xvY2sgKi8NCgkJICAgaWYoKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNTRUxfTXNrKSAhPSAweDApU0NVX0NMSy0+U1lTQ0xLQ1IgJj0gflNDVV9DTEtfU1lTQ0xLQ1JfU1lTU0VMX01zazsgLypTZWxlY3QgRk9GSSovDQoNCg0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoNCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vMjQwMDAwMDApLTE7DQoJCQkgLyogR28gdG8gYnlwYXNzIHRoZSBNYWluIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9WQ09CWVBfTXNrOw0KCQkgICAvKiBkaXNjb25uZWN0IE9TQ19IUCB0byBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfRklORElTX01zazsNCgkJICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJICAgLyogd2UgbWF5IGhhdmUgdG8gc2V0IE9TQ0RJU0NESVMgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfT1NDRElTQ0RJU19Nc2s7DQoJCSAgIC8qIGNvbm5lY3QgT1NDX0hQIHRvIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRklORElTX01zazsNCgkJICAgLyogcmVzdGFydCBQTEwgTG9jayBkZXRlY3Rpb24gKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfUkVTTERfTXNrOw0KCQkgICAvKiB3YWl0IGZvciBQTEwgTG9jayAqLw0KCQkgICAvKiBzZXR1cCB0aW1lIG91dCBsb29wICovDQoJICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vIH4xNTBtcyAqLw0KCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCQkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCg0KCQkgICB3aGlsZSAoKCEoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykpJiYoU3lzVGljay0+VkFMID49IDUwMCkpOw0KCSAgICAgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCg0KCQkgICBpZiAoKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spPT1TQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spDQoJCSAgIAkJew0KCQkJCS8qIEdvIGJhY2sgdG8gdGhlIE1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX1ZDT0JZUF9Nc2s7DQoJCQkJfQ0KCQkJCWVsc2UgcmV0dXJuKDApOw0KDQoNCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB3ZSBuZWVkIHRvIHNldHVwIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlcg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCQlTQ1VfQ0xLLT5DUFVDTEtDUiA9IFNDVV9DUFVDTEtDUl9ESVY7DQoJCVNDVV9DTEstPlBCQ0xLQ1IgPSBTQ1VfUEJDTEtDUl9ESVY7DQoJCVNDVV9DTEstPkNDVUNMS0NSID0gU0NVX0NDVUNMS0NSX0RJVjsNCg0KDQoJCSAvKiBTd2l0Y2ggc3lzdGVtIGNsb2NrIHRvIFBMTCAqLw0KCSAgIFNDVV9DTEstPlNZU0NMS0NSIHw9ICAweDAwMDEwMDAwOw0KDQoJICAgLyogd2UgbWF5IGhhdmUgdG8gcmVzZXQgT1NDRElTQ0RJUyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NESVNDRElTX01zazsNCg0KDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIFN5c1RpY2stPkxPQUQgID0gKCgxMjUwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkJIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCQkgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJCQkJCQkJCQkJIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoNCgkJIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCQkgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgdGhlIHJhbXAgdXAgb2YgdGhlIHN5c3RlbSBjbG9jayBzdGFydHMgRlN5cyA8IDYwTUh6DQoJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQlpZiAoQ0xPQ0tfRlNZUyA+IDYwMDAwMDAwKXsNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzYwMDAwMDAwKS0xOw0KDQoJCQkgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgfQ0KCQkgZWxzZQ0KCQkgew0KCQkJCS8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgkJCSAgcmV0dXJuKDEpOw0KCQkgfQ0KDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoMzAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsNCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCg0KCSAgIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgdGhlIHJhbXAgdXAgb2YgdGhlIHN5c3RlbSBjbG9jayBzdGFydHMgRlN5cyA8IDkwTUh6DQoJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQlpZiAoQ0xPQ0tfRlNZUyA+IDkwMDAwMDAwKXsNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzkwMDAwMDAwKS0xOw0KDQoJCQkgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgfQ0KCQkgZWxzZQ0KCQkgew0KCQkJCS8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCSAgICAgIFNDVV9UUkFQLT5UUkFQQ0xSID0gU0NVX1RSQVBfVFJBUENMUl9TT1NDV0RHVF9Nc2sgfCBTQ1VfVFJBUF9UUkFQQ0xSX1NWQ09MQ0tUX01zazsgIC8qIGNsZWFyIHJlcXVlc3QgZm9yIFN5c3RlbSBPQ1MgV2F0Y2hkb2cgVHJhcCBhbmQgU3lzdGVtIFZDTyBMb2NrIFRyYXAgICovDQoJCQkJcmV0dXJuKDEpOw0KCQkgfQ0KDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNDgwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsNCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCg0KCSAgIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCSAgIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJICAgU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KDQoJICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgl9DQogfS8qIGVuZCB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8NCiAgIHJldHVybigxKTsNCg0KfQ0KI2VuZGlmDQoNCi8qKg0KICAqIEBicmllZiAgLQ0KICAqIEBub3RlICAgLQ0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KI2lmIChTQ1VfVVNCX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFVTQkNsb2NrU2V0dXAodm9pZCkNCnsNCi8qIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLw0KaWYoQWxsb3dQTExJbml0QnlTdGFydHVwKCkpew0KDQoJLyogY2hlY2sgaWYgUExMIGlzIHN3aXRjaGVkIG9uICovDQppZiAoKFNDVV9QTEwtPlVTQlBMTENPTiAmKFNDVV9QTExfVVNCUExMQ09OX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1VTQlBMTENPTl9QTExQV0RfTXNrKSkgIT0gMCl7DQoJLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICBTQ1VfUExMLT5VU0JQTExDT04gJj0gfihTQ1VfUExMX1VTQlBMTENPTl9WQ09QV0RfTXNrIHwgU0NVX1BMTF9VU0JQTExDT05fUExMUFdEX01zayk7DQp9DQoNCi8qIGNoZWNrIGFuZCBpZiBub3QgYWxyZWFkeSBydW5uaW5nIGVuYWJsZSBPU0NfSFAgKi8NCiAgIGlmIChTQ1VfT1NDLT5PU0NIUENUUkwgJiBTQ1VfT1NDX09TQ0hQQ1RSTF9NT0RFX01zayl7DQoJCSAvKiBjaGVjayBpZiBNYWluIFBMTCBpcyBzd2l0Y2hlZCBvbiBmb3IgT1NDIFdEKi8NCgkJIGlmICgoU0NVX1BMTC0+UExMQ09OMCAmKFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spKSAhPSAwKXsNCgkJCS8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+KFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spOw0KCQkgfQ0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCAmPSB+KFNDVV9PU0NfSFBfTU9ERSk7CSAvKmVuYWJsZSB0aGUgT1NDX0hQKi8NCgkgICAvKiBzZXR1cCBPU0MgV0RHIGRldmlkZXIgKi8NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgfD0gKFNDVV9PU0NIUFdER0RJVjw8MTYpOw0KCSAgIC8qIHJlc3RhcnQgT1NDIFdhdGNoZG9nICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ1JFU19Nc2s7DQoNCiAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvb3AgfjE1MG1zICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkgICBkbw0KCSAgIHsNCiAgICAgICA7Lyogd2FpdCBmb3IgfjE1MG1zICAqLw0KCSAgIH13aGlsZSgoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsNCg0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIGlmICgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApDQoJICAgcmV0dXJuKDApOy8qIFJldHVybiBFcnJvciAqLw0KDQogIH0NCg0KDQovKiBTZXR1cCBVU0IgUExMICovDQogICAvKiBHbyB0byBieXBhc3MgdGhlIE1haW4gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fVkNPQllQX01zazsNCiAgIC8qIGRpc2Nvbm5lY3QgT1NDX0ZJIHRvIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX0ZJTkRJU19Nc2s7DQogICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OID0gKChTQ1VfVVNCUExMX05ESVY8PDgpIHwgKFNDVV9VU0JQTExfUERJVjw8MjQpKTsNCiAgIC8qIFNldHVwIFVTQkRJViBzZXR0aW5ncyBVU0IgY2xvY2sgKi8NCiAgIFNDVV9DTEstPlVTQkNMS0NSID0gU0NVX1VTQkRJVjsNCiAgIC8qIHdlIG1heSBoYXZlIHRvIHNldCBPU0NESVNDRElTICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fT1NDRElTQ0RJU19Nc2s7DQogICAvKiBjb25uZWN0IE9TQ19GSSB0byBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiAmPSB+U0NVX1BMTF9VU0JQTExDT05fRklORElTX01zazsNCiAgIC8qIHJlc3RhcnQgUExMIExvY2sgZGV0ZWN0aW9uICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fUkVTTERfTXNrOw0KICAgLyogd2FpdCBmb3IgUExMIExvY2sgKi8NCiAgIHdoaWxlICghKFNDVV9QTEwtPlVTQlBMTFNUQVQgJiBTQ1VfUExMX1VTQlBMTFNUQVRfVkNPTE9DS19Nc2spKTsNCg0KICB9LyogZW5kIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLw0KICAgcmV0dXJuKDEpOw0KDQp9DQojZW5kaWYNCg0K