LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICBzdG0zMmYxMHhfc2Rpby5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiAgVjMuMC4wDQogICogQGRhdGUgIDA0LzA2LzIwMDkNCiAgKiBAYnJpZWYgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFNESU8gZmlybXdhcmUgZnVuY3Rpb25zLg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAY29weQ0KICAqDQogICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQogICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCiAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQogICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCiAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMDkgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKi8gDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X3NkaW8uaCINCiNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTdGRQZXJpcGhfRHJpdmVyDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTRElPIA0KICAqIEBicmllZiBTRElPIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgU0RJT19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCiAgKiBAew0KICAqLyANCg0KLyogLS0tLS0tLS0tLS0tIFNESU8gcmVnaXN0ZXJzIGJpdCBhZGRyZXNzIGluIHRoZSBhbGlhcyByZWdpb24gLS0tLS0tLS0tLS0gKi8NCiNkZWZpbmUgU0RJT19PRkZTRVQgICAgICAgICAgICAgICAgKFNESU9fQkFTRSAtIFBFUklQSF9CQVNFKQ0KDQovKiAtLS0gQ0xLQ1IgUmVnaXN0ZXIgLS0tKi8NCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENMS0VOIGJpdCAqLw0KI2RlZmluZSBDTEtDUl9PRkZTRVQgICAgICAgICAgICAgIChTRElPX09GRlNFVCArIDB4MDQpDQojZGVmaW5lIENMS0VOX0JpdE51bWJlciAgICAgICAgICAgMHgwOA0KI2RlZmluZSBDTEtDUl9DTEtFTl9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDTEtDUl9PRkZTRVQgKiAzMikgKyAoQ0xLRU5fQml0TnVtYmVyICogNCkpDQoNCi8qIC0tLSBDTUQgUmVnaXN0ZXIgLS0tKi8NCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFNESU9TVVNQRU5EIGJpdCAqLw0KI2RlZmluZSBDTURfT0ZGU0VUICAgICAgICAgICAgICAgIChTRElPX09GRlNFVCArIDB4MEMpDQojZGVmaW5lIFNESU9TVVNQRU5EX0JpdE51bWJlciAgICAgMHgwQg0KI2RlZmluZSBDTURfU0RJT1NVU1BFTkRfQkIgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDTURfT0ZGU0VUICogMzIpICsgKFNESU9TVVNQRU5EX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgRU5DTURDT01QTCBiaXQgKi8NCiNkZWZpbmUgRU5DTURDT01QTF9CaXROdW1iZXIgICAgICAweDBDDQojZGVmaW5lIENNRF9FTkNNRENPTVBMX0JCICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENNRF9PRkZTRVQgKiAzMikgKyAoRU5DTURDT01QTF9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIE5JRU4gYml0ICovDQojZGVmaW5lIE5JRU5fQml0TnVtYmVyICAgICAgICAgICAgMHgwRA0KI2RlZmluZSBDTURfTklFTl9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDTURfT0ZGU0VUICogMzIpICsgKE5JRU5fQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBBVEFDTUQgYml0ICovDQojZGVmaW5lIEFUQUNNRF9CaXROdW1iZXIgICAgICAgICAgMHgwRQ0KI2RlZmluZSBDTURfQVRBQ01EX0JCICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDTURfT0ZGU0VUICogMzIpICsgKEFUQUNNRF9CaXROdW1iZXIgKiA0KSkNCg0KLyogLS0tIERDVFJMIFJlZ2lzdGVyIC0tLSovDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBETUFFTiBiaXQgKi8NCiNkZWZpbmUgRENUUkxfT0ZGU0VUICAgICAgICAgICAgICAoU0RJT19PRkZTRVQgKyAweDJDKQ0KI2RlZmluZSBETUFFTl9CaXROdW1iZXIgICAgICAgICAgIDB4MDMNCiNkZWZpbmUgRENUUkxfRE1BRU5fQkIgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoRENUUkxfT0ZGU0VUICogMzIpICsgKERNQUVOX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgUldTVEFSVCBiaXQgKi8NCiNkZWZpbmUgUldTVEFSVF9CaXROdW1iZXIgICAgICAgICAweDA4DQojZGVmaW5lIERDVFJMX1JXU1RBUlRfQkIgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKERDVFJMX09GRlNFVCAqIDMyKSArIChSV1NUQVJUX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgUldTVE9QIGJpdCAqLw0KI2RlZmluZSBSV1NUT1BfQml0TnVtYmVyICAgICAgICAgIDB4MDkNCiNkZWZpbmUgRENUUkxfUldTVE9QX0JCICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoRENUUkxfT0ZGU0VUICogMzIpICsgKFJXU1RPUF9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFJXTU9EIGJpdCAqLw0KI2RlZmluZSBSV01PRF9CaXROdW1iZXIgICAgICAgICAgIDB4MEENCiNkZWZpbmUgRENUUkxfUldNT0RfQkIgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoRENUUkxfT0ZGU0VUICogMzIpICsgKFJXTU9EX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgU0RJT0VOIGJpdCAqLw0KI2RlZmluZSBTRElPRU5fQml0TnVtYmVyICAgICAgICAgIDB4MEINCiNkZWZpbmUgRENUUkxfU0RJT0VOX0JCICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoRENUUkxfT0ZGU0VUICogMzIpICsgKFNESU9FTl9CaXROdW1iZXIgKiA0KSkNCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIHJlZ2lzdGVycyBiaXQgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyogLS0tIENMS0NSIFJlZ2lzdGVyIC0tLSovDQoNCi8qIENMS0NSIHJlZ2lzdGVyIGNsZWFyIG1hc2sgKi8NCiNkZWZpbmUgQ0xLQ1JfQ0xFQVJfTUFTSyAgICAgICAgICgodWludDMyX3QpMHhGRkZGODEwMCkgDQoNCi8qIC0tLSBQV1JDVFJMIFJlZ2lzdGVyIC0tLSovDQoNCi8qIFNESU8gUFdSQ1RSTCBNYXNrICovDQojZGVmaW5lIFBXUl9QV1JDVFJMX01BU0sgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRkMpDQoNCi8qIC0tLSBEQ1RSTCBSZWdpc3RlciAtLS0qLw0KDQovKiBTRElPIERDVFJMIENsZWFyIE1hc2sgKi8NCiNkZWZpbmUgRENUUkxfQ0xFQVJfTUFTSyAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkYwOCkNCg0KLyogLS0tIENNRCBSZWdpc3RlciAtLS0qLw0KDQovKiBDTUQgUmVnaXN0ZXIgY2xlYXIgbWFzayAqLw0KI2RlZmluZSBDTURfQ0xFQVJfTUFTSyAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGODAwKQ0KDQovKiBTRElPIFJFU1AgUmVnaXN0ZXJzIEFkZHJlc3MgKi8NCiNkZWZpbmUgU0RJT19SRVNQX0FERFIgICAgICAgICAgICgodWludDMyX3QpKFNESU9fQkFTRSArIDB4MTQpKQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNESU9fUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBTRElPIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiAgKiAgIHJlc2V0IHZhbHVlcy4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBTRElPX0RlSW5pdCh2b2lkKQ0Kew0KICBTRElPLT5QT1dFUiA9IDB4MDAwMDAwMDA7DQogIFNESU8tPkNMS0NSID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+QVJHID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+Q01EID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+RFRJTUVSID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+RExFTiA9IDB4MDAwMDAwMDA7DQogIFNESU8tPkRDVFJMID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+SUNSID0gMHgwMEMwMDdGRjsNCiAgU0RJTy0+TUFTSyA9IDB4MDAwMDAwMDA7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNESU8gcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCANCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFNESU9fSW5pdFN0cnVjdC4NCiAgKiBAcGFyYW0gU0RJT19Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIFNESU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIA0KICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFNESU8gDQogICogICBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFNESU9fSW5pdChTRElPX0luaXRUeXBlRGVmKiBTRElPX0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX0NMT0NLX0VER0UoU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRWRnZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19DTE9DS19CWVBBU1MoU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrQnlwYXNzKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0NMT0NLX1BPV0VSX1NBVkUoU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrUG93ZXJTYXZlKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0JVU19XSURFKFNESU9fSW5pdFN0cnVjdC0+U0RJT19CdXNXaWRlKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChTRElPX0luaXRTdHJ1Y3QtPlNESU9fSGFyZHdhcmVGbG93Q29udHJvbCkpOyANCiAgIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gQ0xLQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgDQogIC8qIEdldCB0aGUgU0RJTyBDTEtDUiB2YWx1ZSAqLw0KICB0bXByZWcgPSBTRElPLT5DTEtDUjsNCiAgDQogIC8qIENsZWFyIENMS0RJViwgUFdSU0FWLCBCWVBBU1MsIFdJREJVUywgTkVHRURHRSwgSFdGQ19FTiBiaXRzICovDQogIHRtcHJlZyAmPSBDTEtDUl9DTEVBUl9NQVNLOw0KICANCiAgLyogU2V0IENMS0RJViBiaXRzIGFjY29yZGluZyB0byBTRElPX0Nsb2NrRGl2IHZhbHVlICovDQogIC8qIFNldCBQV1JTQVYgYml0IGFjY29yZGluZyB0byBTRElPX0Nsb2NrUG93ZXJTYXZlIHZhbHVlICovDQogIC8qIFNldCBCWVBBU1MgYml0IGFjY29yZGluZyB0byBTRElPX0Nsb2NrQnlwYXNzIHZhbHVlICovDQogIC8qIFNldCBXSURCVVMgYml0cyBhY2NvcmRpbmcgdG8gU0RJT19CdXNXaWRlIHZhbHVlICovDQogIC8qIFNldCBORUdFREdFIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ2xvY2tFZGdlIHZhbHVlICovDQogIC8qIFNldCBIV0ZDX0VOIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fSGFyZHdhcmVGbG93Q29udHJvbCB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja0RpdiAgfCBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tQb3dlclNhdmUgfA0KICAgICAgICAgICAgIFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja0J5cGFzcyB8IFNESU9fSW5pdFN0cnVjdC0+U0RJT19CdXNXaWRlIHwNCiAgICAgICAgICAgICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tFZGdlIHwgU0RJT19Jbml0U3RydWN0LT5TRElPX0hhcmR3YXJlRmxvd0NvbnRyb2wpOyANCiAgDQogIC8qIFdyaXRlIHRvIFNESU8gQ0xLQ1IgKi8NCiAgU0RJTy0+Q0xLQ1IgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBTRElPX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtIFNESU9fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBTRElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCANCiAgKiAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TdHJ1Y3RJbml0KFNESU9fSW5pdFR5cGVEZWYqIFNESU9fSW5pdFN0cnVjdCkNCnsNCiAgLyogU0RJT19Jbml0U3RydWN0IG1lbWJlcnMgZGVmYXVsdCB2YWx1ZSAqLw0KICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tEaXYgPSAweDAwOw0KICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tFZGdlID0gU0RJT19DbG9ja0VkZ2VfUmlzaW5nOw0KICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tCeXBhc3MgPSBTRElPX0Nsb2NrQnlwYXNzX0Rpc2FibGU7DQogIFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja1Bvd2VyU2F2ZSA9IFNESU9fQ2xvY2tQb3dlclNhdmVfRGlzYWJsZTsNCiAgU0RJT19Jbml0U3RydWN0LT5TRElPX0J1c1dpZGUgPSBTRElPX0J1c1dpZGVfMWI7DQogIFNESU9fSW5pdFN0cnVjdC0+U0RJT19IYXJkd2FyZUZsb3dDb250cm9sID0gU0RJT19IYXJkd2FyZUZsb3dDb250cm9sX0Rpc2FibGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU0RJTyBDbG9jay4NCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU0RJTyBDbG9jay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19DbG9ja0NtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgQ0xLQ1JfQ0xLRU5fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgcG93ZXIgc3RhdHVzIG9mIHRoZSBjb250cm9sbGVyLg0KICAqIEBwYXJhbSBTRElPX1Bvd2VyU3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgUG93ZXIgc3RhdGUuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIFNESU9fUG93ZXJTdGF0ZV9PRkYNCiAgKiBAYXJnIFNESU9fUG93ZXJTdGF0ZV9PTg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFNESU9fU2V0UG93ZXJTdGF0ZSh1aW50MzJfdCBTRElPX1Bvd2VyU3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX1BPV0VSX1NUQVRFKFNESU9fUG93ZXJTdGF0ZSkpOw0KICANCiAgU0RJTy0+UE9XRVIgJj0gUFdSX1BXUkNUUkxfTUFTSzsNCiAgU0RJTy0+UE9XRVIgfD0gU0RJT19Qb3dlclN0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdldHMgdGhlIHBvd2VyIHN0YXR1cyBvZiB0aGUgY29udHJvbGxlci4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogUG93ZXIgc3RhdHVzIG9mIHRoZSBjb250cm9sbGVyLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuDQogICogICBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoNCiAgKiAtIDB4MDA6IFBvd2VyIE9GRg0KICAqIC0gMHgwMjogUG93ZXIgVVANCiAgKiAtIDB4MDM6IFBvd2VyIE9OIA0KICAqLw0KdWludDMyX3QgU0RJT19HZXRQb3dlclN0YXRlKHZvaWQpDQp7DQogIHJldHVybiAoU0RJTy0+UE9XRVIgJiAoflBXUl9QV1JDVFJMX01BU0spKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTRElPIGludGVycnVwdHMuDQogICogQHBhcmFtIFNESU9fSVQ6IHNwZWNpZmllcyB0aGUgU0RJTyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSANCiAgKiAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBTRElPX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0RUSU1FT1VUOiBEYXRhIHRpbWVvdXQgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1RYVU5ERVJSOiBUcmFuc21pdCBGSUZPIHVuZGVycnVuIGVycm9yIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1NUQklURVJSOiBTdGFydCBiaXQgbm90IGRldGVjdGVkIG9uIGFsbCBkYXRhIHNpZ25hbHMgaW4gd2lkZSANCiAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1cyBtb2RlIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfQ01EQUNUOiAgIENvbW1hbmQgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1RYQUNUOiAgICBEYXRhIHRyYW5zbWl0IGluIHByb2dyZXNzIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9SWEFDVDogICAgRGF0YSByZWNlaXZlIGluIHByb2dyZXNzIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9UWEZJRk9IRTogVHJhbnNtaXQgRklGTyBIYWxmIEVtcHR5IGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9SWEZJRk9IRjogUmVjZWl2ZSBGSUZPIEhhbGYgRnVsbCBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfVFhGSUZPRjogIFRyYW5zbWl0IEZJRk8gZnVsbCBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfUlhGSUZPRjogIFJlY2VpdmUgRklGTyBmdWxsIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9UWEZJRk9FOiAgVHJhbnNtaXQgRklGTyBlbXB0eSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfVFhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHRyYW5zbWl0IEZJRk8gaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1JYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiByZWNlaXZlIEZJRk8gaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9DRUFUQUVORDogQ0UtQVRBIGNvbW1hbmQgY29tcGxldGlvbiBzaWduYWwgcmVjZWl2ZWQgZm9yIENNRDYxIA0KICAqICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0DQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBTRElPIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBOb25lIA0KICAqLw0Kdm9pZCBTRElPX0lUQ29uZmlnKHVpbnQzMl90IFNESU9fSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fSVQoU0RJT19JVCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFNESU8gaW50ZXJydXB0cyAqLw0KICAgIFNESU8tPk1BU0sgfD0gU0RJT19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBTRElPIGludGVycnVwdHMgKi8NCiAgICBTRElPLT5NQVNLICY9IH5TRElPX0lUOw0KICB9IA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNESU8gRE1BIHJlcXVlc3QuDQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIFNESU8gRE1BIHJlcXVlc3QuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFNESU9fRE1BQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBEQ1RSTF9ETUFFTl9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0RJTyBDb21tYW5kIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgU0RJT19DbWRJbml0U3RydWN0IGFuZCBzZW5kIHRoZSBjb21tYW5kLg0KICAqIEBwYXJhbSBTRElPX0NtZEluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgU0RJT19DbWRJbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIA0KICAqICAgZm9yIHRoZSBTRElPIGNvbW1hbmQuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZW5kQ29tbWFuZChTRElPX0NtZEluaXRUeXBlRGVmICpTRElPX0NtZEluaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19DTURfSU5ERVgoU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NtZEluZGV4KSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX1JFU1BPTlNFKFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19SZXNwb25zZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19XQUlUKFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0KSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0NQU00oU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU00pKTsNCiAgDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RJTyBBUkcgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgdGhlIFNESU8gQXJndW1lbnQgdmFsdWUgKi8NCiAgU0RJTy0+QVJHID0gU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0FyZ3VtZW50Ow0KICANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIENNRCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICANCiAgLyogR2V0IHRoZSBTRElPIENNRCB2YWx1ZSAqLw0KICB0bXByZWcgPSBTRElPLT5DTUQ7DQogIC8qIENsZWFyIENNRElOREVYLCBXQUlUUkVTUCwgV0FJVElOVCwgV0FJVFBFTkQsIENQU01FTiBiaXRzICovDQogIHRtcHJlZyAmPSBDTURfQ0xFQVJfTUFTSzsNCiAgLyogU2V0IENNRElOREVYIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ21kSW5kZXggdmFsdWUgKi8NCiAgLyogU2V0IFdBSVRSRVNQIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fUmVzcG9uc2UgdmFsdWUgKi8NCiAgLyogU2V0IFdBSVRJTlQgYW5kIFdBSVRQRU5EIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fV2FpdCB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BTTUVOIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ1BTTSB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHVpbnQzMl90KVNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19DbWRJbmRleCB8IFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19SZXNwb25zZQ0KICAgICAgICAgICB8IFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0IHwgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU007DQogIA0KICAvKiBXcml0ZSB0byBTRElPIENNRCAqLw0KICBTRElPLT5DTUQgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBTRElPX0NtZEluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtIFNESU9fQ21kSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBTRElPX0NtZEluaXRUeXBlRGVmIA0KICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19DbWRTdHJ1Y3RJbml0KFNESU9fQ21kSW5pdFR5cGVEZWYqIFNESU9fQ21kSW5pdFN0cnVjdCkNCnsNCiAgLyogU0RJT19DbWRJbml0U3RydWN0IG1lbWJlcnMgZGVmYXVsdCB2YWx1ZSAqLw0KICBTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fQXJndW1lbnQgPSAweDAwOw0KICBTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fQ21kSW5kZXggPSAweDAwOw0KICBTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fUmVzcG9uc2UgPSBTRElPX1Jlc3BvbnNlX05vOw0KICBTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fV2FpdCA9IFNESU9fV2FpdF9ObzsNCiAgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU00gPSBTRElPX0NQU01fRGlzYWJsZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIGNvbW1hbmQgaW5kZXggb2YgbGFzdCBjb21tYW5kIGZvciB3aGljaCByZXNwb25zZSANCiAgKiAgIHJlY2VpdmVkLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgOiBSZXR1cm5zIHRoZSBjb21tYW5kIGluZGV4IG9mIHRoZSBsYXN0IGNvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQuDQogICovDQp1aW50OF90IFNESU9fR2V0Q29tbWFuZFJlc3BvbnNlKHZvaWQpDQp7DQogIHJldHVybiAodWludDhfdCkoU0RJTy0+UkVTUENNRCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyByZXNwb25zZSByZWNlaXZlZCBmcm9tIHRoZSBjYXJkIGZvciB0aGUgbGFzdCBjb21tYW5kLg0KICAqIEBwYXJhbSBTRElPX1JFU1A6IFNwZWNpZmllcyB0aGUgU0RJTyByZXNwb25zZSByZWdpc3Rlci4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgU0RJT19SRVNQMTogUmVzcG9uc2UgUmVnaXN0ZXIgMQ0KICAqIEBhcmcgU0RJT19SRVNQMjogUmVzcG9uc2UgUmVnaXN0ZXIgMg0KICAqIEBhcmcgU0RJT19SRVNQMzogUmVzcG9uc2UgUmVnaXN0ZXIgMw0KICAqIEBhcmcgU0RJT19SRVNQNDogUmVzcG9uc2UgUmVnaXN0ZXIgNA0KICAqIEByZXR2YWwgOiBUaGUgQ29ycmVzcG9uZGluZyByZXNwb25zZSByZWdpc3RlciB2YWx1ZS4NCiAgKi8NCnVpbnQzMl90IFNESU9fR2V0UmVzcG9uc2UodWludDMyX3QgU0RJT19SRVNQKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19SRVNQKFNESU9fUkVTUCkpOw0KICANCiAgcmV0dXJuICgqKF9fSU8gdWludDMyX3QgKikoU0RJT19SRVNQX0FERFIgKyBTRElPX1JFU1ApKTsgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNESU8gZGF0YSBwYXRoIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgU0RJT19EYXRhSW5pdFN0cnVjdC4NCiAgKiBAcGFyYW0gU0RJT19EYXRhSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBTRElPX0RhdGFJbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIA0KICAqICAgZm9yIHRoZSBTRElPIGNvbW1hbmQuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19EYXRhQ29uZmlnKFNESU9fRGF0YUluaXRUeXBlRGVmKiBTRElPX0RhdGFJbml0U3RydWN0KQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fREFUQV9MRU5HVEgoU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhTGVuZ3RoKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0JMT0NLX1NJWkUoU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhQmxvY2tTaXplKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX1RSQU5TRkVSX0RJUihTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX1RyYW5zZmVyRGlyKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX1RSQU5TRkVSX01PREUoU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19UcmFuc2Zlck1vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fRFBTTShTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RQU00pKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gRFRJTUVSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IHRoZSBTRElPIERhdGEgVGltZU91dCB2YWx1ZSAqLw0KICBTRElPLT5EVElNRVIgPSBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFUaW1lT3V0Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RJTyBETEVOIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgdGhlIFNESU8gRGF0YUxlbmd0aCB2YWx1ZSAqLw0KICBTRElPLT5ETEVOID0gU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhTGVuZ3RoOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RJTyBEQ1RSTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgDQogIC8qIEdldCB0aGUgU0RJTyBEQ1RSTCB2YWx1ZSAqLw0KICB0bXByZWcgPSBTRElPLT5EQ1RSTDsNCiAgLyogQ2xlYXIgREVOLCBEVE1PREUsIERURElSIGFuZCBEQkNLU0laRSBiaXRzICovDQogIHRtcHJlZyAmPSBEQ1RSTF9DTEVBUl9NQVNLOw0KICAvKiBTZXQgREVOIGJpdCBhY2NvcmRpbmcgdG8gU0RJT19EUFNNIHZhbHVlICovDQogIC8qIFNldCBEVE1PREUgYml0IGFjY29yZGluZyB0byBTRElPX1RyYW5zZmVyTW9kZSB2YWx1ZSAqLw0KICAvKiBTZXQgRFRESVIgYml0IGFjY29yZGluZyB0byBTRElPX1RyYW5zZmVyRGlyIHZhbHVlICovDQogIC8qIFNldCBEQkNLU0laRSBiaXRzIGFjY29yZGluZyB0byBTRElPX0RhdGFCbG9ja1NpemUgdmFsdWUgKi8NCiAgdG1wcmVnIHw9ICh1aW50MzJfdClTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFCbG9ja1NpemUgfCBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX1RyYW5zZmVyRGlyDQogICAgICAgICAgIHwgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19UcmFuc2Zlck1vZGUgfCBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RQU007DQoNCiAgLyogV3JpdGUgdG8gU0RJTyBEQ1RSTCAqLw0KICBTRElPLT5EQ1RSTCA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBGaWxscyBlYWNoIFNESU9fRGF0YUluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtIFNESU9fRGF0YUluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYW4gU0RJT19EYXRhSW5pdFR5cGVEZWYgDQogICogICBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBTRElPX0RhdGFTdHJ1Y3RJbml0KFNESU9fRGF0YUluaXRUeXBlRGVmKiBTRElPX0RhdGFJbml0U3RydWN0KQ0Kew0KICAvKiBTRElPX0RhdGFJbml0U3RydWN0IG1lbWJlcnMgZGVmYXVsdCB2YWx1ZSAqLw0KICBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFUaW1lT3V0ID0gMHhGRkZGRkZGRjsNCiAgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhTGVuZ3RoID0gMHgwMDsNCiAgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhQmxvY2tTaXplID0gU0RJT19EYXRhQmxvY2tTaXplXzFiOw0KICBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX1RyYW5zZmVyRGlyID0gU0RJT19UcmFuc2ZlckRpcl9Ub0NhcmQ7DQogIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJNb2RlID0gU0RJT19UcmFuc2Zlck1vZGVfQmxvY2s7ICANCiAgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EUFNNID0gU0RJT19EUFNNX0Rpc2FibGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCA6IE51bWJlciBvZiByZW1haW5pbmcgZGF0YSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZA0KICAqLw0KdWludDMyX3QgU0RJT19HZXREYXRhQ291bnRlcih2b2lkKQ0KeyANCiAgcmV0dXJuIFNESU8tPkRDT1VOVDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWFkIG9uZSBkYXRhIHdvcmQgZnJvbSBSeCBGSUZPLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgOiBEYXRhIHJlY2VpdmVkDQogICovDQp1aW50MzJfdCBTRElPX1JlYWREYXRhKHZvaWQpDQp7IA0KICByZXR1cm4gU0RJTy0+RklGTzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBXcml0ZSBvbmUgZGF0YSB3b3JkIHRvIFR4IEZJRk8uDQogICogQHBhcmFtIERhdGE6IDMyLWJpdCBkYXRhIHdvcmQgdG8gd3JpdGUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19Xcml0ZURhdGEodWludDMyX3QgRGF0YSkNCnsgDQogIFNESU8tPkZJRk8gPSBEYXRhOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyBsZWZ0IHRvIGJlIHdyaXR0ZW4gdG8gb3IgcmVhZA0KICAqICAgZnJvbSBGSUZPLgkNCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogUmVtYWluaW5nIG51bWJlciBvZiB3b3Jkcy4NCiAgKi8NCnVpbnQzMl90IFNESU9fR2V0RklGT0NvdW50KHZvaWQpDQp7IA0KICByZXR1cm4gU0RJTy0+RklGT0NOVDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdGFydHMgdGhlIFNEIEkvTyBSZWFkIFdhaXQgb3BlcmF0aW9uLgkNCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU3RhcnQgU0RJTyBSZWFkIFdhaXQgb3BlcmF0aW9uLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TdGFydFNESU9SZWFkV2FpdChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgKihfX0lPIHVpbnQzMl90ICopIERDVFJMX1JXU1RBUlRfQkIgPSAodWludDMyX3QpIE5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFN0b3BzIHRoZSBTRCBJL08gUmVhZCBXYWl0IG9wZXJhdGlvbi4JDQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFN0b3AgU0RJTyBSZWFkIFdhaXQgb3BlcmF0aW9uLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TdG9wU0RJT1JlYWRXYWl0KEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgRENUUkxfUldTVE9QX0JCID0gKHVpbnQzMl90KSBOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIG9uZSBvZiB0aGUgdHdvIG9wdGlvbnMgb2YgaW5zZXJ0aW5nIHJlYWQgd2FpdCBpbnRlcnZhbC4NCiAgKiBAcGFyYW0gU0RJT19SZWFkV2FpdE1vZGU6IFNEIEkvTyBSZWFkIFdhaXQgb3BlcmF0aW9uIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRyZSBjYW4gYmU6DQogICogQGFyZyBTRElPX1JlYWRXYWl0TW9kZV9DTEs6IFJlYWQgV2FpdCBjb250cm9sIGJ5IHN0b3BwaW5nIFNESU9DTEsNCiAgKiBAYXJnIFNESU9fUmVhZFdhaXRNb2RlX0RBVEEyOiBSZWFkIFdhaXQgY29udHJvbCB1c2luZyBTRElPX0RBVEEyDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZXRTRElPUmVhZFdhaXRNb2RlKHVpbnQzMl90IFNESU9fUmVhZFdhaXRNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19SRUFEV0FJVF9NT0RFKFNESU9fUmVhZFdhaXRNb2RlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgRENUUkxfUldNT0RfQkIgPSBTRElPX1JlYWRXYWl0TW9kZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTRCBJL08gTW9kZSBPcGVyYXRpb24uDQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgU0RJTyBzcGVjaWZpYyBvcGVyYXRpb24uIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBTRElPX1NldFNESU9PcGVyYXRpb24oRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBEQ1RSTF9TRElPRU5fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU0QgSS9PIE1vZGUgc3VzcGVuZCBjb21tYW5kIHNlbmRpbmcuDQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFNEIEkvTyBNb2RlIHN1c3BlbmQgY29tbWFuZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZW5kU0RJT1N1c3BlbmRDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBDTURfU0RJT1NVU1BFTkRfQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbC4NCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiBjb21tYW5kIGNvbXBsZXRpb24gc2lnbmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgU0RJT19Db21tYW5kQ29tcGxldGlvbkNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgKihfX0lPIHVpbnQzMl90ICopIENNRF9FTkNNRENPTVBMX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIENFLUFUQSBpbnRlcnJ1cHQuDQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgQ0UtQVRBIGludGVycnVwdC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFNESU9fQ0VBVEFJVENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgKihfX0lPIHVpbnQzMl90ICopIENNRF9OSUVOX0JCID0gKHVpbnQzMl90KSgofigodWludDMyX3QpTmV3U3RhdGUpKSAmICgodWludDMyX3QpMHgxKSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VuZHMgQ0UtQVRBIGNvbW1hbmQgKENNRDYxKS4NCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiBDRS1BVEEgY29tbWFuZC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFNESU9fU2VuZENFQVRBQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgQ01EX0FUQUNNRF9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNESU8gZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSBTRElPX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgU0RJT19GTEFHX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQ0KICAqIEBhcmcgU0RJT19GTEFHX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpDQogICogQGFyZyBTRElPX0ZMQUdfQ1RJTUVPVVQ6IENvbW1hbmQgcmVzcG9uc2UgdGltZW91dA0KICAqIEBhcmcgU0RJT19GTEFHX0RUSU1FT1VUOiBEYXRhIHRpbWVvdXQNCiAgKiBAYXJnIFNESU9fRkxBR19UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvcg0KICAqIEBhcmcgU0RJT19GTEFHX1JYT1ZFUlI6ICBSZWNlaXZlZCBGSUZPIG92ZXJydW4gZXJyb3INCiAgKiBAYXJnIFNESU9fRkxBR19DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkNCiAgKiBAYXJnIFNESU9fRkxBR19DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkNCiAgKiBAYXJnIFNESU9fRkxBR19EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgU0RJRENPVU5ULCBpcyB6ZXJvKQ0KICAqIEBhcmcgU0RJT19GTEFHX1NUQklURVJSOiBTdGFydCBiaXQgbm90IGRldGVjdGVkIG9uIGFsbCBkYXRhIHNpZ25hbHMgaW4gd2lkZSANCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUuDQogICogQGFyZyBTRElPX0ZMQUdfREJDS0VORDogIERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkNCiAgKiBAYXJnIFNESU9fRkxBR19DTURBQ1Q6ICAgQ29tbWFuZCB0cmFuc2ZlciBpbiBwcm9ncmVzcw0KICAqIEBhcmcgU0RJT19GTEFHX1RYQUNUOiAgICBEYXRhIHRyYW5zbWl0IGluIHByb2dyZXNzDQogICogQGFyZyBTRElPX0ZMQUdfUlhBQ1Q6ICAgIERhdGEgcmVjZWl2ZSBpbiBwcm9ncmVzcw0KICAqIEBhcmcgU0RJT19GTEFHX1RYRklGT0hFOiBUcmFuc21pdCBGSUZPIEhhbGYgRW1wdHkNCiAgKiBAYXJnIFNESU9fRkxBR19SWEZJRk9IRjogUmVjZWl2ZSBGSUZPIEhhbGYgRnVsbA0KICAqIEBhcmcgU0RJT19GTEFHX1RYRklGT0Y6ICBUcmFuc21pdCBGSUZPIGZ1bGwNCiAgKiBAYXJnIFNESU9fRkxBR19SWEZJRk9GOiAgUmVjZWl2ZSBGSUZPIGZ1bGwNCiAgKiBAYXJnIFNESU9fRkxBR19UWEZJRk9FOiAgVHJhbnNtaXQgRklGTyBlbXB0eQ0KICAqIEBhcmcgU0RJT19GTEFHX1JYRklGT0U6ICBSZWNlaXZlIEZJRk8gZW1wdHkNCiAgKiBAYXJnIFNESU9fRkxBR19UWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gdHJhbnNtaXQgRklGTw0KICAqIEBhcmcgU0RJT19GTEFHX1JYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiByZWNlaXZlIEZJRk8NCiAgKiBAYXJnIFNESU9fRkxBR19TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZA0KICAqIEBhcmcgU0RJT19GTEFHX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjENCiAgKiBAcmV0dmFsIDogVGhlIG5ldyBzdGF0ZSBvZiBTRElPX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIFNESU9fR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBTRElPX0ZMQUcpDQp7IA0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fRkxBRyhTRElPX0ZMQUcpKTsNCiAgDQogIGlmICgoU0RJTy0+U1RBICYgU0RJT19GTEFHKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFNESU8ncyBwZW5kaW5nIGZsYWdzLg0KICAqIEBwYXJhbSBTRElPX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgU0RJT19GTEFHX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQ0KICAqIEBhcmcgU0RJT19GTEFHX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpDQogICogQGFyZyBTRElPX0ZMQUdfQ1RJTUVPVVQ6IENvbW1hbmQgcmVzcG9uc2UgdGltZW91dA0KICAqIEBhcmcgU0RJT19GTEFHX0RUSU1FT1VUOiBEYXRhIHRpbWVvdXQNCiAgKiBAYXJnIFNESU9fRkxBR19UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvcg0KICAqIEBhcmcgU0RJT19GTEFHX1JYT1ZFUlI6ICBSZWNlaXZlZCBGSUZPIG92ZXJydW4gZXJyb3INCiAgKiBAYXJnIFNESU9fRkxBR19DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkNCiAgKiBAYXJnIFNESU9fRkxBR19DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkNCiAgKiBAYXJnIFNESU9fRkxBR19EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgU0RJRENPVU5ULCBpcyB6ZXJvKQ0KICAqIEBhcmcgU0RJT19GTEFHX1NUQklURVJSOiBTdGFydCBiaXQgbm90IGRldGVjdGVkIG9uIGFsbCBkYXRhIHNpZ25hbHMgaW4gd2lkZSANCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUNCiAgKiBAYXJnIFNESU9fRkxBR19EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQ0KICAqIEBhcmcgU0RJT19GTEFHX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkDQogICogQGFyZyBTRElPX0ZMQUdfQ0VBVEFFTkQ6IENFLUFUQSBjb21tYW5kIGNvbXBsZXRpb24gc2lnbmFsIHJlY2VpdmVkIGZvciBDTUQ2MQ0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFNESU9fQ2xlYXJGbGFnKHVpbnQzMl90IFNESU9fRkxBRykNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX0NMRUFSX0ZMQUcoU0RJT19GTEFHKSk7DQogICANCiAgU0RJTy0+SUNSID0gU0RJT19GTEFHOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU0RJTyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiAgKiBAcGFyYW0gU0RJT19JVDogc3BlY2lmaWVzIHRoZSBTRElPIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIFNESU9fSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfQ1RJTUVPVVQ6IENvbW1hbmQgcmVzcG9uc2UgdGltZW91dCBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfRFRJTUVPVVQ6IERhdGEgdGltZW91dCBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfVFhVTkRFUlI6IFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gZXJyb3IgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1JYT1ZFUlI6ICBSZWNlaXZlZCBGSUZPIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgU0RJRENPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfU1RCSVRFUlI6IFN0YXJ0IGJpdCBub3QgZGV0ZWN0ZWQgb24gYWxsIGRhdGEgc2lnbmFscyBpbiB3aWRlIA0KICAqICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0RCQ0tFTkQ6ICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9DTURBQ1Q6ICAgQ29tbWFuZCB0cmFuc2ZlciBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1JYQUNUOiAgICBEYXRhIHJlY2VpdmUgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1RYRklGT0hFOiBUcmFuc21pdCBGSUZPIEhhbGYgRW1wdHkgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1JYRklGT0hGOiBSZWNlaXZlIEZJRk8gSGFsZiBGdWxsIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9UWEZJRk9GOiAgVHJhbnNtaXQgRklGTyBmdWxsIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9SWEZJRk9GOiAgUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX1RYRklGT0U6ICBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9SWEZJRk9FOiAgUmVjZWl2ZSBGSUZPIGVtcHR5IGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9UWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gdHJhbnNtaXQgRklGTyBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTyBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfU0RJT0lUOiAgIFNEIEkvTyBpbnRlcnJ1cHQgcmVjZWl2ZWQgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjEgDQogICogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQNCiAgKiBAcmV0dmFsIDogVGhlIG5ldyBzdGF0ZSBvZiBTRElPX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgU0RJT19HZXRJVFN0YXR1cyh1aW50MzJfdCBTRElPX0lUKQ0KeyANCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19HRVRfSVQoU0RJT19JVCkpOw0KICBpZiAoKFNESU8tPlNUQSAmIFNESU9fSVQpICE9ICh1aW50MzJfdClSRVNFVCkgIA0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBTRElPknMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gU0RJT19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgU0RJT19JVF9DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9DVElNRU9VVDogQ29tbWFuZCByZXNwb25zZSB0aW1lb3V0IGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9EVElNRU9VVDogRGF0YSB0aW1lb3V0IGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pIGludGVycnVwdA0KICAqIEBhcmcgU0RJT19JVF9TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQogICogICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZSBpbnRlcnJ1cHQNCiAgKiBAYXJnIFNESU9fSVRfU0RJT0lUOiAgIFNEIEkvTyBpbnRlcnJ1cHQgcmVjZWl2ZWQgaW50ZXJydXB0DQogICogQGFyZyBTRElPX0lUX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjENCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBTRElPX0NsZWFySVRQZW5kaW5nQml0KHVpbnQzMl90IFNESU9fSVQpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19DTEVBUl9JVChTRElPX0lUKSk7DQogICANCiAgU0RJTy0+SUNSID0gU0RJT19JVDsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA5IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==