ZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2FkYy5oIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfYWRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTcyNWYuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfYWRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2FkYy5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgQURDIGZpcm13YXJlIA0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X0FEQ19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9BRENfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIEFEQw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogDQotICAqIEBicmllZiAgQURDIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQzMl90IEFEQ19Nb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyB0byBvcGVyYXRlIGluIGluZGVwZW5kZW50IG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsIG1vZGUuIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfbW9kZSAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIEFEQ19TY2FuQ29udk1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FuIChtdWx0aWNoYW5uZWxzKSBvciBTaW5nbGUgKG9uZSBjaGFubmVsKSBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRSAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIEFEQ19Db250aW51b3VzQ29udk1vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGluDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250aW51b3VzIG9yIFNpbmdsZSBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8NCi0NCi0gIHVpbnQzMl90IEFEQ19FeHRlcm5hbFRyaWdDb252OyAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIGV4dGVybmFsIHRyaWdnZXIgdXNlZCB0byBzdGFydCB0aGUgYW5hbG9nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkaWdpdGFsIGNvbnZlcnNpb24gb2YgcmVndWxhciBjaGFubmVscy4gVGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX2V4dGVybmFsX3RyaWdnZXJfc291cmNlc19mb3JfcmVndWxhcl9jaGFubmVsc19jb252ZXJzaW9uICovDQotDQotICB1aW50MzJfdCBBRENfRGF0YUFsaWduOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgQURDIGRhdGEgYWxpZ25tZW50IGlzIGxlZnQgb3IgcmlnaHQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19kYXRhX2FsaWduICovDQotDQotICB1aW50OF90IEFEQ19OYnJPZkNoYW5uZWw7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBBREMgY2hhbm5lbHMgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIHNlcXVlbmNlciBmb3IgcmVndWxhciBjaGFubmVsIGdyb3VwLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCByYW5nZSBmcm9tIDEgdG8gMTYuICovDQotfUFEQ19Jbml0VHlwZURlZjsNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfQURDX0FMTF9QRVJJUEgoUEVSSVBIKSAoKChQRVJJUEgpID09IEFEQzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBBREMyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gQURDMykpDQotDQotI2RlZmluZSBJU19BRENfRE1BX1BFUklQSChQRVJJUEgpICgoKFBFUklQSCkgPT0gQURDMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IEFEQzMpKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQURDX01vZGVfSW5kZXBlbmRlbnQgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEFEQ19Nb2RlX1JlZ0luamVjU2ltdWx0ICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApDQotI2RlZmluZSBBRENfTW9kZV9SZWdTaW11bHRfQWx0ZXJUcmlnICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwKQ0KLSNkZWZpbmUgQURDX01vZGVfSW5qZWNTaW11bHRfRmFzdEludGVybCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAzMDAwMCkNCi0jZGVmaW5lIEFEQ19Nb2RlX0luamVjU2ltdWx0X1Nsb3dJbnRlcmwgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDApDQotI2RlZmluZSBBRENfTW9kZV9JbmplY1NpbXVsdCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDUwMDAwKQ0KLSNkZWZpbmUgQURDX01vZGVfUmVnU2ltdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA2MDAwMCkNCi0jZGVmaW5lIEFEQ19Nb2RlX0Zhc3RJbnRlcmwgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwNzAwMDApDQotI2RlZmluZSBBRENfTW9kZV9TbG93SW50ZXJsICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwKQ0KLSNkZWZpbmUgQURDX01vZGVfQWx0ZXJUcmlnICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA5MDAwMCkNCi0NCi0jZGVmaW5lIElTX0FEQ19NT0RFKE1PREUpICgoKE1PREUpID09IEFEQ19Nb2RlX0luZGVwZW5kZW50KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBBRENfTW9kZV9SZWdJbmplY1NpbXVsdCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfUmVnU2ltdWx0X0FsdGVyVHJpZykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfSW5qZWNTaW11bHRfRmFzdEludGVybCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfSW5qZWNTaW11bHRfU2xvd0ludGVybCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfSW5qZWNTaW11bHQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEFEQ19Nb2RlX1JlZ1NpbXVsdCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfRmFzdEludGVybCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfU2xvd0ludGVybCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQURDX01vZGVfQWx0ZXJUcmlnKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfZXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2VzX2Zvcl9yZWd1bGFyX2NoYW5uZWxzX2NvbnZlcnNpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDFfQ0MxICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDFfQ0MyICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDJfQ0MyICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA2MDAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDNfVFJHTyAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA4MDAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDRfQ0M0ICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDBBMDAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfRXh0X0lUMTFfVElNOF9UUkdPICAgICgodWludDMyX3QpMHgwMDBDMDAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLQ0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDFfQ0MzICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMCkgLyohPCBGb3IgQURDMSwgQURDMiBhbmQgQURDMyAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfTm9uZSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDBFMDAwMCkgLyohPCBGb3IgQURDMSwgQURDMiBhbmQgQURDMyAqLw0KLQ0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDNfQ0MxICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgLyohPCBGb3IgQURDMyBvbmx5ICovDQotI2RlZmluZSBBRENfRXh0ZXJuYWxUcmlnQ29udl9UMl9DQzMgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwKSAvKiE8IEZvciBBREMzIG9ubHkgKi8NCi0jZGVmaW5lIEFEQ19FeHRlcm5hbFRyaWdDb252X1Q4X0NDMSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwNjAwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0NvbnZfVDhfVFJHTyAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA4MDAwMCkgLyohPCBGb3IgQURDMyBvbmx5ICovDQotI2RlZmluZSBBRENfRXh0ZXJuYWxUcmlnQ29udl9UNV9DQzEgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEEwMDAwKSAvKiE8IEZvciBBREMzIG9ubHkgKi8NCi0jZGVmaW5lIEFEQ19FeHRlcm5hbFRyaWdDb252X1Q1X0NDMyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwQzAwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLQ0KLSNkZWZpbmUgSVNfQURDX0VYVF9UUklHKFJFR1RSSUcpICgoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1QxX0NDMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1QxX0NDMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1QxX0NDMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1QyX0NDMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1QzX1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnQ29udl9UNF9DQzQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnQ29udl9FeHRfSVQxMV9USU04X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnQ29udl9Ob25lKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0NvbnZfVDNfQ0MxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0NvbnZfVDJfQ0MzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0NvbnZfVDhfQ0MxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0NvbnZfVDhfVFJHTykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1Q1X0NDMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdDb252X1Q1X0NDMykpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX2RhdGFfYWxpZ24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQURDX0RhdGFBbGlnbl9SaWdodCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEFEQ19EYXRhQWxpZ25fTGVmdCAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApDQotI2RlZmluZSBJU19BRENfREFUQV9BTElHTihBTElHTikgKCgoQUxJR04pID09IEFEQ19EYXRhQWxpZ25fUmlnaHQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTElHTikgPT0gQURDX0RhdGFBbGlnbl9MZWZ0KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfY2hhbm5lbHMgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkNCi0jZGVmaW5lIEFEQ19DaGFubmVsXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpDQotI2RlZmluZSBBRENfQ2hhbm5lbF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMykNCi0jZGVmaW5lIEFEQ19DaGFubmVsXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDQpDQotI2RlZmluZSBBRENfQ2hhbm5lbF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1KQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikNCi0jZGVmaW5lIEFEQ19DaGFubmVsXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDcpDQotI2RlZmluZSBBRENfQ2hhbm5lbF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA4KQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOSkNCi0jZGVmaW5lIEFEQ19DaGFubmVsXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MEEpDQotI2RlZmluZSBBRENfQ2hhbm5lbF8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDBCKQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQykNCi0jZGVmaW5lIEFEQ19DaGFubmVsXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MEQpDQotI2RlZmluZSBBRENfQ2hhbm5lbF8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDBFKQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwRikNCi0jZGVmaW5lIEFEQ19DaGFubmVsXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTApDQotI2RlZmluZSBBRENfQ2hhbm5lbF8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDExKQ0KLQ0KLSNkZWZpbmUgQURDX0NoYW5uZWxfVGVtcFNlbnNvciAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpQURDX0NoYW5uZWxfMTYpDQotI2RlZmluZSBBRENfQ2hhbm5lbF9WcmVmaW50ICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdClBRENfQ2hhbm5lbF8xNykNCi0NCi0jZGVmaW5lIElTX0FEQ19DSEFOTkVMKENIQU5ORUwpICgoKENIQU5ORUwpID09IEFEQ19DaGFubmVsXzApIHx8ICgoQ0hBTk5FTCkgPT0gQURDX0NoYW5uZWxfMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NoYW5uZWxfMikgfHwgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF8zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF80KSB8fCAoKENIQU5ORUwpID09IEFEQ19DaGFubmVsXzUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DaGFubmVsXzYpIHx8ICgoQ0hBTk5FTCkgPT0gQURDX0NoYW5uZWxfNykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NoYW5uZWxfOCkgfHwgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF85KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF8xMCkgfHwgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF8xMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0NoYW5uZWxfMTIpIHx8ICgoQ0hBTk5FTCkgPT0gQURDX0NoYW5uZWxfMTMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DaGFubmVsXzE0KSB8fCAoKENIQU5ORUwpID09IEFEQ19DaGFubmVsXzE1KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF8xNikgfHwgKChDSEFOTkVMKSA9PSBBRENfQ2hhbm5lbF8xNykpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX3NhbXBsaW5nX3RpbWUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfMUN5Y2xlczUgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwKQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfN0N5Y2xlczUgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfMTNDeWNsZXM1ICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfMjhDeWNsZXM1ICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzKQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfNDFDeWNsZXM1ICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0KQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfNTVDeWNsZXM1ICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1KQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfNzFDeWNsZXM1ICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2KQ0KLSNkZWZpbmUgQURDX1NhbXBsZVRpbWVfMjM5Q3ljbGVzNSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3KQ0KLSNkZWZpbmUgSVNfQURDX1NBTVBMRV9USU1FKFRJTUUpICgoKFRJTUUpID09IEFEQ19TYW1wbGVUaW1lXzFDeWNsZXM1KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NhbXBsZVRpbWVfN0N5Y2xlczUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU2FtcGxlVGltZV8xM0N5Y2xlczUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU2FtcGxlVGltZV8yOEN5Y2xlczUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU2FtcGxlVGltZV80MUN5Y2xlczUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU2FtcGxlVGltZV81NUN5Y2xlczUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU2FtcGxlVGltZV83MUN5Y2xlczUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU2FtcGxlVGltZV8yMzlDeWNsZXM1KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfZXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2VzX2Zvcl9pbmplY3RlZF9jaGFubmVsc19jb252ZXJzaW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDJfVFJHTyAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwKSAvKiE8IEZvciBBREMxIGFuZCBBREMyICovDQotI2RlZmluZSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QyX0NDMSAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMzAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UM19DQzQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApIC8qITwgRm9yIEFEQzEgYW5kIEFEQzIgKi8NCi0jZGVmaW5lIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDRfVFJHTyAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA1MDAwKSAvKiE8IEZvciBBREMxIGFuZCBBREMyICovDQotI2RlZmluZSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X0V4dF9JVDE1X1RJTThfQ0M0ICgodWludDMyX3QpMHgwMDAwNjAwMCkgLyohPCBGb3IgQURDMSBhbmQgQURDMiAqLw0KLQ0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UMV9UUkdPICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApIC8qITwgRm9yIEFEQzEsIEFEQzIgYW5kIEFEQzMgKi8NCi0jZGVmaW5lIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfQ0M0ICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxMDAwKSAvKiE8IEZvciBBREMxLCBBREMyIGFuZCBBREMzICovDQotI2RlZmluZSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X05vbmUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwNzAwMCkgLyohPCBGb3IgQURDMSwgQURDMiBhbmQgQURDMyAqLw0KLQ0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UNF9DQzMgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UOF9DQzIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDMwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UOF9DQzQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UNV9UUkdPICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDUwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLSNkZWZpbmUgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UNV9DQzQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDYwMDApIC8qITwgRm9yIEFEQzMgb25seSAqLw0KLQ0KLSNkZWZpbmUgSVNfQURDX0VYVF9JTkpFQ19UUklHKElOSlRSSUcpICgoKElOSlRSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfVFJHTykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfQ0M0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UMl9UUkdPKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UMl9DQzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QzX0NDNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDRfVFJHTykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfRXh0X0lUMTVfVElNOF9DQzQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X05vbmUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1Q0X0NDMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOSlRSSUcpID09IEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDhfQ0MyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5KVFJJRykgPT0gQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UOF9DQzQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1Q1X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTkpUUklHKSA9PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1Q1X0NDNCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX2luamVjdGVkX2NoYW5uZWxfc2VsZWN0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEFEQ19JbmplY3RlZENoYW5uZWxfMSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTQpDQotI2RlZmluZSBBRENfSW5qZWN0ZWRDaGFubmVsXzIgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDE4KQ0KLSNkZWZpbmUgQURDX0luamVjdGVkQ2hhbm5lbF8zICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxQykNCi0jZGVmaW5lIEFEQ19JbmplY3RlZENoYW5uZWxfNCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MjApDQotI2RlZmluZSBJU19BRENfSU5KRUNURURfQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBBRENfSW5qZWN0ZWRDaGFubmVsXzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19JbmplY3RlZENoYW5uZWxfMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gQURDX0luamVjdGVkQ2hhbm5lbF8zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfSW5qZWN0ZWRDaGFubmVsXzQpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19hbmFsb2dfd2F0Y2hkb2dfc2VsZWN0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEFEQ19BbmFsb2dXYXRjaGRvZ19TaW5nbGVSZWdFbmFibGUgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAyMDApDQotI2RlZmluZSBBRENfQW5hbG9nV2F0Y2hkb2dfU2luZ2xlSW5qZWNFbmFibGUgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMjAwKQ0KLSNkZWZpbmUgQURDX0FuYWxvZ1dhdGNoZG9nX1NpbmdsZVJlZ09ySW5qZWNFbmFibGUgICgodWludDMyX3QpMHgwMEMwMDIwMCkNCi0jZGVmaW5lIEFEQ19BbmFsb2dXYXRjaGRvZ19BbGxSZWdFbmFibGUgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQotI2RlZmluZSBBRENfQW5hbG9nV2F0Y2hkb2dfQWxsSW5qZWNFbmFibGUgICAgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwKQ0KLSNkZWZpbmUgQURDX0FuYWxvZ1dhdGNoZG9nX0FsbFJlZ0FsbEluamVjRW5hYmxlICAgICgodWludDMyX3QpMHgwMEMwMDAwMCkNCi0jZGVmaW5lIEFEQ19BbmFsb2dXYXRjaGRvZ19Ob25lICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotDQotI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HKFdBVENIRE9HKSAoKChXQVRDSERPRykgPT0gQURDX0FuYWxvZ1dhdGNoZG9nX1NpbmdsZVJlZ0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FUQ0hET0cpID09IEFEQ19BbmFsb2dXYXRjaGRvZ19TaW5nbGVJbmplY0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FUQ0hET0cpID09IEFEQ19BbmFsb2dXYXRjaGRvZ19TaW5nbGVSZWdPckluamVjRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVRDSERPRykgPT0gQURDX0FuYWxvZ1dhdGNoZG9nX0FsbFJlZ0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FUQ0hET0cpID09IEFEQ19BbmFsb2dXYXRjaGRvZ19BbGxJbmplY0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FUQ0hET0cpID09IEFEQ19BbmFsb2dXYXRjaGRvZ19BbGxSZWdBbGxJbmplY0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FUQ0hET0cpID09IEFEQ19BbmFsb2dXYXRjaGRvZ19Ob25lKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfaW50ZXJydXB0c19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEFEQ19JVF9FT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIyMCkNCi0jZGVmaW5lIEFEQ19JVF9BV0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDE0MCkNCi0jZGVmaW5lIEFEQ19JVF9KRU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDQ4MCkNCi0NCi0jZGVmaW5lIElTX0FEQ19JVChJVCkgKCgoKElUKSAmICh1aW50MTZfdCkweEY4MUYpID09IDB4MDApICYmICgoSVQpICE9IDB4MDApKQ0KLQ0KLSNkZWZpbmUgSVNfQURDX0dFVF9JVChJVCkgKCgoSVQpID09IEFEQ19JVF9FT0MpIHx8ICgoSVQpID09IEFEQ19JVF9BV0QpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBBRENfSVRfSkVPQykpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX2ZsYWdzX2RlZmluaXRpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQURDX0ZMQUdfQVdEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQ0KLSNkZWZpbmUgQURDX0ZMQUdfRU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKQ0KLSNkZWZpbmUgQURDX0ZMQUdfSkVPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0KQ0KLSNkZWZpbmUgQURDX0ZMQUdfSlNUUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA4KQ0KLSNkZWZpbmUgQURDX0ZMQUdfU1RSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDEwKQ0KLSNkZWZpbmUgSVNfQURDX0NMRUFSX0ZMQUcoRkxBRykgKCgoKEZMQUcpICYgKHVpbnQ4X3QpMHhFMCkgPT0gMHgwMCkgJiYgKChGTEFHKSAhPSAweDAwKSkNCi0jZGVmaW5lIElTX0FEQ19HRVRfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBBRENfRkxBR19BV0QpIHx8ICgoRkxBRykgPT0gQURDX0ZMQUdfRU9DKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQURDX0ZMQUdfSkVPQykgfHwgKChGTEFHKT09IEFEQ19GTEFHX0pTVFJUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQURDX0ZMQUdfU1RSVCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX3RocmVzaG9sZHMgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfQURDX1RIUkVTSE9MRChUSFJFU0hPTEQpICgoVEhSRVNIT0xEKSA8PSAweEZGRikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfaW5qZWN0ZWRfb2Zmc2V0IA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0FEQ19PRkZTRVQoT0ZGU0VUKSAoKE9GRlNFVCkgPD0gMHhGRkYpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX2luamVjdGVkX2xlbmd0aCANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19BRENfSU5KRUNURURfTEVOR1RIKExFTkdUSCkgKCgoTEVOR1RIKSA+PSAweDEpICYmICgoTEVOR1RIKSA8PSAweDQpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19pbmplY3RlZF9yYW5rIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0FEQ19JTkpFQ1RFRF9SQU5LKFJBTkspICgoKFJBTkspID49IDB4MSkgJiYgKChSQU5LKSA8PSAweDQpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotDQotLyoqIEBkZWZncm91cCBBRENfcmVndWxhcl9sZW5ndGggDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfQURDX1JFR1VMQVJfTEVOR1RIKExFTkdUSCkgKCgoTEVOR1RIKSA+PSAweDEpICYmICgoTEVOR1RIKSA8PSAweDEwKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfcmVndWxhcl9yYW5rIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0FEQ19SRUdVTEFSX1JBTksoUkFOSykgKCgoUkFOSykgPj0gMHgxKSAmJiAoKFJBTkspIDw9IDB4MTApKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX2Rpc2NvbnRpbnVvdXNfbW9kZV9udW1iZXIgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfQURDX1JFR1VMQVJfRElTQ19OVU1CRVIoTlVNQkVSKSAoKChOVU1CRVIpID49IDB4MSkgJiYgKChOVU1CRVIpIDw9IDB4OCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIEFEQ19EZUluaXQoQURDX1R5cGVEZWYqIEFEQ3gpOw0KLXZvaWQgQURDX0luaXQoQURDX1R5cGVEZWYqIEFEQ3gsIEFEQ19Jbml0VHlwZURlZiogQURDX0luaXRTdHJ1Y3QpOw0KLXZvaWQgQURDX1N0cnVjdEluaXQoQURDX0luaXRUeXBlRGVmKiBBRENfSW5pdFN0cnVjdCk7DQotdm9pZCBBRENfQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgQURDX0RNQUNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEFEQ19JVENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDE2X3QgQURDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgQURDX1Jlc2V0Q2FsaWJyYXRpb24oQURDX1R5cGVEZWYqIEFEQ3gpOw0KLUZsYWdTdGF0dXMgQURDX0dldFJlc2V0Q2FsaWJyYXRpb25TdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gpOw0KLXZvaWQgQURDX1N0YXJ0Q2FsaWJyYXRpb24oQURDX1R5cGVEZWYqIEFEQ3gpOw0KLUZsYWdTdGF0dXMgQURDX0dldENhbGlicmF0aW9uU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4KTsNCi12b2lkIEFEQ19Tb2Z0d2FyZVN0YXJ0Q29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi1GbGFnU3RhdHVzIEFEQ19HZXRTb2Z0d2FyZVN0YXJ0Q29udlN0YXR1cyhBRENfVHlwZURlZiogQURDeCk7DQotdm9pZCBBRENfRGlzY01vZGVDaGFubmVsQ291bnRDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgTnVtYmVyKTsNCi12b2lkIEFEQ19EaXNjTW9kZUNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEFEQ19SZWd1bGFyQ2hhbm5lbENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfQ2hhbm5lbCwgdWludDhfdCBSYW5rLCB1aW50OF90IEFEQ19TYW1wbGVUaW1lKTsNCi12b2lkIEFEQ19FeHRlcm5hbFRyaWdDb252Q21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXVpbnQxNl90IEFEQ19HZXRDb252ZXJzaW9uVmFsdWUoQURDX1R5cGVEZWYqIEFEQ3gpOw0KLXVpbnQzMl90IEFEQ19HZXREdWFsTW9kZUNvbnZlcnNpb25WYWx1ZSh2b2lkKTsNCi12b2lkIEFEQ19BdXRvSW5qZWN0ZWRDb252Q21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgQURDX0luamVjdGVkRGlzY01vZGVDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBBRENfRXh0ZXJuYWxUcmlnSW5qZWN0ZWRDb252Q29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MzJfdCBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252KTsNCi12b2lkIEFEQ19FeHRlcm5hbFRyaWdJbmplY3RlZENvbnZDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBBRENfU29mdHdhcmVTdGFydEluamVjdGVkQ29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi1GbGFnU3RhdHVzIEFEQ19HZXRTb2Z0d2FyZVN0YXJ0SW5qZWN0ZWRDb252Q21kU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4KTsNCi12b2lkIEFEQ19JbmplY3RlZENoYW5uZWxDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgQURDX0NoYW5uZWwsIHVpbnQ4X3QgUmFuaywgdWludDhfdCBBRENfU2FtcGxlVGltZSk7DQotdm9pZCBBRENfSW5qZWN0ZWRTZXF1ZW5jZXJMZW5ndGhDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgTGVuZ3RoKTsNCi12b2lkIEFEQ19TZXRJbmplY3RlZE9mZnNldChBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfSW5qZWN0ZWRDaGFubmVsLCB1aW50MTZfdCBPZmZzZXQpOw0KLXVpbnQxNl90IEFEQ19HZXRJbmplY3RlZENvbnZlcnNpb25WYWx1ZShBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfSW5qZWN0ZWRDaGFubmVsKTsNCi12b2lkIEFEQ19BbmFsb2dXYXRjaGRvZ0NtZChBRENfVHlwZURlZiogQURDeCwgdWludDMyX3QgQURDX0FuYWxvZ1dhdGNoZG9nKTsNCi12b2lkIEFEQ19BbmFsb2dXYXRjaGRvZ1RocmVzaG9sZHNDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQxNl90IEhpZ2hUaHJlc2hvbGQsIHVpbnQxNl90IExvd1RocmVzaG9sZCk7DQotdm9pZCBBRENfQW5hbG9nV2F0Y2hkb2dTaW5nbGVDaGFubmVsQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IEFEQ19DaGFubmVsKTsNCi12b2lkIEFEQ19UZW1wU2Vuc29yVnJlZmludENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLUZsYWdTdGF0dXMgQURDX0dldEZsYWdTdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgQURDX0ZMQUcpOw0KLXZvaWQgQURDX0NsZWFyRmxhZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfRkxBRyk7DQotSVRTdGF0dXMgQURDX0dldElUU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MTZfdCBBRENfSVQpOw0KLXZvaWQgQURDX0NsZWFySVRQZW5kaW5nQml0KEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MTZfdCBBRENfSVQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLypfX1NUTTMyRjEweF9BRENfSCAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfYmtwLmggYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9ia3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0MGVjMi4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9ia3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfYmtwLmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBCS1AgZmlybXdhcmUgDQotICAqICAgICAgICAgIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfQktQX0gNCi0jZGVmaW5lIF9fU1RNMzJGMTB4X0JLUF9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotIGV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQktQDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQktQX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJLUF9FeHBvcnRlZF9Db25zdGFudHMNCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBUYW1wZXJfUGluX2FjdGl2ZV9sZXZlbCANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBCS1BfVGFtcGVyUGluTGV2ZWxfSGlnaCAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBCS1BfVGFtcGVyUGluTGV2ZWxfTG93ICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBJU19CS1BfVEFNUEVSX1BJTl9MRVZFTChMRVZFTCkgKCgoTEVWRUwpID09IEJLUF9UYW1wZXJQaW5MZXZlbF9IaWdoKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IEJLUF9UYW1wZXJQaW5MZXZlbF9Mb3cpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJUQ19vdXRwdXRfc291cmNlX3RvX291dHB1dF9vbl90aGVfVGFtcGVyX3BpbiANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBCS1BfUlRDT3V0cHV0U291cmNlX05vbmUgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBCS1BfUlRDT3V0cHV0U291cmNlX0NhbGliQ2xvY2sgICAgKCh1aW50MTZfdCkweDAwODApDQotI2RlZmluZSBCS1BfUlRDT3V0cHV0U291cmNlX0FsYXJtICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApDQotI2RlZmluZSBCS1BfUlRDT3V0cHV0U291cmNlX1NlY29uZCAgICAgICAgKCh1aW50MTZfdCkweDAzMDApDQotI2RlZmluZSBJU19CS1BfUlRDX09VVFBVVF9TT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IEJLUF9SVENPdXRwdXRTb3VyY2VfTm9uZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBCS1BfUlRDT3V0cHV0U291cmNlX0NhbGliQ2xvY2spIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gQktQX1JUQ091dHB1dFNvdXJjZV9BbGFybSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBCS1BfUlRDT3V0cHV0U291cmNlX1NlY29uZCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRGF0YV9CYWNrdXBfUmVnaXN0ZXIgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQktQX0RSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KQ0KLSNkZWZpbmUgQktQX0RSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLSNkZWZpbmUgQktQX0RSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDBDKQ0KLSNkZWZpbmUgQktQX0RSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwKQ0KLSNkZWZpbmUgQktQX0RSNSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDE0KQ0KLSNkZWZpbmUgQktQX0RSNiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDE4KQ0KLSNkZWZpbmUgQktQX0RSNyAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDFDKQ0KLSNkZWZpbmUgQktQX0RSOCAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwKQ0KLSNkZWZpbmUgQktQX0RSOSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDI0KQ0KLSNkZWZpbmUgQktQX0RSMTAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDI4KQ0KLSNkZWZpbmUgQktQX0RSMTEgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwKQ0KLSNkZWZpbmUgQktQX0RSMTIgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQ0KQ0KLSNkZWZpbmUgQktQX0RSMTMgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQ4KQ0KLSNkZWZpbmUgQktQX0RSMTQgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDRDKQ0KLSNkZWZpbmUgQktQX0RSMTUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDUwKQ0KLSNkZWZpbmUgQktQX0RSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDU0KQ0KLSNkZWZpbmUgQktQX0RSMTcgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDU4KQ0KLSNkZWZpbmUgQktQX0RSMTggICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDVDKQ0KLSNkZWZpbmUgQktQX0RSMTkgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDYwKQ0KLSNkZWZpbmUgQktQX0RSMjAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDY0KQ0KLSNkZWZpbmUgQktQX0RSMjEgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDY4KQ0KLSNkZWZpbmUgQktQX0RSMjIgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDZDKQ0KLSNkZWZpbmUgQktQX0RSMjMgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDcwKQ0KLSNkZWZpbmUgQktQX0RSMjQgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDc0KQ0KLSNkZWZpbmUgQktQX0RSMjUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDc4KQ0KLSNkZWZpbmUgQktQX0RSMjYgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDdDKQ0KLSNkZWZpbmUgQktQX0RSMjcgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDgwKQ0KLSNkZWZpbmUgQktQX0RSMjggICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDg0KQ0KLSNkZWZpbmUgQktQX0RSMjkgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDg4KQ0KLSNkZWZpbmUgQktQX0RSMzAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDhDKQ0KLSNkZWZpbmUgQktQX0RSMzEgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDkwKQ0KLSNkZWZpbmUgQktQX0RSMzIgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDk0KQ0KLSNkZWZpbmUgQktQX0RSMzMgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDk4KQ0KLSNkZWZpbmUgQktQX0RSMzQgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDlDKQ0KLSNkZWZpbmUgQktQX0RSMzUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEEwKQ0KLSNkZWZpbmUgQktQX0RSMzYgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEE0KQ0KLSNkZWZpbmUgQktQX0RSMzcgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEE4KQ0KLSNkZWZpbmUgQktQX0RSMzggICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEFDKQ0KLSNkZWZpbmUgQktQX0RSMzkgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEIwKQ0KLSNkZWZpbmUgQktQX0RSNDAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEI0KQ0KLSNkZWZpbmUgQktQX0RSNDEgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEI4KQ0KLSNkZWZpbmUgQktQX0RSNDIgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMEJDKQ0KLQ0KLSNkZWZpbmUgSVNfQktQX0RSKERSKSAoKChEUikgPT0gQktQX0RSMSkgIHx8ICgoRFIpID09IEJLUF9EUjIpICB8fCAoKERSKSA9PSBCS1BfRFIzKSAgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSNCkgIHx8ICgoRFIpID09IEJLUF9EUjUpICB8fCAoKERSKSA9PSBCS1BfRFI2KSAgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSNykgIHx8ICgoRFIpID09IEJLUF9EUjgpICB8fCAoKERSKSA9PSBCS1BfRFI5KSAgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMTApIHx8ICgoRFIpID09IEJLUF9EUjExKSB8fCAoKERSKSA9PSBCS1BfRFIxMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMTMpIHx8ICgoRFIpID09IEJLUF9EUjE0KSB8fCAoKERSKSA9PSBCS1BfRFIxNSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMTYpIHx8ICgoRFIpID09IEJLUF9EUjE3KSB8fCAoKERSKSA9PSBCS1BfRFIxOCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMTkpIHx8ICgoRFIpID09IEJLUF9EUjIwKSB8fCAoKERSKSA9PSBCS1BfRFIyMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMjIpIHx8ICgoRFIpID09IEJLUF9EUjIzKSB8fCAoKERSKSA9PSBCS1BfRFIyNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMjUpIHx8ICgoRFIpID09IEJLUF9EUjI2KSB8fCAoKERSKSA9PSBCS1BfRFIyNykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMjgpIHx8ICgoRFIpID09IEJLUF9EUjI5KSB8fCAoKERSKSA9PSBCS1BfRFIzMCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMzEpIHx8ICgoRFIpID09IEJLUF9EUjMyKSB8fCAoKERSKSA9PSBCS1BfRFIzMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMzQpIHx8ICgoRFIpID09IEJLUF9EUjM1KSB8fCAoKERSKSA9PSBCS1BfRFIzNikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSMzcpIHx8ICgoRFIpID09IEJLUF9EUjM4KSB8fCAoKERSKSA9PSBCS1BfRFIzOSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgKChEUikgPT0gQktQX0RSNDApIHx8ICgoRFIpID09IEJLUF9EUjQxKSB8fCAoKERSKSA9PSBCS1BfRFI0MikpDQotDQotI2RlZmluZSBJU19CS1BfQ0FMSUJSQVRJT05fVkFMVUUoVkFMVUUpICgoVkFMVUUpIDw9IDB4N0YpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJLUF9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQktQX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIEJLUF9EZUluaXQodm9pZCk7DQotdm9pZCBCS1BfVGFtcGVyUGluTGV2ZWxDb25maWcodWludDE2X3QgQktQX1RhbXBlclBpbkxldmVsKTsNCi12b2lkIEJLUF9UYW1wZXJQaW5DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEJLUF9JVENvbmZpZyhGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgQktQX1JUQ091dHB1dENvbmZpZyh1aW50MTZfdCBCS1BfUlRDT3V0cHV0U291cmNlKTsNCi12b2lkIEJLUF9TZXRSVENDYWxpYnJhdGlvblZhbHVlKHVpbnQ4X3QgQ2FsaWJyYXRpb25WYWx1ZSk7DQotdm9pZCBCS1BfV3JpdGVCYWNrdXBSZWdpc3Rlcih1aW50MTZfdCBCS1BfRFIsIHVpbnQxNl90IERhdGEpOw0KLXVpbnQxNl90IEJLUF9SZWFkQmFja3VwUmVnaXN0ZXIodWludDE2X3QgQktQX0RSKTsNCi1GbGFnU3RhdHVzIEJLUF9HZXRGbGFnU3RhdHVzKHZvaWQpOw0KLXZvaWQgQktQX0NsZWFyRmxhZyh2b2lkKTsNCi1JVFN0YXR1cyBCS1BfR2V0SVRTdGF0dXModm9pZCk7DQotdm9pZCBCS1BfQ2xlYXJJVFBlbmRpbmdCaXQodm9pZCk7DQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBfX1NUTTMyRjEweF9CS1BfSCAqLw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfY2FuLmggYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9jYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0ZDc3OS4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9jYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfY2FuLmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBDQU4gZmlybXdhcmUgDQotICAqICAgICAgICAgIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfQ0FOX0gNCi0jZGVmaW5lIF9fU1RNMzJGMTB4X0NBTl9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotIGV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgQ0FODQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfQ0FOX0FMTF9QRVJJUEgoUEVSSVBIKSAoKChQRVJJUEgpID09IENBTjEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBDQU4yKSkNCi0NCi0vKiogDQotICAqIEBicmllZiAgQ0FOIGluaXQgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MTZfdCBDQU5fUHJlc2NhbGVyOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgYSB0aW1lIHF1YW50dW0uIEl0IHJhbmdlcyBmcm9tIDEgdG8gMTAyNC4gKi8NCi0gIA0KLSAgdWludDhfdCBDQU5fTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgQ0FOIG9wZXJhdGluZyBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX29wZXJhdGluZ19tb2RlICovDQotDQotICB1aW50OF90IENBTl9TSlc7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lIHF1YW50YSB0aGUgQ0FOIGhhcmR3YXJlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxsb3dlZCB0byBsZW5ndGhlbiBvciBzaG9ydGVuIGEgYml0IHRvIHBlcmZvcm0gcmVzeW5jaHJvbml6YXRpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5fc3luY2hyb25pc2F0aW9uX2p1bXBfd2lkdGggKi8NCi0NCi0gIHVpbnQ4X3QgQ0FOX0JTMTsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lIHF1YW50YSBpbiBCaXQgU2VnbWVudCAxLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX3RpbWVfcXVhbnR1bV9pbl9iaXRfc2VnbWVudF8xICovDQotDQotICB1aW50OF90IENBTl9CUzI7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZSBxdWFudGEgaW4gQml0IFNlZ21lbnQgMi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl90aW1lX3F1YW50dW1faW5fYml0X3NlZ21lbnRfMiAqLw0KLSAgDQotICBGdW5jdGlvbmFsU3RhdGUgQ0FOX1RUQ007IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHRpbWUgdHJpZ2dlcmVkIGNvbW11bmljYXRpb24gbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IGVpdGhlciB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8NCi0gIA0KLSAgRnVuY3Rpb25hbFN0YXRlIENBTl9BQk9NOyAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIGJ1cy1vZmYgbWFuYWdlbWVudC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IGVpdGhlciB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZSBDQU5fQVdVTTsgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUuIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgZWl0aGVyIHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLw0KLQ0KLSAgRnVuY3Rpb25hbFN0YXRlIENBTl9OQVJUOyAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSB0aGUgbm8tYXV0b21hdGljIHJldHJhbnNtaXNzaW9uIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBlaXRoZXIgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovDQotDQotICBGdW5jdGlvbmFsU3RhdGUgQ0FOX1JGTE07ICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSBSZWNlaXZlIEZJRk8gTG9ja2VkIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBlaXRoZXIgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovDQotDQotICBGdW5jdGlvbmFsU3RhdGUgQ0FOX1RYRlA7ICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgZWl0aGVyIHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLw0KLX0gQ0FOX0luaXRUeXBlRGVmOw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBDQU4gZmlsdGVyIGluaXQgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MTZfdCBDQU5fRmlsdGVySWRIaWdoOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIGlkZW50aWZpY2F0aW9uIG51bWJlciAoTVNCcyBmb3IgYSAzMi1iaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwgZmlyc3Qgb25lIGZvciBhIDE2LWJpdCBjb25maWd1cmF0aW9uKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRiAqLw0KLQ0KLSAgdWludDE2X3QgQ0FOX0ZpbHRlcklkTG93OyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpbHRlciBpZGVudGlmaWNhdGlvbiBudW1iZXIgKExTQnMgZm9yIGEgMzItYml0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24sIHNlY29uZCBvbmUgZm9yIGEgMTYtYml0IGNvbmZpZ3VyYXRpb24pLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGICovDQotDQotICB1aW50MTZfdCBDQU5fRmlsdGVyTWFza0lkSGlnaDsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIG1hc2sgbnVtYmVyIG9yIGlkZW50aWZpY2F0aW9uIG51bWJlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIChNU0JzIGZvciBhIDMyLWJpdCBjb25maWd1cmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBvbmUgZm9yIGEgMTYtYml0IGNvbmZpZ3VyYXRpb24pLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGICovDQotDQotICB1aW50MTZfdCBDQU5fRmlsdGVyTWFza0lkTG93OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIG1hc2sgbnVtYmVyIG9yIGlkZW50aWZpY2F0aW9uIG51bWJlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIChMU0JzIGZvciBhIDMyLWJpdCBjb25maWd1cmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgb25lIGZvciBhIDE2LWJpdCBjb25maWd1cmF0aW9uKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRiAqLw0KLQ0KLSAgdWludDE2X3QgQ0FOX0ZpbHRlckZJRk9Bc3NpZ25tZW50OyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEZJRk8gKDAgb3IgMSkgd2hpY2ggd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgZmlsdGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9maWx0ZXJfRklGTyAqLw0KLSAgDQotICB1aW50OF90IENBTl9GaWx0ZXJOdW1iZXI7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuIEl0IHJhbmdlcyBmcm9tIDAgdG8gMTMuICovDQotDQotICB1aW50OF90IENBTl9GaWx0ZXJNb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIG1vZGUgdG8gYmUgaW5pdGlhbGl6ZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0FOX2ZpbHRlcl9tb2RlICovDQotDQotICB1aW50OF90IENBTl9GaWx0ZXJTY2FsZTsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlsdGVyIHNjYWxlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9maWx0ZXJfc2NhbGUgKi8NCi0NCi0gIEZ1bmN0aW9uYWxTdGF0ZSBDQU5fRmlsdGVyQWN0aXZhdGlvbjsgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGZpbHRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBlaXRoZXIgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovDQotfSBDQU5fRmlsdGVySW5pdFR5cGVEZWY7DQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIENBTiBUeCBtZXNzYWdlIHN0cnVjdHVyZSBkZWZpbml0aW9uICANCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MzJfdCBTdGRJZDsgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCBpZGVudGlmaWVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCB0byAweDdGRi4gKi8NCi0NCi0gIHVpbnQzMl90IEV4dElkOyAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVuZGVkIGlkZW50aWZpZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIHRvIDB4MUZGRkZGRkYuICovDQotDQotICB1aW50OF90IElERTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGlkZW50aWZpZXIgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9pZGVudGlmaWVyX3R5cGUgKi8NCi0NCi0gIHVpbnQ4X3QgUlRSOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgZnJhbWUgZm9yIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9yZW1vdGVfdHJhbnNtaXNzaW9uX3JlcXVlc3QgKi8NCi0NCi0gIHVpbnQ4X3QgRExDOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCB0byA4ICovDQotDQotICB1aW50OF90IERhdGFbOF07IC8qITwgQ29udGFpbnMgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuIEl0IHJhbmdlcyBmcm9tIDAgdG8gMHhGRi4gKi8NCi19IENhblR4TXNnOw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBDQU4gUnggbWVzc2FnZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgDQotICAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgdWludDMyX3QgU3RkSWQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhbmRhcmQgaWRlbnRpZmllci4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMHg3RkYuICovDQotDQotICB1aW50MzJfdCBFeHRJZDsgIC8qITwgU3BlY2lmaWVzIHRoZSBleHRlbmRlZCBpZGVudGlmaWVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCB0byAweDFGRkZGRkZGLiAqLw0KLQ0KLSAgdWludDhfdCBJREU7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBpZGVudGlmaWVyIGZvciB0aGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgcmVjZWl2ZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDQU5faWRlbnRpZmllcl90eXBlICovDQotDQotICB1aW50OF90IFJUUjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGZyYW1lIGZvciB0aGUgcmVjZWl2ZWQgbWVzc2FnZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENBTl9yZW1vdGVfdHJhbnNtaXNzaW9uX3JlcXVlc3QgKi8NCi0NCi0gIHVpbnQ4X3QgRExDOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgdGhhdCB3aWxsIGJlIHJlY2VpdmVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCB0byA4ICovDQotDQotICB1aW50OF90IERhdGFbOF07IC8qITwgQ29udGFpbnMgdGhlIGRhdGEgdG8gYmUgcmVjZWl2ZWQuIEl0IHJhbmdlcyBmcm9tIDAgdG8gMHhGRi4gKi8NCi0NCi0gIHVpbnQ4X3QgRk1JOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGluZGV4IG9mIHRoZSBmaWx0ZXIgdGhlIG1lc3NhZ2Ugc3RvcmVkIGluIHRoZSBtYWlsYm94IHBhc3NlcyB0aHJvdWdoLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCB0byAweEZGICovDQotfSBDYW5SeE1zZzsNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX3NsZWVwX2NvbnN0YW50cyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBDQU5JTklURkFJTEVEICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgLyohPCBDQU4gaW5pdGlhbGl6YXRpb24gZmFpbGVkICovDQotI2RlZmluZSBDQU5JTklUT0sgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgLyohPCBDQU4gaW5pdGlhbGl6YXRpb24gZmFpbGVkICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX29wZXJhdGluZ19tb2RlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIENBTl9Nb2RlX05vcm1hbCAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgbm9ybWFsIG1vZGUgKi8NCi0jZGVmaW5lIENBTl9Nb2RlX0xvb3BCYWNrICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgbG9vcGJhY2sgbW9kZSAqLw0KLSNkZWZpbmUgQ0FOX01vZGVfU2lsZW50ICAgICAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBzaWxlbnQgbW9kZSAqLw0KLSNkZWZpbmUgQ0FOX01vZGVfU2lsZW50X0xvb3BCYWNrICAgICgodWludDhfdCkweDAzKSAgLyohPCBsb29wYmFjayBjb21iaW5lZCB3aXRoIHNpbGVudCBtb2RlICovDQotDQotI2RlZmluZSBJU19DQU5fTU9ERShNT0RFKSAoKChNT0RFKSA9PSBDQU5fTW9kZV9Ob3JtYWwpIHx8ICgoTU9ERSkgPT0gQ0FOX01vZGVfTG9vcEJhY2spfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ0FOX01vZGVfU2lsZW50KSB8fCAoKE1PREUpID09IENBTl9Nb2RlX1NpbGVudF9Mb29wQmFjaykpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX3N5bmNocm9uaXNhdGlvbl9qdW1wX3dpZHRoIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIENBTl9TSldfMXRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgMSB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9TSldfMnRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgMiB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9TSldfM3RxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgMyB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9TSldfNHRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMykgIC8qITwgNCB0aW1lIHF1YW50dW0gKi8NCi0NCi0jZGVmaW5lIElTX0NBTl9TSlcoU0pXKSAoKChTSlcpID09IENBTl9TSldfMXRxKSB8fCAoKFNKVykgPT0gQ0FOX1NKV18ydHEpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoKFNKVykgPT0gQ0FOX1NKV18zdHEpIHx8ICgoU0pXKSA9PSBDQU5fU0pXXzR0cSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX3RpbWVfcXVhbnR1bV9pbl9iaXRfc2VnbWVudF8xIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIENBTl9CUzFfMXRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgMSB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfMnRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgMiB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfM3RxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgMyB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfNHRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMykgIC8qITwgNCB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfNXRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgNSB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfNnRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgNiB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfN3RxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgNyB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfOHRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNykgIC8qITwgOCB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfOXRxICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOCkgIC8qITwgOSB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfMTB0cSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOSkgIC8qITwgMTAgdGltZSBxdWFudHVtICovDQotI2RlZmluZSBDQU5fQlMxXzExdHEgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MEEpICAvKiE8IDExIHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMV8xMnRxICAgICAgICAgICAgICAgICgodWludDhfdCkweDBCKSAgLyohPCAxMiB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfMTN0cSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQykgIC8qITwgMTMgdGltZSBxdWFudHVtICovDQotI2RlZmluZSBDQU5fQlMxXzE0dHEgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MEQpICAvKiE8IDE0IHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMV8xNXRxICAgICAgICAgICAgICAgICgodWludDhfdCkweDBFKSAgLyohPCAxNSB0aW1lIHF1YW50dW0gKi8NCi0jZGVmaW5lIENBTl9CUzFfMTZ0cSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwRikgIC8qITwgMTYgdGltZSBxdWFudHVtICovDQotDQotI2RlZmluZSBJU19DQU5fQlMxKEJTMSkgKChCUzEpIDw9IENBTl9CUzFfMTZ0cSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fdGltZV9xdWFudHVtX2luX2JpdF9zZWdtZW50XzIgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQ0FOX0JTMl8xdHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCAxIHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl8ydHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCAyIHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl8zdHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCAzIHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl80dHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzKSAgLyohPCA0IHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl81dHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCA1IHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl82dHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCA2IHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl83dHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCA3IHRpbWUgcXVhbnR1bSAqLw0KLSNkZWZpbmUgQ0FOX0JTMl84dHEgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3KSAgLyohPCA4IHRpbWUgcXVhbnR1bSAqLw0KLQ0KLSNkZWZpbmUgSVNfQ0FOX0JTMihCUzIpICgoQlMyKSA8PSBDQU5fQlMyXzh0cSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fY2xvY2tfcHJlc2NhbGVyIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0NBTl9QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKChQUkVTQ0FMRVIpID49IDEpICYmICgoUFJFU0NBTEVSKSA8PSAxMDI0KSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fZmlsdGVyX251bWJlciANCi0gICogQHsNCi0gICovDQotI2lmbmRlZiBTVE0zMkYxMFhfQ0wNCi0gICNkZWZpbmUgSVNfQ0FOX0ZJTFRFUl9OVU1CRVIoTlVNQkVSKSAoKE5VTUJFUikgPD0gMTMpDQotI2Vsc2UNCi0gICNkZWZpbmUgSVNfQ0FOX0ZJTFRFUl9OVU1CRVIoTlVNQkVSKSAoKE5VTUJFUikgPD0gMjcpDQotI2VuZGlmIC8qIFNUTTMyRjEwWF9DTCAqLyANCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fZmlsdGVyX21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQ0FOX0ZpbHRlck1vZGVfSWRNYXNrICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBpZC9tYXNrIG1vZGUgKi8NCi0jZGVmaW5lIENBTl9GaWx0ZXJNb2RlX0lkTGlzdCAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgaWRlbnRpZmllciBsaXN0IG1vZGUgKi8NCi0NCi0jZGVmaW5lIElTX0NBTl9GSUxURVJfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBDQU5fRmlsdGVyTW9kZV9JZE1hc2spIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDQU5fRmlsdGVyTW9kZV9JZExpc3QpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENBTl9maWx0ZXJfc2NhbGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQ0FOX0ZpbHRlclNjYWxlXzE2Yml0ICAgICAgICgodWludDhfdCkweDAwKSAvKiE8IFR3byAxNi1iaXQgZmlsdGVycyAqLw0KLSNkZWZpbmUgQ0FOX0ZpbHRlclNjYWxlXzMyYml0ICAgICAgICgodWludDhfdCkweDAxKSAvKiE8IE9uZSAzMi1iaXQgZmlsdGVyICovDQotDQotI2RlZmluZSBJU19DQU5fRklMVEVSX1NDQUxFKFNDQUxFKSAoKChTQ0FMRSkgPT0gQ0FOX0ZpbHRlclNjYWxlXzE2Yml0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTQ0FMRSkgPT0gQ0FOX0ZpbHRlclNjYWxlXzMyYml0KSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fZmlsdGVyX0ZJRk8NCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBDQU5fRmlsdGVyRklGTzAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IEZpbHRlciBGSUZPIDAgYXNzaWdubWVudCBmb3IgZmlsdGVyIHggKi8NCi0jZGVmaW5lIENBTl9GaWx0ZXJGSUZPMSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgRmlsdGVyIEZJRk8gMSBhc3NpZ25tZW50IGZvciBmaWx0ZXIgeCAqLw0KLSNkZWZpbmUgSVNfQ0FOX0ZJTFRFUl9GSUZPKEZJRk8pICgoKEZJRk8pID09IENBTl9GaWx0ZXJGSUZPMCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJRk8pID09IENBTl9GaWx0ZXJGSUZPMSkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU3RhcnRfYmFua19maWx0ZXJfZm9yX3NsYXZlX0NBTiANCi0gICogQHsNCi0gICovDQotI2RlZmluZSBJU19DQU5fQkFOS05VTUJFUihCQU5LTlVNQkVSKSAoKChCQU5LTlVNQkVSKSA+PSAxKSAmJiAoKEJBTktOVU1CRVIpIDw9IDI3KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fVHggDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfQ0FOX1RSQU5TTUlUTUFJTEJPWChUUkFOU01JVE1BSUxCT1gpICgoVFJBTlNNSVRNQUlMQk9YKSA8PSAoKHVpbnQ4X3QpMHgwMikpDQotI2RlZmluZSBJU19DQU5fU1RESUQoU1RESUQpICAgKChTVERJRCkgPD0gKCh1aW50MzJfdCkweDdGRikpDQotI2RlZmluZSBJU19DQU5fRVhUSUQoRVhUSUQpICAgKChFWFRJRCkgPD0gKCh1aW50MzJfdCkweDFGRkZGRkZGKSkNCi0jZGVmaW5lIElTX0NBTl9ETEMoRExDKSAgICAgICAoKERMQykgPD0gKCh1aW50OF90KTB4MDgpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENBTl9pZGVudGlmaWVyX3R5cGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQ0FOX0lEX1NURCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgLyohPCBTdGFuZGFyZCBJZCAqLw0KLSNkZWZpbmUgQ0FOX0lEX0VYVCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KSAgLyohPCBFeHRlbmRlZCBJZCAqLw0KLSNkZWZpbmUgSVNfQ0FOX0lEVFlQRShJRFRZUEUpICgoKElEVFlQRSkgPT0gQ0FOX0lEX1NURCkgfHwgKChJRFRZUEUpID09IENBTl9JRF9FWFQpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENBTl9yZW1vdGVfdHJhbnNtaXNzaW9uX3JlcXVlc3QgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgQ0FOX1JUUl9EQVRBICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgIC8qITwgRGF0YSBmcmFtZSAqLw0KLSNkZWZpbmUgQ0FOX1JUUl9SRU1PVEUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikgIC8qITwgUmVtb3RlIGZyYW1lICovDQotI2RlZmluZSBJU19DQU5fUlRSKFJUUikgKCgoUlRSKSA9PSBDQU5fUlRSX0RBVEEpIHx8ICgoUlRSKSA9PSBDQU5fUlRSX1JFTU9URSkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX3RyYW5zbWl0X2NvbnN0YW50cyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBDQU5UWEZBSUxFRCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApIC8qITwgQ0FOIHRyYW5zbWlzc2lvbiBmYWlsZWQgKi8NCi0jZGVmaW5lIENBTlRYT0sgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgLyohPCBDQU4gdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZCAqLw0KLSNkZWZpbmUgQ0FOVFhQRU5ESU5HICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKSAvKiE8IENBTiB0cmFuc21pc3Npb24gcGVuZGluZyAqLw0KLSNkZWZpbmUgQ0FOX05PX01CICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0KSAvKiE8IENBTiBjZWxsIGRpZCBub3QgcHJvdmlkZSBhbiBlbXB0eSBtYWlsYm94ICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX3JlY2VpdmVfRklGT19udW1iZXJfY29uc3RhbnRzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIENBTl9GSUZPMCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApIC8qITwgQ0FOIEZJRk8wIHVzZWQgdG8gcmVjZWl2ZSAqLw0KLSNkZWZpbmUgQ0FOX0ZJRk8xICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgLyohPCBDQU4gRklGTzEgdXNlZCB0byByZWNlaXZlICovDQotDQotI2RlZmluZSBJU19DQU5fRklGTyhGSUZPKSAoKChGSUZPKSA9PSBDQU5fRklGTzApIHx8ICgoRklGTykgPT0gQ0FOX0ZJRk8xKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fc2xlZXBfY29uc3RhbnRzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIENBTlNMRUVQRkFJTEVEICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgLyohPCBDQU4gZGlkIG5vdCBlbnRlciB0aGUgc2xlZXAgbW9kZSAqLw0KLSNkZWZpbmUgQ0FOU0xFRVBPSyAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKSAvKiE8IENBTiBlbnRlcmVkIHRoZSBzbGVlcCBtb2RlICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX3dha2VfdXBfY29uc3RhbnRzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIENBTldBS0VVUEZBSUxFRCAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgLyohPCBDQU4gZGlkIG5vdCBsZWF2ZSB0aGUgc2xlZXAgbW9kZSAqLw0KLSNkZWZpbmUgQ0FOV0FLRVVQT0sgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKSAvKiE8IENBTiBsZWF2ZWQgdGhlIHNsZWVwIG1vZGUgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fZmxhZ3MgDQotICAqIEB7DQotICAqLw0KLS8qIElmIHRoZSBmbGFnIGlzIDB4M1hYWFhYWFgsIGl0IG1lYW5zIHRoYXQgaXQgY2FuIGJlIHVzZWQgd2l0aCBDQU5fR2V0RmxhZ1N0YXR1cygpDQotICAgYW5kIENBTl9DbGVhckZsYWcoKSBmdW5jdGlvbnMuICovDQotLyogSWYgdGhlIGZsYWcgaXMgMHgxWFhYWFhYWCwgaXQgbWVhbnMgdGhhdCBpdCBjYW4gb25seSBiZSB1c2VkIHdpdGggQ0FOX0dldEZsYWdTdGF0dXMoKSBmdW5jdGlvbi4gICovDQotDQotLyogVHJhbnNtaXQgRmxhZ3MgKi8NCi0jZGVmaW5lIENBTl9GTEFHX1JRQ1AwICAgICAgICAgICAgICgodWludDMyX3QpMHgzODAwMDAwMSkgLyohPCBSZXF1ZXN0IE1haWxCb3gwIEZsYWcgKi8NCi0jZGVmaW5lIENBTl9GTEFHX1JRQ1AxICAgICAgICAgICAgICgodWludDMyX3QpMHgzODAwMDEwMCkgLyohPCBSZXF1ZXN0IE1haWxCb3gxIEZsYWcgKi8NCi0jZGVmaW5lIENBTl9GTEFHX1JRQ1AyICAgICAgICAgICAgICgodWludDMyX3QpMHgzODAxMDAwMCkgLyohPCBSZXF1ZXN0IE1haWxCb3gyIEZsYWcgKi8NCi0NCi0vKiBSZWNlaXZlIEZsYWdzICovDQotI2RlZmluZSBDQU5fRkxBR19GTVAwICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTIwMDAwMDMpIC8qITwgRklGTyAwIE1lc3NhZ2UgUGVuZGluZyBGbGFnICovDQotI2RlZmluZSBDQU5fRkxBR19GRjAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MzIwMDAwMDgpIC8qITwgRklGTyAwIEZ1bGwgRmxhZyAgICAgICAgICAgICovDQotI2RlZmluZSBDQU5fRkxBR19GT1YwICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MzIwMDAwMTApIC8qITwgRklGTyAwIE92ZXJydW4gRmxhZyAgICAgICAgICovDQotI2RlZmluZSBDQU5fRkxBR19GTVAxICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTQwMDAwMDMpIC8qITwgRklGTyAxIE1lc3NhZ2UgUGVuZGluZyBGbGFnICovDQotI2RlZmluZSBDQU5fRkxBR19GRjEgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MzQwMDAwMDgpIC8qITwgRklGTyAxIEZ1bGwgRmxhZyAgICAgICAgICAgICovDQotI2RlZmluZSBDQU5fRkxBR19GT1YxICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MzQwMDAwMTApIC8qITwgRklGTyAxIE92ZXJydW4gRmxhZyAgICAgICAgICovDQotDQotLyogT3BlcmF0aW5nIE1vZGUgRmxhZ3MgKi8NCi0jZGVmaW5lIENBTl9GTEFHX1dLVSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgzMTAwMDAwOCkgLyohPCBXYWtlIHVwIEZsYWcgKi8NCi0jZGVmaW5lIENBTl9GTEFHX1NMQUsgICAgICAgICAgICAgICgodWludDMyX3QpMHgzMTAwMDAxMikgLyohPCBTbGVlcCBhY2tub3dsZWRnZSBGbGFnICovDQotLyogTm90ZTogV2hlbiBTTEFLIGludHRlcnVwdCBpcyBkaXNhYmxlZCAoU0xLSUU9MCksIG5vIHBvbGxpbmcgb24gU0xBS0kgaXMgcG9zc2libGUuIA0KLSAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgU0xBSyBiaXQgY2FuIGJlIHBvbGxlZC4qLw0KLQ0KLS8qIEVycm9yIEZsYWdzICovDQotI2RlZmluZSBDQU5fRkxBR19FV0cgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTBGMDAwMDEpIC8qITwgRXJyb3IgV2FybmluZyBGbGFnICAgKi8NCi0jZGVmaW5lIENBTl9GTEFHX0VQViAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMEYwMDAwMikgLyohPCBFcnJvciBQYXNzaXZlIEZsYWcgICAqLw0KLSNkZWZpbmUgQ0FOX0ZMQUdfQk9GICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwRjAwMDA0KSAvKiE8IEJ1cy1PZmYgRmxhZyAgICAgICAgICovDQotI2RlZmluZSBDQU5fRkxBR19MRUMgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MzBGMDAwNzApIC8qITwgTGFzdCBlcnJvciBjb2RlIEZsYWcgKi8NCi0NCi0jZGVmaW5lIElTX0NBTl9HRVRfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBDQU5fRkxBR19MRUMpICB8fCAoKEZMQUcpID09IENBTl9GTEFHX0JPRikgICB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQ0FOX0ZMQUdfRVBWKSAgfHwgKChGTEFHKSA9PSBDQU5fRkxBR19FV0cpICAgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENBTl9GTEFHX1dLVSkgIHx8ICgoRkxBRykgPT0gQ0FOX0ZMQUdfRk9WMCkgIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBDQU5fRkxBR19GRjApICB8fCAoKEZMQUcpID09IENBTl9GTEFHX0ZNUDApICB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQ0FOX0ZMQUdfRk9WMSkgfHwgKChGTEFHKSA9PSBDQU5fRkxBR19GRjEpICAgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENBTl9GTEFHX0ZNUDEpIHx8ICgoRkxBRykgPT0gQ0FOX0ZMQUdfUlFDUDIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBDQU5fRkxBR19SUUNQMSl8fCAoKEZMQUcpID09IENBTl9GTEFHX1JRQ1AwKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQ0FOX0ZMQUdfU0xBSyApKQ0KLQ0KLSNkZWZpbmUgSVNfQ0FOX0NMRUFSX0ZMQUcoRkxBRykoKChGTEFHKSA9PSBDQU5fRkxBR19MRUMpIHx8ICgoRkxBRykgPT0gQ0FOX0ZMQUdfUlFDUDIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQ0FOX0ZMQUdfUlFDUDEpICB8fCAoKEZMQUcpID09IENBTl9GTEFHX1JRQ1AwKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENBTl9GTEFHX0ZGMCkgIHx8ICgoRkxBRykgPT0gQ0FOX0ZMQUdfRk9WMCkgfHxcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENBTl9GTEFHX0ZGMSkgfHwgKChGTEFHKSA9PSBDQU5fRkxBR19GT1YxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENBTl9GTEFHX1dLVSkgfHwgKChGTEFHKSA9PSBDQU5fRkxBR19TTEFLKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotICANCi0vKiogQGRlZmdyb3VwIENBTl9pbnRlcnJ1cHRzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0NCi0gIA0KLSNkZWZpbmUgQ0FOX0lUX1RNRSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgLyohPCBUcmFuc21pdCBtYWlsYm94IGVtcHR5IEludGVycnVwdCovDQotDQotLyogUmVjZWl2ZSBJbnRlcnJ1cHRzICovDQotI2RlZmluZSBDQU5fSVRfRk1QMCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKSAvKiE8IEZJRk8gMCBtZXNzYWdlIHBlbmRpbmcgSW50ZXJydXB0Ki8NCi0jZGVmaW5lIENBTl9JVF9GRjAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpIC8qITwgRklGTyAwIGZ1bGwgSW50ZXJydXB0Ki8NCi0jZGVmaW5lIENBTl9JVF9GT1YwICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpIC8qITwgRklGTyAwIG92ZXJydW4gSW50ZXJydXB0Ki8NCi0jZGVmaW5lIENBTl9JVF9GTVAxICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApIC8qITwgRklGTyAxIG1lc3NhZ2UgcGVuZGluZyBJbnRlcnJ1cHQqLw0KLSNkZWZpbmUgQ0FOX0lUX0ZGMSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkgLyohPCBGSUZPIDEgZnVsbCBJbnRlcnJ1cHQqLw0KLSNkZWZpbmUgQ0FOX0lUX0ZPVjEgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkgLyohPCBGSUZPIDEgb3ZlcnJ1biBJbnRlcnJ1cHQqLw0KLQ0KLS8qIE9wZXJhdGluZyBNb2RlIEludGVycnVwdHMgKi8NCi0jZGVmaW5lIENBTl9JVF9XS1UgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApIC8qITwgV2FrZS11cCBJbnRlcnJ1cHQqLw0KLSNkZWZpbmUgQ0FOX0lUX1NMSyAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMCkgLyohPCBTbGVlcCBhY2tub3dsZWRnZSBJbnRlcnJ1cHQqLw0KLQ0KLS8qIEVycm9yIEludGVycnVwdHMgKi8NCi0jZGVmaW5lIENBTl9JVF9FV0cgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApIC8qITwgRXJyb3Igd2FybmluZyBJbnRlcnJ1cHQqLw0KLSNkZWZpbmUgQ0FOX0lUX0VQViAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMCkgLyohPCBFcnJvciBwYXNzaXZlIEludGVycnVwdCovDQotI2RlZmluZSBDQU5fSVRfQk9GICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKSAvKiE8IEJ1cy1vZmYgSW50ZXJydXB0Ki8NCi0jZGVmaW5lIENBTl9JVF9MRUMgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApIC8qITwgTGFzdCBlcnJvciBjb2RlIEludGVycnVwdCovDQotI2RlZmluZSBDQU5fSVRfRVJSICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA4MDAwKSAvKiE8IEVycm9yIEludGVycnVwdCovDQotDQotLyogRmxhZ3MgbmFtZWQgYXMgSW50ZXJydXB0cyA6IGtlcHQgb25seSBmb3IgRlcgY29tcGF0aWJpbGl0eSAqLw0KLSNkZWZpbmUgQ0FOX0lUX1JRQ1AwICAgQ0FOX0lUX1RNRQ0KLSNkZWZpbmUgQ0FOX0lUX1JRQ1AxICAgQ0FOX0lUX1RNRQ0KLSNkZWZpbmUgQ0FOX0lUX1JRQ1AyICAgQ0FOX0lUX1RNRQ0KLQ0KLQ0KLSNkZWZpbmUgSVNfQ0FOX0lUKElUKSAgICAgICAgKCgoSVQpID09IENBTl9JVF9UTUUpICAgfHwgKChJVCkgPT0gQ0FOX0lUX0ZNUDApICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9GRjApICAgfHwgKChJVCkgPT0gQ0FOX0lUX0ZPVjApICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9GTVAxKSAgfHwgKChJVCkgPT0gQ0FOX0lUX0ZGMSkgICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9GT1YxKSAgfHwgKChJVCkgPT0gQ0FOX0lUX0VXRykgICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9FUFYpICAgfHwgKChJVCkgPT0gQ0FOX0lUX0JPRikgICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9MRUMpICAgfHwgKChJVCkgPT0gQ0FOX0lUX0VSUikgICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9XS1UpICAgfHwgKChJVCkgPT0gQ0FOX0lUX1NMSykpDQotDQotI2RlZmluZSBJU19DQU5fQ0xFQVJfSVQoSVQpICgoKElUKSA9PSBDQU5fSVRfVE1FKSAgICB8fCAoKElUKSA9PSBDQU5fSVRfRkYwKSAgICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9GT1YwKSAgIHx8ICgoSVQpID09IENBTl9JVF9GRjEpICAgIHx8XA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gQ0FOX0lUX0ZPVjEpICAgfHwgKChJVCkgPT0gQ0FOX0lUX0VXRykgICAgfHxcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBDQU5fSVRfRVBWKSAgICB8fCAoKElUKSA9PSBDQU5fSVRfQk9GKSAgICB8fFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IENBTl9JVF9MRUMpICAgIHx8ICgoSVQpID09IENBTl9JVF9FUlIpICAgIHx8XA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gQ0FOX0lUX1dLVSkgICAgfHwgKChJVCkgPT0gQ0FOX0lUX1NMSykpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENBTl9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIENBTl9EZUluaXQoQ0FOX1R5cGVEZWYqIENBTngpOw0KLXVpbnQ4X3QgQ0FOX0luaXQoQ0FOX1R5cGVEZWYqIENBTngsIENBTl9Jbml0VHlwZURlZiogQ0FOX0luaXRTdHJ1Y3QpOw0KLXZvaWQgQ0FOX0ZpbHRlckluaXQoQ0FOX0ZpbHRlckluaXRUeXBlRGVmKiBDQU5fRmlsdGVySW5pdFN0cnVjdCk7DQotdm9pZCBDQU5fU3RydWN0SW5pdChDQU5fSW5pdFR5cGVEZWYqIENBTl9Jbml0U3RydWN0KTsNCi12b2lkIENBTl9TbGF2ZVN0YXJ0QmFuayh1aW50OF90IENBTl9CYW5rTnVtYmVyKTsgDQotdm9pZCBDQU5fSVRDb25maWcoQ0FOX1R5cGVEZWYqIENBTngsIHVpbnQzMl90IENBTl9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi11aW50OF90IENBTl9UcmFuc21pdChDQU5fVHlwZURlZiogQ0FOeCwgQ2FuVHhNc2cqIFR4TWVzc2FnZSk7DQotdWludDhfdCBDQU5fVHJhbnNtaXRTdGF0dXMoQ0FOX1R5cGVEZWYqIENBTngsIHVpbnQ4X3QgVHJhbnNtaXRNYWlsYm94KTsNCi12b2lkIENBTl9DYW5jZWxUcmFuc21pdChDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBNYWlsYm94KTsNCi12b2lkIENBTl9GSUZPUmVsZWFzZShDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBGSUZPTnVtYmVyKTsNCi11aW50OF90IENBTl9NZXNzYWdlUGVuZGluZyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBGSUZPTnVtYmVyKTsNCi12b2lkIENBTl9SZWNlaXZlKENBTl9UeXBlRGVmKiBDQU54LCB1aW50OF90IEZJRk9OdW1iZXIsIENhblJ4TXNnKiBSeE1lc3NhZ2UpOw0KLXZvaWQgQ0FOX0RCR0ZyZWV6ZShDQU5fVHlwZURlZiogQ0FOeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi11aW50OF90IENBTl9TbGVlcChDQU5fVHlwZURlZiogQ0FOeCk7DQotdWludDhfdCBDQU5fV2FrZVVwKENBTl9UeXBlRGVmKiBDQU54KTsNCi1GbGFnU3RhdHVzIENBTl9HZXRGbGFnU3RhdHVzKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fRkxBRyk7DQotdm9pZCBDQU5fQ2xlYXJGbGFnKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fRkxBRyk7DQotSVRTdGF0dXMgQ0FOX0dldElUU3RhdHVzKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fSVQpOw0KLXZvaWQgQ0FOX0NsZWFySVRQZW5kaW5nQml0KENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fSVQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkYxMHhfQ0FOX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2NlYy5oIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfY2VjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWFiYTcuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfY2VjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2NlYy5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgQ0VDIGZpcm13YXJlIA0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X0NFQ19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9DRUNfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIENFQw0KLSAgKiBAew0KLSAgKi8NCi0gIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0VDX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLw0KLSAgIA0KLS8qKiANCi0gICogQGJyaWVmICBDRUMgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgDQotICAqLyANCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQxNl90IENFQ19CaXRUaW1pbmdNb2RlOyAvKiE8IENvbmZpZ3VyZXMgdGhlIENFQyBCaXQgVGltaW5nIEVycm9yIE1vZGUuIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENFQ19CaXRUaW1pbmdfTW9kZSAqLw0KLSAgdWludDE2X3QgQ0VDX0JpdFBlcmlvZE1vZGU7IC8qITwgQ29uZmlndXJlcyB0aGUgQ0VDIEJpdCBQZXJpb2QgRXJyb3IgTW9kZS4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ0VDX0JpdFBlcmlvZF9Nb2RlICovDQotfUNFQ19Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDRUNfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLyANCi0gIA0KLS8qKiBAZGVmZ3JvdXAgQ0VDX0JpdFRpbWluZ19Nb2RlIA0KLSAgKiBAew0KLSAgKi8gDQotI2RlZmluZSBDRUNfQml0VGltaW5nU3RkTW9kZSAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwKSAvKiE8IEJpdCB0aW1pbmcgZXJyb3IgU3RhbmRhcmQgTW9kZSAqLw0KLSNkZWZpbmUgQ0VDX0JpdFRpbWluZ0VyckZyZWVNb2RlICAgICAgICAgICAgICAgIENFQ19DRkdSX0JURU0gICAvKiE8IEJpdCB0aW1pbmcgZXJyb3IgRnJlZSBNb2RlICovDQotDQotI2RlZmluZSBJU19DRUNfQklUX1RJTUlOR19FUlJPUl9NT0RFKE1PREUpICgoKE1PREUpID09IENFQ19CaXRUaW1pbmdTdGRNb2RlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENFQ19CaXRUaW1pbmdFcnJGcmVlTW9kZSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0VDX0JpdFBlcmlvZF9Nb2RlIA0KLSAgKiBAew0KLSAgKi8gDQotI2RlZmluZSBDRUNfQml0UGVyaW9kU3RkTW9kZSAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwKSAvKiE8IEJpdCBwZXJpb2QgZXJyb3IgU3RhbmRhcmQgTW9kZSAqLw0KLSNkZWZpbmUgQ0VDX0JpdFBlcmlvZEZsZXhpYmxlTW9kZSAgICAgICAgICAgICAgICBDRUNfQ0ZHUl9CUEVNICAgLyohPCBCaXQgcGVyaW9kIGVycm9yIEZsZXhpYmxlIE1vZGUgKi8NCi0NCi0jZGVmaW5lIElTX0NFQ19CSVRfUEVSSU9EX0VSUk9SX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gQ0VDX0JpdFBlcmlvZFN0ZE1vZGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gQ0VDX0JpdFBlcmlvZEZsZXhpYmxlTW9kZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0NCi0vKiogQGRlZmdyb3VwIENFQ19pbnRlcnJ1cHRzX2RlZmluaXRpb24gDQotICAqIEB7DQotICAqLyANCi0jZGVmaW5lIENFQ19JVF9URVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX0NTUl9URVJSDQotI2RlZmluZSBDRUNfSVRfVEJUUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19DU1JfVEJUUkYNCi0jZGVmaW5lIENFQ19JVF9SRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX0NTUl9SRVJSDQotI2RlZmluZSBDRUNfSVRfUkJURiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19DU1JfUkJURg0KLSNkZWZpbmUgSVNfQ0VDX0dFVF9JVChJVCkgKCgoSVQpID09IENFQ19JVF9URVJSKSB8fCAoKElUKSA9PSBDRUNfSVRfVEJUUkYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBDRUNfSVRfUkVSUikgfHwgKChJVCkgPT0gQ0VDX0lUX1JCVEYpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotDQotLyoqIEBkZWZncm91cCBDRUNfT3duX0FkZHJlcyANCi0gICogQHsNCi0gICovIA0KLSNkZWZpbmUgSVNfQ0VDX0FERFJFU1MoQUREUkVTUykgKChBRERSRVNTKSA8IDB4MTApDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIENFQ19QcmVzY2FsZXIgDQotICAqIEB7DQotICAqLyANCi0jZGVmaW5lIElTX0NFQ19QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKFBSRVNDQUxFUikgPD0gMHgzRkZGKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENFQ19mbGFnc19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0gICANCi0vKiogDQotICAqIEBicmllZiAgRVNSIHJlZ2lzdGVyIGZsYWdzICANCi0gICovIA0KLSNkZWZpbmUgQ0VDX0ZMQUdfQlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAxMDAwMCkNCi0jZGVmaW5lIENFQ19GTEFHX0JQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMjAwMDApDQotI2RlZmluZSBDRUNfRkxBR19SQlRGRSAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDQwMDAwKQ0KLSNkZWZpbmUgQ0VDX0ZMQUdfU0JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDA4MDAwMCkNCi0jZGVmaW5lIENFQ19GTEFHX0FDS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAxMDAwMDApDQotI2RlZmluZSBDRUNfRkxBR19MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMjAwMDAwKQ0KLSNkZWZpbmUgQ0VDX0ZMQUdfVEJURkUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDQwMDAwMCkNCi0NCi0vKiogDQotICAqIEBicmllZiAgQ1NSIHJlZ2lzdGVyIGZsYWdzICANCi0gICovIA0KLSNkZWZpbmUgQ0VDX0ZMQUdfVEVPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikgIA0KLSNkZWZpbmUgQ0VDX0ZMQUdfVEVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCi0jZGVmaW5lIENFQ19GTEFHX1RCVFJGICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQotI2RlZmluZSBDRUNfRkxBR19SU09NICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKQ0KLSNkZWZpbmUgQ0VDX0ZMQUdfUkVPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkNCi0jZGVmaW5lIENFQ19GTEFHX1JFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBDRUNfRkxBR19SQlRGICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KLQ0KLSNkZWZpbmUgSVNfQ0VDX0NMRUFSX0ZMQUcoRkxBRykgKCgoKEZMQUcpICYgKHVpbnQzMl90KTB4RkZGRkZGMDMpID09IDB4MDApICYmICgoRkxBRykgIT0gMHgwMCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgSVNfQ0VDX0dFVF9GTEFHKEZMQUcpICgoKEZMQUcpID09IENFQ19GTEFHX0JURSkgfHwgKChGTEFHKSA9PSBDRUNfRkxBR19CUEUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBDRUNfRkxBR19SQlRGRSkgfHwgKChGTEFHKT09IENFQ19GTEFHX1NCRSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENFQ19GTEFHX0FDS0UpIHx8ICgoRkxBRykgPT0gQ0VDX0ZMQUdfTElORSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IENFQ19GTEFHX1RCVEZFKSB8fCAoKEZMQUcpID09IENFQ19GTEFHX1RFT00pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBDRUNfRkxBR19URVJSKSB8fCAoKEZMQUcpID09IENFQ19GTEFHX1RCVFJGKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQ0VDX0ZMQUdfUlNPTSkgfHwgKChGTEFHKSA9PSBDRUNfRkxBR19SRU9NKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gQ0VDX0ZMQUdfUkVSUikgfHwgKChGTEFHKSA9PSBDRUNfRkxBR19SQlRGKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBDRUNfRXhwb3J0ZWRfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLSANCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLyANCi12b2lkIENFQ19EZUluaXQodm9pZCk7DQotdm9pZCBDRUNfSW5pdChDRUNfSW5pdFR5cGVEZWYqIENFQ19Jbml0U3RydWN0KTsNCi12b2lkIENFQ19DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIENFQ19JVENvbmZpZyhGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgQ0VDX093bkFkZHJlc3NDb25maWcodWludDhfdCBDRUNfT3duQWRkcmVzcyk7DQotdm9pZCBDRUNfU2V0UHJlc2NhbGVyKHVpbnQxNl90IENFQ19QcmVzY2FsZXIpOw0KLXZvaWQgQ0VDX1NlbmREYXRhQnl0ZSh1aW50OF90IERhdGEpOw0KLXVpbnQ4X3QgQ0VDX1JlY2VpdmVEYXRhQnl0ZSh2b2lkKTsNCi12b2lkIENFQ19TdGFydE9mTWVzc2FnZSh2b2lkKTsNCi12b2lkIENFQ19FbmRPZk1lc3NhZ2VDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi1GbGFnU3RhdHVzIENFQ19HZXRGbGFnU3RhdHVzKHVpbnQzMl90IENFQ19GTEFHKTsNCi12b2lkIENFQ19DbGVhckZsYWcodWludDMyX3QgQ0VDX0ZMQUcpOw0KLUlUU3RhdHVzIENFQ19HZXRJVFN0YXR1cyh1aW50OF90IENFQ19JVCk7DQotdm9pZCBDRUNfQ2xlYXJJVFBlbmRpbmdCaXQodWludDE2X3QgQ0VDX0lUKTsNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJGMTB4X0NFQ19IICovDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9jcmMuaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2NyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFjY2UwLi4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2NyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2NyYy5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgQ1JDIGZpcm13YXJlIA0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X0NSQ19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9DUkNfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIENSQw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIENSQ19SZXNldERSKHZvaWQpOw0KLXVpbnQzMl90IENSQ19DYWxjQ1JDKHVpbnQzMl90IERhdGEpOw0KLXVpbnQzMl90IENSQ19DYWxjQmxvY2tDUkModWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOw0KLXVpbnQzMl90IENSQ19HZXRDUkModm9pZCk7DQotdm9pZCBDUkNfU2V0SURSZWdpc3Rlcih1aW50OF90IElEVmFsdWUpOw0KLXVpbnQ4X3QgQ1JDX0dldElEUmVnaXN0ZXIodm9pZCk7DQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvKiBfX1NUTTMyRjEweF9DUkNfSCAqLw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZGFjLmggYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9kYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiZDYzNi4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9kYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfZGFjLmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBEQUMgZmlybXdhcmUgDQotICAqICAgICAgICAgIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfREFDX0gNCi0jZGVmaW5lIF9fU1RNMzJGMTB4X0RBQ19IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotIGV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgREFDDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBEQUMgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbg0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQzMl90IERBQ19UcmlnZ2VyOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfdHJpZ2dlcl9zZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQzMl90IERBQ19XYXZlR2VuZXJhdGlvbjsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIERBQyBjaGFubmVsIG5vaXNlIHdhdmVzIG9yIHRyaWFuZ2xlIHdhdmVzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZ2VuZXJhdGVkLCBvciB3aGV0aGVyIG5vIHdhdmUgaXMgZ2VuZXJhdGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfd2F2ZV9nZW5lcmF0aW9uICovDQotDQotICB1aW50MzJfdCBEQUNfTEZTUlVubWFza19UcmlhbmdsZUFtcGxpdHVkZTsgLyohPCBTcGVjaWZpZXMgdGhlIExGU1IgbWFzayBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4aW11bSBhbXBsaXR1ZGUgdHJpYW5nbGUgZ2VuZXJhdGlvbiBmb3IgdGhlIERBQyBjaGFubmVsLiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgREFDX2xmc3J1bm1hc2tfdHJpYW5nbGVhbXBsaXR1ZGUgKi8NCi0NCi0gIHVpbnQzMl90IERBQ19PdXRwdXRCdWZmZXI7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBEQUMgY2hhbm5lbCBvdXRwdXQgYnVmZmVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19vdXRwdXRfYnVmZmVyICovDQotfURBQ19Jbml0VHlwZURlZjsNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX3RyaWdnZXJfc2VsZWN0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIERBQ19UcmlnZ2VyX05vbmUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAvKiE8IENvbnZlcnNpb24gaXMgYXV0b21hdGljIG9uY2UgdGhlIERBQzFfREhSeHh4eCByZWdpc3RlciANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGxvYWRlZCwgYW5kIG5vdCBieSBleHRlcm5hbCB0cmlnZ2VyICovDQotI2RlZmluZSBEQUNfVHJpZ2dlcl9UNl9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkgLyohPCBUSU02IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLw0KLSNkZWZpbmUgREFDX1RyaWdnZXJfVDhfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEMpIC8qITwgVElNOCBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgaW4gSGlnaC1kZW5zaXR5IGRldmljZXMqLw0KLSNkZWZpbmUgREFDX1RyaWdnZXJfVDNfVFJHTyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEMpIC8qITwgVElNOCBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgaW4gQ29ubmVjdGl2aXR5IGxpbmUsIE1lZGl1bS1kZW5zaXR5IGFuZCBMb3ctZGVuc2l0eSBWYWx1ZSBMaW5lIGRldmljZXMgKi8NCi0jZGVmaW5lIERBQ19UcmlnZ2VyX1Q3X1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDE0KSAvKiE8IFRJTTcgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovDQotI2RlZmluZSBEQUNfVHJpZ2dlcl9UNV9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxQykgLyohPCBUSU01IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLw0KLSNkZWZpbmUgREFDX1RyaWdnZXJfVDE1X1RSR08gICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMUMpIC8qITwgVElNMTUgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBpbiBNZWRpdW0tZGVuc2l0eSBhbmQgTG93LWRlbnNpdHkgVmFsdWUgTGluZSBkZXZpY2VzKi8NCi0jZGVmaW5lIERBQ19UcmlnZ2VyX1QyX1RSR08gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDI0KSAvKiE8IFRJTTIgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovDQotI2RlZmluZSBEQUNfVHJpZ2dlcl9UNF9UUkdPICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyQykgLyohPCBUSU00IFRSR08gc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLw0KLSNkZWZpbmUgREFDX1RyaWdnZXJfRXh0X0lUOSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMzQpIC8qITwgRVhUSSBMaW5lOSBldmVudCBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovDQotI2RlZmluZSBEQUNfVHJpZ2dlcl9Tb2Z0d2FyZSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAzQykgLyohPCBDb252ZXJzaW9uIHN0YXJ0ZWQgYnkgc29mdHdhcmUgdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8NCi0NCi0jZGVmaW5lIElTX0RBQ19UUklHR0VSKFRSSUdHRVIpICgoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX05vbmUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1Q2X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1Q4X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1Q3X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1Q1X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1QyX1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1Q0X1RSR08pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX0V4dF9JVDkpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UcmlnZ2VyX1NvZnR3YXJlKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQUNfd2F2ZV9nZW5lcmF0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIERBQ19XYXZlR2VuZXJhdGlvbl9Ob25lICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgREFDX1dhdmVHZW5lcmF0aW9uX05vaXNlICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBEQUNfV2F2ZUdlbmVyYXRpb25fVHJpYW5nbGUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MCkNCi0jZGVmaW5lIElTX0RBQ19HRU5FUkFURV9XQVZFKFdBVkUpICgoKFdBVkUpID09IERBQ19XYXZlR2VuZXJhdGlvbl9Ob25lKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVZFKSA9PSBEQUNfV2F2ZUdlbmVyYXRpb25fTm9pc2UpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVkUpID09IERBQ19XYXZlR2VuZXJhdGlvbl9UcmlhbmdsZSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX2xmc3J1bm1hc2tfdHJpYW5nbGVhbXBsaXR1ZGUNCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBEQUNfTEZTUlVubWFza19CaXQwICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXQwIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHMxXzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMTAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHMyXzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsyOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHMzXzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMzAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFszOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHM0XzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs0OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHM1XzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNTAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs1OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHM2XzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNjAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs2OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHM3XzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNzAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs3OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHM4XzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwODAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs4OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHM5XzAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwOTAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs5OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8NCi0jZGVmaW5lIERBQ19MRlNSVW5tYXNrX0JpdHMxMF8wICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwQTAwKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxMDowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovDQotI2RlZmluZSBEQUNfTEZTUlVubWFza19CaXRzMTFfMCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMEIwMCkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMTE6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzEgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMSAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzMgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMyAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzcgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNyAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzE1ICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAzMDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTUgKi8NCi0jZGVmaW5lIERBQ19UcmlhbmdsZUFtcGxpdHVkZV8zMSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDMxICovDQotI2RlZmluZSBEQUNfVHJpYW5nbGVBbXBsaXR1ZGVfNjMgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDUwMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA2MyAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzEyNyAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA2MDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTI3ICovDQotI2RlZmluZSBEQUNfVHJpYW5nbGVBbXBsaXR1ZGVfMjU1ICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDcwMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAyNTUgKi8NCi0jZGVmaW5lIERBQ19UcmlhbmdsZUFtcGxpdHVkZV81MTEgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwODAwKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDUxMSAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzEwMjMgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA5MDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTAyMyAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzIwNDcgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDBBMDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjA0NyAqLw0KLSNkZWZpbmUgREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzQwOTUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDBCMDApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNDA5NSAqLw0KLQ0KLSNkZWZpbmUgSVNfREFDX0xGU1JfVU5NQVNLX1RSSUFOR0xFX0FNUExJVFVERShWQUxVRSkgKCgoVkFMVUUpID09IERBQ19MRlNSVW5tYXNrX0JpdDApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVubWFza19CaXRzMV8wKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX0xGU1JVbm1hc2tfQml0czJfMCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVW5tYXNrX0JpdHMzXzApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVubWFza19CaXRzNF8wKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX0xGU1JVbm1hc2tfQml0czVfMCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVW5tYXNrX0JpdHM2XzApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVubWFza19CaXRzN18wKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX0xGU1JVbm1hc2tfQml0czhfMCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVW5tYXNrX0JpdHM5XzApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVubWFza19CaXRzMTBfMCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19MRlNSVW5tYXNrX0JpdHMxMV8wKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVHJpYW5nbGVBbXBsaXR1ZGVfMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UcmlhbmdsZUFtcGxpdHVkZV83KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzE1KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzMxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzYzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzEyNykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UcmlhbmdsZUFtcGxpdHVkZV8yNTUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVHJpYW5nbGVBbXBsaXR1ZGVfNTExKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RyaWFuZ2xlQW1wbGl0dWRlXzEwMjMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVHJpYW5nbGVBbXBsaXR1ZGVfMjA0NykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UcmlhbmdsZUFtcGxpdHVkZV80MDk1KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQUNfb3V0cHV0X2J1ZmZlciANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBEQUNfT3V0cHV0QnVmZmVyX0VuYWJsZSAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIERBQ19PdXRwdXRCdWZmZXJfRGlzYWJsZSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KLSNkZWZpbmUgSVNfREFDX09VVFBVVF9CVUZGRVJfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBEQUNfT3V0cHV0QnVmZmVyX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBEQUNfT3V0cHV0QnVmZmVyX0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERBQ19DaGFubmVsX3NlbGVjdGlvbiANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBEQUNfQ2hhbm5lbF8xICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIERBQ19DaGFubmVsXzIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKQ0KLSNkZWZpbmUgSVNfREFDX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gREFDX0NoYW5uZWxfMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gREFDX0NoYW5uZWxfMikpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX2RhdGFfYWxpZ25lbWVudCANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBEQUNfQWxpZ25fMTJiX1IgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIERBQ19BbGlnbl8xMmJfTCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KLSNkZWZpbmUgREFDX0FsaWduXzhiX1IgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQotI2RlZmluZSBJU19EQUNfQUxJR04oQUxJR04pICgoKEFMSUdOKSA9PSBEQUNfQWxpZ25fMTJiX1IpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxJR04pID09IERBQ19BbGlnbl8xMmJfTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTElHTikgPT0gREFDX0FsaWduXzhiX1IpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERBQ193YXZlX2dlbmVyYXRpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgREFDX1dhdmVfTm9pc2UgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBEQUNfV2F2ZV9UcmlhbmdsZSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MCkNCi0jZGVmaW5lIElTX0RBQ19XQVZFKFdBVkUpICgoKFdBVkUpID09IERBQ19XYXZlX05vaXNlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVZFKSA9PSBEQUNfV2F2ZV9UcmlhbmdsZSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX2RhdGEgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfREFDX0RBVEEoREFUQSkgKChEQVRBKSA8PSAweEZGRjApIA0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0jaWYgZGVmaW5lZCAoU1RNMzJGMTBYX0xEX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfTURfVkwpICB8fCBkZWZpbmVkIChTVE0zMkYxMFhfSERfVkwpDQotLyoqIEBkZWZncm91cCBEQUNfaW50ZXJydXB0c19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8gDQotICANCi0jZGVmaW5lIERBQ19JVF9ETUFVRFIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwKSAgDQotI2RlZmluZSBJU19EQUNfSVQoSVQpICgoKElUKSA9PSBEQUNfSVRfRE1BVURSKSkgDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIERBQ19mbGFnc19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8gDQotICANCi0jZGVmaW5lIERBQ19GTEFHX0RNQVVEUiAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwKSAgDQotI2RlZmluZSBJU19EQUNfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBEQUNfRkxBR19ETUFVRFIpKSAgDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERBQ19FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIERBQ19EZUluaXQodm9pZCk7DQotdm9pZCBEQUNfSW5pdCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgREFDX0luaXRUeXBlRGVmKiBEQUNfSW5pdFN0cnVjdCk7DQotdm9pZCBEQUNfU3RydWN0SW5pdChEQUNfSW5pdFR5cGVEZWYqIERBQ19Jbml0U3RydWN0KTsNCi12b2lkIERBQ19DbWQodWludDMyX3QgREFDX0NoYW5uZWwsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotI2lmIGRlZmluZWQgKFNUTTMyRjEwWF9MRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX01EX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfSERfVkwpDQotdm9pZCBEQUNfSVRDb25maWcodWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERBQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi0jZW5kaWYNCi12b2lkIERBQ19ETUFDbWQodWludDMyX3QgREFDX0NoYW5uZWwsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBEQUNfU29mdHdhcmVUcmlnZ2VyQ21kKHVpbnQzMl90IERBQ19DaGFubmVsLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgREFDX0R1YWxTb2Z0d2FyZVRyaWdnZXJDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIERBQ19XYXZlR2VuZXJhdGlvbkNtZCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX1dhdmUsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBEQUNfU2V0Q2hhbm5lbDFEYXRhKHVpbnQzMl90IERBQ19BbGlnbiwgdWludDE2X3QgRGF0YSk7DQotdm9pZCBEQUNfU2V0Q2hhbm5lbDJEYXRhKHVpbnQzMl90IERBQ19BbGlnbiwgdWludDE2X3QgRGF0YSk7DQotdm9pZCBEQUNfU2V0RHVhbENoYW5uZWxEYXRhKHVpbnQzMl90IERBQ19BbGlnbiwgdWludDE2X3QgRGF0YTIsIHVpbnQxNl90IERhdGExKTsNCi11aW50MTZfdCBEQUNfR2V0RGF0YU91dHB1dFZhbHVlKHVpbnQzMl90IERBQ19DaGFubmVsKTsNCi0jaWYgZGVmaW5lZCAoU1RNMzJGMTBYX0xEX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfTURfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9IRF9WTCkgDQotRmxhZ1N0YXR1cyBEQUNfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0ZMQUcpOw0KLXZvaWQgREFDX0NsZWFyRmxhZyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0ZMQUcpOw0KLUlUU3RhdHVzIERBQ19HZXRJVFN0YXR1cyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0lUKTsNCi12b2lkIERBQ19DbGVhcklUUGVuZGluZ0JpdCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0lUKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qX19TVE0zMkYxMHhfREFDX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2RiZ21jdS5oIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZGJnbWN1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGUyNWYuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZGJnbWN1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2RiZ21jdS5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgREJHTUNVIA0KLSAgKiAgICAgICAgICBmaXJtd2FyZSBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X0RCR01DVV9IDQotI2RlZmluZSBfX1NUTTMyRjEweF9EQkdNQ1VfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIERCR01DVQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERCR01DVV9FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQkdNQ1VfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgREJHTUNVX1NMRUVQICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQotI2RlZmluZSBEQkdNQ1VfU1RPUCAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikNCi0jZGVmaW5lIERCR01DVV9TVEFOREJZICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KLSNkZWZpbmUgREJHTUNVX0lXREdfU1RPUCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApDQotI2RlZmluZSBEQkdNQ1VfV1dER19TVE9QICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMCkNCi0jZGVmaW5lIERCR01DVV9USU0xX1NUT1AgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKQ0KLSNkZWZpbmUgREJHTUNVX1RJTTJfU1RPUCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApDQotI2RlZmluZSBEQkdNQ1VfVElNM19TVE9QICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkNCi0jZGVmaW5lIERCR01DVV9USU00X1NUT1AgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwKQ0KLSNkZWZpbmUgREJHTUNVX0NBTjFfU1RPUCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApDQotI2RlZmluZSBEQkdNQ1VfSTJDMV9TTUJVU19USU1FT1VUICAgICgodWludDMyX3QpMHgwMDAwODAwMCkNCi0jZGVmaW5lIERCR01DVV9JMkMyX1NNQlVTX1RJTUVPVVQgICAgKCh1aW50MzJfdCkweDAwMDEwMDAwKQ0KLSNkZWZpbmUgREJHTUNVX1RJTThfU1RPUCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDApDQotI2RlZmluZSBEQkdNQ1VfVElNNV9TVE9QICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMCkNCi0jZGVmaW5lIERCR01DVV9USU02X1NUT1AgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwKQ0KLSNkZWZpbmUgREJHTUNVX1RJTTdfU1RPUCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDApDQotI2RlZmluZSBEQkdNQ1VfQ0FOMl9TVE9QICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMCkNCi0jZGVmaW5lIERCR01DVV9USU0xNV9TVE9QICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwKQ0KLSNkZWZpbmUgREJHTUNVX1RJTTE2X1NUT1AgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQotI2RlZmluZSBEQkdNQ1VfVElNMTdfU1RPUCAgICAgICAgICAgICgodWludDMyX3QpMHgwMTAwMDAwMCkNCi0jZGVmaW5lIERCR01DVV9USU0xMl9TVE9QICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAwKQ0KLSNkZWZpbmUgREJHTUNVX1RJTTEzX1NUT1AgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDQwMDAwMDApDQotI2RlZmluZSBEQkdNQ1VfVElNMTRfU1RPUCAgICAgICAgICAgICgodWludDMyX3QpMHgwODAwMDAwMCkNCi0jZGVmaW5lIERCR01DVV9USU05X1NUT1AgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDAwKQ0KLSNkZWZpbmUgREJHTUNVX1RJTTEwX1NUT1AgICAgICAgICAgICAoKHVpbnQzMl90KTB4MjAwMDAwMDApDQotI2RlZmluZSBEQkdNQ1VfVElNMTFfU1RPUCAgICAgICAgICAgICgodWludDMyX3QpMHg0MDAwMDAwMCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBJU19EQkdNQ1VfUEVSSVBIKFBFUklQSCkgKCgoKFBFUklQSCkgJiAweDgwMDAwMEY4KSA9PSAweDAwKSAmJiAoKFBFUklQSCkgIT0gMHgwMCkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIERCR01DVV9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREJHTUNVX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi11aW50MzJfdCBEQkdNQ1VfR2V0UkVWSUQodm9pZCk7DQotdWludDMyX3QgREJHTUNVX0dldERFVklEKHZvaWQpOw0KLXZvaWQgREJHTUNVX0NvbmZpZyh1aW50MzJfdCBEQkdNQ1VfUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkYxMHhfREJHTUNVX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2RtYS5oIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNTMwMmIuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2RtYS5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgRE1BIGZpcm13YXJlIA0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X0RNQV9IDQotI2RlZmluZSBfX1NUTTMyRjEweF9ETUFfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIERNQQ0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogDQotICAqIEBicmllZiAgRE1BIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MzJfdCBETUFfUGVyaXBoZXJhbEJhc2VBZGRyOyAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3MgZm9yIERNQXkgQ2hhbm5lbHguICovDQotDQotICB1aW50MzJfdCBETUFfTWVtb3J5QmFzZUFkZHI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBmb3IgRE1BeSBDaGFubmVseC4gKi8NCi0NCi0gIHVpbnQzMl90IERNQV9ESVI7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBwZXJpcGhlcmFsIGlzIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX2RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uICovDQotDQotICB1aW50MzJfdCBETUFfQnVmZmVyU2l6ZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYnVmZmVyIHNpemUsIGluIGRhdGEgdW5pdCwgb2YgdGhlIHNwZWNpZmllZCBDaGFubmVsLiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGEgdW5pdCBpcyBlcXVhbCB0byB0aGUgY29uZmlndXJhdGlvbiBzZXQgaW4gRE1BX1BlcmlwaGVyYWxEYXRhU2l6ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBETUFfTWVtb3J5RGF0YVNpemUgbWVtYmVycyBkZXBlbmRpbmcgaW4gdGhlIHRyYW5zZmVyIGRpcmVjdGlvbi4gKi8NCi0NCi0gIHVpbnQzMl90IERNQV9QZXJpcGhlcmFsSW5jOyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlciBpcyBpbmNyZW1lbnRlZCBvciBub3QuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX3BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSAqLw0KLQ0KLSAgdWludDMyX3QgRE1BX01lbW9yeUluYzsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXIgaXMgaW5jcmVtZW50ZWQgb3Igbm90Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9tZW1vcnlfaW5jcmVtZW50ZWRfbW9kZSAqLw0KLQ0KLSAgdWludDMyX3QgRE1BX1BlcmlwaGVyYWxEYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgZGF0YSB3aWR0aC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfcGVyaXBoZXJhbF9kYXRhX3NpemUgKi8NCi0NCi0gIHVpbnQzMl90IERNQV9NZW1vcnlEYXRhU2l6ZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBNZW1vcnkgZGF0YSB3aWR0aC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfbWVtb3J5X2RhdGFfc2l6ZSAqLw0KLQ0KLSAgdWludDMyX3QgRE1BX01vZGU7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBETUF5IENoYW5uZWx4Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9jaXJjdWxhcl9ub3JtYWxfbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGU6IFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRyYW5zZmVyIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHNlbGVjdGVkIENoYW5uZWwgKi8NCi0NCi0gIHVpbnQzMl90IERNQV9Qcmlvcml0eTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzb2Z0d2FyZSBwcmlvcml0eSBmb3IgdGhlIERNQXkgQ2hhbm5lbHguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX3ByaW9yaXR5X2xldmVsICovDQotDQotICB1aW50MzJfdCBETUFfTTJNOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgRE1BeSBDaGFubmVseCB3aWxsIGJlIHVzZWQgaW4gbWVtb3J5LXRvLW1lbW9yeSB0cmFuc2Zlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfbWVtb3J5X3RvX21lbW9yeSAqLw0KLX1ETUFfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0NvbnN0YW50cw0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0RNQV9BTExfUEVSSVBIKFBFUklQSCkgKCgoUEVSSVBIKSA9PSBETUExX0NoYW5uZWwxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gRE1BMV9DaGFubmVsMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IERNQTFfQ2hhbm5lbDMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBETUExX0NoYW5uZWw0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gRE1BMV9DaGFubmVsNSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IERNQTFfQ2hhbm5lbDYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBETUExX0NoYW5uZWw3KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gRE1BMl9DaGFubmVsMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IERNQTJfQ2hhbm5lbDIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBETUEyX0NoYW5uZWwzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gRE1BMl9DaGFubmVsNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IERNQTJfQ2hhbm5lbDUpKQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX2RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIERNQV9ESVJfUGVyaXBoZXJhbERTVCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKQ0KLSNkZWZpbmUgRE1BX0RJUl9QZXJpcGhlcmFsU1JDICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBJU19ETUFfRElSKERJUikgKCgoRElSKSA9PSBETUFfRElSX1BlcmlwaGVyYWxEU1QpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKChESVIpID09IERNQV9ESVJfUGVyaXBoZXJhbFNSQykpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX3BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBETUFfUGVyaXBoZXJhbEluY19FbmFibGUgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkNCi0jZGVmaW5lIERNQV9QZXJpcGhlcmFsSW5jX0Rpc2FibGUgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRE1BX1BlcmlwaGVyYWxJbmNfRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBETUFfUGVyaXBoZXJhbEluY19EaXNhYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfbWVtb3J5X2luY3JlbWVudGVkX21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRE1BX01lbW9yeUluY19FbmFibGUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApDQotI2RlZmluZSBETUFfTWVtb3J5SW5jX0Rpc2FibGUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRE1BX01lbW9yeUluY19FbmFibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gRE1BX01lbW9yeUluY19EaXNhYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfcGVyaXBoZXJhbF9kYXRhX3NpemUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRE1BX1BlcmlwaGVyYWxEYXRhU2l6ZV9CeXRlICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBETUFfUGVyaXBoZXJhbERhdGFTaXplX0hhbGZXb3JkICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkNCi0jZGVmaW5lIERNQV9QZXJpcGhlcmFsRGF0YVNpemVfV29yZCAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwKQ0KLSNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKFNJWkUpICgoKFNJWkUpID09IERNQV9QZXJpcGhlcmFsRGF0YVNpemVfQnl0ZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9QZXJpcGhlcmFsRGF0YVNpemVfSGFsZldvcmQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBETUFfUGVyaXBoZXJhbERhdGFTaXplX1dvcmQpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9tZW1vcnlfZGF0YV9zaXplIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIERNQV9NZW1vcnlEYXRhU2l6ZV9CeXRlICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRE1BX01lbW9yeURhdGFTaXplX0hhbGZXb3JkICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApDQotI2RlZmluZSBETUFfTWVtb3J5RGF0YVNpemVfV29yZCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkNCi0jZGVmaW5lIElTX0RNQV9NRU1PUllfREFUQV9TSVpFKFNJWkUpICgoKFNJWkUpID09IERNQV9NZW1vcnlEYXRhU2l6ZV9CeXRlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBETUFfTWVtb3J5RGF0YVNpemVfSGFsZldvcmQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9NZW1vcnlEYXRhU2l6ZV9Xb3JkKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfY2lyY3VsYXJfbm9ybWFsX21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRE1BX01vZGVfQ2lyY3VsYXIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApDQotI2RlZmluZSBETUFfTW9kZV9Ob3JtYWwgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIElTX0RNQV9NT0RFKE1PREUpICgoKE1PREUpID09IERNQV9Nb2RlX0NpcmN1bGFyKSB8fCAoKE1PREUpID09IERNQV9Nb2RlX05vcm1hbCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX3ByaW9yaXR5X2xldmVsIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIERNQV9Qcmlvcml0eV9WZXJ5SGlnaCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAzMDAwKQ0KLSNkZWZpbmUgRE1BX1ByaW9yaXR5X0hpZ2ggICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApDQotI2RlZmluZSBETUFfUHJpb3JpdHlfTWVkaXVtICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkNCi0jZGVmaW5lIERNQV9Qcmlvcml0eV9Mb3cgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgSVNfRE1BX1BSSU9SSVRZKFBSSU9SSVRZKSAoKChQUklPUklUWSkgPT0gRE1BX1ByaW9yaXR5X1ZlcnlIaWdoKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSSU9SSVRZKSA9PSBETUFfUHJpb3JpdHlfSGlnaCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUklPUklUWSkgPT0gRE1BX1ByaW9yaXR5X01lZGl1bSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUklPUklUWSkgPT0gRE1BX1ByaW9yaXR5X0xvdykpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX21lbW9yeV90b19tZW1vcnkgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRE1BX00yTV9FbmFibGUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApDQotI2RlZmluZSBETUFfTTJNX0Rpc2FibGUgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIElTX0RNQV9NMk1fU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBETUFfTTJNX0VuYWJsZSkgfHwgKChTVEFURSkgPT0gRE1BX00yTV9EaXNhYmxlKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfaW50ZXJydXB0c19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIERNQV9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KLSNkZWZpbmUgRE1BX0lUX0hUICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotI2RlZmluZSBETUFfSVRfVEUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi0jZGVmaW5lIElTX0RNQV9DT05GSUdfSVQoSVQpICgoKChJVCkgJiAweEZGRkZGRkYxKSA9PSAweDAwKSAmJiAoKElUKSAhPSAweDAwKSkNCi0NCi0jZGVmaW5lIERNQTFfSVRfR0wxICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQ0KLSNkZWZpbmUgRE1BMV9JVF9UQzEgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpDQotI2RlZmluZSBETUExX0lUX0hUMSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCi0jZGVmaW5lIERNQTFfSVRfVEUxICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4KQ0KLSNkZWZpbmUgRE1BMV9JVF9HTDIgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApDQotI2RlZmluZSBETUExX0lUX1RDMiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkNCi0jZGVmaW5lIERNQTFfSVRfSFQyICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKQ0KLSNkZWZpbmUgRE1BMV9JVF9URTIgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApDQotI2RlZmluZSBETUExX0lUX0dMMyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkNCi0jZGVmaW5lIERNQTFfSVRfVEMzICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwKQ0KLSNkZWZpbmUgRE1BMV9JVF9IVDMgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApDQotI2RlZmluZSBETUExX0lUX1RFMyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkNCi0jZGVmaW5lIERNQTFfSVRfR0w0ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxMDAwKQ0KLSNkZWZpbmUgRE1BMV9JVF9UQzQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApDQotI2RlZmluZSBETUExX0lUX0hUNCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwNDAwMCkNCi0jZGVmaW5lIERNQTFfSVRfVEU0ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA4MDAwKQ0KLSNkZWZpbmUgRE1BMV9JVF9HTDUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApDQotI2RlZmluZSBETUExX0lUX1RDNSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMCkNCi0jZGVmaW5lIERNQTFfSVRfSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDQwMDAwKQ0KLSNkZWZpbmUgRE1BMV9JVF9URTUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwODAwMDApDQotI2RlZmluZSBETUExX0lUX0dMNiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDEwMDAwMCkNCi0jZGVmaW5lIERNQTFfSVRfVEM2ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMjAwMDAwKQ0KLSNkZWZpbmUgRE1BMV9JVF9IVDYgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDApDQotI2RlZmluZSBETUExX0lUX1RFNiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDgwMDAwMCkNCi0jZGVmaW5lIERNQTFfSVRfR0w3ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAxMDAwMDAwKQ0KLSNkZWZpbmUgRE1BMV9JVF9UQzcgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDApDQotI2RlZmluZSBETUExX0lUX0hUNyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwNDAwMDAwMCkNCi0jZGVmaW5lIERNQTFfSVRfVEU3ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA4MDAwMDAwKQ0KLQ0KLSNkZWZpbmUgRE1BMl9JVF9HTDEgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDEpDQotI2RlZmluZSBETUEyX0lUX1RDMSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAwMikNCi0jZGVmaW5lIERNQTJfSVRfSFQxICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDA0KQ0KLSNkZWZpbmUgRE1BMl9JVF9URTEgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDgpDQotI2RlZmluZSBETUEyX0lUX0dMMiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAxMCkNCi0jZGVmaW5lIERNQTJfSVRfVEMyICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDIwKQ0KLSNkZWZpbmUgRE1BMl9JVF9IVDIgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwNDApDQotI2RlZmluZSBETUEyX0lUX1RFMiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDA4MCkNCi0jZGVmaW5lIERNQTJfSVRfR0wzICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMTAwKQ0KLSNkZWZpbmUgRE1BMl9JVF9UQzMgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAyMDApDQotI2RlZmluZSBETUEyX0lUX0hUMyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDQwMCkNCi0jZGVmaW5lIERNQTJfSVRfVEUzICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwODAwKQ0KLSNkZWZpbmUgRE1BMl9JVF9HTDQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDEwMDApDQotI2RlZmluZSBETUEyX0lUX1RDNCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMjAwMCkNCi0jZGVmaW5lIERNQTJfSVRfSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDA0MDAwKQ0KLSNkZWZpbmUgRE1BMl9JVF9URTQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDgwMDApDQotI2RlZmluZSBETUEyX0lUX0dMNSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAxMDAwMCkNCi0jZGVmaW5lIERNQTJfSVRfVEM1ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDIwMDAwKQ0KLSNkZWZpbmUgRE1BMl9JVF9IVDUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwNDAwMDApDQotI2RlZmluZSBETUEyX0lUX1RFNSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDA4MDAwMCkNCi0NCi0jZGVmaW5lIElTX0RNQV9DTEVBUl9JVChJVCkgKCgoKChJVCkgJiAweEYwMDAwMDAwKSA9PSAweDAwKSB8fCAoKChJVCkgJiAweEVGRjAwMDAwKSA9PSAweDAwKSkgJiYgKChJVCkgIT0gMHgwMCkpDQotDQotI2RlZmluZSBJU19ETUFfR0VUX0lUKElUKSAoKChJVCkgPT0gRE1BMV9JVF9HTDEpIHx8ICgoSVQpID09IERNQTFfSVRfVEMxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDEpIHx8ICgoSVQpID09IERNQTFfSVRfVEUxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9HTDIpIHx8ICgoSVQpID09IERNQTFfSVRfVEMyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDIpIHx8ICgoSVQpID09IERNQTFfSVRfVEUyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9HTDMpIHx8ICgoSVQpID09IERNQTFfSVRfVEMzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDMpIHx8ICgoSVQpID09IERNQTFfSVRfVEUzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9HTDQpIHx8ICgoSVQpID09IERNQTFfSVRfVEM0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDQpIHx8ICgoSVQpID09IERNQTFfSVRfVEU0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9HTDUpIHx8ICgoSVQpID09IERNQTFfSVRfVEM1KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDUpIHx8ICgoSVQpID09IERNQTFfSVRfVEU1KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9HTDYpIHx8ICgoSVQpID09IERNQTFfSVRfVEM2KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDYpIHx8ICgoSVQpID09IERNQTFfSVRfVEU2KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9HTDcpIHx8ICgoSVQpID09IERNQTFfSVRfVEM3KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMV9JVF9IVDcpIHx8ICgoSVQpID09IERNQTFfSVRfVEU3KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9HTDEpIHx8ICgoSVQpID09IERNQTJfSVRfVEMxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9IVDEpIHx8ICgoSVQpID09IERNQTJfSVRfVEUxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9HTDIpIHx8ICgoSVQpID09IERNQTJfSVRfVEMyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9IVDIpIHx8ICgoSVQpID09IERNQTJfSVRfVEUyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9HTDMpIHx8ICgoSVQpID09IERNQTJfSVRfVEMzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9IVDMpIHx8ICgoSVQpID09IERNQTJfSVRfVEUzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9HTDQpIHx8ICgoSVQpID09IERNQTJfSVRfVEM0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9IVDQpIHx8ICgoSVQpID09IERNQTJfSVRfVEU0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9HTDUpIHx8ICgoSVQpID09IERNQTJfSVRfVEM1KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gRE1BMl9JVF9IVDUpIHx8ICgoSVQpID09IERNQTJfSVRfVEU1KSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfZmxhZ3NfZGVmaW5pdGlvbiANCi0gICogQHsNCi0gICovDQotI2RlZmluZSBETUExX0ZMQUdfR0wxICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkNCi0jZGVmaW5lIERNQTFfRkxBR19UQzEgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX0hUMSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotI2RlZmluZSBETUExX0ZMQUdfVEUxICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi0jZGVmaW5lIERNQTFfRkxBR19HTDIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX1RDMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApDQotI2RlZmluZSBETUExX0ZMQUdfSFQyICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkNCi0jZGVmaW5lIERNQTFfRkxBR19URTIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX0dMMyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApDQotI2RlZmluZSBETUExX0ZMQUdfVEMzICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMCkNCi0jZGVmaW5lIERNQTFfRkxBR19IVDMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX1RFMyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApDQotI2RlZmluZSBETUExX0ZMQUdfR0w0ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkNCi0jZGVmaW5lIERNQTFfRkxBR19UQzQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX0hUNCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApDQotI2RlZmluZSBETUExX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwODAwMCkNCi0jZGVmaW5lIERNQTFfRkxBR19HTDUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDEwMDAwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX1RDNSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDApDQotI2RlZmluZSBETUExX0ZMQUdfSFQ1ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMCkNCi0jZGVmaW5lIERNQTFfRkxBR19URTUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX0dMNiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDApDQotI2RlZmluZSBETUExX0ZMQUdfVEM2ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMCkNCi0jZGVmaW5lIERNQTFfRkxBR19IVDYgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX1RFNiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQotI2RlZmluZSBETUExX0ZMQUdfR0w3ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMTAwMDAwMCkNCi0jZGVmaW5lIERNQTFfRkxBR19UQzcgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAwKQ0KLSNkZWZpbmUgRE1BMV9GTEFHX0hUNyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDQwMDAwMDApDQotI2RlZmluZSBETUExX0ZMQUdfVEU3ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwODAwMDAwMCkNCi0NCi0jZGVmaW5lIERNQTJfRkxBR19HTDEgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDAxKQ0KLSNkZWZpbmUgRE1BMl9GTEFHX1RDMSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDIpDQotI2RlZmluZSBETUEyX0ZMQUdfSFQxICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAwNCkNCi0jZGVmaW5lIERNQTJfRkxBR19URTEgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDA4KQ0KLSNkZWZpbmUgRE1BMl9GTEFHX0dMMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMTApDQotI2RlZmluZSBETUEyX0ZMQUdfVEMyICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAyMCkNCi0jZGVmaW5lIERNQTJfRkxBR19IVDIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDQwKQ0KLSNkZWZpbmUgRE1BMl9GTEFHX1RFMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwODApDQotI2RlZmluZSBETUEyX0ZMQUdfR0wzICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDEwMCkNCi0jZGVmaW5lIERNQTJfRkxBR19UQzMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMjAwKQ0KLSNkZWZpbmUgRE1BMl9GTEFHX0hUMyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDA0MDApDQotI2RlZmluZSBETUEyX0ZMQUdfVEUzICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDgwMCkNCi0jZGVmaW5lIERNQTJfRkxBR19HTDQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAxMDAwKQ0KLSNkZWZpbmUgRE1BMl9GTEFHX1RDNCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDIwMDApDQotI2RlZmluZSBETUEyX0ZMQUdfSFQ0ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwNDAwMCkNCi0jZGVmaW5lIERNQTJfRkxBR19URTQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDA4MDAwKQ0KLSNkZWZpbmUgRE1BMl9GTEFHX0dMNSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMTAwMDApDQotI2RlZmluZSBETUEyX0ZMQUdfVEM1ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAyMDAwMCkNCi0jZGVmaW5lIERNQTJfRkxBR19IVDUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDQwMDAwKQ0KLSNkZWZpbmUgRE1BMl9GTEFHX1RFNSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwODAwMDApDQotDQotI2RlZmluZSBJU19ETUFfQ0xFQVJfRkxBRyhGTEFHKSAoKCgoKEZMQUcpICYgMHhGMDAwMDAwMCkgPT0gMHgwMCkgfHwgKCgoRkxBRykgJiAweEVGRjAwMDAwKSA9PSAweDAwKSkgJiYgKChGTEFHKSAhPSAweDAwKSkNCi0NCi0jZGVmaW5lIElTX0RNQV9HRVRfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBETUExX0ZMQUdfR0wxKSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQxKSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfR0wyKSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQyKSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfR0wzKSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQzKSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfR0w0KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQ0KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfR0w1KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQ1KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfR0w2KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQ2KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfR0w3KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19UQzcpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUExX0ZMQUdfSFQ3KSB8fCAoKEZMQUcpID09IERNQTFfRkxBR19URTcpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfR0wxKSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19UQzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfSFQxKSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19URTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfR0wyKSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19UQzIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfSFQyKSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19URTIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfR0wzKSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19UQzMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfSFQzKSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19URTMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfR0w0KSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19UQzQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfSFQ0KSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19URTQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfR0w1KSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19UQzUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBETUEyX0ZMQUdfSFQ1KSB8fCAoKEZMQUcpID09IERNQTJfRkxBR19URTUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9CdWZmZXJfU2l6ZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19ETUFfQlVGRkVSX1NJWkUoU0laRSkgKCgoU0laRSkgPj0gMHgxKSAmJiAoKFNJWkUpIDwgMHgxMDAwMCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIERNQV9EZUluaXQoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCk7DQotdm9pZCBETUFfSW5pdChETUFfQ2hhbm5lbF9UeXBlRGVmKiBETUF5X0NoYW5uZWx4LCBETUFfSW5pdFR5cGVEZWYqIERNQV9Jbml0U3RydWN0KTsNCi12b2lkIERNQV9TdHJ1Y3RJbml0KERNQV9Jbml0VHlwZURlZiogRE1BX0luaXRTdHJ1Y3QpOw0KLXZvaWQgRE1BX0NtZChETUFfQ2hhbm5lbF9UeXBlRGVmKiBETUF5X0NoYW5uZWx4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgRE1BX0lUQ29uZmlnKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgsIHVpbnQzMl90IERNQV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIERNQV9TZXRDdXJyRGF0YUNvdW50ZXIoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCwgdWludDE2X3QgRGF0YU51bWJlcik7IA0KLXVpbnQxNl90IERNQV9HZXRDdXJyRGF0YUNvdW50ZXIoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCk7DQotRmxhZ1N0YXR1cyBETUFfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBETUFfRkxBRyk7DQotdm9pZCBETUFfQ2xlYXJGbGFnKHVpbnQzMl90IERNQV9GTEFHKTsNCi1JVFN0YXR1cyBETUFfR2V0SVRTdGF0dXModWludDMyX3QgRE1BX0lUKTsNCi12b2lkIERNQV9DbGVhcklUUGVuZGluZ0JpdCh1aW50MzJfdCBETUFfSVQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLypfX1NUTTMyRjEweF9ETUFfSCAqLw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZmxhc2guaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2ZsYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjA0N2QuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfZmxhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfZmxhc2guaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlcyBmb3IgdGhlIEZMQVNIIA0KLSAgKiAgICAgICAgICBmaXJtd2FyZSBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X0ZMQVNIX0gNCi0jZGVmaW5lIF9fU1RNMzJGMTB4X0ZMQVNIX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBGTEFTSA0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBGTEFTSCBTdGF0dXMgIA0KLSAgKi8NCi0NCi10eXBlZGVmIGVudW0NCi17IA0KLSAgRkxBU0hfQlVTWSA9IDEsDQotICBGTEFTSF9FUlJPUl9QRywNCi0gIEZMQVNIX0VSUk9SX1dSUCwNCi0gIEZMQVNIX0NPTVBMRVRFLA0KLSAgRkxBU0hfVElNRU9VVA0KLX1GTEFTSF9TdGF0dXM7DQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRmxhc2hfTGF0ZW5jeSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBGTEFTSF9MYXRlbmN5XzAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAgLyohPCBGTEFTSCBaZXJvIExhdGVuY3kgY3ljbGUgKi8NCi0jZGVmaW5lIEZMQVNIX0xhdGVuY3lfMSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpICAvKiE8IEZMQVNIIE9uZSBMYXRlbmN5IGN5Y2xlICovDQotI2RlZmluZSBGTEFTSF9MYXRlbmN5XzIgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKSAgLyohPCBGTEFTSCBUd28gTGF0ZW5jeSBjeWNsZXMgKi8NCi0jZGVmaW5lIElTX0ZMQVNIX0xBVEVOQ1koTEFURU5DWSkgKCgoTEFURU5DWSkgPT0gRkxBU0hfTGF0ZW5jeV8wKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExBVEVOQ1kpID09IEZMQVNIX0xhdGVuY3lfMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMQVRFTkNZKSA9PSBGTEFTSF9MYXRlbmN5XzIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEhhbGZfQ3ljbGVfRW5hYmxlX0Rpc2FibGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRkxBU0hfSGFsZkN5Y2xlQWNjZXNzX0VuYWJsZSAgICgodWludDMyX3QpMHgwMDAwMDAwOCkgIC8qITwgRkxBU0ggSGFsZiBDeWNsZSBFbmFibGUgKi8NCi0jZGVmaW5lIEZMQVNIX0hhbGZDeWNsZUFjY2Vzc19EaXNhYmxlICAoKHVpbnQzMl90KTB4MDAwMDAwMDApICAvKiE8IEZMQVNIIEhhbGYgQ3ljbGUgRGlzYWJsZSAqLw0KLSNkZWZpbmUgSVNfRkxBU0hfSEFMRkNZQ0xFQUNDRVNTX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRkxBU0hfSGFsZkN5Y2xlQWNjZXNzX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gRkxBU0hfSGFsZkN5Y2xlQWNjZXNzX0Rpc2FibGUpKSANCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBQcmVmZXRjaF9CdWZmZXJfRW5hYmxlX0Rpc2FibGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRkxBU0hfUHJlZmV0Y2hCdWZmZXJfRW5hYmxlICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkgIC8qITwgRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIEVuYWJsZSAqLw0KLSNkZWZpbmUgRkxBU0hfUHJlZmV0Y2hCdWZmZXJfRGlzYWJsZSAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgIC8qITwgRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIERpc2FibGUgKi8NCi0jZGVmaW5lIElTX0ZMQVNIX1BSRUZFVENIQlVGRkVSX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRkxBU0hfUHJlZmV0Y2hCdWZmZXJfRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IEZMQVNIX1ByZWZldGNoQnVmZmVyX0Rpc2FibGUpKSANCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBPcHRpb25fQnl0ZXNfV3JpdGVfUHJvdGVjdGlvbiANCi0gICogQHsNCi0gICovDQotDQotLyogVmFsdWVzIHRvIGJlIHVzZWQgd2l0aCBTVE0zMiBMb3cgYW5kIE1lZGl1bSBkZW5zaXR5IGRldmljZXMgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczB0bzMgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpIC8qITwgU1RNMzIgTG93IGFuZCBNZWRpdW0gZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMCB0byAzICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM0dG83ICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKSAvKiE8IFNUTTMyIExvdyBhbmQgTWVkaXVtIGRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDQgdG8gNyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzOHRvMTEgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkgLyohPCBTVE0zMiBMb3cgYW5kIE1lZGl1bSBkZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA4IHRvIDExICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMxMnRvMTUgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4KSAvKiE8IFNUTTMyIExvdyBhbmQgTWVkaXVtIGRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEyIHRvIDE1ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMxNnRvMTkgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKSAvKiE8IFNUTTMyIExvdyBhbmQgTWVkaXVtIGRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDE2IHRvIDE5ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMyMHRvMjMgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKSAvKiE8IFNUTTMyIExvdyBhbmQgTWVkaXVtIGRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDIwIHRvIDIzICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMyNHRvMjcgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKSAvKiE8IFNUTTMyIExvdyBhbmQgTWVkaXVtIGRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDI0IHRvIDI3ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMyOHRvMzEgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKSAvKiE8IFNUTTMyIExvdyBhbmQgTWVkaXVtIGRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDI4IHRvIDMxICovDQotDQotLyogVmFsdWVzIHRvIGJlIHVzZWQgd2l0aCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMzMnRvMzUgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMTAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzMiB0byAzNSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMzZ0bzM5ICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMCkgLyohPCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMzYgdG8gMzkgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczQwdG80MyAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDQwIHRvIDQzICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM0NHRvNDcgICAgICAgKCh1aW50MzJfdCkweDAwMDAwODAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0NCB0byA0NyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNDh0bzUxICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkgLyohPCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNDggdG8gNTEgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczUydG81NSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDUyIHRvIDU1ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM1NnRvNTkgICAgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1NiB0byA1OSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYzICAgICAgICgodWludDMyX3QpMHgwMDAwODAwMCkgLyohPCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNjAgdG8gNjMgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczY0dG82NyAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDY0IHRvIDY3ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM2OHRvNzEgICAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA2OCB0byA3MSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNzJ0bzc1ICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMCkgLyohPCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNzIgdG8gNzUgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczc2dG83OSAgICAgICAoKHVpbnQzMl90KTB4MDAwODAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDc2IHRvIDc5ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM4MHRvODMgICAgICAgKCh1aW50MzJfdCkweDAwMTAwMDAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA4MCB0byA4MyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzODR0bzg3ICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMCkgLyohPCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgODQgdG8gODcgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczg4dG85MSAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDg4IHRvIDkxICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM5MnRvOTUgICAgICAgKCh1aW50MzJfdCkweDAwODAwMDAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA5MiB0byA5NSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzOTZ0bzk5ICAgICAgICgodWludDMyX3QpMHgwMTAwMDAwMCkgLyohPCBTVE0zMiBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgOTYgdG8gOTkgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczEwMHRvMTAzICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEwMCB0byAxMDMgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczEwNHRvMTA3ICAgICAoKHVpbnQzMl90KTB4MDQwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEwNCB0byAxMDcgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczEwOHRvMTExICAgICAoKHVpbnQzMl90KTB4MDgwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEwOCB0byAxMTEgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczExMnRvMTE1ICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDExMiB0byAxMTUgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczExNnRvMTE5ICAgICAoKHVpbnQzMl90KTB4MjAwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDExNSB0byAxMTkgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczEyMHRvMTIzICAgICAoKHVpbnQzMl90KTB4NDAwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEyMCB0byAxMjMgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczEyNHRvMTI3ICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMDApIC8qITwgU1RNMzIgTWVkaXVtLWRlbnNpdHkgZGV2aWNlczogV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDEyNCB0byAxMjcgKi8NCi0NCi0vKiBWYWx1ZXMgdG8gYmUgdXNlZCB3aXRoIFNUTTMyIEhpZ2gtZGVuc2l0eSBhbmQgU1RNMzJGMTBYIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXMgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczB0bzEgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpIC8qITwgU1RNMzIgSGlnaC1kZW5zaXR5LCBYTC1kZW5zaXR5IGFuZCBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgMCB0byAxICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXMydG8zICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKSAvKiE8IFNUTTMyIEhpZ2gtZGVuc2l0eSwgWEwtZGVuc2l0eSBhbmQgQ29ubmVjdGl2aXR5IGxpbmUgZGV2aWNlczoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDIgdG8gMyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNHRvNSAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0IHRvIDUgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczZ0bzcgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpIC8qITwgU1RNMzIgSGlnaC1kZW5zaXR5LCBYTC1kZW5zaXR5IGFuZCBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNiB0byA3ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM4dG85ICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKSAvKiE8IFNUTTMyIEhpZ2gtZGVuc2l0eSwgWEwtZGVuc2l0eSBhbmQgQ29ubmVjdGl2aXR5IGxpbmUgZGV2aWNlczoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUgcHJvdGVjdGlvbiBvZiBwYWdlIDggdG8gOSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMTB0bzExICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxMCB0byAxMSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMTJ0bzEzICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxMiB0byAxMyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMTR0bzE1ICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxNCB0byAxNSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMTZ0bzE3ICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxNiB0byAxNyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMTh0bzE5ICAgICAgICgodWludDMyX3QpMHgwMDAwMDIwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAxOCB0byAxOSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMjB0bzIxICAgICAgICgodWludDMyX3QpMHgwMDAwMDQwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyMCB0byAyMSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMjJ0bzIzICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyMiB0byAyMyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMjR0bzI1ICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyNCB0byAyNSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMjZ0bzI3ICAgICAgICgodWludDMyX3QpMHgwMDAwMjAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyNiB0byAyNyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMjh0bzI5ICAgICAgICgodWludDMyX3QpMHgwMDAwNDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAyOCB0byAyOSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMzB0bzMxICAgICAgICgodWludDMyX3QpMHgwMDAwODAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzMCB0byAzMSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMzJ0bzMzICAgICAgICgodWludDMyX3QpMHgwMDAxMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzMiB0byAzMyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMzR0bzM1ICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzNCB0byAzNSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMzZ0bzM3ICAgICAgICgodWludDMyX3QpMHgwMDA0MDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzNiB0byAzNyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzMzh0bzM5ICAgICAgICgodWludDMyX3QpMHgwMDA4MDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSAzOCB0byAzOSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNDB0bzQxICAgICAgICgodWludDMyX3QpMHgwMDEwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0MCB0byA0MSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNDJ0bzQzICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0MiB0byA0MyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNDR0bzQ1ICAgICAgICgodWludDMyX3QpMHgwMDQwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0NCB0byA0NSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNDZ0bzQ3ICAgICAgICgodWludDMyX3QpMHgwMDgwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0NiB0byA0NyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNDh0bzQ5ICAgICAgICgodWludDMyX3QpMHgwMTAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA0OCB0byA0OSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNTB0bzUxICAgICAgICgodWludDMyX3QpMHgwMjAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1MCB0byA1MSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNTJ0bzUzICAgICAgICgodWludDMyX3QpMHgwNDAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1MiB0byA1MyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNTR0bzU1ICAgICAgICgodWludDMyX3QpMHgwODAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1NCB0byA1NSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNTZ0bzU3ICAgICAgICgodWludDMyX3QpMHgxMDAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1NiB0byA1NyAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNTh0bzU5ICAgICAgICgodWludDMyX3QpMHgyMDAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA1OCB0byA1OSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYxICAgICAgICgodWludDMyX3QpMHg0MDAwMDAwMCkgLyohPCBTVE0zMiBIaWdoLWRlbnNpdHksIFhMLWRlbnNpdHkgYW5kIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA2MCB0byA2MSAqLw0KLSNkZWZpbmUgRkxBU0hfV1JQcm90X1BhZ2VzNjJ0bzEyNyAgICAgICgodWludDMyX3QpMHg4MDAwMDAwMCkgLyohPCBTVE0zMiBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNjIgdG8gMTI3ICovDQotI2RlZmluZSBGTEFTSF9XUlByb3RfUGFnZXM2MnRvMjU1ICAgICAgKCh1aW50MzJfdCkweDgwMDAwMDAwKSAvKiE8IFNUTTMyIE1lZGl1bS1kZW5zaXR5IGRldmljZXM6IFdyaXRlIHByb3RlY3Rpb24gb2YgcGFnZSA2MiB0byAyNTUgKi8NCi0jZGVmaW5lIEZMQVNIX1dSUHJvdF9QYWdlczYydG81MTEgICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMDApIC8qITwgU1RNMzIgWEwtZGVuc2l0eSBkZXZpY2VzOiBXcml0ZSBwcm90ZWN0aW9uIG9mIHBhZ2UgNjIgdG8gNTExICovDQotDQotI2RlZmluZSBGTEFTSF9XUlByb3RfQWxsUGFnZXMgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkZGKSAvKiE8IFdyaXRlIHByb3RlY3Rpb24gb2YgYWxsIFBhZ2VzICovDQotDQotI2RlZmluZSBJU19GTEFTSF9XUlBST1RfUEFHRShQQUdFKSAoKChQQUdFKSAhPSAweDAwMDAwMDAwKSkNCi0NCi0jZGVmaW5lIElTX0ZMQVNIX0FERFJFU1MoQUREUkVTUykgKCgoQUREUkVTUykgPj0gMHgwODAwMDAwMCkgJiYgKChBRERSRVNTKSA8IDB4MDgwRkZGRkYpKQ0KLQ0KLSNkZWZpbmUgSVNfT0JfREFUQV9BRERSRVNTKEFERFJFU1MpICgoKEFERFJFU1MpID09IDB4MUZGRkY4MDQpIHx8ICgoQUREUkVTUykgPT0gMHgxRkZGRjgwNikpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgT3B0aW9uX0J5dGVzX0lXYXRjaGRvZyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBPQl9JV0RHX1NXICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpICAvKiE8IFNvZnR3YXJlIElXREcgc2VsZWN0ZWQgKi8NCi0jZGVmaW5lIE9CX0lXREdfSFcgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkgIC8qITwgSGFyZHdhcmUgSVdERyBzZWxlY3RlZCAqLw0KLSNkZWZpbmUgSVNfT0JfSVdER19TT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IE9CX0lXREdfU1cpIHx8ICgoU09VUkNFKSA9PSBPQl9JV0RHX0hXKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBPcHRpb25fQnl0ZXNfblJTVF9TVE9QIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIE9CX1NUT1BfTm9SU1QgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMikgLyohPCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QICovDQotI2RlZmluZSBPQl9TVE9QX1JTVCAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgaW4gU1RPUCAqLw0KLSNkZWZpbmUgSVNfT0JfU1RPUF9TT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IE9CX1NUT1BfTm9SU1QpIHx8ICgoU09VUkNFKSA9PSBPQl9TVE9QX1JTVCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgT3B0aW9uX0J5dGVzX25SU1RfU1REQlkgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgT0JfU1REQllfTm9SU1QgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KSAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIGluIFNUQU5EQlkgKi8NCi0jZGVmaW5lIE9CX1NUREJZX1JTVCAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZICovDQotI2RlZmluZSBJU19PQl9TVERCWV9TT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IE9CX1NUREJZX05vUlNUKSB8fCAoKFNPVVJDRSkgPT0gT0JfU1REQllfUlNUKSkNCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotLyoqDQotICAqIEB9DQotICAqLw0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfQm9vdA0KLSAgKiBAew0KLSAgKi8NCi0jZGVmaW5lIEZMQVNIX0JPT1RfQmFuazEgICgodWludDE2X3QpMHgwMDAwKSAvKiE8IEF0IHN0YXJ0dXAsIGlmIGJvb3QgcGlucyBhcmUgc2V0IGluIGJvb3QgZnJvbSB1c2VyIEZsYXNoIHBvc2l0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhpcyBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQgdGhlIGRldmljZSB3aWxsIGJvb3QgZnJvbSBCYW5rMShEZWZhdWx0KSAqLw0KLSNkZWZpbmUgRkxBU0hfQk9PVF9CYW5rMiAgKCh1aW50MTZfdCkweDAwMDEpIC8qITwgQXQgc3RhcnR1cCwgaWYgYm9vdCBwaW5zIGFyZSBzZXQgaW4gYm9vdCBmcm9tIHVzZXIgRmxhc2ggcG9zaXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGlzIHBhcmFtZXRlciBpcyBzZWxlY3RlZCB0aGUgZGV2aWNlIHdpbGwgYm9vdCBmcm9tIEJhbmsgMiBvciBCYW5rIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGFjdGl2YXRpb24gb2YgdGhlIGJhbmsgKi8NCi0jZGVmaW5lIElTX0ZMQVNIX0JPT1QoQk9PVCkgKCgoQk9PVCkgPT0gRkxBU0hfQk9PVF9CYW5rMSkgfHwgKChCT09UKSA9PSBGTEFTSF9CT09UX0JhbmsyKSkNCi0jZW5kaWYNCi0vKioNCi0gICogQH0NCi0gICovDQotLyoqIEBkZWZncm91cCBGTEFTSF9JbnRlcnJ1cHRzIA0KLSAgKiBAew0KLSAgKi8NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotI2RlZmluZSBGTEFTSF9JVF9CQU5LMl9FUlJPUiAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDgwMDAwNDAwKSAgLyohPCBGUEVDIEJBTksyIGVycm9yIGludGVycnVwdCBzb3VyY2UgKi8NCi0jZGVmaW5lIEZMQVNIX0lUX0JBTksyX0VPUCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4ODAwMDEwMDApICAvKiE8IEVuZCBvZiBGTEFTSCBCQU5LMiBPcGVyYXRpb24gSW50ZXJydXB0IHNvdXJjZSAqLw0KLQ0KLSNkZWZpbmUgRkxBU0hfSVRfQkFOSzFfRVJST1IgICAgICAgICAgICAgICAgIEZMQVNIX0lUX0VSUk9SICAgICAgICAgIC8qITwgRlBFQyBCQU5LMSBlcnJvciBpbnRlcnJ1cHQgc291cmNlICovDQotI2RlZmluZSBGTEFTSF9JVF9CQU5LMV9FT1AgICAgICAgICAgICAgICAgICAgRkxBU0hfSVRfRU9QICAgICAgICAgICAgLyohPCBFbmQgb2YgRkxBU0ggQkFOSzEgT3BlcmF0aW9uIEludGVycnVwdCBzb3VyY2UgKi8NCi0NCi0jZGVmaW5lIEZMQVNIX0lUX0VSUk9SICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApICAvKiE8IEZQRUMgQkFOSzEgZXJyb3IgaW50ZXJydXB0IHNvdXJjZSAqLw0KLSNkZWZpbmUgRkxBU0hfSVRfRU9QICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkgIC8qITwgRW5kIG9mIEZMQVNIIEJBTksxIE9wZXJhdGlvbiBJbnRlcnJ1cHQgc291cmNlICovDQotI2RlZmluZSBJU19GTEFTSF9JVChJVCkgKCgoKElUKSAmICh1aW50MzJfdCkweDdGRkZFQkZGKSA9PSAweDAwMDAwMDAwKSAmJiAoKChJVCkgIT0gMHgwMDAwMDAwMCkpKQ0KLSNlbHNlDQotI2RlZmluZSBGTEFTSF9JVF9FUlJPUiAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKSAgLyohPCBGUEVDIGVycm9yIGludGVycnVwdCBzb3VyY2UgKi8NCi0jZGVmaW5lIEZMQVNIX0lUX0VPUCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDApICAvKiE8IEVuZCBvZiBGTEFTSCBPcGVyYXRpb24gSW50ZXJydXB0IHNvdXJjZSAqLw0KLSNkZWZpbmUgRkxBU0hfSVRfQkFOSzFfRVJST1IgICAgICAgICAgIEZMQVNIX0lUX0VSUk9SICAgICAgICAgIC8qITwgRlBFQyBCQU5LMSBlcnJvciBpbnRlcnJ1cHQgc291cmNlICovDQotI2RlZmluZSBGTEFTSF9JVF9CQU5LMV9FT1AgICAgICAgICAgICAgRkxBU0hfSVRfRU9QICAgICAgICAgICAgLyohPCBFbmQgb2YgRkxBU0ggQkFOSzEgT3BlcmF0aW9uIEludGVycnVwdCBzb3VyY2UgKi8NCi0NCi0jZGVmaW5lIElTX0ZMQVNIX0lUKElUKSAoKCgoSVQpICYgKHVpbnQzMl90KTB4RkZGRkVCRkYpID09IDB4MDAwMDAwMDApICYmICgoKElUKSAhPSAweDAwMDAwMDAwKSkpDQotI2VuZGlmDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfRmxhZ3MgDQotICAqIEB7DQotICAqLw0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0jZGVmaW5lIEZMQVNIX0ZMQUdfQkFOSzJfQlNZICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMDEpICAvKiE8IEZMQVNIIEJBTksyIEJ1c3kgZmxhZyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19CQU5LMl9FT1AgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHg4MDAwMDAyMCkgIC8qITwgRkxBU0ggQkFOSzIgRW5kIG9mIE9wZXJhdGlvbiBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX0JBTksyX1BHRVJSICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDgwMDAwMDA0KSAgLyohPCBGTEFTSCBCQU5LMiBQcm9ncmFtIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfQkFOSzJfV1JQUlRFUlIgICAgICAgICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMTApICAvKiE8IEZMQVNIIEJBTksyIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnICovDQotDQotI2RlZmluZSBGTEFTSF9GTEFHX0JBTksxX0JTWSAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19CU1kgICAgICAgLyohPCBGTEFTSCBCQU5LMSBCdXN5IGZsYWcqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19CQU5LMV9FT1AgICAgICAgICAgICAgICAgIEZMQVNIX0ZMQUdfRU9QICAgICAgIC8qITwgRkxBU0ggQkFOSzEgRW5kIG9mIE9wZXJhdGlvbiBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX0JBTksxX1BHRVJSICAgICAgICAgICAgICAgRkxBU0hfRkxBR19QR0VSUiAgICAgLyohPCBGTEFTSCBCQU5LMSBQcm9ncmFtIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfQkFOSzFfV1JQUlRFUlIgICAgICAgICAgICBGTEFTSF9GTEFHX1dSUFJURVJSICAvKiE8IEZMQVNIIEJBTksxIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnICovDQotDQotI2RlZmluZSBGTEFTSF9GTEFHX0JTWSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKSAgLyohPCBGTEFTSCBCdXN5IGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfRU9QICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApICAvKiE8IEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19QR0VSUiAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkgIC8qITwgRkxBU0ggUHJvZ3JhbSBlcnJvciBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX1dSUFJURVJSICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwKSAgLyohPCBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19PUFRFUlIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgIC8qITwgRkxBU0ggT3B0aW9uIEJ5dGUgZXJyb3IgZmxhZyAqLw0KLSANCi0jZGVmaW5lIElTX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBRykgKCgoKEZMQUcpICYgKHVpbnQzMl90KTB4N0ZGRkZGQ0EpID09IDB4MDAwMDAwMDApICYmICgoRkxBRykgIT0gMHgwMDAwMDAwMCkpDQotI2RlZmluZSBJU19GTEFTSF9HRVRfRkxBRyhGTEFHKSAgKCgoRkxBRykgPT0gRkxBU0hfRkxBR19CU1kpIHx8ICgoRkxBRykgPT0gRkxBU0hfRkxBR19FT1ApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBGTEFTSF9GTEFHX1BHRVJSKSB8fCAoKEZMQUcpID09IEZMQVNIX0ZMQUdfV1JQUlRFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBGTEFTSF9GTEFHX09QVEVSUil8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gRkxBU0hfRkxBR19CQU5LMV9CU1kpIHx8ICgoRkxBRykgPT0gRkxBU0hfRkxBR19CQU5LMV9FT1ApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBGTEFTSF9GTEFHX0JBTksxX1BHRVJSKSB8fCAoKEZMQUcpID09IEZMQVNIX0ZMQUdfQkFOSzFfV1JQUlRFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBGTEFTSF9GTEFHX0JBTksyX0JTWSkgfHwgKChGTEFHKSA9PSBGTEFTSF9GTEFHX0JBTksyX0VPUCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IEZMQVNIX0ZMQUdfQkFOSzJfUEdFUlIpIHx8ICgoRkxBRykgPT0gRkxBU0hfRkxBR19CQU5LMl9XUlBSVEVSUikpDQotI2Vsc2UNCi0jZGVmaW5lIEZMQVNIX0ZMQUdfQlNZICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpICAvKiE8IEZMQVNIIEJ1c3kgZmxhZyAqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19FT1AgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkgIC8qITwgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX1BHRVJSICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KSAgLyohPCBGTEFTSCBQcm9ncmFtIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfV1JQUlRFUlIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApICAvKiE8IEZMQVNIIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX09QVEVSUiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKSAgLyohPCBGTEFTSCBPcHRpb24gQnl0ZSBlcnJvciBmbGFnICovDQotDQotI2RlZmluZSBGTEFTSF9GTEFHX0JBTksxX0JTWSAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19CU1kgICAgICAgLyohPCBGTEFTSCBCQU5LMSBCdXN5IGZsYWcqLw0KLSNkZWZpbmUgRkxBU0hfRkxBR19CQU5LMV9FT1AgICAgICAgICAgICAgICAgIEZMQVNIX0ZMQUdfRU9QICAgICAgIC8qITwgRkxBU0ggQkFOSzEgRW5kIG9mIE9wZXJhdGlvbiBmbGFnICovDQotI2RlZmluZSBGTEFTSF9GTEFHX0JBTksxX1BHRVJSICAgICAgICAgICAgICAgRkxBU0hfRkxBR19QR0VSUiAgICAgLyohPCBGTEFTSCBCQU5LMSBQcm9ncmFtIGVycm9yIGZsYWcgKi8NCi0jZGVmaW5lIEZMQVNIX0ZMQUdfQkFOSzFfV1JQUlRFUlIgICAgICAgICAgICBGTEFTSF9GTEFHX1dSUFJURVJSICAvKiE8IEZMQVNIIEJBTksxIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnICovDQotIA0KLSNkZWZpbmUgSVNfRkxBU0hfQ0xFQVJfRkxBRyhGTEFHKSAoKCgoRkxBRykgJiAodWludDMyX3QpMHhGRkZGRkZDQSkgPT0gMHgwMDAwMDAwMCkgJiYgKChGTEFHKSAhPSAweDAwMDAwMDAwKSkNCi0jZGVmaW5lIElTX0ZMQVNIX0dFVF9GTEFHKEZMQUcpICAoKChGTEFHKSA9PSBGTEFTSF9GTEFHX0JTWSkgfHwgKChGTEFHKSA9PSBGTEFTSF9GTEFHX0VPUCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IEZMQVNIX0ZMQUdfUEdFUlIpIHx8ICgoRkxBRykgPT0gRkxBU0hfRkxBR19XUlBSVEVSUikgfHwgXA0KLQkJCQkJCQkJICAoKEZMQUcpID09IEZMQVNIX0ZMQUdfQkFOSzFfQlNZKSB8fCAoKEZMQUcpID09IEZMQVNIX0ZMQUdfQkFOSzFfRU9QKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gRkxBU0hfRkxBR19CQU5LMV9QR0VSUikgfHwgKChGTEFHKSA9PSBGTEFTSF9GTEFHX0JBTksxX1dSUFJURVJSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gRkxBU0hfRkxBR19PUFRFUlIpKQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qLS0tLS0tLS0tLS0tIEZ1bmN0aW9ucyB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMgLS0tLS0qLw0KLXZvaWQgRkxBU0hfU2V0TGF0ZW5jeSh1aW50MzJfdCBGTEFTSF9MYXRlbmN5KTsNCi12b2lkIEZMQVNIX0hhbGZDeWNsZUFjY2Vzc0NtZCh1aW50MzJfdCBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3MpOw0KLXZvaWQgRkxBU0hfUHJlZmV0Y2hCdWZmZXJDbWQodWludDMyX3QgRkxBU0hfUHJlZmV0Y2hCdWZmZXIpOw0KLXZvaWQgRkxBU0hfVW5sb2NrKHZvaWQpOw0KLXZvaWQgRkxBU0hfTG9jayh2b2lkKTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfRXJhc2VQYWdlKHVpbnQzMl90IFBhZ2VfQWRkcmVzcyk7DQotRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlQWxsUGFnZXModm9pZCk7DQotRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlT3B0aW9uQnl0ZXModm9pZCk7DQotRkxBU0hfU3RhdHVzIEZMQVNIX1Byb2dyYW1Xb3JkKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGEpOw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9Qcm9ncmFtSGFsZldvcmQodWludDMyX3QgQWRkcmVzcywgdWludDE2X3QgRGF0YSk7DQotRkxBU0hfU3RhdHVzIEZMQVNIX1Byb2dyYW1PcHRpb25CeXRlRGF0YSh1aW50MzJfdCBBZGRyZXNzLCB1aW50OF90IERhdGEpOw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9FbmFibGVXcml0ZVByb3RlY3Rpb24odWludDMyX3QgRkxBU0hfUGFnZXMpOw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9SZWFkT3V0UHJvdGVjdGlvbihGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9Vc2VyT3B0aW9uQnl0ZUNvbmZpZyh1aW50MTZfdCBPQl9JV0RHLCB1aW50MTZfdCBPQl9TVE9QLCB1aW50MTZfdCBPQl9TVERCWSk7DQotdWludDMyX3QgRkxBU0hfR2V0VXNlck9wdGlvbkJ5dGUodm9pZCk7DQotdWludDMyX3QgRkxBU0hfR2V0V3JpdGVQcm90ZWN0aW9uT3B0aW9uQnl0ZSh2b2lkKTsNCi1GbGFnU3RhdHVzIEZMQVNIX0dldFJlYWRPdXRQcm90ZWN0aW9uU3RhdHVzKHZvaWQpOw0KLUZsYWdTdGF0dXMgRkxBU0hfR2V0UHJlZmV0Y2hCdWZmZXJTdGF0dXModm9pZCk7DQotdm9pZCBGTEFTSF9JVENvbmZpZyh1aW50MzJfdCBGTEFTSF9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi1GbGFnU3RhdHVzIEZMQVNIX0dldEZsYWdTdGF0dXModWludDMyX3QgRkxBU0hfRkxBRyk7DQotdm9pZCBGTEFTSF9DbGVhckZsYWcodWludDMyX3QgRkxBU0hfRkxBRyk7DQotRkxBU0hfU3RhdHVzIEZMQVNIX0dldFN0YXR1cyh2b2lkKTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24odWludDMyX3QgVGltZW91dCk7DQotDQotLyotLS0tLS0tLS0tLS0gTmV3IGZ1bmN0aW9uIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcyAtLS0tLSovDQotdm9pZCBGTEFTSF9VbmxvY2tCYW5rMSh2b2lkKTsNCi12b2lkIEZMQVNIX0xvY2tCYW5rMSh2b2lkKTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfRXJhc2VBbGxCYW5rMVBhZ2VzKHZvaWQpOw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9HZXRCYW5rMVN0YXR1cyh2b2lkKTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KTsNCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotLyotLS0tIE5ldyBGdW5jdGlvbnMgdXNlZCBvbmx5IHdpdGggU1RNMzJGMTB4X1hMIGRlbnNpdHkgZGV2aWNlcyAtLS0tLSovDQotdm9pZCBGTEFTSF9VbmxvY2tCYW5rMih2b2lkKTsNCi12b2lkIEZMQVNIX0xvY2tCYW5rMih2b2lkKTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfRXJhc2VBbGxCYW5rMlBhZ2VzKHZvaWQpOw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9HZXRCYW5rMlN0YXR1cyh2b2lkKTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KTsNCi1GTEFTSF9TdGF0dXMgRkxBU0hfQm9vdENvbmZpZyh1aW50MTZfdCBGTEFTSF9CT09UKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJGMTB4X0ZMQVNIX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2ZzbWMuaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2ZzbWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmOTg0Ny4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9mc21jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2ZzbWMuaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlcyBmb3IgdGhlIEZTTUMgZmlybXdhcmUgDQotICAqICAgICAgICAgIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfRlNNQ19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9GU01DX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBGU01DDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogDQotICAqIEBicmllZiAgVGltaW5nIHBhcmFtZXRlcnMgRm9yIE5PUi9TUkFNIEJhbmtzICANCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MzJfdCBGU01DX0FkZHJlc3NTZXR1cFRpbWU7ICAgICAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGNvbmZpZ3VyZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWRkcmVzcyBzZXR1cCB0aW1lLiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4Ri4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZTogSXQgaXMgbm90IHVzZWQgd2l0aCBzeW5jaHJvbm91cyBOT1IgRmxhc2ggbWVtb3JpZXMuICovDQotDQotICB1aW50MzJfdCBGU01DX0FkZHJlc3NIb2xkVGltZTsgICAgICAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGNvbmZpZ3VyZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWRkcmVzcyBob2xkIHRpbWUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEYuIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlOiBJdCBpcyBub3QgdXNlZCB3aXRoIHN5bmNocm9ub3VzIE5PUiBGbGFzaCBtZW1vcmllcy4qLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19EYXRhU2V0dXBUaW1lOyAgICAgICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgdGhlIGRhdGEgc2V0dXAgdGltZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkYuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGU6IEl0IGlzIHVzZWQgZm9yIFNSQU1zLCBST01zIGFuZCBhc3luY2hyb25vdXMgbXVsdGlwbGV4ZWQgTk9SIEZsYXNoIG1lbW9yaWVzLiAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19CdXNUdXJuQXJvdW5kRHVyYXRpb247ICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1cyB0dXJuYXJvdW5kLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlOiBJdCBpcyBvbmx5IHVzZWQgZm9yIG11bHRpcGxleGVkIE5PUiBGbGFzaCBtZW1vcmllcy4gKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfQ0xLRGl2aXNpb247ICAgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBwZXJpb2Qgb2YgQ0xLIGNsb2NrIG91dHB1dCBzaWduYWwsIGV4cHJlc3NlZCBpbiBudW1iZXIgb2YgSENMSyBjeWNsZXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAweEYuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGU6IFRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIGZvciBhc3luY2hyb25vdXMgTk9SIEZsYXNoLCBTUkFNIG9yIFJPTSBhY2Nlc3Nlcy4gKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfRGF0YUxhdGVuY3k7ICAgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgbWVtb3J5IGNsb2NrIGN5Y2xlcyB0byBpc3N1ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtZW1vcnkgYmVmb3JlIGdldHRpbmcgdGhlIGZpcnN0IGRhdGEuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIG1lbW9yeSB0eXBlIGFzIHNob3duIGJlbG93Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEl0IG11c3QgYmUgc2V0IHRvIDAgaW4gY2FzZSBvZiBhIENSQU0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJdCBpcyBkb26SdCBjYXJlIGluIGFzeW5jaHJvbm91cyBOT1IsIFNSQU0gb3IgUk9NIGFjY2Vzc2VzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSXQgbWF5IGFzc3VtZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGIGluIE5PUiBGbGFzaCBtZW1vcmllcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc3luY2hyb25vdXMgYnVyc3QgbW9kZSBlbmFibGUgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfQWNjZXNzTW9kZTsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFzeW5jaHJvbm91cyBhY2Nlc3MgbW9kZS4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX0FjY2Vzc19Nb2RlICovDQotfUZTTUNfTk9SU1JBTVRpbWluZ0luaXRUeXBlRGVmOw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBGU01DIE5PUi9TUkFNIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MzJfdCBGU01DX0Jhbms7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBOT1IvU1JBTSBtZW1vcnkgYmFuayB0aGF0IHdpbGwgYmUgdXNlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZTTUNfTk9SU1JBTV9CYW5rICovDQotDQotICB1aW50MzJfdCBGU01DX0RhdGFBZGRyZXNzTXV4OyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFkZHJlc3MgYW5kIGRhdGEgdmFsdWVzIGFyZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkIG9uIHRoZSBkYXRhYnVzIG9yIG5vdC4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX0RhdGFfQWRkcmVzc19CdXNfTXVsdGlwbGV4aW5nICovDQotDQotICB1aW50MzJfdCBGU01DX01lbW9yeVR5cGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGV4dGVybmFsIG1lbW9yeSBhdHRhY2hlZCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSBiYW5rLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRlNNQ19NZW1vcnlfVHlwZSAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19NZW1vcnlEYXRhV2lkdGg7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXh0ZXJuYWwgbWVtb3J5IGRldmljZSB3aWR0aC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZTTUNfRGF0YV9XaWR0aCAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19CdXJzdEFjY2Vzc01vZGU7ICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGJ1cnN0IGFjY2VzcyBtb2RlIGZvciBGbGFzaCBtZW1vcnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSB3aXRoIHN5bmNocm9ub3VzIGJ1cnN0IEZsYXNoIG1lbW9yaWVzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRlNNQ19CdXJzdF9BY2Nlc3NfTW9kZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgdWludDMyX3QgRlNNQ19Bc3luY2hyb25vdXNXYWl0OyAgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHdhaXQgc2lnbmFsIGR1cmluZyBhc3luY2hyb25vdXMgdHJhbnNmZXJzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIG9ubHkgd2l0aCBhc3luY2hyb25vdXMgRmxhc2ggbWVtb3JpZXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX0FzeW5jaHJvbm91c1dhaXQgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfV2FpdFNpZ25hbFBvbGFyaXR5OyAgLyohPCBTcGVjaWZpZXMgdGhlIHdhaXQgc2lnbmFsIHBvbGFyaXR5LCB2YWxpZCBvbmx5IHdoZW4gYWNjZXNzaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZsYXNoIG1lbW9yeSBpbiBidXJzdCBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRlNNQ19XYWl0X1NpZ25hbF9Qb2xhcml0eSAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19XcmFwTW9kZTsgICAgICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFdyYXBwZWQgYnVyc3QgYWNjZXNzIG1vZGUgZm9yIEZsYXNoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LCB2YWxpZCBvbmx5IHdoZW4gYWNjZXNzaW5nIEZsYXNoIG1lbW9yaWVzIGluIGJ1cnN0IG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX1dyYXBfTW9kZSAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19XYWl0U2lnbmFsQWN0aXZlOyAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgd2FpdCBzaWduYWwgaXMgYXNzZXJ0ZWQgYnkgdGhlIG1lbW9yeSBvbmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayBjeWNsZSBiZWZvcmUgdGhlIHdhaXQgc3RhdGUgb3IgZHVyaW5nIHRoZSB3YWl0IHN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIG9ubHkgd2hlbiBhY2Nlc3NpbmcgbWVtb3JpZXMgaW4gYnVyc3QgbW9kZS4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX1dhaXRfVGltaW5nICovDQotDQotICB1aW50MzJfdCBGU01DX1dyaXRlT3BlcmF0aW9uOyAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBzZWxlY3RlZCBiYW5rIGJ5IHRoZSBGU01DLiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZTTUNfV3JpdGVfT3BlcmF0aW9uICovDQotDQotICB1aW50MzJfdCBGU01DX1dhaXRTaWduYWw7ICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd2FpdC1zdGF0ZSBpbnNlcnRpb24gdmlhIHdhaXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIHZhbGlkIGZvciBGbGFzaCBtZW1vcnkgYWNjZXNzIGluIGJ1cnN0IG1vZGUuIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRlNNQ19XYWl0X1NpZ25hbCAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19FeHRlbmRlZE1vZGU7ICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGV4dGVuZGVkIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX0V4dGVuZGVkX01vZGUgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfV3JpdGVCdXJzdDsgICAgICAgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB3cml0ZSBidXJzdCBvcGVyYXRpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGU01DX1dyaXRlX0J1cnN0ICovIA0KLQ0KLSAgRlNNQ19OT1JTUkFNVGltaW5nSW5pdFR5cGVEZWYqIEZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0OyAvKiE8IFRpbWluZyBQYXJhbWV0ZXJzIGZvciB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MgaWYgdGhlICBFeHRlbmRlZE1vZGUgaXMgbm90IHVzZWQqLyAgDQotDQotICBGU01DX05PUlNSQU1UaW1pbmdJbml0VHlwZURlZiogRlNNQ19Xcml0ZVRpbWluZ1N0cnVjdDsgICAgIC8qITwgVGltaW5nIFBhcmFtZXRlcnMgZm9yIHdyaXRlIGFjY2VzcyBpZiB0aGUgIEV4dGVuZGVkTW9kZSBpcyB1c2VkKi8gICAgICANCi19RlNNQ19OT1JTUkFNSW5pdFR5cGVEZWY7DQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIFRpbWluZyBwYXJhbWV0ZXJzIEZvciBGU01DIE5BTkQgYW5kIFBDQ0FSRCBCYW5rcw0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQzMl90IEZTTUNfU2V0dXBUaW1lOyAgICAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIHNldHVwIGFkZHJlc3MgYmVmb3JlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kIGFzc2VydGlvbiBmb3IgTkFORC1GbGFzaCByZWFkIG9yIHdyaXRlIGFjY2Vzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb21tb24vQXR0cmlidXRlIG9yIEkvTyBtZW1vcnkgc3BhY2UgKGRlcGVuZGluZyBvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVtb3J5IHNwYWNlIHRpbWluZyB0byBiZSBjb25maWd1cmVkKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGLiovDQotDQotICB1aW50MzJfdCBGU01DX1dhaXRTZXR1cFRpbWU7ICAvKiE8IERlZmluZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGFzc2VydCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmb3IgTkFORC1GbGFzaCByZWFkIG9yIHdyaXRlIGFjY2VzcyB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24vQXR0cmlidXRlIG9yIEkvTyBtZW1vcnkgc3BhY2UgKGRlcGVuZGluZyBvbiB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHNwYWNlIHRpbWluZyB0byBiZSBjb25maWd1cmVkKS4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAgYW5kIDB4RkYgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfSG9sZFNldHVwVGltZTsgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY2xvY2sgY3ljbGVzIHRvIGhvbGQgYWRkcmVzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGRhdGEgZm9yIHdyaXRlIGFjY2VzcykgYWZ0ZXIgdGhlIGNvbW1hbmQgZGVhc3NlcnRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIE5BTkQtRmxhc2ggcmVhZCBvciB3cml0ZSBhY2Nlc3MgdG8gY29tbW9uL0F0dHJpYnV0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBJL08gbWVtb3J5IHNwYWNlIChkZXBlbmRpbmcgb24gdGhlIG1lbW9yeSBzcGFjZSB0aW1pbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29uZmlndXJlZCkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAgYW5kIDB4RkYgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfSGlaU2V0dXBUaW1lOyAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY2xvY2sgY3ljbGVzIGR1cmluZyB3aGljaCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJ1cyBpcyBrZXB0IGluIEhpWiBhZnRlciB0aGUgc3RhcnQgb2YgYSBOQU5ELUZsYXNoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIGFjY2VzcyB0byBjb21tb24vQXR0cmlidXRlIG9yIEkvTyBtZW1vcnkgc3BhY2UgKGRlcGVuZGluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgbWVtb3J5IHNwYWNlIHRpbWluZyB0byBiZSBjb25maWd1cmVkKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMCBhbmQgMHhGRiAqLw0KLX1GU01DX05BTkRfUENDQVJEVGltaW5nSW5pdFR5cGVEZWY7DQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIEZTTUMgTkFORCBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgdWludDMyX3QgRlNNQ19CYW5rOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE5BTkQgbWVtb3J5IGJhbmsgdGhhdCB3aWxsIGJlIHVzZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZTTUNfTkFORF9CYW5rICovDQotDQotICB1aW50MzJfdCBGU01DX1dhaXRmZWF0dXJlOyAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgV2FpdCBmZWF0dXJlIGZvciB0aGUgTkFORCBNZW1vcnkgQmFuay4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgRlNNQ19XYWl0X2ZlYXR1cmUgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfTWVtb3J5RGF0YVdpZHRoOyAgLyohPCBTcGVjaWZpZXMgdGhlIGV4dGVybmFsIG1lbW9yeSBkZXZpY2Ugd2lkdGguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEZTTUNfRGF0YV9XaWR0aCAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19FQ0M7ICAgICAgICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEVDQyBjb21wdXRhdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgRlNNQ19FQ0MgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfRUNDUGFnZVNpemU7ICAgICAgLyohPCBEZWZpbmVzIHRoZSBwYWdlIHNpemUgZm9yIHRoZSBleHRlbmRlZCBFQ0MuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEZTTUNfRUNDX1BhZ2VfU2l6ZSAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19UQ0xSU2V0dXBUaW1lOyAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiBDTEUgbG93IGFuZCBSRSBsb3cuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGLiAqLw0KLQ0KLSAgdWludDMyX3QgRlNNQ19UQVJTZXR1cFRpbWU7ICAgICAvKiE8IERlZmluZXMgdGhlIG51bWJlciBvZiBIQ0xLIGN5Y2xlcyB0byBjb25maWd1cmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiBBTEUgbG93IGFuZCBSRSBsb3cuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwIGFuZCAweEZGICovIA0KLQ0KLSAgRlNNQ19OQU5EX1BDQ0FSRFRpbWluZ0luaXRUeXBlRGVmKiAgRlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdDsgICAvKiE8IEZTTUMgQ29tbW9uIFNwYWNlIFRpbWluZyAqLyANCi0NCi0gIEZTTUNfTkFORF9QQ0NBUkRUaW1pbmdJbml0VHlwZURlZiogIEZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3Q7IC8qITwgRlNNQyBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nICovDQotfUZTTUNfTkFOREluaXRUeXBlRGVmOw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBGU01DIFBDQ0FSRCBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uDQotICAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgdWludDMyX3QgRlNNQ19XYWl0ZmVhdHVyZTsgICAgLyohPCBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBXYWl0IGZlYXR1cmUgZm9yIHRoZSBNZW1vcnkgQmFuay4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgRlNNQ19XYWl0X2ZlYXR1cmUgKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfVENMUlNldHVwVGltZTsgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGNvbmZpZ3VyZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiBDTEUgbG93IGFuZCBSRSBsb3cuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRi4gKi8NCi0NCi0gIHVpbnQzMl90IEZTTUNfVEFSU2V0dXBUaW1lOyAgIC8qITwgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIEhDTEsgY3ljbGVzIHRvIGNvbmZpZ3VyZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgYmV0d2VlbiBBTEUgbG93IGFuZCBSRSBsb3cuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MCBhbmQgMHhGRiAqLyANCi0NCi0gIA0KLSAgRlNNQ19OQU5EX1BDQ0FSRFRpbWluZ0luaXRUeXBlRGVmKiAgRlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdDsgLyohPCBGU01DIENvbW1vbiBTcGFjZSBUaW1pbmcgKi8NCi0NCi0gIEZTTUNfTkFORF9QQ0NBUkRUaW1pbmdJbml0VHlwZURlZiogIEZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3Q7ICAvKiE8IEZTTUMgQXR0cmlidXRlIFNwYWNlIFRpbWluZyAqLyANCi0gIA0KLSAgRlNNQ19OQU5EX1BDQ0FSRFRpbWluZ0luaXRUeXBlRGVmKiAgRlNNQ19JT1NwYWNlVGltaW5nU3RydWN0OyAvKiE8IEZTTUMgSU8gU3BhY2UgVGltaW5nICovICANCi19RlNNQ19QQ0NBUkRJbml0VHlwZURlZjsNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0V4cG9ydGVkX0NvbnN0YW50cw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfTk9SU1JBTV9CYW5rIA0KLSAgKiBAew0KLSAgKi8NCi0jZGVmaW5lIEZTTUNfQmFuazFfTk9SU1JBTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfQmFuazFfTk9SU1JBTTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikNCi0jZGVmaW5lIEZTTUNfQmFuazFfTk9SU1JBTTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCi0jZGVmaW5lIEZTTUNfQmFuazFfTk9SU1JBTTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNikNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX05BTkRfQmFuayANCi0gICogQHsNCi0gICovICANCi0jZGVmaW5lIEZTTUNfQmFuazJfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkNCi0jZGVmaW5lIEZTTUNfQmFuazNfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX1BDQ0FSRF9CYW5rIA0KLSAgKiBAew0KLSAgKi8gICAgDQotI2RlZmluZSBGU01DX0Jhbms0X1BDQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDApDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19OT1JTUkFNX0JBTksoQkFOSykgKCgoQkFOSykgPT0gRlNNQ19CYW5rMV9OT1JTUkFNMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFOSykgPT0gRlNNQ19CYW5rMV9OT1JTUkFNMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFOSykgPT0gRlNNQ19CYW5rMV9OT1JTUkFNMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFOSykgPT0gRlNNQ19CYW5rMV9OT1JTUkFNNCkpDQotDQotI2RlZmluZSBJU19GU01DX05BTkRfQkFOSyhCQU5LKSAoKChCQU5LKSA9PSBGU01DX0JhbmsyX05BTkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBTkspID09IEZTTUNfQmFuazNfTkFORCkpDQotDQotI2RlZmluZSBJU19GU01DX0dFVEZMQUdfQkFOSyhCQU5LKSAoKChCQU5LKSA9PSBGU01DX0JhbmsyX05BTkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBTkspID09IEZTTUNfQmFuazNfTkFORCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFOSykgPT0gRlNNQ19CYW5rNF9QQ0NBUkQpKQ0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19JVF9CQU5LKEJBTkspICgoKEJBTkspID09IEZTTUNfQmFuazJfTkFORCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBTkspID09IEZTTUNfQmFuazNfTkFORCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBTkspID09IEZTTUNfQmFuazRfUENDQVJEKSkNCi0NCi0vKiogQGRlZmdyb3VwIE5PUl9TUkFNX0NvbnRyb2xsZXIgDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19EYXRhX0FkZHJlc3NfQnVzX011bHRpcGxleGluZyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBGU01DX0RhdGFBZGRyZXNzTXV4X0Rpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfRGF0YUFkZHJlc3NNdXhfRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KLSNkZWZpbmUgSVNfRlNNQ19NVVgoTVVYKSAoKChNVVgpID09IEZTTUNfRGF0YUFkZHJlc3NNdXhfRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChNVVgpID09IEZTTUNfRGF0YUFkZHJlc3NNdXhfRW5hYmxlKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX01lbW9yeV9UeXBlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfTWVtb3J5VHlwZV9TUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfTWVtb3J5VHlwZV9QU1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCi0jZGVmaW5lIEZTTUNfTWVtb3J5VHlwZV9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi0jZGVmaW5lIElTX0ZTTUNfTUVNT1JZKE1FTU9SWSkgKCgoTUVNT1JZKSA9PSBGU01DX01lbW9yeVR5cGVfU1JBTSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNRU1PUlkpID09IEZTTUNfTWVtb3J5VHlwZV9QU1JBTSl8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1FTU9SWSkgPT0gRlNNQ19NZW1vcnlUeXBlX05PUikpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19EYXRhX1dpZHRoIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfTWVtb3J5RGF0YVdpZHRoXzhiICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfTWVtb3J5RGF0YVdpZHRoXzE2YiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkNCi0jZGVmaW5lIElTX0ZTTUNfTUVNT1JZX1dJRFRIKFdJRFRIKSAoKChXSURUSCkgPT0gRlNNQ19NZW1vcnlEYXRhV2lkdGhfOGIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXSURUSCkgPT0gRlNNQ19NZW1vcnlEYXRhV2lkdGhfMTZiKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0J1cnN0X0FjY2Vzc19Nb2RlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfQnVyc3RBY2Nlc3NNb2RlX0Rpc2FibGUgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkgDQotI2RlZmluZSBGU01DX0J1cnN0QWNjZXNzTW9kZV9FbmFibGUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApDQotI2RlZmluZSBJU19GU01DX0JVUlNUTU9ERShTVEFURSkgKCgoU1RBVEUpID09IEZTTUNfQnVyc3RBY2Nlc3NNb2RlX0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gRlNNQ19CdXJzdEFjY2Vzc01vZGVfRW5hYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotICANCi0vKiogQGRlZmdyb3VwIEZTTUNfQXN5bmNocm9ub3VzV2FpdCANCi0gICogQHsNCi0gICovDQotI2RlZmluZSBGU01DX0FzeW5jaHJvbm91c1dhaXRfRGlzYWJsZSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBGU01DX0FzeW5jaHJvbm91c1dhaXRfRW5hYmxlICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDApDQotI2RlZmluZSBJU19GU01DX0FTWU5XQUlUKFNUQVRFKSAoKChTVEFURSkgPT0gRlNNQ19Bc3luY2hyb25vdXNXYWl0X0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBGU01DX0FzeW5jaHJvbm91c1dhaXRfRW5hYmxlKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotICANCi0vKiogQGRlZmdyb3VwIEZTTUNfV2FpdF9TaWduYWxfUG9sYXJpdHkgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRlNNQ19XYWl0U2lnbmFsUG9sYXJpdHlfTG93ICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRlNNQ19XYWl0U2lnbmFsUG9sYXJpdHlfSGlnaCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwKQ0KLSNkZWZpbmUgSVNfRlNNQ19XQUlUX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gRlNNQ19XYWl0U2lnbmFsUG9sYXJpdHlfTG93KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBGU01DX1dhaXRTaWduYWxQb2xhcml0eV9IaWdoKSkgDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19XcmFwX01vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRlNNQ19XcmFwTW9kZV9EaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRlNNQ19XcmFwTW9kZV9FbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKSANCi0jZGVmaW5lIElTX0ZTTUNfV1JBUF9NT0RFKE1PREUpICgoKE1PREUpID09IEZTTUNfV3JhcE1vZGVfRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRlNNQ19XcmFwTW9kZV9FbmFibGUpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfV2FpdF9UaW1pbmcgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRlNNQ19XYWl0U2lnbmFsQWN0aXZlX0JlZm9yZVdhaXRTdGF0ZSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRlNNQ19XYWl0U2lnbmFsQWN0aXZlX0R1cmluZ1dhaXRTdGF0ZSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwODAwKSANCi0jZGVmaW5lIElTX0ZTTUNfV0FJVF9TSUdOQUxfQUNUSVZFKEFDVElWRSkgKCgoQUNUSVZFKSA9PSBGU01DX1dhaXRTaWduYWxBY3RpdmVfQmVmb3JlV2FpdFN0YXRlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFDVElWRSkgPT0gRlNNQ19XYWl0U2lnbmFsQWN0aXZlX0R1cmluZ1dhaXRTdGF0ZSkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19Xcml0ZV9PcGVyYXRpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRlNNQ19Xcml0ZU9wZXJhdGlvbl9EaXNhYmxlICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRlNNQ19Xcml0ZU9wZXJhdGlvbl9FbmFibGUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxMDAwKQ0KLSNkZWZpbmUgSVNfRlNNQ19XUklURV9PUEVSQVRJT04oT1BFUkFUSU9OKSAoKChPUEVSQVRJT04pID09IEZTTUNfV3JpdGVPcGVyYXRpb25fRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPUEVSQVRJT04pID09IEZTTUNfV3JpdGVPcGVyYXRpb25fRW5hYmxlKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX1dhaXRfU2lnbmFsIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfV2FpdFNpZ25hbF9EaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfV2FpdFNpZ25hbF9FbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMjAwMCkgDQotI2RlZmluZSBJU19GU01DX1dBSVRFX1NJR05BTChTSUdOQUwpICgoKFNJR05BTCkgPT0gRlNNQ19XYWl0U2lnbmFsX0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0lHTkFMKSA9PSBGU01DX1dhaXRTaWduYWxfRW5hYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0V4dGVuZGVkX01vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRlNNQ19FeHRlbmRlZE1vZGVfRGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRlNNQ19FeHRlbmRlZE1vZGVfRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwKQ0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19FWFRFTkRFRF9NT0RFKE1PREUpICgoKE1PREUpID09IEZTTUNfRXh0ZW5kZWRNb2RlX0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBGU01DX0V4dGVuZGVkTW9kZV9FbmFibGUpKSANCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX1dyaXRlX0J1cnN0IA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfV3JpdGVCdXJzdF9EaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfV3JpdGVCdXJzdF9FbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA4MDAwMCkgDQotI2RlZmluZSBJU19GU01DX1dSSVRFX0JVUlNUKEJVUlNUKSAoKChCVVJTVCkgPT0gRlNNQ19Xcml0ZUJ1cnN0X0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJVUlNUKSA9PSBGU01DX1dyaXRlQnVyc3RfRW5hYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0FkZHJlc3NfU2V0dXBfVGltZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19GU01DX0FERFJFU1NfU0VUVVBfVElNRShUSU1FKSAoKFRJTUUpIDw9IDB4RikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0FkZHJlc3NfSG9sZF9UaW1lIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0ZTTUNfQUREUkVTU19IT0xEX1RJTUUoVElNRSkgKChUSU1FKSA8PSAweEYpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19EYXRhX1NldHVwX1RpbWUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19EQVRBU0VUVVBfVElNRShUSU1FKSAoKChUSU1FKSA+IDApICYmICgoVElNRSkgPD0gMHhGRikpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19CdXNfVHVybl9hcm91bmRfRHVyYXRpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19UVVJOQVJPVU5EX1RJTUUoVElNRSkgKChUSU1FKSA8PSAweEYpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19DTEtfRGl2aXNpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19DTEtfRElWKERJVikgKChESVYpIDw9IDB4RikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0RhdGFfTGF0ZW5jeSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19GU01DX0RBVEFfTEFURU5DWShMQVRFTkNZKSAoKExBVEVOQ1kpIDw9IDB4RikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0FjY2Vzc19Nb2RlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfQWNjZXNzTW9kZV9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIEZTTUNfQWNjZXNzTW9kZV9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAwMCkgDQotI2RlZmluZSBGU01DX0FjY2Vzc01vZGVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MjAwMDAwMDApDQotI2RlZmluZSBGU01DX0FjY2Vzc01vZGVfRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MzAwMDAwMDApDQotI2RlZmluZSBJU19GU01DX0FDQ0VTU19NT0RFKE1PREUpICgoKE1PREUpID09IEZTTUNfQWNjZXNzTW9kZV9BKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEZTTUNfQWNjZXNzTW9kZV9CKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEZTTUNfQWNjZXNzTW9kZV9DKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEZTTUNfQWNjZXNzTW9kZV9EKSkgDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0gIA0KLS8qKiBAZGVmZ3JvdXAgTkFORF9QQ0NBUkRfQ29udHJvbGxlciANCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX1dhaXRfZmVhdHVyZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBGU01DX1dhaXRmZWF0dXJlX0Rpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBGU01DX1dhaXRmZWF0dXJlX0VuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpDQotI2RlZmluZSBJU19GU01DX1dBSVRfRkVBVFVSRShGRUFUVVJFKSAoKChGRUFUVVJFKSA9PSBGU01DX1dhaXRmZWF0dXJlX0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZFQVRVUkUpID09IEZTTUNfV2FpdGZlYXR1cmVfRW5hYmxlKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotDQotLyoqIEBkZWZncm91cCBGU01DX0VDQyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBGU01DX0VDQ19EaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBGU01DX0VDQ19FbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBJU19GU01DX0VDQ19TVEFURShTVEFURSkgKCgoU1RBVEUpID09IEZTTUNfRUNDX0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gRlNNQ19FQ0NfRW5hYmxlKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0VDQ19QYWdlX1NpemUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgRlNNQ19FQ0NQYWdlU2l6ZV8yNTZCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgRlNNQ19FQ0NQYWdlU2l6ZV81MTJCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwKQ0KLSNkZWZpbmUgRlNNQ19FQ0NQYWdlU2l6ZV8xMDI0Qnl0ZXMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDQwMDAwKQ0KLSNkZWZpbmUgRlNNQ19FQ0NQYWdlU2l6ZV8yMDQ4Qnl0ZXMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDYwMDAwKQ0KLSNkZWZpbmUgRlNNQ19FQ0NQYWdlU2l6ZV80MDk2Qnl0ZXMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwKQ0KLSNkZWZpbmUgRlNNQ19FQ0NQYWdlU2l6ZV84MTkyQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEEwMDAwKQ0KLSNkZWZpbmUgSVNfRlNNQ19FQ0NQQUdFX1NJWkUoU0laRSkgKCgoU0laRSkgPT0gRlNNQ19FQ0NQYWdlU2l6ZV8yNTZCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRlNNQ19FQ0NQYWdlU2l6ZV81MTJCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRlNNQ19FQ0NQYWdlU2l6ZV8xMDI0Qnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IEZTTUNfRUNDUGFnZVNpemVfMjA0OEJ5dGVzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBGU01DX0VDQ1BhZ2VTaXplXzQwOTZCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRlNNQ19FQ0NQYWdlU2l6ZV84MTkyQnl0ZXMpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfVENMUl9TZXR1cF9UaW1lIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0ZTTUNfVENMUl9USU1FKFRJTUUpICgoVElNRSkgPD0gMHhGRikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX1RBUl9TZXR1cF9UaW1lIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0ZTTUNfVEFSX1RJTUUoVElNRSkgKChUSU1FKSA8PSAweEZGKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfU2V0dXBfVGltZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19GU01DX1NFVFVQX1RJTUUoVElNRSkgKChUSU1FKSA8PSAweEZGKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfV2FpdF9TZXR1cF9UaW1lIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX0ZTTUNfV0FJVF9USU1FKFRJTUUpICgoVElNRSkgPD0gMHhGRikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0hvbGRfU2V0dXBfVGltZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19GU01DX0hPTERfVElNRShUSU1FKSAoKFRJTUUpIDw9IDB4RkYpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19IaVpfU2V0dXBfVGltZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19GU01DX0hJWl9USU1FKFRJTUUpICgoVElNRSkgPD0gMHhGRikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0ludGVycnVwdF9zb3VyY2VzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfSVRfUmlzaW5nRWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi0jZGVmaW5lIEZTTUNfSVRfTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkNCi0jZGVmaW5lIEZTTUNfSVRfRmFsbGluZ0VkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkNCi0jZGVmaW5lIElTX0ZTTUNfSVQoSVQpICgoKChJVCkgJiAodWludDMyX3QpMHhGRkZGRkZDNykgPT0gMHgwMDAwMDAwMCkgJiYgKChJVCkgIT0gMHgwMDAwMDAwMCkpDQotI2RlZmluZSBJU19GU01DX0dFVF9JVChJVCkgKCgoSVQpID09IEZTTUNfSVRfUmlzaW5nRWRnZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBGU01DX0lUX0xldmVsKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IEZTTUNfSVRfRmFsbGluZ0VkZ2UpKSANCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX0ZsYWdzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEZTTUNfRkxBR19SaXNpbmdFZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkNCi0jZGVmaW5lIEZTTUNfRkxBR19MZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikNCi0jZGVmaW5lIEZTTUNfRkxBR19GYWxsaW5nRWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCi0jZGVmaW5lIEZTTUNfRkxBR19GRU1QVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkNCi0jZGVmaW5lIElTX0ZTTUNfR0VUX0ZMQUcoRkxBRykgKCgoRkxBRykgPT0gRlNNQ19GTEFHX1Jpc2luZ0VkZ2UpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gRlNNQ19GTEFHX0xldmVsKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IEZTTUNfRkxBR19GYWxsaW5nRWRnZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBGU01DX0ZMQUdfRkVNUFQpKQ0KLQ0KLSNkZWZpbmUgSVNfRlNNQ19DTEVBUl9GTEFHKEZMQUcpICgoKChGTEFHKSAmICh1aW50MzJfdCkweEZGRkZGRkY4KSA9PSAweDAwMDAwMDAwKSAmJiAoKEZMQUcpICE9IDB4MDAwMDAwMDApKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19FeHBvcnRlZF9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotdm9pZCBGU01DX05PUlNSQU1EZUluaXQodWludDMyX3QgRlNNQ19CYW5rKTsNCi12b2lkIEZTTUNfTkFORERlSW5pdCh1aW50MzJfdCBGU01DX0JhbmspOw0KLXZvaWQgRlNNQ19QQ0NBUkREZUluaXQodm9pZCk7DQotdm9pZCBGU01DX05PUlNSQU1Jbml0KEZTTUNfTk9SU1JBTUluaXRUeXBlRGVmKiBGU01DX05PUlNSQU1Jbml0U3RydWN0KTsNCi12b2lkIEZTTUNfTkFOREluaXQoRlNNQ19OQU5ESW5pdFR5cGVEZWYqIEZTTUNfTkFOREluaXRTdHJ1Y3QpOw0KLXZvaWQgRlNNQ19QQ0NBUkRJbml0KEZTTUNfUENDQVJESW5pdFR5cGVEZWYqIEZTTUNfUENDQVJESW5pdFN0cnVjdCk7DQotdm9pZCBGU01DX05PUlNSQU1TdHJ1Y3RJbml0KEZTTUNfTk9SU1JBTUluaXRUeXBlRGVmKiBGU01DX05PUlNSQU1Jbml0U3RydWN0KTsNCi12b2lkIEZTTUNfTkFORFN0cnVjdEluaXQoRlNNQ19OQU5ESW5pdFR5cGVEZWYqIEZTTUNfTkFOREluaXRTdHJ1Y3QpOw0KLXZvaWQgRlNNQ19QQ0NBUkRTdHJ1Y3RJbml0KEZTTUNfUENDQVJESW5pdFR5cGVEZWYqIEZTTUNfUENDQVJESW5pdFN0cnVjdCk7DQotdm9pZCBGU01DX05PUlNSQU1DbWQodWludDMyX3QgRlNNQ19CYW5rLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgRlNNQ19OQU5EQ21kKHVpbnQzMl90IEZTTUNfQmFuaywgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEZTTUNfUENDQVJEQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBGU01DX05BTkRFQ0NDbWQodWludDMyX3QgRlNNQ19CYW5rLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXVpbnQzMl90IEZTTUNfR2V0RUNDKHVpbnQzMl90IEZTTUNfQmFuayk7DQotdm9pZCBGU01DX0lUQ29uZmlnKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi1GbGFnU3RhdHVzIEZTTUNfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfRkxBRyk7DQotdm9pZCBGU01DX0NsZWFyRmxhZyh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfRkxBRyk7DQotSVRTdGF0dXMgRlNNQ19HZXRJVFN0YXR1cyh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfSVQpOw0KLXZvaWQgRlNNQ19DbGVhcklUUGVuZGluZ0JpdCh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfSVQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLypfX1NUTTMyRjEweF9GU01DX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9pMmMuaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2kyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI2NTA5Li4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2kyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9pMmMuaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlcyBmb3IgdGhlIEkyQyBmaXJtd2FyZSANCi0gICogICAgICAgICAgbGlicmFyeS4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBfX1NUTTMyRjEweF9JMkNfSA0KLSNkZWZpbmUgX19TVE0zMkYxMHhfSTJDX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBJMkMNCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfVHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIEkyQyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uICANCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MzJfdCBJMkNfQ2xvY2tTcGVlZDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGZyZXF1ZW5jeS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIGEgdmFsdWUgbG93ZXIgdGhhbiA0MDBrSHogKi8NCi0NCi0gIHVpbnQxNl90IEkyQ19Nb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSTJDIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19tb2RlICovDQotDQotICB1aW50MTZfdCBJMkNfRHV0eUN5Y2xlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEkyQyBmYXN0IG1vZGUgZHV0eSBjeWNsZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX2R1dHlfY3ljbGVfaW5fZmFzdF9tb2RlICovDQotDQotICB1aW50MTZfdCBJMkNfT3duQWRkcmVzczE7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpcnN0IGRldmljZSBvd24gYWRkcmVzcy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzLiAqLw0KLQ0KLSAgdWludDE2X3QgSTJDX0FjazsgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWNrbm93bGVkZ2VtZW50Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfYWNrbm93bGVkZ2VtZW50ICovDQotDQotICB1aW50MTZfdCBJMkNfQWNrbm93bGVkZ2VkQWRkcmVzczsgLyohPCBTcGVjaWZpZXMgaWYgNy1iaXQgb3IgMTAtYml0IGFkZHJlc3MgaXMgYWNrbm93bGVkZ2VkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfYWNrbm93bGVkZ2VkX2FkZHJlc3MgKi8NCi19STJDX0luaXRUeXBlRGVmOw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotDQotLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfSTJDX0FMTF9QRVJJUEgoUEVSSVBIKSAoKChQRVJJUEgpID09IEkyQzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBJMkMyKSkNCi0vKiogQGRlZmdyb3VwIEkyQ19tb2RlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyQ19Nb2RlX0kyQyAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJMkNfTW9kZV9TTUJ1c0RldmljZSAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKSAgDQotI2RlZmluZSBJMkNfTW9kZV9TTUJ1c0hvc3QgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDBBKQ0KLSNkZWZpbmUgSVNfSTJDX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gSTJDX01vZGVfSTJDKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMkNfTW9kZV9TTUJ1c0RldmljZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX01vZGVfU01CdXNIb3N0KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfZHV0eV9jeWNsZV9pbl9mYXN0X21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSTJDX0R1dHlDeWNsZV8xNl85ICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4NDAwMCkgLyohPCBJMkMgZmFzdCBtb2RlIFRsb3cvVGhpZ2ggPSAxNi85ICovDQotI2RlZmluZSBJMkNfRHV0eUN5Y2xlXzIgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHhCRkZGKSAvKiE8IEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaCA9IDIgKi8NCi0jZGVmaW5lIElTX0kyQ19EVVRZX0NZQ0xFKENZQ0xFKSAoKChDWUNMRSkgPT0gSTJDX0R1dHlDeWNsZV8xNl85KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1lDTEUpID09IEkyQ19EdXR5Q3ljbGVfMikpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIEkyQ19hY2tub3dsZWRnZW1lbnQNCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJMkNfQWNrX0VuYWJsZSAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDAwKQ0KLSNkZWZpbmUgSTJDX0Fja19EaXNhYmxlICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX0kyQ19BQ0tfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBJMkNfQWNrX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IEkyQ19BY2tfRGlzYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX3RyYW5zZmVyX2RpcmVjdGlvbiANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSAgSTJDX0RpcmVjdGlvbl9UcmFuc21pdHRlciAgICAgICgodWludDhfdCkweDAwKQ0KLSNkZWZpbmUgIEkyQ19EaXJlY3Rpb25fUmVjZWl2ZXIgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkNCi0jZGVmaW5lIElTX0kyQ19ESVJFQ1RJT04oRElSRUNUSU9OKSAoKChESVJFQ1RJT04pID09IEkyQ19EaXJlY3Rpb25fVHJhbnNtaXR0ZXIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVJFQ1RJT04pID09IEkyQ19EaXJlY3Rpb25fUmVjZWl2ZXIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyQ19hY2tub3dsZWRnZWRfYWRkcmVzcyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJMkNfQWNrbm93bGVkZ2VkQWRkcmVzc183Yml0ICAgICgodWludDE2X3QpMHg0MDAwKQ0KLSNkZWZpbmUgSTJDX0Fja25vd2xlZGdlZEFkZHJlc3NfMTBiaXQgICAoKHVpbnQxNl90KTB4QzAwMCkNCi0jZGVmaW5lIElTX0kyQ19BQ0tOT1dMRURHRV9BRERSRVNTKEFERFJFU1MpICgoKEFERFJFU1MpID09IEkyQ19BY2tub3dsZWRnZWRBZGRyZXNzXzdiaXQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpID09IEkyQ19BY2tub3dsZWRnZWRBZGRyZXNzXzEwYml0KSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX3JlZ2lzdGVycyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJMkNfUmVnaXN0ZXJfQ1IxICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwKQ0KLSNkZWZpbmUgSTJDX1JlZ2lzdGVyX0NSMiAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkNCi0jZGVmaW5lIEkyQ19SZWdpc3Rlcl9PQVIxICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDgpDQotI2RlZmluZSBJMkNfUmVnaXN0ZXJfT0FSMiAgICAgICAgICAgICAgICgodWludDhfdCkweDBDKQ0KLSNkZWZpbmUgSTJDX1JlZ2lzdGVyX0RSICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMCkNCi0jZGVmaW5lIEkyQ19SZWdpc3Rlcl9TUjEgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTQpDQotI2RlZmluZSBJMkNfUmVnaXN0ZXJfU1IyICAgICAgICAgICAgICAgICgodWludDhfdCkweDE4KQ0KLSNkZWZpbmUgSTJDX1JlZ2lzdGVyX0NDUiAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxQykNCi0jZGVmaW5lIEkyQ19SZWdpc3Rlcl9UUklTRSAgICAgICAgICAgICAgKCh1aW50OF90KTB4MjApDQotI2RlZmluZSBJU19JMkNfUkVHSVNURVIoUkVHSVNURVIpICgoKFJFR0lTVEVSKSA9PSBJMkNfUmVnaXN0ZXJfQ1IxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR0lTVEVSKSA9PSBJMkNfUmVnaXN0ZXJfQ1IyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR0lTVEVSKSA9PSBJMkNfUmVnaXN0ZXJfT0FSMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdJU1RFUikgPT0gSTJDX1JlZ2lzdGVyX09BUjIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHSVNURVIpID09IEkyQ19SZWdpc3Rlcl9EUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdJU1RFUikgPT0gSTJDX1JlZ2lzdGVyX1NSMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdJU1RFUikgPT0gSTJDX1JlZ2lzdGVyX1NSMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdJU1RFUikgPT0gSTJDX1JlZ2lzdGVyX0NDUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdJU1RFUikgPT0gSTJDX1JlZ2lzdGVyX1RSSVNFKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfU01CdXNfYWxlcnRfcGluX2xldmVsIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyQ19TTUJ1c0FsZXJ0X0xvdyAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDIwMDApDQotI2RlZmluZSBJMkNfU01CdXNBbGVydF9IaWdoICAgICAgICAgICAgICgodWludDE2X3QpMHhERkZGKQ0KLSNkZWZpbmUgSVNfSTJDX1NNQlVTX0FMRVJUKEFMRVJUKSAoKChBTEVSVCkgPT0gSTJDX1NNQnVzQWxlcnRfTG93KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMRVJUKSA9PSBJMkNfU01CdXNBbGVydF9IaWdoKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfUEVDX3Bvc2l0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyQ19QRUNQb3NpdGlvbl9OZXh0ICAgICAgICAgICAgKCh1aW50MTZfdCkweDA4MDApDQotI2RlZmluZSBJMkNfUEVDUG9zaXRpb25fQ3VycmVudCAgICAgICAgICgodWludDE2X3QpMHhGN0ZGKQ0KLSNkZWZpbmUgSVNfSTJDX1BFQ19QT1NJVElPTihQT1NJVElPTikgKCgoUE9TSVRJT04pID09IEkyQ19QRUNQb3NpdGlvbl9OZXh0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT1NJVElPTikgPT0gSTJDX1BFQ1Bvc2l0aW9uX0N1cnJlbnQpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBJMkNfaW50ZXJydXB0c19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyQ19JVF9CVUYgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA0MDApDQotI2RlZmluZSBJMkNfSVRfRVZUICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMjAwKQ0KLSNkZWZpbmUgSTJDX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkNCi0jZGVmaW5lIElTX0kyQ19DT05GSUdfSVQoSVQpICgoKChJVCkgJiAodWludDE2X3QpMHhGOEZGKSA9PSAweDAwKSAmJiAoKElUKSAhPSAweDAwKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX2ludGVycnVwdHNfZGVmaW5pdGlvbiANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJMkNfSVRfU01CQUxFUlQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMTAwODAwMCkNCi0jZGVmaW5lIEkyQ19JVF9USU1FT1VUICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAxMDA0MDAwKQ0KLSNkZWZpbmUgSTJDX0lUX1BFQ0VSUiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDEwMDEwMDApDQotI2RlZmluZSBJMkNfSVRfT1ZSICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMTAwMDgwMCkNCi0jZGVmaW5lIEkyQ19JVF9BRiAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAxMDAwNDAwKQ0KLSNkZWZpbmUgSTJDX0lUX0FSTE8gICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDEwMDAyMDApDQotI2RlZmluZSBJMkNfSVRfQkVSUiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMTAwMDEwMCkNCi0jZGVmaW5lIEkyQ19JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA2MDAwMDgwKQ0KLSNkZWZpbmUgSTJDX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDYwMDAwNDApDQotI2RlZmluZSBJMkNfSVRfU1RPUEYgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMjAwMDAxMCkNCi0jZGVmaW5lIEkyQ19JVF9BREQxMCAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDA4KQ0KLSNkZWZpbmUgSTJDX0lUX0JURiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDQpDQotI2RlZmluZSBJMkNfSVRfQUREUiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMjAwMDAwMikNCi0jZGVmaW5lIEkyQ19JVF9TQiAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAxKQ0KLQ0KLSNkZWZpbmUgSVNfSTJDX0NMRUFSX0lUKElUKSAoKCgoSVQpICYgKHVpbnQxNl90KTB4MjBGRikgPT0gMHgwMCkgJiYgKChJVCkgIT0gKHVpbnQxNl90KTB4MDApKQ0KLQ0KLSNkZWZpbmUgSVNfSTJDX0dFVF9JVChJVCkgKCgoSVQpID09IEkyQ19JVF9TTUJBTEVSVCkgfHwgKChJVCkgPT0gSTJDX0lUX1RJTUVPVVQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBJMkNfSVRfUEVDRVJSKSB8fCAoKElUKSA9PSBJMkNfSVRfT1ZSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gSTJDX0lUX0FGKSB8fCAoKElUKSA9PSBJMkNfSVRfQVJMTykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IEkyQ19JVF9CRVJSKSB8fCAoKElUKSA9PSBJMkNfSVRfVFhFKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gSTJDX0lUX1JYTkUpIHx8ICgoSVQpID09IEkyQ19JVF9TVE9QRikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IEkyQ19JVF9BREQxMCkgfHwgKChJVCkgPT0gSTJDX0lUX0JURikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IEkyQ19JVF9BRERSKSB8fCAoKElUKSA9PSBJMkNfSVRfU0IpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyQ19mbGFnc19kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogDQotICAqIEBicmllZiAgU1IyIHJlZ2lzdGVyIGZsYWdzICANCi0gICovDQotDQotI2RlZmluZSBJMkNfRkxBR19EVUFMRiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDgwMDAwMCkNCi0jZGVmaW5lIEkyQ19GTEFHX1NNQkhPU1QgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwKQ0KLSNkZWZpbmUgSTJDX0ZMQUdfU01CREVGQVVMVCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAyMDAwMDApDQotI2RlZmluZSBJMkNfRkxBR19HRU5DQUxMICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDEwMDAwMCkNCi0jZGVmaW5lIEkyQ19GTEFHX1RSQSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDQwMDAwKQ0KLSNkZWZpbmUgSTJDX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDApDQotI2RlZmluZSBJMkNfRkxBR19NU0wgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAxMDAwMCkNCi0NCi0vKiogDQotICAqIEBicmllZiAgU1IxIHJlZ2lzdGVyIGZsYWdzICANCi0gICovDQotDQotI2RlZmluZSBJMkNfRkxBR19TTUJBTEVSVCAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwODAwMCkNCi0jZGVmaW5lIEkyQ19GTEFHX1RJTUVPVVQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDA0MDAwKQ0KLSNkZWZpbmUgSTJDX0ZMQUdfUEVDRVJSICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDEwMDApDQotI2RlZmluZSBJMkNfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDgwMCkNCi0jZGVmaW5lIEkyQ19GTEFHX0FGICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwNDAwKQ0KLSNkZWZpbmUgSTJDX0ZMQUdfQVJMTyAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAyMDApDQotI2RlZmluZSBJMkNfRkxBR19CRVJSICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDEwMCkNCi0jZGVmaW5lIEkyQ19GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDgwKQ0KLSNkZWZpbmUgSTJDX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwNDApDQotI2RlZmluZSBJMkNfRkxBR19TVE9QRiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAxMCkNCi0jZGVmaW5lIEkyQ19GTEFHX0FERDEwICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDA4KQ0KLSNkZWZpbmUgSTJDX0ZMQUdfQlRGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDQpDQotI2RlZmluZSBJMkNfRkxBR19BRERSICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgxMDAwMDAwMikNCi0jZGVmaW5lIEkyQ19GTEFHX1NCICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDAxKQ0KLQ0KLSNkZWZpbmUgSVNfSTJDX0NMRUFSX0ZMQUcoRkxBRykgKCgoKEZMQUcpICYgKHVpbnQxNl90KTB4MjBGRikgPT0gMHgwMCkgJiYgKChGTEFHKSAhPSAodWludDE2X3QpMHgwMCkpDQotDQotI2RlZmluZSBJU19JMkNfR0VUX0ZMQUcoRkxBRykgKCgoRkxBRykgPT0gSTJDX0ZMQUdfRFVBTEYpIHx8ICgoRkxBRykgPT0gSTJDX0ZMQUdfU01CSE9TVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IEkyQ19GTEFHX1NNQkRFRkFVTFQpIHx8ICgoRkxBRykgPT0gSTJDX0ZMQUdfR0VOQ0FMTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IEkyQ19GTEFHX1RSQSkgfHwgKChGTEFHKSA9PSBJMkNfRkxBR19CVVNZKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gSTJDX0ZMQUdfTVNMKSB8fCAoKEZMQUcpID09IEkyQ19GTEFHX1NNQkFMRVJUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gSTJDX0ZMQUdfVElNRU9VVCkgfHwgKChGTEFHKSA9PSBJMkNfRkxBR19QRUNFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBJMkNfRkxBR19PVlIpIHx8ICgoRkxBRykgPT0gSTJDX0ZMQUdfQUYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBJMkNfRkxBR19BUkxPKSB8fCAoKEZMQUcpID09IEkyQ19GTEFHX0JFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBJMkNfRkxBR19UWEUpIHx8ICgoRkxBRykgPT0gSTJDX0ZMQUdfUlhORSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IEkyQ19GTEFHX1NUT1BGKSB8fCAoKEZMQUcpID09IEkyQ19GTEFHX0FERDEwKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gSTJDX0ZMQUdfQlRGKSB8fCAoKEZMQUcpID09IEkyQ19GTEFHX0FERFIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBJMkNfRkxBR19TQikpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX0V2ZW50cyANCi0gICogQHsNCi0gICovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgICANCi0gICAgICAgICAgICAgICAgICAgICBJMkMgTWFzdGVyIEV2ZW50cyAoRXZlbnRzIGdyb3VwZWQgaW4gb3JkZXIgb2YgY29tbXVuaWNhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyoqIA0KLSAgKiBAYnJpZWYgIENvbW11bmljYXRpb24gc3RhcnQNCi0gICogDQotICAqIEFmdGVyIHNlbmRpbmcgdGhlIFNUQVJUIGNvbmRpdGlvbiAoSTJDX0dlbmVyYXRlU1RBUlQoKSBmdW5jdGlvbikgdGhlIG1hc3RlciANCi0gICogaGFzIHRvIHdhaXQgZm9yIHRoaXMgZXZlbnQuIEl0IG1lYW5zIHRoYXQgdGhlIFN0YXJ0IGNvbmRpdGlvbiBoYXMgYmVlbiBjb3JyZWN0bHkgDQotICAqIHJlbGVhc2VkIG9uIHRoZSBJMkMgYnVzICh0aGUgYnVzIGlzIGZyZWUsIG5vIG90aGVyIGRldmljZXMgaXMgY29tbXVuaWNhdGluZykuDQotICAqIA0KLSAgKi8NCi0vKiAtLUVWNSAqLw0KLSNkZWZpbmUgIEkyQ19FVkVOVF9NQVNURVJfTU9ERV9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDMwMDAxKSAgLyogQlVTWSwgTVNMIGFuZCBTQiBmbGFnICovDQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIEFkZHJlc3MgQWNrbm93bGVkZ2UNCi0gICogDQotICAqIEFmdGVyIGNoZWNraW5nIG9uIEVWNSAoc3RhcnQgY29uZGl0aW9uIGNvcnJlY3RseSByZWxlYXNlZCBvbiB0aGUgYnVzKSwgdGhlIA0KLSAgKiBtYXN0ZXIgc2VuZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNsYXZlKHMpIHdpdGggd2hpY2ggaXQgd2lsbCBjb21tdW5pY2F0ZSANCi0gICogKEkyQ19TZW5kN2JpdEFkZHJlc3MoKSBmdW5jdGlvbiwgaXQgYWxzbyBkZXRlcm1pbmVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGNvbW11bmljYXRpb246IA0KLSAgKiBNYXN0ZXIgdHJhbnNtaXR0ZXIgb3IgUmVjZWl2ZXIpLiBUaGVuIHRoZSBtYXN0ZXIgaGFzIHRvIHdhaXQgdGhhdCBhIHNsYXZlIGFja25vd2xlZGdlcyANCi0gICogaGlzIGFkZHJlc3MuIElmIGFuIGFja25vd2xlZGdlIGlzIHNlbnQgb24gdGhlIGJ1cywgb25lIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIHdpbGwgDQotICAqIGJlIHNldDoNCi0gICogDQotICAqICAxKSBJbiBjYXNlIG9mIE1hc3RlciBSZWNlaXZlciAoNy1iaXQgYWRkcmVzc2luZyk6IHRoZSBJMkNfRVZFTlRfTUFTVEVSX1JFQ0VJVkVSX01PREVfU0VMRUNURUQgDQotICAqICAgICBldmVudCBpcyBzZXQuDQotICAqICANCi0gICogIDIpIEluIGNhc2Ugb2YgTWFzdGVyIFRyYW5zbWl0dGVyICg3LWJpdCBhZGRyZXNzaW5nKTogdGhlIEkyQ19FVkVOVF9NQVNURVJfVFJBTlNNSVRURVJfTU9ERV9TRUxFQ1RFRCANCi0gICogICAgIGlzIHNldA0KLSAgKiAgDQotICAqICAzKSBJbiBjYXNlIG9mIDEwLUJpdCBhZGRyZXNzaW5nIG1vZGUsIHRoZSBtYXN0ZXIgKGp1c3QgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgU1RBUlQgDQotICAqICBhbmQgY2hlY2tpbmcgb24gRVY1KSBoYXMgdG8gc2VuZCB0aGUgaGVhZGVyIG9mIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUgKEkyQ19TZW5kRGF0YSgpIA0KLSAgKiAgZnVuY3Rpb24pLiBUaGVuIG1hc3RlciBzaG91bGQgd2FpdCBvbiBFVjkuIEl0IG1lYW5zIHRoYXQgdGhlIDEwLWJpdCBhZGRyZXNzaW5nIA0KLSAgKiAgaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBzZW50IG9uIHRoZSBidXMuIFRoZW4gbWFzdGVyIHNob3VsZCBzZW5kIHRoZSBzZWNvbmQgcGFydCBvZiANCi0gICogIHRoZSAxMC1iaXQgYWRkcmVzcyAoTFNCKSB1c2luZyB0aGUgZnVuY3Rpb24gSTJDX1NlbmQ3Yml0QWRkcmVzcygpLiBUaGVuIG1hc3RlciANCi0gICogIHNob3VsZCB3YWl0IGZvciBldmVudCBFVjYuIA0KLSAgKiAgICAgDQotICAqLw0KLQ0KLS8qIC0tRVY2ICovDQotI2RlZmluZSAgSTJDX0VWRU5UX01BU1RFUl9UUkFOU01JVFRFUl9NT0RFX1NFTEVDVEVEICAgICAgICAoKHVpbnQzMl90KTB4MDAwNzAwODIpICAvKiBCVVNZLCBNU0wsIEFERFIsIFRYRSBhbmQgVFJBIGZsYWdzICovDQotI2RlZmluZSAgSTJDX0VWRU5UX01BU1RFUl9SRUNFSVZFUl9NT0RFX1NFTEVDVEVEICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMzAwMDIpICAvKiBCVVNZLCBNU0wgYW5kIEFERFIgZmxhZ3MgKi8NCi0vKiAtLUVWOSAqLw0KLSNkZWZpbmUgIEkyQ19FVkVOVF9NQVNURVJfTU9ERV9BRERSRVNTMTAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDMwMDA4KSAgLyogQlVTWSwgTVNMIGFuZCBBREQxMCBmbGFncyAqLw0KLQ0KLS8qKiANCi0gICogQGJyaWVmIENvbW11bmljYXRpb24gZXZlbnRzDQotICAqIA0KLSAgKiBJZiBhIGNvbW11bmljYXRpb24gaXMgZXN0YWJsaXNoZWQgKFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0ZWQgYW5kIHNsYXZlIGFkZHJlc3MgDQotICAqIGFja25vd2xlZGdlZCkgdGhlbiB0aGUgbWFzdGVyIGhhcyB0byBjaGVjayBvbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgZm9yIA0KLSAgKiBjb21tdW5pY2F0aW9uIHByb2NlZHVyZXM6DQotICAqICANCi0gICogMSkgTWFzdGVyIFJlY2VpdmVyIG1vZGU6IFRoZSBtYXN0ZXIgaGFzIHRvIHdhaXQgb24gdGhlIGV2ZW50IEVWNyB0aGVuIHRvIHJlYWQgDQotICAqICAgIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNsYXZlIChJMkNfUmVjZWl2ZURhdGEoKSBmdW5jdGlvbikuDQotICAqIA0KLSAgKiAyKSBNYXN0ZXIgVHJhbnNtaXR0ZXIgbW9kZTogVGhlIG1hc3RlciBoYXMgdG8gc2VuZCBkYXRhIChJMkNfU2VuZERhdGEoKSANCi0gICogICAgZnVuY3Rpb24pIHRoZW4gdG8gd2FpdCBvbiBldmVudCBFVjggb3IgRVY4XzIuDQotICAqICAgIFRoZXNlIHR3byBldmVudHMgYXJlIHNpbWlsYXI6IA0KLSAgKiAgICAgLSBFVjggbWVhbnMgdGhhdCB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGFuZCBpcyANCi0gICogICAgICAgYmVpbmcgc2hpZnRlZCBvdXQuDQotICAqICAgICAtIEVWOF8yIG1lYW5zIHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gcGh5c2ljYWxseSBzaGlmdGVkIG91dCBhbmQgb3V0cHV0IA0KLSAgKiAgICAgICBvbiB0aGUgYnVzLg0KLSAgKiAgICAgSW4gbW9zdCBjYXNlcywgdXNpbmcgRVY4IGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBhcHBsaWNhdGlvbi4NCi0gICogICAgIFVzaW5nIEVWOF8yIGxlYWRzIHRvIGEgc2xvd2VyIGNvbW11bmljYXRpb24gYnV0IGVuc3VyZSBtb3JlIHJlbGlhYmxlIHRlc3QuDQotICAqICAgICBFVjhfMiBpcyBhbHNvIG1vcmUgc3VpdGFibGUgdGhhbiBFVjggZm9yIHRlc3Rpbmcgb24gdGhlIGxhc3QgZGF0YSB0cmFuc21pc3Npb24gDQotICAqICAgICAoYmVmb3JlIFN0b3AgY29uZGl0aW9uIGdlbmVyYXRpb24pLg0KLSAgKiAgICAgDQotICAqICBAbm90ZSBJbiBjYXNlIHRoZSAgdXNlciBzb2Z0d2FyZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGlzIGV2ZW50IEVWNyBpcyANCi0gICogIG1hbmFnZWQgYmVmb3JlIHRoZSBjdXJyZW50IGJ5dGUgZW5kIG9mIHRyYW5zZmVyLCB0aGVuIHVzZXIgbWF5IGNoZWNrIG9uIEVWNyANCi0gICogIGFuZCBCVEYgZmxhZyBhdCB0aGUgc2FtZSB0aW1lIChpZS4gKEkyQ19FVkVOVF9NQVNURVJfQllURV9SRUNFSVZFRCB8IEkyQ19GTEFHX0JURikpLg0KLSAgKiAgSW4gdGhpcyBjYXNlIHRoZSBjb21tdW5pY2F0aW9uIG1heSBiZSBzbG93ZXIuDQotICAqIA0KLSAgKi8NCi0NCi0vKiBNYXN0ZXIgUkVDRUlWRVIgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIA0KLS8qIC0tRVY3ICovDQotI2RlZmluZSAgSTJDX0VWRU5UX01BU1RFUl9CWVRFX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMzAwNDApICAvKiBCVVNZLCBNU0wgYW5kIFJYTkUgZmxhZ3MgKi8NCi0NCi0vKiBNYXN0ZXIgVFJBTlNNSVRURVIgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogLS1FVjggKi8NCi0jZGVmaW5lIEkyQ19FVkVOVF9NQVNURVJfQllURV9UUkFOU01JVFRJTkcgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA3MDA4MCkgLyogVFJBLCBCVVNZLCBNU0wsIFRYRSBmbGFncyAqLw0KLS8qIC0tRVY4XzIgKi8NCi0jZGVmaW5lICBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfVFJBTlNNSVRURUQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDA3MDA4NCkgIC8qIFRSQSwgQlVTWSwgTVNMLCBUWEUgYW5kIEJURiBmbGFncyAqLw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAgDQotICAgICAgICAgICAgICAgICAgICAgSTJDIFNsYXZlIEV2ZW50cyAoRXZlbnRzIGdyb3VwZWQgaW4gb3JkZXIgb2YgY29tbXVuaWNhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIENvbW11bmljYXRpb24gc3RhcnQgZXZlbnRzDQotICAqIA0KLSAgKiBXYWl0IG9uIG9uZSBvZiB0aGVzZSBldmVudHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb21tdW5pY2F0aW9uLiBJdCBtZWFucyB0aGF0IA0KLSAgKiB0aGUgSTJDIHBlcmlwaGVyYWwgZGV0ZWN0ZWQgYSBTdGFydCBjb25kaXRpb24gb24gdGhlIGJ1cyAoZ2VuZXJhdGVkIGJ5IG1hc3RlciANCi0gICogZGV2aWNlKSBmb2xsb3dlZCBieSB0aGUgcGVyaXBoZXJhbCBhZGRyZXNzLiBUaGUgcGVyaXBoZXJhbCBnZW5lcmF0ZXMgYW4gQUNLIA0KLSAgKiBjb25kaXRpb24gb24gdGhlIGJ1cyAoaWYgdGhlIGFja25vd2xlZGdlIGZlYXR1cmUgaXMgZW5hYmxlZCB0aHJvdWdoIGZ1bmN0aW9uIA0KLSAgKiBJMkNfQWNrbm93bGVkZ2VDb25maWcoKSkgYW5kIHRoZSBldmVudHMgbGlzdGVkIGFib3ZlIGFyZSBzZXQgOg0KLSAgKiAgDQotICAqIDEpIEluIG5vcm1hbCBjYXNlIChvbmx5IG9uZSBhZGRyZXNzIG1hbmFnZWQgYnkgdGhlIHNsYXZlKSwgd2hlbiB0aGUgYWRkcmVzcyANCi0gICogICBzZW50IGJ5IHRoZSBtYXN0ZXIgbWF0Y2hlcyB0aGUgb3duIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwgKGNvbmZpZ3VyZWQgYnkgDQotICAqICAgSTJDX093bkFkZHJlc3MxIGZpZWxkKSB0aGUgSTJDX0VWRU5UX1NMQVZFX1hYWF9BRERSRVNTX01BVENIRUQgZXZlbnQgaXMgc2V0IA0KLSAgKiAgICh3aGVyZSBYWFggY291bGQgYmUgVFJBTlNNSVRURVIgb3IgUkVDRUlWRVIpLg0KLSAgKiAgICANCi0gICogMikgSW4gY2FzZSB0aGUgYWRkcmVzcyBzZW50IGJ5IHRoZSBtYXN0ZXIgbWF0Y2hlcyB0aGUgc2Vjb25kIGFkZHJlc3Mgb2YgdGhlIA0KLSAgKiAgIHBlcmlwaGVyYWwgKGNvbmZpZ3VyZWQgYnkgdGhlIGZ1bmN0aW9uIEkyQ19Pd25BZGRyZXNzMkNvbmZpZygpIGFuZCBlbmFibGVkIA0KLSAgKiAgIGJ5IHRoZSBmdW5jdGlvbiBJMkNfRHVhbEFkZHJlc3NDbWQoKSkgdGhlIGV2ZW50cyBJMkNfRVZFTlRfU0xBVkVfWFhYX1NFQ09OREFERFJFU1NfTUFUQ0hFRCANCi0gICogICAod2hlcmUgWFhYIGNvdWxkIGJlIFRSQU5TTUlUVEVSIG9yIFJFQ0VJVkVSKSBhcmUgc2V0Lg0KLSAgKiAgIA0KLSAgKiAzKSBJbiBjYXNlIHRoZSBhZGRyZXNzIHNlbnQgYnkgdGhlIG1hc3RlciBpcyBHZW5lcmFsIENhbGwgKGFkZHJlc3MgMHgwMCkgYW5kIA0KLSAgKiAgIGlmIHRoZSBHZW5lcmFsIENhbGwgaXMgZW5hYmxlZCBmb3IgdGhlIHBlcmlwaGVyYWwgKHVzaW5nIGZ1bmN0aW9uIEkyQ19HZW5lcmFsQ2FsbENtZCgpKSANCi0gICogICB0aGUgZm9sbG93aW5nIGV2ZW50IGlzIHNldCBJMkNfRVZFTlRfU0xBVkVfR0VORVJBTENBTExBRERSRVNTX01BVENIRUQuICAgDQotICAqIA0KLSAgKi8NCi0NCi0vKiAtLUVWMSAgKGFsbCB0aGUgZXZlbnRzIGJlbG93IGFyZSB2YXJpYW50cyBvZiBFVjEpICovICAgDQotLyogMSkgQ2FzZSBvZiBPbmUgU2luZ2xlIEFkZHJlc3MgbWFuYWdlZCBieSB0aGUgc2xhdmUgKi8NCi0jZGVmaW5lICBJMkNfRVZFTlRfU0xBVkVfUkVDRUlWRVJfQUREUkVTU19NQVRDSEVEICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMikgLyogQlVTWSBhbmQgQUREUiBmbGFncyAqLw0KLSNkZWZpbmUgIEkyQ19FVkVOVF9TTEFWRV9UUkFOU01JVFRFUl9BRERSRVNTX01BVENIRUQgICAgICAgKCh1aW50MzJfdCkweDAwMDYwMDgyKSAvKiBUUkEsIEJVU1ksIFRYRSBhbmQgQUREUiBmbGFncyAqLw0KLQ0KLS8qIDIpIENhc2Ugb2YgRHVhbCBhZGRyZXNzIG1hbmFnZWQgYnkgdGhlIHNsYXZlICovDQotI2RlZmluZSAgSTJDX0VWRU5UX1NMQVZFX1JFQ0VJVkVSX1NFQ09OREFERFJFU1NfTUFUQ0hFRCAgICAoKHVpbnQzMl90KTB4MDA4MjAwMDApICAvKiBEVUFMRiBhbmQgQlVTWSBmbGFncyAqLw0KLSNkZWZpbmUgIEkyQ19FVkVOVF9TTEFWRV9UUkFOU01JVFRFUl9TRUNPTkRBRERSRVNTX01BVENIRUQgKCh1aW50MzJfdCkweDAwODYwMDgwKSAgLyogRFVBTEYsIFRSQSwgQlVTWSBhbmQgVFhFIGZsYWdzICovDQotDQotLyogMykgQ2FzZSBvZiBHZW5lcmFsIENhbGwgZW5hYmxlZCBmb3IgdGhlIHNsYXZlICovDQotI2RlZmluZSAgSTJDX0VWRU5UX1NMQVZFX0dFTkVSQUxDQUxMQUREUkVTU19NQVRDSEVEICAgICAgICAoKHVpbnQzMl90KTB4MDAxMjAwMDApICAvKiBHRU5DQUxMIGFuZCBCVVNZIGZsYWdzICovDQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIENvbW11bmljYXRpb24gZXZlbnRzDQotICAqIA0KLSAgKiBXYWl0IG9uIG9uZSBvZiB0aGVzZSBldmVudHMgd2hlbiBFVjEgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGFuZDogDQotICAqIA0KLSAgKiAtIFNsYXZlIFJFQ0VJVkVSIG1vZGU6DQotICAqICAgICAtIEVWMjogV2hlbiB0aGUgYXBwbGljYXRpb24gaXMgZXhwZWN0aW5nIGEgZGF0YSBieXRlIHRvIGJlIHJlY2VpdmVkLiANCi0gICogICAgIC0gRVY0OiBXaGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBleHBlY3RpbmcgdGhlIGVuZCBvZiB0aGUgY29tbXVuaWNhdGlvbjogbWFzdGVyIA0KLSAgKiAgICAgICBzZW5kcyBhIHN0b3AgY29uZGl0aW9uIGFuZCBkYXRhIHRyYW5zbWlzc2lvbiBpcyBzdG9wcGVkLg0KLSAgKiAgICANCi0gICogLSBTbGF2ZSBUcmFuc21pdHRlciBtb2RlOg0KLSAgKiAgICAtIEVWMzogV2hlbiBhIGJ5dGUgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgYnkgdGhlIHNsYXZlIGFuZCB0aGUgYXBwbGljYXRpb24gaXMgZXhwZWN0aW5nIA0KLSAgKiAgICAgIHRoZSBlbmQgb2YgdGhlIGJ5dGUgdHJhbnNtaXNzaW9uLiBUaGUgdHdvIGV2ZW50cyBJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRCBhbmQNCi0gICogICAgICBJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRJTkcgYXJlIHNpbWlsYXIuIFRoZSBzZWNvbmQgb25lIGNhbiBvcHRpb25hbGx5IGJlIA0KLSAgKiAgICAgIHVzZWQgd2hlbiB0aGUgdXNlciBzb2Z0d2FyZSBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgRVYzIGlzIG1hbmFnZWQgYmVmb3JlIHRoZQ0KLSAgKiAgICAgIGN1cnJlbnQgYnl0ZSBlbmQgb2YgdHJhbmZlci4NCi0gICogICAgLSBFVjNfMjogV2hlbiB0aGUgbWFzdGVyIHNlbmRzIGEgTkFDSyBpbiBvcmRlciB0byB0ZWxsIHNsYXZlIHRoYXQgZGF0YSB0cmFuc21pc3Npb24gDQotICAqICAgICAgc2hhbGwgZW5kIChiZWZvcmUgc2VuZGluZyB0aGUgU1RPUCBjb25kaXRpb24pLiBJbiB0aGlzIGNhc2Ugc2xhdmUgaGFzIHRvIHN0b3Agc2VuZGluZyANCi0gICogICAgICBkYXRhIGJ5dGVzIGFuZCBleHBlY3QgYSBTdG9wIGNvbmRpdGlvbiBvbiB0aGUgYnVzLg0KLSAgKiAgICAgIA0KLSAgKiAgQG5vdGUgSW4gY2FzZSB0aGUgIHVzZXIgc29mdHdhcmUgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGV2ZW50IEVWMiBpcyANCi0gICogIG1hbmFnZWQgYmVmb3JlIHRoZSBjdXJyZW50IGJ5dGUgZW5kIG9mIHRyYW5zZmVyLCB0aGVuIHVzZXIgbWF5IGNoZWNrIG9uIEVWMiANCi0gICogIGFuZCBCVEYgZmxhZyBhdCB0aGUgc2FtZSB0aW1lIChpZS4gKEkyQ19FVkVOVF9TTEFWRV9CWVRFX1JFQ0VJVkVEIHwgSTJDX0ZMQUdfQlRGKSkuDQotICAqIEluIHRoaXMgY2FzZSB0aGUgY29tbXVuaWNhdGlvbiBtYXkgYmUgc2xvd2VyLg0KLSAgKg0KLSAgKi8NCi0NCi0vKiBTbGF2ZSBSRUNFSVZFUiBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gDQotLyogLS1FVjIgKi8NCi0jZGVmaW5lICBJMkNfRVZFTlRfU0xBVkVfQllURV9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAyMDA0MCkgIC8qIEJVU1kgYW5kIFJYTkUgZmxhZ3MgKi8NCi0vKiAtLUVWNCAgKi8NCi0jZGVmaW5lICBJMkNfRVZFTlRfU0xBVkVfU1RPUF9ERVRFQ1RFRCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkgIC8qIFNUT1BGIGZsYWcgKi8NCi0NCi0vKiBTbGF2ZSBUUkFOU01JVFRFUiBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiAtLUVWMyAqLw0KLSNkZWZpbmUgIEkyQ19FVkVOVF9TTEFWRV9CWVRFX1RSQU5TTUlUVEVEICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDYwMDg0KSAgLyogVFJBLCBCVVNZLCBUWEUgYW5kIEJURiBmbGFncyAqLw0KLSNkZWZpbmUgIEkyQ19FVkVOVF9TTEFWRV9CWVRFX1RSQU5TTUlUVElORyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDYwMDgwKSAgLyogVFJBLCBCVVNZIGFuZCBUWEUgZmxhZ3MgKi8NCi0vKiAtLUVWM18yICovDQotI2RlZmluZSAgSTJDX0VWRU5UX1NMQVZFX0FDS19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApICAvKiBBRiBmbGFnICovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICBFbmQgb2YgRXZlbnRzIERlc2NyaXB0aW9uICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLQ0KLSNkZWZpbmUgSVNfSTJDX0VWRU5UKEVWRU5UKSAoKChFVkVOVCkgPT0gSTJDX0VWRU5UX1NMQVZFX1RSQU5TTUlUVEVSX0FERFJFU1NfTUFUQ0hFRCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gSTJDX0VWRU5UX1NMQVZFX1JFQ0VJVkVSX0FERFJFU1NfTUFUQ0hFRCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gSTJDX0VWRU5UX1NMQVZFX1RSQU5TTUlUVEVSX1NFQ09OREFERFJFU1NfTUFUQ0hFRCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gSTJDX0VWRU5UX1NMQVZFX1JFQ0VJVkVSX1NFQ09OREFERFJFU1NfTUFUQ0hFRCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gSTJDX0VWRU5UX1NMQVZFX0dFTkVSQUxDQUxMQUREUkVTU19NQVRDSEVEKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSBJMkNfRVZFTlRfU0xBVkVfQllURV9SRUNFSVZFRCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gKEkyQ19FVkVOVF9TTEFWRV9CWVRFX1JFQ0VJVkVEIHwgSTJDX0ZMQUdfRFVBTEYpKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSAoSTJDX0VWRU5UX1NMQVZFX0JZVEVfUkVDRUlWRUQgfCBJMkNfRkxBR19HRU5DQUxMKSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gSTJDX0VWRU5UX1NMQVZFX0JZVEVfVFJBTlNNSVRURUQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IChJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRCB8IEkyQ19GTEFHX0RVQUxGKSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gKEkyQ19FVkVOVF9TTEFWRV9CWVRFX1RSQU5TTUlUVEVEIHwgSTJDX0ZMQUdfR0VOQ0FMTCkpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEkyQ19FVkVOVF9TTEFWRV9TVE9QX0RFVEVDVEVEKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSBJMkNfRVZFTlRfTUFTVEVSX01PREVfU0VMRUNUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSBJMkNfRVZFTlRfTUFTVEVSX1RSQU5TTUlUVEVSX01PREVfU0VMRUNURUQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEkyQ19FVkVOVF9NQVNURVJfUkVDRUlWRVJfTU9ERV9TRUxFQ1RFRCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gSTJDX0VWRU5UX01BU1RFUl9CWVRFX1JFQ0VJVkVEKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVWRU5UKSA9PSBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfVFJBTlNNSVRURUQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEkyQ19FVkVOVF9NQVNURVJfQllURV9UUkFOU01JVFRJTkcpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEkyQ19FVkVOVF9NQVNURVJfTU9ERV9BRERSRVNTMTApIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEkyQ19FVkVOVF9TTEFWRV9BQ0tfRkFJTFVSRSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX293bl9hZGRyZXNzMSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19JMkNfT1dOX0FERFJFU1MxKEFERFJFU1MxKSAoKEFERFJFU1MxKSA8PSAweDNGRikNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfY2xvY2tfc3BlZWQgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfSTJDX0NMT0NLX1NQRUVEKFNQRUVEKSAoKChTUEVFRCkgPj0gMHgxKSAmJiAoKFNQRUVEKSA8PSA0MDAwMDApKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotdm9pZCBJMkNfRGVJbml0KEkyQ19UeXBlRGVmKiBJMkN4KTsNCi12b2lkIEkyQ19Jbml0KEkyQ19UeXBlRGVmKiBJMkN4LCBJMkNfSW5pdFR5cGVEZWYqIEkyQ19Jbml0U3RydWN0KTsNCi12b2lkIEkyQ19TdHJ1Y3RJbml0KEkyQ19Jbml0VHlwZURlZiogSTJDX0luaXRTdHJ1Y3QpOw0KLXZvaWQgSTJDX0NtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEkyQ19ETUFDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBJMkNfRE1BTGFzdFRyYW5zZmVyQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX0dlbmVyYXRlU1RBUlQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBJMkNfR2VuZXJhdGVTVE9QKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX0Fja25vd2xlZGdlQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX093bkFkZHJlc3MyQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50OF90IEFkZHJlc3MpOw0KLXZvaWQgSTJDX0R1YWxBZGRyZXNzQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX0dlbmVyYWxDYWxsQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX0lUQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MTZfdCBJMkNfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBJMkNfU2VuZERhdGEoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQ4X3QgRGF0YSk7DQotdWludDhfdCBJMkNfUmVjZWl2ZURhdGEoSTJDX1R5cGVEZWYqIEkyQ3gpOw0KLXZvaWQgSTJDX1NlbmQ3Yml0QWRkcmVzcyhJMkNfVHlwZURlZiogSTJDeCwgdWludDhfdCBBZGRyZXNzLCB1aW50OF90IEkyQ19EaXJlY3Rpb24pOw0KLXVpbnQxNl90IEkyQ19SZWFkUmVnaXN0ZXIoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQ4X3QgSTJDX1JlZ2lzdGVyKTsNCi12b2lkIEkyQ19Tb2Z0d2FyZVJlc2V0Q21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX1NNQnVzQWxlcnRDb25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQxNl90IEkyQ19TTUJ1c0FsZXJ0KTsNCi12b2lkIEkyQ19UcmFuc21pdFBFQyhJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEkyQ19QRUNQb3NpdGlvbkNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdWludDE2X3QgSTJDX1BFQ1Bvc2l0aW9uKTsNCi12b2lkIEkyQ19DYWxjdWxhdGVQRUMoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdWludDhfdCBJMkNfR2V0UEVDKEkyQ19UeXBlRGVmKiBJMkN4KTsNCi12b2lkIEkyQ19BUlBDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBJMkNfU3RyZXRjaENsb2NrQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgSTJDX0Zhc3RNb2RlRHV0eUN5Y2xlQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MTZfdCBJMkNfRHV0eUN5Y2xlKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgSTJDIFN0YXRlIE1vbml0b3JpbmcgRnVuY3Rpb25zDQotICogICAgICAgICAgICAgICAgICAgICAgIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgDQotICogVGhpcyBJMkMgZHJpdmVyIHByb3ZpZGVzIHRocmVlIGRpZmZlcmVudCB3YXlzIGZvciBJMkMgc3RhdGUgbW9uaXRvcmluZw0KLSAqICBkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBhbmQgY29uc3RyYWludHM6DQotICogICAgICAgIA0KLSAqICANCi0gKiAxKSBCYXNpYyBzdGF0ZSBtb25pdG9yaW5nOg0KLSAqICAgIFVzaW5nIEkyQ19DaGVja0V2ZW50KCkgZnVuY3Rpb246DQotICogICAgSXQgY29tcGFyZXMgdGhlIHN0YXR1cyByZWdpc3RlcnMgKFNSMSBhbmQgU1IyKSBjb250ZW50IHRvIGEgZ2l2ZW4gZXZlbnQNCi0gKiAgICAoY2FuIGJlIHRoZSBjb21iaW5hdGlvbiBvZiBvbmUgb3IgbW9yZSBmbGFncykuDQotICogICAgSXQgcmV0dXJucyBTVUNDRVNTIGlmIHRoZSBjdXJyZW50IHN0YXR1cyBpbmNsdWRlcyB0aGUgZ2l2ZW4gZmxhZ3MgDQotICogICAgYW5kIHJldHVybnMgRVJST1IgaWYgb25lIG9yIG1vcmUgZmxhZ3MgYXJlIG1pc3NpbmcgaW4gdGhlIGN1cnJlbnQgc3RhdHVzLg0KLSAqICAgIC0gV2hlbiB0byB1c2U6DQotICogICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIG1vc3QgYXBwbGljYXRpb25zIGFzIHdlbGwgYXMgZm9yIHN0YXJ0dXAgDQotICogICAgICBhY3Rpdml0eSBzaW5jZSB0aGUgZXZlbnRzIGFyZSBmdWxseSBkZXNjcmliZWQgaW4gdGhlIHByb2R1Y3QgcmVmZXJlbmNlIG1hbnVhbCANCi0gKiAgICAgIChSTTAwMDgpLg0KLSAqICAgICAgLSBJdCBpcyBhbHNvIHN1aXRhYmxlIGZvciB1c2VycyB3aG8gbmVlZCB0byBkZWZpbmUgdGhlaXIgb3duIGV2ZW50cy4NCi0gKiAgICAtIExpbWl0YXRpb25zOg0KLSAqICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cnMgKGllLiBlcnJvciBmbGFncyBhcmUgc2V0IGJlc2lkZXMgdG8gdGhlIG1vbml0b3JlZCBmbGFncyksDQotICogICAgICAgIHRoZSBJMkNfQ2hlY2tFdmVudCgpIGZ1bmN0aW9uIG1heSByZXR1cm4gU1VDQ0VTUyBkZXNwaXRlIHRoZSBjb21tdW5pY2F0aW9uDQotICogICAgICAgIGhvbGQgb3IgY29ycnVwdGVkIHJlYWwgc3RhdGUuIA0KLSAqICAgICAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIGFkdmlzZWQgdG8gdXNlIGVycm9yIGludGVycnVwdHMgdG8gbW9uaXRvciB0aGUgZXJyb3INCi0gKiAgICAgICAgZXZlbnRzIGFuZCBoYW5kbGUgdGhlbSBpbiB0aGUgaW50ZXJydXB0IElSUSBoYW5kbGVyLg0KLSAqICAgICAgICANCi0gKiAgICAgICAgQG5vdGUgDQotICogICAgICAgIEZvciBlcnJvciBtYW5hZ2VtZW50LCBpdCBpcyBhZHZpc2VkIHRvIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoNCi0gKiAgICAgICAgICAtIEkyQ19JVENvbmZpZygpIHRvIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIHRoZSBlcnJvciBpbnRlcnJ1cHRzIChJMkNfSVRfRVJSKS4NCi0gKiAgICAgICAgICAtIEkyQ3hfRVJfSVJRSGFuZGxlcigpIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBlcnJvciBpbnRlcnVycHQgb2NjdXJzLg0KLSAqICAgICAgICAgICAgV2hlcmUgeCBpcyB0aGUgcGVyaXBoZXJhbCBpbnN0YW5jZSAoSTJDMSwgSTJDMiAuLi4pDQotICogICAgICAgICAgLSBJMkNfR2V0RmxhZ1N0YXR1cygpIG9yIEkyQ19HZXRJVFN0YXR1cygpIHRvIGJlIGNhbGxlZCBpbnRvIEkyQ3hfRVJfSVJRSGFuZGxlcigpDQotICogICAgICAgICAgICBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggZXJyb3Igb2NjdXJlZC4NCi0gKiAgICAgICAgICAtIEkyQ19DbGVhckZsYWcoKSBvciBJMkNfQ2xlYXJJVFBlbmRpbmdCaXQoKSBhbmQvb3IgSTJDX1NvZnR3YXJlUmVzZXRDbWQoKQ0KLSAqICAgICAgICAgICAgYW5kL29yIEkyQ19HZW5lcmF0ZVN0b3AoKSBpbiBvcmRlciB0byBjbGVhciB0aGUgZXJyb3IgZmxhZyBhbmQgc291cmNlLA0KLSAqICAgICAgICAgICAgYW5kIHJldHVybiB0byBjb3JyZWN0IGNvbW11bmljYXRpb24gc3RhdHVzLg0KLSAqICAgICAgICAgICAgDQotICoNCi0gKiAgMikgQWR2YW5jZWQgc3RhdGUgbW9uaXRvcmluZzoNCi0gKiAgICAgVXNpbmcgdGhlIGZ1bmN0aW9uIEkyQ19HZXRMYXN0RXZlbnQoKSB3aGljaCByZXR1cm5zIHRoZSBpbWFnZSBvZiBib3RoIHN0YXR1cyANCi0gKiAgICAgcmVnaXN0ZXJzIGluIGEgc2luZ2xlIHdvcmQgKHVpbnQzMl90KSAoU3RhdHVzIFJlZ2lzdGVyIDIgdmFsdWUgaXMgc2hpZnRlZCBsZWZ0IA0KLSAqICAgICBieSAxNiBiaXRzIGFuZCBjb25jYXRlbmF0ZWQgdG8gU3RhdHVzIFJlZ2lzdGVyIDEpLg0KLSAqICAgICAtIFdoZW4gdG8gdXNlOg0KLSAqICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdGhlIHNhbWUgYXBwbGljYXRpb25zIGFib3ZlIGJ1dCBpdCBhbGxvd3MgdG8NCi0gKiAgICAgICAgIG92ZXJjb21lIHRoZSBsaW1pdGF0aW9ucyBvZiBJMkNfR2V0RmxhZ1N0YXR1cygpIGZ1bmN0aW9uIChzZWUgYmVsb3cpLg0KLSAqICAgICAgICAgVGhlIHJldHVybmVkIHZhbHVlIGNvdWxkIGJlIGNvbXBhcmVkIHRvIGV2ZW50cyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIA0KLSAqICAgICAgICAgbGlicmFyeSAoc3RtMzJmMTB4X2kyYy5oKSBvciB0byBjdXN0b20gdmFsdWVzIGRlZmluZWQgYnkgdXNlci4NCi0gKiAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgd2hlbiBtdWx0aXBsZSBmbGFncyBhcmUgbW9uaXRvcmVkIGF0IHRoZSBzYW1lIHRpbWUuDQotICogICAgICAgLSBBdCB0aGUgb3Bwb3NpdGUgb2YgSTJDX0NoZWNrRXZlbnQoKSBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiBhbGxvd3MgdXNlciB0bw0KLSAqICAgICAgICAgY2hvb3NlIHdoZW4gYW4gZXZlbnQgaXMgYWNjZXB0ZWQgKHdoZW4gYWxsIGV2ZW50cyBmbGFncyBhcmUgc2V0IGFuZCBubyANCi0gKiAgICAgICAgIG90aGVyIGZsYWdzIGFyZSBzZXQgb3IganVzdCB3aGVuIHRoZSBuZWVkZWQgZmxhZ3MgYXJlIHNldCBsaWtlIA0KLSAqICAgICAgICAgSTJDX0NoZWNrRXZlbnQoKSBmdW5jdGlvbikuDQotICogICAgIC0gTGltaXRhdGlvbnM6DQotICogICAgICAgLSBVc2VyIG1heSBuZWVkIHRvIGRlZmluZSBoaXMgb3duIGV2ZW50cy4NCi0gKiAgICAgICAtIFNhbWUgcmVtYXJrIGNvbmNlcm5pbmcgdGhlIGVycm9yIG1hbmFnZW1lbnQgaXMgYXBwbGljYWJsZSBmb3IgdGhpcyANCi0gKiAgICAgICAgIGZ1bmN0aW9uIGlmIHVzZXIgZGVjaWRlcyB0byBjaGVjayBvbmx5IHJlZ3VsYXIgY29tbXVuaWNhdGlvbiBmbGFncyAoYW5kIA0KLSAqICAgICAgICAgaWdub3JlcyBlcnJvciBmbGFncykuDQotICogICAgIA0KLSAqDQotICogIDMpIEZsYWctYmFzZWQgc3RhdGUgbW9uaXRvcmluZzoNCi0gKiAgICAgVXNpbmcgdGhlIGZ1bmN0aW9uIEkyQ19HZXRGbGFnU3RhdHVzKCkgd2hpY2ggc2ltcGx5IHJldHVybnMgdGhlIHN0YXR1cyBvZiANCi0gKiAgICAgb25lIHNpbmdsZSBmbGFnIChpZS4gSTJDX0ZMQUdfUlhORSAuLi4pLiANCi0gKiAgICAgLSBXaGVuIHRvIHVzZToNCi0gKiAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgZm9yIHNwZWNpZmljIGFwcGxpY2F0aW9ucyBvciBpbiBkZWJ1ZyBwaGFzZS4NCi0gKiAgICAgICAgLSBJdCBpcyBzdWl0YWJsZSB3aGVuIG9ubHkgb25lIGZsYWcgY2hlY2tpbmcgaXMgbmVlZGVkIChtb3N0IEkyQyBldmVudHMgDQotICogICAgICAgICAgYXJlIG1vbml0b3JlZCB0aHJvdWdoIG11bHRpcGxlIGZsYWdzKS4NCi0gKiAgICAgLSBMaW1pdGF0aW9uczogDQotICogICAgICAgIC0gV2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBTdGF0dXMgcmVnaXN0ZXIgaXMgYWNjZXNzZWQuIFNvbWUgZmxhZ3MgYXJlDQotICogICAgICAgICAgY2xlYXJlZCB3aGVuIHRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgYWNjZXNzZWQuIFNvIGNoZWNraW5nIHRoZSBzdGF0dXMNCi0gKiAgICAgICAgICBvZiBvbmUgRmxhZywgbWF5IGNsZWFyIG90aGVyIG9uZXMuDQotICogICAgICAgIC0gRnVuY3Rpb24gbWF5IG5lZWQgdG8gYmUgY2FsbGVkIHR3aWNlIG9yIG1vcmUgaW4gb3JkZXIgdG8gbW9uaXRvciBvbmUgDQotICogICAgICAgICAgc2luZ2xlIGV2ZW50Lg0KLSAqICAgICAgICAgICAgDQotICovDQotDQotLyoqDQotICogDQotICogIDEpIEJhc2ljIHN0YXRlIG1vbml0b3JpbmcNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLUVycm9yU3RhdHVzIEkyQ19DaGVja0V2ZW50KEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfRVZFTlQpOw0KLS8qKg0KLSAqIA0KLSAqICAyKSBBZHZhbmNlZCBzdGF0ZSBtb25pdG9yaW5nDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi11aW50MzJfdCBJMkNfR2V0TGFzdEV2ZW50KEkyQ19UeXBlRGVmKiBJMkN4KTsNCi0vKioNCi0gKiANCi0gKiAgMykgRmxhZy1iYXNlZCBzdGF0ZSBtb25pdG9yaW5nDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi1GbGFnU3RhdHVzIEkyQ19HZXRGbGFnU3RhdHVzKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfRkxBRyk7DQotLyoqDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLXZvaWQgSTJDX0NsZWFyRmxhZyhJMkNfVHlwZURlZiogSTJDeCwgdWludDMyX3QgSTJDX0ZMQUcpOw0KLUlUU3RhdHVzIEkyQ19HZXRJVFN0YXR1cyhJMkNfVHlwZURlZiogSTJDeCwgdWludDMyX3QgSTJDX0lUKTsNCi12b2lkIEkyQ19DbGVhcklUUGVuZGluZ0JpdChJMkNfVHlwZURlZiogSTJDeCwgdWludDMyX3QgSTJDX0lUKTsNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qX19TVE0zMkYxMHhfSTJDX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2l3ZGcuaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X2l3ZGcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyNWFkNC4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9pd2RnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2l3ZGcuaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlcyBmb3IgdGhlIElXREcgDQotICAqICAgICAgICAgIGZpcm13YXJlIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfSVdER19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9JV0RHX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBJV0RHDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX0NvbnN0YW50cw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIElXREdfV3JpdGVBY2Nlc3MNCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJV0RHX1dyaXRlQWNjZXNzX0VuYWJsZSAgICAgKCh1aW50MTZfdCkweDU1NTUpDQotI2RlZmluZSBJV0RHX1dyaXRlQWNjZXNzX0Rpc2FibGUgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJU19JV0RHX1dSSVRFX0FDQ0VTUyhBQ0NFU1MpICgoKEFDQ0VTUykgPT0gSVdER19Xcml0ZUFjY2Vzc19FbmFibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUNDRVNTKSA9PSBJV0RHX1dyaXRlQWNjZXNzX0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIElXREdfcHJlc2NhbGVyIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzQgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkNCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzggICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkNCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzE2ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikNCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzMyICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMykNCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzY0ICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkNCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzEyOCAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkNCi0jZGVmaW5lIElXREdfUHJlc2NhbGVyXzI1NiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikNCi0jZGVmaW5lIElTX0lXREdfUFJFU0NBTEVSKFBSRVNDQUxFUikgKCgoUFJFU0NBTEVSKSA9PSBJV0RHX1ByZXNjYWxlcl80KSAgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IElXREdfUHJlc2NhbGVyXzgpICB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gSVdER19QcmVzY2FsZXJfMTYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBJV0RHX1ByZXNjYWxlcl8zMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IElXREdfUHJlc2NhbGVyXzY0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gSVdER19QcmVzY2FsZXJfMTI4KXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBJV0RHX1ByZXNjYWxlcl8yNTYpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIElXREdfRmxhZyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJV0RHX0ZMQUdfUFZVICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBJV0RHX0ZMQUdfUlZVICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpDQotI2RlZmluZSBJU19JV0RHX0ZMQUcoRkxBRykgKCgoRkxBRykgPT0gSVdER19GTEFHX1BWVSkgfHwgKChGTEFHKSA9PSBJV0RHX0ZMQUdfUlZVKSkNCi0jZGVmaW5lIElTX0lXREdfUkVMT0FEKFJFTE9BRCkgKChSRUxPQUQpIDw9IDB4RkZGKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIElXREdfV3JpdGVBY2Nlc3NDbWQodWludDE2X3QgSVdER19Xcml0ZUFjY2Vzcyk7DQotdm9pZCBJV0RHX1NldFByZXNjYWxlcih1aW50OF90IElXREdfUHJlc2NhbGVyKTsNCi12b2lkIElXREdfU2V0UmVsb2FkKHVpbnQxNl90IFJlbG9hZCk7DQotdm9pZCBJV0RHX1JlbG9hZENvdW50ZXIodm9pZCk7DQotdm9pZCBJV0RHX0VuYWJsZSh2b2lkKTsNCi1GbGFnU3RhdHVzIElXREdfR2V0RmxhZ1N0YXR1cyh1aW50MTZfdCBJV0RHX0ZMQUcpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkYxMHhfSVdER19IICovDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9wd3IuaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X3B3ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkzYWJkLi4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X3B3ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9wd3IuaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlcyBmb3IgdGhlIFBXUiBmaXJtd2FyZSANCi0gICogICAgICAgICAgbGlicmFyeS4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2lmbmRlZiBfX1NUTTMyRjEweF9QV1JfSA0KLSNkZWZpbmUgX19TVE0zMkYxMHhfUFdSX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBQV1INCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0NvbnN0YW50cw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBQVkRfZGV0ZWN0aW9uX2xldmVsIA0KLSAgKiBAew0KLSAgKi8gDQotDQotI2RlZmluZSBQV1JfUFZETGV2ZWxfMlYyICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFBXUl9QVkRMZXZlbF8yVjMgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKQ0KLSNkZWZpbmUgUFdSX1BWRExldmVsXzJWNCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBQV1JfUFZETGV2ZWxfMlY1ICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA2MCkNCi0jZGVmaW5lIFBXUl9QVkRMZXZlbF8yVjYgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KLSNkZWZpbmUgUFdSX1BWRExldmVsXzJWNyAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwQTApDQotI2RlZmluZSBQV1JfUFZETGV2ZWxfMlY4ICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDBDMCkNCi0jZGVmaW5lIFBXUl9QVkRMZXZlbF8yVjkgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMEUwKQ0KLSNkZWZpbmUgSVNfUFdSX1BWRF9MRVZFTChMRVZFTCkgKCgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjIpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjMpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjQpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjUpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjYpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjcpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjgpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMZXZlbF8yVjkpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJlZ3VsYXRvcl9zdGF0ZV9pc19TVE9QX21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgUFdSX1JlZ3VsYXRvcl9PTiAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBQV1JfUmVndWxhdG9yX0xvd1Bvd2VyICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkNCi0jZGVmaW5lIElTX1BXUl9SRUdVTEFUT1IoUkVHVUxBVE9SKSAoKChSRUdVTEFUT1IpID09IFBXUl9SZWd1bGF0b3JfT04pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdVTEFUT1IpID09IFBXUl9SZWd1bGF0b3JfTG93UG93ZXIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNUT1BfbW9kZV9lbnRyeSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBQV1JfU1RPUEVudHJ5X1dGSSAgICAgICAgICgodWludDhfdCkweDAxKQ0KLSNkZWZpbmUgUFdSX1NUT1BFbnRyeV9XRkUgICAgICAgICAoKHVpbnQ4X3QpMHgwMikNCi0jZGVmaW5lIElTX1BXUl9TVE9QX0VOVFJZKEVOVFJZKSAoKChFTlRSWSkgPT0gUFdSX1NUT1BFbnRyeV9XRkkpIHx8ICgoRU5UUlkpID09IFBXUl9TVE9QRW50cnlfV0ZFKSkNCi0gDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0ZsYWcgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgUFdSX0ZMQUdfV1UgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQotI2RlZmluZSBQV1JfRkxBR19TQiAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikNCi0jZGVmaW5lIFBXUl9GTEFHX1BWRE8gICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KLSNkZWZpbmUgSVNfUFdSX0dFVF9GTEFHKEZMQUcpICgoKEZMQUcpID09IFBXUl9GTEFHX1dVKSB8fCAoKEZMQUcpID09IFBXUl9GTEFHX1NCKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gUFdSX0ZMQUdfUFZETykpDQotDQotI2RlZmluZSBJU19QV1JfQ0xFQVJfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBQV1JfRkxBR19XVSkgfHwgKChGTEFHKSA9PSBQV1JfRkxBR19TQikpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIFBXUl9EZUluaXQodm9pZCk7DQotdm9pZCBQV1JfQmFja3VwQWNjZXNzQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBQV1JfUFZEQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBQV1JfUFZETGV2ZWxDb25maWcodWludDMyX3QgUFdSX1BWRExldmVsKTsNCi12b2lkIFBXUl9XYWtlVXBQaW5DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFBXUl9FbnRlclNUT1BNb2RlKHVpbnQzMl90IFBXUl9SZWd1bGF0b3IsIHVpbnQ4X3QgUFdSX1NUT1BFbnRyeSk7DQotdm9pZCBQV1JfRW50ZXJTVEFOREJZTW9kZSh2b2lkKTsNCi1GbGFnU3RhdHVzIFBXUl9HZXRGbGFnU3RhdHVzKHVpbnQzMl90IFBXUl9GTEFHKTsNCi12b2lkIFBXUl9DbGVhckZsYWcodWludDMyX3QgUFdSX0ZMQUcpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkYxMHhfUFdSX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X3J0Yy5oIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfcnRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzRjYTkuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfcnRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X3J0Yy5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgUlRDIGZpcm13YXJlIA0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X1JUQ19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9SVENfSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFJUQw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfVHlwZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX2ludGVycnVwdHNfZGVmaW5lIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFJUQ19JVF9PVyAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KSAgLyohPCBPdmVyZmxvdyBpbnRlcnJ1cHQgKi8NCi0jZGVmaW5lIFJUQ19JVF9BTFIgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKSAgLyohPCBBbGFybSBpbnRlcnJ1cHQgKi8NCi0jZGVmaW5lIFJUQ19JVF9TRUMgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKSAgLyohPCBTZWNvbmQgaW50ZXJydXB0ICovDQotI2RlZmluZSBJU19SVENfSVQoSVQpICgoKChJVCkgJiAodWludDE2X3QpMHhGRkY4KSA9PSAweDAwKSAmJiAoKElUKSAhPSAweDAwKSkNCi0jZGVmaW5lIElTX1JUQ19HRVRfSVQoSVQpICgoKElUKSA9PSBSVENfSVRfT1cpIHx8ICgoSVQpID09IFJUQ19JVF9BTFIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBSVENfSVRfU0VDKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX2ludGVycnVwdHNfZmxhZ3MgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgUlRDX0ZMQUdfUlRPRkYgICAgICAgKCh1aW50MTZfdCkweDAwMjApICAvKiE8IFJUQyBPcGVyYXRpb24gT0ZGIGZsYWcgKi8NCi0jZGVmaW5lIFJUQ19GTEFHX1JTRiAgICAgICAgICgodWludDE2X3QpMHgwMDA4KSAgLyohPCBSZWdpc3RlcnMgU3luY2hyb25pemVkIGZsYWcgKi8NCi0jZGVmaW5lIFJUQ19GTEFHX09XICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KSAgLyohPCBPdmVyZmxvdyBmbGFnICovDQotI2RlZmluZSBSVENfRkxBR19BTFIgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMikgIC8qITwgQWxhcm0gZmxhZyAqLw0KLSNkZWZpbmUgUlRDX0ZMQUdfU0VDICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpICAvKiE8IFNlY29uZCBmbGFnICovDQotI2RlZmluZSBJU19SVENfQ0xFQVJfRkxBRyhGTEFHKSAoKCgoRkxBRykgJiAodWludDE2X3QpMHhGRkYwKSA9PSAweDAwKSAmJiAoKEZMQUcpICE9IDB4MDApKQ0KLSNkZWZpbmUgSVNfUlRDX0dFVF9GTEFHKEZMQUcpICgoKEZMQUcpID09IFJUQ19GTEFHX1JUT0ZGKSB8fCAoKEZMQUcpID09IFJUQ19GTEFHX1JTRikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFJUQ19GTEFHX09XKSB8fCAoKEZMQUcpID09IFJUQ19GTEFHX0FMUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFJUQ19GTEFHX1NFQykpDQotI2RlZmluZSBJU19SVENfUFJFU0NBTEVSKFBSRVNDQUxFUikgKChQUkVTQ0FMRVIpIDw9IDB4RkZGRkYpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIFJUQ19JVENvbmZpZyh1aW50MTZfdCBSVENfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBSVENfRW50ZXJDb25maWdNb2RlKHZvaWQpOw0KLXZvaWQgUlRDX0V4aXRDb25maWdNb2RlKHZvaWQpOw0KLXVpbnQzMl90ICBSVENfR2V0Q291bnRlcih2b2lkKTsNCi12b2lkIFJUQ19TZXRDb3VudGVyKHVpbnQzMl90IENvdW50ZXJWYWx1ZSk7DQotdm9pZCBSVENfU2V0UHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlclZhbHVlKTsNCi12b2lkIFJUQ19TZXRBbGFybSh1aW50MzJfdCBBbGFybVZhbHVlKTsNCi11aW50MzJfdCAgUlRDX0dldERpdmlkZXIodm9pZCk7DQotdm9pZCBSVENfV2FpdEZvckxhc3RUYXNrKHZvaWQpOw0KLXZvaWQgUlRDX1dhaXRGb3JTeW5jaHJvKHZvaWQpOw0KLUZsYWdTdGF0dXMgUlRDX0dldEZsYWdTdGF0dXModWludDE2X3QgUlRDX0ZMQUcpOw0KLXZvaWQgUlRDX0NsZWFyRmxhZyh1aW50MTZfdCBSVENfRkxBRyk7DQotSVRTdGF0dXMgUlRDX0dldElUU3RhdHVzKHVpbnQxNl90IFJUQ19JVCk7DQotdm9pZCBSVENfQ2xlYXJJVFBlbmRpbmdCaXQodWludDE2X3QgUlRDX0lUKTsNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJGMTB4X1JUQ19IICovDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9zZGlvLmggYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9zZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTU1NmMuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfc2Rpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9zZGlvLmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBTRElPIGZpcm13YXJlDQotICAqICAgICAgICAgIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfU0RJT19IDQotI2RlZmluZSBfX1NUTTMyRjEweF9TRElPX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTRElPDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQzMl90IFNESU9fQ2xvY2tFZGdlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNESU9fQ2xvY2tfRWRnZSAqLw0KLQ0KLSAgdWludDMyX3QgU0RJT19DbG9ja0J5cGFzczsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgU0RJTyBDbG9jayBkaXZpZGVyIGJ5cGFzcyBpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNESU9fQ2xvY2tfQnlwYXNzICovDQotDQotICB1aW50MzJfdCBTRElPX0Nsb2NrUG93ZXJTYXZlOyAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIFNESU8gQ2xvY2sgb3V0cHV0IGlzIGVuYWJsZWQgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgd2hlbiB0aGUgYnVzIGlzIGlkbGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RJT19DbG9ja19Qb3dlcl9TYXZlICovDQotDQotICB1aW50MzJfdCBTRElPX0J1c1dpZGU7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU0RJTyBidXMgd2lkdGguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RJT19CdXNfV2lkZSAqLw0KLQ0KLSAgdWludDMyX3QgU0RJT19IYXJkd2FyZUZsb3dDb250cm9sOyAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgU0RJTyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTRElPX0hhcmR3YXJlX0Zsb3dfQ29udHJvbCAqLw0KLQ0KLSAgdWludDhfdCBTRElPX0Nsb2NrRGl2OyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGZyZXF1ZW5jeSBvZiB0aGUgU0RJTyBjb250cm9sbGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4RkYuICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX0gU0RJT19Jbml0VHlwZURlZjsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQzMl90IFNESU9fQXJndW1lbnQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgU0RJTyBjb21tYW5kIGFyZ3VtZW50IHdoaWNoIGlzIHNlbnQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgY2FyZCBhcyBwYXJ0IG9mIGEgY29tbWFuZCBtZXNzYWdlLiBJZiBhIGNvbW1hbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGFuIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGxvYWRlZCBpbnRvIHRoaXMgcmVnaXN0ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB3cml0aW5nIHRoZSBjb21tYW5kIHRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyICovDQotDQotICB1aW50MzJfdCBTRElPX0NtZEluZGV4OyAgLyohPCBTcGVjaWZpZXMgdGhlIFNESU8gY29tbWFuZCBpbmRleC4gSXQgbXVzdCBiZSBsb3dlciB0aGFuIDB4NDAuICovDQotDQotICB1aW50MzJfdCBTRElPX1Jlc3BvbnNlOyAgLyohPCBTcGVjaWZpZXMgdGhlIFNESU8gcmVzcG9uc2UgdHlwZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RJT19SZXNwb25zZV9UeXBlICovDQotDQotICB1aW50MzJfdCBTRElPX1dhaXQ7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBTRElPIHdhaXQtZm9yLWludGVycnVwdCByZXF1ZXN0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNESU9fV2FpdF9JbnRlcnJ1cHRfU3RhdGUgKi8NCi0NCi0gIHVpbnQzMl90IFNESU9fQ1BTTTsgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIFNESU8gQ29tbWFuZCBwYXRoIHN0YXRlIG1hY2hpbmUgKENQU00pDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTRElPX0NQU01fU3RhdGUgKi8NCi19IFNESU9fQ21kSW5pdFR5cGVEZWY7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MzJfdCBTRElPX0RhdGFUaW1lT3V0OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGF0YSB0aW1lb3V0IHBlcmlvZCBpbiBjYXJkIGJ1cyBjbG9jayBwZXJpb2RzLiAqLw0KLQ0KLSAgdWludDMyX3QgU0RJT19EYXRhTGVuZ3RoOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkLiAqLw0KLSANCi0gIHVpbnQzMl90IFNESU9fRGF0YUJsb2NrU2l6ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBkYXRhIGJsb2NrIHNpemUgZm9yIGJsb2NrIHRyYW5zZmVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNESU9fRGF0YV9CbG9ja19TaXplICovDQotIA0KLSAgdWludDMyX3QgU0RJT19UcmFuc2ZlckRpcjsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLCB3aGV0aGVyIHRoZSB0cmFuc2Zlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIHJlYWQgb3Igd3JpdGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RJT19UcmFuc2Zlcl9EaXJlY3Rpb24gKi8NCi0gDQotICB1aW50MzJfdCBTRElPX1RyYW5zZmVyTW9kZTsgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgdHJhbnNmZXIgaXMgaW4gc3RyZWFtIG9yIGJsb2NrIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0RJT19UcmFuc2Zlcl9UeXBlICovDQotIA0KLSAgdWludDMyX3QgU0RJT19EUFNNOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBTRElPIERhdGEgcGF0aCBzdGF0ZSBtYWNoaW5lIChEUFNNKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNESU9fRFBTTV9TdGF0ZSAqLw0KLX0gU0RJT19EYXRhSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19DbG9ja19FZGdlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNESU9fQ2xvY2tFZGdlX1Jpc2luZyAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFNESU9fQ2xvY2tFZGdlX0ZhbGxpbmcgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMjAwMCkNCi0jZGVmaW5lIElTX1NESU9fQ0xPQ0tfRURHRShFREdFKSAoKChFREdFKSA9PSBTRElPX0Nsb2NrRWRnZV9SaXNpbmcpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBTRElPX0Nsb2NrRWRnZV9GYWxsaW5nKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0Nsb2NrX0J5cGFzcyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX0Nsb2NrQnlwYXNzX0Rpc2FibGUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgU0RJT19DbG9ja0J5cGFzc19FbmFibGUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDQwMCkgICAgDQotI2RlZmluZSBJU19TRElPX0NMT0NLX0JZUEFTUyhCWVBBU1MpICgoKEJZUEFTUykgPT0gU0RJT19DbG9ja0J5cGFzc19EaXNhYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQllQQVNTKSA9PSBTRElPX0Nsb2NrQnlwYXNzX0VuYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fQ2xvY2tfUG93ZXJfU2F2ZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX0Nsb2NrUG93ZXJTYXZlX0Rpc2FibGUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBTRElPX0Nsb2NrUG93ZXJTYXZlX0VuYWJsZSAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDApIA0KLSNkZWZpbmUgSVNfU0RJT19DTE9DS19QT1dFUl9TQVZFKFNBVkUpICgoKFNBVkUpID09IFNESU9fQ2xvY2tQb3dlclNhdmVfRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNBVkUpID09IFNESU9fQ2xvY2tQb3dlclNhdmVfRW5hYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0J1c19XaWRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNESU9fQnVzV2lkZV8xYiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFNESU9fQnVzV2lkZV80YiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkNCi0jZGVmaW5lIFNESU9fQnVzV2lkZV84YiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMCkNCi0jZGVmaW5lIElTX1NESU9fQlVTX1dJREUoV0lERSkgKCgoV0lERSkgPT0gU0RJT19CdXNXaWRlXzFiKSB8fCAoKFdJREUpID09IFNESU9fQnVzV2lkZV80YikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXSURFKSA9PSBTRElPX0J1c1dpZGVfOGIpKQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fSGFyZHdhcmVfRmxvd19Db250cm9sIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNESU9fSGFyZHdhcmVGbG93Q29udHJvbF9EaXNhYmxlICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFNESU9fSGFyZHdhcmVGbG93Q29udHJvbF9FbmFibGUgICAgICgodWludDMyX3QpMHgwMDAwNDAwMCkNCi0jZGVmaW5lIElTX1NESU9fSEFSRFdBUkVfRkxPV19DT05UUk9MKENPTlRST0wpICgoKENPTlRST0wpID09IFNESU9fSGFyZHdhcmVGbG93Q29udHJvbF9EaXNhYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05UUk9MKSA9PSBTRElPX0hhcmR3YXJlRmxvd0NvbnRyb2xfRW5hYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX1Bvd2VyX1N0YXRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNESU9fUG93ZXJTdGF0ZV9PRkYgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFNESU9fUG93ZXJTdGF0ZV9PTiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMykNCi0jZGVmaW5lIElTX1NESU9fUE9XRVJfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBTRElPX1Bvd2VyU3RhdGVfT0ZGKSB8fCAoKFNUQVRFKSA9PSBTRElPX1Bvd2VyU3RhdGVfT04pKSANCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19JbnRlcnJ1cHRfc291Y3JlcyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX0lUX0NDUkNGQUlMICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQotI2RlZmluZSBTRElPX0lUX0RDUkNGQUlMICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpDQotI2RlZmluZSBTRElPX0lUX0NUSU1FT1VUICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotI2RlZmluZSBTRElPX0lUX0RUSU1FT1VUICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQotI2RlZmluZSBTRElPX0lUX1RYVU5ERVJSICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApDQotI2RlZmluZSBTRElPX0lUX1JYT1ZFUlIgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApDQotI2RlZmluZSBTRElPX0lUX0NNRFJFTkQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBTRElPX0lUX0NNRFNFTlQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApDQotI2RlZmluZSBTRElPX0lUX0RBVEFFTkQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApDQotI2RlZmluZSBTRElPX0lUX1NUQklURVJSICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDApDQotI2RlZmluZSBTRElPX0lUX0RCQ0tFTkQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApDQotI2RlZmluZSBTRElPX0lUX0NNREFDVCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApDQotI2RlZmluZSBTRElPX0lUX1RYQUNUICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDApDQotI2RlZmluZSBTRElPX0lUX1JYQUNUICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApDQotI2RlZmluZSBTRElPX0lUX1RYRklGT0hFICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApDQotI2RlZmluZSBTRElPX0lUX1JYRklGT0hGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDApDQotI2RlZmluZSBTRElPX0lUX1RYRklGT0YgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApDQotI2RlZmluZSBTRElPX0lUX1JYRklGT0YgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDApDQotI2RlZmluZSBTRElPX0lUX1RYRklGT0UgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDApDQotI2RlZmluZSBTRElPX0lUX1JYRklGT0UgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwODAwMDApDQotI2RlZmluZSBTRElPX0lUX1RYREFWTCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDApDQotI2RlZmluZSBTRElPX0lUX1JYREFWTCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAyMDAwMDApDQotI2RlZmluZSBTRElPX0lUX1NESU9JVCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDApDQotI2RlZmluZSBTRElPX0lUX0NFQVRBRU5EICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQotI2RlZmluZSBJU19TRElPX0lUKElUKSAoKCgoSVQpICYgKHVpbnQzMl90KTB4RkYwMDAwMDApID09IDB4MDApICYmICgoSVQpICE9ICh1aW50MzJfdCkweDAwKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19Db21tYW5kX0luZGV4DQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfU0RJT19DTURfSU5ERVgoSU5ERVgpICAgICAgICAgICAgKChJTkRFWCkgPCAweDQwKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fUmVzcG9uc2VfVHlwZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX1Jlc3BvbnNlX05vICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBTRElPX1Jlc3BvbnNlX1Nob3J0ICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBTRElPX1Jlc3BvbnNlX0xvbmcgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwQzApDQotI2RlZmluZSBJU19TRElPX1JFU1BPTlNFKFJFU1BPTlNFKSAoKChSRVNQT05TRSkgPT0gU0RJT19SZXNwb25zZV9ObykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTUE9OU0UpID09IFNESU9fUmVzcG9uc2VfU2hvcnQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU1BPTlNFKSA9PSBTRElPX1Jlc3BvbnNlX0xvbmcpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fV2FpdF9JbnRlcnJ1cHRfU3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU0RJT19XYWl0X05vICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKSAvKiE8IFNESU8gTm8gV2FpdCwgVGltZU91dCBpcyBlbmFibGVkICovDQotI2RlZmluZSBTRElPX1dhaXRfSVQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApIC8qITwgU0RJTyBXYWl0IEludGVycnVwdCBSZXF1ZXN0ICovDQotI2RlZmluZSBTRElPX1dhaXRfUGVuZCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDApIC8qITwgU0RJTyBXYWl0IEVuZCBvZiB0cmFuc2ZlciAqLw0KLSNkZWZpbmUgSVNfU0RJT19XQUlUKFdBSVQpICgoKFdBSVQpID09IFNESU9fV2FpdF9ObykgfHwgKChXQUlUKSA9PSBTRElPX1dhaXRfSVQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQUlUKSA9PSBTRElPX1dhaXRfUGVuZCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19DUFNNX1N0YXRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNESU9fQ1BTTV9EaXNhYmxlICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBTRElPX0NQU01fRW5hYmxlICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwNDAwKQ0KLSNkZWZpbmUgSVNfU0RJT19DUFNNKENQU00pICgoKENQU00pID09IFNESU9fQ1BTTV9FbmFibGUpIHx8ICgoQ1BTTSkgPT0gU0RJT19DUFNNX0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBTRElPX1Jlc3BvbnNlX1JlZ2lzdGVycyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX1JFU1AxICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBTRElPX1JFU1AyICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotI2RlZmluZSBTRElPX1JFU1AzICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQotI2RlZmluZSBTRElPX1JFU1A0ICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEMpDQotI2RlZmluZSBJU19TRElPX1JFU1AoUkVTUCkgKCgoUkVTUCkgPT0gU0RJT19SRVNQMSkgfHwgKChSRVNQKSA9PSBTRElPX1JFU1AyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTUCkgPT0gU0RJT19SRVNQMykgfHwgKChSRVNQKSA9PSBTRElPX1JFU1A0KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0RhdGFfTGVuZ3RoIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX1NESU9fREFUQV9MRU5HVEgoTEVOR1RIKSAoKExFTkdUSCkgPD0gMHgwMUZGRkZGRikNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0RhdGFfQmxvY2tfU2l6ZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMWIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMmIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfNGIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfOGIgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMzApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMTZiICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMzJiICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNTApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfNjRiICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNjApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMTI4YiAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNzApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMjU2YiAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfNTEyYiAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwOTApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMTAyNGIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwQTApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMjA0OGIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwQjApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfNDA5NmIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwQzApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfODE5MmIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRDApDQotI2RlZmluZSBTRElPX0RhdGFCbG9ja1NpemVfMTYzODRiICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRTApDQotI2RlZmluZSBJU19TRElPX0JMT0NLX1NJWkUoU0laRSkgKCgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzFiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzJiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzRiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzhiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzE2YikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNESU9fRGF0YUJsb2NrU2l6ZV8zMmIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRElPX0RhdGFCbG9ja1NpemVfNjRiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzEyOGIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRElPX0RhdGFCbG9ja1NpemVfMjU2YikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNESU9fRGF0YUJsb2NrU2l6ZV81MTJiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzEwMjRiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzIwNDhiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzQwOTZiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzgxOTJiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RJT19EYXRhQmxvY2tTaXplXzE2Mzg0YikpIA0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fVHJhbnNmZXJfRGlyZWN0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNESU9fVHJhbnNmZXJEaXJfVG9DYXJkICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFNESU9fVHJhbnNmZXJEaXJfVG9TRElPICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikNCi0jZGVmaW5lIElTX1NESU9fVFJBTlNGRVJfRElSKERJUikgKCgoRElSKSA9PSBTRElPX1RyYW5zZmVyRGlyX1RvQ2FyZCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVIpID09IFNESU9fVHJhbnNmZXJEaXJfVG9TRElPKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX1RyYW5zZmVyX1R5cGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU0RJT19UcmFuc2Zlck1vZGVfQmxvY2sgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgU0RJT19UcmFuc2Zlck1vZGVfU3RyZWFtICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KLSNkZWZpbmUgSVNfU0RJT19UUkFOU0ZFUl9NT0RFKE1PREUpICgoKE1PREUpID09IFNESU9fVHJhbnNmZXJNb2RlX1N0cmVhbSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNESU9fVHJhbnNmZXJNb2RlX0Jsb2NrKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0RQU01fU3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU0RJT19EUFNNX0Rpc2FibGUgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMCkNCi0jZGVmaW5lIFNESU9fRFBTTV9FbmFibGUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQotI2RlZmluZSBJU19TRElPX0RQU00oRFBTTSkgKCgoRFBTTSkgPT0gU0RJT19EUFNNX0VuYWJsZSkgfHwgKChEUFNNKSA9PSBTRElPX0RQU01fRGlzYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19GbGFncyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX0ZMQUdfQ0NSQ0ZBSUwgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQotI2RlZmluZSBTRElPX0ZMQUdfRENSQ0ZBSUwgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpDQotI2RlZmluZSBTRElPX0ZMQUdfQ1RJTUVPVVQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotI2RlZmluZSBTRElPX0ZMQUdfRFRJTUVPVVQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQotI2RlZmluZSBTRElPX0ZMQUdfVFhVTkRFUlIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTApDQotI2RlZmluZSBTRElPX0ZMQUdfUlhPVkVSUiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApDQotI2RlZmluZSBTRElPX0ZMQUdfQ01EUkVORCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBTRElPX0ZMQUdfQ01EU0VOVCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApDQotI2RlZmluZSBTRElPX0ZMQUdfREFUQUVORCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApDQotI2RlZmluZSBTRElPX0ZMQUdfU1RCSVRFUlIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAyMDApDQotI2RlZmluZSBTRElPX0ZMQUdfREJDS0VORCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApDQotI2RlZmluZSBTRElPX0ZMQUdfQ01EQUNUICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDApDQotI2RlZmluZSBTRElPX0ZMQUdfVFhBQ1QgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfUlhBQ1QgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfVFhGSUZPSEUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDQwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfUlhGSUZPSEYgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfVFhGSUZPRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfUlhGSUZPRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMjAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfVFhGSUZPRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfUlhGSUZPRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwODAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfVFhEQVZMICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAxMDAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfUlhEQVZMICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAyMDAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfU0RJT0lUICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDApDQotI2RlZmluZSBTRElPX0ZMQUdfQ0VBVEFFTkQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQotI2RlZmluZSBJU19TRElPX0ZMQUcoRkxBRykgKCgoRkxBRykgID09IFNESU9fRkxBR19DQ1JDRkFJTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpICA9PSBTRElPX0ZMQUdfRENSQ0ZBSUwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX0NUSU1FT1VUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19EVElNRU9VVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpICA9PSBTRElPX0ZMQUdfVFhVTkRFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX1JYT1ZFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX0NNRFJFTkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX0NNRFNFTlQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX0RBVEFFTkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX1NUQklURVJSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19EQkNLRU5EKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19DTURBQ1QpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX1RYQUNUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19SWEFDVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpICA9PSBTRElPX0ZMQUdfVFhGSUZPSEUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX1JYRklGT0hGKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19UWEZJRk9GKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19SWEZJRk9GKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19UWEZJRk9FKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19SWEZJRk9FKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19UWERBVkwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSAgPT0gU0RJT19GTEFHX1JYREFWTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpICA9PSBTRElPX0ZMQUdfU0RJT0lUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgID09IFNESU9fRkxBR19DRUFUQUVORCkpDQotDQotI2RlZmluZSBJU19TRElPX0NMRUFSX0ZMQUcoRkxBRykgKCgoKEZMQUcpICYgKHVpbnQzMl90KTB4RkYzRkY4MDApID09IDB4MDApICYmICgoRkxBRykgIT0gKHVpbnQzMl90KTB4MDApKQ0KLQ0KLSNkZWZpbmUgSVNfU0RJT19HRVRfSVQoSVQpICgoKElUKSAgPT0gU0RJT19JVF9DQ1JDRkFJTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9EQ1JDRkFJTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9DVElNRU9VVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9EVElNRU9VVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9UWFVOREVSUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9SWE9WRVJSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX0NNRFJFTkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgID09IFNESU9fSVRfQ01EU0VOVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9EQVRBRU5EKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1NUQklURVJSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX0RCQ0tFTkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgID09IFNESU9fSVRfQ01EQUNUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1RYQUNUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1JYQUNUKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1RYRklGT0hFKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1JYRklGT0hGKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1RYRklGT0YpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgID09IFNESU9fSVRfUlhGSUZPRikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9UWEZJRk9FKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1JYRklGT0UpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgID09IFNESU9fSVRfVFhEQVZMKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpICA9PSBTRElPX0lUX1JYREFWTCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSAgPT0gU0RJT19JVF9TRElPSVQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgID09IFNESU9fSVRfQ0VBVEFFTkQpKQ0KLQ0KLSNkZWZpbmUgSVNfU0RJT19DTEVBUl9JVChJVCkgKCgoKElUKSAmICh1aW50MzJfdCkweEZGM0ZGODAwKSA9PSAweDAwKSAmJiAoKElUKSAhPSAodWludDMyX3QpMHgwMCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19SZWFkX1dhaXRfTW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTRElPX1JlYWRXYWl0TW9kZV9DTEsgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQotI2RlZmluZSBTRElPX1JlYWRXYWl0TW9kZV9EQVRBMiAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApDQotI2RlZmluZSBJU19TRElPX1JFQURXQUlUX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gU0RJT19SZWFkV2FpdE1vZGVfQ0xLKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0RJT19SZWFkV2FpdE1vZGVfREFUQTIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0V4cG9ydGVkX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX0V4cG9ydGVkX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi12b2lkIFNESU9fRGVJbml0KHZvaWQpOw0KLXZvaWQgU0RJT19Jbml0KFNESU9fSW5pdFR5cGVEZWYqIFNESU9fSW5pdFN0cnVjdCk7DQotdm9pZCBTRElPX1N0cnVjdEluaXQoU0RJT19Jbml0VHlwZURlZiogU0RJT19Jbml0U3RydWN0KTsNCi12b2lkIFNESU9fQ2xvY2tDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFNESU9fU2V0UG93ZXJTdGF0ZSh1aW50MzJfdCBTRElPX1Bvd2VyU3RhdGUpOw0KLXVpbnQzMl90IFNESU9fR2V0UG93ZXJTdGF0ZSh2b2lkKTsNCi12b2lkIFNESU9fSVRDb25maWcodWludDMyX3QgU0RJT19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFNESU9fRE1BQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBTRElPX1NlbmRDb21tYW5kKFNESU9fQ21kSW5pdFR5cGVEZWYgKlNESU9fQ21kSW5pdFN0cnVjdCk7DQotdm9pZCBTRElPX0NtZFN0cnVjdEluaXQoU0RJT19DbWRJbml0VHlwZURlZiogU0RJT19DbWRJbml0U3RydWN0KTsNCi11aW50OF90IFNESU9fR2V0Q29tbWFuZFJlc3BvbnNlKHZvaWQpOw0KLXVpbnQzMl90IFNESU9fR2V0UmVzcG9uc2UodWludDMyX3QgU0RJT19SRVNQKTsNCi12b2lkIFNESU9fRGF0YUNvbmZpZyhTRElPX0RhdGFJbml0VHlwZURlZiogU0RJT19EYXRhSW5pdFN0cnVjdCk7DQotdm9pZCBTRElPX0RhdGFTdHJ1Y3RJbml0KFNESU9fRGF0YUluaXRUeXBlRGVmKiBTRElPX0RhdGFJbml0U3RydWN0KTsNCi11aW50MzJfdCBTRElPX0dldERhdGFDb3VudGVyKHZvaWQpOw0KLXVpbnQzMl90IFNESU9fUmVhZERhdGEodm9pZCk7DQotdm9pZCBTRElPX1dyaXRlRGF0YSh1aW50MzJfdCBEYXRhKTsNCi11aW50MzJfdCBTRElPX0dldEZJRk9Db3VudCh2b2lkKTsNCi12b2lkIFNESU9fU3RhcnRTRElPUmVhZFdhaXQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFNESU9fU3RvcFNESU9SZWFkV2FpdChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgU0RJT19TZXRTRElPUmVhZFdhaXRNb2RlKHVpbnQzMl90IFNESU9fUmVhZFdhaXRNb2RlKTsNCi12b2lkIFNESU9fU2V0U0RJT09wZXJhdGlvbihGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgU0RJT19TZW5kU0RJT1N1c3BlbmRDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFNESU9fQ29tbWFuZENvbXBsZXRpb25DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFNESU9fQ0VBVEFJVENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgU0RJT19TZW5kQ0VBVEFDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi1GbGFnU3RhdHVzIFNESU9fR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBTRElPX0ZMQUcpOw0KLXZvaWQgU0RJT19DbGVhckZsYWcodWludDMyX3QgU0RJT19GTEFHKTsNCi1JVFN0YXR1cyBTRElPX0dldElUU3RhdHVzKHVpbnQzMl90IFNESU9fSVQpOw0KLXZvaWQgU0RJT19DbGVhcklUUGVuZGluZ0JpdCh1aW50MzJfdCBTRElPX0lUKTsNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qIF9fU1RNMzJGMTB4X1NESU9fSCAqLw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfc3BpLmggYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9zcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiNTU4Yi4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF9zcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfc3BpLmgNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBTUEkgZmlybXdhcmUgDQotICAqICAgICAgICAgIGxpYnJhcnkuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpZm5kZWYgX19TVE0zMkYxMHhfU1BJX0gNCi0jZGVmaW5lIF9fU1RNMzJGMTB4X1NQSV9IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotIGV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1BJDQotICAqIEB7DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogDQotICAqIEBicmllZiAgU1BJIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQxNl90IFNQSV9EaXJlY3Rpb247ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwgZGF0YSBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfZGF0YV9kaXJlY3Rpb24gKi8NCi0NCi0gIHVpbnQxNl90IFNQSV9Nb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG9wZXJhdGluZyBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfbW9kZSAqLw0KLQ0KLSAgdWludDE2X3QgU1BJX0RhdGFTaXplOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTUEkgZGF0YSBzaXplLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfZGF0YV9zaXplICovDQotDQotICB1aW50MTZfdCBTUElfQ1BPTDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNlcmlhbCBjbG9jayBzdGVhZHkgc3RhdGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19Qb2xhcml0eSAqLw0KLQ0KLSAgdWludDE2X3QgU1BJX0NQSEE7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ2xvY2tfUGhhc2UgKi8NCi0NCi0gIHVpbnQxNl90IFNQSV9OU1M7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOU1Mgc2lnbmFsIGlzIG1hbmFnZWQgYnkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50ICovDQotIA0KLSAgdWludDE2X3QgU1BJX0JhdWRSYXRlUHJlc2NhbGVyOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkIFJhdGUgcHJlc2NhbGVyIHZhbHVlIHdoaWNoIHdpbGwgYmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBTQ0sgY2xvY2suDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9CYXVkUmF0ZV9QcmVzY2FsZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGUgY29tbXVuaWNhdGlvbiBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIG1hc3Rlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suIFRoZSBzbGF2ZSBjbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4gKi8NCi0NCi0gIHVpbnQxNl90IFNQSV9GaXJzdEJpdDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgdHJhbnNmZXJzIHN0YXJ0IGZyb20gTVNCIG9yIExTQiBiaXQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiAqLw0KLQ0KLSAgdWludDE2X3QgU1BJX0NSQ1BvbHlub21pYWw7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2x5bm9taWFsIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24uICovDQotfVNQSV9Jbml0VHlwZURlZjsNCi0NCi0vKiogDQotICAqIEBicmllZiAgSTJTIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0NCi0gIHVpbnQxNl90IEkyU19Nb2RlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJMlMgb3BlcmF0aW5nIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX01vZGUgKi8NCi0NCi0gIHVpbnQxNl90IEkyU19TdGFuZGFyZDsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCB1c2VkIGZvciB0aGUgSTJTIGNvbW11bmljYXRpb24uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX1N0YW5kYXJkICovDQotDQotICB1aW50MTZfdCBJMlNfRGF0YUZvcm1hdDsgICAvKiE8IFNwZWNpZmllcyB0aGUgZGF0YSBmb3JtYXQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfRGF0YV9Gb3JtYXQgKi8NCi0NCi0gIHVpbnQxNl90IEkyU19NQ0xLT3V0cHV0OyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIEkyUyBNQ0xLIG91dHB1dCBpcyBlbmFibGVkIG9yIG5vdC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTUNMS19PdXRwdXQgKi8NCi0NCi0gIHVpbnQzMl90IEkyU19BdWRpb0ZyZXE7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kgc2VsZWN0ZWQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfQXVkaW9fRnJlcXVlbmN5ICovDQotDQotICB1aW50MTZfdCBJMlNfQ1BPTDsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaWRsZSBzdGF0ZSBvZiB0aGUgSTJTIGNsb2NrLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19DbG9ja19Qb2xhcml0eSAqLw0KLX1JMlNfSW5pdFR5cGVEZWY7DQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0NvbnN0YW50cw0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX1NQSV9BTExfUEVSSVBIKFBFUklQSCkgKCgoUEVSSVBIKSA9PSBTUEkxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gU1BJMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFNQSTMpKQ0KLQ0KLSNkZWZpbmUgSVNfU1BJXzIzX1BFUklQSChQRVJJUEgpICgoKFBFUklQSCkgPT0gU1BJMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gU1BJMykpDQotDQotLyoqIEBkZWZncm91cCBTUElfZGF0YV9kaXJlY3Rpb24gDQotICAqIEB7DQotICAqLw0KLSAgDQotI2RlZmluZSBTUElfRGlyZWN0aW9uXzJMaW5lc19GdWxsRHVwbGV4ICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgU1BJX0RpcmVjdGlvbl8yTGluZXNfUnhPbmx5ICAgICAoKHVpbnQxNl90KTB4MDQwMCkNCi0jZGVmaW5lIFNQSV9EaXJlY3Rpb25fMUxpbmVfUnggICAgICAgICAgKCh1aW50MTZfdCkweDgwMDApDQotI2RlZmluZSBTUElfRGlyZWN0aW9uXzFMaW5lX1R4ICAgICAgICAgICgodWludDE2X3QpMHhDMDAwKQ0KLSNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl9NT0RFKE1PREUpICgoKE1PREUpID09IFNQSV9EaXJlY3Rpb25fMkxpbmVzX0Z1bGxEdXBsZXgpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTUElfRGlyZWN0aW9uXzJMaW5lc19SeE9ubHkpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTUElfRGlyZWN0aW9uXzFMaW5lX1J4KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU1BJX0RpcmVjdGlvbl8xTGluZV9UeCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX21vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU1BJX01vZGVfTWFzdGVyICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwNCkNCi0jZGVmaW5lIFNQSV9Nb2RlX1NsYXZlICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJU19TUElfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBTUElfTW9kZV9NYXN0ZXIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNQSV9Nb2RlX1NsYXZlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfZGF0YV9zaXplIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNQSV9EYXRhU2l6ZV8xNmIgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA4MDApDQotI2RlZmluZSBTUElfRGF0YVNpemVfOGIgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfU1BJX0RBVEFTSVpFKERBVEFTSVpFKSAoKChEQVRBU0laRSkgPT0gU1BJX0RhdGFTaXplXzE2YikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU1BJX0RhdGFTaXplXzhiKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0Nsb2NrX1BvbGFyaXR5IA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNQSV9DUE9MX0xvdyAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBTUElfQ1BPTF9IaWdoICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKQ0KLSNkZWZpbmUgSVNfU1BJX0NQT0woQ1BPTCkgKCgoQ1BPTCkgPT0gU1BJX0NQT0xfTG93KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUE9MKSA9PSBTUElfQ1BPTF9IaWdoKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfQ2xvY2tfUGhhc2UgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU1BJX0NQSEFfMUVkZ2UgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFNQSV9DUEhBXzJFZGdlICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBJU19TUElfQ1BIQShDUEhBKSAoKChDUEhBKSA9PSBTUElfQ1BIQV8xRWRnZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1BIQSkgPT0gU1BJX0NQSEFfMkVkZ2UpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTUElfTlNTX1NvZnQgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMjAwKQ0KLSNkZWZpbmUgU1BJX05TU19IYXJkICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1NQSV9OU1MoTlNTKSAoKChOU1MpID09IFNQSV9OU1NfU29mdCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoKE5TUykgPT0gU1BJX05TU19IYXJkKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0JhdWRSYXRlX1ByZXNjYWxlciANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTUElfQmF1ZFJhdGVQcmVzY2FsZXJfMiAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgU1BJX0JhdWRSYXRlUHJlc2NhbGVyXzQgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkNCi0jZGVmaW5lIFNQSV9CYXVkUmF0ZVByZXNjYWxlcl84ICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApDQotI2RlZmluZSBTUElfQmF1ZFJhdGVQcmVzY2FsZXJfMTYgICAgICAgICgodWludDE2X3QpMHgwMDE4KQ0KLSNkZWZpbmUgU1BJX0JhdWRSYXRlUHJlc2NhbGVyXzMyICAgICAgICAoKHVpbnQxNl90KTB4MDAyMCkNCi0jZGVmaW5lIFNQSV9CYXVkUmF0ZVByZXNjYWxlcl82NCAgICAgICAgKCh1aW50MTZfdCkweDAwMjgpDQotI2RlZmluZSBTUElfQmF1ZFJhdGVQcmVzY2FsZXJfMTI4ICAgICAgICgodWludDE2X3QpMHgwMDMwKQ0KLSNkZWZpbmUgU1BJX0JhdWRSYXRlUHJlc2NhbGVyXzI1NiAgICAgICAoKHVpbnQxNl90KTB4MDAzOCkNCi0jZGVmaW5lIElTX1NQSV9CQVVEUkFURV9QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKChQUkVTQ0FMRVIpID09IFNQSV9CYXVkUmF0ZVByZXNjYWxlcl8yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBTUElfQmF1ZFJhdGVQcmVzY2FsZXJfNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gU1BJX0JhdWRSYXRlUHJlc2NhbGVyXzgpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFNQSV9CYXVkUmF0ZVByZXNjYWxlcl8xNikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gU1BJX0JhdWRSYXRlUHJlc2NhbGVyXzMyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBTUElfQmF1ZFJhdGVQcmVzY2FsZXJfNjQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFNQSV9CYXVkUmF0ZVByZXNjYWxlcl8xMjgpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFNQSV9CYXVkUmF0ZVByZXNjYWxlcl8yNTYpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBTUElfTVNCX0xTQl90cmFuc21pc3Npb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU1BJX0ZpcnN0Qml0X01TQiAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFNQSV9GaXJzdEJpdF9MU0IgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwODApDQotI2RlZmluZSBJU19TUElfRklSU1RfQklUKEJJVCkgKCgoQklUKSA9PSBTUElfRmlyc3RCaXRfTVNCKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQklUKSA9PSBTUElfRmlyc3RCaXRfTFNCKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfTW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJMlNfTW9kZV9TbGF2ZVR4ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSTJTX01vZGVfU2xhdmVSeCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkNCi0jZGVmaW5lIEkyU19Nb2RlX01hc3RlclR4ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDApDQotI2RlZmluZSBJMlNfTW9kZV9NYXN0ZXJSeCAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMzAwKQ0KLSNkZWZpbmUgSVNfSTJTX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gSTJTX01vZGVfU2xhdmVUeCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJTX01vZGVfU2xhdmVSeCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJTX01vZGVfTWFzdGVyVHgpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEkyU19Nb2RlX01hc3RlclJ4KSApDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX1N0YW5kYXJkIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyU19TdGFuZGFyZF9QaGlsbGlwcyAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJMlNfU3RhbmRhcmRfTVNCICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwKQ0KLSNkZWZpbmUgSTJTX1N0YW5kYXJkX0xTQiAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAyMCkNCi0jZGVmaW5lIEkyU19TdGFuZGFyZF9QQ01TaG9ydCAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMzApDQotI2RlZmluZSBJMlNfU3RhbmRhcmRfUENNTG9uZyAgICAgICAgICAgICgodWludDE2X3QpMHgwMEIwKQ0KLSNkZWZpbmUgSVNfSTJTX1NUQU5EQVJEKFNUQU5EQVJEKSAoKChTVEFOREFSRCkgPT0gSTJTX1N0YW5kYXJkX1BoaWxsaXBzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU3RhbmRhcmRfTVNCKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU3RhbmRhcmRfTFNCKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQU5EQVJEKSA9PSBJMlNfU3RhbmRhcmRfUENNU2hvcnQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBTkRBUkQpID09IEkyU19TdGFuZGFyZF9QQ01Mb25nKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfRGF0YV9Gb3JtYXQgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSTJTX0RhdGFGb3JtYXRfMTZiICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIEkyU19EYXRhRm9ybWF0XzE2YmV4dGVuZGVkICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBJMlNfRGF0YUZvcm1hdF8yNGIgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAzKQ0KLSNkZWZpbmUgSTJTX0RhdGFGb3JtYXRfMzJiICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNSkNCi0jZGVmaW5lIElTX0kyU19EQVRBX0ZPUk1BVChGT1JNQVQpICgoKEZPUk1BVCkgPT0gSTJTX0RhdGFGb3JtYXRfMTZiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGT1JNQVQpID09IEkyU19EYXRhRm9ybWF0XzE2YmV4dGVuZGVkKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGT1JNQVQpID09IEkyU19EYXRhRm9ybWF0XzI0YikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBJMlNfRGF0YUZvcm1hdF8zMmIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBJMlNfTUNMS19PdXRwdXQgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSTJTX01DTEtPdXRwdXRfRW5hYmxlICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIwMCkNCi0jZGVmaW5lIEkyU19NQ0xLT3V0cHV0X0Rpc2FibGUgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJU19JMlNfTUNMS19PVVRQVVQoT1VUUFVUKSAoKChPVVRQVVQpID09IEkyU19NQ0xLT3V0cHV0X0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBJMlNfTUNMS091dHB1dF9EaXNhYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMlNfQXVkaW9fRnJlcXVlbmN5IA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyU19BdWRpb0ZyZXFfMTkyayAgICAgICAgICAgICAgICgodWludDMyX3QpMTkyMDAwKQ0KLSNkZWZpbmUgSTJTX0F1ZGlvRnJlcV85NmsgICAgICAgICAgICAgICAgKCh1aW50MzJfdCk5NjAwMCkNCi0jZGVmaW5lIEkyU19BdWRpb0ZyZXFfNDhrICAgICAgICAgICAgICAgICgodWludDMyX3QpNDgwMDApDQotI2RlZmluZSBJMlNfQXVkaW9GcmVxXzQ0ayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTQ0MTAwKQ0KLSNkZWZpbmUgSTJTX0F1ZGlvRnJlcV8zMmsgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkzMjAwMCkNCi0jZGVmaW5lIEkyU19BdWRpb0ZyZXFfMjJrICAgICAgICAgICAgICAgICgodWludDMyX3QpMjIwNTApDQotI2RlZmluZSBJMlNfQXVkaW9GcmVxXzE2ayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTE2MDAwKQ0KLSNkZWZpbmUgSTJTX0F1ZGlvRnJlcV8xMWsgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkxMTAyNSkNCi0jZGVmaW5lIEkyU19BdWRpb0ZyZXFfOGsgICAgICAgICAgICAgICAgICgodWludDMyX3QpODAwMCkNCi0jZGVmaW5lIEkyU19BdWRpb0ZyZXFfRGVmYXVsdCAgICAgICAgICAgICgodWludDMyX3QpMikNCi0NCi0jZGVmaW5lIElTX0kyU19BVURJT19GUkVRKEZSRVEpICgoKChGUkVRKSA+PSBJMlNfQXVkaW9GcmVxXzhrKSAmJiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPD0gSTJTX0F1ZGlvRnJlcV8xOTJrKSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPT0gSTJTX0F1ZGlvRnJlcV9EZWZhdWx0KSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJTX0Nsb2NrX1BvbGFyaXR5IA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIEkyU19DUE9MX0xvdyAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJMlNfQ1BPTF9IaWdoICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLSNkZWZpbmUgSVNfSTJTX0NQT0woQ1BPTCkgKCgoQ1BPTCkgPT0gSTJTX0NQT0xfTG93KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUE9MKSA9PSBJMlNfQ1BPTF9IaWdoKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfSTJTX0RNQV90cmFuc2Zlcl9yZXF1ZXN0cyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTUElfSTJTX0RNQVJlcV9UeCAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKQ0KLSNkZWZpbmUgU1BJX0kyU19ETUFSZXFfUnggICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkNCi0jZGVmaW5lIElTX1NQSV9JMlNfRE1BUkVRKERNQVJFUSkgKCgoKERNQVJFUSkgJiAodWludDE2X3QpMHhGRkZDKSA9PSAweDAwKSAmJiAoKERNQVJFUSkgIT0gMHgwMCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX05TU19pbnRlcm5hbF9zb2Z0d2FyZV9tYW5nZW1lbnQgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU1BJX05TU0ludGVybmFsU29mdF9TZXQgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkNCi0jZGVmaW5lIFNQSV9OU1NJbnRlcm5hbFNvZnRfUmVzZXQgICAgICAgKCh1aW50MTZfdCkweEZFRkYpDQotI2RlZmluZSBJU19TUElfTlNTX0lOVEVSTkFMKElOVEVSTkFMKSAoKChJTlRFUk5BTCkgPT0gU1BJX05TU0ludGVybmFsU29mdF9TZXQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOVEVSTkFMKSA9PSBTUElfTlNTSW50ZXJuYWxTb2Z0X1Jlc2V0KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfQ1JDX1RyYW5zbWl0X1JlY2VpdmUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU1BJX0NSQ19UeCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkNCi0jZGVmaW5lIFNQSV9DUkNfUnggICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpDQotI2RlZmluZSBJU19TUElfQ1JDKENSQykgKCgoQ1JDKSA9PSBTUElfQ1JDX1R4KSB8fCAoKENSQykgPT0gU1BJX0NSQ19SeCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX2RpcmVjdGlvbl90cmFuc21pdF9yZWNlaXZlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFNQSV9EaXJlY3Rpb25fUnggICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweEJGRkYpDQotI2RlZmluZSBTUElfRGlyZWN0aW9uX1R4ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHg0MDAwKQ0KLSNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTihESVJFQ1RJT04pICgoKERJUkVDVElPTikgPT0gU1BJX0RpcmVjdGlvbl9SeCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERJUkVDVElPTikgPT0gU1BJX0RpcmVjdGlvbl9UeCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX0kyU19pbnRlcnJ1cHRzX2RlZmluaXRpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgU1BJX0kyU19JVF9UWEUgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHg3MSkNCi0jZGVmaW5lIFNQSV9JMlNfSVRfUlhORSAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4NjApDQotI2RlZmluZSBTUElfSTJTX0lUX0VSUiAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDUwKQ0KLSNkZWZpbmUgSVNfU1BJX0kyU19DT05GSUdfSVQoSVQpICgoKElUKSA9PSBTUElfSTJTX0lUX1RYRSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IFNQSV9JMlNfSVRfUlhORSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IFNQSV9JMlNfSVRfRVJSKSkNCi0jZGVmaW5lIFNQSV9JMlNfSVRfT1ZSICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4NTYpDQotI2RlZmluZSBTUElfSVRfTU9ERiAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDU1KQ0KLSNkZWZpbmUgU1BJX0lUX0NSQ0VSUiAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHg1NCkNCi0jZGVmaW5lIEkyU19JVF9VRFIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4NTMpDQotI2RlZmluZSBJU19TUElfSTJTX0NMRUFSX0lUKElUKSAoKChJVCkgPT0gU1BJX0lUX0NSQ0VSUikpDQotI2RlZmluZSBJU19TUElfSTJTX0dFVF9JVChJVCkgKCgoSVQpID09IFNQSV9JMlNfSVRfUlhORSkgfHwgKChJVCkgPT0gU1BJX0kyU19JVF9UWEUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gSTJTX0lUX1VEUikgfHwgKChJVCkgPT0gU1BJX0lUX0NSQ0VSUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBTUElfSVRfTU9ERikgfHwgKChJVCkgPT0gU1BJX0kyU19JVF9PVlIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9JMlNfZmxhZ3NfZGVmaW5pdGlvbiANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBTUElfSTJTX0ZMQUdfUlhORSAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKQ0KLSNkZWZpbmUgU1BJX0kyU19GTEFHX1RYRSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMikNCi0jZGVmaW5lIEkyU19GTEFHX0NIU0lERSAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpDQotI2RlZmluZSBJMlNfRkxBR19VRFIgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLSNkZWZpbmUgU1BJX0ZMQUdfQ1JDRVJSICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMCkNCi0jZGVmaW5lIFNQSV9GTEFHX01PREYgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjApDQotI2RlZmluZSBTUElfSTJTX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwKQ0KLSNkZWZpbmUgU1BJX0kyU19GTEFHX0JTWSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA4MCkNCi0jZGVmaW5lIElTX1NQSV9JMlNfQ0xFQVJfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBTUElfRkxBR19DUkNFUlIpKQ0KLSNkZWZpbmUgSVNfU1BJX0kyU19HRVRfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBTUElfSTJTX0ZMQUdfQlNZKSB8fCAoKEZMQUcpID09IFNQSV9JMlNfRkxBR19PVlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gU1BJX0ZMQUdfTU9ERikgfHwgKChGTEFHKSA9PSBTUElfRkxBR19DUkNFUlIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gSTJTX0ZMQUdfVURSKSB8fCAoKEZMQUcpID09IEkyU19GTEFHX0NIU0lERSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBTUElfSTJTX0ZMQUdfVFhFKSB8fCAoKEZMQUcpID09IFNQSV9JMlNfRkxBR19SWE5FKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfQ1JDX3BvbHlub21pYWwgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfU1BJX0NSQ19QT0xZTk9NSUFMKFBPTFlOT01JQUwpICgoUE9MWU5PTUlBTCkgPj0gMHgxKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotdm9pZCBTUElfSTJTX0RlSW5pdChTUElfVHlwZURlZiogU1BJeCk7DQotdm9pZCBTUElfSW5pdChTUElfVHlwZURlZiogU1BJeCwgU1BJX0luaXRUeXBlRGVmKiBTUElfSW5pdFN0cnVjdCk7DQotdm9pZCBJMlNfSW5pdChTUElfVHlwZURlZiogU1BJeCwgSTJTX0luaXRUeXBlRGVmKiBJMlNfSW5pdFN0cnVjdCk7DQotdm9pZCBTUElfU3RydWN0SW5pdChTUElfSW5pdFR5cGVEZWYqIFNQSV9Jbml0U3RydWN0KTsNCi12b2lkIEkyU19TdHJ1Y3RJbml0KEkyU19Jbml0VHlwZURlZiogSTJTX0luaXRTdHJ1Y3QpOw0KLXZvaWQgU1BJX0NtZChTUElfVHlwZURlZiogU1BJeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIEkyU19DbWQoU1BJX1R5cGVEZWYqIFNQSXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBTUElfSTJTX0lUQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50OF90IFNQSV9JMlNfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBTUElfSTJTX0RNQUNtZChTUElfVHlwZURlZiogU1BJeCwgdWludDE2X3QgU1BJX0kyU19ETUFSZXEsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBTUElfSTJTX1NlbmREYXRhKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBEYXRhKTsNCi11aW50MTZfdCBTUElfSTJTX1JlY2VpdmVEYXRhKFNQSV9UeXBlRGVmKiBTUEl4KTsNCi12b2lkIFNQSV9OU1NJbnRlcm5hbFNvZnR3YXJlQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfTlNTSW50ZXJuYWxTb2Z0KTsNCi12b2lkIFNQSV9TU091dHB1dENtZChTUElfVHlwZURlZiogU1BJeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFNQSV9EYXRhU2l6ZUNvbmZpZyhTUElfVHlwZURlZiogU1BJeCwgdWludDE2X3QgU1BJX0RhdGFTaXplKTsNCi12b2lkIFNQSV9UcmFuc21pdENSQyhTUElfVHlwZURlZiogU1BJeCk7DQotdm9pZCBTUElfQ2FsY3VsYXRlQ1JDKFNQSV9UeXBlRGVmKiBTUEl4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXVpbnQxNl90IFNQSV9HZXRDUkMoU1BJX1R5cGVEZWYqIFNQSXgsIHVpbnQ4X3QgU1BJX0NSQyk7DQotdWludDE2X3QgU1BJX0dldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYqIFNQSXgpOw0KLXZvaWQgU1BJX0JpRGlyZWN0aW9uYWxMaW5lQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfRGlyZWN0aW9uKTsNCi1GbGFnU3RhdHVzIFNQSV9JMlNfR2V0RmxhZ1N0YXR1cyhTUElfVHlwZURlZiogU1BJeCwgdWludDE2X3QgU1BJX0kyU19GTEFHKTsNCi12b2lkIFNQSV9JMlNfQ2xlYXJGbGFnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfSTJTX0ZMQUcpOw0KLUlUU3RhdHVzIFNQSV9JMlNfR2V0SVRTdGF0dXMoU1BJX1R5cGVEZWYqIFNQSXgsIHVpbnQ4X3QgU1BJX0kyU19JVCk7DQotdm9pZCBTUElfSTJTX0NsZWFySVRQZW5kaW5nQml0KFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50OF90IFNQSV9JMlNfSVQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLypfX1NUTTMyRjEweF9TUElfSCAqLw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfdGltLmggYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF90aW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyOWMwYi4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvaW5jL3N0bTMyZjEweF90aW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDExMzcgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X3RpbS5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgVElNIGZpcm13YXJlIA0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X1RJTV9IDQotI2RlZmluZSBfX1NUTTMyRjEweF9USU1fSA0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSBleHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHguaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBhZGR0b2dyb3VwIFRJTQ0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfVHlwZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBUSU0gVGltZSBCYXNlIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24NCi0gICogQG5vdGUgICBUaGlzIHN0dXJjdHVyZSBpcyB1c2VkIHdpdGggYWxsIFRJTXggZXhjZXB0IGZvciBUSU02IGFuZCBUSU03LiAgICANCi0gICovDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICB1aW50MTZfdCBUSU1fUHJlc2NhbGVyOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgdmFsdWUgdXNlZCB0byBkaXZpZGUgdGhlIFRJTSBjbG9jay4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRiAqLw0KLQ0KLSAgdWludDE2X3QgVElNX0NvdW50ZXJNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY291bnRlciBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0NvdW50ZXJfTW9kZSAqLw0KLQ0KLSAgdWludDE2X3QgVElNX1BlcmlvZDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaW9kIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBhY3RpdmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvLVJlbG9hZCBSZWdpc3RlciBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLiAgKi8gDQotDQotICB1aW50MTZfdCBUSU1fQ2xvY2tEaXZpc2lvbjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBkaXZpc2lvbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0Nsb2NrX0RpdmlzaW9uX0NLRCAqLw0KLQ0KLSAgdWludDhfdCBUSU1fUmVwZXRpdGlvbkNvdW50ZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLiBFYWNoIHRpbWUgdGhlIFJDUiBkb3duY291bnRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgemVybywgYW4gdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBSQ1IgdmFsdWUgKE4pLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgaW4gUFdNIG1vZGUgdGhhdCAoTisxKSBjb3JyZXNwb25kcyB0bzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4gZWRnZS1hbGlnbmVkIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgaGFsZiBQV00gcGVyaW9kIGluIGNlbnRlci1hbGlnbmVkIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMCBhbmQgMHhGRi4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgVElNMSBhbmQgVElNOC4gKi8NCi19IFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmOyAgICAgICANCi0NCi0vKiogDQotICAqIEBicmllZiAgVElNIE91dHB1dCBDb21wYXJlIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQxNl90IFRJTV9PQ01vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIG1vZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzICovDQotDQotICB1aW50MTZfdCBUSU1fT3V0cHV0U3RhdGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzdGF0ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX3N0YXRlICovDQotDQotICB1aW50MTZfdCBUSU1fT3V0cHV0TlN0YXRlOyAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBjb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIHN0YXRlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfTl9zdGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgVElNMSBhbmQgVElNOC4gKi8NCi0NCi0gIHVpbnQxNl90IFRJTV9QdWxzZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRiAqLw0KLQ0KLSAgdWludDE2X3QgVElNX09DUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9Qb2xhcml0eSAqLw0KLQ0KLSAgdWludDE2X3QgVElNX09DTlBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIFRJTTEgYW5kIFRJTTguICovDQotDQotICB1aW50MTZfdCBUSU1fT0NJZGxlU3RhdGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9JZGxlX1N0YXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciBUSU0xIGFuZCBUSU04LiAqLw0KLQ0KLSAgdWludDE2X3QgVElNX09DTklkbGVTdGF0ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciBUSU0xIGFuZCBUSU04LiAqLw0KLX0gVElNX09DSW5pdFR5cGVEZWY7DQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIFRJTSBJbnB1dCBDYXB0dXJlIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0NCi0gIHVpbnQxNl90IFRJTV9DaGFubmVsOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gY2hhbm5lbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2hhbm5lbCAqLw0KLQ0KLSAgdWludDE2X3QgVElNX0lDUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8NCi0NCi0gIHVpbnQxNl90IFRJTV9JQ1ByZXNjYWxlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8NCi0NCi0gIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwIGFuZCAweEYgKi8NCi19IFRJTV9JQ0luaXRUeXBlRGVmOw0KLQ0KLS8qKiANCi0gICogQGJyaWVmICBCRFRSIHN0cnVjdHVyZSBkZWZpbml0aW9uIA0KLSAgKiBAbm90ZSAgIFRoaXMgc3R1cmN0dXJlIGlzIHVzZWQgb25seSB3aXRoIFRJTTEgYW5kIFRJTTguICAgIA0KLSAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0NCi0gIHVpbnQxNl90IFRJTV9PU1NSU3RhdGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgT2ZmLVN0YXRlIHNlbGVjdGlvbiB1c2VkIGluIFJ1biBtb2RlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBPU1NSX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX1J1bl9tb2RlX3N0YXRlICovDQotDQotICB1aW50MTZfdCBUSU1fT1NTSVN0YXRlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE9mZi1TdGF0ZSB1c2VkIGluIElkbGUgc3RhdGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIE9TU0lfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfSWRsZV9tb2RlX3N0YXRlICovDQotDQotICB1aW50MTZfdCBUSU1fTE9DS0xldmVsOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIExPQ0sgbGV2ZWwgcGFyYW1ldGVycy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTG9ja19sZXZlbCAqLyANCi0NCi0gIHVpbnQxNl90IFRJTV9EZWFkVGltZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGVsYXkgdGltZSBiZXR3ZWVuIHRoZSBzd2l0Y2hpbmctb2ZmIGFuZCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGluZy1vbiBvZiB0aGUgb3V0cHV0cy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAgYW5kIDB4RkYgICovDQotDQotICB1aW50MTZfdCBUSU1fQnJlYWs7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEJyZWFrIGlucHV0IGlzIGVuYWJsZWQgb3Igbm90LiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQnJlYWtfSW5wdXRfZW5hYmxlX2Rpc2FibGUgKi8NCi0NCi0gIHVpbnQxNl90IFRJTV9CcmVha1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIEJyZWFrIElucHV0IHBpbiBwb2xhcml0eS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQnJlYWtfUG9sYXJpdHkgKi8NCi0NCi0gIHVpbnQxNl90IFRJTV9BdXRvbWF0aWNPdXRwdXQ7ICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUSU0gQXV0b21hdGljIE91dHB1dCBmZWF0dXJlIGlzIGVuYWJsZWQgb3Igbm90LiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0FPRV9CaXRfU2V0X1Jlc2V0ICovDQotfSBUSU1fQkRUUkluaXRUeXBlRGVmOw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX2NvbnN0YW50cyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBJU19USU1fQUxMX1BFUklQSChQRVJJUEgpICgoKFBFUklQSCkgPT0gVElNMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU02KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNNykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTgpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU05KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTApfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTExKXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xMil8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTMpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE0KXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNSl8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTYpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE3KSkNCi0NCi0vKiBMSVNUMTogVElNIDEgYW5kIDggKi8NCi0jZGVmaW5lIElTX1RJTV9MSVNUMV9QRVJJUEgoUEVSSVBIKSAgKCgoUEVSSVBIKSA9PSBUSU0xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNOCkpDQotDQotLyogTElTVDI6IFRJTSAxLCA4LCAxNSAxNiBhbmQgMTcgKi8NCi0jZGVmaW5lIElTX1RJTV9MSVNUMl9QRVJJUEgoUEVSSVBIKSAoKChQRVJJUEgpID09IFRJTTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTgpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE1KXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE2KXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE3KSkgDQotDQotLyogTElTVDM6IFRJTSAxLCAyLCAzLCA0LCA1IGFuZCA4ICovDQotI2RlZmluZSBJU19USU1fTElTVDNfUEVSSVBIKFBFUklQSCkgKCgoUEVSSVBIKSA9PSBUSU0xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU00KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU01KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU04KSkgDQotCQkJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotLyogTElTVDQ6IFRJTSAxLCAyLCAzLCA0LCA1LCA4LCAxNSwgMTYgYW5kIDE3ICovDQotI2RlZmluZSBJU19USU1fTElTVDRfUEVSSVBIKFBFUklQSCkgKCgoUEVSSVBIKSA9PSBUSU0xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU00KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU01KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU04KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNSl8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNil8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNykpDQotDQotLyogTElTVDU6IFRJTSAxLCAyLCAzLCA0LCA1LCA4IGFuZCAxNSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBJU19USU1fTElTVDVfUEVSSVBIKFBFUklQSCkgKCgoUEVSSVBIKSA9PSBUSU0xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU00KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU01KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU04KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNSkpIA0KLQ0KLS8qIExJU1Q2OiBUSU0gMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgYW5kIDE1ICovDQotI2RlZmluZSBJU19USU1fTElTVDZfUEVSSVBIKFBFUklQSCkgICgoKFBFUklQSCkgPT0gVElNMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU04KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNOSkgfHwgXA0KLQkJCQkJCQkJCSAgKChQRVJJUEgpID09IFRJTTEyKXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNSkpDQotDQotLyogTElTVDc6IFRJTSAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMiBhbmQgMTUgKi8NCi0jZGVmaW5lIElTX1RJTV9MSVNUN19QRVJJUEgoUEVSSVBIKSAgKCgoUEVSSVBIKSA9PSBUSU0xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU00KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNNSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU03KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNOCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTkpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xMil8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLQ0KLS8qIExJU1Q4OiBUSU0gMSwgMiwgMywgNCwgNSwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYgYW5kIDE3ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgSVNfVElNX0xJU1Q4X1BFUklQSChQRVJJUEgpICAoKChQRVJJUEgpID09IFRJTTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU01KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNOCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTkpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xMCl8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTEpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTEyKXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xMyl8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTQpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE1KXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNil8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTcpKQ0KLQ0KLS8qIExJU1Q5OiBUSU0gMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgMTUsIDE2LCBhbmQgMTcgKi8NCi0jZGVmaW5lIElTX1RJTV9MSVNUOV9QRVJJUEgoUEVSSVBIKSAgKCgoUEVSSVBIKSA9PSBUSU0xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU00KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNNSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU03KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNOCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFRJTTE1KXx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBUSU0xNil8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVElNMTcpKSAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX09DTW9kZV9UaW1pbmcgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9PQ01vZGVfQWN0aXZlICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApDQotI2RlZmluZSBUSU1fT0NNb2RlX0luYWN0aXZlICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwKQ0KLSNkZWZpbmUgVElNX09DTW9kZV9Ub2dnbGUgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAzMCkNCi0jZGVmaW5lIFRJTV9PQ01vZGVfUFdNMSAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNjApDQotI2RlZmluZSBUSU1fT0NNb2RlX1BXTTIgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDcwKQ0KLSNkZWZpbmUgSVNfVElNX09DX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gVElNX09DTW9kZV9UaW1pbmcpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01vZGVfQWN0aXZlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNb2RlX0luYWN0aXZlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNb2RlX1RvZ2dsZSl8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNb2RlX1BXTTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01vZGVfUFdNMikpDQotI2RlZmluZSBJU19USU1fT0NNKE1PREUpICgoKE1PREUpID09IFRJTV9PQ01vZGVfVGltaW5nKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01vZGVfQWN0aXZlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PQ01vZGVfSW5hY3RpdmUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTW9kZV9Ub2dnbGUpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fT0NNb2RlX1BXTTEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX09DTW9kZV9QV00yKSB8fAlcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PbmVfUHVsc2VfTW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fT1BNb2RlX1NpbmdsZSAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLSNkZWZpbmUgVElNX09QTW9kZV9SZXBldGl0aXZlICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9PUE1fTU9ERShNT0RFKSAoKChNT0RFKSA9PSBUSU1fT1BNb2RlX1NpbmdsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9PUE1vZGVfUmVwZXRpdGl2ZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9DaGFubmVsIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9DaGFubmVsXzEgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBUSU1fQ2hhbm5lbF8yICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KQ0KLSNkZWZpbmUgVElNX0NoYW5uZWxfMyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkNCi0jZGVmaW5lIFRJTV9DaGFubmVsXzQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMEMpDQotI2RlZmluZSBJU19USU1fQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBUSU1fQ2hhbm5lbF8xKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ2hhbm5lbF8yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ2hhbm5lbF8zKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ2hhbm5lbF80KSkNCi0jZGVmaW5lIElTX1RJTV9QV01JX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gVElNX0NoYW5uZWxfMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ2hhbm5lbF8yKSkNCi0jZGVmaW5lIElTX1RJTV9DT01QTEVNRU5UQVJZX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPT0gVElNX0NoYW5uZWxfMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBUSU1fQ2hhbm5lbF8yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IFRJTV9DaGFubmVsXzMpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfRGl2aXNpb25fQ0tEIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9DS0RfRElWMSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBUSU1fQ0tEX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMTAwKQ0KLSNkZWZpbmUgVElNX0NLRF9ESVY0ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIwMCkNCi0jZGVmaW5lIElTX1RJTV9DS0RfRElWKERJVikgKCgoRElWKSA9PSBUSU1fQ0tEX0RJVjEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElWKSA9PSBUSU1fQ0tEX0RJVjIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElWKSA9PSBUSU1fQ0tEX0RJVjQpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9Db3VudGVyX01vZGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX0NvdW50ZXJNb2RlX1VwICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9Db3VudGVyTW9kZV9Eb3duICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApDQotI2RlZmluZSBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDEgICAgICgodWludDE2X3QpMHgwMDIwKQ0KLSNkZWZpbmUgVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQyICAgICAoKHVpbnQxNl90KTB4MDA0MCkNCi0jZGVmaW5lIFRJTV9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkMyAgICAgKCh1aW50MTZfdCkweDAwNjApDQotI2RlZmluZSBJU19USU1fQ09VTlRFUl9NT0RFKE1PREUpICgoKE1PREUpID09IFRJTV9Db3VudGVyTW9kZV9VcCkgfHwgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX0NvdW50ZXJNb2RlX0Rvd24pIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDMpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX09DUG9sYXJpdHlfSGlnaCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9PQ1BvbGFyaXR5X0xvdyAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpDQotI2RlZmluZSBJU19USU1fT0NfUE9MQVJJVFkoUE9MQVJJVFkpICgoKFBPTEFSSVRZKSA9PSBUSU1fT0NQb2xhcml0eV9IaWdoKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fT0NQb2xhcml0eV9Mb3cpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1BvbGFyaXR5IA0KLSAgKiBAew0KLSAgKi8NCi0gIA0KLSNkZWZpbmUgVElNX09DTlBvbGFyaXR5X0hpZ2ggICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9PQ05Qb2xhcml0eV9Mb3cgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDgpDQotI2RlZmluZSBJU19USU1fT0NOX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gVElNX09DTlBvbGFyaXR5X0hpZ2gpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fT0NOUG9sYXJpdHlfTG93KSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfc3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX091dHB1dFN0YXRlX0Rpc2FibGUgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9PdXRwdXRTdGF0ZV9FbmFibGUgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBJU19USU1fT1VUUFVUX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gVElNX091dHB1dFN0YXRlX0Rpc2FibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fT3V0cHV0U3RhdGVfRW5hYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fc3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX091dHB1dE5TdGF0ZV9EaXNhYmxlICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9PdXRwdXROU3RhdGVfRW5hYmxlICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpDQotI2RlZmluZSBJU19USU1fT1VUUFVUTl9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9PdXRwdXROU3RhdGVfRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fT3V0cHV0TlN0YXRlX0VuYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9DYXB0dXJlX0NvbXBhcmVfc3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX0NDeF9FbmFibGUgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBUSU1fQ0N4X0Rpc2FibGUgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9DQ1goQ0NYKSAoKChDQ1gpID09IFRJTV9DQ3hfRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0NYKSA9PSBUSU1fQ0N4X0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fQ2FwdHVyZV9Db21wYXJlX05fc3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX0NDeE5fRW5hYmxlICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpDQotI2RlZmluZSBUSU1fQ0N4Tl9EaXNhYmxlICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9DQ1hOKENDWE4pICgoKENDWE4pID09IFRJTV9DQ3hOX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0NYTikgPT0gVElNX0NDeE5fRGlzYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIEJyZWFrX0lucHV0X2VuYWJsZV9kaXNhYmxlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9CcmVha19FbmFibGUgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDEwMDApDQotI2RlZmluZSBUSU1fQnJlYWtfRGlzYWJsZSAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfVElNX0JSRUFLX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gVElNX0JyZWFrX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gVElNX0JyZWFrX0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBCcmVha19Qb2xhcml0eSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fQnJlYWtQb2xhcml0eV9Mb3cgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgVElNX0JyZWFrUG9sYXJpdHlfSGlnaCAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MjAwMCkNCi0jZGVmaW5lIElTX1RJTV9CUkVBS19QT0xBUklUWShQT0xBUklUWSkgKCgoUE9MQVJJVFkpID09IFRJTV9CcmVha1BvbGFyaXR5X0xvdykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gVElNX0JyZWFrUG9sYXJpdHlfSGlnaCkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9BT0VfQml0X1NldF9SZXNldCANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fQXV0b21hdGljT3V0cHV0X0VuYWJsZSAgICAgICAgICgodWludDE2X3QpMHg0MDAwKQ0KLSNkZWZpbmUgVElNX0F1dG9tYXRpY091dHB1dF9EaXNhYmxlICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9BVVRPTUFUSUNfT1VUUFVUX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gVElNX0F1dG9tYXRpY091dHB1dF9FbmFibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gVElNX0F1dG9tYXRpY091dHB1dF9EaXNhYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgTG9ja19sZXZlbCANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fTE9DS0xldmVsX09GRiAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgVElNX0xPQ0tMZXZlbF8xICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkNCi0jZGVmaW5lIFRJTV9MT0NLTGV2ZWxfMiAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDApDQotI2RlZmluZSBUSU1fTE9DS0xldmVsXzMgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMzAwKQ0KLSNkZWZpbmUgSVNfVElNX0xPQ0tfTEVWRUwoTEVWRUwpICgoKExFVkVMKSA9PSBUSU1fTE9DS0xldmVsX09GRikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFVkVMKSA9PSBUSU1fTE9DS0xldmVsXzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRVZFTCkgPT0gVElNX0xPQ0tMZXZlbF8yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFRJTV9MT0NLTGV2ZWxfMykpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIE9TU0lfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfSWRsZV9tb2RlX3N0YXRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9PU1NJU3RhdGVfRW5hYmxlICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA0MDApDQotI2RlZmluZSBUSU1fT1NTSVN0YXRlX0Rpc2FibGUgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfVElNX09TU0lfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBUSU1fT1NTSVN0YXRlX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fT1NTSVN0YXRlX0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIE9TU1JfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfUnVuX21vZGVfc3RhdGUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX09TU1JTdGF0ZV9FbmFibGUgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDgwMCkNCi0jZGVmaW5lIFRJTV9PU1NSU3RhdGVfRGlzYWJsZSAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBJU19USU1fT1NTUl9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9PU1NSU3RhdGVfRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9PU1NSU3RhdGVfRGlzYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9JZGxlX1N0YXRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9PQ0lkbGVTdGF0ZV9TZXQgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApDQotI2RlZmluZSBUSU1fT0NJZGxlU3RhdGVfUmVzZXQgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfVElNX09DSURMRV9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9PQ0lkbGVTdGF0ZV9TZXQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fT0NJZGxlU3RhdGVfUmVzZXQpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9PQ05JZGxlU3RhdGVfU2V0ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDApDQotI2RlZmluZSBUSU1fT0NOSWRsZVN0YXRlX1Jlc2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfVElNX09DTklETEVfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBUSU1fT0NOSWRsZVN0YXRlX1NldCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBUSU1fT0NOSWRsZVN0YXRlX1Jlc2V0KSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZyAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lICBUSU1fSUNQb2xhcml0eV9GYWxsaW5nICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpDQotI2RlZmluZSAgVElNX0lDUG9sYXJpdHlfQm90aEVkZ2UgICAgICAgICAgICgodWludDE2X3QpMHgwMDBBKQ0KLSNkZWZpbmUgSVNfVElNX0lDX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gVElNX0lDUG9sYXJpdHlfUmlzaW5nKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fSUNQb2xhcml0eV9GYWxsaW5nKSkNCi0jZGVmaW5lIElTX1RJTV9JQ19QT0xBUklUWV9MSVRFKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gVElNX0lDUG9sYXJpdHlfUmlzaW5nKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcpfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBUSU1fSUNQb2xhcml0eV9Cb3RoRWRnZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSSAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIElDMSwgSUMyLCBJQzMgb3IgSUM0LCByZXNwZWN0aXZlbHkgKi8NCi0jZGVmaW5lIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMyLCBJQzEsIElDNCBvciBJQzMsIHJlc3BlY3RpdmVseS4gKi8NCi0jZGVmaW5lIFRJTV9JQ1NlbGVjdGlvbl9UUkMgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDMpIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLiAqLw0KLSNkZWZpbmUgSVNfVElNX0lDX1NFTEVDVElPTihTRUxFQ1RJT04pICgoKFNFTEVDVElPTikgPT0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMRUNUSU9OKSA9PSBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX0lDU2VsZWN0aW9uX1RSQykpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DYXB0dXJlX1ByZXNjYWxlciANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKSAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIGVhY2ggdGltZSBhbiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBjYXB0dXJlIGlucHV0LiAqLw0KLSNkZWZpbmUgVElNX0lDUFNDX0RJVjIgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNCkgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX0lDUFNDX0RJVjQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLw0KLSNkZWZpbmUgVElNX0lDUFNDX0RJVjggICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwQykgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLw0KLSNkZWZpbmUgSVNfVElNX0lDX1BSRVNDQUxFUihQUkVTQ0FMRVIpICgoKFBSRVNDQUxFUikgPT0gVElNX0lDUFNDX0RJVjEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFRJTV9JQ1BTQ19ESVYyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fSUNQU0NfRElWNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gVElNX0lDUFNDX0RJVjgpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1faW50ZXJydXB0X3NvdXJjZXMgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX0lUX1VwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkNCi0jZGVmaW5lIFRJTV9JVF9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpDQotI2RlZmluZSBUSU1fSVRfQ0MyICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KQ0KLSNkZWZpbmUgVElNX0lUX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkNCi0jZGVmaW5lIFRJTV9JVF9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApDQotI2RlZmluZSBUSU1fSVRfQ09NICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwKQ0KLSNkZWZpbmUgVElNX0lUX1RyaWdnZXIgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA0MCkNCi0jZGVmaW5lIFRJTV9JVF9CcmVhayAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwODApDQotI2RlZmluZSBJU19USU1fSVQoSVQpICgoKChJVCkgJiAodWludDE2X3QpMHhGRjAwKSA9PSAweDAwMDApICYmICgoSVQpICE9IDB4MDAwMCkpDQotDQotI2RlZmluZSBJU19USU1fR0VUX0lUKElUKSAoKChJVCkgPT0gVElNX0lUX1VwZGF0ZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IFRJTV9JVF9DQzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBUSU1fSVRfQ0MyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gVElNX0lUX0NDMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IFRJTV9JVF9DQzQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBUSU1fSVRfQ09NKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gVElNX0lUX1RyaWdnZXIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBUSU1fSVRfQnJlYWspKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fRE1BX0Jhc2VfYWRkcmVzcyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DUjEgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQ1IyICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX1NNQ1IgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpDQotI2RlZmluZSBUSU1fRE1BQmFzZV9ESUVSICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAzKQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfU1IgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNCkNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0VHUiAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDUpDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DQ01SMSAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA2KQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjIgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNykNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDRVIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDgpDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DTlQgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA5KQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfUFNDICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwQSkNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0FSUiAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMEIpDQotI2RlZmluZSBUSU1fRE1BQmFzZV9SQ1IgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDBDKQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMSAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwRCkNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMEUpDQotI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IzICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDBGKQ0KLSNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSNCAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMCkNCi0jZGVmaW5lIFRJTV9ETUFCYXNlX0JEVFIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTEpDQotI2RlZmluZSBUSU1fRE1BQmFzZV9EQ1IgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEyKQ0KLSNkZWZpbmUgSVNfVElNX0RNQV9CQVNFKEJBU0UpICgoKEJBU0UpID09IFRJTV9ETUFCYXNlX0NSMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX0NSMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX1NNQ1IpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQmFzZV9ESUVSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJhc2VfU1IpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQmFzZV9FR1IpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQmFzZV9DQ01SMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX0NDTVIyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJhc2VfQ0NFUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX0NOVCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX1BTQykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX0FSUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX1JDUikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX0NDUjEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQmFzZV9DQ1IyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJhc2VfQ0NSMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJBU0UpID09IFRJTV9ETUFCYXNlX0NDUjQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCQVNFKSA9PSBUSU1fRE1BQmFzZV9CRFRSKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQkFTRSkgPT0gVElNX0RNQUJhc2VfRENSKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0RNQV9CdXJzdF9MZW5ndGggDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzFCeXRlICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8yQnl0ZXMgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfM0J5dGVzICAgICAgICAgICgodWludDE2X3QpMHgwMjAwKQ0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzRCeXRlcyAgICAgICAgICAoKHVpbnQxNl90KTB4MDMwMCkNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF81Qnl0ZXMgICAgICAgICAgKCh1aW50MTZfdCkweDA0MDApDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfNkJ5dGVzICAgICAgICAgICgodWludDE2X3QpMHgwNTAwKQ0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzdCeXRlcyAgICAgICAgICAoKHVpbnQxNl90KTB4MDYwMCkNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF84Qnl0ZXMgICAgICAgICAgKCh1aW50MTZfdCkweDA3MDApDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfOUJ5dGVzICAgICAgICAgICgodWludDE2X3QpMHgwODAwKQ0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEwQnl0ZXMgICAgICAgICAoKHVpbnQxNl90KTB4MDkwMCkNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xMUJ5dGVzICAgICAgICAgKCh1aW50MTZfdCkweDBBMDApDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTJCeXRlcyAgICAgICAgICgodWludDE2X3QpMHgwQjAwKQ0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEzQnl0ZXMgICAgICAgICAoKHVpbnQxNl90KTB4MEMwMCkNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xNEJ5dGVzICAgICAgICAgKCh1aW50MTZfdCkweDBEMDApDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTVCeXRlcyAgICAgICAgICgodWludDE2X3QpMHgwRTAwKQ0KLSNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE2Qnl0ZXMgICAgICAgICAoKHVpbnQxNl90KTB4MEYwMCkNCi0jZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xN0J5dGVzICAgICAgICAgKCh1aW50MTZfdCkweDEwMDApDQotI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMThCeXRlcyAgICAgICAgICgodWludDE2X3QpMHgxMTAwKQ0KLSNkZWZpbmUgSVNfVElNX0RNQV9MRU5HVEgoTEVOR1RIKSAoKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF8xQnl0ZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF8yQnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQnVyc3RMZW5ndGhfM0J5dGVzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJ1cnN0TGVuZ3RoXzRCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF81Qnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQnVyc3RMZW5ndGhfNkJ5dGVzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJ1cnN0TGVuZ3RoXzdCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF84Qnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQnVyc3RMZW5ndGhfOUJ5dGVzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJ1cnN0TGVuZ3RoXzEwQnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQnVyc3RMZW5ndGhfMTFCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF8xMkJ5dGVzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJ1cnN0TGVuZ3RoXzEzQnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQnVyc3RMZW5ndGhfMTRCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF8xNUJ5dGVzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVElNX0RNQUJ1cnN0TGVuZ3RoXzE2Qnl0ZXMpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBUSU1fRE1BQnVyc3RMZW5ndGhfMTdCeXRlcykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRU5HVEgpID09IFRJTV9ETUFCdXJzdExlbmd0aF8xOEJ5dGVzKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0RNQV9zb3VyY2VzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9ETUFfVXBkYXRlICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApDQotI2RlZmluZSBUSU1fRE1BX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMjAwKQ0KLSNkZWZpbmUgVElNX0RNQV9DQzIgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDQwMCkNCi0jZGVmaW5lIFRJTV9ETUFfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA4MDApDQotI2RlZmluZSBUSU1fRE1BX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwKQ0KLSNkZWZpbmUgVElNX0RNQV9DT00gICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MjAwMCkNCi0jZGVmaW5lIFRJTV9ETUFfVHJpZ2dlciAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDQwMDApDQotI2RlZmluZSBJU19USU1fRE1BX1NPVVJDRShTT1VSQ0UpICgoKChTT1VSQ0UpICYgKHVpbnQxNl90KTB4ODBGRikgPT0gMHgwMDAwKSAmJiAoKFNPVVJDRSkgIT0gMHgwMDAwKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4dGVybmFsX1RyaWdnZXJfUHJlc2NhbGVyIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9FeHRUUkdQU0NfT0ZGICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBUSU1fRXh0VFJHUFNDX0RJVjIgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwKQ0KLSNkZWZpbmUgVElNX0V4dFRSR1BTQ19ESVY0ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MjAwMCkNCi0jZGVmaW5lIFRJTV9FeHRUUkdQU0NfRElWOCAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDMwMDApDQotI2RlZmluZSBJU19USU1fRVhUX1BSRVNDQUxFUihQUkVTQ0FMRVIpICgoKFBSRVNDQUxFUikgPT0gVElNX0V4dFRSR1BTQ19PRkYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fRXh0VFJHUFNDX0RJVjIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fRXh0VFJHUFNDX0RJVjQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBUSU1fRXh0VFJHUFNDX0RJVjgpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fSW50ZXJuYWxfVHJpZ2dlcl9TZWxlY3Rpb24gDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX1RTX0lUUjAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFRJTV9UU19JVFIxICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApDQotI2RlZmluZSBUSU1fVFNfSVRSMiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwKQ0KLSNkZWZpbmUgVElNX1RTX0lUUjMgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAzMCkNCi0jZGVmaW5lIFRJTV9UU19USTFGX0VEICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNDApDQotI2RlZmluZSBUSU1fVFNfVEkxRlAxICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDUwKQ0KLSNkZWZpbmUgVElNX1RTX1RJMkZQMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA2MCkNCi0jZGVmaW5lIFRJTV9UU19FVFJGICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNzApDQotI2RlZmluZSBJU19USU1fVFJJR0dFUl9TRUxFQ1RJT04oU0VMRUNUSU9OKSAoKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIwKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19USTFGX0VEKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19USTFGUDEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTEVDVElPTikgPT0gVElNX1RTX1RJMkZQMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMRUNUSU9OKSA9PSBUSU1fVFNfRVRSRikpDQotI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUl9TRUxFQ1RJT04oU0VMRUNUSU9OKSAoKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIwKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUxFQ1RJT04pID09IFRJTV9UU19JVFIzKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1RJeF9FeHRlcm5hbF9DbG9ja19Tb3VyY2UgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVElNX1RJeEV4dGVybmFsQ0xLMVNvdXJjZV9USTEgICAgICAoKHVpbnQxNl90KTB4MDA1MCkNCi0jZGVmaW5lIFRJTV9USXhFeHRlcm5hbENMSzFTb3VyY2VfVEkyICAgICAgKCh1aW50MTZfdCkweDAwNjApDQotI2RlZmluZSBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMUVEICAgICgodWludDE2X3QpMHgwMDQwKQ0KLSNkZWZpbmUgSVNfVElNX1RJWENMS19TT1VSQ0UoU09VUkNFKSAoKChTT1VSQ0UpID09IFRJTV9USXhFeHRlcm5hbENMSzFTb3VyY2VfVEkxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RJeEV4dGVybmFsQ0xLMVNvdXJjZV9USTIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMUVEKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4dGVybmFsX1RyaWdnZXJfUG9sYXJpdHkgDQotICAqIEB7DQotICAqLyANCi0jZGVmaW5lIFRJTV9FeHRUUkdQb2xhcml0eV9JbnZlcnRlZCAgICAgICAgKCh1aW50MTZfdCkweDgwMDApDQotI2RlZmluZSBUSU1fRXh0VFJHUG9sYXJpdHlfTm9uSW52ZXJ0ZWQgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfVElNX0VYVF9QT0xBUklUWShQT0xBUklUWSkgKCgoUE9MQVJJVFkpID09IFRJTV9FeHRUUkdQb2xhcml0eV9JbnZlcnRlZCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IFRJTV9FeHRUUkdQb2xhcml0eV9Ob25JbnZlcnRlZCkpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1ByZXNjYWxlcl9SZWxvYWRfTW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fUFNDUmVsb2FkTW9kZV9VcGRhdGUgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgVElNX1BTQ1JlbG9hZE1vZGVfSW1tZWRpYXRlICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkNCi0jZGVmaW5lIElTX1RJTV9QUkVTQ0FMRVJfUkVMT0FEKFJFTE9BRCkgKCgoUkVMT0FEKSA9PSBUSU1fUFNDUmVsb2FkTW9kZV9VcGRhdGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVMT0FEKSA9PSBUSU1fUFNDUmVsb2FkTW9kZV9JbW1lZGlhdGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fRm9yY2VkX0FjdGlvbiANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZSAgICAgICAgICAgICgodWludDE2X3QpMHgwMDUwKQ0KLSNkZWZpbmUgVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZSAgICAgICAgICAoKHVpbnQxNl90KTB4MDA0MCkNCi0jZGVmaW5lIElTX1RJTV9GT1JDRURfQUNUSU9OKEFDVElPTikgKCgoQUNUSU9OKSA9PSBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBQ1RJT04pID09IFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fRW5jb2Rlcl9Nb2RlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9FbmNvZGVyTW9kZV9USTEgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBUSU1fRW5jb2Rlck1vZGVfVEkyICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKQ0KLSNkZWZpbmUgVElNX0VuY29kZXJNb2RlX1RJMTIgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMykNCi0jZGVmaW5lIElTX1RJTV9FTkNPREVSX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gVElNX0VuY29kZXJNb2RlX1RJMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fRW5jb2Rlck1vZGVfVEkyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFRJTV9FbmNvZGVyTW9kZV9USTEyKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V2ZW50X1NvdXJjZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfVXBkYXRlICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKQ0KLSNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMikNCi0jZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzIgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpDQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MzICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLSNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDNCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMCkNCi0jZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DT00gICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjApDQotI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfVHJpZ2dlciAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwKQ0KLSNkZWZpbmUgVElNX0V2ZW50U291cmNlX0JyZWFrICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA4MCkNCi0jZGVmaW5lIElTX1RJTV9FVkVOVF9TT1VSQ0UoU09VUkNFKSAoKCgoU09VUkNFKSAmICh1aW50MTZfdCkweEZGMDApID09IDB4MDAwMCkgJiYgKChTT1VSQ0UpICE9IDB4MDAwMCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9VcGRhdGVfU291cmNlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9VcGRhdGVTb3VyY2VfR2xvYmFsICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApIC8qITwgU291cmNlIG9mIHVwZGF0ZSBpcyB0aGUgY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIHNldHRpbmcgb2YgVUcgYml0LCBvciBhbiB1cGRhdGUgZ2VuZXJhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIHRoZSBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIuICovDQotI2RlZmluZSBUSU1fVXBkYXRlU291cmNlX1JlZ3VsYXIgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKSAvKiE8IFNvdXJjZSBvZiB1cGRhdGUgaXMgY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cuICovDQotI2RlZmluZSBJU19USU1fVVBEQVRFX1NPVVJDRShTT1VSQ0UpICgoKFNPVVJDRSkgPT0gVElNX1VwZGF0ZVNvdXJjZV9HbG9iYWwpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBUSU1fVXBkYXRlU291cmNlX1JlZ3VsYXIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3VwdXRfQ29tcGFyZV9QcmVsb2FkX1N0YXRlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9PQ1ByZWxvYWRfRW5hYmxlICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDgpDQotI2RlZmluZSBUSU1fT0NQcmVsb2FkX0Rpc2FibGUgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgSVNfVElNX09DUFJFTE9BRF9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IFRJTV9PQ1ByZWxvYWRfRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gVElNX09DUHJlbG9hZF9EaXNhYmxlKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX091cHV0X0NvbXBhcmVfRmFzdF9TdGF0ZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fT0NGYXN0X0VuYWJsZSAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KQ0KLSNkZWZpbmUgVElNX09DRmFzdF9EaXNhYmxlICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9PQ0ZBU1RfU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBUSU1fT0NGYXN0X0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9PQ0Zhc3RfRGlzYWJsZSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fT3VwdXRfQ29tcGFyZV9DbGVhcl9TdGF0ZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fT0NDbGVhcl9FbmFibGUgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDgwKQ0KLSNkZWZpbmUgVElNX09DQ2xlYXJfRGlzYWJsZSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9PQ0NMRUFSX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gVElNX09DQ2xlYXJfRW5hYmxlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9PQ0NsZWFyX0Rpc2FibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9PdXRwdXRfU291cmNlIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFRJTV9UUkdPU291cmNlX1Jlc2V0ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBUSU1fVFJHT1NvdXJjZV9FbmFibGUgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwKQ0KLSNkZWZpbmUgVElNX1RSR09Tb3VyY2VfVXBkYXRlICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAyMCkNCi0jZGVmaW5lIFRJTV9UUkdPU291cmNlX09DMSAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMzApDQotI2RlZmluZSBUSU1fVFJHT1NvdXJjZV9PQzFSZWYgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwKQ0KLSNkZWZpbmUgVElNX1RSR09Tb3VyY2VfT0MyUmVmICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA1MCkNCi0jZGVmaW5lIFRJTV9UUkdPU291cmNlX09DM1JlZiAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNjApDQotI2RlZmluZSBUSU1fVFJHT1NvdXJjZV9PQzRSZWYgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDcwKQ0KLSNkZWZpbmUgSVNfVElNX1RSR09fU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBUSU1fVFJHT1NvdXJjZV9SZXNldCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBUSU1fVFJHT1NvdXJjZV9FbmFibGUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09Tb3VyY2VfVXBkYXRlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFRJTV9UUkdPU291cmNlX09DMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBUSU1fVFJHT1NvdXJjZV9PQzFSZWYpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNPVVJDRSkgPT0gVElNX1RSR09Tb3VyY2VfT0MyUmVmKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFRJTV9UUkdPU291cmNlX09DM1JlZikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU09VUkNFKSA9PSBUSU1fVFJHT1NvdXJjZV9PQzRSZWYpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBUSU1fU2xhdmVfTW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fU2xhdmVNb2RlX1Jlc2V0ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA0KQ0KLSNkZWZpbmUgVElNX1NsYXZlTW9kZV9HYXRlZCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNSkNCi0jZGVmaW5lIFRJTV9TbGF2ZU1vZGVfVHJpZ2dlciAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDYpDQotI2RlZmluZSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMSAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA3KQ0KLSNkZWZpbmUgSVNfVElNX1NMQVZFX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gVElNX1NsYXZlTW9kZV9SZXNldCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX1NsYXZlTW9kZV9HYXRlZCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gVElNX1NsYXZlTW9kZV9UcmlnZ2VyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9NYXN0ZXJfU2xhdmVfTW9kZSANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fTWFzdGVyU2xhdmVNb2RlX0VuYWJsZSAgICAgICAgICgodWludDE2X3QpMHgwMDgwKQ0KLSNkZWZpbmUgVElNX01hc3RlclNsYXZlTW9kZV9EaXNhYmxlICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1RJTV9NU01fU1RBVEUoU1RBVEUpICgoKFNUQVRFKSA9PSBUSU1fTWFzdGVyU2xhdmVNb2RlX0VuYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFRJTV9NYXN0ZXJTbGF2ZU1vZGVfRGlzYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9GbGFncyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBUSU1fRkxBR19VcGRhdGUgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKQ0KLSNkZWZpbmUgVElNX0ZMQUdfQ0MxICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMikNCi0jZGVmaW5lIFRJTV9GTEFHX0NDMiAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpDQotI2RlZmluZSBUSU1fRkxBR19DQzMgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLSNkZWZpbmUgVElNX0ZMQUdfQ0M0ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMCkNCi0jZGVmaW5lIFRJTV9GTEFHX0NPTSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjApDQotI2RlZmluZSBUSU1fRkxBR19UcmlnZ2VyICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwKQ0KLSNkZWZpbmUgVElNX0ZMQUdfQnJlYWsgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA4MCkNCi0jZGVmaW5lIFRJTV9GTEFHX0NDMU9GICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDApDQotI2RlZmluZSBUSU1fRkxBR19DQzJPRiAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDAwKQ0KLSNkZWZpbmUgVElNX0ZMQUdfQ0MzT0YgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDgwMCkNCi0jZGVmaW5lIFRJTV9GTEFHX0NDNE9GICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDEwMDApDQotI2RlZmluZSBJU19USU1fR0VUX0ZMQUcoRkxBRykgKCgoRkxBRykgPT0gVElNX0ZMQUdfVXBkYXRlKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ0MxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ0MyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ0MzKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ0M0KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ09NKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfVHJpZ2dlcikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFRJTV9GTEFHX0JyZWFrKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ0MxT0YpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBUSU1fRkxBR19DQzJPRikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFRJTV9GTEFHX0NDM09GKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVElNX0ZMQUdfQ0M0T0YpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBJU19USU1fQ0xFQVJfRkxBRyhUSU1fRkxBRykgKCgoKFRJTV9GTEFHKSAmICh1aW50MTZfdCkweEUxMDApID09IDB4MDAwMCkgJiYgKChUSU1fRkxBRykgIT0gMHgwMDAwKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfRmlsZXJfVmFsdWUgDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgSVNfVElNX0lDX0ZJTFRFUihJQ0ZJTFRFUikgKChJQ0ZJTFRFUikgPD0gMHhGKSANCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX0V4dGVybmFsX1RyaWdnZXJfRmlsdGVyIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElTX1RJTV9FWFRfRklMVEVSKEVYVEZJTFRFUikgKChFWFRGSUxURVIpIDw9IDB4RikNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotdm9pZCBUSU1fRGVJbml0KFRJTV9UeXBlRGVmKiBUSU14KTsNCi12b2lkIFRJTV9UaW1lQmFzZUluaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmKiBUSU1fVGltZUJhc2VJbml0U3RydWN0KTsNCi12b2lkIFRJTV9PQzFJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fT0NJbml0VHlwZURlZiogVElNX09DSW5pdFN0cnVjdCk7DQotdm9pZCBUSU1fT0MySW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpOw0KLXZvaWQgVElNX09DM0luaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KTsNCi12b2lkIFRJTV9PQzRJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fT0NJbml0VHlwZURlZiogVElNX09DSW5pdFN0cnVjdCk7DQotdm9pZCBUSU1fSUNJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCk7DQotdm9pZCBUSU1fUFdNSUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgVElNX0lDSW5pdFR5cGVEZWYqIFRJTV9JQ0luaXRTdHJ1Y3QpOw0KLXZvaWQgVElNX0JEVFJDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9CRFRSSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCk7DQotdm9pZCBUSU1fVGltZUJhc2VTdHJ1Y3RJbml0KFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmKiBUSU1fVGltZUJhc2VJbml0U3RydWN0KTsNCi12b2lkIFRJTV9PQ1N0cnVjdEluaXQoVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpOw0KLXZvaWQgVElNX0lDU3RydWN0SW5pdChUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCk7DQotdm9pZCBUSU1fQkRUUlN0cnVjdEluaXQoVElNX0JEVFJJbml0VHlwZURlZiogVElNX0JEVFJJbml0U3RydWN0KTsNCi12b2lkIFRJTV9DbWQoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBUSU1fQ3RybFBXTU91dHB1dHMoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBUSU1fSVRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFRJTV9HZW5lcmF0ZUV2ZW50KFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXZlbnRTb3VyY2UpOw0KLXZvaWQgVElNX0RNQUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0RNQUJhc2UsIHVpbnQxNl90IFRJTV9ETUFCdXJzdExlbmd0aCk7DQotdm9pZCBUSU1fRE1BQ21kKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRE1BU291cmNlLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgVElNX0ludGVybmFsQ2xvY2tDb25maWcoVElNX1R5cGVEZWYqIFRJTXgpOw0KLXZvaWQgVElNX0lUUnhFeHRlcm5hbENsb2NrQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSW5wdXRUcmlnZ2VyU291cmNlKTsNCi12b2lkIFRJTV9USXhFeHRlcm5hbENsb2NrQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgSUNGaWx0ZXIpOw0KLXZvaWQgVElNX0VUUkNsb2NrTW9kZTFDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9FeHRUUkdQcmVzY2FsZXIsIHVpbnQxNl90IFRJTV9FeHRUUkdQb2xhcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IEV4dFRSR0ZpbHRlcik7DQotdm9pZCBUSU1fRVRSQ2xvY2tNb2RlMkNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0V4dFRSR1ByZXNjYWxlciwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksIHVpbnQxNl90IEV4dFRSR0ZpbHRlcik7DQotdm9pZCBUSU1fRVRSQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IEV4dFRSR0ZpbHRlcik7DQotdm9pZCBUSU1fUHJlc2NhbGVyQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBQcmVzY2FsZXIsIHVpbnQxNl90IFRJTV9QU0NSZWxvYWRNb2RlKTsNCi12b2lkIFRJTV9Db3VudGVyTW9kZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NvdW50ZXJNb2RlKTsNCi12b2lkIFRJTV9TZWxlY3RJbnB1dFRyaWdnZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpOw0KLXZvaWQgVElNX0VuY29kZXJJbnRlcmZhY2VDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9FbmNvZGVyTW9kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQzFQb2xhcml0eSwgdWludDE2X3QgVElNX0lDMlBvbGFyaXR5KTsNCi12b2lkIFRJTV9Gb3JjZWRPQzFDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pOw0KLXZvaWQgVElNX0ZvcmNlZE9DMkNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZvcmNlZEFjdGlvbik7DQotdm9pZCBUSU1fRm9yY2VkT0MzQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRm9yY2VkQWN0aW9uKTsNCi12b2lkIFRJTV9Gb3JjZWRPQzRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pOw0KLXZvaWQgVElNX0FSUlByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBUSU1fU2VsZWN0Q09NKFRJTV9UeXBlRGVmKiBUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgVElNX1NlbGVjdENDRE1BKFRJTV9UeXBlRGVmKiBUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgVElNX0NDUHJlbG9hZENvbnRyb2woVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBUSU1fT0MxUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCk7DQotdm9pZCBUSU1fT0MyUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCk7DQotdm9pZCBUSU1fT0MzUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCk7DQotdm9pZCBUSU1fT0M0UHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCk7DQotdm9pZCBUSU1fT0MxRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCk7DQotdm9pZCBUSU1fT0MyRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCk7DQotdm9pZCBUSU1fT0MzRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCk7DQotdm9pZCBUSU1fT0M0RmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCk7DQotdm9pZCBUSU1fQ2xlYXJPQzFSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKTsNCi12b2lkIFRJTV9DbGVhck9DMlJlZihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DQ2xlYXIpOw0KLXZvaWQgVElNX0NsZWFyT0MzUmVmKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NDbGVhcik7DQotdm9pZCBUSU1fQ2xlYXJPQzRSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKTsNCi12b2lkIFRJTV9PQzFQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpOw0KLXZvaWQgVElNX09DMU5Qb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DTlBvbGFyaXR5KTsNCi12b2lkIFRJTV9PQzJQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpOw0KLXZvaWQgVElNX09DMk5Qb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DTlBvbGFyaXR5KTsNCi12b2lkIFRJTV9PQzNQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpOw0KLXZvaWQgVElNX09DM05Qb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DTlBvbGFyaXR5KTsNCi12b2lkIFRJTV9PQzRQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpOw0KLXZvaWQgVElNX0NDeENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NoYW5uZWwsIHVpbnQxNl90IFRJTV9DQ3gpOw0KLXZvaWQgVElNX0NDeE5DbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9DaGFubmVsLCB1aW50MTZfdCBUSU1fQ0N4Tik7DQotdm9pZCBUSU1fU2VsZWN0T0N4TShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NoYW5uZWwsIHVpbnQxNl90IFRJTV9PQ01vZGUpOw0KLXZvaWQgVElNX1VwZGF0ZURpc2FibGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBUSU1fVXBkYXRlUmVxdWVzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1VwZGF0ZVNvdXJjZSk7DQotdm9pZCBUSU1fU2VsZWN0SGFsbFNlbnNvcihUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFRJTV9TZWxlY3RPbmVQdWxzZU1vZGUoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PUE1vZGUpOw0KLXZvaWQgVElNX1NlbGVjdE91dHB1dFRyaWdnZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9UUkdPU291cmNlKTsNCi12b2lkIFRJTV9TZWxlY3RTbGF2ZU1vZGUoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9TbGF2ZU1vZGUpOw0KLXZvaWQgVElNX1NlbGVjdE1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX01hc3RlclNsYXZlTW9kZSk7DQotdm9pZCBUSU1fU2V0Q291bnRlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgQ291bnRlcik7DQotdm9pZCBUSU1fU2V0QXV0b3JlbG9hZChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgQXV0b3JlbG9hZCk7DQotdm9pZCBUSU1fU2V0Q29tcGFyZTEoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IENvbXBhcmUxKTsNCi12b2lkIFRJTV9TZXRDb21wYXJlMihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgQ29tcGFyZTIpOw0KLXZvaWQgVElNX1NldENvbXBhcmUzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb21wYXJlMyk7DQotdm9pZCBUSU1fU2V0Q29tcGFyZTQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IENvbXBhcmU0KTsNCi12b2lkIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BTQyk7DQotdm9pZCBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpOw0KLXZvaWQgVElNX1NldElDM1ByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUFNDKTsNCi12b2lkIFRJTV9TZXRJQzRQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BTQyk7DQotdm9pZCBUSU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NLRCk7DQotdWludDE2X3QgVElNX0dldENhcHR1cmUxKFRJTV9UeXBlRGVmKiBUSU14KTsNCi11aW50MTZfdCBUSU1fR2V0Q2FwdHVyZTIoVElNX1R5cGVEZWYqIFRJTXgpOw0KLXVpbnQxNl90IFRJTV9HZXRDYXB0dXJlMyhUSU1fVHlwZURlZiogVElNeCk7DQotdWludDE2X3QgVElNX0dldENhcHR1cmU0KFRJTV9UeXBlRGVmKiBUSU14KTsNCi11aW50MTZfdCBUSU1fR2V0Q291bnRlcihUSU1fVHlwZURlZiogVElNeCk7DQotdWludDE2X3QgVElNX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCk7DQotRmxhZ1N0YXR1cyBUSU1fR2V0RmxhZ1N0YXR1cyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZMQUcpOw0KLXZvaWQgVElNX0NsZWFyRmxhZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZMQUcpOw0KLUlUU3RhdHVzIFRJTV9HZXRJVFN0YXR1cyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lUKTsNCi12b2lkIFRJTV9DbGVhcklUUGVuZGluZ0JpdChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lUKTsNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmIC8qX19TVE0zMkYxMHhfVElNX0ggKi8NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfdXNhcnQuaCBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X3VzYXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkM2MzODEuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfdXNhcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfdXNhcnQuaA0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlcyBmb3IgdGhlIFVTQVJUIA0KLSAgKiAgICAgICAgICBmaXJtd2FyZSBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X1VTQVJUX0gNCi0jZGVmaW5lIF9fU1RNMzJGMTB4X1VTQVJUX0gNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi0gZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAYWRkdG9ncm91cCBVU0FSVA0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9UeXBlcw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIFVTQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8gDQotICANCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIHVpbnQzMl90IFVTQVJUX0JhdWRSYXRlOyAgICAgICAgICAgIC8qITwgVGhpcyBtZW1iZXIgY29uZmlndXJlcyB0aGUgVVNBUlQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXVkIHJhdGUgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJbnRlZ2VyRGl2aWRlciA9ICgoUENMS3gpIC8gKDE2ICogKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0JhdWRSYXRlKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEZyYWN0aW9uYWxEaXZpZGVyID0gKChJbnRlZ2VyRGl2aWRlciAtICgodTMyKSBJbnRlZ2VyRGl2aWRlcikpICogMTYpICsgMC41ICovDQotDQotICB1aW50MTZfdCBVU0FSVF9Xb3JkTGVuZ3RoOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX1dvcmRfTGVuZ3RoICovDQotDQotICB1aW50MTZfdCBVU0FSVF9TdG9wQml0czsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0cmFuc21pdHRlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9TdG9wX0JpdHMgKi8NCi0NCi0gIHVpbnQxNl90IFVTQVJUX1Bhcml0eTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwYXJpdHkgbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9QYXJpdHkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgV2hlbiBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlIGNvbXB1dGVkIHBhcml0eSBpcyBpbnNlcnRlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgTVNCIHBvc2l0aW9uIG9mIHRoZSB0cmFuc21pdHRlZCBkYXRhICg5dGggYml0IHdoZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOCBkYXRhIGJpdHMpLiAqLw0KLSANCi0gIHVpbnQxNl90IFVTQVJUX01vZGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTW9kZSAqLw0KLQ0KLSAgdWludDE2X3QgVVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbDsgLyohPCBTcGVjaWZpZXMgd2V0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcyBlbmFibGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpc2FibGVkLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbCAqLw0KLX0gVVNBUlRfSW5pdFR5cGVEZWY7DQotDQotLyoqIA0KLSAgKiBAYnJpZWYgIFVTQVJUIENsb2NrIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24gIA0KLSAgKi8gDQotICANCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0NCi0gIHVpbnQxNl90IFVTQVJUX0Nsb2NrOyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVTQVJUIGNsb2NrIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfQ2xvY2sgKi8NCi0NCi0gIHVpbnQxNl90IFVTQVJUX0NQT0w7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgdmFsdWUgb2YgdGhlIHNlcmlhbCBjbG9jay4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9DbG9ja19Qb2xhcml0eSAqLw0KLQ0KLSAgdWludDE2X3QgVVNBUlRfQ1BIQTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIHRyYW5zaXRpb24gb24gd2hpY2ggdGhlIGJpdCBjYXB0dXJlIGlzIG1hZGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfQ2xvY2tfUGhhc2UgKi8NCi0NCi0gIHVpbnQxNl90IFVTQVJUX0xhc3RCaXQ7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNsb2NrIHB1bHNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgdHJhbnNtaXR0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBiaXQgKE1TQikgaGFzIHRvIGJlIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MYXN0X0JpdCAqLw0KLX0gVVNBUlRfQ2xvY2tJbml0VHlwZURlZjsNCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfQ29uc3RhbnRzDQotICAqIEB7DQotICAqLyANCi0gIA0KLSNkZWZpbmUgSVNfVVNBUlRfQUxMX1BFUklQSChQRVJJUEgpICgoKFBFUklQSCkgPT0gVVNBUlQxKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBVU0FSVDIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFVTQVJUMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVUFSVDQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFVBUlQ1KSkNCi0NCi0jZGVmaW5lIElTX1VTQVJUXzEyM19QRVJJUEgoUEVSSVBIKSAoKChQRVJJUEgpID09IFVTQVJUMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklQSCkgPT0gVVNBUlQyKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVSSVBIKSA9PSBVU0FSVDMpKQ0KLQ0KLSNkZWZpbmUgSVNfVVNBUlRfMTIzNF9QRVJJUEgoUEVSSVBIKSAoKChQRVJJUEgpID09IFVTQVJUMSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFVTQVJUMikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFVTQVJUMykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJUEgpID09IFVBUlQ0KSkNCi0vKiogQGRlZmdyb3VwIFVTQVJUX1dvcmRfTGVuZ3RoIA0KLSAgKiBAew0KLSAgKi8gDQotICANCi0jZGVmaW5lIFVTQVJUX1dvcmRMZW5ndGhfOGIgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFVTQVJUX1dvcmRMZW5ndGhfOWIgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MTAwMCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIElTX1VTQVJUX1dPUkRfTEVOR1RIKExFTkdUSCkgKCgoTEVOR1RIKSA9PSBVU0FSVF9Xb3JkTGVuZ3RoXzhiKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gVVNBUlRfV29yZExlbmd0aF85YikpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX1N0b3BfQml0cyANCi0gICogQHsNCi0gICovIA0KLSAgDQotI2RlZmluZSBVU0FSVF9TdG9wQml0c18xICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBVU0FSVF9TdG9wQml0c18wXzUgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDEwMDApDQotI2RlZmluZSBVU0FSVF9TdG9wQml0c18yICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDIwMDApDQotI2RlZmluZSBVU0FSVF9TdG9wQml0c18xXzUgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDMwMDApDQotI2RlZmluZSBJU19VU0FSVF9TVE9QQklUUyhTVE9QQklUUykgKCgoU1RPUEJJVFMpID09IFVTQVJUX1N0b3BCaXRzXzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVE9QQklUUykgPT0gVVNBUlRfU3RvcEJpdHNfMF81KSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RPUEJJVFMpID09IFVTQVJUX1N0b3BCaXRzXzIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVE9QQklUUykgPT0gVVNBUlRfU3RvcEJpdHNfMV81KSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfUGFyaXR5IA0KLSAgKiBAew0KLSAgKi8gDQotICANCi0jZGVmaW5lIFVTQVJUX1Bhcml0eV9ObyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFVTQVJUX1Bhcml0eV9FdmVuICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDQwMCkNCi0jZGVmaW5lIFVTQVJUX1Bhcml0eV9PZGQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDYwMCkgDQotI2RlZmluZSBJU19VU0FSVF9QQVJJVFkoUEFSSVRZKSAoKChQQVJJVFkpID09IFVTQVJUX1Bhcml0eV9ObykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEFSSVRZKSA9PSBVU0FSVF9QYXJpdHlfRXZlbikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEFSSVRZKSA9PSBVU0FSVF9QYXJpdHlfT2RkKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTW9kZSANCi0gICogQHsNCi0gICovIA0KLSAgDQotI2RlZmluZSBVU0FSVF9Nb2RlX1J4ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpDQotI2RlZmluZSBVU0FSVF9Nb2RlX1R4ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDgpDQotI2RlZmluZSBJU19VU0FSVF9NT0RFKE1PREUpICgoKChNT0RFKSAmICh1aW50MTZfdCkweEZGRjMpID09IDB4MDApICYmICgoTU9ERSkgIT0gKHVpbnQxNl90KTB4MDApKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9IYXJkd2FyZV9GbG93X0NvbnRyb2wgDQotICAqIEB7DQotICAqLyANCi0jZGVmaW5lIFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfTm9uZSAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfUlRTICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkNCi0jZGVmaW5lIFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfQ1RTICAgICAgICAoKHVpbnQxNl90KTB4MDIwMCkNCi0jZGVmaW5lIFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfUlRTX0NUUyAgICAoKHVpbnQxNl90KTB4MDMwMCkNCi0jZGVmaW5lIElTX1VTQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChDT05UUk9MKVwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDT05UUk9MKSA9PSBVU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sX05vbmUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05UUk9MKSA9PSBVU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sX1JUUykgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTlRST0wpID09IFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfQ1RTKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OVFJPTCkgPT0gVVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbF9SVFNfQ1RTKSkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfQ2xvY2sgDQotICAqIEB7DQotICAqLyANCi0jZGVmaW5lIFVTQVJUX0Nsb2NrX0Rpc2FibGUgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFVTQVJUX0Nsb2NrX0VuYWJsZSAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDgwMCkNCi0jZGVmaW5lIElTX1VTQVJUX0NMT0NLKENMT0NLKSAoKChDTE9DSykgPT0gVVNBUlRfQ2xvY2tfRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBVU0FSVF9DbG9ja19FbmFibGUpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9DbG9ja19Qb2xhcml0eSANCi0gICogQHsNCi0gICovDQotICANCi0jZGVmaW5lIFVTQVJUX0NQT0xfTG93ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIFVTQVJUX0NQT0xfSGlnaCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDQwMCkNCi0jZGVmaW5lIElTX1VTQVJUX0NQT0woQ1BPTCkgKCgoQ1BPTCkgPT0gVVNBUlRfQ1BPTF9Mb3cpIHx8ICgoQ1BPTCkgPT0gVVNBUlRfQ1BPTF9IaWdoKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfQ2xvY2tfUGhhc2UNCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBVU0FSVF9DUEhBXzFFZGdlICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBVU0FSVF9DUEhBXzJFZGdlICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDApDQotI2RlZmluZSBJU19VU0FSVF9DUEhBKENQSEEpICgoKENQSEEpID09IFVTQVJUX0NQSEFfMUVkZ2UpIHx8ICgoQ1BIQSkgPT0gVVNBUlRfQ1BIQV8yRWRnZSkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfTGFzdF9CaXQNCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBVU0FSVF9MYXN0Qml0X0Rpc2FibGUgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDApDQotI2RlZmluZSBVU0FSVF9MYXN0Qml0X0VuYWJsZSAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApDQotI2RlZmluZSBJU19VU0FSVF9MQVNUQklUKExBU1RCSVQpICgoKExBU1RCSVQpID09IFVTQVJUX0xhc3RCaXRfRGlzYWJsZSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMQVNUQklUKSA9PSBVU0FSVF9MYXN0Qml0X0VuYWJsZSkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0ludGVycnVwdF9kZWZpbml0aW9uIA0KLSAgKiBAew0KLSAgKi8NCi0gIA0KLSNkZWZpbmUgVVNBUlRfSVRfUEUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDI4KQ0KLSNkZWZpbmUgVVNBUlRfSVRfVFhFICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNzI3KQ0KLSNkZWZpbmUgVVNBUlRfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNjI2KQ0KLSNkZWZpbmUgVVNBUlRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNTI1KQ0KLSNkZWZpbmUgVVNBUlRfSVRfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDI0KQ0KLSNkZWZpbmUgVVNBUlRfSVRfTEJEICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwODQ2KQ0KLSNkZWZpbmUgVVNBUlRfSVRfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwOTZBKQ0KLSNkZWZpbmUgVVNBUlRfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDYwKQ0KLSNkZWZpbmUgVVNBUlRfSVRfT1JFICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMzYwKQ0KLSNkZWZpbmUgVVNBUlRfSVRfTkUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMjYwKQ0KLSNkZWZpbmUgVVNBUlRfSVRfRkUgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMTYwKQ0KLSNkZWZpbmUgSVNfVVNBUlRfQ09ORklHX0lUKElUKSAoKChJVCkgPT0gVVNBUlRfSVRfUEUpIHx8ICgoSVQpID09IFVTQVJUX0lUX1RYRSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBVU0FSVF9JVF9UQykgfHwgKChJVCkgPT0gVVNBUlRfSVRfUlhORSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBVU0FSVF9JVF9JRExFKSB8fCAoKElUKSA9PSBVU0FSVF9JVF9MQkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gVVNBUlRfSVRfQ1RTKSB8fCAoKElUKSA9PSBVU0FSVF9JVF9FUlIpKQ0KLSNkZWZpbmUgSVNfVVNBUlRfR0VUX0lUKElUKSAoKChJVCkgPT0gVVNBUlRfSVRfUEUpIHx8ICgoSVQpID09IFVTQVJUX0lUX1RYRSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBVU0FSVF9JVF9UQykgfHwgKChJVCkgPT0gVVNBUlRfSVRfUlhORSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBVU0FSVF9JVF9JRExFKSB8fCAoKElUKSA9PSBVU0FSVF9JVF9MQkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gVVNBUlRfSVRfQ1RTKSB8fCAoKElUKSA9PSBVU0FSVF9JVF9PUkUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gVVNBUlRfSVRfTkUpIHx8ICgoSVQpID09IFVTQVJUX0lUX0ZFKSkNCi0jZGVmaW5lIElTX1VTQVJUX0NMRUFSX0lUKElUKSAoKChJVCkgPT0gVVNBUlRfSVRfVEMpIHx8ICgoSVQpID09IFVTQVJUX0lUX1JYTkUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJVCkgPT0gVVNBUlRfSVRfTEJEKSB8fCAoKElUKSA9PSBVU0FSVF9JVF9DVFMpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0RNQV9SZXF1ZXN0cyANCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBVU0FSVF9ETUFSZXFfVHggICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwODApDQotI2RlZmluZSBVU0FSVF9ETUFSZXFfUnggICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNDApDQotI2RlZmluZSBJU19VU0FSVF9ETUFSRVEoRE1BUkVRKSAoKCgoRE1BUkVRKSAmICh1aW50MTZfdCkweEZGM0YpID09IDB4MDApICYmICgoRE1BUkVRKSAhPSAodWludDE2X3QpMHgwMCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX1dha2VVcF9tZXRob2RzDQotICAqIEB7DQotICAqLw0KLQ0KLSNkZWZpbmUgVVNBUlRfV2FrZVVwX0lkbGVMaW5lICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgVVNBUlRfV2FrZVVwX0FkZHJlc3NNYXJrICAgICAgICAgICAgICgodWludDE2X3QpMHgwODAwKQ0KLSNkZWZpbmUgSVNfVVNBUlRfV0FLRVVQKFdBS0VVUCkgKCgoV0FLRVVQKSA9PSBVU0FSVF9XYWtlVXBfSWRsZUxpbmUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBS0VVUCkgPT0gVVNBUlRfV2FrZVVwX0FkZHJlc3NNYXJrKSkNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9MSU5fQnJlYWtfRGV0ZWN0aW9uX0xlbmd0aCANCi0gICogQHsNCi0gICovDQotICANCi0jZGVmaW5lIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoXzEwYiAgICAgICgodWludDE2X3QpMHgwMDAwKQ0KLSNkZWZpbmUgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhfMTFiICAgICAgKCh1aW50MTZfdCkweDAwMjApDQotI2RlZmluZSBJU19VU0FSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChMRU5HVEgpIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTEVOR1RIKSA9PSBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aF8xMGIpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aF8xMWIpKQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0lyREFfTG93X1Bvd2VyIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFVTQVJUX0lyREFNb2RlX0xvd1Bvd2VyICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNCkNCi0jZGVmaW5lIFVTQVJUX0lyREFNb2RlX05vcm1hbCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMCkNCi0jZGVmaW5lIElTX1VTQVJUX0lSREFfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBVU0FSVF9JckRBTW9kZV9Mb3dQb3dlcikgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFVTQVJUX0lyREFNb2RlX05vcm1hbCkpDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX0ZsYWdzIA0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIFVTQVJUX0ZMQUdfQ1RTICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIwMCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfTEJEICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA4MCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA0MCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAyMCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfSURMRSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfT1JFICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNCkNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfRkUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMikNCi0jZGVmaW5lIFVTQVJUX0ZMQUdfUEUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkNCi0jZGVmaW5lIElTX1VTQVJUX0ZMQUcoRkxBRykgKCgoRkxBRykgPT0gVVNBUlRfRkxBR19QRSkgfHwgKChGTEFHKSA9PSBVU0FSVF9GTEFHX1RYRSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBVU0FSVF9GTEFHX1RDKSB8fCAoKEZMQUcpID09IFVTQVJUX0ZMQUdfUlhORSkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBVU0FSVF9GTEFHX0lETEUpIHx8ICgoRkxBRykgPT0gVVNBUlRfRkxBR19MQkQpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVVNBUlRfRkxBR19DVFMpIHx8ICgoRkxBRykgPT0gVVNBUlRfRkxBR19PUkUpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gVVNBUlRfRkxBR19ORSkgfHwgKChGTEFHKSA9PSBVU0FSVF9GTEFHX0ZFKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIElTX1VTQVJUX0NMRUFSX0ZMQUcoRkxBRykgKCgoKEZMQUcpICYgKHVpbnQxNl90KTB4RkM5RikgPT0gMHgwMCkgJiYgKChGTEFHKSAhPSAodWludDE2X3QpMHgwMCkpDQotI2RlZmluZSBJU19VU0FSVF9QRVJJUEhfRkxBRyhQRVJJUEgsIFVTQVJUX0ZMQUcpICgoKCgqKHVpbnQzMl90KikmKFBFUklQSCkpICE9IFVBUlQ0X0JBU0UpICYmXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqKHVpbnQzMl90KikmKFBFUklQSCkpICE9IFVBUlQ1X0JBU0UpKSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKFVTQVJUX0ZMQUcpICE9IFVTQVJUX0ZMQUdfQ1RTKSkgDQotI2RlZmluZSBJU19VU0FSVF9CQVVEUkFURShCQVVEUkFURSkgKCgoQkFVRFJBVEUpID4gMCkgJiYgKChCQVVEUkFURSkgPCAweDAwNDRBQTIxKSkNCi0jZGVmaW5lIElTX1VTQVJUX0FERFJFU1MoQUREUkVTUykgKChBRERSRVNTKSA8PSAweEYpDQotI2RlZmluZSBJU19VU0FSVF9EQVRBKERBVEEpICgoREFUQSkgPD0gMHgxRkYpDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfTWFjcm9zDQotICAqIEB7DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLXZvaWQgVVNBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCk7DQotdm9pZCBVU0FSVF9Jbml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgVVNBUlRfSW5pdFR5cGVEZWYqIFVTQVJUX0luaXRTdHJ1Y3QpOw0KLXZvaWQgVVNBUlRfU3RydWN0SW5pdChVU0FSVF9Jbml0VHlwZURlZiogVVNBUlRfSW5pdFN0cnVjdCk7DQotdm9pZCBVU0FSVF9DbG9ja0luaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBVU0FSVF9DbG9ja0luaXRUeXBlRGVmKiBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOw0KLXZvaWQgVVNBUlRfQ2xvY2tTdHJ1Y3RJbml0KFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYqIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCk7DQotdm9pZCBVU0FSVF9DbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgVVNBUlRfSVRDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFVTQVJUX0RNQUNtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0RNQVJlcSwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFVTQVJUX1NldEFkZHJlc3MoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50OF90IFVTQVJUX0FkZHJlc3MpOw0KLXZvaWQgVVNBUlRfV2FrZVVwQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfV2FrZVVwKTsNCi12b2lkIFVTQVJUX1JlY2VpdmVyV2FrZVVwQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGgpOw0KLXZvaWQgVVNBUlRfTElOQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFVTQVJUX1NlbmREYXRhKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgRGF0YSk7DQotdWludDE2X3QgVVNBUlRfUmVjZWl2ZURhdGEoVVNBUlRfVHlwZURlZiogVVNBUlR4KTsNCi12b2lkIFVTQVJUX1NlbmRCcmVhayhVU0FSVF9UeXBlRGVmKiBVU0FSVHgpOw0KLXZvaWQgVVNBUlRfU2V0R3VhcmRUaW1lKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDhfdCBVU0FSVF9HdWFyZFRpbWUpOw0KLXZvaWQgVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDhfdCBVU0FSVF9QcmVzY2FsZXIpOw0KLXZvaWQgVVNBUlRfU21hcnRDYXJkQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFVTQVJUX1NtYXJ0Q2FyZE5BQ0tDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpOw0KLXZvaWQgVVNBUlRfSGFsZkR1cGxleENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBVU0FSVF9PdmVyU2FtcGxpbmc4Q21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKTsNCi12b2lkIFVTQVJUX09uZUJpdE1ldGhvZENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotdm9pZCBVU0FSVF9JckRBQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSXJEQU1vZGUpOw0KLXZvaWQgVVNBUlRfSXJEQUNtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSk7DQotRmxhZ1N0YXR1cyBVU0FSVF9HZXRGbGFnU3RhdHVzKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfRkxBRyk7DQotdm9pZCBVU0FSVF9DbGVhckZsYWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9GTEFHKTsNCi1JVFN0YXR1cyBVU0FSVF9HZXRJVFN0YXR1cyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0lUKTsNCi12b2lkIFVTQVJUX0NsZWFySVRQZW5kaW5nQml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSVQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkYxMHhfVVNBUlRfSCAqLw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfd3dkZy5oIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL2luYy9zdG0zMmYxMHhfd3dkZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTk1Njk4Li4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9pbmMvc3RtMzJmMTB4X3d3ZGcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfd3dkZy5oDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIGZvciB0aGUgV1dERyBmaXJtd2FyZQ0KLSAgKiAgICAgICAgICBsaWJyYXJ5Lg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaWZuZGVmIF9fU1RNMzJGMTB4X1dXREdfSA0KLSNkZWZpbmUgX19TVE0zMkYxMHhfV1dER19IDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotIGV4dGVybiAiQyIgew0KLSNlbmRpZg0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweC5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGFkZHRvZ3JvdXAgV1dERw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX1R5cGVzDQotICAqIEB7DQotICAqLyANCi0gIA0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0NvbnN0YW50cw0KLSAgKiBAew0KLSAgKi8gDQotICANCi0vKiogQGRlZmdyb3VwIFdXREdfUHJlc2NhbGVyIA0KLSAgKiBAew0KLSAgKi8gDQotICANCi0jZGVmaW5lIFdXREdfUHJlc2NhbGVyXzEgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwKQ0KLSNkZWZpbmUgV1dER19QcmVzY2FsZXJfMiAgICAoKHVpbnQzMl90KTB4MDAwMDAwODApDQotI2RlZmluZSBXV0RHX1ByZXNjYWxlcl80ICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkNCi0jZGVmaW5lIFdXREdfUHJlc2NhbGVyXzggICAgKCh1aW50MzJfdCkweDAwMDAwMTgwKQ0KLSNkZWZpbmUgSVNfV1dER19QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKChQUkVTQ0FMRVIpID09IFdXREdfUHJlc2NhbGVyXzEpIHx8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFU0NBTEVSKSA9PSBXV0RHX1ByZXNjYWxlcl8yKSB8fCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRVNDQUxFUikgPT0gV1dER19QcmVzY2FsZXJfNCkgfHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUkVTQ0FMRVIpID09IFdXREdfUHJlc2NhbGVyXzgpKQ0KLSNkZWZpbmUgSVNfV1dER19XSU5ET1dfVkFMVUUoVkFMVUUpICgoVkFMVUUpIDw9IDB4N0YpDQotI2RlZmluZSBJU19XV0RHX0NPVU5URVIoQ09VTlRFUikgKCgoQ09VTlRFUikgPj0gMHg0MCkgJiYgKChDT1VOVEVSKSA8PSAweDdGKSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8gDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLyANCi0gIA0KLXZvaWQgV1dER19EZUluaXQodm9pZCk7DQotdm9pZCBXV0RHX1NldFByZXNjYWxlcih1aW50MzJfdCBXV0RHX1ByZXNjYWxlcik7DQotdm9pZCBXV0RHX1NldFdpbmRvd1ZhbHVlKHVpbnQ4X3QgV2luZG93VmFsdWUpOw0KLXZvaWQgV1dER19FbmFibGVJVCh2b2lkKTsNCi12b2lkIFdXREdfU2V0Q291bnRlcih1aW50OF90IENvdW50ZXIpOw0KLXZvaWQgV1dER19FbmFibGUodWludDhfdCBDb3VudGVyKTsNCi1GbGFnU3RhdHVzIFdXREdfR2V0RmxhZ1N0YXR1cyh2b2lkKTsNCi12b2lkIFdXREdfQ2xlYXJGbGFnKHZvaWQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19TVE0zMkYxMHhfV1dER19IICovDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9hZGMuYyBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2FkYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNiOWJiLi4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2FkYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNiArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfYWRjLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgQURDIGZpcm13YXJlIGZ1bmN0aW9ucy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweF9hZGMuaCINCi0jaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQyANCi0gICogQGJyaWVmIEFEQyBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiBBREMgRElTQ05VTSBtYXNrICovDQotI2RlZmluZSBDUjFfRElTQ05VTV9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkYxRkZGKQ0KLQ0KLS8qIEFEQyBESVNDRU4gbWFzayAqLw0KLSNkZWZpbmUgQ1IxX0RJU0NFTl9TZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkNCi0jZGVmaW5lIENSMV9ESVNDRU5fUmVzZXQgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkY3RkYpDQotDQotLyogQURDIEpBVVRPIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9KQVVUT19TZXQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA0MDApDQotI2RlZmluZSBDUjFfSkFVVE9fUmVzZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGQkZGKQ0KLQ0KLS8qIEFEQyBKRElTQ0VOIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9KRElTQ0VOX1NldCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDEwMDApDQotI2RlZmluZSBDUjFfSkRJU0NFTl9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZFRkZGKQ0KLQ0KLS8qIEFEQyBBV0RDSCBtYXNrICovDQotI2RlZmluZSBDUjFfQVdEQ0hfUmVzZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkUwKQ0KLQ0KLS8qIEFEQyBBbmFsb2cgd2F0Y2hkb2cgZW5hYmxlIG1vZGUgbWFzayAqLw0KLSNkZWZpbmUgQ1IxX0FXRE1vZGVfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHhGRjNGRkRGRikNCi0NCi0vKiBDUjEgcmVnaXN0ZXIgTWFzayAqLw0KLSNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkYwRkVGRikNCi0NCi0vKiBBREMgQURPTiBtYXNrICovDQotI2RlZmluZSBDUjJfQURPTl9TZXQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQ0KLSNkZWZpbmUgQ1IyX0FET05fUmVzZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZGRSkNCi0NCi0vKiBBREMgRE1BIG1hc2sgKi8NCi0jZGVmaW5lIENSMl9ETUFfU2V0ICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDApDQotI2RlZmluZSBDUjJfRE1BX1Jlc2V0ICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRUZGKQ0KLQ0KLS8qIEFEQyBSU1RDQUwgbWFzayAqLw0KLSNkZWZpbmUgQ1IyX1JTVENBTF9TZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi0NCi0vKiBBREMgQ0FMIG1hc2sgKi8NCi0jZGVmaW5lIENSMl9DQUxfU2V0ICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotDQotLyogQURDIFNXU1RBUlQgbWFzayAqLw0KLSNkZWZpbmUgQ1IyX1NXU1RBUlRfU2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDQwMDAwMCkNCi0NCi0vKiBBREMgRVhUVFJJRyBtYXNrICovDQotI2RlZmluZSBDUjJfRVhUVFJJR19TZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMTAwMDAwKQ0KLSNkZWZpbmUgQ1IyX0VYVFRSSUdfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHhGRkVGRkZGRikNCi0NCi0vKiBBREMgU29mdHdhcmUgc3RhcnQgbWFzayAqLw0KLSNkZWZpbmUgQ1IyX0VYVFRSSUdfU1dTVEFSVF9TZXQgICAgICgodWludDMyX3QpMHgwMDUwMDAwMCkNCi0jZGVmaW5lIENSMl9FWFRUUklHX1NXU1RBUlRfUmVzZXQgICAoKHVpbnQzMl90KTB4RkZBRkZGRkYpDQotDQotLyogQURDIEpFWFRTRUwgbWFzayAqLw0KLSNkZWZpbmUgQ1IyX0pFWFRTRUxfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGOEZGRikNCi0NCi0vKiBBREMgSkVYVFRSSUcgbWFzayAqLw0KLSNkZWZpbmUgQ1IyX0pFWFRUUklHX1NldCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwODAwMCkNCi0jZGVmaW5lIENSMl9KRVhUVFJJR19SZXNldCAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRjdGRkYpDQotDQotLyogQURDIEpTV1NUQVJUIG1hc2sgKi8NCi0jZGVmaW5lIENSMl9KU1dTVEFSVF9TZXQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAyMDAwMDApDQotDQotLyogQURDIGluamVjdGVkIHNvZnR3YXJlIHN0YXJ0IG1hc2sgKi8NCi0jZGVmaW5lIENSMl9KRVhUVFJJR19KU1dTVEFSVF9TZXQgICAoKHVpbnQzMl90KTB4MDAyMDgwMDApDQotI2RlZmluZSBDUjJfSkVYVFRSSUdfSlNXU1RBUlRfUmVzZXQgKCh1aW50MzJfdCkweEZGREY3RkZGKQ0KLQ0KLS8qIEFEQyBUU1BEIG1hc2sgKi8NCi0jZGVmaW5lIENSMl9UU1ZSRUZFX1NldCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQotI2RlZmluZSBDUjJfVFNWUkVGRV9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweEZGN0ZGRkZGKQ0KLQ0KLS8qIENSMiByZWdpc3RlciBNYXNrICovDQotI2RlZmluZSBDUjJfQ0xFQVJfTWFzayAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRjFGN0ZEKQ0KLQ0KLS8qIEFEQyBTUXggbWFzayAqLw0KLSNkZWZpbmUgU1FSM19TUV9TZXQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxRikNCi0jZGVmaW5lIFNRUjJfU1FfU2V0ICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMUYpDQotI2RlZmluZSBTUVIxX1NRX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFGKQ0KLQ0KLS8qIFNRUjEgcmVnaXN0ZXIgTWFzayAqLw0KLSNkZWZpbmUgU1FSMV9DTEVBUl9NYXNrICAgICAgICAgICAgICgodWludDMyX3QpMHhGRjBGRkZGRikNCi0NCi0vKiBBREMgSlNReCBtYXNrICovDQotI2RlZmluZSBKU1FSX0pTUV9TZXQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFGKQ0KLQ0KLS8qIEFEQyBKTCBtYXNrICovDQotI2RlZmluZSBKU1FSX0pMX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMzAwMDAwKQ0KLSNkZWZpbmUgSlNRUl9KTF9SZXNldCAgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkNGRkZGRikNCi0NCi0vKiBBREMgU01QeCBtYXNrICovDQotI2RlZmluZSBTTVBSMV9TTVBfU2V0ICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA3KQ0KLSNkZWZpbmUgU01QUjJfU01QX1NldCAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNykNCi0NCi0vKiBBREMgSkRSeCByZWdpc3RlcnMgb2Zmc2V0ICovDQotI2RlZmluZSBKRFJfT2Zmc2V0ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MjgpDQotDQotLyogQURDMSBEUiByZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8NCi0jZGVmaW5lIERSX0FERFJFU1MgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4NDAwMTI0NEMpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQURDX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIEFEQ3ggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19EZUluaXQoQURDX1R5cGVEZWYqIEFEQ3gpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICANCi0gIGlmIChBREN4ID09IEFEQzEpDQotICB7DQotICAgIC8qIEVuYWJsZSBBREMxIHJlc2V0IHN0YXRlICovDQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfQURDMSwgRU5BQkxFKTsNCi0gICAgLyogUmVsZWFzZSBBREMxIGZyb20gcmVzZXQgc3RhdGUgKi8NCi0gICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMxLCBESVNBQkxFKTsNCi0gIH0NCi0gIGVsc2UgaWYgKEFEQ3ggPT0gQURDMikNCi0gIHsNCi0gICAgLyogRW5hYmxlIEFEQzIgcmVzZXQgc3RhdGUgKi8NCi0gICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMyLCBFTkFCTEUpOw0KLSAgICAvKiBSZWxlYXNlIEFEQzIgZnJvbSByZXNldCBzdGF0ZSAqLw0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX0FEQzIsIERJU0FCTEUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBpZiAoQURDeCA9PSBBREMzKQ0KLSAgICB7DQotICAgICAgLyogRW5hYmxlIEFEQzMgcmVzZXQgc3RhdGUgKi8NCi0gICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX0FEQzMsIEVOQUJMRSk7DQotICAgICAgLyogUmVsZWFzZSBBREMzIGZyb20gcmVzZXQgc3RhdGUgKi8NCi0gICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX0FEQzMsIERJU0FCTEUpOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBBREN4IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycw0KLSAgKiAgIGluIHRoZSBBRENfSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBBRENfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBBRENfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCi0gICogICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBBREMgcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX0luaXQoQURDX1R5cGVEZWYqIEFEQ3gsIEFEQ19Jbml0VHlwZURlZiogQURDX0luaXRTdHJ1Y3QpDQotew0KLSAgdWludDMyX3QgdG1wcmVnMSA9IDA7DQotICB1aW50OF90IHRtcHJlZzIgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX01PREUoQURDX0luaXRTdHJ1Y3QtPkFEQ19Nb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShBRENfSW5pdFN0cnVjdC0+QURDX1NjYW5Db252TW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQURDX0luaXRTdHJ1Y3QtPkFEQ19Db250aW51b3VzQ29udk1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfRVhUX1RSSUcoQURDX0luaXRTdHJ1Y3QtPkFEQ19FeHRlcm5hbFRyaWdDb252KSk7ICAgDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0RBVEFfQUxJR04oQURDX0luaXRTdHJ1Y3QtPkFEQ19EYXRhQWxpZ24pKTsgDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfTEVOR1RIKEFEQ19Jbml0U3RydWN0LT5BRENfTmJyT2ZDaGFubmVsKSk7DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBHZXQgdGhlIEFEQ3ggQ1IxIHZhbHVlICovDQotICB0bXByZWcxID0gQURDeC0+Q1IxOw0KLSAgLyogQ2xlYXIgRFVBTE1PRCBhbmQgU0NBTiBiaXRzICovDQotICB0bXByZWcxICY9IENSMV9DTEVBUl9NYXNrOw0KLSAgLyogQ29uZmlndXJlIEFEQ3g6IER1YWwgbW9kZSBhbmQgc2NhbiBjb252ZXJzaW9uIG1vZGUgKi8NCi0gIC8qIFNldCBEVUFMTU9EIGJpdHMgYWNjb3JkaW5nIHRvIEFEQ19Nb2RlIHZhbHVlICovDQotICAvKiBTZXQgU0NBTiBiaXQgYWNjb3JkaW5nIHRvIEFEQ19TY2FuQ29udk1vZGUgdmFsdWUgKi8NCi0gIHRtcHJlZzEgfD0gKHVpbnQzMl90KShBRENfSW5pdFN0cnVjdC0+QURDX01vZGUgfCAoKHVpbnQzMl90KUFEQ19Jbml0U3RydWN0LT5BRENfU2NhbkNvbnZNb2RlIDw8IDgpKTsNCi0gIC8qIFdyaXRlIHRvIEFEQ3ggQ1IxICovDQotICBBREN4LT5DUjEgPSB0bXByZWcxOw0KLQ0KLSAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFEQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogR2V0IHRoZSBBREN4IENSMiB2YWx1ZSAqLw0KLSAgdG1wcmVnMSA9IEFEQ3gtPkNSMjsNCi0gIC8qIENsZWFyIENPTlQsIEFMSUdOIGFuZCBFWFRTRUwgYml0cyAqLw0KLSAgdG1wcmVnMSAmPSBDUjJfQ0xFQVJfTWFzazsNCi0gIC8qIENvbmZpZ3VyZSBBREN4OiBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGFuZCBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSAqLw0KLSAgLyogU2V0IEFMSUdOIGJpdCBhY2NvcmRpbmcgdG8gQURDX0RhdGFBbGlnbiB2YWx1ZSAqLw0KLSAgLyogU2V0IEVYVFNFTCBiaXRzIGFjY29yZGluZyB0byBBRENfRXh0ZXJuYWxUcmlnQ29udiB2YWx1ZSAqLw0KLSAgLyogU2V0IENPTlQgYml0IGFjY29yZGluZyB0byBBRENfQ29udGludW91c0NvbnZNb2RlIHZhbHVlICovDQotICB0bXByZWcxIHw9ICh1aW50MzJfdCkoQURDX0luaXRTdHJ1Y3QtPkFEQ19EYXRhQWxpZ24gfCBBRENfSW5pdFN0cnVjdC0+QURDX0V4dGVybmFsVHJpZ0NvbnYgfA0KLSAgICAgICAgICAgICgodWludDMyX3QpQURDX0luaXRTdHJ1Y3QtPkFEQ19Db250aW51b3VzQ29udk1vZGUgPDwgMSkpOw0KLSAgLyogV3JpdGUgdG8gQURDeCBDUjIgKi8NCi0gIEFEQ3gtPkNSMiA9IHRtcHJlZzE7DQotDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDeCBTUVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogR2V0IHRoZSBBREN4IFNRUjEgdmFsdWUgKi8NCi0gIHRtcHJlZzEgPSBBREN4LT5TUVIxOw0KLSAgLyogQ2xlYXIgTCBiaXRzICovDQotICB0bXByZWcxICY9IFNRUjFfQ0xFQVJfTWFzazsNCi0gIC8qIENvbmZpZ3VyZSBBREN4OiByZWd1bGFyIGNoYW5uZWwgc2VxdWVuY2UgbGVuZ3RoICovDQotICAvKiBTZXQgTCBiaXRzIGFjY29yZGluZyB0byBBRENfTmJyT2ZDaGFubmVsIHZhbHVlICovDQotICB0bXByZWcyIHw9ICh1aW50OF90KSAoQURDX0luaXRTdHJ1Y3QtPkFEQ19OYnJPZkNoYW5uZWwgLSAodWludDhfdCkxKTsNCi0gIHRtcHJlZzEgfD0gKHVpbnQzMl90KXRtcHJlZzIgPDwgMjA7DQotICAvKiBXcml0ZSB0byBBREN4IFNRUjEgKi8NCi0gIEFEQ3gtPlNRUjEgPSB0bXByZWcxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGaWxscyBlYWNoIEFEQ19Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KLSAgKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0IDogcG9pbnRlciB0byBhbiBBRENfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19TdHJ1Y3RJbml0KEFEQ19Jbml0VHlwZURlZiogQURDX0luaXRTdHJ1Y3QpDQotew0KLSAgLyogUmVzZXQgQURDIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQotICAvKiBJbml0aWFsaXplIHRoZSBBRENfTW9kZSBtZW1iZXIgKi8NCi0gIEFEQ19Jbml0U3RydWN0LT5BRENfTW9kZSA9IEFEQ19Nb2RlX0luZGVwZW5kZW50Ow0KLSAgLyogaW5pdGlhbGl6ZSB0aGUgQURDX1NjYW5Db252TW9kZSBtZW1iZXIgKi8NCi0gIEFEQ19Jbml0U3RydWN0LT5BRENfU2NhbkNvbnZNb2RlID0gRElTQUJMRTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIEFEQ19Db250aW51b3VzQ29udk1vZGUgbWVtYmVyICovDQotICBBRENfSW5pdFN0cnVjdC0+QURDX0NvbnRpbnVvdXNDb252TW9kZSA9IERJU0FCTEU7DQotICAvKiBJbml0aWFsaXplIHRoZSBBRENfRXh0ZXJuYWxUcmlnQ29udiBtZW1iZXIgKi8NCi0gIEFEQ19Jbml0U3RydWN0LT5BRENfRXh0ZXJuYWxUcmlnQ29udiA9IEFEQ19FeHRlcm5hbFRyaWdDb252X1QxX0NDMTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIEFEQ19EYXRhQWxpZ24gbWVtYmVyICovDQotICBBRENfSW5pdFN0cnVjdC0+QURDX0RhdGFBbGlnbiA9IEFEQ19EYXRhQWxpZ25fUmlnaHQ7DQotICAvKiBJbml0aWFsaXplIHRoZSBBRENfTmJyT2ZDaGFubmVsIG1lbWJlciAqLw0KLSAgQURDX0luaXRTdHJ1Y3QtPkFEQ19OYnJPZkNoYW5uZWwgPSAxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQURDeCBwZXJpcGhlcmFsLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19DbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBBRE9OIGJpdCB0byB3YWtlIHVwIHRoZSBBREMgZnJvbSBwb3dlciBkb3duIG1vZGUgKi8NCi0gICAgQURDeC0+Q1IyIHw9IENSMl9BRE9OX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIHBlcmlwaGVyYWwgKi8NCi0gICAgQURDeC0+Q1IyICY9IENSMl9BRE9OX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgQURDIERNQSByZXF1ZXN0Lg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiAgIE5vdGU6IEFEQzIgaGFzbid0IGEgRE1BIGNhcGFiaWxpdHkuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIERNQSB0cmFuc2Zlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfRE1BQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfRE1BX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIERNQSByZXF1ZXN0ICovDQotICAgIEFEQ3gtPkNSMiB8PSBDUjJfRE1BX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIERNQSByZXF1ZXN0ICovDQotICAgIEFEQ3gtPkNSMiAmPSBDUjJfRE1BX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdHMuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQURDX0lUOiBzcGVjaWZpZXMgdGhlIEFEQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBBRENfSVRfRU9DOiBFbmQgb2YgY29udmVyc2lvbiBpbnRlcnJ1cHQgbWFzaw0KLSAgKiAgICAgQGFyZyBBRENfSVRfQVdEOiBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0IG1hc2sNCi0gICogICAgIEBhcmcgQURDX0lUX0pFT0M6IEVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHRzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19JVENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDE2X3QgQURDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgdWludDhfdCBpdG1hc2sgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JVChBRENfSVQpKTsNCi0gIC8qIEdldCB0aGUgQURDIElUIGluZGV4ICovDQotICBpdG1hc2sgPSAodWludDhfdClBRENfSVQ7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0cyAqLw0KLSAgICBBREN4LT5DUjEgfD0gaXRtYXNrOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0cyAqLw0KLSAgICBBREN4LT5DUjEgJj0gKH4odWludDMyX3QpaXRtYXNrKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmVzZXRzIHRoZSBzZWxlY3RlZCBBREMgY2FsaWJyYXRpb24gcmVnaXN0ZXJzLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfUmVzZXRDYWxpYnJhdGlvbihBRENfVHlwZURlZiogQURDeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIC8qIFJlc2V0cyB0aGUgc2VsZWN0ZWQgQURDIGNhbGliYXJ0aW9uIHJlZ2lzdGVycyAqLyAgDQotICBBREN4LT5DUjIgfD0gQ1IyX1JTVENBTF9TZXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdldHMgdGhlIHNlbGVjdGVkIEFEQyByZXNldCBjYWxpYnJhdGlvbiByZWdpc3RlcnMgc3RhdHVzLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQURDIHJlc2V0IGNhbGlicmF0aW9uIHJlZ2lzdGVycyAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotRmxhZ1N0YXR1cyBBRENfR2V0UmVzZXRDYWxpYnJhdGlvblN0YXR1cyhBRENfVHlwZURlZiogQURDeCkNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIFJTVENBTCBiaXQgKi8NCi0gIGlmICgoQURDeC0+Q1IyICYgQ1IyX1JTVENBTF9TZXQpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsNCi0gICAgLyogUlNUQ0FMIGJpdCBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBSU1RDQUwgYml0IGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBSU1RDQUwgYml0IHN0YXR1cyAqLw0KLSAgcmV0dXJuICBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgc2VsZWN0ZWQgQURDIGNhbGlicmF0aW9uIHByb2Nlc3MuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19TdGFydENhbGlicmF0aW9uKEFEQ19UeXBlRGVmKiBBREN4KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY2FsaWJyYXRpb24gcHJvY2VzcyAqLyAgDQotICBBREN4LT5DUjIgfD0gQ1IyX0NBTF9TZXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdldHMgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiBzdGF0dXMuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBBREMgY2FsaWJyYXRpb24gKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUZsYWdTdGF0dXMgQURDX0dldENhbGlicmF0aW9uU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4KQ0KLXsNCi0gIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgQ0FMIGJpdCAqLw0KLSAgaWYgKChBREN4LT5DUjIgJiBDUjJfQ0FMX1NldCkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgew0KLSAgICAvKiBDQUwgYml0IGlzIHNldDogY2FsaWJyYXRpb24gb24gZ29pbmcgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBDQUwgYml0IGlzIHJlc2V0OiBlbmQgb2YgY2FsaWJyYXRpb24gKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIENBTCBiaXQgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgQURDIHNvZnR3YXJlIHN0YXJ0IGNvbnZlcnNpb24gLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBzb2Z0d2FyZSBzdGFydCBjb252ZXJzaW9uLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19Tb2Z0d2FyZVN0YXJ0Q29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBjb252ZXJzaW9uIG9uIGV4dGVybmFsIGV2ZW50IGFuZCBzdGFydCB0aGUgc2VsZWN0ZWQNCi0gICAgICAgQURDIGNvbnZlcnNpb24gKi8NCi0gICAgQURDeC0+Q1IyIHw9IENSMl9FWFRUUklHX1NXU1RBUlRfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCBhbmQgc3RvcCB0aGUgc2VsZWN0ZWQNCi0gICAgICAgQURDIGNvbnZlcnNpb24gKi8NCi0gICAgQURDeC0+Q1IyICY9IENSMl9FWFRUUklHX1NXU1RBUlRfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdldHMgdGhlIHNlbGVjdGVkIEFEQyBTb2Z0d2FyZSBzdGFydCBjb252ZXJzaW9uIFN0YXR1cy4NCi0gICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEFEQyBzb2Z0d2FyZSBzdGFydCBjb252ZXJzaW9uIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIEFEQ19HZXRTb2Z0d2FyZVN0YXJ0Q29udlN0YXR1cyhBRENfVHlwZURlZiogQURDeCkNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIFNXU1RBUlQgYml0ICovDQotICBpZiAoKEFEQ3gtPkNSMiAmIENSMl9TV1NUQVJUX1NldCkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgew0KLSAgICAvKiBTV1NUQVJUIGJpdCBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBTV1NUQVJUIGJpdCBpcyByZXNldCAqLw0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgU1dTVEFSVCBiaXQgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgZGlzY29udGludW91cyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgQURDIHJlZ3VsYXINCi0gICogICBncm91cCBjaGFubmVsLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE51bWJlcjogc3BlY2lmaWVzIHRoZSBkaXNjb250aW51b3VzIG1vZGUgcmVndWxhciBjaGFubmVsDQotICAqICAgY291bnQgdmFsdWUuIFRoaXMgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA4Lg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfRGlzY01vZGVDaGFubmVsQ291bnRDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgTnVtYmVyKQ0KLXsNCi0gIHVpbnQzMl90IHRtcHJlZzEgPSAwOw0KLSAgdWludDMyX3QgdG1wcmVnMiA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9ESVNDX05VTUJFUihOdW1iZXIpKTsNCi0gIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXByZWcxID0gQURDeC0+Q1IxOw0KLSAgLyogQ2xlYXIgdGhlIG9sZCBkaXNjb250aW51b3VzIG1vZGUgY2hhbm5lbCBjb3VudCAqLw0KLSAgdG1wcmVnMSAmPSBDUjFfRElTQ05VTV9SZXNldDsNCi0gIC8qIFNldCB0aGUgZGlzY29udGludW91cyBtb2RlIGNoYW5uZWwgY291bnQgKi8NCi0gIHRtcHJlZzIgPSBOdW1iZXIgLSAxOw0KLSAgdG1wcmVnMSB8PSB0bXByZWcyIDw8IDEzOw0KLSAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KLSAgQURDeC0+Q1IxID0gdG1wcmVnMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZGlzY29udGludW91cyBtb2RlIG9uIHJlZ3VsYXIgZ3JvdXANCi0gICogICBjaGFubmVsIGZvciB0aGUgc3BlY2lmaWVkIEFEQw0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBkaXNjb250aW51b3VzIG1vZGUNCi0gICogICBvbiByZWd1bGFyIGdyb3VwIGNoYW5uZWwuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX0Rpc2NNb2RlQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIHJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlICovDQotICAgIEFEQ3gtPkNSMSB8PSBDUjFfRElTQ0VOX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIHJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlICovDQotICAgIEFEQ3gtPkNSMSAmPSBDUjFfRElTQ0VOX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIGZvciB0aGUgc2VsZWN0ZWQgQURDIHJlZ3VsYXIgY2hhbm5lbCBpdHMgY29ycmVzcG9uZGluZw0KLSAgKiAgIHJhbmsgaW4gdGhlIHNlcXVlbmNlciBhbmQgaXRzIHNhbXBsZSB0aW1lLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEFEQ19DaGFubmVsOiB0aGUgQURDIGNoYW5uZWwgdG8gY29uZmlndXJlLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8wOiBBREMgQ2hhbm5lbDAgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTogQURDIENoYW5uZWwxIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzI6IEFEQyBDaGFubmVsMiBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8zOiBBREMgQ2hhbm5lbDMgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfNDogQURDIENoYW5uZWw0IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzU6IEFEQyBDaGFubmVsNSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF82OiBBREMgQ2hhbm5lbDYgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfNzogQURDIENoYW5uZWw3IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzg6IEFEQyBDaGFubmVsOCBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF85OiBBREMgQ2hhbm5lbDkgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTA6IEFEQyBDaGFubmVsMTAgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTE6IEFEQyBDaGFubmVsMTEgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTI6IEFEQyBDaGFubmVsMTIgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTM6IEFEQyBDaGFubmVsMTMgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTQ6IEFEQyBDaGFubmVsMTQgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTU6IEFEQyBDaGFubmVsMTUgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTY6IEFEQyBDaGFubmVsMTYgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTc6IEFEQyBDaGFubmVsMTcgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBSYW5rOiBUaGUgcmFuayBpbiB0aGUgcmVndWxhciBncm91cCBzZXF1ZW5jZXIuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYmV0d2VlbiAxIHRvIDE2Lg0KLSAgKiBAcGFyYW0gIEFEQ19TYW1wbGVUaW1lOiBUaGUgc2FtcGxlIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfMUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDEuNSBjeWNsZXMNCi0gICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfN0N5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDcuNSBjeWNsZXMNCi0gICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfMTNDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAxMy41IGN5Y2xlcw0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV8yOEN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDI4LjUgY3ljbGVzCQ0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV80MUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDQxLjUgY3ljbGVzCQ0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV81NUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDU1LjUgY3ljbGVzCQ0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV83MUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDcxLjUgY3ljbGVzCQ0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV8yMzlDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAyMzkuNSBjeWNsZXMJDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19SZWd1bGFyQ2hhbm5lbENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfQ2hhbm5lbCwgdWludDhfdCBSYW5rLCB1aW50OF90IEFEQ19TYW1wbGVUaW1lKQ0KLXsNCi0gIHVpbnQzMl90IHRtcHJlZzEgPSAwLCB0bXByZWcyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKEFEQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfUkFOSyhSYW5rKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKEFEQ19TYW1wbGVUaW1lKSk7DQotICAvKiBpZiBBRENfQ2hhbm5lbF8xMCAuLi4gQURDX0NoYW5uZWxfMTcgaXMgc2VsZWN0ZWQgKi8NCi0gIGlmIChBRENfQ2hhbm5lbCA+IEFEQ19DaGFubmVsXzkpDQotICB7DQotICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQotICAgIHRtcHJlZzEgPSBBREN4LT5TTVBSMTsNCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQotICAgIHRtcHJlZzIgPSBTTVBSMV9TTVBfU2V0IDw8ICgzICogKEFEQ19DaGFubmVsIC0gMTApKTsNCi0gICAgLyogQ2xlYXIgdGhlIG9sZCBjaGFubmVsIHNhbXBsZSB0aW1lICovDQotICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQotICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQgKi8NCi0gICAgdG1wcmVnMiA9ICh1aW50MzJfdClBRENfU2FtcGxlVGltZSA8PCAoMyAqIChBRENfQ2hhbm5lbCAtIDEwKSk7DQotICAgIC8qIFNldCB0aGUgbmV3IGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCi0gICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KLSAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQotICAgIEFEQ3gtPlNNUFIxID0gdG1wcmVnMTsNCi0gIH0NCi0gIGVsc2UgLyogQURDX0NoYW5uZWwgaW5jbHVkZSBpbiBBRENfQ2hhbm5lbF9bMC4uOV0gKi8NCi0gIHsNCi0gICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gICAgdG1wcmVnMSA9IEFEQ3gtPlNNUFIyOw0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCi0gICAgdG1wcmVnMiA9IFNNUFIyX1NNUF9TZXQgPDwgKDMgKiBBRENfQ2hhbm5lbCk7DQotICAgIC8qIENsZWFyIHRoZSBvbGQgY2hhbm5lbCBzYW1wbGUgdGltZSAqLw0KLSAgICB0bXByZWcxICY9IH50bXByZWcyOw0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQotICAgIHRtcHJlZzIgPSAodWludDMyX3QpQURDX1NhbXBsZVRpbWUgPDwgKDMgKiBBRENfQ2hhbm5lbCk7DQotICAgIC8qIFNldCB0aGUgbmV3IGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCi0gICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KLSAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQotICAgIEFEQ3gtPlNNUFIyID0gdG1wcmVnMTsNCi0gIH0NCi0gIC8qIEZvciBSYW5rIDEgdG8gNiAqLw0KLSAgaWYgKFJhbmsgPCA3KQ0KLSAgew0KLSAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KLSAgICB0bXByZWcxID0gQURDeC0+U1FSMzsNCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQotICAgIHRtcHJlZzIgPSBTUVIzX1NRX1NldCA8PCAoNSAqIChSYW5rIC0gMSkpOw0KLSAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KLSAgICB0bXByZWcxICY9IH50bXByZWcyOw0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQotICAgIHRtcHJlZzIgPSAodWludDMyX3QpQURDX0NoYW5uZWwgPDwgKDUgKiAoUmFuayAtIDEpKTsNCi0gICAgLyogU2V0IHRoZSBTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCi0gICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KLSAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQotICAgIEFEQ3gtPlNRUjMgPSB0bXByZWcxOw0KLSAgfQ0KLSAgLyogRm9yIFJhbmsgNyB0byAxMiAqLw0KLSAgZWxzZSBpZiAoUmFuayA8IDEzKQ0KLSAgew0KLSAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KLSAgICB0bXByZWcxID0gQURDeC0+U1FSMjsNCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQotICAgIHRtcHJlZzIgPSBTUVIyX1NRX1NldCA8PCAoNSAqIChSYW5rIC0gNykpOw0KLSAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KLSAgICB0bXByZWcxICY9IH50bXByZWcyOw0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQotICAgIHRtcHJlZzIgPSAodWludDMyX3QpQURDX0NoYW5uZWwgPDwgKDUgKiAoUmFuayAtIDcpKTsNCi0gICAgLyogU2V0IHRoZSBTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCi0gICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KLSAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQotICAgIEFEQ3gtPlNRUjIgPSB0bXByZWcxOw0KLSAgfQ0KLSAgLyogRm9yIFJhbmsgMTMgdG8gMTYgKi8NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gICAgdG1wcmVnMSA9IEFEQ3gtPlNRUjE7DQotICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhciAqLw0KLSAgICB0bXByZWcyID0gU1FSMV9TUV9TZXQgPDwgKDUgKiAoUmFuayAtIDEzKSk7DQotICAgIC8qIENsZWFyIHRoZSBvbGQgU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQotICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQotICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQgKi8NCi0gICAgdG1wcmVnMiA9ICh1aW50MzJfdClBRENfQ2hhbm5lbCA8PCAoNSAqIChSYW5rIC0gMTMpKTsNCi0gICAgLyogU2V0IHRoZSBTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCi0gICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KLSAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQotICAgIEFEQ3gtPlNRUjEgPSB0bXByZWcxOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBREN4IGNvbnZlcnNpb24gdGhyb3VnaCBleHRlcm5hbCB0cmlnZ2VyLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBleHRlcm5hbCB0cmlnZ2VyIHN0YXJ0IG9mIGNvbnZlcnNpb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX0V4dGVybmFsVHJpZ0NvbnZDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCAqLw0KLSAgICBBREN4LT5DUjIgfD0gQ1IyX0VYVFRSSUdfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCAqLw0KLSAgICBBREN4LT5DUjIgJj0gQ1IyX0VYVFRSSUdfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGxhc3QgQURDeCBjb252ZXJzaW9uIHJlc3VsdCBkYXRhIGZvciByZWd1bGFyIGNoYW5uZWwuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgVGhlIERhdGEgY29udmVyc2lvbiB2YWx1ZS4NCi0gICovDQotdWludDE2X3QgQURDX0dldENvbnZlcnNpb25WYWx1ZShBRENfVHlwZURlZiogQURDeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gdmFsdWUgKi8NCi0gIHJldHVybiAodWludDE2X3QpIEFEQ3gtPkRSOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IEFEQzEgYW5kIEFEQzIgY29udmVyc2lvbiByZXN1bHQgZGF0YSBpbiBkdWFsIG1vZGUuDQotICAqIEByZXR2YWwgVGhlIERhdGEgY29udmVyc2lvbiB2YWx1ZS4NCi0gICovDQotdWludDMyX3QgQURDX0dldER1YWxNb2RlQ29udmVyc2lvblZhbHVlKHZvaWQpDQotew0KLSAgLyogUmV0dXJuIHRoZSBkdWFsIG1vZGUgY29udmVyc2lvbiB2YWx1ZSAqLw0KLSAgcmV0dXJuICgqKF9fSU8gdWludDMyX3QgKikgRFJfQUREUkVTUyk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNlbGVjdGVkIEFEQyBhdXRvbWF0aWMgaW5qZWN0ZWQgZ3JvdXANCi0gICogICBjb252ZXJzaW9uIGFmdGVyIHJlZ3VsYXIgb25lLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBhdXRvIGluamVjdGVkIGNvbnZlcnNpb24NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfQXV0b0luamVjdGVkQ29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBhdXRvbWF0aWMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiAqLw0KLSAgICBBREN4LT5DUjEgfD0gQ1IxX0pBVVRPX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGF1dG9tYXRpYyBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uICovDQotICAgIEFEQ3gtPkNSMSAmPSBDUjFfSkFVVE9fUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSBmb3IgaW5qZWN0ZWQgZ3JvdXANCi0gICogICBjaGFubmVsIGZvciB0aGUgc3BlY2lmaWVkIEFEQw0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBkaXNjb250aW51b3VzIG1vZGUNCi0gICogICBvbiBpbmplY3RlZCBncm91cCBjaGFubmVsLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19JbmplY3RlZERpc2NNb2RlQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZSAqLw0KLSAgICBBREN4LT5DUjEgfD0gQ1IxX0pESVNDRU5fU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5qZWN0ZWQgZGlzY29udGludW91cyBtb2RlICovDQotICAgIEFEQ3gtPkNSMSAmPSBDUjFfSkRJU0NFTl9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgQURDeCBleHRlcm5hbCB0cmlnZ2VyIGZvciBpbmplY3RlZCBjaGFubmVscyBjb252ZXJzaW9uLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnY6IHNwZWNpZmllcyB0aGUgQURDIHRyaWdnZXIgdG8gc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbi4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UMV9UUkdPOiBUaW1lcjEgVFJHTyBldmVudCBzZWxlY3RlZCAoZm9yIEFEQzEsIEFEQzIgYW5kIEFEQzMpDQotICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfQ0M0OiBUaW1lcjEgY2FwdHVyZSBjb21wYXJlNCBzZWxlY3RlZCAoZm9yIEFEQzEsIEFEQzIgYW5kIEFEQzMpDQotICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDJfVFJHTzogVGltZXIyIFRSR08gZXZlbnQgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKQ0KLSAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QyX0NDMTogVGltZXIyIGNhcHR1cmUgY29tcGFyZTEgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKQ0KLSAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QzX0NDNDogVGltZXIzIGNhcHR1cmUgY29tcGFyZTQgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKQ0KLSAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1Q0X1RSR086IFRpbWVyNCBUUkdPIGV2ZW50IHNlbGVjdGVkIChmb3IgQURDMSBhbmQgQURDMikNCi0gICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9FeHRfSVQxNV9USU04X0NDNDogRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTUgb3IgVGltZXI4DQotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgY29tcGFyZTQgZXZlbnQgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKSAgICAgICAgICAgICAgICAgICAgICAgDQotICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDRfQ0MzOiBUaW1lcjQgY2FwdHVyZSBjb21wYXJlMyBzZWxlY3RlZCAoZm9yIEFEQzMgb25seSkNCi0gICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UOF9DQzI6IFRpbWVyOCBjYXB0dXJlIGNvbXBhcmUyIHNlbGVjdGVkIChmb3IgQURDMyBvbmx5KSAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UOF9DQzQ6IFRpbWVyOCBjYXB0dXJlIGNvbXBhcmU0IHNlbGVjdGVkIChmb3IgQURDMyBvbmx5KQ0KLSAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1Q1X1RSR086IFRpbWVyNSBUUkdPIGV2ZW50IHNlbGVjdGVkIChmb3IgQURDMyBvbmx5KSAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UNV9DQzQ6IFRpbWVyNSBjYXB0dXJlIGNvbXBhcmU0IHNlbGVjdGVkIChmb3IgQURDMyBvbmx5KSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X05vbmU6IEluamVjdGVkIGNvbnZlcnNpb24gc3RhcnRlZCBieSBzb2Z0d2FyZSBhbmQgbm90DQotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgZXh0ZXJuYWwgdHJpZ2dlciAoZm9yIEFEQzEsIEFEQzIgYW5kIEFEQzMpDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19FeHRlcm5hbFRyaWdJbmplY3RlZENvbnZDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQzMl90IEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnYpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRfSU5KRUNfVFJJRyhBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252KSk7DQotICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wcmVnID0gQURDeC0+Q1IyOw0KLSAgLyogQ2xlYXIgdGhlIG9sZCBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQotICB0bXByZWcgJj0gQ1IyX0pFWFRTRUxfUmVzZXQ7DQotICAvKiBTZXQgdGhlIGV4dGVybmFsIGV2ZW50IHNlbGVjdGlvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAgKi8NCi0gIHRtcHJlZyB8PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252Ow0KLSAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KLSAgQURDeC0+Q1IyID0gdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBREN4IGluamVjdGVkIGNoYW5uZWxzIGNvbnZlcnNpb24gdGhyb3VnaA0KLSAgKiAgIGV4dGVybmFsIHRyaWdnZXINCi0gICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBBREMgZXh0ZXJuYWwgdHJpZ2dlciBzdGFydCBvZg0KLSAgKiAgIGluamVjdGVkIGNvbnZlcnNpb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX0V4dGVybmFsVHJpZ0luamVjdGVkQ29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQotICAgIEFEQ3gtPkNSMiB8PSBDUjJfSkVYVFRSSUdfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgZXh0ZXJuYWwgZXZlbnQgc2VsZWN0aW9uIGZvciBpbmplY3RlZCBncm91cCAqLw0KLSAgICBBREN4LT5DUjIgJj0gQ1IyX0pFWFRUUklHX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBBREMgc3RhcnQgb2YgdGhlIGluamVjdGVkIA0KLSAgKiAgIGNoYW5uZWxzIGNvbnZlcnNpb24uDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIHNvZnR3YXJlIHN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX1NvZnR3YXJlU3RhcnRJbmplY3RlZENvbnZDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAgb24gZXh0ZXJuYWwgZXZlbnQgYW5kIHN0YXJ0IHRoZSBzZWxlY3RlZA0KLSAgICAgICBBREMgaW5qZWN0ZWQgY29udmVyc2lvbiAqLw0KLSAgICBBREN4LT5DUjIgfD0gQ1IyX0pFWFRUUklHX0pTV1NUQVJUX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gb24gZXh0ZXJuYWwgZXZlbnQgZm9yIGluamVjdGVkIGdyb3VwIGFuZCBzdG9wIHRoZSBzZWxlY3RlZA0KLSAgICAgICBBREMgaW5qZWN0ZWQgY29udmVyc2lvbiAqLw0KLSAgICBBREN4LT5DUjIgJj0gQ1IyX0pFWFRUUklHX0pTV1NUQVJUX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBHZXRzIHRoZSBzZWxlY3RlZCBBREMgU29mdHdhcmUgc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiBTdGF0dXMuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBBREMgc29mdHdhcmUgc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotRmxhZ1N0YXR1cyBBRENfR2V0U29mdHdhcmVTdGFydEluamVjdGVkQ29udkNtZFN0YXR1cyhBRENfVHlwZURlZiogQURDeCkNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIEpTV1NUQVJUIGJpdCAqLw0KLSAgaWYgKChBREN4LT5DUjIgJiBDUjJfSlNXU1RBUlRfU2V0KSAhPSAodWludDMyX3QpUkVTRVQpDQotICB7DQotICAgIC8qIEpTV1NUQVJUIGJpdCBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBKU1dTVEFSVCBiaXQgaXMgcmVzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIEpTV1NUQVJUIGJpdCBzdGF0dXMgKi8NCi0gIHJldHVybiAgYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIGZvciB0aGUgc2VsZWN0ZWQgQURDIGluamVjdGVkIGNoYW5uZWwgaXRzIGNvcnJlc3BvbmRpbmcNCi0gICogICByYW5rIGluIHRoZSBzZXF1ZW5jZXIgYW5kIGl0cyBzYW1wbGUgdGltZS4NCi0gICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBBRENfQ2hhbm5lbDogdGhlIEFEQyBjaGFubmVsIHRvIGNvbmZpZ3VyZS4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMDogQURDIENoYW5uZWwwIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE6IEFEQyBDaGFubmVsMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8yOiBBREMgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMzogQURDIENoYW5uZWwzIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzQ6IEFEQyBDaGFubmVsNCBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF81OiBBREMgQ2hhbm5lbDUgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfNjogQURDIENoYW5uZWw2IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzc6IEFEQyBDaGFubmVsNyBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF84OiBBREMgQ2hhbm5lbDggc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfOTogQURDIENoYW5uZWw5IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEwOiBBREMgQ2hhbm5lbDEwIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzExOiBBREMgQ2hhbm5lbDExIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEyOiBBREMgQ2hhbm5lbDEyIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEzOiBBREMgQ2hhbm5lbDEzIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE0OiBBREMgQ2hhbm5lbDE0IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE1OiBBREMgQ2hhbm5lbDE1IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE2OiBBREMgQ2hhbm5lbDE2IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE3OiBBREMgQ2hhbm5lbDE3IHNlbGVjdGVkDQotICAqIEBwYXJhbSAgUmFuazogVGhlIHJhbmsgaW4gdGhlIGluamVjdGVkIGdyb3VwIHNlcXVlbmNlci4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQuDQotICAqIEBwYXJhbSAgQURDX1NhbXBsZVRpbWU6IFRoZSBzYW1wbGUgdGltZSB2YWx1ZSB0byBiZSBzZXQgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV8xQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMS41IGN5Y2xlcw0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV83Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNy41IGN5Y2xlcw0KLSAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV8xM0N5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDEzLjUgY3ljbGVzDQotICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzI4Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMjguNSBjeWNsZXMJDQotICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzQxQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNDEuNSBjeWNsZXMJDQotICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzU1Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNTUuNSBjeWNsZXMJDQotICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzcxQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNzEuNSBjeWNsZXMJDQotICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzIzOUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDIzOS41IGN5Y2xlcwkNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX0luamVjdGVkQ2hhbm5lbENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfQ2hhbm5lbCwgdWludDhfdCBSYW5rLCB1aW50OF90IEFEQ19TYW1wbGVUaW1lKQ0KLXsNCi0gIHVpbnQzMl90IHRtcHJlZzEgPSAwLCB0bXByZWcyID0gMCwgdG1wcmVnMyA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfQ0hBTk5FTChBRENfQ2hhbm5lbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9SQU5LKFJhbmspKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfU0FNUExFX1RJTUUoQURDX1NhbXBsZVRpbWUpKTsNCi0gIC8qIGlmIEFEQ19DaGFubmVsXzEwIC4uLiBBRENfQ2hhbm5lbF8xNyBpcyBzZWxlY3RlZCAqLw0KLSAgaWYgKEFEQ19DaGFubmVsID4gQURDX0NoYW5uZWxfOSkNCi0gIHsNCi0gICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gICAgdG1wcmVnMSA9IEFEQ3gtPlNNUFIxOw0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCi0gICAgdG1wcmVnMiA9IFNNUFIxX1NNUF9TZXQgPDwgKDMqKEFEQ19DaGFubmVsIC0gMTApKTsNCi0gICAgLyogQ2xlYXIgdGhlIG9sZCBjaGFubmVsIHNhbXBsZSB0aW1lICovDQotICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQotICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQgKi8NCi0gICAgdG1wcmVnMiA9ICh1aW50MzJfdClBRENfU2FtcGxlVGltZSA8PCAoMyooQURDX0NoYW5uZWwgLSAxMCkpOw0KLSAgICAvKiBTZXQgdGhlIG5ldyBjaGFubmVsIHNhbXBsZSB0aW1lICovDQotICAgIHRtcHJlZzEgfD0gdG1wcmVnMjsNCi0gICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KLSAgICBBREN4LT5TTVBSMSA9IHRtcHJlZzE7DQotICB9DQotICBlbHNlIC8qIEFEQ19DaGFubmVsIGluY2x1ZGUgaW4gQURDX0NoYW5uZWxfWzAuLjldICovDQotICB7DQotICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQotICAgIHRtcHJlZzEgPSBBREN4LT5TTVBSMjsNCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQotICAgIHRtcHJlZzIgPSBTTVBSMl9TTVBfU2V0IDw8ICgzICogQURDX0NoYW5uZWwpOw0KLSAgICAvKiBDbGVhciB0aGUgb2xkIGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCi0gICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIHNldCAqLw0KLSAgICB0bXByZWcyID0gKHVpbnQzMl90KUFEQ19TYW1wbGVUaW1lIDw8ICgzICogQURDX0NoYW5uZWwpOw0KLSAgICAvKiBTZXQgdGhlIG5ldyBjaGFubmVsIHNhbXBsZSB0aW1lICovDQotICAgIHRtcHJlZzEgfD0gdG1wcmVnMjsNCi0gICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KLSAgICBBREN4LT5TTVBSMiA9IHRtcHJlZzE7DQotICB9DQotICAvKiBSYW5rIGNvbmZpZ3VyYXRpb24gKi8NCi0gIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXByZWcxID0gQURDeC0+SlNRUjsNCi0gIC8qIEdldCBKTCB2YWx1ZTogTnVtYmVyID0gSkwrMSAqLw0KLSAgdG1wcmVnMyA9ICAodG1wcmVnMSAmIEpTUVJfSkxfU2V0KT4+IDIwOw0KLSAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyOiAoKFJhbmstMSkrKDQtSkwtMSkpICovDQotICB0bXByZWcyID0gSlNRUl9KU1FfU2V0IDw8ICg1ICogKHVpbnQ4X3QpKChSYW5rICsgMykgLSAodG1wcmVnMyArIDEpKSk7DQotICAvKiBDbGVhciB0aGUgb2xkIEpTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCi0gIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQotICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0OiAoKFJhbmstMSkrKDQtSkwtMSkpICovDQotICB0bXByZWcyID0gKHVpbnQzMl90KUFEQ19DaGFubmVsIDw8ICg1ICogKHVpbnQ4X3QpKChSYW5rICsgMykgLSAodG1wcmVnMyArIDEpKSk7DQotICAvKiBTZXQgdGhlIEpTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCi0gIHRtcHJlZzEgfD0gdG1wcmVnMjsNCi0gIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIEFEQ3gtPkpTUVIgPSB0bXByZWcxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBzZXF1ZW5jZXIgbGVuZ3RoIGZvciBpbmplY3RlZCBjaGFubmVscw0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIExlbmd0aDogVGhlIHNlcXVlbmNlciBsZW5ndGguIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxIHRvIDQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19JbmplY3RlZFNlcXVlbmNlckxlbmd0aENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBMZW5ndGgpDQotew0KLSAgdWludDMyX3QgdG1wcmVnMSA9IDA7DQotICB1aW50MzJfdCB0bXByZWcyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9MRU5HVEgoTGVuZ3RoKSk7DQotICANCi0gIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXByZWcxID0gQURDeC0+SlNRUjsNCi0gIC8qIENsZWFyIHRoZSBvbGQgaW5qZWN0ZWQgc2VxdW5lbmNlIGxlbmdodCBKTCBiaXRzICovDQotICB0bXByZWcxICY9IEpTUVJfSkxfUmVzZXQ7DQotICAvKiBTZXQgdGhlIGluamVjdGVkIHNlcXVuZW5jZSBsZW5naHQgSkwgYml0cyAqLw0KLSAgdG1wcmVnMiA9IExlbmd0aCAtIDE7IA0KLSAgdG1wcmVnMSB8PSB0bXByZWcyIDw8IDIwOw0KLSAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KLSAgQURDeC0+SlNRUiA9IHRtcHJlZzE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldCB0aGUgaW5qZWN0ZWQgY2hhbm5lbHMgY29udmVyc2lvbiB2YWx1ZSBvZmZzZXQNCi0gICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBBRENfSW5qZWN0ZWRDaGFubmVsOiB0aGUgQURDIGluamVjdGVkIGNoYW5uZWwgdG8gc2V0IGl0cyBvZmZzZXQuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEFEQ19JbmplY3RlZENoYW5uZWxfMTogSW5qZWN0ZWQgQ2hhbm5lbDEgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0luamVjdGVkQ2hhbm5lbF8yOiBJbmplY3RlZCBDaGFubmVsMiBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfSW5qZWN0ZWRDaGFubmVsXzM6IEluamVjdGVkIENoYW5uZWwzIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19JbmplY3RlZENoYW5uZWxfNDogSW5qZWN0ZWQgQ2hhbm5lbDQgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBPZmZzZXQ6IHRoZSBvZmZzZXQgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBBREMgaW5qZWN0ZWQgY2hhbm5lbA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAxMmJpdCB2YWx1ZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX1NldEluamVjdGVkT2Zmc2V0KEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IEFEQ19JbmplY3RlZENoYW5uZWwsIHVpbnQxNl90IE9mZnNldCkNCi17DQotICBfX0lPIHVpbnQzMl90IHRtcCA9IDA7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9DSEFOTkVMKEFEQ19JbmplY3RlZENoYW5uZWwpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUKE9mZnNldCkpOyAgDQotICANCi0gIHRtcCA9ICh1aW50MzJfdClBREN4Ow0KLSAgdG1wICs9IEFEQ19JbmplY3RlZENoYW5uZWw7DQotICANCi0gIC8qIFNldCB0aGUgc2VsZWN0ZWQgaW5qZWN0ZWQgY2hhbm5lbCBkYXRhIG9mZnNldCAqLw0KLSAgKihfX0lPIHVpbnQzMl90ICopIHRtcCA9ICh1aW50MzJfdClPZmZzZXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEFEQyBpbmplY3RlZCBjaGFubmVsIGNvbnZlcnNpb24gcmVzdWx0DQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQURDX0luamVjdGVkQ2hhbm5lbDogdGhlIGNvbnZlcnRlZCBBREMgaW5qZWN0ZWQgY2hhbm5lbC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBBRENfSW5qZWN0ZWRDaGFubmVsXzE6IEluamVjdGVkIENoYW5uZWwxIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19JbmplY3RlZENoYW5uZWxfMjogSW5qZWN0ZWQgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0luamVjdGVkQ2hhbm5lbF8zOiBJbmplY3RlZCBDaGFubmVsMyBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfSW5qZWN0ZWRDaGFubmVsXzQ6IEluamVjdGVkIENoYW5uZWw0IHNlbGVjdGVkDQotICAqIEByZXR2YWwgVGhlIERhdGEgY29udmVyc2lvbiB2YWx1ZS4NCi0gICovDQotdWludDE2X3QgQURDX0dldEluamVjdGVkQ29udmVyc2lvblZhbHVlKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IEFEQ19JbmplY3RlZENoYW5uZWwpDQotew0KLSAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfQ0hBTk5FTChBRENfSW5qZWN0ZWRDaGFubmVsKSk7DQotDQotICB0bXAgPSAodWludDMyX3QpQURDeDsNCi0gIHRtcCArPSBBRENfSW5qZWN0ZWRDaGFubmVsICsgSkRSX09mZnNldDsNCi0gIA0KLSAgLyogUmV0dXJucyB0aGUgc2VsZWN0ZWQgaW5qZWN0ZWQgY2hhbm5lbCBjb252ZXJzaW9uIGRhdGEgdmFsdWUgKi8NCi0gIHJldHVybiAodWludDE2X3QpICgqKF9fSU8gdWludDMyX3QqKSAgdG1wKTsgICANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYW5hbG9nIHdhdGNoZG9nIG9uIHNpbmdsZS9hbGwgcmVndWxhcg0KLSAgKiAgIG9yIGluamVjdGVkIGNoYW5uZWxzDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQURDX0FuYWxvZ1dhdGNoZG9nOiB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBjb25maWd1cmF0aW9uLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEFEQ19BbmFsb2dXYXRjaGRvZ19TaW5nbGVSZWdFbmFibGU6IEFuYWxvZyB3YXRjaGRvZyBvbiBhIHNpbmdsZSByZWd1bGFyIGNoYW5uZWwNCi0gICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX1NpbmdsZUluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gYSBzaW5nbGUgaW5qZWN0ZWQgY2hhbm5lbA0KLSAgKiAgICAgQGFyZyBBRENfQW5hbG9nV2F0Y2hkb2dfU2luZ2xlUmVnT3JJbmplY0VuYWJsZTogQW5hbG9nIHdhdGNoZG9nIG9uIGEgc2luZ2xlIHJlZ3VsYXIgb3IgaW5qZWN0ZWQgY2hhbm5lbA0KLSAgKiAgICAgQGFyZyBBRENfQW5hbG9nV2F0Y2hkb2dfQWxsUmVnRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gIGFsbCByZWd1bGFyIGNoYW5uZWwNCi0gICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX0FsbEluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gIGFsbCBpbmplY3RlZCBjaGFubmVsDQotICAqICAgICBAYXJnIEFEQ19BbmFsb2dXYXRjaGRvZ19BbGxSZWdBbGxJbmplY0VuYWJsZTogQW5hbG9nIHdhdGNoZG9nIG9uIGFsbCByZWd1bGFyIGFuZCBpbmplY3RlZCBjaGFubmVscw0KLSAgKiAgICAgQGFyZyBBRENfQW5hbG9nV2F0Y2hkb2dfTm9uZTogTm8gY2hhbm5lbCBndWFyZGVkIGJ5IHRoZSBhbmFsb2cgd2F0Y2hkb2cNCi0gICogQHJldHZhbCBOb25lCSAgDQotICAqLw0KLXZvaWQgQURDX0FuYWxvZ1dhdGNoZG9nQ21kKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MzJfdCBBRENfQW5hbG9nV2F0Y2hkb2cpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTkFMT0dfV0FUQ0hET0coQURDX0FuYWxvZ1dhdGNoZG9nKSk7DQotICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wcmVnID0gQURDeC0+Q1IxOw0KLSAgLyogQ2xlYXIgQVdERU4sIEFXREVOSiBhbmQgQVdEU0dMIGJpdHMgKi8NCi0gIHRtcHJlZyAmPSBDUjFfQVdETW9kZV9SZXNldDsNCi0gIC8qIFNldCB0aGUgYW5hbG9nIHdhdGNoZG9nIGVuYWJsZSBtb2RlICovDQotICB0bXByZWcgfD0gQURDX0FuYWxvZ1dhdGNoZG9nOw0KLSAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KLSAgQURDeC0+Q1IxID0gdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBoaWdoIGFuZCBsb3cgdGhyZXNob2xkcyBvZiB0aGUgYW5hbG9nIHdhdGNoZG9nLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEhpZ2hUaHJlc2hvbGQ6IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIEhpZ2ggdGhyZXNob2xkIHZhbHVlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSAxMmJpdCB2YWx1ZS4NCi0gICogQHBhcmFtICBMb3dUaHJlc2hvbGQ6IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIExvdyB0aHJlc2hvbGQgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDEyYml0IHZhbHVlLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfQW5hbG9nV2F0Y2hkb2dUaHJlc2hvbGRzQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MTZfdCBIaWdoVGhyZXNob2xkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBMb3dUaHJlc2hvbGQpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1RIUkVTSE9MRChIaWdoVGhyZXNob2xkKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX1RIUkVTSE9MRChMb3dUaHJlc2hvbGQpKTsNCi0gIC8qIFNldCB0aGUgQURDeCBoaWdoIHRocmVzaG9sZCAqLw0KLSAgQURDeC0+SFRSID0gSGlnaFRocmVzaG9sZDsNCi0gIC8qIFNldCB0aGUgQURDeCBsb3cgdGhyZXNob2xkICovDQotICBBREN4LT5MVFIgPSBMb3dUaHJlc2hvbGQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGFuYWxvZyB3YXRjaGRvZyBndWFyZGVkIHNpbmdsZSBjaGFubmVsDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQURDX0NoYW5uZWw6IHRoZSBBREMgY2hhbm5lbCB0byBjb25maWd1cmUgZm9yIHRoZSBhbmFsb2cgd2F0Y2hkb2cuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzA6IEFEQyBDaGFubmVsMCBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xOiBBREMgQ2hhbm5lbDEgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfMjogQURDIENoYW5uZWwyIHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzM6IEFEQyBDaGFubmVsMyBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF80OiBBREMgQ2hhbm5lbDQgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfNTogQURDIENoYW5uZWw1IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzY6IEFEQyBDaGFubmVsNiBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF83OiBBREMgQ2hhbm5lbDcgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgQURDX0NoYW5uZWxfODogQURDIENoYW5uZWw4IHNlbGVjdGVkDQotICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzk6IEFEQyBDaGFubmVsOSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMDogQURDIENoYW5uZWwxMCBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMTogQURDIENoYW5uZWwxMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMjogQURDIENoYW5uZWwxMiBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMzogQURDIENoYW5uZWwxMyBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNDogQURDIENoYW5uZWwxNCBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNTogQURDIENoYW5uZWwxNSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNjogQURDIENoYW5uZWwxNiBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNzogQURDIENoYW5uZWwxNyBzZWxlY3RlZA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfQW5hbG9nV2F0Y2hkb2dTaW5nbGVDaGFubmVsQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IEFEQ19DaGFubmVsKQ0KLXsNCi0gIHVpbnQzMl90IHRtcHJlZyA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfQ0hBTk5FTChBRENfQ2hhbm5lbCkpOw0KLSAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcHJlZyA9IEFEQ3gtPkNSMTsNCi0gIC8qIENsZWFyIHRoZSBBbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbCBzZWxlY3QgYml0cyAqLw0KLSAgdG1wcmVnICY9IENSMV9BV0RDSF9SZXNldDsNCi0gIC8qIFNldCB0aGUgQW5hbG9nIHdhdGNoZG9nIGNoYW5uZWwgKi8NCi0gIHRtcHJlZyB8PSBBRENfQ2hhbm5lbDsNCi0gIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIEFEQ3gtPkNSMSA9IHRtcHJlZzsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBWcmVmaW50IGNoYW5uZWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEFEQ19UZW1wU2Vuc29yVnJlZmludENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIFZyZWZpbnQgY2hhbm5lbCovDQotICAgIEFEQzEtPkNSMiB8PSBDUjJfVFNWUkVGRV9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgVnJlZmludCBjaGFubmVsKi8NCi0gICAgQURDMS0+Q1IyICY9IENSMl9UU1ZSRUZFX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEFEQyBmbGFnIGlzIHNldCBvciBub3QuDQotICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQURDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgQURDX0ZMQUdfQVdEOiBBbmFsb2cgd2F0Y2hkb2cgZmxhZw0KLSAgKiAgICAgQGFyZyBBRENfRkxBR19FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGZsYWcNCi0gICogICAgIEBhcmcgQURDX0ZMQUdfSkVPQzogRW5kIG9mIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZw0KLSAgKiAgICAgQGFyZyBBRENfRkxBR19KU1RSVDogU3RhcnQgb2YgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQotICAqICAgICBAYXJnIEFEQ19GTEFHX1NUUlQ6IFN0YXJ0IG9mIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBBRENfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotRmxhZ1N0YXR1cyBBRENfR2V0RmxhZ1N0YXR1cyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfRkxBRykNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0dFVF9GTEFHKEFEQ19GTEFHKSk7DQotICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgQURDIGZsYWcgKi8NCi0gIGlmICgoQURDeC0+U1IgJiBBRENfRkxBRykgIT0gKHVpbnQ4X3QpUkVTRVQpDQotICB7DQotICAgIC8qIEFEQ19GTEFHIGlzIHNldCAqLw0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIEFEQ19GTEFHIGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBBRENfRkxBRyBzdGF0dXMgKi8NCi0gIHJldHVybiAgYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIEFEQ3gncyBwZW5kaW5nIGZsYWdzLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEFEQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEFEQ19GTEFHX0FXRDogQW5hbG9nIHdhdGNoZG9nIGZsYWcNCi0gICogICAgIEBhcmcgQURDX0ZMQUdfRU9DOiBFbmQgb2YgY29udmVyc2lvbiBmbGFnDQotICAqICAgICBAYXJnIEFEQ19GTEFHX0pFT0M6IEVuZCBvZiBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcNCi0gICogICAgIEBhcmcgQURDX0ZMQUdfSlNUUlQ6IFN0YXJ0IG9mIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZw0KLSAgKiAgICAgQGFyZyBBRENfRkxBR19TVFJUOiBTdGFydCBvZiByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBBRENfQ2xlYXJGbGFnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IEFEQ19GTEFHKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DTEVBUl9GTEFHKEFEQ19GTEFHKSk7DQotICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQURDIGZsYWdzICovDQotICBBREN4LT5TUiA9IH4odWludDMyX3QpQURDX0ZMQUc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEFEQ19JVDogc3BlY2lmaWVzIHRoZSBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgQURDX0lUX0VPQzogRW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCi0gICogICAgIEBhcmcgQURDX0lUX0FXRDogQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCBtYXNrDQotICAqICAgICBAYXJnIEFEQ19JVF9KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBpbnRlcnJ1cHQgbWFzaw0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQURDX0lUIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1JVFN0YXR1cyBBRENfR2V0SVRTdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQxNl90IEFEQ19JVCkNCi17DQotICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIHVpbnQzMl90IGl0bWFzayA9IDAsIGVuYWJsZXN0YXR1cyA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19BRENfR0VUX0lUKEFEQ19JVCkpOw0KLSAgLyogR2V0IHRoZSBBREMgSVQgaW5kZXggKi8NCi0gIGl0bWFzayA9IEFEQ19JVCA+PiA4Ow0KLSAgLyogR2V0IHRoZSBBRENfSVQgZW5hYmxlIGJpdCBzdGF0dXMgKi8NCi0gIGVuYWJsZXN0YXR1cyA9IChBREN4LT5DUjEgJiAodWludDhfdClBRENfSVQpIDsNCi0gIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0ICovDQotICBpZiAoKChBREN4LT5TUiAmIGl0bWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKSAmJiBlbmFibGVzdGF0dXMpDQotICB7DQotICAgIC8qIEFEQ19JVCBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBBRENfSVQgaXMgcmVzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIEFEQ19JVCBzdGF0dXMgKi8NCi0gIHJldHVybiAgYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIEFEQ3iScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KLSAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEFEQ19JVDogc3BlY2lmaWVzIHRoZSBBREMgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEFEQ19JVF9FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQotICAqICAgICBAYXJnIEFEQ19JVF9BV0Q6IEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgbWFzaw0KLSAgKiAgICAgQGFyZyBBRENfSVRfSkVPQzogRW5kIG9mIGluamVjdGVkIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQURDX0NsZWFySVRQZW5kaW5nQml0KEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MTZfdCBBRENfSVQpDQotew0KLSAgdWludDhfdCBpdG1hc2sgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQURDX0lUKEFEQ19JVCkpOw0KLSAgLyogR2V0IHRoZSBBREMgSVQgaW5kZXggKi8NCi0gIGl0bWFzayA9ICh1aW50OF90KShBRENfSVQgPj4gOCk7DQotICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQURDIGludGVycnVwdCBwZW5kaW5nIGJpdHMgKi8NCi0gIEFEQ3gtPlNSID0gfih1aW50MzJfdClpdG1hc2s7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfYmtwLmMgYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9ia3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkNjNhZi4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9ia3AuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfYmtwLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgQktQIGZpcm13YXJlIGZ1bmN0aW9ucy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweF9ia3AuaCINCi0jaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJLUCANCi0gICogQGJyaWVmIEJLUCBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJLUF9Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQktQX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0gQktQIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uIC0tLS0tLS0tLS0tLS0tLSAqLw0KLSNkZWZpbmUgQktQX09GRlNFVCAgICAgICAgKEJLUF9CQVNFIC0gUEVSSVBIX0JBU0UpDQotDQotLyogLS0tIENSIFJlZ2lzdGVyIC0tLS0qLw0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBUUEFMIGJpdCAqLw0KLSNkZWZpbmUgQ1JfT0ZGU0VUICAgICAgICAgKEJLUF9PRkZTRVQgKyAweDMwKQ0KLSNkZWZpbmUgVFBBTF9CaXROdW1iZXIgICAgMHgwMQ0KLSNkZWZpbmUgQ1JfVFBBTF9CQiAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSX09GRlNFVCAqIDMyKSArIChUUEFMX0JpdE51bWJlciAqIDQpKQ0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBUUEUgYml0ICovDQotI2RlZmluZSBUUEVfQml0TnVtYmVyICAgICAweDAwDQotI2RlZmluZSBDUl9UUEVfQkIgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1JfT0ZGU0VUICogMzIpICsgKFRQRV9CaXROdW1iZXIgKiA0KSkNCi0NCi0vKiAtLS0gQ1NSIFJlZ2lzdGVyIC0tLSovDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFRQSUUgYml0ICovDQotI2RlZmluZSBDU1JfT0ZGU0VUICAgICAgICAoQktQX09GRlNFVCArIDB4MzQpDQotI2RlZmluZSBUUElFX0JpdE51bWJlciAgICAweDAyDQotI2RlZmluZSBDU1JfVFBJRV9CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1NSX09GRlNFVCAqIDMyKSArIChUUElFX0JpdE51bWJlciAqIDQpKQ0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBUSUYgYml0ICovDQotI2RlZmluZSBUSUZfQml0TnVtYmVyICAgICAweDA5DQotI2RlZmluZSBDU1JfVElGX0JCICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1NSX09GRlNFVCAqIDMyKSArIChUSUZfQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFRFRiBiaXQgKi8NCi0jZGVmaW5lIFRFRl9CaXROdW1iZXIgICAgIDB4MDgNCi0jZGVmaW5lIENTUl9URUZfQkIgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDU1JfT0ZGU0VUICogMzIpICsgKFRFRl9CaXROdW1iZXIgKiA0KSkNCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJLUCByZWdpc3RlcnMgYml0IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLyogUlRDQ1IgcmVnaXN0ZXIgYml0IG1hc2sgKi8NCi0jZGVmaW5lIFJUQ0NSX0NBTF9NQVNLICAgICgodWludDE2X3QpMHhGRjgwKQ0KLSNkZWZpbmUgUlRDQ1JfTUFTSyAgICAgICAgKCh1aW50MTZfdCkweEZDN0YpDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0NCi0vKiogQGRlZmdyb3VwIEJLUF9Qcml2YXRlX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBCS1BfUHJpdmF0ZV9WYXJpYWJsZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQktQX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEJLUF9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBCS1AgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBCS1BfRGVJbml0KHZvaWQpDQotew0KLSAgUkNDX0JhY2t1cFJlc2V0Q21kKEVOQUJMRSk7DQotICBSQ0NfQmFja3VwUmVzZXRDbWQoRElTQUJMRSk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRhbXBlciBQaW4gYWN0aXZlIGxldmVsLg0KLSAgKiBAcGFyYW0gIEJLUF9UYW1wZXJQaW5MZXZlbDogc3BlY2lmaWVzIHRoZSBUYW1wZXIgUGluIGFjdGl2ZSBsZXZlbC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBCS1BfVGFtcGVyUGluTGV2ZWxfSGlnaDogVGFtcGVyIHBpbiBhY3RpdmUgb24gaGlnaCBsZXZlbA0KLSAgKiAgICAgQGFyZyBCS1BfVGFtcGVyUGluTGV2ZWxfTG93OiBUYW1wZXIgcGluIGFjdGl2ZSBvbiBsb3cgbGV2ZWwNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQktQX1RhbXBlclBpbkxldmVsQ29uZmlnKHVpbnQxNl90IEJLUF9UYW1wZXJQaW5MZXZlbCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0JLUF9UQU1QRVJfUElOX0xFVkVMKEJLUF9UYW1wZXJQaW5MZXZlbCkpOw0KLSAgKihfX0lPIHVpbnQzMl90ICopIENSX1RQQUxfQkIgPSBCS1BfVGFtcGVyUGluTGV2ZWw7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRhbXBlciBQaW4gYWN0aXZhdGlvbi4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUYW1wZXIgUGluIGFjdGl2YXRpb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQktQX1RhbXBlclBpbkNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICAqKF9fSU8gdWludDMyX3QgKikgQ1JfVFBFX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUYW1wZXIgUGluIEludGVycnVwdC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUYW1wZXIgUGluIEludGVycnVwdC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBCS1BfSVRDb25maWcoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgKihfX0lPIHVpbnQzMl90ICopIENTUl9UUElFX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZWxlY3QgdGhlIFJUQyBvdXRwdXQgc291cmNlIHRvIG91dHB1dCBvbiB0aGUgVGFtcGVyIHBpbi4NCi0gICogQHBhcmFtICBCS1BfUlRDT3V0cHV0U291cmNlOiBzcGVjaWZpZXMgdGhlIFJUQyBvdXRwdXQgc291cmNlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEJLUF9SVENPdXRwdXRTb3VyY2VfTm9uZTogbm8gUlRDIG91dHB1dCBvbiB0aGUgVGFtcGVyIHBpbi4NCi0gICogICAgIEBhcmcgQktQX1JUQ091dHB1dFNvdXJjZV9DYWxpYkNsb2NrOiBvdXRwdXQgdGhlIFJUQyBjbG9jayB3aXRoIGZyZXF1ZW5jeQ0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZWQgYnkgNjQgb24gdGhlIFRhbXBlciBwaW4uDQotICAqICAgICBAYXJnIEJLUF9SVENPdXRwdXRTb3VyY2VfQWxhcm06IG91dHB1dCB0aGUgUlRDIEFsYXJtIHB1bHNlIHNpZ25hbCBvbg0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgVGFtcGVyIHBpbi4NCi0gICogICAgIEBhcmcgQktQX1JUQ091dHB1dFNvdXJjZV9TZWNvbmQ6IG91dHB1dCB0aGUgUlRDIFNlY29uZCBwdWxzZSBzaWduYWwgb24NCi0gICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUYW1wZXIgcGluLiAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEJLUF9SVENPdXRwdXRDb25maWcodWludDE2X3QgQktQX1JUQ091dHB1dFNvdXJjZSkNCi17DQotICB1aW50MTZfdCB0bXByZWcgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19CS1BfUlRDX09VVFBVVF9TT1VSQ0UoQktQX1JUQ091dHB1dFNvdXJjZSkpOw0KLSAgdG1wcmVnID0gQktQLT5SVENDUjsNCi0gIC8qIENsZWFyIENDTywgQVNPRSBhbmQgQVNPUyBiaXRzICovDQotICB0bXByZWcgJj0gUlRDQ1JfTUFTSzsNCi0gIA0KLSAgLyogU2V0IENDTywgQVNPRSBhbmQgQVNPUyBiaXRzIGFjY29yZGluZyB0byBCS1BfUlRDT3V0cHV0U291cmNlIHZhbHVlICovDQotICB0bXByZWcgfD0gQktQX1JUQ091dHB1dFNvdXJjZTsNCi0gIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCi0gIEJLUC0+UlRDQ1IgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgUlRDIENsb2NrIENhbGlicmF0aW9uIHZhbHVlLg0KLSAgKiBAcGFyYW0gIENhbGlicmF0aW9uVmFsdWU6IHNwZWNpZmllcyB0aGUgUlRDIENsb2NrIENhbGlicmF0aW9uIHZhbHVlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweDdGLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBCS1BfU2V0UlRDQ2FsaWJyYXRpb25WYWx1ZSh1aW50OF90IENhbGlicmF0aW9uVmFsdWUpDQotew0KLSAgdWludDE2X3QgdG1wcmVnID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQktQX0NBTElCUkFUSU9OX1ZBTFVFKENhbGlicmF0aW9uVmFsdWUpKTsNCi0gIHRtcHJlZyA9IEJLUC0+UlRDQ1I7DQotICAvKiBDbGVhciBDQUxbNjowXSBiaXRzICovDQotICB0bXByZWcgJj0gUlRDQ1JfQ0FMX01BU0s7DQotICAvKiBTZXQgQ0FMWzY6MF0gYml0cyBhY2NvcmRpbmcgdG8gQ2FsaWJyYXRpb25WYWx1ZSB2YWx1ZSAqLw0KLSAgdG1wcmVnIHw9IENhbGlicmF0aW9uVmFsdWU7DQotICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQotICBCS1AtPlJUQ0NSID0gdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBXcml0ZXMgdXNlciBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgRGF0YSBCYWNrdXAgUmVnaXN0ZXIuDQotICAqIEBwYXJhbSAgQktQX0RSOiBzcGVjaWZpZXMgdGhlIERhdGEgQmFja3VwIFJlZ2lzdGVyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBCS1BfRFJ4IHdoZXJlIHg6WzEsIDQyXQ0KLSAgKiBAcGFyYW0gIERhdGE6IGRhdGEgdG8gd3JpdGUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQktQX1dyaXRlQmFja3VwUmVnaXN0ZXIodWludDE2X3QgQktQX0RSLCB1aW50MTZfdCBEYXRhKQ0KLXsNCi0gIF9fSU8gdWludDMyX3QgdG1wID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQktQX0RSKEJLUF9EUikpOw0KLQ0KLSAgdG1wID0gKHVpbnQzMl90KUJLUF9CQVNFOyANCi0gIHRtcCArPSBCS1BfRFI7DQotDQotICAqKF9fSU8gdWludDMyX3QgKikgdG1wID0gRGF0YTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmVhZHMgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgRGF0YSBCYWNrdXAgUmVnaXN0ZXIuDQotICAqIEBwYXJhbSAgQktQX0RSOiBzcGVjaWZpZXMgdGhlIERhdGEgQmFja3VwIFJlZ2lzdGVyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBCS1BfRFJ4IHdoZXJlIHg6WzEsIDQyXQ0KLSAgKiBAcmV0dmFsIFRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgRGF0YSBCYWNrdXAgUmVnaXN0ZXINCi0gICovDQotdWludDE2X3QgQktQX1JlYWRCYWNrdXBSZWdpc3Rlcih1aW50MTZfdCBCS1BfRFIpDQotew0KLSAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19CS1BfRFIoQktQX0RSKSk7DQotDQotICB0bXAgPSAodWludDMyX3QpQktQX0JBU0U7IA0KLSAgdG1wICs9IEJLUF9EUjsNCi0NCi0gIHJldHVybiAoKihfX0lPIHVpbnQxNl90ICopIHRtcCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBUYW1wZXIgUGluIEV2ZW50IGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgVGFtcGVyIFBpbiBFdmVudCBmbGFnIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIEJLUF9HZXRGbGFnU3RhdHVzKHZvaWQpDQotew0KLSAgcmV0dXJuIChGbGFnU3RhdHVzKSgqKF9fSU8gdWludDMyX3QgKikgQ1NSX1RFRl9CQik7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyBUYW1wZXIgUGluIEV2ZW50IHBlbmRpbmcgZmxhZy4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEJLUF9DbGVhckZsYWcodm9pZCkNCi17DQotICAvKiBTZXQgQ1RFIGJpdCB0byBjbGVhciBUYW1wZXIgUGluIEV2ZW50IGZsYWcgKi8NCi0gIEJLUC0+Q1NSIHw9IEJLUF9DU1JfQ1RFOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgVGFtcGVyIFBpbiBJbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgVGFtcGVyIFBpbiBJbnRlcnJ1cHQgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUlUU3RhdHVzIEJLUF9HZXRJVFN0YXR1cyh2b2lkKQ0KLXsNCi0gIHJldHVybiAoSVRTdGF0dXMpKCooX19JTyB1aW50MzJfdCAqKSBDU1JfVElGX0JCKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIFRhbXBlciBQaW4gSW50ZXJydXB0IHBlbmRpbmcgYml0Lg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQktQX0NsZWFySVRQZW5kaW5nQml0KHZvaWQpDQotew0KLSAgLyogU2V0IENUSSBiaXQgdG8gY2xlYXIgVGFtcGVyIFBpbiBJbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8NCi0gIEJLUC0+Q1NSIHw9IEJLUF9DU1JfQ1RJOw0KLX0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2Nhbi5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfY2FuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzgxOWEuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfY2FuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY2ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9jYW4uYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBDQU4gZmlybXdhcmUgZnVuY3Rpb25zLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4X2Nhbi5oIg0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOIA0KLSAgKiBAYnJpZWYgQ0FOIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiBDQU4gTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLw0KLQ0KLSNkZWZpbmUgTUNSX0RCRiAgICAgICgodWludDMyX3QpMHgwMDAxMDAwMCkgLyogc29mdHdhcmUgbWFzdGVyIHJlc2V0ICovDQotDQotLyogQ0FOIE1haWxib3ggVHJhbnNtaXQgUmVxdWVzdCAqLw0KLSNkZWZpbmUgVE1JRHhSX1RYUlEgICgodWludDMyX3QpMHgwMDAwMDAwMSkgLyogVHJhbnNtaXQgbWFpbGJveCByZXF1ZXN0ICovDQotDQotLyogQ0FOIEZpbHRlciBNYXN0ZXIgUmVnaXN0ZXIgYml0cyAqLw0KLSNkZWZpbmUgRk1SX0ZJTklUICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgLyogRmlsdGVyIGluaXQgbW9kZSAqLw0KLQ0KLS8qIFRpbWUgb3V0IGZvciBJTkFLIGJpdCAqLw0KLSNkZWZpbmUgSU5BS19USU1FT1VUICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGRkYpDQotLyogVGltZSBvdXQgZm9yIFNMQUsgYml0ICovDQotI2RlZmluZSBTTEFLX1RJTUVPVVQgICAgICAgICgodWludDMyX3QpMHgwMDAwRkZGRikNCi0NCi0NCi0NCi0vKiBGbGFncyBpbiBUU1IgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIENBTl9GTEFHU19UU1IgICAgICAgICAgICAgICgodWludDMyX3QpMHgwODAwMDAwMCkgDQotLyogRmxhZ3MgaW4gUkYxUiByZWdpc3RlciAqLw0KLSNkZWZpbmUgQ0FOX0ZMQUdTX1JGMVIgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA0MDAwMDAwKSANCi0vKiBGbGFncyBpbiBSRjBSIHJlZ2lzdGVyICovDQotI2RlZmluZSBDQU5fRkxBR1NfUkYwUiAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDIwMDAwMDApIA0KLS8qIEZsYWdzIGluIE1TUiByZWdpc3RlciAqLw0KLSNkZWZpbmUgQ0FOX0ZMQUdTX01TUiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAxMDAwMDAwKSANCi0vKiBGbGFncyBpbiBFU1IgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIENBTl9GTEFHU19FU1IgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMEYwMDAwMCkgDQotDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotc3RhdGljIElUU3RhdHVzIENoZWNrSVRTdGF0dXModWludDMyX3QgQ0FOX1JlZywgdWludDMyX3QgSXRfQml0KTsNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgQ0FOIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUuDQotICAqLw0KLXZvaWQgQ0FOX0RlSW5pdChDQU5fVHlwZURlZiogQ0FOeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gDQotICBpZiAoQ0FOeCA9PSBDQU4xKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgQ0FOMSByZXNldCBzdGF0ZSAqLw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0NBTjEsIEVOQUJMRSk7DQotICAgIC8qIFJlbGVhc2UgQ0FOMSBmcm9tIHJlc2V0IHN0YXRlICovDQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfQ0FOMSwgRElTQUJMRSk7DQotICB9DQotICBlbHNlDQotICB7ICANCi0gICAgLyogRW5hYmxlIENBTjIgcmVzZXQgc3RhdGUgKi8NCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9DQU4yLCBFTkFCTEUpOw0KLSAgICAvKiBSZWxlYXNlIENBTjIgZnJvbSByZXNldCBzdGF0ZSAqLw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0NBTjIsIERJU0FCTEUpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ0FOIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBDQU5fSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBDQU5fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIENBTl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAgKiAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgQ0FOIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgQ29uc3RhbnQgaW5kaWNhdGVzIGluaXRpYWxpemF0aW9uIHN1Y2NlZWQgd2hpY2ggd2lsbCBiZSANCi0gICogICBDQU5JTklURkFJTEVEIG9yIENBTklOSVRPSy4NCi0gICovDQotdWludDhfdCBDQU5fSW5pdChDQU5fVHlwZURlZiogQ0FOeCwgQ0FOX0luaXRUeXBlRGVmKiBDQU5fSW5pdFN0cnVjdCkNCi17DQotICB1aW50OF90IEluaXRTdGF0dXMgPSBDQU5JTklURkFJTEVEOw0KLSAgdWludDMyX3Qgd2FpdF9hY2sgPSAweDAwMDAwMDAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX1RUQ00pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fQUJPTSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX05BUlQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fUkZMTSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9UWEZQKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX01PREUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9Nb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1NKVyhDQU5fSW5pdFN0cnVjdC0+Q0FOX1NKVykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9CUzEoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzEpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fQlMyKENBTl9Jbml0U3RydWN0LT5DQU5fQlMyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1BSRVNDQUxFUihDQU5fSW5pdFN0cnVjdC0+Q0FOX1ByZXNjYWxlcikpOw0KLQ0KLSAgLyogZXhpdCBmcm9tIHNsZWVwIG1vZGUgKi8NCi0gIENBTngtPk1DUiAmPSAofih1aW50MzJfdClDQU5fTUNSX1NMRUVQKTsNCi0NCi0gIC8qIFJlcXVlc3QgaW5pdGlhbGlzYXRpb24gKi8NCi0gIENBTngtPk1DUiB8PSBDQU5fTUNSX0lOUlEgOw0KLQ0KLSAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8NCi0gIHdoaWxlICgoKENBTngtPk1TUiAmIENBTl9NU1JfSU5BSykgIT0gQ0FOX01TUl9JTkFLKSAmJiAod2FpdF9hY2sgIT0gSU5BS19USU1FT1VUKSkNCi0gIHsNCi0gICAgd2FpdF9hY2srKzsNCi0gIH0NCi0NCi0gIC8qIC4uLmFuZCBjaGVjayBhY2tub3dsZWRnZWQgKi8NCi0gIGlmICgoQ0FOeC0+TVNSICYgQ0FOX01TUl9JTkFLKSAhPSBDQU5fTVNSX0lOQUspDQotICB7DQotICAgIEluaXRTdGF0dXMgPSBDQU5JTklURkFJTEVEOw0KLSAgfQ0KLSAgZWxzZSANCi0gIHsNCi0gICAgLyogU2V0IHRoZSB0aW1lIHRyaWdnZXJlZCBjb21tdW5pY2F0aW9uIG1vZGUgKi8NCi0gICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSA9PSBFTkFCTEUpDQotICAgIHsNCi0gICAgICBDQU54LT5NQ1IgfD0gQ0FOX01DUl9UVENNOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfVFRDTTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyBidXMtb2ZmIG1hbmFnZW1lbnQgKi8NCi0gICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fQUJPTSA9PSBFTkFCTEUpDQotICAgIHsNCi0gICAgICBDQU54LT5NQ1IgfD0gQ0FOX01DUl9BQk9NOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfQUJPTTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUgKi8NCi0gICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fQVdVTSA9PSBFTkFCTEUpDQotICAgIHsNCi0gICAgICBDQU54LT5NQ1IgfD0gQ0FOX01DUl9BV1VNOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfQVdVTTsNCi0gICAgfQ0KLQ0KLSAgICAvKiBTZXQgdGhlIG5vIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLw0KLSAgICBpZiAoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9OQVJUID09IEVOQUJMRSkNCi0gICAgew0KLSAgICAgIENBTngtPk1DUiB8PSBDQU5fTUNSX05BUlQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgQ0FOeC0+TUNSICY9IH4odWludDMyX3QpQ0FOX01DUl9OQVJUOw0KLSAgICB9DQotDQotICAgIC8qIFNldCB0aGUgcmVjZWl2ZSBGSUZPIGxvY2tlZCBtb2RlICovDQotICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX1JGTE0gPT0gRU5BQkxFKQ0KLSAgICB7DQotICAgICAgQ0FOeC0+TUNSIHw9IENBTl9NQ1JfUkZMTTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBDQU54LT5NQ1IgJj0gfih1aW50MzJfdClDQU5fTUNSX1JGTE07DQotICAgIH0NCi0NCi0gICAgLyogU2V0IHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5ICovDQotICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX1RYRlAgPT0gRU5BQkxFKQ0KLSAgICB7DQotICAgICAgQ0FOeC0+TUNSIHw9IENBTl9NQ1JfVFhGUDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBDQU54LT5NQ1IgJj0gfih1aW50MzJfdClDQU5fTUNSX1RYRlA7DQotICAgIH0NCi0NCi0gICAgLyogU2V0IHRoZSBiaXQgdGltaW5nIHJlZ2lzdGVyICovDQotICAgIENBTngtPkJUUiA9ICh1aW50MzJfdCkoKHVpbnQzMl90KUNBTl9Jbml0U3RydWN0LT5DQU5fTW9kZSA8PCAzMCkgfCAoKHVpbnQzMl90KUNBTl9Jbml0U3RydWN0LT5DQU5fU0pXIDw8IDI0KSB8DQotICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSW5pdFN0cnVjdC0+Q0FOX0JTMSA8PCAxNikgfCAoKHVpbnQzMl90KUNBTl9Jbml0U3RydWN0LT5DQU5fQlMyIDw8IDIwKSB8DQotICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSW5pdFN0cnVjdC0+Q0FOX1ByZXNjYWxlciAtIDEpOw0KLQ0KLSAgICAvKiBSZXF1ZXN0IGxlYXZlIGluaXRpYWxpc2F0aW9uICovDQotICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfSU5SUTsNCi0NCi0gICAvKiBXYWl0IHRoZSBhY2tub3dsZWRnZSAqLw0KLSAgIHdhaXRfYWNrID0gMHgwMDsNCi0NCi0gICB3aGlsZSAoKChDQU54LT5NU1IgJiBDQU5fTVNSX0lOQUspID09IENBTl9NU1JfSU5BSykgJiYgKHdhaXRfYWNrICE9IElOQUtfVElNRU9VVCkpDQotICAgew0KLSAgICAgd2FpdF9hY2srKzsNCi0gICB9DQotDQotICAgIC8qIC4uLmFuZCBjaGVjayBhY2tub3dsZWRnZWQgKi8NCi0gICAgaWYgKChDQU54LT5NU1IgJiBDQU5fTVNSX0lOQUspID09IENBTl9NU1JfSU5BSykNCi0gICAgew0KLSAgICAgIEluaXRTdGF0dXMgPSBDQU5JTklURkFJTEVEOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIEluaXRTdGF0dXMgPSBDQU5JTklUT0sgOw0KLSAgICB9DQotICB9DQotDQotICAvKiBBdCB0aGlzIHN0ZXAsIHJldHVybiB0aGUgc3RhdHVzIG9mIGluaXRpYWxpemF0aW9uICovDQotICByZXR1cm4gSW5pdFN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICAqICAgcGFyYW1ldGVycyBpbiB0aGUgQ0FOX0ZpbHRlckluaXRTdHJ1Y3QuDQotICAqIEBwYXJhbSAgQ0FOX0ZpbHRlckluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBDQU5fRmlsdGVySW5pdFR5cGVEZWYNCi0gICogICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4NCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIENBTl9GaWx0ZXJJbml0KENBTl9GaWx0ZXJJbml0VHlwZURlZiogQ0FOX0ZpbHRlckluaXRTdHJ1Y3QpDQotew0KLSAgdWludDMyX3QgZmlsdGVyX251bWJlcl9iaXRfcG9zID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9OVU1CRVIoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fRklMVEVSX01PREUoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9TQ0FMRShDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlclNjYWxlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9GSUZPKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyRklGT0Fzc2lnbm1lbnQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyQWN0aXZhdGlvbikpOw0KLQ0KLSAgZmlsdGVyX251bWJlcl9iaXRfcG9zID0gKCh1aW50MzJfdCkweDAwMDAwMDAxKSA8PCBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcjsNCi0NCi0gIC8qIEluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCi0gIENBTjEtPkZNUiB8PSBGTVJfRklOSVQ7DQotDQotICAvKiBGaWx0ZXIgRGVhY3RpdmF0aW9uICovDQotICBDQU4xLT5GQTFSICY9IH4odWludDMyX3QpZmlsdGVyX251bWJlcl9iaXRfcG9zOw0KLQ0KLSAgLyogRmlsdGVyIFNjYWxlICovDQotICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSA9PSBDQU5fRmlsdGVyU2NhbGVfMTZiaXQpDQotICB7DQotICAgIC8qIDE2LWJpdCBzY2FsZSBmb3IgdGhlIGZpbHRlciAqLw0KLSAgICBDQU4xLT5GUzFSICY9IH4odWludDMyX3QpZmlsdGVyX251bWJlcl9iaXRfcG9zOw0KLQ0KLSAgICAvKiBGaXJzdCAxNi1iaXQgaWRlbnRpZmllciBhbmQgRmlyc3QgMTYtYml0IG1hc2sgKi8NCi0gICAgLyogT3IgRmlyc3QgMTYtYml0IGlkZW50aWZpZXIgYW5kIFNlY29uZCAxNi1iaXQgaWRlbnRpZmllciAqLw0KLSAgICBDQU4xLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMSA9IA0KLSAgICAoKDB4MDAwMEZGRkYgJiAodWludDMyX3QpQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNYXNrSWRMb3cpIDw8IDE2KSB8DQotICAgICAgICAoMHgwMDAwRkZGRiAmICh1aW50MzJfdClDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlcklkTG93KTsNCi0NCi0gICAgLyogU2Vjb25kIDE2LWJpdCBpZGVudGlmaWVyIGFuZCBTZWNvbmQgMTYtYml0IG1hc2sgKi8NCi0gICAgLyogT3IgVGhpcmQgMTYtYml0IGlkZW50aWZpZXIgYW5kIEZvdXJ0aCAxNi1iaXQgaWRlbnRpZmllciAqLw0KLSAgICBDQU4xLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMiA9IA0KLSAgICAoKDB4MDAwMEZGRkYgJiAodWludDMyX3QpQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNYXNrSWRIaWdoKSA8PCAxNikgfA0KLSAgICAgICAgKDB4MDAwMEZGRkYgJiAodWludDMyX3QpQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJJZEhpZ2gpOw0KLSAgfQ0KLQ0KLSAgaWYgKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyU2NhbGUgPT0gQ0FOX0ZpbHRlclNjYWxlXzMyYml0KQ0KLSAgew0KLSAgICAvKiAzMi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8NCi0gICAgQ0FOMS0+RlMxUiB8PSBmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQotICAgIC8qIDMyLWJpdCBpZGVudGlmaWVyIG9yIEZpcnN0IDMyLWJpdCBpZGVudGlmaWVyICovDQotICAgIENBTjEtPnNGaWx0ZXJSZWdpc3RlcltDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcl0uRlIxID0gDQotICAgICgoMHgwMDAwRkZGRiAmICh1aW50MzJfdClDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlcklkSGlnaCkgPDwgMTYpIHwNCi0gICAgICAgICgweDAwMDBGRkZGICYgKHVpbnQzMl90KUNBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRMb3cpOw0KLSAgICAvKiAzMi1iaXQgbWFzayBvciBTZWNvbmQgMzItYml0IGlkZW50aWZpZXIgKi8NCi0gICAgQ0FOMS0+c0ZpbHRlclJlZ2lzdGVyW0NBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTnVtYmVyXS5GUjIgPSANCi0gICAgKCgweDAwMDBGRkZGICYgKHVpbnQzMl90KUNBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkSGlnaCkgPDwgMTYpIHwNCi0gICAgICAgICgweDAwMDBGRkZGICYgKHVpbnQzMl90KUNBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkTG93KTsNCi0gIH0NCi0NCi0gIC8qIEZpbHRlciBNb2RlICovDQotICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNb2RlID09IENBTl9GaWx0ZXJNb2RlX0lkTWFzaykNCi0gIHsNCi0gICAgLypJZC9NYXNrIG1vZGUgZm9yIHRoZSBmaWx0ZXIqLw0KLSAgICBDQU4xLT5GTTFSICY9IH4odWludDMyX3QpZmlsdGVyX251bWJlcl9iaXRfcG9zOw0KLSAgfQ0KLSAgZWxzZSAvKiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1vZGUgPT0gQ0FOX0ZpbHRlck1vZGVfSWRMaXN0ICovDQotICB7DQotICAgIC8qSWRlbnRpZmllciBsaXN0IG1vZGUgZm9yIHRoZSBmaWx0ZXIqLw0KLSAgICBDQU4xLT5GTTFSIHw9ICh1aW50MzJfdClmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQotICB9DQotDQotICAvKiBGaWx0ZXIgRklGTyBhc3NpZ25tZW50ICovDQotICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJGSUZPQXNzaWdubWVudCA9PSBDQU5fRmlsdGVyRklGTzApDQotICB7DQotICAgIC8qIEZJRk8gMCBhc3NpZ25hdGlvbiBmb3IgdGhlIGZpbHRlciAqLw0KLSAgICBDQU4xLT5GRkExUiAmPSB+KHVpbnQzMl90KWZpbHRlcl9udW1iZXJfYml0X3BvczsNCi0gIH0NCi0NCi0gIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlckZJRk9Bc3NpZ25tZW50ID09IENBTl9GaWx0ZXJGSUZPMSkNCi0gIHsNCi0gICAgLyogRklGTyAxIGFzc2lnbmF0aW9uIGZvciB0aGUgZmlsdGVyICovDQotICAgIENBTjEtPkZGQTFSIHw9ICh1aW50MzJfdClmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQotICB9DQotICANCi0gIC8qIEZpbHRlciBhY3RpdmF0aW9uICovDQotICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJBY3RpdmF0aW9uID09IEVOQUJMRSkNCi0gIHsNCi0gICAgQ0FOMS0+RkExUiB8PSBmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQotICB9DQotDQotICAvKiBMZWF2ZSB0aGUgaW5pdGlhbGlzYXRpb24gbW9kZSBmb3IgdGhlIGZpbHRlciAqLw0KLSAgQ0FOMS0+Rk1SICY9IH5GTVJfRklOSVQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggQ0FOX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQotICAqIEBwYXJhbSAgQ0FOX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBDQU5fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoDQotICAqICAgd2lsbCBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIENBTl9TdHJ1Y3RJbml0KENBTl9Jbml0VHlwZURlZiogQ0FOX0luaXRTdHJ1Y3QpDQotew0KLSAgLyogUmVzZXQgQ0FOIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQotICAvKiBJbml0aWFsaXplIHRoZSB0aW1lIHRyaWdnZXJlZCBjb21tdW5pY2F0aW9uIG1vZGUgKi8NCi0gIENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSA9IERJU0FCTEU7DQotICAvKiBJbml0aWFsaXplIHRoZSBhdXRvbWF0aWMgYnVzLW9mZiBtYW5hZ2VtZW50ICovDQotICBDQU5fSW5pdFN0cnVjdC0+Q0FOX0FCT00gPSBESVNBQkxFOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgYXV0b21hdGljIHdha2UtdXAgbW9kZSAqLw0KLSAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNID0gRElTQUJMRTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIG5vIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLw0KLSAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9OQVJUID0gRElTQUJMRTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgRklGTyBsb2NrZWQgbW9kZSAqLw0KLSAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9SRkxNID0gRElTQUJMRTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IEZJRk8gcHJpb3JpdHkgKi8NCi0gIENBTl9Jbml0U3RydWN0LT5DQU5fVFhGUCA9IERJU0FCTEU7DQotICAvKiBJbml0aWFsaXplIHRoZSBDQU5fTW9kZSBtZW1iZXIgKi8NCi0gIENBTl9Jbml0U3RydWN0LT5DQU5fTW9kZSA9IENBTl9Nb2RlX05vcm1hbDsNCi0gIC8qIEluaXRpYWxpemUgdGhlIENBTl9TSlcgbWVtYmVyICovDQotICBDQU5fSW5pdFN0cnVjdC0+Q0FOX1NKVyA9IENBTl9TSldfMXRxOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX0JTMSBtZW1iZXIgKi8NCi0gIENBTl9Jbml0U3RydWN0LT5DQU5fQlMxID0gQ0FOX0JTMV80dHE7DQotICAvKiBJbml0aWFsaXplIHRoZSBDQU5fQlMyIG1lbWJlciAqLw0KLSAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzIgPSBDQU5fQlMyXzN0cTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIENBTl9QcmVzY2FsZXIgbWVtYmVyICovDQotICBDQU5fSW5pdFN0cnVjdC0+Q0FOX1ByZXNjYWxlciA9IDE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgc3RhcnQgYmFuayBmaWx0ZXIgZm9yIHNsYXZlIENBTi4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBTVE0zMiBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzLg0KLSAgKiBAcGFyYW0gIENBTl9CYW5rTnVtYmVyOiBTZWxlY3QgdGhlIHN0YXJ0IHNsYXZlIGJhbmsgZmlsdGVyIGZyb20gMS4uMjcuDQotICAqIEByZXR2YWwgTm9uZS4NCi0gICovDQotdm9pZCBDQU5fU2xhdmVTdGFydEJhbmsodWludDhfdCBDQU5fQmFua051bWJlcikgDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19DQU5fQkFOS05VTUJFUihDQU5fQmFua051bWJlcikpOw0KLSAgLyogZW50ZXIgSW5pdGlhbGlzYXRpb24gbW9kZSBmb3IgdGhlIGZpbHRlciAqLw0KLSAgQ0FOMS0+Rk1SIHw9IEZNUl9GSU5JVDsNCi0gIC8qIFNlbGVjdCB0aGUgc3RhcnQgc2xhdmUgYmFuayAqLw0KLSAgQ0FOMS0+Rk1SICY9ICh1aW50MzJfdCkweEZGRkZDMEYxIDsNCi0gIENBTjEtPkZNUiB8PSAodWludDMyX3QpKENBTl9CYW5rTnVtYmVyKTw8ODsNCi0gIC8qIExlYXZlIEluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCi0gIENBTjEtPkZNUiAmPSB+Rk1SX0ZJTklUOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgQ0FOeCBpbnRlcnJ1cHRzLg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIENBTl9JVDogc3BlY2lmaWVzIHRoZSBDQU4gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IA0KLSAgKiAgICAgICAgLUNBTl9JVF9UTUUsIA0KLSAgKiAgICAgICAgLUNBTl9JVF9GTVAwLCANCi0gICogICAgICAgIC1DQU5fSVRfRkYwLA0KLSAgKiAgICAgICAgLUNBTl9JVF9GT1YwLCANCi0gICogICAgICAgIC1DQU5fSVRfRk1QMSwgDQotICAqICAgICAgICAtQ0FOX0lUX0ZGMSwNCi0gICogICAgICAgIC1DQU5fSVRfRk9WMSwgDQotICAqICAgICAgICAtQ0FOX0lUX0VXRywgDQotICAqICAgICAgICAtQ0FOX0lUX0VQViwNCi0gICogICAgICAgIC1DQU5fSVRfTEVDLCANCi0gICogICAgICAgIC1DQU5fSVRfRVJSLCANCi0gICogICAgICAgIC1DQU5fSVRfV0tVIG9yIA0KLSAgKiAgICAgICAgLUNBTl9JVF9TTEsuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQ0FOIGludGVycnVwdHMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIENBTl9JVENvbmZpZyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDMyX3QgQ0FOX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0lUKENBTl9JVCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0NCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIENBTnggaW50ZXJydXB0ICovDQotICAgIENBTngtPklFUiB8PSBDQU5fSVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIENBTnggaW50ZXJydXB0ICovDQotICAgIENBTngtPklFUiAmPSB+Q0FOX0lUOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWF0ZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBhIG1lc3NhZ2UuDQotICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVHhNZXNzYWdlOiBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIENBTiBJZCwgQ0FODQotICAqICAgRExDIGFuZCBDQU4gZGF0YXMuDQotICAqIEByZXR2YWwgVGhlIG51bWJlciBvZiB0aGUgbWFpbGJveCB0aGF0IGlzIHVzZWQgZm9yIHRyYW5zbWlzc2lvbg0KLSAgKiAgIG9yIENBTl9OT19NQiBpZiB0aGVyZSBpcyBubyBlbXB0eSBtYWlsYm94Lg0KLSAgKi8NCi11aW50OF90IENBTl9UcmFuc21pdChDQU5fVHlwZURlZiogQ0FOeCwgQ2FuVHhNc2cqIFR4TWVzc2FnZSkNCi17DQotICB1aW50OF90IHRyYW5zbWl0X21haWxib3ggPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0lEVFlQRShUeE1lc3NhZ2UtPklERSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9SVFIoVHhNZXNzYWdlLT5SVFIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fRExDKFR4TWVzc2FnZS0+RExDKSk7DQotDQotICAvKiBTZWxlY3Qgb25lIGVtcHR5IHRyYW5zbWl0IG1haWxib3ggKi8NCi0gIGlmICgoQ0FOeC0+VFNSJkNBTl9UU1JfVE1FMCkgPT0gQ0FOX1RTUl9UTUUwKQ0KLSAgew0KLSAgICB0cmFuc21pdF9tYWlsYm94ID0gMDsNCi0gIH0NCi0gIGVsc2UgaWYgKChDQU54LT5UU1ImQ0FOX1RTUl9UTUUxKSA9PSBDQU5fVFNSX1RNRTEpDQotICB7DQotICAgIHRyYW5zbWl0X21haWxib3ggPSAxOw0KLSAgfQ0KLSAgZWxzZSBpZiAoKENBTngtPlRTUiZDQU5fVFNSX1RNRTIpID09IENBTl9UU1JfVE1FMikNCi0gIHsNCi0gICAgdHJhbnNtaXRfbWFpbGJveCA9IDI7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIHRyYW5zbWl0X21haWxib3ggPSBDQU5fTk9fTUI7DQotICB9DQotDQotICBpZiAodHJhbnNtaXRfbWFpbGJveCAhPSBDQU5fTk9fTUIpDQotICB7DQotICAgIC8qIFNldCB1cCB0aGUgSWQgKi8NCi0gICAgQ0FOeC0+c1R4TWFpbEJveFt0cmFuc21pdF9tYWlsYm94XS5USVIgJj0gVE1JRHhSX1RYUlE7DQotICAgIGlmIChUeE1lc3NhZ2UtPklERSA9PSBDQU5fSURfU1REKQ0KLSAgICB7DQotICAgICAgYXNzZXJ0X3BhcmFtKElTX0NBTl9TVERJRChUeE1lc3NhZ2UtPlN0ZElkKSk7ICANCi0gICAgICBDQU54LT5zVHhNYWlsQm94W3RyYW5zbWl0X21haWxib3hdLlRJUiB8PSAoKFR4TWVzc2FnZS0+U3RkSWQgPDwgMjEpIHwgVHhNZXNzYWdlLT5SVFIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGFzc2VydF9wYXJhbShJU19DQU5fRVhUSUQoVHhNZXNzYWdlLT5FeHRJZCkpOw0KLSAgICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVElSIHw9ICgoVHhNZXNzYWdlLT5FeHRJZDw8MykgfCBUeE1lc3NhZ2UtPklERSB8IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhNZXNzYWdlLT5SVFIpOw0KLSAgICB9DQotICAgIA0KLQ0KLSAgICAvKiBTZXQgdXAgdGhlIERMQyAqLw0KLSAgICBUeE1lc3NhZ2UtPkRMQyAmPSAodWludDhfdCkweDAwMDAwMDBGOw0KLSAgICBDQU54LT5zVHhNYWlsQm94W3RyYW5zbWl0X21haWxib3hdLlREVFIgJj0gKHVpbnQzMl90KTB4RkZGRkZGRjA7DQotICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVERUUiB8PSBUeE1lc3NhZ2UtPkRMQzsNCi0NCi0gICAgLyogU2V0IHVwIHRoZSBkYXRhIGZpZWxkICovDQotICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVERMUiA9ICgoKHVpbnQzMl90KVR4TWVzc2FnZS0+RGF0YVszXSA8PCAyNCkgfCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVR4TWVzc2FnZS0+RGF0YVsyXSA8PCAxNikgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVHhNZXNzYWdlLT5EYXRhWzFdIDw8IDgpIHwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUeE1lc3NhZ2UtPkRhdGFbMF0pKTsNCi0gICAgQ0FOeC0+c1R4TWFpbEJveFt0cmFuc21pdF9tYWlsYm94XS5UREhSID0gKCgodWludDMyX3QpVHhNZXNzYWdlLT5EYXRhWzddIDw8IDI0KSB8IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVHhNZXNzYWdlLT5EYXRhWzZdIDw8IDE2KSB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUeE1lc3NhZ2UtPkRhdGFbNV0gPDwgOCkgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVHhNZXNzYWdlLT5EYXRhWzRdKSk7DQotICAgIC8qIFJlcXVlc3QgdHJhbnNtaXNzaW9uICovDQotICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVElSIHw9IFRNSUR4Ul9UWFJROw0KLSAgfQ0KLSAgcmV0dXJuIHRyYW5zbWl0X21haWxib3g7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB0aGUgdHJhbnNtaXNzaW9uIG9mIGEgbWVzc2FnZS4NCi0gICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUcmFuc21pdE1haWxib3g6IHRoZSBudW1iZXIgb2YgdGhlIG1haWxib3ggdGhhdCBpcyB1c2VkIGZvciB0cmFuc21pc3Npb24uDQotICAqIEByZXR2YWwgQ0FOVFhPSyBpZiB0aGUgQ0FOIGRyaXZlciB0cmFuc21pdHMgdGhlIG1lc3NhZ2UsIENBTlRYRkFJTEVEIGluIGFuIG90aGVyIGNhc2UuDQotICAqLw0KLXVpbnQ4X3QgQ0FOX1RyYW5zbWl0U3RhdHVzKENBTl9UeXBlRGVmKiBDQU54LCB1aW50OF90IFRyYW5zbWl0TWFpbGJveCkNCi17DQotICAvKiBSUUNQLCBUWE9LIGFuZCBUTUUgYml0cyAqLw0KLSAgdWludDhfdCBzdGF0ZSA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fVFJBTlNNSVRNQUlMQk9YKFRyYW5zbWl0TWFpbGJveCkpOw0KLSAgc3dpdGNoIChUcmFuc21pdE1haWxib3gpDQotICB7DQotICAgIGNhc2UgKDApOiBzdGF0ZSB8PSAodWludDhfdCkoKENBTngtPlRTUiAmIENBTl9UU1JfUlFDUDApIDw8IDIpOw0KLSAgICAgIHN0YXRlIHw9ICh1aW50OF90KSgoQ0FOeC0+VFNSICYgQ0FOX1RTUl9UWE9LMCkgPj4gMCk7DQotICAgICAgc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1RNRTApID4+IDI2KTsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSAoMSk6IHN0YXRlIHw9ICh1aW50OF90KSgoQ0FOeC0+VFNSICYgQ0FOX1RTUl9SUUNQMSkgPj4gNik7DQotICAgICAgc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1RYT0sxKSA+PiA4KTsNCi0gICAgICBzdGF0ZSB8PSAodWludDhfdCkoKENBTngtPlRTUiAmIENBTl9UU1JfVE1FMSkgPj4gMjcpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlICgyKTogc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1JRQ1AyKSA+PiAxNCk7DQotICAgICAgc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1RYT0syKSA+PiAxNik7DQotICAgICAgc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1RNRTIpID4+IDI4KTsNCi0gICAgICBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdGF0ZSA9IENBTlRYRkFJTEVEOw0KLSAgICAgIGJyZWFrOw0KLSAgfQ0KLSAgc3dpdGNoIChzdGF0ZSkNCi0gIHsNCi0gICAgICAvKiB0cmFuc21pdCBwZW5kaW5nICAqLw0KLSAgICBjYXNlICgweDApOiBzdGF0ZSA9IENBTlRYUEVORElORzsNCi0gICAgICBicmVhazsNCi0gICAgICAvKiB0cmFuc21pdCBmYWlsZWQgICovDQotICAgIGNhc2UgKDB4NSk6IHN0YXRlID0gQ0FOVFhGQUlMRUQ7DQotICAgICAgYnJlYWs7DQotICAgICAgLyogdHJhbnNtaXQgc3VjY2VkZWVkICAqLw0KLSAgICBjYXNlICgweDcpOiBzdGF0ZSA9IENBTlRYT0s7DQotICAgICAgYnJlYWs7DQotICAgIGRlZmF1bHQ6DQotICAgICAgc3RhdGUgPSBDQU5UWEZBSUxFRDsNCi0gICAgICBicmVhazsNCi0gIH0NCi0gIHJldHVybiBzdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2FuY2VscyBhIHRyYW5zbWl0IHJlcXVlc3QuDQotICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuIA0KLSAgKiBAcGFyYW0gIE1haWxib3g6IE1haWxib3ggbnVtYmVyLg0KLSAgKiBAcmV0dmFsIE5vbmUuDQotICAqLw0KLXZvaWQgQ0FOX0NhbmNlbFRyYW5zbWl0KENBTl9UeXBlRGVmKiBDQU54LCB1aW50OF90IE1haWxib3gpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1RSQU5TTUlUTUFJTEJPWChNYWlsYm94KSk7DQotICAvKiBhYm9ydCB0cmFuc21pc3Npb24gKi8NCi0gIHN3aXRjaCAoTWFpbGJveCkNCi0gIHsNCi0gICAgY2FzZSAoMCk6IENBTngtPlRTUiB8PSBDQU5fVFNSX0FCUlEwOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlICgxKTogQ0FOeC0+VFNSIHw9IENBTl9UU1JfQUJSUTE7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgKDIpOiBDQU54LT5UU1IgfD0gQ0FOX1RTUl9BQlJRMjsNCi0gICAgICBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0gICAgICBicmVhazsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmVsZWFzZXMgYSBGSUZPLg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLiANCi0gICogQHBhcmFtICBGSUZPTnVtYmVyOiBGSUZPIHRvIHJlbGVhc2UsIENBTl9GSUZPMCBvciBDQU5fRklGTzEuDQotICAqIEByZXR2YWwgTm9uZS4NCi0gICovDQotdm9pZCBDQU5fRklGT1JlbGVhc2UoQ0FOX1R5cGVEZWYqIENBTngsIHVpbnQ4X3QgRklGT051bWJlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7DQotICAvKiBSZWxlYXNlIEZJRk8wICovDQotICBpZiAoRklGT051bWJlciA9PSBDQU5fRklGTzApDQotICB7DQotICAgIENBTngtPlJGMFIgfD0gQ0FOX1JGMFJfUkZPTTA7DQotICB9DQotICAvKiBSZWxlYXNlIEZJRk8xICovDQotICBlbHNlIC8qIEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xICovDQotICB7DQotICAgIENBTngtPlJGMVIgfD0gQ0FOX1JGMVJfUkZPTTE7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiBwZW5kaW5nIG1lc3NhZ2VzLg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEZJRk9OdW1iZXI6IFJlY2VpdmUgRklGTyBudW1iZXIsIENBTl9GSUZPMCBvciBDQU5fRklGTzEuDQotICAqIEByZXR2YWwgTmJNZXNzYWdlIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgcGVuZGluZyBtZXNzYWdlLg0KLSAgKi8NCi11aW50OF90IENBTl9NZXNzYWdlUGVuZGluZyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBGSUZPTnVtYmVyKQ0KLXsNCi0gIHVpbnQ4X3QgbWVzc2FnZV9wZW5kaW5nPTA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7DQotICBpZiAoRklGT051bWJlciA9PSBDQU5fRklGTzApDQotICB7DQotICAgIG1lc3NhZ2VfcGVuZGluZyA9ICh1aW50OF90KShDQU54LT5SRjBSJih1aW50MzJfdCkweDAzKTsNCi0gIH0NCi0gIGVsc2UgaWYgKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xKQ0KLSAgew0KLSAgICBtZXNzYWdlX3BlbmRpbmcgPSAodWludDhfdCkoQ0FOeC0+UkYxUiYodWludDMyX3QpMHgwMyk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIG1lc3NhZ2VfcGVuZGluZyA9IDA7DQotICB9DQotICByZXR1cm4gbWVzc2FnZV9wZW5kaW5nOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZWNlaXZlcyBhIG1lc3NhZ2UuDQotICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgRklGT051bWJlcjogUmVjZWl2ZSBGSUZPIG51bWJlciwgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMS4NCi0gICogQHBhcmFtICBSeE1lc3NhZ2U6IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgcmVjZWl2ZSBtZXNzYWdlIHdoaWNoIA0KLSAgKiAgIGNvbnRhaW5zIENBTiBJZCwgQ0FOIERMQywgQ0FOIGRhdGFzIGFuZCBGTUkgbnVtYmVyLg0KLSAgKiBAcmV0dmFsIE5vbmUuDQotICAqLw0KLXZvaWQgQ0FOX1JlY2VpdmUoQ0FOX1R5cGVEZWYqIENBTngsIHVpbnQ4X3QgRklGT051bWJlciwgQ2FuUnhNc2cqIFJ4TWVzc2FnZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7DQotICAvKiBHZXQgdGhlIElkICovDQotICBSeE1lc3NhZ2UtPklERSA9ICh1aW50OF90KTB4MDQgJiBDQU54LT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSOw0KLSAgaWYgKFJ4TWVzc2FnZS0+SURFID09IENBTl9JRF9TVEQpDQotICB7DQotICAgIFJ4TWVzc2FnZS0+U3RkSWQgPSAodWludDMyX3QpMHgwMDAwMDdGRiAmIChDQU54LT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSID4+IDIxKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgUnhNZXNzYWdlLT5FeHRJZCA9ICh1aW50MzJfdCkweDFGRkZGRkZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVIgPj4gMyk7DQotICB9DQotICANCi0gIFJ4TWVzc2FnZS0+UlRSID0gKHVpbnQ4X3QpMHgwMiAmIENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVI7DQotICAvKiBHZXQgdGhlIERMQyAqLw0KLSAgUnhNZXNzYWdlLT5ETEMgPSAodWludDhfdCkweDBGICYgQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJEVFI7DQotICAvKiBHZXQgdGhlIEZNSSAqLw0KLSAgUnhNZXNzYWdlLT5GTUkgPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRFRSID4+IDgpOw0KLSAgLyogR2V0IHRoZSBkYXRhIGZpZWxkICovDQotICBSeE1lc3NhZ2UtPkRhdGFbMF0gPSAodWludDhfdCkweEZGICYgQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJETFI7DQotICBSeE1lc3NhZ2UtPkRhdGFbMV0gPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSID4+IDgpOw0KLSAgUnhNZXNzYWdlLT5EYXRhWzJdID0gKHVpbnQ4X3QpMHhGRiAmIChDQU54LT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUiA+PiAxNik7DQotICBSeE1lc3NhZ2UtPkRhdGFbM10gPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSID4+IDI0KTsNCi0gIFJ4TWVzc2FnZS0+RGF0YVs0XSA9ICh1aW50OF90KTB4RkYgJiBDQU54LT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUjsNCi0gIFJ4TWVzc2FnZS0+RGF0YVs1XSA9ICh1aW50OF90KTB4RkYgJiAoQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJESFIgPj4gOCk7DQotICBSeE1lc3NhZ2UtPkRhdGFbNl0gPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDE2KTsNCi0gIFJ4TWVzc2FnZS0+RGF0YVs3XSA9ICh1aW50OF90KTB4RkYgJiAoQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJESFIgPj4gMjQpOw0KLSAgLyogUmVsZWFzZSB0aGUgRklGTyAqLw0KLSAgQ0FOX0ZJRk9SZWxlYXNlKENBTngsIEZJRk9OdW1iZXIpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBEQkcgRnJlZXplIGZvciBDQU4uDQotICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQ0FOIHBlcmlwaGVyYWwuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIENBTl9EQkdGcmVlemUoQ0FOX1R5cGVEZWYqIENBTngsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgRGVidWcgRnJlZXplICAqLw0KLSAgICBDQU54LT5NQ1IgfD0gTUNSX0RCRjsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSBEZWJ1ZyBGcmVlemUgKi8NCi0gICAgQ0FOeC0+TUNSICY9IH5NQ1JfREJGOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbnRlcnMgdGhlIGxvdyBwb3dlciBtb2RlLg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIENBTlNMRUVQT0sgaWYgc2xlZXAgZW50ZXJlZCwgQ0FOU0xFRVBGQUlMRUQgaW4gYW4gb3RoZXIgY2FzZS4NCi0gICovDQotdWludDhfdCBDQU5fU2xlZXAoQ0FOX1R5cGVEZWYqIENBTngpDQotew0KLSAgdWludDhfdCBzbGVlcHN0YXR1cyA9IENBTlNMRUVQRkFJTEVEOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gICAgDQotICAvKiBSZXF1ZXN0IFNsZWVwIG1vZGUgKi8NCi0gICBDQU54LT5NQ1IgPSAoKChDQU54LT5NQ1IpICYgKHVpbnQzMl90KSh+KHVpbnQzMl90KUNBTl9NQ1JfSU5SUSkpIHwgQ0FOX01DUl9TTEVFUCk7DQotICAgDQotICAvKiBTbGVlcCBtb2RlIHN0YXR1cyAqLw0KLSAgaWYgKChDQU54LT5NU1IgJiAoQ0FOX01TUl9TTEFLfENBTl9NU1JfSU5BSykpID09IENBTl9NU1JfU0xBSykNCi0gIHsNCi0gICAgLyogU2xlZXAgbW9kZSBub3QgZW50ZXJlZCAqLw0KLSAgICBzbGVlcHN0YXR1cyA9ICBDQU5TTEVFUE9LOw0KLSAgfQ0KLSAgLyogQXQgdGhpcyBzdGVwLCBzbGVlcCBtb2RlIHN0YXR1cyAqLw0KLSAgIHJldHVybiAodWludDhfdClzbGVlcHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgV2FrZXMgdGhlIENBTiB1cC4NCi0gICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBDQU5XQUtFVVBPSyBpZiBzbGVlcCBtb2RlIGxlZnQsIENBTldBS0VVUEZBSUxFRCBpbiBhbiBvdGhlciBjYXNlLg0KLSAgKi8NCi11aW50OF90IENBTl9XYWtlVXAoQ0FOX1R5cGVEZWYqIENBTngpDQotew0KLSAgdWludDMyX3Qgd2FpdF9zbGFrID0gU0xBS19USU1FT1VUOw0KLSAgdWludDhfdCB3YWtldXBzdGF0dXMgPSBDQU5XQUtFVVBGQUlMRUQ7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KLSAgICANCi0gIC8qIFdha2UgdXAgcmVxdWVzdCAqLw0KLSAgQ0FOeC0+TUNSICY9IH4odWludDMyX3QpQ0FOX01DUl9TTEVFUDsNCi0gICAgDQotICAvKiBTbGVlcCBtb2RlIHN0YXR1cyAqLw0KLSAgd2hpbGUoKChDQU54LT5NU1IgJiBDQU5fTVNSX1NMQUspID09IENBTl9NU1JfU0xBSykmJih3YWl0X3NsYWshPTB4MDApKQ0KLSAgew0KLSAgIHdhaXRfc2xhay0tOw0KLSAgfQ0KLSAgaWYoKENBTngtPk1TUiAmIENBTl9NU1JfU0xBSykgIT0gQ0FOX01TUl9TTEFLKQ0KLSAgew0KLSAgIC8qIFNsZWVwIG1vZGUgZXhpdGVkICovDQotICAgIHdha2V1cHN0YXR1cyA9IENBTldBS0VVUE9LOw0KLSAgfQ0KLSAgLyogQXQgdGhpcyBzdGVwLCBzbGVlcCBtb2RlIHN0YXR1cyAqLw0KLSAgcmV0dXJuICh1aW50OF90KXdha2V1cHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIENBTl9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiANCi0gICogICAgICAgICAtIENBTl9GTEFHX0VXRw0KLSAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfRVBWIA0KLSAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfQk9GDQotICAqICAgICAgICAgLSBDQU5fRkxBR19SUUNQMA0KLSAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfUlFDUDENCi0gICogICAgICAgICAtIENBTl9GTEFHX1JRQ1AyDQotICAqICAgICAgICAgLSBDQU5fRkxBR19GTVAxICAgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19GRjEgICAgICAgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19GT1YxICAgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19GTVAwICAgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19GRjAgICAgICAgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19GT1YwICAgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19XS1UgDQotICAqICAgICAgICAgLSBDQU5fRkxBR19TTEFLICANCi0gICogICAgICAgICAtIENBTl9GTEFHX0xFQyAgICAgICANCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIENBTl9GTEFHIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIENBTl9HZXRGbGFnU3RhdHVzKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fRkxBRykNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fR0VUX0ZMQUcoQ0FOX0ZMQUcpKTsNCi0gIA0KLQ0KLSAgaWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX0VTUikgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgeyANCi0gICAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIENBTiBmbGFnICovDQotICAgIGlmICgoQ0FOeC0+RVNSICYgKENBTl9GTEFHICYgMHgwMDBGRkZGRikpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gICAgeyANCi0gICAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCi0gICAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7IA0KLSAgICAgIC8qIENBTl9GTEFHIGlzIHJlc2V0ICovDQotICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgIH0NCi0gIH0NCi0gIGVsc2UgaWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX01TUikgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgeyANCi0gICAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIENBTiBmbGFnICovDQotICAgIGlmICgoQ0FOeC0+TVNSICYgKENBTl9GTEFHICYgMHgwMDBGRkZGRikpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gICAgeyANCi0gICAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCi0gICAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7IA0KLSAgICAgIC8qIENBTl9GTEFHIGlzIHJlc2V0ICovDQotICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgIH0NCi0gIH0NCi0gIGVsc2UgaWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX1RTUikgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgeyANCi0gICAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIENBTiBmbGFnICovDQotICAgIGlmICgoQ0FOeC0+VFNSICYgKENBTl9GTEFHICYgMHgwMDBGRkZGRikpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gICAgeyANCi0gICAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCi0gICAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7IA0KLSAgICAgIC8qIENBTl9GTEFHIGlzIHJlc2V0ICovDQotICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgIH0NCi0gIH0NCi0gIGVsc2UgaWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX1JGMFIpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsgDQotICAgIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyAqLw0KLSAgICBpZiAoKENBTngtPlJGMFIgJiAoQ0FOX0ZMQUcgJiAweDAwMEZGRkZGKSkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgICB7IA0KLSAgICAgIC8qIENBTl9GTEFHIGlzIHNldCAqLw0KLSAgICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsgDQotICAgICAgLyogQ0FOX0ZMQUcgaXMgcmVzZXQgKi8NCi0gICAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gICAgfQ0KLSAgfQ0KLSAgZWxzZSAvKiBJZihDQU5fRkxBRyAmIENBTl9GTEFHU19SRjFSICE9ICh1aW50MzJfdClSRVNFVCkgKi8NCi0gIHsgDQotICAgIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyAqLw0KLSAgICBpZiAoKHVpbnQzMl90KShDQU54LT5SRjFSICYgKENBTl9GTEFHICYgMHgwMDBGRkZGRikpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gICAgeyANCi0gICAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCi0gICAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7IA0KLSAgICAgIC8qIENBTl9GTEFHIGlzIHJlc2V0ICovDQotICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgIH0NCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgQ0FOX0ZMQUcgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBDQU4ncyBwZW5kaW5nIGZsYWdzLg0KLSAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIENBTl9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiANCi0gICogICAgICAgICAtIENBTl9GTEFHX1JRQ1AwDQotICAqICAgICAgICAgLSBDQU5fRkxBR19SUUNQMQ0KLSAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfUlFDUDINCi0gICogICAgICAgICAtIENBTl9GTEFHX0ZGMSAgICAgICANCi0gICogICAgICAgICAtIENBTl9GTEFHX0ZPVjEgICANCi0gICogICAgICAgICAtIENBTl9GTEFHX0ZGMCAgICAgICANCi0gICogICAgICAgICAtIENBTl9GTEFHX0ZPVjAgICANCi0gICogICAgICAgICAtIENBTl9GTEFHX1dLVSAgIA0KLSAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfU0xBSyAgICANCi0gICogICAgICAgICAtIENBTl9GTEFHX0xFQyAgICAgICANCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIENBTl9DbGVhckZsYWcoQ0FOX1R5cGVEZWYqIENBTngsIHVpbnQzMl90IENBTl9GTEFHKQ0KLXsNCi0gIHVpbnQzMl90IGZsYWd0bXA9MDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9DTEVBUl9GTEFHKENBTl9GTEFHKSk7DQotICANCi0gIGlmIChDQU5fRkxBRyA9PSBDQU5fRkxBR19MRUMpIC8qIEVTUiByZWdpc3RlciAqLw0KLSAgew0KLSAgICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQ0FOIGZsYWdzICovDQotICAgIENBTngtPkVTUiA9ICh1aW50MzJfdClSRVNFVDsNCi0gIH0NCi0gIGVsc2UgLyogTVNSIG9yIFRTUiBvciBSRjBSIG9yIFJGMVIgKi8NCi0gIHsNCi0gICAgZmxhZ3RtcCA9IENBTl9GTEFHICYgMHgwMDBGRkZGRjsNCi0NCi0gICAgaWYgKChDQU5fRkxBRyAmIENBTl9GTEFHU19SRjBSKSE9KHVpbnQzMl90KVJFU0VUKQ0KLSAgICB7DQotICAgICAgLyogUmVjZWl2ZSBGbGFncyAqLw0KLSAgICAgIENBTngtPlJGMFIgPSAodWludDMyX3QpKGZsYWd0bXApOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKChDQU5fRkxBRyAmIENBTl9GTEFHU19SRjFSKSE9KHVpbnQzMl90KVJFU0VUKQ0KLSAgICB7DQotICAgICAgLyogUmVjZWl2ZSBGbGFncyAqLw0KLSAgICAgIENBTngtPlJGMVIgPSAodWludDMyX3QpKGZsYWd0bXApOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKChDQU5fRkxBRyAmIENBTl9GTEFHU19UU1IpIT0odWludDMyX3QpUkVTRVQpDQotICAgIHsNCi0gICAgICAvKiBUcmFuc21pdCBGbGFncyAqLw0KLSAgICAgIENBTngtPlRTUiA9ICh1aW50MzJfdCkoZmxhZ3RtcCk7DQotICAgIH0NCi0gICAgZWxzZSAvKiBJZigoQ0FOX0ZMQUcgJiBDQU5fRkxBR1NfTVNSKSE9KHVpbnQzMl90KVJFU0VUKSAqLw0KLSAgICB7DQotICAgICAgLyogT3BlcmF0aW5nIG1vZGUgRmxhZ3MgKi8NCi0gICAgICBDQU54LT5NU1IgPSAodWludDMyX3QpKGZsYWd0bXApOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ0FOeCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0gICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBDQU5fSVQ6IHNwZWNpZmllcyB0aGUgQ0FOIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiANCi0gICogICAgICAgICAtICBDQU5fSVRfVE1FICAgICAgICAgICAgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0ZNUDAgICAgICAgICAgICAgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9GRjAgICAgICAgICAgICAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfRk9WMCAgICAgICAgICAgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0ZNUDEgICAgICAgICAgICAgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9GRjEgICAgICAgICAgICAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfRk9WMSAgICAgICAgICAgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX1dLVSAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX1NMSyAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0VXRyAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfRVBWICAgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9CT0YgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0xFQyAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfRVJSIA0KLSAgKiBAcmV0dmFsIFRoZSBjdXJyZW50ICBzdGF0ZSBvZiBDQU5fSVQgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUlUU3RhdHVzIENBTl9HZXRJVFN0YXR1cyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDMyX3QgQ0FOX0lUKQ0KLXsNCi0gIElUU3RhdHVzIGl0c3RhdHVzID0gUkVTRVQ7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCi0gIGFzc2VydF9wYXJhbShJU19DQU5fSVQoQ0FOX0lUKSk7DQotICANCi0gIC8qIGNoZWNrIHRoZSBlbmFibGUgaW50ZXJydXB0IGJpdCAqLw0KLSBpZigoQ0FOeC0+SUVSICYgQ0FOX0lUKSAhPSBSRVNFVCkNCi0gew0KLSAgIC8qIGluIGNhc2UgdGhlIEludGVycnVwdCBpcyBlbmFibGVkLCAuLi4uICovDQotICAgIHN3aXRjaCAoQ0FOX0lUKQ0KLSAgICB7DQotICAgICAgY2FzZSBDQU5fSVRfVE1FOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9UU1JfUlFDUHggYml0cyAqLw0KLQkgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+VFNSLCBDQU5fVFNSX1JRQ1AwfENBTl9UU1JfUlFDUDF8Q0FOX1RTUl9SUUNQMik7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfRk1QMDoNCi0gICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fUkYwUl9GTVAwIGJpdCAqLw0KLQkgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+UkYwUiwgQ0FOX1JGMFJfRk1QMCk7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfRkYwOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9SRjBSX0ZVTEwwIGJpdCAqLw0KLSAgICAgICAgICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPlJGMFIsIENBTl9SRjBSX0ZVTEwwKTsgIA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9GT1YwOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9SRjBSX0ZPVlIwIGJpdCAqLw0KLSAgICAgICAgICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPlJGMFIsIENBTl9SRjBSX0ZPVlIwKTsgIA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9GTVAxOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9SRjFSX0ZNUDEgYml0ICovDQotICAgICAgICAgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+UkYxUiwgQ0FOX1JGMVJfRk1QMSk7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfRkYxOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9SRjFSX0ZVTEwxIGJpdCAqLw0KLQkgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+UkYxUiwgQ0FOX1JGMVJfRlVMTDEpOyAgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0ZPVjE6DQotICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX1JGMVJfRk9WUjEgYml0ICovDQotCSAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5SRjFSLCBDQU5fUkYxUl9GT1ZSMSk7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfV0tVOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9NU1JfV0tVSSBiaXQgKi8NCi0gICAgICAgICAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5NU1IsIENBTl9NU1JfV0tVSSk7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfU0xLOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9NU1JfU0xBS0kgYml0ICovDQotCSAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5NU1IsIENBTl9NU1JfU0xBS0kpOyAgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0VXRzoNCi0gICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fRVNSX0VXR0YgYml0ICovDQotCSAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5FU1IsIENBTl9FU1JfRVdHRik7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfRVBWOg0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9FU1JfRVBWRiBiaXQgKi8NCi0JICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+RVNSLCBDQU5fRVNSX0VQVkYpOyAgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0JPRjoNCi0gICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fRVNSX0JPRkYgYml0ICovDQotCSAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPkVTUiwgQ0FOX0VTUl9CT0ZGKTsgIA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9MRUM6DQotICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX0VTUl9MRUMgYml0ICovDQotCSAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPkVTUiwgQ0FOX0VTUl9MRUMpOyAgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0VSUjoNCi0gICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fTVNSX0VSUkksIENBTl9FU1JfRVdHRiwgQ0FOX0VTUl9FUFZGLCBDQU5fRVNSX0JPRkYgYW5kIENBTl9FU1JfTEVDICBiaXRzICovDQotCSAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5FU1IsIENBTl9FU1JfRVdHRnxDQU5fRVNSX0VQVkZ8Q0FOX0VTUl9CT0ZGfENBTl9FU1JfTEVDKTsgDQotICAgICAgICAgICAgICBpdHN0YXR1cyB8PSBDaGVja0lUU3RhdHVzKENBTngtPk1TUiwgQ0FOX01TUl9FUlJJKTsgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGRlZmF1bHQgOg0KLSAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBSRVNFVCAqLw0KLSAgICAgICAgICAgICAgaXRzdGF0dXMgPSBSRVNFVDsNCi0gICAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICBlbHNlDQotICB7DQotICAgLyogaW4gY2FzZSB0aGUgSW50ZXJydXB0IGlzIG5vdCBlbmFibGVkLCByZXR1cm4gUkVTRVQgKi8NCi0gICAgaXRzdGF0dXMgID0gUkVTRVQ7DQotICB9DQotICANCi0gIC8qIFJldHVybiB0aGUgQ0FOX0lUIHN0YXR1cyAqLw0KLSAgcmV0dXJuICBpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBDQU54knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBDQU5fSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9UTUUgICAgICAgICAgICAgICAgICAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfRkYwICAgICAgICAgICAgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0ZPVjAgICAgICAgICAgICAgICAgICAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfRkYxICAgICAgICAgICAgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0ZPVjEgICAgICAgICAgICAgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9XS1UgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9TTEsgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9FV0cgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0VQViAgICANCi0gICogICAgICAgICAtICBDQU5fSVRfQk9GICAgIA0KLSAgKiAgICAgICAgIC0gIENBTl9JVF9MRUMgICAgDQotICAqICAgICAgICAgLSAgQ0FOX0lUX0VSUiANCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIENBTl9DbGVhcklUUGVuZGluZ0JpdChDQU5fVHlwZURlZiogQ0FOeCwgdWludDMyX3QgQ0FOX0lUKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NBTl9DTEVBUl9JVChDQU5fSVQpKTsNCi0NCi0gIHN3aXRjaCAoQ0FOX0lUKQ0KLSAgew0KLSAgICAgIGNhc2UgQ0FOX0lUX1RNRToNCi0gICAgICAgICAgICAgIC8qIENsZWFyIENBTl9UU1JfUlFDUHggKHJjX3cxKSovDQotCSAgICAgIENBTngtPlRTUiA9IENBTl9UU1JfUlFDUDB8Q0FOX1RTUl9SUUNQMXxDQU5fVFNSX1JRQ1AyOyAgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0ZGMDoNCi0gICAgICAgICAgICAgIC8qIENsZWFyIENBTl9SRjBSX0ZVTEwwIChyY193MSkqLw0KLQkgICAgICBDQU54LT5SRjBSID0gQ0FOX1JGMFJfRlVMTDA7IA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9GT1YwOg0KLSAgICAgICAgICAgICAgLyogQ2xlYXIgQ0FOX1JGMFJfRk9WUjAgKHJjX3cxKSovDQotCSAgICAgIENBTngtPlJGMFIgPSBDQU5fUkYwUl9GT1ZSMDsgDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0ZGMToNCi0gICAgICAgICAgICAgIC8qIENsZWFyIENBTl9SRjFSX0ZVTEwxIChyY193MSkqLw0KLQkgICAgICBDQU54LT5SRjFSID0gQ0FOX1JGMVJfRlVMTDE7ICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfRk9WMToNCi0gICAgICAgICAgICAgIC8qIENsZWFyIENBTl9SRjFSX0ZPVlIxIChyY193MSkqLw0KLQkgICAgICBDQU54LT5SRjFSID0gQ0FOX1JGMVJfRk9WUjE7IA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9XS1U6DQotICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX1dLVUkgKHJjX3cxKSovDQotCSAgICAgIENBTngtPk1TUiA9IENBTl9NU1JfV0tVSTsgIA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9TTEs6DQotICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX1NMQUtJIChyY193MSkqLyANCi0JICAgICAgQ0FOeC0+TVNSID0gQ0FOX01TUl9TTEFLSTsgICANCi0JICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBDQU5fSVRfRVdHOg0KLSAgICAgICAgICAgICAgLyogQ2xlYXIgQ0FOX01TUl9FUlJJIChyY193MSkgKi8NCi0JICAgICAgQ0FOeC0+TVNSID0gQ0FOX01TUl9FUlJJOw0KLSAgICAgICAgICAgICAgLyogTm90ZSA6IHRoZSBjb3JyZXNwb25kaW5nIEZsYWcgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSBkZXBlbmRpbmcgb2YgdGhlIENBTiBCdXMgc3RhdHVzKi8gDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0VQVjoNCi0gICAgICAgICAgICAgIC8qIENsZWFyIENBTl9NU1JfRVJSSSAocmNfdzEpICovDQotCSAgICAgIENBTngtPk1TUiA9IENBTl9NU1JfRVJSSTsgDQotICAgICAgICAgICAgICAvKiBOb3RlIDogdGhlIGNvcnJlc3BvbmRpbmcgRmxhZyBpcyBjbGVhcmVkIGJ5IGhhcmR3YXJlIGRlcGVuZGluZyBvZiB0aGUgQ0FOIEJ1cyBzdGF0dXMqLw0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9CT0Y6DQotICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX0VSUkkgKHJjX3cxKSAqLyANCi0JICAgICAgQ0FOeC0+TVNSID0gQ0FOX01TUl9FUlJJOyANCi0gICAgICAgICAgICAgIC8qIE5vdGUgOiB0aGUgY29ycmVzcG9uZGluZyBGbGFnIGlzIGNsZWFyZWQgYnkgaGFyZHdhcmUgZGVwZW5kaW5nIG9mIHRoZSBDQU4gQnVzIHN0YXR1cyovDQotCSAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgQ0FOX0lUX0xFQzoNCi0gICAgICAgICAgICAgIC8qICBDbGVhciBMRUMgYml0cyAqLw0KLQkgICAgICBDQU54LT5FU1IgPSBSRVNFVDsgDQotICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX0VSUkkgKHJjX3cxKSAqLw0KLQkgICAgICBDQU54LT5NU1IgPSBDQU5fTVNSX0VSUkk7IA0KLQkgICAgICBicmVhazsNCi0gICAgICBjYXNlIENBTl9JVF9FUlI6DQotICAgICAgICAgICAgICAvKkNsZWFyIExFQyBiaXRzICovDQotCSAgICAgIENBTngtPkVTUiA9IFJFU0VUOyANCi0gICAgICAgICAgICAgIC8qIENsZWFyIENBTl9NU1JfRVJSSSAocmNfdzEpICovDQotCSAgICAgIENBTngtPk1TUiA9IENBTl9NU1JfRVJSSTsgDQotCSAgICAgIC8qIE5vdGUgOiBCT0ZGLCBFUFZGIGFuZCBFV0dGIEZsYWdzIGFyZSBjbGVhcmVkIGJ5IGhhcmR3YXJlIGRlcGVuZGluZyBvZiB0aGUgQ0FOIEJ1cyBzdGF0dXMqLw0KLQkgICAgICBicmVhazsNCi0gICAgICBkZWZhdWx0IDoNCi0JICAgICAgYnJlYWs7DQotICAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgQ0FOIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIENBTl9SZWc6IHNwZWNpZmllcyB0aGUgQ0FOIGludGVycnVwdCByZWdpc3RlciB0byBjaGVjay4NCi0gICogQHBhcmFtICBJdF9CaXQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSBiaXQgdG8gY2hlY2suDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgQ0FOIEludGVycnVwdCAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotc3RhdGljIElUU3RhdHVzIENoZWNrSVRTdGF0dXModWludDMyX3QgQ0FOX1JlZywgdWludDMyX3QgSXRfQml0KQ0KLXsNCi0gIElUU3RhdHVzIHBlbmRpbmdiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIA0KLSAgaWYgKChDQU5fUmVnICYgSXRfQml0KSAhPSAodWludDMyX3QpUkVTRVQpDQotICB7DQotICAgIC8qIENBTl9JVCBpcyBzZXQgKi8NCi0gICAgcGVuZGluZ2JpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogQ0FOX0lUIGlzIHJlc2V0ICovDQotICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIHJldHVybiBwZW5kaW5nYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2NlYy5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfY2VjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2Y5YjUuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfY2VjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2NlYy5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIENFQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfY2VjLmgiDQotI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDRUMgDQotICAqIEBicmllZiBDRUMgZHJpdmVyIG1vZHVsZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDRUNfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0NCi0vKiogQGRlZmdyb3VwIENFQ19Qcml2YXRlX0RlZmluZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qIC0tLS0tLS0tLS0tLSBDRUMgcmVnaXN0ZXJzIGJpdCBhZGRyZXNzIGluIHRoZSBhbGlhcyByZWdpb24gLS0tLS0tLS0tLS0gKi8NCi0jZGVmaW5lIENFQ19PRkZTRVQgICAgICAgICAgICAgICAgKENFQ19CQVNFIC0gUEVSSVBIX0JBU0UpDQotDQotLyogLS0tIENGR1IgUmVnaXN0ZXIgLS0tKi8NCi0NCi0vKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgUEUgYml0ICovDQotI2RlZmluZSBDRkdSX09GRlNFVCAgICAgICAgICAgICAgICAgKENFQ19PRkZTRVQgKyAweDAwKQ0KLSNkZWZpbmUgUEVfQml0TnVtYmVyICAgICAgICAgICAgICAgIDB4MDANCi0jZGVmaW5lIENGR1JfUEVfQkIgICAgICAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0ZHUl9PRkZTRVQgKiAzMikgKyAoUEVfQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIElFIGJpdCAqLw0KLSNkZWZpbmUgSUVfQml0TnVtYmVyICAgICAgICAgICAgICAgIDB4MDENCi0jZGVmaW5lIENGR1JfSUVfQkIgICAgICAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0ZHUl9PRkZTRVQgKiAzMikgKyAoSUVfQml0TnVtYmVyICogNCkpDQotDQotLyogLS0tIENTUiBSZWdpc3RlciAtLS0qLw0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBUU09NIGJpdCAqLw0KLSNkZWZpbmUgQ1NSX09GRlNFVCAgICAgICAgICAgICAgICAgIChDRUNfT0ZGU0VUICsgMHgxMCkNCi0jZGVmaW5lIFRTT01fQml0TnVtYmVyICAgICAgICAgICAgICAweDAwDQotI2RlZmluZSBDU1JfVFNPTV9CQiAgICAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENTUl9PRkZTRVQgKiAzMikgKyAoVFNPTV9CaXROdW1iZXIgKiA0KSkNCi0NCi0vKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgVEVPTSBiaXQgKi8NCi0jZGVmaW5lIFRFT01fQml0TnVtYmVyICAgICAgICAgICAgICAweDAxDQotI2RlZmluZSBDU1JfVEVPTV9CQiAgICAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENTUl9PRkZTRVQgKiAzMikgKyAoVEVPTV9CaXROdW1iZXIgKiA0KSkNCi0gIA0KLSNkZWZpbmUgQ0ZHUl9DTEVBUl9NYXNrICAgICAgICAgICAgKHVpbnQ4X3QpKDB4RjMpICAgICAgICAvKiBDRkdSIHJlZ2lzdGVyIE1hc2sgKi8NCi0jZGVmaW5lIEZMQUdfTWFzayAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMEZGRkZGRikgLyogQ0VDIEZMQUcgbWFzayAqLw0KLSANCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQotICAqIEB7DQotICAqLw0KLSANCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLyANCi0NCi0vKioNCi0gICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBDRUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCANCi0gICogICAgICAgICB2YWx1ZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBDRUNfRGVJbml0KHZvaWQpDQotew0KLSAgLyogRW5hYmxlIENFQyByZXNldCBzdGF0ZSAqLw0KLSAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9DRUMsIEVOQUJMRSk7ICANCi0gIC8qIFJlbGVhc2UgQ0VDIGZyb20gcmVzZXQgc3RhdGUgKi8NCi0gIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfQ0VDLCBESVNBQkxFKTsgDQotfQ0KLQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDRUMgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCANCi0gICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDRUNfSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBDRUNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBDRUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZA0KLSAgKiAgICAgICAgIENFQyBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBDRUNfSW5pdChDRUNfSW5pdFR5cGVEZWYqIENFQ19Jbml0U3RydWN0KQ0KLXsNCi0gIHVpbnQxNl90IHRtcHJlZyA9IDA7DQotIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19DRUNfQklUX1RJTUlOR19FUlJPUl9NT0RFKENFQ19Jbml0U3RydWN0LT5DRUNfQml0VGltaW5nTW9kZSkpOyANCi0gIGFzc2VydF9wYXJhbShJU19DRUNfQklUX1BFUklPRF9FUlJPUl9NT0RFKENFQ19Jbml0U3RydWN0LT5DRUNfQml0UGVyaW9kTW9kZSkpOw0KLSAgICAgDQotICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0VDIENGR1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBHZXQgdGhlIENFQyBDRkdSIHZhbHVlICovDQotICB0bXByZWcgPSBDRUMtPkNGR1I7DQotICANCi0gIC8qIENsZWFyIEJURU0gYW5kIEJQRU0gYml0cyAqLw0KLSAgdG1wcmVnICY9IENGR1JfQ0xFQVJfTWFzazsNCi0gIA0KLSAgLyogQ29uZmlndXJlIENFQzogQml0IFRpbWluZyBFcnJvciBhbmQgQml0IFBlcmlvZCBFcnJvciAqLw0KLSAgdG1wcmVnIHw9ICh1aW50MTZfdCkoQ0VDX0luaXRTdHJ1Y3QtPkNFQ19CaXRUaW1pbmdNb2RlIHwgQ0VDX0luaXRTdHJ1Y3QtPkNFQ19CaXRQZXJpb2RNb2RlKTsNCi0NCi0gIC8qIFdyaXRlIHRvIENFQyBDRkdSICByZWdpc3RlciovDQotICBDRUMtPkNGR1IgPSB0bXByZWc7DQotICANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIENFQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENFQyBwZXJpcGhlcmFsLiANCi0gICogICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIENFQ19DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLQ0KLSAgKihfX0lPIHVpbnQzMl90ICopIENGR1JfUEVfQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQotDQotICBpZihOZXdTdGF0ZSA9PSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBXYWl0IHVudGlsIHRoZSBQRSBiaXQgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSAoSWRsZSBMaW5lIGRldGVjdGVkKSAqLw0KLSAgICB3aGlsZSgoQ0VDLT5DRkdSICYgQ0VDX0NGR1JfUEUpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gICAgew0KLSAgICB9ICANCi0gIH0gIA0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBDRUMgaW50ZXJydXB0Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENFQyBpbnRlcnJ1cHQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQ0VDX0lUQ29uZmlnKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0NCi0gICooX19JTyB1aW50MzJfdCAqKSBDRkdSX0lFX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBEZWZpbmVzIHRoZSBPd24gQWRkcmVzcyBvZiB0aGUgQ0VDIGRldmljZS4NCi0gICogQHBhcmFtICBDRUNfT3duQWRkcmVzczogVGhlIENFQyBvd24gYWRkcmVzcw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBDRUNfT3duQWRkcmVzc0NvbmZpZyh1aW50OF90IENFQ19Pd25BZGRyZXNzKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0FERFJFU1MoQ0VDX093bkFkZHJlc3MpKTsNCi0NCi0gIC8qIFNldCB0aGUgQ0VDIG93biBhZGRyZXNzICovDQotICBDRUMtPk9BUiA9IENFQ19Pd25BZGRyZXNzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBDRUMgcHJlc2NhbGVyIHZhbHVlLg0KLSAgKiBAcGFyYW0gIENFQ19QcmVzY2FsZXI6IENFQyBwcmVzY2FsZXIgbmV3IHZhbHVlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIENFQ19TZXRQcmVzY2FsZXIodWludDE2X3QgQ0VDX1ByZXNjYWxlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NFQ19QUkVTQ0FMRVIoQ0VDX1ByZXNjYWxlcikpOw0KLQ0KLSAgLyogU2V0IHRoZSAgUHJlc2NhbGVyIHZhbHVlKi8NCi0gIENFQy0+UFJFUyA9IENFQ19QcmVzY2FsZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFRyYW5zbWl0cyBzaW5nbGUgZGF0YSB0aHJvdWdoIHRoZSBDRUMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBEYXRhOiB0aGUgZGF0YSB0byB0cmFuc21pdC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQ0VDX1NlbmREYXRhQnl0ZSh1aW50OF90IERhdGEpDQoteyAgDQotICAvKiBUcmFuc21pdCBEYXRhICovDQotICBDRUMtPlRYRCA9IERhdGEgOw0KLX0NCi0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCByZWNlaXZlZCBkYXRhIGJ5IHRoZSBDRUMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgVGhlIHJlY2VpdmVkIGRhdGEuDQotICAqLw0KLXVpbnQ4X3QgQ0VDX1JlY2VpdmVEYXRhQnl0ZSh2b2lkKQ0KLXsNCi0gIC8qIFJlY2VpdmUgRGF0YSAqLw0KLSAgcmV0dXJuICh1aW50OF90KShDRUMtPlJYRCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFN0YXJ0cyBhIG5ldyBtZXNzYWdlLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQ0VDX1N0YXJ0T2ZNZXNzYWdlKHZvaWQpDQoteyAgDQotICAvKiBTdGFydHMgb2YgbmV3IG1lc3NhZ2UgKi8NCi0gICooX19JTyB1aW50MzJfdCAqKSBDU1JfVFNPTV9CQiA9ICh1aW50MzJfdCkweDE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFRyYW5zbWl0cyBtZXNzYWdlIHdpdGggb3Igd2l0aG91dCBhbiBFT00gYml0Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENFQyBUeCBFbmQgT2YgTWVzc2FnZS4gDQotICAqICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBDRUNfRW5kT2ZNZXNzYWdlQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17ICAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgLyogVGhlIGRhdGEgYnl0ZSB3aWxsIGJlIHRyYW5zbWl0dGVkIHdpdGggb3Igd2l0aG91dCBhbiBFT00gYml0Ki8NCi0gICooX19JTyB1aW50MzJfdCAqKSBDU1JfVEVPTV9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgR2V0cyB0aGUgQ0VDIGZsYWcgc3RhdHVzDQotICAqIEBwYXJhbSAgQ0VDX0ZMQUc6IHNwZWNpZmllcyB0aGUgQ0VDIGZsYWcgdG8gY2hlY2suIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIENFQ19GTEFHX0JURTogQml0IFRpbWluZyBFcnJvcg0KLSAgKiAgICAgQGFyZyBDRUNfRkxBR19CUEU6IEJpdCBQZXJpb2QgRXJyb3INCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkJURkU6IFJ4IEJsb2NrIFRyYW5zZmVyIEZpbmlzaGVkIEVycm9yDQotICAqICAgICBAYXJnIENFQ19GTEFHX1NCRTogU3RhcnQgQml0IEVycm9yDQotICAqICAgICBAYXJnIENFQ19GTEFHX0FDS0U6IEJsb2NrIEFja25vd2xlZGdlIEVycm9yDQotICAqICAgICBAYXJnIENFQ19GTEFHX0xJTkU6IExpbmUgRXJyb3INCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfVEJURkU6IFR4IEJsb2NrIFRyYW5zZmVyIEZpbnNpaGVkIEVycm9yDQotICAqICAgICBAYXJnIENFQ19GTEFHX1RFT006IFR4IEVuZCBPZiBNZXNzYWdlIA0KLSAgKiAgICAgQGFyZyBDRUNfRkxBR19URVJSOiBUeCBFcnJvcg0KLSAgKiAgICAgQGFyZyBDRUNfRkxBR19UQlRSRjogVHggQnl0ZSBUcmFuc2ZlciBSZXF1ZXN0IG9yIEJsb2NrIFRyYW5zZmVyIEZpbmlzaGVkDQotICAqICAgICBAYXJnIENFQ19GTEFHX1JTT006IFJ4IFN0YXJ0IE9mIE1lc3NhZ2UNCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkVPTTogUnggRW5kIE9mIE1lc3NhZ2UNCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkVSUjogUnggRXJyb3INCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkJURjogUnggQnl0ZS9CbG9jayBUcmFuc2ZlciBGaW5pc2hlZA0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQ0VDX0ZMQUcgKFNFVCBvciBSRVNFVCkNCi0gICovDQotRmxhZ1N0YXR1cyBDRUNfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBDRUNfRkxBRykgDQotew0KLSAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIHVpbnQzMl90IGNlY3JlZyA9IDAsIGNlY2Jhc2UgPSAwOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0NFQ19HRVRfRkxBRyhDRUNfRkxBRykpOw0KLSANCi0gIC8qIEdldCB0aGUgQ0VDIHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzICovDQotICBjZWNiYXNlID0gKHVpbnQzMl90KShDRUNfQkFTRSk7DQotICANCi0gIC8qIFJlYWQgZmxhZyByZWdpc3RlciBpbmRleCAqLw0KLSAgY2VjcmVnID0gQ0VDX0ZMQUcgPj4gMjg7DQotICANCi0gIC8qIEdldCBiaXRbMjM6MF0gb2YgdGhlIGZsYWcgKi8NCi0gIENFQ19GTEFHICY9IEZMQUdfTWFzazsNCi0gIA0KLSAgaWYoY2VjcmVnICE9IDApDQotICB7DQotICAgIC8qIEZsYWcgaW4gQ0VDIEVTUiBSZWdpc3RlciAqLw0KLSAgICBDRUNfRkxBRyA9ICh1aW50MzJfdCkoQ0VDX0ZMQUcgPj4gMTYpOw0KLSAgICANCi0gICAgLyogR2V0IHRoZSBDRUMgRVNSIHJlZ2lzdGVyIGFkZHJlc3MgKi8NCi0gICAgY2VjYmFzZSArPSAweEM7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIEdldCB0aGUgQ0VDIENTUiByZWdpc3RlciBhZGRyZXNzICovDQotICAgIGNlY2Jhc2UgKz0gMHgxMDsNCi0gIH0NCi0gIA0KLSAgaWYoKCgqKF9fSU8gdWludDMyX3QgKiljZWNiYXNlKSAmIENFQ19GTEFHKSAhPSAodWludDMyX3QpUkVTRVQpDQotICB7DQotICAgIC8qIENFQ19GTEFHIGlzIHNldCAqLw0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIENFQ19GTEFHIGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgDQotICAvKiBSZXR1cm4gdGhlIENFQ19GTEFHIHN0YXR1cyAqLw0KLSAgcmV0dXJuICBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgQ0VDJ3MgcGVuZGluZyBmbGFncy4NCi0gICogQHBhcmFtICBDRUNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBDRUNfRkxBR19URVJSOiBUeCBFcnJvcg0KLSAgKiAgICAgQGFyZyBDRUNfRkxBR19UQlRSRjogVHggQnl0ZSBUcmFuc2ZlciBSZXF1ZXN0IG9yIEJsb2NrIFRyYW5zZmVyIEZpbmlzaGVkDQotICAqICAgICBAYXJnIENFQ19GTEFHX1JTT006IFJ4IFN0YXJ0IE9mIE1lc3NhZ2UNCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkVPTTogUnggRW5kIE9mIE1lc3NhZ2UNCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkVSUjogUnggRXJyb3INCi0gICogICAgIEBhcmcgQ0VDX0ZMQUdfUkJURjogUnggQnl0ZS9CbG9jayBUcmFuc2ZlciBGaW5pc2hlZA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBDRUNfQ2xlYXJGbGFnKHVpbnQzMl90IENFQ19GTEFHKQ0KLXsgDQotICB1aW50MzJfdCB0bXAgPSAweDA7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0NMRUFSX0ZMQUcoQ0VDX0ZMQUcpKTsNCi0NCi0gIHRtcCA9IENFQy0+Q1NSICYgMHgyOw0KLSAgICAgICANCi0gIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBDRUMgZmxhZ3MgKi8NCi0gIENFQy0+Q1NSICY9ICh1aW50MzJfdCkoKCh+KHVpbnQzMl90KUNFQ19GTEFHKSAmIDB4RkZGRkZGRkMpIHwgdG1wKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDRUMgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQotICAqIEBwYXJhbSAgQ0VDX0lUOiBzcGVjaWZpZXMgdGhlIENFQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBDRUNfSVRfVEVSUjogVHggRXJyb3INCi0gICogICAgIEBhcmcgQ0VDX0lUX1RCVEY6IFR4IEJsb2NrIFRyYW5zZmVyIEZpbmlzaGVkDQotICAqICAgICBAYXJnIENFQ19JVF9SRVJSOiBSeCBFcnJvcg0KLSAgKiAgICAgQGFyZyBDRUNfSVRfUkJURjogUnggQmxvY2sgVHJhbnNmZXIgRmluaXNoZWQNCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIENFQ19JVCAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotSVRTdGF0dXMgQ0VDX0dldElUU3RhdHVzKHVpbnQ4X3QgQ0VDX0lUKQ0KLXsNCi0gIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgdWludDMyX3QgZW5hYmxlc3RhdHVzID0gMDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0dFVF9JVChDRUNfSVQpKTsNCi0gICANCi0gIC8qIEdldCB0aGUgQ0VDIElUIGVuYWJsZSBiaXQgc3RhdHVzICovDQotICBlbmFibGVzdGF0dXMgPSAoQ0VDLT5DRkdSICYgKHVpbnQ4X3QpQ0VDX0NGR1JfSUUpIDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIENFQyBpbnRlcnJ1cHQgKi8NCi0gIGlmICgoKENFQy0+Q1NSICYgQ0VDX0lUKSAhPSAodWludDMyX3QpUkVTRVQpICYmIGVuYWJsZXN0YXR1cykNCi0gIHsNCi0gICAgLyogQ0VDX0lUIGlzIHNldCAqLw0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIENFQ19JVCBpcyByZXNldCAqLw0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgQ0VDX0lUIHN0YXR1cyAqLw0KLSAgcmV0dXJuICBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgQ0VDJ3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gICogQHBhcmFtICBDRUNfSVQ6IHNwZWNpZmllcyB0aGUgQ0VDIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBDRUNfSVRfVEVSUjogVHggRXJyb3INCi0gICogICAgIEBhcmcgQ0VDX0lUX1RCVEY6IFR4IEJsb2NrIFRyYW5zZmVyIEZpbmlzaGVkDQotICAqICAgICBAYXJnIENFQ19JVF9SRVJSOiBSeCBFcnJvcg0KLSAgKiAgICAgQGFyZyBDRUNfSVRfUkJURjogUnggQmxvY2sgVHJhbnNmZXIgRmluaXNoZWQNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQ0VDX0NsZWFySVRQZW5kaW5nQml0KHVpbnQxNl90IENFQ19JVCkNCi17DQotICB1aW50MzJfdCB0bXAgPSAweDA7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0dFVF9JVChDRUNfSVQpKTsNCi0gIA0KLSAgdG1wID0gQ0VDLT5DU1IgJiAweDI7DQotICANCi0gIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBDRUMgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KLSAgQ0VDLT5DU1IgJj0gKHVpbnQzMl90KSgoKH4odWludDMyX3QpQ0VDX0lUKSAmIDB4RkZGRkZGRkMpIHwgdG1wKTsNCi19DQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9jcmMuYyBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2NyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTFhN2I5Li4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2NyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9jcmMuYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBDUkMgZmlybXdhcmUgZnVuY3Rpb25zLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4X2NyYy5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSQyANCi0gICogQGJyaWVmIENSQyBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSQ19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JDX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDUkNfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgQ1JDX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIENSQ19Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBDUkNfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgUmVzZXRzIHRoZSBDUkMgRGF0YSByZWdpc3RlciAoRFIpLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQ1JDX1Jlc2V0RFIodm9pZCkNCi17DQotICAvKiBSZXNldCBDUkMgZ2VuZXJhdG9yICovDQotICBDUkMtPkNSID0gQ1JDX0NSX1JFU0VUOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb21wdXRlcyB0aGUgMzItYml0IENSQyBvZiBhIGdpdmVuIGRhdGEgd29yZCgzMi1iaXQpLg0KLSAgKiBAcGFyYW0gIERhdGE6IGRhdGEgd29yZCgzMi1iaXQpIHRvIGNvbXB1dGUgaXRzIENSQw0KLSAgKiBAcmV0dmFsIDMyLWJpdCBDUkMNCi0gICovDQotdWludDMyX3QgQ1JDX0NhbGNDUkModWludDMyX3QgRGF0YSkNCi17DQotICBDUkMtPkRSID0gRGF0YTsNCi0gIA0KLSAgcmV0dXJuIChDUkMtPkRSKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29tcHV0ZXMgdGhlIDMyLWJpdCBDUkMgb2YgYSBnaXZlbiBidWZmZXIgb2YgZGF0YSB3b3JkKDMyLWJpdCkuDQotICAqIEBwYXJhbSAgcEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgY29tcHV0ZWQNCi0gICogQHBhcmFtICBCdWZmZXJMZW5ndGg6IGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRvIGJlIGNvbXB1dGVkCQkJCQkNCi0gICogQHJldHZhbCAzMi1iaXQgQ1JDDQotICAqLw0KLXVpbnQzMl90IENSQ19DYWxjQmxvY2tDUkModWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpDQotew0KLSAgdWludDMyX3QgaW5kZXggPSAwOw0KLSAgDQotICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IEJ1ZmZlckxlbmd0aDsgaW5kZXgrKykNCi0gIHsNCi0gICAgQ1JDLT5EUiA9IHBCdWZmZXJbaW5kZXhdOw0KLSAgfQ0KLSAgcmV0dXJuIChDUkMtPkRSKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBDUkMgdmFsdWUuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIDMyLWJpdCBDUkMNCi0gICovDQotdWludDMyX3QgQ1JDX0dldENSQyh2b2lkKQ0KLXsNCi0gIHJldHVybiAoQ1JDLT5EUik7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFN0b3JlcyBhIDgtYml0IGRhdGEgaW4gdGhlIEluZGVwZW5kZW50IERhdGEoSUQpIHJlZ2lzdGVyLg0KLSAgKiBAcGFyYW0gIElEVmFsdWU6IDgtYml0IHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUgSUQgcmVnaXN0ZXIgCQkJCQkNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgQ1JDX1NldElEUmVnaXN0ZXIodWludDhfdCBJRFZhbHVlKQ0KLXsNCi0gIENSQy0+SURSID0gSURWYWx1ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyB0aGUgOC1iaXQgZGF0YSBzdG9yZWQgaW4gdGhlIEluZGVwZW5kZW50IERhdGEoSUQpIHJlZ2lzdGVyDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIDgtYml0IHZhbHVlIG9mIHRoZSBJRCByZWdpc3RlciANCi0gICovDQotdWludDhfdCBDUkNfR2V0SURSZWdpc3Rlcih2b2lkKQ0KLXsNCi0gIHJldHVybiAoQ1JDLT5JRFIpOw0KLX0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2RhYy5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZGFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTkxYzAuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZGFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2RhYy5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIERBQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfZGFjLmgiDQotI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQUMgDQotICAqIEBicmllZiBEQUMgZHJpdmVyIG1vZHVsZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQUNfUHJpdmF0ZV9EZWZpbmVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qIENSIHJlZ2lzdGVyIE1hc2sgKi8NCi0jZGVmaW5lIENSX0NMRUFSX01BU0sgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMEZGRSkNCi0NCi0vKiBEQUMgRHVhbCBDaGFubmVscyBTV1RSSUcgbWFza3MgKi8NCi0jZGVmaW5lIERVQUxfU1dUUklHX1NFVCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMykNCi0jZGVmaW5lIERVQUxfU1dUUklHX1JFU0VUICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZGQykNCi0NCi0vKiBESFIgcmVnaXN0ZXJzIG9mZnNldHMgKi8NCi0jZGVmaW5lIERIUjEyUjFfT0ZGU0VUICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi0jZGVmaW5lIERIUjEyUjJfT0ZGU0VUICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxNCkNCi0jZGVmaW5lIERIUjEyUkRfT0ZGU0VUICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkNCi0NCi0vKiBET1IgcmVnaXN0ZXIgb2Zmc2V0ICovDQotI2RlZmluZSBET1JfT0ZGU0VUICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMkMpDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERBQ19Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQUNfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIERBQyBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIERBQ19EZUluaXQodm9pZCkNCi17DQotICAvKiBFbmFibGUgREFDIHJlc2V0IHN0YXRlICovDQotICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0RBQywgRU5BQkxFKTsNCi0gIC8qIFJlbGVhc2UgREFDIGZyb20gcmVzZXQgc3RhdGUgKi8NCi0gIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfREFDLCBESVNBQkxFKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIERBQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIERBQ19Jbml0U3RydWN0Lg0KLSAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBEQUNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIERBQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAgKiAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQyBjaGFubmVsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBEQUNfSW5pdCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgREFDX0luaXRUeXBlRGVmKiBEQUNfSW5pdFN0cnVjdCkNCi17DQotICB1aW50MzJfdCB0bXByZWcxID0gMCwgdG1wcmVnMiA9IDA7DQotICAvKiBDaGVjayB0aGUgREFDIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19EQUNfVFJJR0dFUihEQUNfSW5pdFN0cnVjdC0+REFDX1RyaWdnZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19EQUNfR0VORVJBVEVfV0FWRShEQUNfSW5pdFN0cnVjdC0+REFDX1dhdmVHZW5lcmF0aW9uKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0xGU1JfVU5NQVNLX1RSSUFOR0xFX0FNUExJVFVERShEQUNfSW5pdFN0cnVjdC0+REFDX0xGU1JVbm1hc2tfVHJpYW5nbGVBbXBsaXR1ZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19EQUNfT1VUUFVUX0JVRkZFUl9TVEFURShEQUNfSW5pdFN0cnVjdC0+REFDX091dHB1dEJ1ZmZlcikpOw0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEQUMgQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBHZXQgdGhlIERBQyBDUiB2YWx1ZSAqLw0KLSAgdG1wcmVnMSA9IERBQy0+Q1I7DQotICAvKiBDbGVhciBCT0ZGeCwgVEVOeCwgVFNFTHgsIFdBVkV4IGFuZCBNQU1QeCBiaXRzICovDQotICB0bXByZWcxICY9IH4oQ1JfQ0xFQVJfTUFTSyA8PCBEQUNfQ2hhbm5lbCk7DQotICAvKiBDb25maWd1cmUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDogYnVmZmVyIG91dHB1dCwgdHJpZ2dlciwgd2F2ZSBnZW5yYXRpb24sDQotICAgICBtYXNrL2FtcGxpdHVkZSBmb3Igd2F2ZSBnZW5yYXRpb24gKi8NCi0gIC8qIFNldCBUU0VMeCBhbmQgVEVOeCBiaXRzIGFjY29yZGluZyB0byBEQUNfVHJpZ2dlciB2YWx1ZSAqLw0KLSAgLyogU2V0IFdBVkV4IGJpdHMgYWNjb3JkaW5nIHRvIERBQ19XYXZlR2VuZXJhdGlvbiB2YWx1ZSAqLw0KLSAgLyogU2V0IE1BTVB4IGJpdHMgYWNjb3JkaW5nIHRvIERBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlIHZhbHVlICovIA0KLSAgLyogU2V0IEJPRkZ4IGJpdCBhY2NvcmRpbmcgdG8gREFDX091dHB1dEJ1ZmZlciB2YWx1ZSAqLyAgIA0KLSAgdG1wcmVnMiA9IChEQUNfSW5pdFN0cnVjdC0+REFDX1RyaWdnZXIgfCBEQUNfSW5pdFN0cnVjdC0+REFDX1dhdmVHZW5lcmF0aW9uIHwNCi0gICAgICAgICAgICAgREFDX0luaXRTdHJ1Y3QtPkRBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlIHwgREFDX0luaXRTdHJ1Y3QtPkRBQ19PdXRwdXRCdWZmZXIpOw0KLSAgLyogQ2FsY3VsYXRlIENSIHJlZ2lzdGVyIHZhbHVlIGRlcGVuZGluZyBvbiBEQUNfQ2hhbm5lbCAqLw0KLSAgdG1wcmVnMSB8PSB0bXByZWcyIDw8IERBQ19DaGFubmVsOw0KLSAgLyogV3JpdGUgdG8gREFDIENSICovDQotICBEQUMtPkNSID0gdG1wcmVnMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRmlsbHMgZWFjaCBEQUNfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBEQUNfSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBEQUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwNCi0gICogICBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgREFDX1N0cnVjdEluaXQoREFDX0luaXRUeXBlRGVmKiBEQUNfSW5pdFN0cnVjdCkNCi17DQotLyotLS0tLS0tLS0tLS0tLS0gUmVzZXQgREFDIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIEluaXRpYWxpemUgdGhlIERBQ19UcmlnZ2VyIG1lbWJlciAqLw0KLSAgREFDX0luaXRTdHJ1Y3QtPkRBQ19UcmlnZ2VyID0gREFDX1RyaWdnZXJfTm9uZTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERBQ19XYXZlR2VuZXJhdGlvbiBtZW1iZXIgKi8NCi0gIERBQ19Jbml0U3RydWN0LT5EQUNfV2F2ZUdlbmVyYXRpb24gPSBEQUNfV2F2ZUdlbmVyYXRpb25fTm9uZTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlIG1lbWJlciAqLw0KLSAgREFDX0luaXRTdHJ1Y3QtPkRBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlID0gREFDX0xGU1JVbm1hc2tfQml0MDsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERBQ19PdXRwdXRCdWZmZXIgbWVtYmVyICovDQotICBEQUNfSW5pdFN0cnVjdC0+REFDX091dHB1dEJ1ZmZlciA9IERBQ19PdXRwdXRCdWZmZXJfRW5hYmxlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgREFDIGNoYW5uZWwuDQotICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0NoYW5uZWxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkDQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIERBQyBjaGFubmVsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBEQUNfQ21kKHVpbnQzMl90IERBQ19DaGFubmVsLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChEQUNfQ2hhbm5lbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovDQotICAgIERBQy0+Q1IgfD0gKERBQ19DUl9FTjEgPDwgREFDX0NoYW5uZWwpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLw0KLSAgICBEQUMtPkNSICY9IH4oREFDX0NSX0VOMSA8PCBEQUNfQ2hhbm5lbCk7DQotICB9DQotfQ0KLSNpZiBkZWZpbmVkIChTVE0zMkYxMFhfTERfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9NRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX0hEX1ZMKQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBEQUMgaW50ZXJydXB0cy4NCi0gICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgREFDX0NoYW5uZWxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkDQotICAqIEBwYXJhbSAgREFDX0lUOiBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19JVF9ETUFVRFI6IERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgbWFzayAgICAgICAgICAgICAgICAgICAgICANCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgREFDIGludGVycnVwdHMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLyANCi12b2lkIERBQ19JVENvbmZpZyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpICANCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19JVChEQUNfSVQpKTsgDQotDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgaW50ZXJydXB0cyAqLw0KLSAgICBEQUMtPkNSIHw9ICAoREFDX0lUIDw8IERBQ19DaGFubmVsKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGludGVycnVwdHMgKi8NCi0gICAgREFDLT5DUiAmPSAofih1aW50MzJfdCkoREFDX0lUIDw8IERBQ19DaGFubmVsKSk7DQotICB9DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBEQUMgY2hhbm5lbCBETUEgcmVxdWVzdC4NCi0gICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgREFDX0NoYW5uZWxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgRE1BIHJlcXVlc3QuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgREFDX0RNQUNtZCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoREFDX0NoYW5uZWwpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBETUEgcmVxdWVzdCAqLw0KLSAgICBEQUMtPkNSIHw9IChEQUNfQ1JfRE1BRU4xIDw8IERBQ19DaGFubmVsKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgRE1BIHJlcXVlc3QgKi8NCi0gICAgREFDLT5DUiAmPSB+KERBQ19DUl9ETUFFTjEgPDwgREFDX0NoYW5uZWwpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBzb2Z0d2FyZSB0cmlnZ2VyLg0KLSAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBzb2Z0d2FyZSB0cmlnZ2VyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIERBQ19Tb2Z0d2FyZVRyaWdnZXJDbWQodWludDMyX3QgREFDX0NoYW5uZWwsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8NCi0gICAgREFDLT5TV1RSSUdSIHw9ICh1aW50MzJfdClEQUNfU1dUUklHUl9TV1RSSUcxIDw8IChEQUNfQ2hhbm5lbCA+PiA0KTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8NCi0gICAgREFDLT5TV1RSSUdSICY9IH4oKHVpbnQzMl90KURBQ19TV1RSSUdSX1NXVFJJRzEgPDwgKERBQ19DaGFubmVsID4+IDQpKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyBzaW11bHRhbmVvdXNseSB0aGUgdHdvIERBQyBjaGFubmVscyBzb2Z0d2FyZQ0KLSAgKiAgIHRyaWdnZXJzLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIERBQyBjaGFubmVscyBzb2Z0d2FyZSB0cmlnZ2Vycy4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBEQUNfRHVhbFNvZnR3YXJlVHJpZ2dlckNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHNvZnR3YXJlIHRyaWdnZXIgZm9yIGJvdGggREFDIGNoYW5uZWxzICovDQotICAgIERBQy0+U1dUUklHUiB8PSBEVUFMX1NXVFJJR19TRVQgOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHNvZnR3YXJlIHRyaWdnZXIgZm9yIGJvdGggREFDIGNoYW5uZWxzICovDQotICAgIERBQy0+U1dUUklHUiAmPSBEVUFMX1NXVFJJR19SRVNFVDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgd2F2ZSBnZW5lcmF0aW9uLg0KLSAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBEQUNfV2F2ZTogU3BlY2lmaWVzIHRoZSB3YXZlIHR5cGUgdG8gZW5hYmxlIG9yIGRpc2FibGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX1dhdmVfTm9pc2U6IG5vaXNlIHdhdmUgZ2VuZXJhdGlvbg0KLSAgKiAgICAgQGFyZyBEQUNfV2F2ZV9UcmlhbmdsZTogdHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgd2F2ZSBnZW5lcmF0aW9uLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIERBQ19XYXZlR2VuZXJhdGlvbkNtZCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX1dhdmUsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX1dBVkUoREFDX1dhdmUpKTsgDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgd2F2ZSBnZW5lcmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8NCi0gICAgREFDLT5DUiB8PSBEQUNfV2F2ZSA8PCBEQUNfQ2hhbm5lbDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgd2F2ZSBnZW5lcmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8NCi0gICAgREFDLT5DUiAmPSB+KERBQ19XYXZlIDw8IERBQ19DaGFubmVsKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEQUMgY2hhbm5lbDEuDQotICAqIEBwYXJhbSAgREFDX0FsaWduOiBTcGVjaWZpZXMgdGhlIGRhdGEgYWxpZ25lbWVudCBmb3IgREFDIGNoYW5uZWwxLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19BbGlnbl84Yl9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25lbWVudCBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBEQUNfQWxpZ25fMTJiX0w6IDEyYml0IGxlZnQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQotICAqICAgICBAYXJnIERBQ19BbGlnbl8xMmJfUjogMTJiaXQgcmlnaHQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQotICAqIEBwYXJhbSAgRGF0YSA6IERhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIERBQ19TZXRDaGFubmVsMURhdGEodWludDMyX3QgREFDX0FsaWduLCB1aW50MTZfdCBEYXRhKQ0KLXsgIA0KLSAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihEQUNfQWxpZ24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19EQUNfREFUQShEYXRhKSk7DQotICANCi0gIHRtcCA9ICh1aW50MzJfdClEQUNfQkFTRTsgDQotICB0bXAgKz0gREhSMTJSMV9PRkZTRVQgKyBEQUNfQWxpZ247DQotDQotICAvKiBTZXQgdGhlIERBQyBjaGFubmVsMSBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgKi8NCi0gICooX19JTyB1aW50MzJfdCAqKSB0bXAgPSBEYXRhOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXQgdGhlIHNwZWNpZmllZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgdmFsdWUgZm9yIERBQyBjaGFubmVsMi4NCi0gICogQHBhcmFtICBEQUNfQWxpZ246IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbmVtZW50IGZvciBEQUMgY2hhbm5lbDIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0FsaWduXzhiX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQotICAqICAgICBAYXJnIERBQ19BbGlnbl8xMmJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgREFDX0FsaWduXzEyYl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBEYXRhIDogRGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3Rlci4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgREFDX1NldENoYW5uZWwyRGF0YSh1aW50MzJfdCBEQUNfQWxpZ24sIHVpbnQxNl90IERhdGEpDQotew0KLSAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19EQUNfQUxJR04oREFDX0FsaWduKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0RBVEEoRGF0YSkpOw0KLSAgDQotICB0bXAgPSAodWludDMyX3QpREFDX0JBU0U7DQotICB0bXAgKz0gREhSMTJSMl9PRkZTRVQgKyBEQUNfQWxpZ247DQotDQotICAvKiBTZXQgdGhlIERBQyBjaGFubmVsMiBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgKi8NCi0gICooX19JTyB1aW50MzJfdCAqKXRtcCA9IERhdGE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgZHVhbCBjaGFubmVsDQotICAqICAgREFDLg0KLSAgKiBAcGFyYW0gIERBQ19BbGlnbjogU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWduZW1lbnQgZm9yIGR1YWwgY2hhbm5lbCBEQUMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0FsaWduXzhiX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQotICAqICAgICBAYXJnIERBQ19BbGlnbl8xMmJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgREFDX0FsaWduXzEyYl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBEYXRhMjogRGF0YSBmb3IgREFDIENoYW5uZWwyIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSANCi0gICogICBob2xkaW5nIHJlZ2lzdGVyLg0KLSAgKiBAcGFyYW0gIERhdGExOiBEYXRhIGZvciBEQUMgQ2hhbm5lbDEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIA0KLSAgKiAgIGhvbGRpbmcgcmVnaXN0ZXIuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIERBQ19TZXREdWFsQ2hhbm5lbERhdGEodWludDMyX3QgREFDX0FsaWduLCB1aW50MTZfdCBEYXRhMiwgdWludDE2X3QgRGF0YTEpDQotew0KLSAgdWludDMyX3QgZGF0YSA9IDAsIHRtcCA9IDA7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMSUdOKERBQ19BbGlnbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGExKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0RBVEEoRGF0YTIpKTsNCi0gIA0KLSAgLyogQ2FsY3VsYXRlIGFuZCBzZXQgZHVhbCBEQUMgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlICovDQotICBpZiAoREFDX0FsaWduID09IERBQ19BbGlnbl84Yl9SKQ0KLSAgew0KLSAgICBkYXRhID0gKCh1aW50MzJfdClEYXRhMiA8PCA4KSB8IERhdGExOyANCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgZGF0YSA9ICgodWludDMyX3QpRGF0YTIgPDwgMTYpIHwgRGF0YTE7DQotICB9DQotICANCi0gIHRtcCA9ICh1aW50MzJfdClEQUNfQkFTRTsNCi0gIHRtcCArPSBESFIxMlJEX09GRlNFVCArIERBQ19BbGlnbjsNCi0NCi0gIC8qIFNldCB0aGUgZHVhbCBEQUMgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyICovDQotICAqKF9fSU8gdWludDMyX3QgKil0bXAgPSBkYXRhOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IGRhdGEgb3V0cHV0IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBEQUMgY2Fobm5lbC4NCi0gICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQNCi0gICogICAgIEBhcmcgREFDX0NoYW5uZWxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkDQotICAqIEByZXR2YWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIGRhdGEgb3V0cHV0IHZhbHVlLg0KLSAgKi8NCi11aW50MTZfdCBEQUNfR2V0RGF0YU91dHB1dFZhbHVlKHVpbnQzMl90IERBQ19DaGFubmVsKQ0KLXsNCi0gIF9fSU8gdWludDMyX3QgdG1wID0gMDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChEQUNfQ2hhbm5lbCkpOw0KLSAgDQotICB0bXAgPSAodWludDMyX3QpIERBQ19CQVNFIDsNCi0gIHRtcCArPSBET1JfT0ZGU0VUICsgKCh1aW50MzJfdClEQUNfQ2hhbm5lbCA+PiAyKTsNCi0gIA0KLSAgLyogUmV0dXJucyB0aGUgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHJldHVybiAodWludDE2X3QpICgqKF9fSU8gdWludDMyX3QqKSB0bXApOw0KLX0NCi0NCi0jaWYgZGVmaW5lZCAoU1RNMzJGMTBYX0xEX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfTURfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9IRF9WTCkNCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIERBQyBmbGFnIGlzIHNldCBvciBub3QuDQotICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZWUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBEQUNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KLSAgKiAgICAgQGFyZyBEQUNfRkxBR19ETUFVRFI6IERNQSB1bmRlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgREFDX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUZsYWdTdGF0dXMgREFDX0dldEZsYWdTdGF0dXModWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERBQ19GTEFHKQ0KLXsNCi0gIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0ZMQUcoREFDX0ZMQUcpKTsNCi0NCi0gIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBEQUMgZmxhZyAqLw0KLSAgaWYgKChEQUMtPlNSICYgKERBQ19GTEFHIDw8IERBQ19DaGFubmVsKSkgIT0gKHVpbnQ4X3QpUkVTRVQpDQotICB7DQotICAgIC8qIERBQ19GTEFHIGlzIHNldCAqLw0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERBQ19GTEFHIGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBEQUNfRkxBRyBzdGF0dXMgKi8NCi0gIHJldHVybiAgYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIERBQyBjaGFubmVseCdzIHBlbmRpbmcgZmxhZ3MuDQotICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0NoYW5uZWxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkDQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KLSAgKiBAcGFyYW0gIERBQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KLSAgKiAgICAgQGFyZyBEQUNfRkxBR19ETUFVRFI6IERNQSB1bmRlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIERBQ19DbGVhckZsYWcodWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERBQ19GTEFHKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoREFDX0NoYW5uZWwpKTsNCi0gIGFzc2VydF9wYXJhbShJU19EQUNfRkxBRyhEQUNfRkxBRykpOw0KLQ0KLSAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIERBQyBmbGFncyAqLw0KLSAgREFDLT5TUiA9IChEQUNfRkxBRyA8PCBEQUNfQ2hhbm5lbCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgREFDIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KLSAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBEQUNfSVQ6IHNwZWNpZmllcyB0aGUgREFDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0lUX0RNQVVEUjogRE1BIHVuZGVycnVuIGludGVycnVwdCBtYXNrICAgICAgICAgICAgICAgICAgICAgICANCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIERBQ19JVCAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotSVRTdGF0dXMgREFDX0dldElUU3RhdHVzKHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBEQUNfSVQpDQotew0KLSAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICB1aW50MzJfdCBlbmFibGVzdGF0dXMgPSAwOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0lUKERBQ19JVCkpOw0KLQ0KLSAgLyogR2V0IHRoZSBEQUNfSVQgZW5hYmxlIGJpdCBzdGF0dXMgKi8NCi0gIGVuYWJsZXN0YXR1cyA9IChEQUMtPkNSICYgKERBQ19JVCA8PCBEQUNfQ2hhbm5lbCkpIDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIERBQyBpbnRlcnJ1cHQgKi8NCi0gIGlmICgoKERBQy0+U1IgJiAoREFDX0lUIDw8IERBQ19DaGFubmVsKSkgIT0gKHVpbnQzMl90KVJFU0VUKSAmJiBlbmFibGVzdGF0dXMpDQotICB7DQotICAgIC8qIERBQ19JVCBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEQUNfSVQgaXMgcmVzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIERBQ19JVCBzdGF0dXMgKi8NCi0gIHJldHVybiAgYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIERBQyBjaGFubmVseJJzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQotICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0NoYW5uZWxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkDQotICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KLSAgKiBAcGFyYW0gIERBQ19JVDogc3BlY2lmaWVzIHRoZSBEQUMgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgREFDX0lUX0RNQVVEUjogRE1BIHVuZGVycnVuIGludGVycnVwdCBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBEQUNfQ2xlYXJJVFBlbmRpbmdCaXQodWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERBQ19JVCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfREFDX0lUKERBQ19JVCkpOyANCi0NCi0gIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBEQUMgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KLSAgREFDLT5TUiA9IChEQUNfSVQgPDwgREFDX0NoYW5uZWwpOw0KLX0NCi0jZW5kaWYNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2RiZ21jdS5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZGJnbWN1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNGU2MjcuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZGJnbWN1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2RiZ21jdS5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIERCR01DVSBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfZGJnbWN1LmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREJHTUNVIA0KLSAgKiBAYnJpZWYgREJHTUNVIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIERCR01DVV9Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREJHTUNVX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0jZGVmaW5lIElEQ09ERV9ERVZJRF9NQVNLICAgICgodWludDMyX3QpMHgwMDAwMEZGRikNCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQkdNQ1VfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgREJHTUNVX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERCR01DVV9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBEQkdNQ1VfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyB0aGUgZGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIERldmljZSByZXZpc2lvbiBpZGVudGlmaWVyDQotICAqLw0KLXVpbnQzMl90IERCR01DVV9HZXRSRVZJRCh2b2lkKQ0KLXsNCi0gICByZXR1cm4oREJHTUNVLT5JRENPREUgPj4gMTYpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSBkZXZpY2UgaWRlbnRpZmllci4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXINCi0gICovDQotdWludDMyX3QgREJHTUNVX0dldERFVklEKHZvaWQpDQotew0KLSAgIHJldHVybihEQkdNQ1UtPklEQ09ERSAmIElEQ09ERV9ERVZJRF9NQVNLKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgYW5kIGxvdyBwb3dlciBtb2RlIGJlaGF2aW9yDQotICAqICAgd2hlbiB0aGUgTUNVIHVuZGVyIERlYnVnIG1vZGUuDQotICAqIEBwYXJhbSAgREJHTUNVX1BlcmlwaDogc3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIGFuZCBsb3cgcG93ZXIgbW9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfU0xFRVA6IEtlZXAgZGVidWdnZXIgY29ubmVjdGlvbiBkdXJpbmcgU0xFRVAgbW9kZSAgICAgICAgICAgICAgDQotICAqICAgICBAYXJnIERCR01DVV9TVE9QOiBLZWVwIGRlYnVnZ2VyIGNvbm5lY3Rpb24gZHVyaW5nIFNUT1AgbW9kZSAgICAgICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfU1RBTkRCWTogS2VlcCBkZWJ1Z2dlciBjb25uZWN0aW9uIGR1cmluZyBTVEFOREJZIG1vZGUgICAgICAgICAgICANCi0gICogICAgIEBhcmcgREJHTUNVX0lXREdfU1RPUDogRGVidWcgSVdERyBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgICAgICAgICAgDQotICAqICAgICBAYXJnIERCR01DVV9XV0RHX1NUT1A6IERlYnVnIFdXREcgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfVElNMV9TVE9QOiBUSU0xIGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfVElNMl9TVE9QOiBUSU0yIGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfVElNM19TVE9QOiBUSU0zIGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfVElNNF9TVE9QOiBUSU00IGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfQ0FOMV9TVE9QOiBEZWJ1ZyBDQU4yIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAgICAgICAgICAgDQotICAqICAgICBAYXJnIERCR01DVV9JMkMxX1NNQlVTX1RJTUVPVVQ6IEkyQzEgU01CVVMgdGltZW91dCBtb2RlIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfSTJDMl9TTUJVU19USU1FT1VUOiBJMkMyIFNNQlVTIHRpbWVvdXQgbW9kZSBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQNCi0gICogICAgIEBhcmcgREJHTUNVX1RJTTVfU1RPUDogVElNNSBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAgICAgICAgICANCi0gICogICAgIEBhcmcgREJHTUNVX1RJTTZfU1RPUDogVElNNiBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAgICAgICAgICANCi0gICogICAgIEBhcmcgREJHTUNVX1RJTTdfU1RPUDogVElNNyBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAgICAgICAgICANCi0gICogICAgIEBhcmcgREJHTUNVX1RJTThfU1RPUDogVElNOCBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfQ0FOMl9TVE9QOiBEZWJ1ZyBDQU4yIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCANCi0gICogICAgIEBhcmcgREJHTUNVX1RJTTE1X1NUT1A6IFRJTTE1IGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkDQotICAqICAgICBAYXJnIERCR01DVV9USU0xNl9TVE9QOiBUSU0xNiBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfVElNMTdfU1RPUDogVElNMTcgY291bnRlciBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgICAgICAgICAgICAgICAgDQotICAqICAgICBAYXJnIERCR01DVV9USU05X1NUT1A6IFRJTTkgY291bnRlciBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQNCi0gICogICAgIEBhcmcgREJHTUNVX1RJTTEwX1NUT1A6IFRJTTEwIGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkDQotICAqICAgICBAYXJnIERCR01DVV9USU0xMV9TVE9QOiBUSU0xMSBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZA0KLSAgKiAgICAgQGFyZyBEQkdNQ1VfVElNMTJfU1RPUDogVElNMTIgY291bnRlciBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQNCi0gICogICAgIEBhcmcgREJHTUNVX1RJTTEzX1NUT1A6IFRJTTEzIGNvdW50ZXIgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkDQotICAqICAgICBAYXJnIERCR01DVV9USU0xNF9TVE9QOiBUSU0xNCBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGluIERlYnVnIG1vZGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgREJHTUNVX0NvbmZpZyh1aW50MzJfdCBEQkdNQ1VfUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19EQkdNQ1VfUEVSSVBIKERCR01DVV9QZXJpcGgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgREJHTUNVLT5DUiB8PSBEQkdNQ1VfUGVyaXBoOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBEQkdNQ1UtPkNSICY9IH5EQkdNQ1VfUGVyaXBoOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2RtYS5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzJiNTQuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTEgKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X2RtYS5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIERNQSBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfZG1hLmgiDQotI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUEgDQotICAqIEBicmllZiBETUEgZHJpdmVyIG1vZHVsZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KLSAgKiBAew0KLSAgKi8gDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0NCi0vKiBETUExIENoYW5uZWx4IGludGVycnVwdCBwZW5kaW5nIGJpdCBtYXNrcyAqLw0KLSNkZWZpbmUgRE1BMV9DaGFubmVsMV9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGMSB8IERNQV9JU1JfVENJRjEgfCBETUFfSVNSX0hUSUYxIHwgRE1BX0lTUl9URUlGMSkpDQotI2RlZmluZSBETUExX0NoYW5uZWwyX0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUYyIHwgRE1BX0lTUl9UQ0lGMiB8IERNQV9JU1JfSFRJRjIgfCBETUFfSVNSX1RFSUYyKSkNCi0jZGVmaW5lIERNQTFfQ2hhbm5lbDNfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjMgfCBETUFfSVNSX1RDSUYzIHwgRE1BX0lTUl9IVElGMyB8IERNQV9JU1JfVEVJRjMpKQ0KLSNkZWZpbmUgRE1BMV9DaGFubmVsNF9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGNCB8IERNQV9JU1JfVENJRjQgfCBETUFfSVNSX0hUSUY0IHwgRE1BX0lTUl9URUlGNCkpDQotI2RlZmluZSBETUExX0NoYW5uZWw1X0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUY1IHwgRE1BX0lTUl9UQ0lGNSB8IERNQV9JU1JfSFRJRjUgfCBETUFfSVNSX1RFSUY1KSkNCi0jZGVmaW5lIERNQTFfQ2hhbm5lbDZfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjYgfCBETUFfSVNSX1RDSUY2IHwgRE1BX0lTUl9IVElGNiB8IERNQV9JU1JfVEVJRjYpKQ0KLSNkZWZpbmUgRE1BMV9DaGFubmVsN19JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGNyB8IERNQV9JU1JfVENJRjcgfCBETUFfSVNSX0hUSUY3IHwgRE1BX0lTUl9URUlGNykpDQotDQotLyogRE1BMiBDaGFubmVseCBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgbWFza3MgKi8NCi0jZGVmaW5lIERNQTJfQ2hhbm5lbDFfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjEgfCBETUFfSVNSX1RDSUYxIHwgRE1BX0lTUl9IVElGMSB8IERNQV9JU1JfVEVJRjEpKQ0KLSNkZWZpbmUgRE1BMl9DaGFubmVsMl9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGMiB8IERNQV9JU1JfVENJRjIgfCBETUFfSVNSX0hUSUYyIHwgRE1BX0lTUl9URUlGMikpDQotI2RlZmluZSBETUEyX0NoYW5uZWwzX0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUYzIHwgRE1BX0lTUl9UQ0lGMyB8IERNQV9JU1JfSFRJRjMgfCBETUFfSVNSX1RFSUYzKSkNCi0jZGVmaW5lIERNQTJfQ2hhbm5lbDRfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjQgfCBETUFfSVNSX1RDSUY0IHwgRE1BX0lTUl9IVElGNCB8IERNQV9JU1JfVEVJRjQpKQ0KLSNkZWZpbmUgRE1BMl9DaGFubmVsNV9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGNSB8IERNQV9JU1JfVENJRjUgfCBETUFfSVNSX0hUSUY1IHwgRE1BX0lTUl9URUlGNSkpDQotDQotLyogRE1BMiBGTEFHIG1hc2sgKi8NCi0jZGVmaW5lIEZMQUdfTWFzayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDApDQotDQotLyogRE1BIHJlZ2lzdGVycyBNYXNrcyAqLw0KLSNkZWZpbmUgQ0NSX0NMRUFSX01hc2sgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGODAwRikNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIERNQV9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBETUFfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRE1BeSBDaGFubmVseCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldA0KLSAgKiAgIHZhbHVlcy4NCi0gICogQHBhcmFtICBETUF5X0NoYW5uZWx4OiB3aGVyZSB5IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBETUEgYW5kDQotICAqICAgeCBjYW4gYmUgMSB0byA3IGZvciBETUExIGFuZCAxIHRvIDUgZm9yIERNQTIgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRE1BX0RlSW5pdChETUFfQ2hhbm5lbF9UeXBlRGVmKiBETUF5X0NoYW5uZWx4KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9QRVJJUEgoRE1BeV9DaGFubmVseCkpOw0KLSAgDQotICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUF5IENoYW5uZWx4ICovDQotICBETUF5X0NoYW5uZWx4LT5DQ1IgJj0gKHVpbnQxNl90KSh+RE1BX0NDUjFfRU4pOw0KLSAgDQotICAvKiBSZXNldCBETUF5IENoYW5uZWx4IGNvbnRyb2wgcmVnaXN0ZXIgKi8NCi0gIERNQXlfQ2hhbm5lbHgtPkNDUiAgPSAwOw0KLSAgDQotICAvKiBSZXNldCBETUF5IENoYW5uZWx4IHJlbWFpbmluZyBieXRlcyByZWdpc3RlciAqLw0KLSAgRE1BeV9DaGFubmVseC0+Q05EVFIgPSAwOw0KLSAgDQotICAvKiBSZXNldCBETUF5IENoYW5uZWx4IHBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlciAqLw0KLSAgRE1BeV9DaGFubmVseC0+Q1BBUiAgPSAwOw0KLSAgDQotICAvKiBSZXNldCBETUF5IENoYW5uZWx4IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovDQotICBETUF5X0NoYW5uZWx4LT5DTUFSID0gMDsNCi0gIA0KLSAgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsMSkNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsMSAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDFfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsMikNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsMiAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDJfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsMykNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsMyAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDNfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsNCkNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsNCAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDRfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsNSkNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsNSAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDVfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsNikNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsNiAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDZfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsNykNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsNyAqLw0KLSAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDdfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMl9DaGFubmVsMSkNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMiBDaGFubmVsMSAqLw0KLSAgICBETUEyLT5JRkNSIHw9IERNQTJfQ2hhbm5lbDFfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMl9DaGFubmVsMikNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMiBDaGFubmVsMiAqLw0KLSAgICBETUEyLT5JRkNSIHw9IERNQTJfQ2hhbm5lbDJfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMl9DaGFubmVsMykNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMiBDaGFubmVsMyAqLw0KLSAgICBETUEyLT5JRkNSIHw9IERNQTJfQ2hhbm5lbDNfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMl9DaGFubmVsNCkNCi0gIHsNCi0gICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMiBDaGFubmVsNCAqLw0KLSAgICBETUEyLT5JRkNSIHw9IERNQTJfQ2hhbm5lbDRfSVRfTWFzazsNCi0gIH0NCi0gIGVsc2UNCi0gIHsgDQotICAgIGlmIChETUF5X0NoYW5uZWx4ID09IERNQTJfQ2hhbm5lbDUpDQotICAgIHsNCi0gICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUEyIENoYW5uZWw1ICovDQotICAgICAgRE1BMi0+SUZDUiB8PSBETUEyX0NoYW5uZWw1X0lUX01hc2s7DQotICAgIH0NCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIERNQXkgQ2hhbm5lbHggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBETUFfSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBETUF5X0NoYW5uZWx4OiB3aGVyZSB5IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBETUEgYW5kIA0KLSAgKiAgIHggY2FuIGJlIDEgdG8gNyBmb3IgRE1BMSBhbmQgMSB0byA1IGZvciBETUEyIHRvIHNlbGVjdCB0aGUgRE1BIENoYW5uZWwuDQotICAqIEBwYXJhbSAgRE1BX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCi0gICogICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRE1BX0luaXQoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCwgRE1BX0luaXRUeXBlRGVmKiBETUFfSW5pdFN0cnVjdCkNCi17DQotICB1aW50MzJfdCB0bXByZWcgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX1BFUklQSChETUF5X0NoYW5uZWx4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0RJUihETUFfSW5pdFN0cnVjdC0+RE1BX0RJUikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShETUFfSW5pdFN0cnVjdC0+RE1BX0J1ZmZlclNpemUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9JTkNfU1RBVEUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsSW5jKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX01FTU9SWV9JTkNfU1RBVEUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9NZW1vcnlJbmMpKTsgICANCi0gIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9EQVRBX1NJWkUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsRGF0YVNpemUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0RBVEFfU0laRShETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeURhdGFTaXplKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX01PREUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9Nb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BSSU9SSVRZKERNQV9Jbml0U3RydWN0LT5ETUFfUHJpb3JpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19ETUFfTTJNX1NUQVRFKERNQV9Jbml0U3RydWN0LT5ETUFfTTJNKSk7DQotDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeSBDaGFubmVseCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBHZXQgdGhlIERNQXlfQ2hhbm5lbHggQ0NSIHZhbHVlICovDQotICB0bXByZWcgPSBETUF5X0NoYW5uZWx4LT5DQ1I7DQotICAvKiBDbGVhciBNRU0yTUVNLCBQTCwgTVNJWkUsIFBTSVpFLCBNSU5DLCBQSU5DLCBDSVJDIGFuZCBESVIgYml0cyAqLw0KLSAgdG1wcmVnICY9IENDUl9DTEVBUl9NYXNrOw0KLSAgLyogQ29uZmlndXJlIERNQXkgQ2hhbm5lbHg6IGRhdGEgdHJhbnNmZXIsIGRhdGEgc2l6ZSwgcHJpb3JpdHkgbGV2ZWwgYW5kIG1vZGUgKi8NCi0gIC8qIFNldCBESVIgYml0IGFjY29yZGluZyB0byBETUFfRElSIHZhbHVlICovDQotICAvKiBTZXQgQ0lSQyBiaXQgYWNjb3JkaW5nIHRvIERNQV9Nb2RlIHZhbHVlICovDQotICAvKiBTZXQgUElOQyBiaXQgYWNjb3JkaW5nIHRvIERNQV9QZXJpcGhlcmFsSW5jIHZhbHVlICovDQotICAvKiBTZXQgTUlOQyBiaXQgYWNjb3JkaW5nIHRvIERNQV9NZW1vcnlJbmMgdmFsdWUgKi8NCi0gIC8qIFNldCBQU0laRSBiaXRzIGFjY29yZGluZyB0byBETUFfUGVyaXBoZXJhbERhdGFTaXplIHZhbHVlICovDQotICAvKiBTZXQgTVNJWkUgYml0cyBhY2NvcmRpbmcgdG8gRE1BX01lbW9yeURhdGFTaXplIHZhbHVlICovDQotICAvKiBTZXQgUEwgYml0cyBhY2NvcmRpbmcgdG8gRE1BX1ByaW9yaXR5IHZhbHVlICovDQotICAvKiBTZXQgdGhlIE1FTTJNRU0gYml0IGFjY29yZGluZyB0byBETUFfTTJNIHZhbHVlICovDQotICB0bXByZWcgfD0gRE1BX0luaXRTdHJ1Y3QtPkRNQV9ESVIgfCBETUFfSW5pdFN0cnVjdC0+RE1BX01vZGUgfA0KLSAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbEluYyB8IERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5SW5jIHwNCi0gICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxEYXRhU2l6ZSB8IERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5RGF0YVNpemUgfA0KLSAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5ETUFfUHJpb3JpdHkgfCBETUFfSW5pdFN0cnVjdC0+RE1BX00yTTsNCi0NCi0gIC8qIFdyaXRlIHRvIERNQXkgQ2hhbm5lbHggQ0NSICovDQotICBETUF5X0NoYW5uZWx4LT5DQ1IgPSB0bXByZWc7DQotDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeSBDaGFubmVseCBDTkRUUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBXcml0ZSB0byBETUF5IENoYW5uZWx4IENORFRSICovDQotICBETUF5X0NoYW5uZWx4LT5DTkRUUiA9IERNQV9Jbml0U3RydWN0LT5ETUFfQnVmZmVyU2l6ZTsNCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF5IENoYW5uZWx4IENQQVIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIFdyaXRlIHRvIERNQXkgQ2hhbm5lbHggQ1BBUiAqLw0KLSAgRE1BeV9DaGFubmVseC0+Q1BBUiA9IERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbEJhc2VBZGRyOw0KLQ0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXkgQ2hhbm5lbHggQ01BUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogV3JpdGUgdG8gRE1BeSBDaGFubmVseCBDTUFSICovDQotICBETUF5X0NoYW5uZWx4LT5DTUFSID0gRE1BX0luaXRTdHJ1Y3QtPkRNQV9NZW1vcnlCYXNlQWRkcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRmlsbHMgZWFjaCBETUFfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBETUFfSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwNCi0gICogICBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRE1BX1N0cnVjdEluaXQoRE1BX0luaXRUeXBlRGVmKiBETUFfSW5pdFN0cnVjdCkNCi17DQotLyotLS0tLS0tLS0tLS0tLSBSZXNldCBETUEgaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9QZXJpcGhlcmFsQmFzZUFkZHIgbWVtYmVyICovDQotICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxCYXNlQWRkciA9IDA7DQotICAvKiBJbml0aWFsaXplIHRoZSBETUFfTWVtb3J5QmFzZUFkZHIgbWVtYmVyICovDQotICBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeUJhc2VBZGRyID0gMDsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9ESVIgbWVtYmVyICovDQotICBETUFfSW5pdFN0cnVjdC0+RE1BX0RJUiA9IERNQV9ESVJfUGVyaXBoZXJhbFNSQzsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9CdWZmZXJTaXplIG1lbWJlciAqLw0KLSAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9CdWZmZXJTaXplID0gMDsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9QZXJpcGhlcmFsSW5jIG1lbWJlciAqLw0KLSAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsSW5jID0gRE1BX1BlcmlwaGVyYWxJbmNfRGlzYWJsZTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9NZW1vcnlJbmMgbWVtYmVyICovDQotICBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeUluYyA9IERNQV9NZW1vcnlJbmNfRGlzYWJsZTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9QZXJpcGhlcmFsRGF0YVNpemUgbWVtYmVyICovDQotICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxEYXRhU2l6ZSA9IERNQV9QZXJpcGhlcmFsRGF0YVNpemVfQnl0ZTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9NZW1vcnlEYXRhU2l6ZSBtZW1iZXIgKi8NCi0gIERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5RGF0YVNpemUgPSBETUFfTWVtb3J5RGF0YVNpemVfQnl0ZTsNCi0gIC8qIEluaXRpYWxpemUgdGhlIERNQV9Nb2RlIG1lbWJlciAqLw0KLSAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9Nb2RlID0gRE1BX01vZGVfTm9ybWFsOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BX1ByaW9yaXR5IG1lbWJlciAqLw0KLSAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9Qcmlvcml0eSA9IERNQV9Qcmlvcml0eV9Mb3c7DQotICAvKiBJbml0aWFsaXplIHRoZSBETUFfTTJNIG1lbWJlciAqLw0KLSAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9NMk0gPSBETUFfTTJNX0Rpc2FibGU7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBETUF5IENoYW5uZWx4Lg0KLSAgKiBAcGFyYW0gIERNQXlfQ2hhbm5lbHg6IHdoZXJlIHkgY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIERNQSBhbmQgDQotICAqICAgeCBjYW4gYmUgMSB0byA3IGZvciBETUExIGFuZCAxIHRvIDUgZm9yIERNQTIgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBETUF5IENoYW5uZWx4LiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBETUFfQ21kKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfUEVSSVBIKERNQXlfQ2hhbm5lbHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBETUF5IENoYW5uZWx4ICovDQotICAgIERNQXlfQ2hhbm5lbHgtPkNDUiB8PSBETUFfQ0NSMV9FTjsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRE1BeSBDaGFubmVseCAqLw0KLSAgICBETUF5X0NoYW5uZWx4LT5DQ1IgJj0gKHVpbnQxNl90KSh+RE1BX0NDUjFfRU4pOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgRE1BeSBDaGFubmVseCBpbnRlcnJ1cHRzLg0KLSAgKiBAcGFyYW0gIERNQXlfQ2hhbm5lbHg6IHdoZXJlIHkgY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIERNQSBhbmQgDQotICAqICAgeCBjYW4gYmUgMSB0byA3IGZvciBETUExIGFuZCAxIHRvIDUgZm9yIERNQTIgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbC4NCi0gICogQHBhcmFtICBETUFfSVQ6IHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkDQotICAqICAgb3IgZGlzYWJsZWQuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIERNQV9JVF9UQzogIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrDQotICAqICAgICBAYXJnIERNQV9JVF9IVDogIEhhbGYgdHJhbnNmZXIgaW50ZXJydXB0IG1hc2sNCi0gICogICAgIEBhcmcgRE1BX0lUX1RFOiAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sNCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgRE1BIGludGVycnVwdHMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRE1BX0lUQ29uZmlnKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgsIHVpbnQzMl90IERNQV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9QRVJJUEgoRE1BeV9DaGFubmVseCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9DT05GSUdfSVQoRE1BX0lUKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgRE1BIGludGVycnVwdHMgKi8NCi0gICAgRE1BeV9DaGFubmVseC0+Q0NSIHw9IERNQV9JVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRE1BIGludGVycnVwdHMgKi8NCi0gICAgRE1BeV9DaGFubmVseC0+Q0NSICY9IH5ETUFfSVQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIG51bWJlciBvZiBkYXRhIHVuaXRzIGluIHRoZSBjdXJyZW50IERNQXkgQ2hhbm5lbHggdHJhbnNmZXIuDQotICAqIEBwYXJhbSAgRE1BeV9DaGFubmVseDogd2hlcmUgeSBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgRE1BIGFuZCANCi0gICogICAgICAgICB4IGNhbiBiZSAxIHRvIDcgZm9yIERNQTEgYW5kIDEgdG8gNSBmb3IgRE1BMiB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsLg0KLSAgKiBAcGFyYW0gIERhdGFOdW1iZXI6IFRoZSBudW1iZXIgb2YgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudCBETUF5IENoYW5uZWx4DQotICAqICAgICAgICAgdHJhbnNmZXIuICAgDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIERNQXlfQ2hhbm5lbHggaXMgZGlzYWJsZWQuICAgICAgICAgICAgICAgICANCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIERNQV9TZXRDdXJyRGF0YUNvdW50ZXIoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCwgdWludDE2X3QgRGF0YU51bWJlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfUEVSSVBIKERNQXlfQ2hhbm5lbHgpKTsNCi0gIA0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXkgQ2hhbm5lbHggQ05EVFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogV3JpdGUgdG8gRE1BeSBDaGFubmVseCBDTkRUUiAqLw0KLSAgRE1BeV9DaGFubmVseC0+Q05EVFIgPSBEYXRhTnVtYmVyOyAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudA0KLSAgKiAgIERNQXkgQ2hhbm5lbHggdHJhbnNmZXIuDQotICAqIEBwYXJhbSAgRE1BeV9DaGFubmVseDogd2hlcmUgeSBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgRE1BIGFuZCANCi0gICogICB4IGNhbiBiZSAxIHRvIDcgZm9yIERNQTEgYW5kIDEgdG8gNSBmb3IgRE1BMiB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsLg0KLSAgKiBAcmV0dmFsIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BeSBDaGFubmVseA0KLSAgKiAgIHRyYW5zZmVyLg0KLSAgKi8NCi11aW50MTZfdCBETUFfR2V0Q3VyckRhdGFDb3VudGVyKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX1BFUklQSChETUF5X0NoYW5uZWx4KSk7DQotICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBmb3IgRE1BeSBDaGFubmVseCAqLw0KLSAgcmV0dXJuICgodWludDE2X3QpKERNQXlfQ2hhbm5lbHgtPkNORFRSKSk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRE1BeSBDaGFubmVseCBmbGFnIGlzIHNldCBvciBub3QuDQotICAqIEBwYXJhbSAgRE1BX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0wxOiBETUExIENoYW5uZWwxIGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEMxOiBETUExIENoYW5uZWwxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19IVDE6IERNQTEgQ2hhbm5lbDEgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEUxOiBETUExIENoYW5uZWwxIHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19HTDI6IERNQTEgQ2hhbm5lbDIgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19UQzI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0hUMjogRE1BMSBDaGFubmVsMiBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19URTI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0dMMzogRE1BMSBDaGFubmVsMyBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RDMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQzOiBETUExIENoYW5uZWwzIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RFMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w0OiBETUExIENoYW5uZWw0IGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM0OiBETUExIENoYW5uZWw0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19IVDQ6IERNQTEgQ2hhbm5lbDQgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU0OiBETUExIENoYW5uZWw0IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19HTDU6IERNQTEgQ2hhbm5lbDUgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19UQzU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0hUNTogRE1BMSBDaGFubmVsNSBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19URTU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0dMNjogRE1BMSBDaGFubmVsNiBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RDNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQ2OiBETUExIENoYW5uZWw2IGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RFNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w3OiBETUExIENoYW5uZWw3IGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM3OiBETUExIENoYW5uZWw3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19IVDc6IERNQTEgQ2hhbm5lbDcgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU3OiBETUExIENoYW5uZWw3IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19HTDE6IERNQTIgQ2hhbm5lbDEgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19UQzE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0hUMTogRE1BMiBDaGFubmVsMSBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19URTE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0dMMjogRE1BMiBDaGFubmVsMiBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RDMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQyOiBETUEyIENoYW5uZWwyIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RFMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfR0wzOiBETUEyIENoYW5uZWwzIGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEMzOiBETUEyIENoYW5uZWwzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19IVDM6IERNQTIgQ2hhbm5lbDMgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEUzOiBETUEyIENoYW5uZWwzIHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19HTDQ6IERNQTIgQ2hhbm5lbDQgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19UQzQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0hUNDogRE1BMiBDaGFubmVsNCBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19URTQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0dMNTogRE1BMiBDaGFubmVsNSBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RDNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQ1OiBETUEyIENoYW5uZWw1IGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RFNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRE1BX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUZsYWdTdGF0dXMgRE1BX0dldEZsYWdTdGF0dXModWludDMyX3QgRE1BX0ZMQUcpDQotew0KLSAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIHVpbnQzMl90IHRtcHJlZyA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9HRVRfRkxBRyhETUFfRkxBRykpOw0KLQ0KLSAgLyogQ2FsY3VsYXRlIHRoZSB1c2VkIERNQSAqLw0KLSAgaWYgKChETUFfRkxBRyAmIEZMQUdfTWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgew0KLSAgICAvKiBHZXQgRE1BMiBJU1IgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gICAgdG1wcmVnID0gRE1BMi0+SVNSIDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogR2V0IERNQTEgSVNSIHJlZ2lzdGVyIHZhbHVlICovDQotICAgIHRtcHJlZyA9IERNQTEtPklTUiA7DQotICB9DQotDQotICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgRE1BIGZsYWcgKi8NCi0gIGlmICgodG1wcmVnICYgRE1BX0ZMQUcpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsNCi0gICAgLyogRE1BX0ZMQUcgaXMgc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRE1BX0ZMQUcgaXMgcmVzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICANCi0gIC8qIFJldHVybiB0aGUgRE1BX0ZMQUcgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBETUF5IENoYW5uZWx4J3MgcGVuZGluZyBmbGFncy4NCi0gICogQHBhcmFtICBETUFfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gKGZvciB0aGUgc2FtZSBETUEpIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0wxOiBETUExIENoYW5uZWwxIGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEMxOiBETUExIENoYW5uZWwxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19IVDE6IERNQTEgQ2hhbm5lbDEgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEUxOiBETUExIENoYW5uZWwxIHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19HTDI6IERNQTEgQ2hhbm5lbDIgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19UQzI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0hUMjogRE1BMSBDaGFubmVsMiBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19URTI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0dMMzogRE1BMSBDaGFubmVsMyBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RDMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQzOiBETUExIENoYW5uZWwzIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RFMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w0OiBETUExIENoYW5uZWw0IGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM0OiBETUExIENoYW5uZWw0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19IVDQ6IERNQTEgQ2hhbm5lbDQgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU0OiBETUExIENoYW5uZWw0IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19HTDU6IERNQTEgQ2hhbm5lbDUgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19UQzU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0hUNTogRE1BMSBDaGFubmVsNSBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19URTU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX0dMNjogRE1BMSBDaGFubmVsNiBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RDNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQ2OiBETUExIENoYW5uZWw2IGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMV9GTEFHX1RFNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w3OiBETUExIENoYW5uZWw3IGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM3OiBETUExIENoYW5uZWw3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTFfRkxBR19IVDc6IERNQTEgQ2hhbm5lbDcgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU3OiBETUExIENoYW5uZWw3IHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19HTDE6IERNQTIgQ2hhbm5lbDEgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19UQzE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0hUMTogRE1BMiBDaGFubmVsMSBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19URTE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0dMMjogRE1BMiBDaGFubmVsMiBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RDMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQyOiBETUEyIENoYW5uZWwyIGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RFMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfR0wzOiBETUEyIENoYW5uZWwzIGdsb2JhbCBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEMzOiBETUEyIENoYW5uZWwzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19IVDM6IERNQTIgQ2hhbm5lbDMgaGFsZiB0cmFuc2ZlciBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEUzOiBETUEyIENoYW5uZWwzIHRyYW5zZmVyIGVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19HTDQ6IERNQTIgQ2hhbm5lbDQgZ2xvYmFsIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19UQzQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0hUNDogRE1BMiBDaGFubmVsNCBoYWxmIHRyYW5zZmVyIGZsYWcuDQotICAqICAgICBAYXJnIERNQTJfRkxBR19URTQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX0dMNTogRE1BMiBDaGFubmVsNSBnbG9iYWwgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RDNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KLSAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQ1OiBETUEyIENoYW5uZWw1IGhhbGYgdHJhbnNmZXIgZmxhZy4NCi0gICogICAgIEBhcmcgRE1BMl9GTEFHX1RFNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBETUFfQ2xlYXJGbGFnKHVpbnQzMl90IERNQV9GTEFHKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0NMRUFSX0ZMQUcoRE1BX0ZMQUcpKTsNCi0gIC8qIENhbGN1bGF0ZSB0aGUgdXNlZCBETUEgKi8NCi0NCi0gIGlmICgoRE1BX0ZMQUcgJiBGTEFHX01hc2spICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsNCi0gICAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIERNQSBmbGFncyAqLw0KLSAgICBETUEyLT5JRkNSID0gRE1BX0ZMQUc7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBETUEgZmxhZ3MgKi8NCi0gICAgRE1BMS0+SUZDUiA9IERNQV9GTEFHOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIERNQXkgQ2hhbm5lbHggaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQotICAqIEBwYXJhbSAgRE1BX0lUOiBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0dMMTogRE1BMSBDaGFubmVsMSBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RDMTogRE1BMSBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfSFQxOiBETUExIENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RFMTogRE1BMSBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfR0wyOiBETUExIENoYW5uZWwyIGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEMyOiBETUExIENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9IVDI6IERNQTEgQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEUyOiBETUExIENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9HTDM6IERNQTEgQ2hhbm5lbDMgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9UQzM6IERNQTEgQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0hUMzogRE1BMSBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9URTM6IERNQTEgQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0dMNDogRE1BMSBDaGFubmVsNCBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RDNDogRE1BMSBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfSFQ0OiBETUExIENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RFNDogRE1BMSBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfR0w1OiBETUExIENoYW5uZWw1IGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEM1OiBETUExIENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9IVDU6IERNQTEgQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEU1OiBETUExIENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9HTDY6IERNQTEgQ2hhbm5lbDYgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9UQzY6IERNQTEgQ2hhbm5lbDYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0hUNjogRE1BMSBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9URTY6IERNQTEgQ2hhbm5lbDYgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0dMNzogRE1BMSBDaGFubmVsNyBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RDNzogRE1BMSBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfSFQ3OiBETUExIENoYW5uZWw3IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RFNzogRE1BMSBDaGFubmVsNyB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfR0wxOiBETUEyIENoYW5uZWwxIGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEMxOiBETUEyIENoYW5uZWwxIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9IVDE6IERNQTIgQ2hhbm5lbDEgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEUxOiBETUEyIENoYW5uZWwxIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9HTDI6IERNQTIgQ2hhbm5lbDIgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9UQzI6IERNQTIgQ2hhbm5lbDIgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX0hUMjogRE1BMiBDaGFubmVsMiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9URTI6IERNQTIgQ2hhbm5lbDIgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX0dMMzogRE1BMiBDaGFubmVsMyBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX1RDMzogRE1BMiBDaGFubmVsMyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfSFQzOiBETUEyIENoYW5uZWwzIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX1RFMzogRE1BMiBDaGFubmVsMyB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfR0w0OiBETUEyIENoYW5uZWw0IGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEM0OiBETUEyIENoYW5uZWw0IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9IVDQ6IERNQTIgQ2hhbm5lbDQgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEU0OiBETUEyIENoYW5uZWw0IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9HTDU6IERNQTIgQ2hhbm5lbDUgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9UQzU6IERNQTIgQ2hhbm5lbDUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX0hUNTogRE1BMiBDaGFubmVsNSBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9URTU6IERNQTIgQ2hhbm5lbDUgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRE1BX0lUIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1JVFN0YXR1cyBETUFfR2V0SVRTdGF0dXModWludDMyX3QgRE1BX0lUKQ0KLXsNCi0gIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRE1BX0dFVF9JVChETUFfSVQpKTsNCi0NCi0gIC8qIENhbGN1bGF0ZSB0aGUgdXNlZCBETUEgKi8NCi0gIGlmICgoRE1BX0lUICYgRkxBR19NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQotICB7DQotICAgIC8qIEdldCBETUEyIElTUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgICB0bXByZWcgPSBETUEyLT5JU1IgOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBHZXQgRE1BMSBJU1IgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gICAgdG1wcmVnID0gRE1BMS0+SVNSIDsNCi0gIH0NCi0NCi0gIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBETUEgaW50ZXJydXB0ICovDQotICBpZiAoKHRtcHJlZyAmIERNQV9JVCkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgew0KLSAgICAvKiBETUFfSVQgaXMgc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRE1BX0lUIGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBETUFfSVQgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBETUF5IENoYW5uZWx4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gICogQHBhcmFtICBETUFfSVQ6IHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIChmb3IgdGhlIHNhbWUgRE1BKSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRE1BMV9JVF9HTDE6IERNQTEgQ2hhbm5lbDEgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9UQzE6IERNQTEgQ2hhbm5lbDEgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0hUMTogRE1BMSBDaGFubmVsMSBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9URTE6IERNQTEgQ2hhbm5lbDEgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0dMMjogRE1BMSBDaGFubmVsMiBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RDMjogRE1BMSBDaGFubmVsMiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfSFQyOiBETUExIENoYW5uZWwyIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RFMjogRE1BMSBDaGFubmVsMiB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfR0wzOiBETUExIENoYW5uZWwzIGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEMzOiBETUExIENoYW5uZWwzIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9IVDM6IERNQTEgQ2hhbm5lbDMgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEUzOiBETUExIENoYW5uZWwzIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9HTDQ6IERNQTEgQ2hhbm5lbDQgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9UQzQ6IERNQTEgQ2hhbm5lbDQgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0hUNDogRE1BMSBDaGFubmVsNCBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9URTQ6IERNQTEgQ2hhbm5lbDQgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0dMNTogRE1BMSBDaGFubmVsNSBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RDNTogRE1BMSBDaGFubmVsNSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfSFQ1OiBETUExIENoYW5uZWw1IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX1RFNTogRE1BMSBDaGFubmVsNSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfR0w2OiBETUExIENoYW5uZWw2IGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEM2OiBETUExIENoYW5uZWw2IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9IVDY6IERNQTEgQ2hhbm5lbDYgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTFfSVRfVEU2OiBETUExIENoYW5uZWw2IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9HTDc6IERNQTEgQ2hhbm5lbDcgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9UQzc6IERNQTEgQ2hhbm5lbDcgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUExX0lUX0hUNzogRE1BMSBDaGFubmVsNyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMV9JVF9URTc6IERNQTEgQ2hhbm5lbDcgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX0dMMTogRE1BMiBDaGFubmVsMSBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX1RDMTogRE1BMiBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfSFQxOiBETUEyIENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX1RFMTogRE1BMiBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfR0wyOiBETUEyIENoYW5uZWwyIGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEMyOiBETUEyIENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9IVDI6IERNQTIgQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEUyOiBETUEyIENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9HTDM6IERNQTIgQ2hhbm5lbDMgZ2xvYmFsIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9UQzM6IERNQTIgQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX0hUMzogRE1BMiBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9URTM6IERNQTIgQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX0dMNDogRE1BMiBDaGFubmVsNCBnbG9iYWwgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX1RDNDogRE1BMiBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfSFQ0OiBETUEyIENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBETUEyX0lUX1RFNDogRE1BMiBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfR0w1OiBETUEyIENoYW5uZWw1IGdsb2JhbCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEM1OiBETUEyIENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRE1BMl9JVF9IVDU6IERNQTIgQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIERNQTJfSVRfVEU1OiBETUEyIENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRE1BX0NsZWFySVRQZW5kaW5nQml0KHVpbnQzMl90IERNQV9JVCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0RNQV9DTEVBUl9JVChETUFfSVQpKTsNCi0NCi0gIC8qIENhbGN1bGF0ZSB0aGUgdXNlZCBETUEgKi8NCi0gIGlmICgoRE1BX0lUICYgRkxBR19NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQotICB7DQotICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBETUEgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KLSAgICBETUEyLT5JRkNSID0gRE1BX0lUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgRE1BIGludGVycnVwdCBwZW5kaW5nIGJpdHMgKi8NCi0gICAgRE1BMS0+SUZDUiA9IERNQV9JVDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9mbGFzaC5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYjcxNS4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9mbGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4MyArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfZmxhc2guYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBGTEFTSCBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfZmxhc2guaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGTEFTSCANCi0gICogQGJyaWVmIEZMQVNIIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9EZWZpbmVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKiBGbGFzaCBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciBiaXRzICovDQotI2RlZmluZSBBQ1JfTEFURU5DWV9NYXNrICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDM4KQ0KLSNkZWZpbmUgQUNSX0hMRkNZQV9NYXNrICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZGNykNCi0jZGVmaW5lIEFDUl9QUkZUQkVfTWFzayAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRUYpDQotDQotLyogRmxhc2ggQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLw0KLSNkZWZpbmUgQUNSX1BSRlRCU19NYXNrICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkgDQotDQotLyogRmxhc2ggQ29udHJvbCBSZWdpc3RlciBiaXRzICovDQotI2RlZmluZSBDUl9QR19TZXQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQ0KLSNkZWZpbmUgQ1JfUEdfUmVzZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZGRSkgDQotI2RlZmluZSBDUl9QRVJfU2V0ICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KLSNkZWZpbmUgQ1JfUEVSX1Jlc2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZGRCkNCi0jZGVmaW5lIENSX01FUl9TZXQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQotI2RlZmluZSBDUl9NRVJfUmVzZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxRkZCKQ0KLSNkZWZpbmUgQ1JfT1BUUEdfU2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkNCi0jZGVmaW5lIENSX09QVFBHX1Jlc2V0ICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDFGRUYpDQotI2RlZmluZSBDUl9PUFRFUl9TZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKQ0KLSNkZWZpbmUgQ1JfT1BURVJfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZERikNCi0jZGVmaW5lIENSX1NUUlRfU2V0ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDApDQotI2RlZmluZSBDUl9MT0NLX1NldCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KLQ0KLS8qIEZMQVNIIE1hc2sgKi8NCi0jZGVmaW5lIFJEUFJUX01hc2sgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDIpDQotI2RlZmluZSBXUlAwX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMEZGKQ0KLSNkZWZpbmUgV1JQMV9NYXNrICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwRkYwMCkNCi0jZGVmaW5lIFdSUDJfTWFzayAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBGRjAwMDApDQotI2RlZmluZSBXUlAzX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGMDAwMDAwKQ0KLSNkZWZpbmUgT0JfVVNFUl9CRkIyICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KQ0KLQ0KLS8qIEZMQVNIIEtleXMgKi8NCi0jZGVmaW5lIFJEUF9LZXkgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDBBNSkNCi0jZGVmaW5lIEZMQVNIX0tFWTEgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4NDU2NzAxMjMpDQotI2RlZmluZSBGTEFTSF9LRVkyICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweENERUY4OUFCKQ0KLQ0KLS8qIEZMQVNIIEJBTksgYWRkcmVzcyAqLw0KLSNkZWZpbmUgRkxBU0hfQkFOSzFfRU5EX0FERFJFU1MgICAoKHVpbnQzMl90KTB4ODA3RkZGRikNCi0NCi0vKiBEZWxheSBkZWZpbml0aW9uICovICAgDQotI2RlZmluZSBFcmFzZVRpbWVvdXQgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEIwMDAwKQ0KLSNkZWZpbmUgUHJvZ3JhbVRpbWVvdXQgICAgICAgICgodWludDMyX3QpMHgwMDAwMjAwMCkNCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0gIA0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLUBjb2RlICANCi0gDQotIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlIEZsYXNoIG1lbW9yeSBvZiBhbGwgU1RNMzJGMTB4IGRldmljZXMsDQotIGluY2x1ZGluZyB0aGUgbGF0ZXN0IFNUTTMyRjEweF9YTCBkZW5zaXR5IGRldmljZXMuIA0KLQ0KLSBTVE0zMkYxMHhfWEwgZGV2aWNlcyBmZWF0dXJlIHVwIHRvIDEgTWJ5dGUgd2l0aCBkdWFsIGJhbmsgYXJjaGl0ZWN0dXJlIGZvciByZWFkLXdoaWxlLXdyaXRlIChSV1cpIGNhcGFiaWxpdHk6DQotICAgIC0gYmFuazE6IGZpeGVkIHNpemUgb2YgNTEyIEtieXRlcyAoMjU2IHBhZ2VzIG9mIDJLYnl0ZXMgZWFjaCkNCi0gICAgLSBiYW5rMjogdXAgdG8gNTEyIEtieXRlcyAodXAgdG8gMjU2IHBhZ2VzIG9mIDJLYnl0ZXMgZWFjaCkNCi0gV2hpbGUgb3RoZXIgU1RNMzJGMTB4IGRldmljZXMgZmVhdHVyZXMgb25seSBvbmUgYmFuayB3aXRoIG1lbW9yeSB1cCB0byA1MTIgS2J5dGVzLg0KLQ0KLSBJbiB2ZXJzaW9uIFYzLjMuMCwgc29tZSBmdW5jdGlvbnMgd2VyZSB1cGRhdGVkIGFuZCBuZXcgb25lcyB3ZXJlIGFkZGVkIHRvIHN1cHBvcnQNCi0gU1RNMzJGMTB4X1hMIGRldmljZXMuIFRodXMgc29tZSBmdW5jdGlvbnMgbWFuYWdlcyBhbGwgZGV2aWNlcywgd2hpbGUgb3RoZXIgYXJlIA0KLSBkZWRpY2F0ZWQgZm9yIFhMIGRldmljZXMgb25seS4NCi0gDQotIFRoZSB0YWJsZSBiZWxvdyBwcmVzZW50cyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgdXNlZCBTVE0zMkYxMHggZGV2aWNlcy4gIA0KLSAgICAgIA0KLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICogTGVnYWN5IGZ1bmN0aW9ucyB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMgKg0KLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLSAgIHwgICAgICAgRnVuY3Rpb25zIHByb3RvdHlwZXMgICAgICAgICB8U1RNMzJGMTB4X1hMfE90aGVyIFNUTTMyRjEweHwgICAgQ29tbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgZGV2aWNlcyAgfCAgZGV2aWNlcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9TZXRMYXRlbmN5ICAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9IYWxmQ3ljbGVBY2Nlc3NDbWQgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9QcmVmZXRjaEJ1ZmZlckNtZCAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9VbmxvY2sgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTBYX1hMIGRldmljZXM6IHVubG9jayBCYW5rMSBhbmQgQmFuazIuICAgICAgICAgICAgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogdW5sb2NrIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50ICAgICAgICAgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICB0byBGTEFTSF9VbmxvY2tCYW5rMSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9Mb2NrICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTBYX1hMIGRldmljZXM6IGxvY2sgQmFuazEgYW5kIEJhbmsyLiAgICAgICAgICAgICAgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogbG9jayBCYW5rMSBhbmQgaXQgaXMgZXF1aXZhbGVudCAgICAgICAgICAgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICB0byBGTEFTSF9Mb2NrQmFuazEgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9FcmFzZVBhZ2UgICAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTB4X1hMIGRldmljZXM6IGVyYXNlIGEgcGFnZSBpbiBCYW5rMSBhbmQgQmFuazIgICAgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogZXJhc2UgYSBwYWdlIGluIEJhbmsxICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9FcmFzZUFsbFBhZ2VzICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTB4X1hMIGRldmljZXM6IGVyYXNlIGFsbCBwYWdlcyBpbiBCYW5rMSBhbmQgQmFuazIgfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogZXJhc2UgYWxsIHBhZ2VzIGluIEJhbmsxICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9FcmFzZU9wdGlvbkJ5dGVzICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9Qcm9ncmFtV29yZCAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgVXBkYXRlZCB0byBwcm9ncmFtIHVwIHRvIDFNQnl0ZSAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGRldmljZSkgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9Qcm9ncmFtSGFsZldvcmQgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgVXBkYXRlZCB0byBwcm9ncmFtIHVwIHRvIDFNQnl0ZSAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGRldmljZSkgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9Qcm9ncmFtT3B0aW9uQnl0ZURhdGEgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9FbmFibGVXcml0ZVByb3RlY3Rpb24gICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9SZWFkT3V0UHJvdGVjdGlvbiAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9Vc2VyT3B0aW9uQnl0ZUNvbmZpZyAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9HZXRVc2VyT3B0aW9uQnl0ZSAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9HZXRXcml0ZVByb3RlY3Rpb25PcHRpb25CeXRlICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9HZXRSZWFkT3V0UHJvdGVjdGlvblN0YXR1cyAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9HZXRQcmVmZXRjaEJ1ZmZlclN0YXR1cyAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgTm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9JVENvbmZpZyAgICAgICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTB4X1hMIGRldmljZXM6IGVuYWJsZSBCYW5rMSBhbmQgQmFuazIncyBpbnRlcnJ1cHRzfA0KLSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgLSBGb3Igb3RoZXIgZGV2aWNlczogZW5hYmxlIEJhbmsxJ3MgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgfA0KLSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLSAgIHxGTEFTSF9HZXRGbGFnU3RhdHVzICAgICAgICAgICAgICAgICB8ICAgIFllcyAgICAgfCAgICAgIFllcyAgICAgIHwgLSBGb3IgU1RNMzJGMTB4X1hMIGRldmljZXM6IHJldHVybiBCYW5rMSBhbmQgQmFuazIncyBmbGFnIHN0YXR1c3wNCi0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC0gRm9yIG90aGVyIGRldmljZXM6IHJldHVybiBCYW5rMSdzIGZsYWcgc3RhdHVzICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8RkxBU0hfQ2xlYXJGbGFnICAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gRm9yIFNUTTMyRjEweF9YTCBkZXZpY2VzOiBjbGVhciBCYW5rMSBhbmQgQmFuazIncyBmbGFnICAgICAgIHwNCi0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IC0gRm9yIG90aGVyIGRldmljZXM6IGNsZWFyIEJhbmsxJ3MgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8RkxBU0hfR2V0U3RhdHVzICAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gUmV0dXJuIHRoZSBzdGF0dXMgb2YgQmFuazEgKGZvciBhbGwgZGV2aWNlcykgICAgICAgICAgICAgICAgIHwNCi0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgZXF1aXZhbGVudCB0byBGTEFTSF9HZXRCYW5rMVN0YXR1cyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8RkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24gICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gV2FpdCBmb3IgQmFuazEgbGFzdCBvcGVyYXRpb24gKGZvciBhbGwgZGV2aWNlcykgICAgICAgICAgICAgIHwNCi0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgZXF1aXZhbGVudCB0bzogRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbiBmdW5jdGlvbiAgICAgIHwNCi0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0NCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICAqIE5ldyBmdW5jdGlvbnMgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzIHRvIG1hbmFnZSBCYW5rMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gICAqICAgLSBUaGVzZSBmdW5jdGlvbnMgYXJlIG1haW5seSB1c2VmdWwgZm9yIFNUTTMyRjEweF9YTCBkZW5zaXR5IGRldmljZXMsIHRvIGhhdmUgc2VwYXJhdGUgY29udHJvbCBmb3IgQmFuazEgYW5kIGJhbmsyICoNCi0gICAqICAgLSBGb3Igb3RoZXIgZGV2aWNlcywgdGhlc2UgZnVuY3Rpb25zIGFyZSBvcHRpb25hbCAoY292ZXJlZCBieSBmdW5jdGlvbnMgbGlzdGVkIGFib3ZlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gICB8ICAgICAgIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgfFNUTTMyRjEweF9YTHxPdGhlciBTVE0zMkYxMHh8ICAgIENvbW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGRldmljZXMgIHwgIGRldmljZXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX1VubG9ja0JhbmsxICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gVW5sb2NrIEJhbmsxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8RkxBU0hfTG9ja0JhbmsxICAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gTG9jayBCYW5rMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX0VyYXNlQWxsQmFuazFQYWdlcyAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gRXJhc2UgYWxsIHBhZ2VzIGluIEJhbmsxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX0dldEJhbmsxU3RhdHVzICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gUmV0dXJuIHRoZSBzdGF0dXMgb2YgQmFuazEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX1dhaXRGb3JMYXN0QmFuazFPcGVyYXRpb24gICAgfCAgICBZZXMgICAgIHwgICAgICBZZXMgICAgICB8IC0gV2FpdCBmb3IgQmFuazEgbGFzdCBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0NCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICogTmV3IEZ1bmN0aW9ucyB1c2VkIG9ubHkgd2l0aCBTVE0zMkYxMHhfWEwgZGVuc2l0eSBkZXZpY2VzIHRvIG1hbmFnZSBCYW5rMiAqDQotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gICB8ICAgICAgIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgfFNUTTMyRjEweF9YTHxPdGhlciBTVE0zMkYxMHh8ICAgIENvbW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGRldmljZXMgIHwgIGRldmljZXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX1VubG9ja0JhbmsyICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gVW5sb2NrIEJhbmsyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8RkxBU0hfTG9ja0JhbmsyICAgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gTG9jayBCYW5rMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX0VyYXNlQWxsQmFuazJQYWdlcyAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gRXJhc2UgYWxsIHBhZ2VzIGluIEJhbmsyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX0dldEJhbmsyU3RhdHVzICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gUmV0dXJuIHRoZSBzdGF0dXMgb2YgQmFuazIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24gICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gV2FpdCBmb3IgQmFuazIgbGFzdCBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gICB8IEZMQVNIX0Jvb3RDb25maWcgICAgICAgICAgICAgICAgICAgfCAgICBZZXMgICAgIHwgICAgICBObyAgICAgICB8IC0gQ29uZmlndXJlIHRvIGJvb3QgZnJvbSBCYW5rMSBvciBCYW5rMiAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi1AZW5kY29kZQ0KLSovDQotDQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgY29kZSBsYXRlbmN5IHZhbHVlLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogQHBhcmFtICBGTEFTSF9MYXRlbmN5OiBzcGVjaWZpZXMgdGhlIEZMQVNIIExhdGVuY3kgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRkxBU0hfTGF0ZW5jeV8wOiBGTEFTSCBaZXJvIExhdGVuY3kgY3ljbGUNCi0gICogICAgIEBhcmcgRkxBU0hfTGF0ZW5jeV8xOiBGTEFTSCBPbmUgTGF0ZW5jeSBjeWNsZQ0KLSAgKiAgICAgQGFyZyBGTEFTSF9MYXRlbmN5XzI6IEZMQVNIIFR3byBMYXRlbmN5IGN5Y2xlcw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGTEFTSF9TZXRMYXRlbmN5KHVpbnQzMl90IEZMQVNIX0xhdGVuY3kpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9MQVRFTkNZKEZMQVNIX0xhdGVuY3kpKTsNCi0gIA0KLSAgLyogUmVhZCB0aGUgQUNSIHJlZ2lzdGVyICovDQotICB0bXByZWcgPSBGTEFTSC0+QUNSOyAgDQotICANCi0gIC8qIFNldHMgdGhlIExhdGVuY3kgdmFsdWUgKi8NCi0gIHRtcHJlZyAmPSBBQ1JfTEFURU5DWV9NYXNrOw0KLSAgdG1wcmVnIHw9IEZMQVNIX0xhdGVuY3k7DQotICANCi0gIC8qIFdyaXRlIHRoZSBBQ1IgcmVnaXN0ZXIgKi8NCi0gIEZMQVNILT5BQ1IgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEhhbGYgY3ljbGUgZmxhc2ggYWNjZXNzLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogQHBhcmFtICBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3M6IHNwZWNpZmllcyB0aGUgRkxBU0ggSGFsZiBjeWNsZSBBY2Nlc3MgbW9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3NfRW5hYmxlOiBGTEFTSCBIYWxmIEN5Y2xlIEVuYWJsZQ0KLSAgKiAgICAgQGFyZyBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3NfRGlzYWJsZTogRkxBU0ggSGFsZiBDeWNsZSBEaXNhYmxlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZMQVNIX0hhbGZDeWNsZUFjY2Vzc0NtZCh1aW50MzJfdCBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3MpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9IQUxGQ1lDTEVBQ0NFU1NfU1RBVEUoRkxBU0hfSGFsZkN5Y2xlQWNjZXNzKSk7DQotICANCi0gIC8qIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBIYWxmIGN5Y2xlIGFjY2VzcyAqLw0KLSAgRkxBU0gtPkFDUiAmPSBBQ1JfSExGQ1lBX01hc2s7DQotICBGTEFTSC0+QUNSIHw9IEZMQVNIX0hhbGZDeWNsZUFjY2VzczsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUHJlZmV0Y2ggQnVmZmVyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogQHBhcmFtICBGTEFTSF9QcmVmZXRjaEJ1ZmZlcjogc3BlY2lmaWVzIHRoZSBQcmVmZXRjaCBidWZmZXIgc3RhdHVzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZMQVNIX1ByZWZldGNoQnVmZmVyX0VuYWJsZTogRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIEVuYWJsZQ0KLSAgKiAgICAgQGFyZyBGTEFTSF9QcmVmZXRjaEJ1ZmZlcl9EaXNhYmxlOiBGTEFTSCBQcmVmZXRjaCBCdWZmZXIgRGlzYWJsZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGTEFTSF9QcmVmZXRjaEJ1ZmZlckNtZCh1aW50MzJfdCBGTEFTSF9QcmVmZXRjaEJ1ZmZlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BSRUZFVENIQlVGRkVSX1NUQVRFKEZMQVNIX1ByZWZldGNoQnVmZmVyKSk7DQotICANCi0gIC8qIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBQcmVmZXRjaCBCdWZmZXIgKi8NCi0gIEZMQVNILT5BQ1IgJj0gQUNSX1BSRlRCRV9NYXNrOw0KLSAgRkxBU0gtPkFDUiB8PSBGTEFTSF9QcmVmZXRjaEJ1ZmZlcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgVW5sb2NrcyB0aGUgRkxBU0ggUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcyB0aGlzIGZ1bmN0aW9uIHVubG9ja3MgQmFuazEgYW5kIEJhbmsyLg0KLSAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IHVubG9ja3MgQmFuazEgYW5kIGl0IGlzIGVxdWl2YWxlbnQgDQotICAqICAgICAgICAgICB0byBGTEFTSF9VbmxvY2tCYW5rMSBmdW5jdGlvbi4uIA0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRkxBU0hfVW5sb2NrKHZvaWQpDQotew0KLSAgLyogQXV0aG9yaXplIHRoZSBGUEVDIG9mIEJhbmsxIEFjY2VzcyAqLw0KLSAgRkxBU0gtPktFWVIgPSBGTEFTSF9LRVkxOw0KLSAgRkxBU0gtPktFWVIgPSBGTEFTSF9LRVkyOw0KLQ0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0gIC8qIEF1dGhvcml6ZSB0aGUgRlBFQyBvZiBCYW5rMiBBY2Nlc3MgKi8NCi0gIEZMQVNILT5LRVlSMiA9IEZMQVNIX0tFWTE7DQotICBGTEFTSC0+S0VZUjIgPSBGTEFTSF9LRVkyOw0KLSNlbmRpZiAvKiBTVE0zMkYxMFhfWEwgKi8NCi19DQotLyoqDQotICAqIEBicmllZiAgVW5sb2NrcyB0aGUgRkxBU0ggQmFuazEgUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcyB0aGlzIGZ1bmN0aW9uIHVubG9ja3MgQmFuazEuDQotICAqICAgICAgICAgLSBGb3IgYWxsIG90aGVyIGRldmljZXMgaXQgdW5sb2NrcyBCYW5rMSBhbmQgaXQgaXMgDQotICAqICAgICAgICAgICBlcXVpdmFsZW50IHRvIEZMQVNIX1VubG9jayBmdW5jdGlvbi4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZMQVNIX1VubG9ja0JhbmsxKHZvaWQpDQotew0KLSAgLyogQXV0aG9yaXplIHRoZSBGUEVDIG9mIEJhbmsxIEFjY2VzcyAqLw0KLSAgRkxBU0gtPktFWVIgPSBGTEFTSF9LRVkxOw0KLSAgRkxBU0gtPktFWVIgPSBGTEFTSF9LRVkyOw0KLX0NCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotLyoqDQotICAqIEBicmllZiAgVW5sb2NrcyB0aGUgRkxBU0ggQmFuazIgUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb25seSBmb3IgU1RNMzJGMTBYX1hMIGRlbnNpdHkgZGV2aWNlcy4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZMQVNIX1VubG9ja0JhbmsyKHZvaWQpDQotew0KLSAgLyogQXV0aG9yaXplIHRoZSBGUEVDIG9mIEJhbmsyIEFjY2VzcyAqLw0KLSAgRkxBU0gtPktFWVIyID0gRkxBU0hfS0VZMTsNCi0gIEZMQVNILT5LRVlSMiA9IEZMQVNIX0tFWTI7DQotDQotfQ0KLSNlbmRpZiAvKiBTVE0zMkYxMFhfWEwgKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBMb2NrcyB0aGUgRkxBU0ggUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcyB0aGlzIGZ1bmN0aW9uIExvY2tzIEJhbmsxIGFuZCBCYW5rMi4NCi0gICogICAgICAgICAtIEZvciBhbGwgb3RoZXIgZGV2aWNlcyBpdCBMb2NrcyBCYW5rMSBhbmQgaXQgaXMgZXF1aXZhbGVudCANCi0gICogICAgICAgICAgIHRvIEZMQVNIX0xvY2tCYW5rMSBmdW5jdGlvbi4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZMQVNIX0xvY2sodm9pZCkNCi17DQotICAvKiBTZXQgdGhlIExvY2sgQml0IHRvIGxvY2sgdGhlIEZQRUMgYW5kIHRoZSBDUiBvZiAgQmFuazEgKi8NCi0gIEZMQVNILT5DUiB8PSBDUl9MT0NLX1NldDsNCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotICAvKiBTZXQgdGhlIExvY2sgQml0IHRvIGxvY2sgdGhlIEZQRUMgYW5kIHRoZSBDUiBvZiAgQmFuazIgKi8NCi0gIEZMQVNILT5DUjIgfD0gQ1JfTE9DS19TZXQ7DQotI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBMb2NrcyB0aGUgRkxBU0ggQmFuazEgUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KLSAgKiBAbm90ZSAgIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcyB0aGlzIGZ1bmN0aW9uIExvY2tzIEJhbmsxLg0KLSAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IExvY2tzIEJhbmsxIGFuZCBpdCBpcyBlcXVpdmFsZW50IA0KLSAgKiAgICAgICAgICAgdG8gRkxBU0hfTG9jayBmdW5jdGlvbi4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZMQVNIX0xvY2tCYW5rMSh2b2lkKQ0KLXsNCi0gIC8qIFNldCB0aGUgTG9jayBCaXQgdG8gbG9jayB0aGUgRlBFQyBhbmQgdGhlIENSIG9mICBCYW5rMSAqLw0KLSAgRkxBU0gtPkNSIHw9IENSX0xPQ0tfU2V0Ow0KLX0NCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotLyoqDQotICAqIEBicmllZiAgTG9ja3MgdGhlIEZMQVNIIEJhbmsyIFByb2dyYW0gRXJhc2UgQ29udHJvbGxlci4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyRjEwWF9YTCBkZW5zaXR5IGRldmljZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGTEFTSF9Mb2NrQmFuazIodm9pZCkNCi17DQotICAvKiBTZXQgdGhlIExvY2sgQml0IHRvIGxvY2sgdGhlIEZQRUMgYW5kIHRoZSBDUiBvZiAgQmFuazIgKi8NCi0gIEZMQVNILT5DUjIgfD0gQ1JfTE9DS19TZXQ7DQotfQ0KLSNlbmRpZiAvKiBTVE0zMkYxMFhfWEwgKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBFcmFzZXMgYSBzcGVjaWZpZWQgRkxBU0ggcGFnZS4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqIEBwYXJhbSAgUGFnZV9BZGRyZXNzOiBUaGUgcGFnZSBhZGRyZXNzIHRvIGJlIGVyYXNlZC4NCi0gICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0JVU1ksIEZMQVNIX0VSUk9SX1BHLA0KLSAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCi0gICovDQotRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlUGFnZSh1aW50MzJfdCBQYWdlX0FkZHJlc3MpDQotew0KLSAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9BRERSRVNTKFBhZ2VfQWRkcmVzcykpOw0KLQ0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0gIGlmKFBhZ2VfQWRkcmVzcyA8IEZMQVNIX0JBTksxX0VORF9BRERSRVNTKSAgDQotICB7DQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgeyANCi0gICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLw0KLSAgICAgIEZMQVNILT5DUnw9IENSX1BFUl9TZXQ7DQotICAgICAgRkxBU0gtPkFSID0gUGFnZV9BZGRyZXNzOyANCi0gICAgICBGTEFTSC0+Q1J8PSBDUl9TVFJUX1NldDsNCi0gICAgDQotICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KLQ0KLSAgICAgIC8qIERpc2FibGUgdGhlIFBFUiBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEVSX1Jlc2V0Ow0KLSAgICB9DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgeyANCi0gICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLw0KLSAgICAgIEZMQVNILT5DUjJ8PSBDUl9QRVJfU2V0Ow0KLSAgICAgIEZMQVNILT5BUjIgPSBQYWdlX0FkZHJlc3M7IA0KLSAgICAgIEZMQVNILT5DUjJ8PSBDUl9TVFJUX1NldDsNCi0gICAgDQotICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KLSAgICAgIA0KLSAgICAgIC8qIERpc2FibGUgdGhlIFBFUiBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IyICY9IENSX1BFUl9SZXNldDsNCi0gICAgfQ0KLSAgfQ0KLSNlbHNlDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICANCi0gIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gIHsgDQotICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIHRoZSBwYWdlICovDQotICAgIEZMQVNILT5DUnw9IENSX1BFUl9TZXQ7DQotICAgIEZMQVNILT5BUiA9IFBhZ2VfQWRkcmVzczsgDQotICAgIEZMQVNILT5DUnw9IENSX1NUUlRfU2V0Ow0KLSAgICANCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICAgIA0KLSAgICAvKiBEaXNhYmxlIHRoZSBQRVIgQml0ICovDQotICAgIEZMQVNILT5DUiAmPSBDUl9QRVJfUmVzZXQ7DQotICB9DQotI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLQ0KLSAgLyogUmV0dXJuIHRoZSBFcmFzZSBTdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVyYXNlcyBhbGwgRkxBU0ggcGFnZXMuDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KLSAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCi0gICovDQotRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlQWxsUGFnZXModm9pZCkNCi17DQotICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQotDQotI2lmZGVmIFNUTTMyRjEwWF9YTA0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICANCi0gIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gIHsNCi0gICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gZXJhc2UgYWxsIHBhZ2VzICovDQotICAgICBGTEFTSC0+Q1IgfD0gQ1JfTUVSX1NldDsNCi0gICAgIEZMQVNILT5DUiB8PSBDUl9TVFJUX1NldDsNCi0gICAgDQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICAgIA0KLSAgICAvKiBEaXNhYmxlIHRoZSBNRVIgQml0ICovDQotICAgIEZMQVNILT5DUiAmPSBDUl9NRVJfUmVzZXQ7DQotICB9ICAgIA0KLSAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgew0KLSAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSBhbGwgcGFnZXMgKi8NCi0gICAgIEZMQVNILT5DUjIgfD0gQ1JfTUVSX1NldDsNCi0gICAgIEZMQVNILT5DUjIgfD0gQ1JfU1RSVF9TZXQ7DQotICAgIA0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KLSAgICANCi0gICAgLyogRGlzYWJsZSB0aGUgTUVSIEJpdCAqLw0KLSAgICBGTEFTSC0+Q1IyICY9IENSX01FUl9SZXNldDsNCi0gIH0NCi0jZWxzZQ0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KLSAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgew0KLSAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSBhbGwgcGFnZXMgKi8NCi0gICAgIEZMQVNILT5DUiB8PSBDUl9NRVJfU2V0Ow0KLSAgICAgRkxBU0gtPkNSIHw9IENSX1NUUlRfU2V0Ow0KLSAgICANCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotDQotICAgIC8qIERpc2FibGUgdGhlIE1FUiBCaXQgKi8NCi0gICAgRkxBU0gtPkNSICY9IENSX01FUl9SZXNldDsNCi0gIH0NCi0jZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQotDQotICAvKiBSZXR1cm4gdGhlIEVyYXNlIFN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRXJhc2VzIGFsbCBCYW5rMSBGTEFTSCBwYWdlcy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqICAgICAgICAgLSBGb3IgU1RNMzJGMTBYX1hMIGRldmljZXMgdGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIEJhbmsxIHBhZ2VzLg0KLSAgKiAgICAgICAgIC0gRm9yIGFsbCBvdGhlciBkZXZpY2VzIGl0IGVyYXNlcyBhbGwgQmFuazEgcGFnZXMgYW5kIGl0IGlzIGVxdWl2YWxlbnQgDQotICAqICAgICAgICAgICB0byBGTEFTSF9FcmFzZUFsbFBhZ2VzIGZ1bmN0aW9uLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KLSAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCi0gICovDQotRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlQWxsQmFuazFQYWdlcyh2b2lkKQ0KLXsNCi0gIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KLSAgDQotICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICB7DQotICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIGFsbCBwYWdlcyAqLw0KLSAgICAgRkxBU0gtPkNSIHw9IENSX01FUl9TZXQ7DQotICAgICBGTEFTSC0+Q1IgfD0gQ1JfU1RSVF9TZXQ7DQotICAgIA0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KLSAgICANCi0gICAgLyogRGlzYWJsZSB0aGUgTUVSIEJpdCAqLw0KLSAgICBGTEFTSC0+Q1IgJj0gQ1JfTUVSX1Jlc2V0Ow0KLSAgfSAgICANCi0gIC8qIFJldHVybiB0aGUgRXJhc2UgU3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotLyoqDQotICAqIEBicmllZiAgRXJhc2VzIGFsbCBCYW5rMiBGTEFTSCBwYWdlcy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgZm9yIFNUTTMyRjEweF9YTCBkZW5zaXR5IGRldmljZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfRXJhc2VBbGxCYW5rMlBhZ2VzKHZvaWQpDQotew0KLSAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICANCi0gIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gIHsNCi0gICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gZXJhc2UgYWxsIHBhZ2VzICovDQotICAgICBGTEFTSC0+Q1IyIHw9IENSX01FUl9TZXQ7DQotICAgICBGTEFTSC0+Q1IyIHw9IENSX1NUUlRfU2V0Ow0KLSAgICANCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCi0NCi0gICAgLyogRGlzYWJsZSB0aGUgTUVSIEJpdCAqLw0KLSAgICBGTEFTSC0+Q1IyICY9IENSX01FUl9SZXNldDsNCi0gIH0gICAgDQotICAvKiBSZXR1cm4gdGhlIEVyYXNlIFN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVyYXNlcyB0aGUgRkxBU0ggb3B0aW9uIGJ5dGVzLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb25zIGVyYXNlcyBhbGwgb3B0aW9uIGJ5dGVzIGV4Y2VwdCB0aGUgUmVhZCBwcm90ZWN0aW9uIChSRFApLiANCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfRXJhc2VPcHRpb25CeXRlcyh2b2lkKQ0KLXsNCi0gIHVpbnQxNl90IHJkcHRtcCA9IFJEUF9LZXk7DQotDQotICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQotDQotICAvKiBHZXQgdGhlIGFjdHVhbCByZWFkIHByb3RlY3Rpb24gT3B0aW9uIEJ5dGUgdmFsdWUgKi8gDQotICBpZihGTEFTSF9HZXRSZWFkT3V0UHJvdGVjdGlvblN0YXR1cygpICE9IFJFU0VUKQ0KLSAgew0KLSAgICByZHB0bXAgPSAweDAwOyAgDQotICB9DQotDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICB7DQotICAgIC8qIEF1dGhvcml6ZSB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCi0gICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KLSAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQotICAgIA0KLSAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgb3B0aW9uIGJ5dGVzICovDQotICAgIEZMQVNILT5DUiB8PSBDUl9PUFRFUl9TZXQ7DQotICAgIEZMQVNILT5DUiB8PSBDUl9TVFJUX1NldDsNCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICAgIA0KLSAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICAgIHsNCi0gICAgICAvKiBpZiB0aGUgZXJhc2Ugb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BURVIgQml0ICovDQotICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KLSAgICAgICANCi0gICAgICAvKiBFbmFibGUgdGhlIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBvcGVyYXRpb24gKi8NCi0gICAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0Ow0KLSAgICAgIC8qIFJlc3RvcmUgdGhlIGxhc3QgcmVhZCBwcm90ZWN0aW9uIE9wdGlvbiBCeXRlIHZhbHVlICovDQotICAgICAgT0ItPlJEUCA9ICh1aW50MTZfdClyZHB0bXA7IA0KLSAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gDQotICAgICAgaWYoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQotICAgICAgew0KLSAgICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovDQotICAgICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGlmIChzdGF0dXMgIT0gRkxBU0hfVElNRU9VVCkNCi0gICAgICB7DQotICAgICAgICAvKiBEaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCi0gICAgICAgIEZMQVNILT5DUiAmPSBDUl9PUFRQR19SZXNldDsNCi0gICAgICB9DQotICAgIH0gIA0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBlcmFzZSBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFByb2dyYW1zIGEgd29yZCBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogQHBhcmFtICBBZGRyZXNzOiBzcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4NCi0gICogQHBhcmFtICBEYXRhOiBzcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZC4NCi0gICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KLSAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4gDQotICAqLw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9Qcm9ncmFtV29yZCh1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBEYXRhKQ0KLXsNCi0gIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gIF9fSU8gdWludDMyX3QgdG1wID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQUREUkVTUyhBZGRyZXNzKSk7DQotDQotI2lmZGVmIFNUTTMyRjEwWF9YTA0KLSAgaWYoQWRkcmVzcyA8IEZMQVNIX0JBTksxX0VORF9BRERSRVNTIC0gMikNCi0gIHsgDQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsgDQotICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgew0KLSAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBmaXJzdCANCi0gICAgICAgIGhhbGYgd29yZCAqLw0KLSAgICAgIEZMQVNILT5DUiB8PSBDUl9QR19TZXQ7DQotICANCi0gICAgICAqKF9fSU8gdWludDE2X3QqKUFkZHJlc3MgPSAodWludDE2X3QpRGF0YTsNCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotIA0KLSAgICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgICB7DQotICAgICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgc2Vjb25kIA0KLSAgICAgICAgaGFsZiB3b3JkICovDQotICAgICAgICB0bXAgPSBBZGRyZXNzICsgMjsNCi0NCi0gICAgICAgICooX19JTyB1aW50MTZfdCopIHRtcCA9IERhdGEgPj4gMTY7DQotICAgIA0KLSAgICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotICAgICAgICANCi0gICAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KLSAgICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQotICAgICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQotICAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgZWxzZSBpZihBZGRyZXNzID09IChGTEFTSF9CQU5LMV9FTkRfQUREUkVTUyAtIDEpKQ0KLSAgew0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotDQotICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgew0KLSAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBmaXJzdCANCi0gICAgICAgIGhhbGYgd29yZCAqLw0KLSAgICAgIEZMQVNILT5DUiB8PSBDUl9QR19TZXQ7DQotICANCi0gICAgICAqKF9fSU8gdWludDE2X3QqKUFkZHJlc3MgPSAodWludDE2X3QpRGF0YTsNCi0NCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gICAgICANCi0JICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQotICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KLSAgICB9DQotDQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0NCi0gICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgICB7DQotICAgICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IHNlY29uZCANCi0gICAgICBoYWxmIHdvcmQgKi8NCi0gICAgICBGTEFTSC0+Q1IyIHw9IENSX1BHX1NldDsNCi0gICAgICB0bXAgPSBBZGRyZXNzICsgMjsNCi0NCi0gICAgICAqKF9fSU8gdWludDE2X3QqKSB0bXAgPSBEYXRhID4+IDE2Ow0KLSAgICANCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gICAgICAgIA0KLSAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KLSAgICAgIEZMQVNILT5DUjIgJj0gQ1JfUEdfUmVzZXQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQotICAgICAgRkxBU0gtPkNSMiAmPSBDUl9QR19SZXNldDsNCi0gICAgfQ0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotDQotICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgew0KLSAgICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBmaXJzdCANCi0gICAgICAgIGhhbGYgd29yZCAqLw0KLSAgICAgIEZMQVNILT5DUjIgfD0gQ1JfUEdfU2V0Ow0KLSAgDQotICAgICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gKHVpbnQxNl90KURhdGE7DQotICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RCYW5rMk9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotIA0KLSAgICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgICB7DQotICAgICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgc2Vjb25kIA0KLSAgICAgICAgaGFsZiB3b3JkICovDQotICAgICAgICB0bXAgPSBBZGRyZXNzICsgMjsNCi0NCi0gICAgICAgICooX19JTyB1aW50MTZfdCopIHRtcCA9IERhdGEgPj4gMTY7DQotICAgIA0KLSAgICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQotICAgICAgICBGTEFTSC0+Q1IyICY9IENSX1BHX1Jlc2V0Ow0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQotICAgICAgICBGTEFTSC0+Q1IyICY9IENSX1BHX1Jlc2V0Ow0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSNlbHNlDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gIA0KLSAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgew0KLSAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgZmlyc3QgDQotICAgIGhhbGYgd29yZCAqLw0KLSAgICBGTEFTSC0+Q1IgfD0gQ1JfUEdfU2V0Ow0KLSAgDQotICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9ICh1aW50MTZfdClEYXRhOw0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KLSANCi0gICAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgICB7DQotICAgICAgLyogaWYgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHByb2NlZWQgdG8gcHJvZ3JhbSB0aGUgbmV3IHNlY29uZCANCi0gICAgICBoYWxmIHdvcmQgKi8NCi0gICAgICB0bXAgPSBBZGRyZXNzICsgMjsNCi0NCi0gICAgICAqKF9fSU8gdWludDE2X3QqKSB0bXAgPSBEYXRhID4+IDE2Ow0KLSAgICANCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotICAgICAgICANCi0gICAgICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgUEcgQml0ICovDQotICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KLSAgICB9DQotICB9ICAgICAgICAgDQotI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLSAgIA0KLSAgLyogUmV0dXJuIHRoZSBQcm9ncmFtIFN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUHJvZ3JhbXMgYSBoYWxmIHdvcmQgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqIEBwYXJhbSAgQWRkcmVzczogc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuDQotICAqIEBwYXJhbSAgRGF0YTogc3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuDQotICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywNCi0gICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuIA0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfUHJvZ3JhbUhhbGZXb3JkKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQxNl90IERhdGEpDQotew0KLSAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9BRERSRVNTKEFkZHJlc3MpKTsNCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gIA0KLSAgaWYoQWRkcmVzcyA8IEZMQVNIX0JBTksxX0VORF9BRERSRVNTKQ0KLSAgew0KLSAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICAgIHsNCi0gICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgZGF0YSAqLw0KLSAgICAgIEZMQVNILT5DUiB8PSBDUl9QR19TZXQ7DQotICANCi0gICAgICAqKF9fSU8gdWludDE2X3QqKUFkZHJlc3MgPSBEYXRhOw0KLSAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0QmFuazFPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KLQ0KLSAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KLSAgICAgIEZMQVNILT5DUiAmPSBDUl9QR19SZXNldDsNCi0gICAgfQ0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICAgIHsNCi0gICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgZGF0YSAqLw0KLSAgICAgIEZMQVNILT5DUjIgfD0gQ1JfUEdfU2V0Ow0KLSAgDQotICAgICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gRGF0YTsNCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsyT3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0NCi0gICAgICAvKiBEaXNhYmxlIHRoZSBQRyBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IyICY9IENSX1BHX1Jlc2V0Ow0KLSAgICB9DQotICB9DQotI2Vsc2UNCi0gIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KLSAgDQotICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICB7DQotICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBkYXRhICovDQotICAgIEZMQVNILT5DUiB8PSBDUl9QR19TZXQ7DQotICANCi0gICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gRGF0YTsNCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gICAgDQotICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KLSAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQotICB9IA0KLSNlbmRpZiAgLyogU1RNMzJGMTBYX1hMICovDQotICANCi0gIC8qIFJldHVybiB0aGUgUHJvZ3JhbSBTdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFByb2dyYW1zIGEgaGFsZiB3b3JkIGF0IGEgc3BlY2lmaWVkIE9wdGlvbiBCeXRlIERhdGEgYWRkcmVzcy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqIEBwYXJhbSAgQWRkcmVzczogc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIDB4MUZGRkY4MDQgb3IgMHgxRkZGRjgwNi4gDQotICAqIEBwYXJhbSAgRGF0YTogc3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuDQotICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywNCi0gICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuIA0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfUHJvZ3JhbU9wdGlvbkJ5dGVEYXRhKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ4X3QgRGF0YSkNCi17DQotICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX09CX0RBVEFfQUREUkVTUyhBZGRyZXNzKSk7DQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotDQotICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQotICB7DQotICAgIC8qIEF1dGhvcml6ZSB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCi0gICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KLSAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQotICAgIC8qIEVuYWJsZXMgdGhlIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBvcGVyYXRpb24gKi8NCi0gICAgRkxBU0gtPkNSIHw9IENSX09QVFBHX1NldDsgDQotICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9IERhdGE7DQotICAgIA0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KLSAgICBpZihzdGF0dXMgIT0gRkxBU0hfVElNRU9VVCkNCi0gICAgew0KLSAgICAgIC8qIGlmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFBHIEJpdCAqLw0KLSAgICAgIEZMQVNILT5DUiAmPSBDUl9PUFRQR19SZXNldDsNCi0gICAgfQ0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBPcHRpb24gQnl0ZSBEYXRhIFByb2dyYW0gU3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBXcml0ZSBwcm90ZWN0cyB0aGUgZGVzaXJlZCBwYWdlcw0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogQHBhcmFtICBGTEFTSF9QYWdlczogc3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBwYWdlcyB0byBiZSB3cml0ZSBwcm90ZWN0ZWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KLSAgKiAgICAgQGFyZyBGb3IgQGIgU1RNMzJfTG93LWRlbnNpdHlfZGV2aWNlczogdmFsdWUgYmV0d2VlbiBGTEFTSF9XUlByb3RfUGFnZXMwdG8zIGFuZCBGTEFTSF9XUlByb3RfUGFnZXMyOHRvMzEgIA0KLSAgKiAgICAgQGFyZyBGb3IgQGIgU1RNMzJfTWVkaXVtLWRlbnNpdHlfZGV2aWNlczogdmFsdWUgYmV0d2VlbiBGTEFTSF9XUlByb3RfUGFnZXMwdG8zDQotICAqICAgICAgIGFuZCBGTEFTSF9XUlByb3RfUGFnZXMxMjR0bzEyNw0KLSAgKiAgICAgQGFyZyBGb3IgQGIgU1RNMzJfSGlnaC1kZW5zaXR5X2RldmljZXM6IHZhbHVlIGJldHdlZW4gRkxBU0hfV1JQcm90X1BhZ2VzMHRvMSBhbmQNCi0gICogICAgICAgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYxIG9yIEZMQVNIX1dSUHJvdF9QYWdlczYydG8yNTUNCi0gICogICAgIEBhcmcgRm9yIEBiIFNUTTMyX0Nvbm5lY3Rpdml0eV9saW5lX2RldmljZXM6IHZhbHVlIGJldHdlZW4gRkxBU0hfV1JQcm90X1BhZ2VzMHRvMSBhbmQNCi0gICogICAgICAgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYxIG9yIEZMQVNIX1dSUHJvdF9QYWdlczYydG8xMjcgICAgDQotICAqICAgICBAYXJnIEZvciBAYiBTVE0zMl9YTC1kZW5zaXR5X2RldmljZXM6IHZhbHVlIGJldHdlZW4gRkxBU0hfV1JQcm90X1BhZ2VzMHRvMSBhbmQNCi0gICogICAgICAgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYxIG9yIEZMQVNIX1dSUHJvdF9QYWdlczYydG81MTENCi0gICogICAgIEBhcmcgRkxBU0hfV1JQcm90X0FsbFBhZ2VzDQotICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywNCi0gICogICBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuDQotICAqLw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9FbmFibGVXcml0ZVByb3RlY3Rpb24odWludDMyX3QgRkxBU0hfUGFnZXMpDQotew0KLSAgdWludDE2X3QgV1JQMF9EYXRhID0gMHhGRkZGLCBXUlAxX0RhdGEgPSAweEZGRkYsIFdSUDJfRGF0YSA9IDB4RkZGRiwgV1JQM19EYXRhID0gMHhGRkZGOw0KLSAgDQotICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfV1JQUk9UX1BBR0UoRkxBU0hfUGFnZXMpKTsNCi0gIA0KLSAgRkxBU0hfUGFnZXMgPSAodWludDMyX3QpKH5GTEFTSF9QYWdlcyk7DQotICBXUlAwX0RhdGEgPSAodWludDE2X3QpKEZMQVNIX1BhZ2VzICYgV1JQMF9NYXNrKTsNCi0gIFdSUDFfRGF0YSA9ICh1aW50MTZfdCkoKEZMQVNIX1BhZ2VzICYgV1JQMV9NYXNrKSA+PiA4KTsNCi0gIFdSUDJfRGF0YSA9ICh1aW50MTZfdCkoKEZMQVNIX1BhZ2VzICYgV1JQMl9NYXNrKSA+PiAxNik7DQotICBXUlAzX0RhdGEgPSAodWludDE2X3QpKChGTEFTSF9QYWdlcyAmIFdSUDNfTWFzaykgPj4gMjQpOw0KLSAgDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gIA0KLSAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgew0KLSAgICAvKiBBdXRob3JpemVzIHRoZSBzbWFsbCBpbmZvcm1hdGlvbiBibG9jayBwcm9ncmFtbWluZyAqLw0KLSAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTE7DQotICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMjsNCi0gICAgRkxBU0gtPkNSIHw9IENSX09QVFBHX1NldDsNCi0gICAgaWYoV1JQMF9EYXRhICE9IDB4RkYpDQotICAgIHsNCi0gICAgICBPQi0+V1JQMCA9IFdSUDBfRGF0YTsNCi0gICAgICANCi0gICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotICAgIH0NCi0gICAgaWYoKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkgJiYgKFdSUDFfRGF0YSAhPSAweEZGKSkNCi0gICAgew0KLSAgICAgIE9CLT5XUlAxID0gV1JQMV9EYXRhOw0KLSAgICAgIA0KLSAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gICAgfQ0KLSAgICBpZigoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKSAmJiAoV1JQMl9EYXRhICE9IDB4RkYpKQ0KLSAgICB7DQotICAgICAgT0ItPldSUDIgPSBXUlAyX0RhdGE7DQotICAgICAgDQotICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KLSAgICB9DQotICAgIA0KLSAgICBpZigoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKSYmIChXUlAzX0RhdGEgIT0gMHhGRikpDQotICAgIHsNCi0gICAgICBPQi0+V1JQMyA9IFdSUDNfRGF0YTsNCi0gICAgIA0KLSAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gICAgfQ0KLSAgICAgICAgICANCi0gICAgaWYoc3RhdHVzICE9IEZMQVNIX1RJTUVPVVQpDQotICAgIHsNCi0gICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQotICAgIH0NCi0gIH0gDQotICAvKiBSZXR1cm4gdGhlIHdyaXRlIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsgICAgICAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHJlYWQgb3V0IHByb3RlY3Rpb24uDQotICAqIEBub3RlICAgSWYgdGhlIHVzZXIgaGFzIGFscmVhZHkgcHJvZ3JhbW1lZCB0aGUgb3RoZXIgb3B0aW9uIGJ5dGVzIGJlZm9yZSBjYWxsaW5nIA0KLSAgKiAgIHRoaXMgZnVuY3Rpb24sIGhlIG11c3QgcmUtcHJvZ3JhbSB0aGVtIHNpbmNlIHRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCBvcHRpb24gYnl0ZXMuDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KLSAgKiBAcGFyYW0gIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFJlYWRPdXQgUHJvdGVjdGlvbi4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfUmVhZE91dFByb3RlY3Rpb24oRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCi0gIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gIHsNCi0gICAgLyogQXV0aG9yaXplcyB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCi0gICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KLSAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQotICAgIEZMQVNILT5DUiB8PSBDUl9PUFRFUl9TZXQ7DQotICAgIEZMQVNILT5DUiB8PSBDUl9TVFJUX1NldDsNCi0gICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQotICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gICAgew0KLSAgICAgIC8qIGlmIHRoZSBlcmFzZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRFUiBCaXQgKi8NCi0gICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BURVJfUmVzZXQ7DQotICAgICAgLyogRW5hYmxlIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovDQotICAgICAgRkxBU0gtPkNSIHw9IENSX09QVFBHX1NldDsgDQotICAgICAgaWYoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gICAgICB7DQotICAgICAgICBPQi0+UkRQID0gMHgwMDsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIE9CLT5SRFAgPSBSRFBfS2V5OyAgDQotICAgICAgfQ0KLSAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7IA0KLSAgICANCi0gICAgICBpZihzdGF0dXMgIT0gRkxBU0hfVElNRU9VVCkNCi0gICAgICB7DQotICAgICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCi0gICAgICAgIEZMQVNILT5DUiAmPSBDUl9PUFRQR19SZXNldDsNCi0gICAgICB9DQotICAgIH0NCi0gICAgZWxzZSANCi0gICAgew0KLSAgICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9USU1FT1VUKQ0KLSAgICAgIHsNCi0gICAgICAgIC8qIERpc2FibGUgdGhlIE9QVEVSIEJpdCAqLw0KLSAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBwcm90ZWN0aW9uIG9wZXJhdGlvbiBTdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7ICAgICAgIA0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBQcm9ncmFtcyB0aGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZTogSVdER19TVyAvIFJTVF9TVE9QIC8gUlNUX1NUREJZLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogQHBhcmFtICBPQl9JV0RHOiBTZWxlY3RzIHRoZSBJV0RHIG1vZGUNCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBPQl9JV0RHX1NXOiBTb2Z0d2FyZSBJV0RHIHNlbGVjdGVkDQotICAqICAgICBAYXJnIE9CX0lXREdfSFc6IEhhcmR3YXJlIElXREcgc2VsZWN0ZWQNCi0gICogQHBhcmFtICBPQl9TVE9QOiBSZXNldCBldmVudCB3aGVuIGVudGVyaW5nIFNUT1AgbW9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBPQl9TVE9QX05vUlNUOiBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QDQotICAqICAgICBAYXJnIE9CX1NUT1BfUlNUOiBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QDQotICAqIEBwYXJhbSAgT0JfU1REQlk6IFJlc2V0IGV2ZW50IHdoZW4gZW50ZXJpbmcgU3RhbmRieSBtb2RlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIE9CX1NUREJZX05vUlNUOiBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZDQotICAqICAgICBAYXJnIE9CX1NUREJZX1JTVDogUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgaW4gU1RBTkRCWQ0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsIA0KLSAgKiBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIEZMQVNIX1RJTUVPVVQuDQotICAqLw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9Vc2VyT3B0aW9uQnl0ZUNvbmZpZyh1aW50MTZfdCBPQl9JV0RHLCB1aW50MTZfdCBPQl9TVE9QLCB1aW50MTZfdCBPQl9TVERCWSkNCi17DQotICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7IA0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19PQl9JV0RHX1NPVVJDRShPQl9JV0RHKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfT0JfU1RPUF9TT1VSQ0UoT0JfU1RPUCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX09CX1NUREJZX1NPVVJDRShPQl9TVERCWSkpOw0KLQ0KLSAgLyogQXV0aG9yaXplIHRoZSBzbWFsbCBpbmZvcm1hdGlvbiBibG9jayBwcm9ncmFtbWluZyAqLw0KLSAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KLSAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkyOw0KLSAgDQotICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCi0gIA0KLSAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KLSAgeyAgDQotICAgIC8qIEVuYWJsZSB0aGUgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIG9wZXJhdGlvbiAqLw0KLSAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0OyANCi0gICAgICAgICAgIA0KLSAgICBPQi0+VVNFUiA9IE9CX0lXREcgfCAodWludDE2X3QpKE9CX1NUT1AgfCAodWludDE2X3QpKE9CX1NUREJZIHwgKCh1aW50MTZfdCkweEY4KSkpOyANCi0gIA0KLSAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCi0gICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KLSAgICBpZihzdGF0dXMgIT0gRkxBU0hfVElNRU9VVCkNCi0gICAgew0KLSAgICAgIC8qIGlmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFBHIEJpdCAqLw0KLSAgICAgIEZMQVNILT5DUiAmPSBDUl9PUFRQR19SZXNldDsNCi0gICAgfQ0KLSAgfSAgICANCi0gIC8qIFJldHVybiB0aGUgT3B0aW9uIEJ5dGUgcHJvZ3JhbSBTdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRvIGJvb3QgZnJvbSBCYW5rMSBvciBCYW5rMi4gIA0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb25seSBmb3IgU1RNMzJGMTB4X1hMIGRlbnNpdHkgZGV2aWNlcy4NCi0gICogQHBhcmFtICBGTEFTSF9CT09UOiBzZWxlY3QgdGhlIEZMQVNIIEJhbmsgdG8gYm9vdCBmcm9tLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZMQVNIX0JPT1RfQmFuazE6IEF0IHN0YXJ0dXAsIGlmIGJvb3QgcGlucyBhcmUgc2V0IGluIGJvb3QgZnJvbSB1c2VyIEZsYXNoDQotICAqICAgICAgICBwb3NpdGlvbiBhbmQgdGhpcyBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQgdGhlIGRldmljZSB3aWxsIGJvb3QgZnJvbSBCYW5rMShEZWZhdWx0KS4NCi0gICogICAgIEBhcmcgRkxBU0hfQk9PVF9CYW5rMjogQXQgc3RhcnR1cCwgaWYgYm9vdCBwaW5zIGFyZSBzZXQgaW4gYm9vdCBmcm9tIHVzZXIgRmxhc2gNCi0gICogICAgICAgIHBvc2l0aW9uIGFuZCB0aGlzIHBhcmFtZXRlciBpcyBzZWxlY3RlZCB0aGUgZGV2aWNlIHdpbGwgYm9vdCBmcm9tIEJhbmsyIG9yIEJhbmsxLA0KLSAgKiAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBhY3RpdmF0aW9uIG9mIHRoZSBiYW5rLiBUaGUgYWN0aXZlIGJhbmtzIGFyZSBjaGVja2VkIGluDQotICAqICAgICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOiBCYW5rMiwgZm9sbG93ZWQgYnkgQmFuazEuDQotICAqICAgICAgICBUaGUgYWN0aXZlIGJhbmsgaXMgcmVjb2duaXplZCBieSB0aGUgdmFsdWUgcHJvZ3JhbW1lZCBhdCB0aGUgYmFzZSBhZGRyZXNzDQotICAqICAgICAgICBvZiB0aGUgcmVzcGVjdGl2ZSBiYW5rIChjb3JyZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgdmFsdWUNCi0gICogICAgICAgIGluIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlKS4NCi0gICogICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gQU4yNjA2IGZyb20gd3d3LnN0LmNvbS4gICAgDQotICAqIEByZXR2YWwgRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9FUlJPUl9QRywgDQotICAqIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCi0gICovDQotRkxBU0hfU3RhdHVzIEZMQVNIX0Jvb3RDb25maWcodWludDE2X3QgRkxBU0hfQk9PVCkNCi17IA0KLSAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOyANCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9CT09UKEZMQVNIX0JPT1QpKTsNCi0gIC8qIEF1dGhvcml6ZSB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCi0gIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMTsNCi0gIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMjsNCi0gIA0KLSAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQotICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotICANCi0gIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCi0gIHsgIA0KLSAgICAvKiBFbmFibGUgdGhlIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBvcGVyYXRpb24gKi8NCi0gICAgRkxBU0gtPkNSIHw9IENSX09QVFBHX1NldDsgDQotDQotICAgIGlmKEZMQVNIX0JPT1QgPT0gRkxBU0hfQk9PVF9CYW5rMSkNCi0gICAgew0KLSAgICAgIE9CLT5VU0VSIHw9IE9CX1VTRVJfQkZCMjsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBPQi0+VVNFUiAmPSAodWludDE2X3QpKH4odWludDE2X3QpKE9CX1VTRVJfQkZCMikpOw0KLSAgICB9DQotICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KLSAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQotICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9USU1FT1VUKQ0KLSAgICB7DQotICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovDQotICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KLSAgICB9DQotICB9ICAgIA0KLSAgLyogUmV0dXJuIHRoZSBPcHRpb24gQnl0ZSBwcm9ncmFtIFN0YXR1cyAqLw0KLSAgcmV0dXJuIHN0YXR1czsNCi19DQotI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlcy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIFRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlcyB2YWx1ZXM6SVdER19TVyhCaXQwKSwgUlNUX1NUT1AoQml0MSkNCi0gICogICBhbmQgUlNUX1NUREJZKEJpdDIpLg0KLSAgKi8NCi11aW50MzJfdCBGTEFTSF9HZXRVc2VyT3B0aW9uQnl0ZSh2b2lkKQ0KLXsNCi0gIC8qIFJldHVybiB0aGUgVXNlciBPcHRpb24gQnl0ZSAqLw0KLSAgcmV0dXJuICh1aW50MzJfdCkoRkxBU0gtPk9CUiA+PiAyKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyB0aGUgRkxBU0ggV3JpdGUgUHJvdGVjdGlvbiBPcHRpb24gQnl0ZXMgUmVnaXN0ZXIgdmFsdWUuDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBUaGUgRkxBU0ggV3JpdGUgUHJvdGVjdGlvbiAgT3B0aW9uIEJ5dGVzIFJlZ2lzdGVyIHZhbHVlDQotICAqLw0KLXVpbnQzMl90IEZMQVNIX0dldFdyaXRlUHJvdGVjdGlvbk9wdGlvbkJ5dGUodm9pZCkNCi17DQotICAvKiBSZXR1cm4gdGhlIEZhbHNoIHdyaXRlIHByb3RlY3Rpb24gUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHJldHVybiAodWludDMyX3QpKEZMQVNILT5XUlBSKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIEZMQVNIIFJlYWQgT3V0IFByb3RlY3Rpb24gU3RhdHVzIGlzIHNldCBvciBub3QuDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBGTEFTSCBSZWFkT3V0IFByb3RlY3Rpb24gU3RhdHVzKFNFVCBvciBSRVNFVCkNCi0gICovDQotRmxhZ1N0YXR1cyBGTEFTSF9HZXRSZWFkT3V0UHJvdGVjdGlvblN0YXR1cyh2b2lkKQ0KLXsNCi0gIEZsYWdTdGF0dXMgcmVhZG91dHN0YXR1cyA9IFJFU0VUOw0KLSAgaWYgKChGTEFTSC0+T0JSICYgUkRQUlRfTWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgew0KLSAgICByZWFkb3V0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICByZWFkb3V0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICByZXR1cm4gcmVhZG91dHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIEZMQVNIIFByZWZldGNoIEJ1ZmZlciBzdGF0dXMgaXMgc2V0IG9yIG5vdC4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIEZMQVNIIFByZWZldGNoIEJ1ZmZlciBTdGF0dXMgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUZsYWdTdGF0dXMgRkxBU0hfR2V0UHJlZmV0Y2hCdWZmZXJTdGF0dXModm9pZCkNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgDQotICBpZiAoKEZMQVNILT5BQ1IgJiBBQ1JfUFJGVEJTX01hc2spICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgbmV3IHN0YXRlIG9mIEZMQVNIIFByZWZldGNoIEJ1ZmZlciBTdGF0dXMgKFNFVCBvciBSRVNFVCkgKi8NCi0gIHJldHVybiBiaXRzdGF0dXM7IA0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgRkxBU0ggaW50ZXJydXB0cy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMuDQotICAqICAgICAgICAgLSBGb3IgU1RNMzJGMTBYX1hMIGRldmljZXMsIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBGTEFTSCBpbnRlcnJ1cHRzDQotICAgICAgICAgICAgICBmb3IgQmFuazEgYW5kIEJhbmsyLg0KLSAgKiAgICAgICAgIC0gRm9yIG90aGVyIGRldmljZXMgaXQgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdHMgZm9yIEJhbmsxLg0KLSAgKiBAcGFyYW0gIEZMQVNIX0lUOiBzcGVjaWZpZXMgdGhlIEZMQVNIIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRkxBU0hfSVRfRVJST1I6IEZMQVNIIEVycm9yIEludGVycnVwdA0KLSAgKiAgICAgQGFyZyBGTEFTSF9JVF9FT1A6IEZMQVNIIGVuZCBvZiBvcGVyYXRpb24gSW50ZXJydXB0DQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEZsYXNoIGludGVycnVwdHMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4gICAgICANCi0gICogQHJldHZhbCBOb25lIA0KLSAgKi8NCi12b2lkIEZMQVNIX0lUQ29uZmlnKHVpbnQzMl90IEZMQVNIX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfSVQoRkxBU0hfSVQpKTsgDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLQ0KLSAgaWYoKEZMQVNIX0lUICYgMHg4MDAwMDAwMCkgIT0gMHgwKQ0KLSAgew0KLSAgICBpZihOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgICB7DQotICAgICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLw0KLSAgICAgIEZMQVNILT5DUjIgfD0gKEZMQVNIX0lUICYgMHg3RkZGRkZGRik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8NCi0gICAgICBGTEFTSC0+Q1IyICY9IH4odWludDMyX3QpKEZMQVNIX0lUICYgMHg3RkZGRkZGRik7DQotICAgIH0NCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgaWYoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gICAgew0KLSAgICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8NCi0gICAgICBGTEFTSC0+Q1IgfD0gRkxBU0hfSVQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8NCi0gICAgICBGTEFTSC0+Q1IgJj0gfih1aW50MzJfdClGTEFTSF9JVDsNCi0gICAgfQ0KLSAgfQ0KLSNlbHNlDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0lUKEZMQVNIX0lUKSk7IA0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0NCi0gIGlmKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8NCi0gICAgRkxBU0gtPkNSIHw9IEZMQVNIX0lUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLw0KLSAgICBGTEFTSC0+Q1IgJj0gfih1aW50MzJfdClGTEFTSF9JVDsNCi0gIH0NCi0jZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRkxBU0ggZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcy4NCi0gICogICAgICAgICAtIEZvciBTVE0zMkYxMFhfWEwgZGV2aWNlcywgdGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgICAgICAgICAgQmFuazEgb3IgQmFuazIgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiAgICAgICAgIC0gRm9yIG90aGVyIGRldmljZXMsIGl0IGNoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQmFuazEgZmxhZyBpcyANCi0gICogICAgICAgICAgIHNldCBvciBub3QuDQotICAqIEBwYXJhbSAgRkxBU0hfRkxBRzogc3BlY2lmaWVzIHRoZSBGTEFTSCBmbGFnIHRvIGNoZWNrLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfQlNZOiBGTEFTSCBCdXN5IGZsYWcgICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX1BHRVJSOiBGTEFTSCBQcm9ncmFtIGVycm9yIGZsYWcgICAgICAgDQotICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfV1JQUlRFUlI6IEZMQVNIIFdyaXRlIHByb3RlY3RlZCBlcnJvciBmbGFnICAgICAgDQotICAqICAgICBAYXJnIEZMQVNIX0ZMQUdfRU9QOiBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcgICAgICAgICAgIA0KLSAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX09QVEVSUjogIEZMQVNIIE9wdGlvbiBCeXRlIGVycm9yIGZsYWcgICAgIA0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRkxBU0hfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotRmxhZ1N0YXR1cyBGTEFTSF9HZXRGbGFnU3RhdHVzKHVpbnQzMl90IEZMQVNIX0ZMQUcpDQotew0KLSAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0NCi0jaWZkZWYgU1RNMzJGMTBYX1hMDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUcpKSA7DQotICBpZihGTEFTSF9GTEFHID09IEZMQVNIX0ZMQUdfT1BURVJSKSANCi0gIHsNCi0gICAgaWYoKEZMQVNILT5PQlIgJiBGTEFTSF9GTEFHX09QVEVSUikgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgICB7DQotICAgICAgYml0c3RhdHVzID0gU0VUOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgICB9DQotICB9DQotICBlbHNlDQotICB7DQotICAgIGlmKChGTEFTSF9GTEFHICYgMHg4MDAwMDAwMCkgIT0gMHgwKQ0KLSAgICB7DQotICAgICAgaWYoKEZMQVNILT5TUjIgJiBGTEFTSF9GTEFHKSAhPSAodWludDMyX3QpUkVTRVQpDQotICAgICAgew0KLSAgICAgICAgYml0c3RhdHVzID0gU0VUOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGlmKChGTEFTSC0+U1IgJiBGTEFTSF9GTEFHKSAhPSAodWludDMyX3QpUkVTRVQpDQotICAgICAgew0KLSAgICAgICAgYml0c3RhdHVzID0gU0VUOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotI2Vsc2UNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBRykpIDsNCi0gIGlmKEZMQVNIX0ZMQUcgPT0gRkxBU0hfRkxBR19PUFRFUlIpIA0KLSAgew0KLSAgICBpZigoRkxBU0gtPk9CUiAmIEZMQVNIX0ZMQUdfT1BURVJSKSAhPSAodWludDMyX3QpUkVTRVQpDQotICAgIHsNCi0gICAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICAgIH0NCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICBpZigoRkxBU0gtPlNSICYgRkxBU0hfRkxBRykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgICB7DQotICAgICAgYml0c3RhdHVzID0gU0VUOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgICB9DQotICB9DQotI2VuZGlmIC8qIFNUTTMyRjEwWF9YTCAqLw0KLQ0KLSAgLyogUmV0dXJuIHRoZSBuZXcgc3RhdGUgb2YgRkxBU0hfRkxBRyAoU0VUIG9yIFJFU0VUKSAqLw0KLSAgcmV0dXJuIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBGTEFTSJJzIHBlbmRpbmcgZmxhZ3MuDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLg0KLSAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzLCB0aGlzIGZ1bmN0aW9uIGNsZWFycyBCYW5rMSBvciBCYW5rMpJzIHBlbmRpbmcgZmxhZ3MNCi0gICogICAgICAgICAtIEZvciBvdGhlciBkZXZpY2VzLCBpdCBjbGVhcnMgQmFuazGScyBwZW5kaW5nIGZsYWdzLg0KLSAgKiBAcGFyYW0gIEZMQVNIX0ZMQUc6IHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZ3MgdG8gY2xlYXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICAgICAgICANCi0gICogICAgIEBhcmcgRkxBU0hfRkxBR19QR0VSUjogRkxBU0ggUHJvZ3JhbSBlcnJvciBmbGFnICAgICAgIA0KLSAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX1dSUFJURVJSOiBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAgICAgIA0KLSAgKiAgICAgQGFyZyBGTEFTSF9GTEFHX0VPUDogRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnICAgICAgICAgICANCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRkxBU0hfQ2xlYXJGbGFnKHVpbnQzMl90IEZMQVNIX0ZMQUcpDQotew0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQ0xFQVJfRkxBRyhGTEFTSF9GTEFHKSkgOw0KLQ0KLSAgaWYoKEZMQVNIX0ZMQUcgJiAweDgwMDAwMDAwKSAhPSAweDApDQotICB7DQotICAgIC8qIENsZWFyIHRoZSBmbGFncyAqLw0KLSAgICBGTEFTSC0+U1IyID0gRkxBU0hfRkxBRzsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogQ2xlYXIgdGhlIGZsYWdzICovDQotICAgIEZMQVNILT5TUiA9IEZMQVNIX0ZMQUc7DQotICB9ICANCi0NCi0jZWxzZQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GTEFTSF9DTEVBUl9GTEFHKEZMQVNIX0ZMQUcpKSA7DQotICANCi0gIC8qIENsZWFyIHRoZSBmbGFncyAqLw0KLSAgRkxBU0gtPlNSID0gRkxBU0hfRkxBRzsNCi0jZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFN0YXR1cy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMsIGl0IGlzIGVxdWl2YWxlbnQNCi0gICogICAgdG8gRkxBU0hfR2V0QmFuazFTdGF0dXMgZnVuY3Rpb24uDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfQlVTWSwgRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQIG9yIEZMQVNIX0NPTVBMRVRFDQotICAqLw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9HZXRTdGF0dXModm9pZCkNCi17DQotICBGTEFTSF9TdGF0dXMgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gIA0KLSAgaWYoKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUdfQlNZKSA9PSBGTEFTSF9GTEFHX0JTWSkgDQotICB7DQotICAgIGZsYXNoc3RhdHVzID0gRkxBU0hfQlVTWTsNCi0gIH0NCi0gIGVsc2UgDQotICB7ICANCi0gICAgaWYoKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUdfUEdFUlIpICE9IDApDQotICAgIHsgDQotICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9FUlJPUl9QRzsNCi0gICAgfQ0KLSAgICBlbHNlIA0KLSAgICB7DQotICAgICAgaWYoKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUdfV1JQUlRFUlIpICE9IDAgKQ0KLSAgICAgIHsNCi0gICAgICAgIGZsYXNoc3RhdHVzID0gRkxBU0hfRVJST1JfV1JQOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgRmxhc2ggU3RhdHVzICovDQotICByZXR1cm4gZmxhc2hzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIEJhbmsxIFN0YXR1cy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgU1RNMzJGMTB4IGRldmljZXMsIGl0IGlzIGVxdWl2YWxlbnQNCi0gICogICB0byBGTEFTSF9HZXRTdGF0dXMgZnVuY3Rpb24uDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfQlVTWSwgRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQIG9yIEZMQVNIX0NPTVBMRVRFDQotICAqLw0KLUZMQVNIX1N0YXR1cyBGTEFTSF9HZXRCYW5rMVN0YXR1cyh2b2lkKQ0KLXsNCi0gIEZMQVNIX1N0YXR1cyBmbGFzaHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgDQotICBpZigoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19CQU5LMV9CU1kpID09IEZMQVNIX0ZMQUdfQlNZKSANCi0gIHsNCi0gICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9CVVNZOw0KLSAgfQ0KLSAgZWxzZSANCi0gIHsgIA0KLSAgICBpZigoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19CQU5LMV9QR0VSUikgIT0gMCkNCi0gICAgeyANCi0gICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0VSUk9SX1BHOw0KLSAgICB9DQotICAgIGVsc2UgDQotICAgIHsNCi0gICAgICBpZigoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19CQU5LMV9XUlBSVEVSUikgIT0gMCApDQotICAgICAgew0KLSAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9FUlJPUl9XUlA7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBGbGFzaCBTdGF0dXMgKi8NCi0gIHJldHVybiBmbGFzaHN0YXR1czsNCi19DQotDQotI2lmZGVmIFNUTTMyRjEwWF9YTA0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIEJhbmsyIFN0YXR1cy4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBTVE0zMkYxMHhfWEwgZGVuc2l0eSBkZXZpY2VzLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0JVU1ksIEZMQVNIX0VSUk9SX1BHLA0KLSAgKiAgIEZMQVNIX0VSUk9SX1dSUCBvciBGTEFTSF9DT01QTEVURQ0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfR2V0QmFuazJTdGF0dXModm9pZCkNCi17DQotICBGTEFTSF9TdGF0dXMgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gIA0KLSAgaWYoKEZMQVNILT5TUjIgJiAoRkxBU0hfRkxBR19CQU5LMl9CU1kgJiAweDdGRkZGRkZGKSkgPT0gKEZMQVNIX0ZMQUdfQkFOSzJfQlNZICYgMHg3RkZGRkZGRikpIA0KLSAgew0KLSAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0JVU1k7DQotICB9DQotICBlbHNlIA0KLSAgeyAgDQotICAgIGlmKChGTEFTSC0+U1IyICYgKEZMQVNIX0ZMQUdfQkFOSzJfUEdFUlIgJiAweDdGRkZGRkZGKSkgIT0gMCkNCi0gICAgeyANCi0gICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0VSUk9SX1BHOw0KLSAgICB9DQotICAgIGVsc2UgDQotICAgIHsNCi0gICAgICBpZigoRkxBU0gtPlNSMiAmIChGTEFTSF9GTEFHX0JBTksyX1dSUFJURVJSICYgMHg3RkZGRkZGRikpICE9IDAgKQ0KLSAgICAgIHsNCi0gICAgICAgIGZsYXNoc3RhdHVzID0gRkxBU0hfRVJST1JfV1JQOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgRmxhc2ggU3RhdHVzICovDQotICByZXR1cm4gZmxhc2hzdGF0dXM7DQotfQ0KLSNlbmRpZiAvKiBTVE0zMkYxMFhfWEwgKi8NCi0vKioNCi0gICogQGJyaWVmICBXYWl0cyBmb3IgYSBGbGFzaCBvcGVyYXRpb24gdG8gY29tcGxldGUgb3IgYSBUSU1FT1VUIHRvIG9jY3VyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBTVE0zMkYxMHggZGV2aWNlcywgDQotICAqICAgICAgICAgaXQgaXMgZXF1aXZhbGVudCB0byBGTEFTSF9XYWl0Rm9yTGFzdEJhbmsxT3BlcmF0aW9uLg0KLSAgKiAgICAgICAgIC0gRm9yIFNUTTMyRjEwWF9YTCBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGEgQmFuazEgRmxhc2ggb3BlcmF0aW9uDQotICAqICAgICAgICAgICB0byBjb21wbGV0ZSBvciBhIFRJTUVPVVQgdG8gb2NjdXIuDQotICAqICAgICAgICAgLSBGb3IgYWxsIG90aGVyIGRldmljZXMgaXQgd2FpdHMgZm9yIGEgRmxhc2ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIA0KLSAgKiAgICAgICAgICAgb3IgYSBUSU1FT1VUIHRvIG9jY3VyLg0KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IEZMQVNIIHByb2dhbW1pbmcgVGltZW91dA0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24odWludDMyX3QgVGltZW91dCkNCi17IA0KLSAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgIA0KLSAgLyogQ2hlY2sgZm9yIHRoZSBGbGFzaCBTdGF0dXMgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsxU3RhdHVzKCk7DQotICAvKiBXYWl0IGZvciBhIEZsYXNoIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBvciBhIFRJTUVPVVQgdG8gb2NjdXIgKi8NCi0gIHdoaWxlKChzdGF0dXMgPT0gRkxBU0hfQlVTWSkgJiYgKFRpbWVvdXQgIT0gMHgwMCkpDQotICB7DQotICAgIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsxU3RhdHVzKCk7DQotICAgIFRpbWVvdXQtLTsNCi0gIH0NCi0gIGlmKFRpbWVvdXQgPT0gMHgwMCApDQotICB7DQotICAgIHN0YXR1cyA9IEZMQVNIX1RJTUVPVVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIG9wZXJhdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFdhaXRzIGZvciBhIEZsYXNoIG9wZXJhdGlvbiBvbiBCYW5rMSB0byBjb21wbGV0ZSBvciBhIFRJTUVPVVQgdG8gb2NjdXIuDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFNUTTMyRjEweCBkZXZpY2VzLCANCi0gICogICAgICAgICBpdCBpcyBlcXVpdmFsZW50IHRvIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uLg0KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IEZMQVNIIHByb2dhbW1pbmcgVGltZW91dA0KLSAgKiBAcmV0dmFsIEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfRVJST1JfUEcsDQotICAqICAgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciBGTEFTSF9USU1FT1VULg0KLSAgKi8NCi1GTEFTSF9TdGF0dXMgRkxBU0hfV2FpdEZvckxhc3RCYW5rMU9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQ0KLXsgDQotICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQotICAgDQotICAvKiBDaGVjayBmb3IgdGhlIEZsYXNoIFN0YXR1cyAqLw0KLSAgc3RhdHVzID0gRkxBU0hfR2V0QmFuazFTdGF0dXMoKTsNCi0gIC8qIFdhaXQgZm9yIGEgRmxhc2ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIG9yIGEgVElNRU9VVCB0byBvY2N1ciAqLw0KLSAgd2hpbGUoKHN0YXR1cyA9PSBGTEFTSF9GTEFHX0JBTksxX0JTWSkgJiYgKFRpbWVvdXQgIT0gMHgwMCkpDQotICB7DQotICAgIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsxU3RhdHVzKCk7DQotICAgIFRpbWVvdXQtLTsNCi0gIH0NCi0gIGlmKFRpbWVvdXQgPT0gMHgwMCApDQotICB7DQotICAgIHN0YXR1cyA9IEZMQVNIX1RJTUVPVVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIG9wZXJhdGlvbiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLSNpZmRlZiBTVE0zMkYxMFhfWEwNCi0vKioNCi0gICogQGJyaWVmICBXYWl0cyBmb3IgYSBGbGFzaCBvcGVyYXRpb24gb24gQmFuazIgdG8gY29tcGxldGUgb3IgYSBUSU1FT1VUIHRvIG9jY3VyLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb25seSBmb3IgU1RNMzJGMTB4X1hMIGRlbnNpdHkgZGV2aWNlcy4NCi0gICogQHBhcmFtICBUaW1lb3V0OiBGTEFTSCBwcm9nYW1taW5nIFRpbWVvdXQNCi0gICogQHJldHZhbCBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0VSUk9SX1BHLA0KLSAgKiAgIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgRkxBU0hfVElNRU9VVC4NCi0gICovDQotRkxBU0hfU3RhdHVzIEZMQVNIX1dhaXRGb3JMYXN0QmFuazJPcGVyYXRpb24odWludDMyX3QgVGltZW91dCkNCi17IA0KLSAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KLSAgIA0KLSAgLyogQ2hlY2sgZm9yIHRoZSBGbGFzaCBTdGF0dXMgKi8NCi0gIHN0YXR1cyA9IEZMQVNIX0dldEJhbmsyU3RhdHVzKCk7DQotICAvKiBXYWl0IGZvciBhIEZsYXNoIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBvciBhIFRJTUVPVVQgdG8gb2NjdXIgKi8NCi0gIHdoaWxlKChzdGF0dXMgPT0gKEZMQVNIX0ZMQUdfQkFOSzJfQlNZICYgMHg3RkZGRkZGRikpICYmIChUaW1lb3V0ICE9IDB4MDApKQ0KLSAgew0KLSAgICBzdGF0dXMgPSBGTEFTSF9HZXRCYW5rMlN0YXR1cygpOw0KLSAgICBUaW1lb3V0LS07DQotICB9DQotICBpZihUaW1lb3V0ID09IDB4MDAgKQ0KLSAgew0KLSAgICBzdGF0dXMgPSBGTEFTSF9USU1FT1VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBvcGVyYXRpb24gc3RhdHVzICovDQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0jZW5kaWYgLyogU1RNMzJGMTBYX1hMICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9mc21jLmMgYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9mc21jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWE1YWEuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfZnNtYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODYzICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9mc21jLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgRlNNQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfZnNtYy5oIg0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQyANCi0gICogQGJyaWVmIEZTTUMgZHJpdmVyIG1vZHVsZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovIA0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfUHJpdmF0ZV9EZWZpbmVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGU01DIHJlZ2lzdGVycyBiaXQgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLyogRlNNQyBCQ1J4IE1hc2sgKi8NCi0jZGVmaW5lIEJDUl9NQktFTl9TZXQgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkNCi0jZGVmaW5lIEJDUl9NQktFTl9SZXNldCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDBGRkZGRSkNCi0jZGVmaW5lIEJDUl9GQUNDRU5fU2V0ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkNCi0NCi0vKiBGU01DIFBDUnggTWFzayAqLw0KLSNkZWZpbmUgUENSX1BCS0VOX1NldCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KLSNkZWZpbmUgUENSX1BCS0VOX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEZGRkZCKQ0KLSNkZWZpbmUgUENSX0VDQ0VOX1NldCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKQ0KLSNkZWZpbmUgUENSX0VDQ0VOX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMEZGRkJGKQ0KLSNkZWZpbmUgUENSX01lbW9yeVR5cGVfTkFORCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4KQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBGU01DX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEZTTUNfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRlNNQyBOT1IvU1JBTSBCYW5rcyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCANCi0gICogICByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMTogRlNNQyBCYW5rMSBOT1IvU1JBTTEgIA0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmsxX05PUlNSQU0yOiBGU01DIEJhbmsxIE5PUi9TUkFNMiANCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMzogRlNNQyBCYW5rMSBOT1IvU1JBTTMgDQotICAqICAgICBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTQ6IEZTTUMgQmFuazEgTk9SL1NSQU00IA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGU01DX05PUlNSQU1EZUluaXQodWludDMyX3QgRlNNQ19CYW5rKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GU01DX05PUlNSQU1fQkFOSyhGU01DX0JhbmspKTsNCi0gIA0KLSAgLyogRlNNQ19CYW5rMV9OT1JTUkFNMSAqLw0KLSAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazFfTk9SU1JBTTEpDQotICB7DQotICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSA9IDB4MDAwMDMwREI7ICAgIA0KLSAgfQ0KLSAgLyogRlNNQ19CYW5rMV9OT1JTUkFNMiwgIEZTTUNfQmFuazFfTk9SU1JBTTMgb3IgRlNNQ19CYW5rMV9OT1JTUkFNNCAqLw0KLSAgZWxzZQ0KLSAgeyAgIA0KLSAgICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfQmFua10gPSAweDAwMDAzMEQyOyANCi0gIH0NCi0gIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rICsgMV0gPSAweDBGRkZGRkZGOw0KLSAgRlNNQ19CYW5rMUUtPkJXVFJbRlNNQ19CYW5rXSA9IDB4MEZGRkZGRkY7ICANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRlNNQyBOQU5EIEJhbmtzIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCi0gICogQHBhcmFtICBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCi0gICogICAgIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfTkFORERlSW5pdCh1aW50MzJfdCBGU01DX0JhbmspDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfQmFuaykpOw0KLSAgDQotICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KLSAgew0KLSAgICAvKiBTZXQgdGhlIEZTTUNfQmFuazIgcmVnaXN0ZXJzIHRvIHRoZWlyIHJlc2V0IHZhbHVlcyAqLw0KLSAgICBGU01DX0JhbmsyLT5QQ1IyID0gMHgwMDAwMDAxODsNCi0gICAgRlNNQ19CYW5rMi0+U1IyID0gMHgwMDAwMDA0MDsNCi0gICAgRlNNQ19CYW5rMi0+UE1FTTIgPSAweEZDRkNGQ0ZDOw0KLSAgICBGU01DX0JhbmsyLT5QQVRUMiA9IDB4RkNGQ0ZDRkM7ICANCi0gIH0NCi0gIC8qIEZTTUNfQmFuazNfTkFORCAqLyAgDQotICBlbHNlDQotICB7DQotICAgIC8qIFNldCB0aGUgRlNNQ19CYW5rMyByZWdpc3RlcnMgdG8gdGhlaXIgcmVzZXQgdmFsdWVzICovDQotICAgIEZTTUNfQmFuazMtPlBDUjMgPSAweDAwMDAwMDE4Ow0KLSAgICBGU01DX0JhbmszLT5TUjMgPSAweDAwMDAwMDQwOw0KLSAgICBGU01DX0JhbmszLT5QTUVNMyA9IDB4RkNGQ0ZDRkM7DQotICAgIEZTTUNfQmFuazMtPlBBVFQzID0gMHhGQ0ZDRkNGQzsgDQotICB9ICANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRlNNQyBQQ0NBUkQgQmFuayByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfUENDQVJERGVJbml0KHZvaWQpDQotew0KLSAgLyogU2V0IHRoZSBGU01DX0Jhbms0IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMgKi8NCi0gIEZTTUNfQmFuazQtPlBDUjQgPSAweDAwMDAwMDE4OyANCi0gIEZTTUNfQmFuazQtPlNSNCA9IDB4MDAwMDAwMDA7CQ0KLSAgRlNNQ19CYW5rNC0+UE1FTTQgPSAweEZDRkNGQ0ZDOw0KLSAgRlNNQ19CYW5rNC0+UEFUVDQgPSAweEZDRkNGQ0ZDOw0KLSAgRlNNQ19CYW5rNC0+UElPNCA9IDB4RkNGQ0ZDRkM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIE5PUi9TUkFNIEJhbmtzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICAqICAgcGFyYW1ldGVycyBpbiB0aGUgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBGU01DX05PUlNSQU1Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIEZTTUNfTk9SU1JBTUluaXRUeXBlRGVmDQotICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIA0KLSAgKiAgIHRoZSBGU01DIE5PUi9TUkFNIHNwZWNpZmllZCBCYW5rcy4gICAgICAgICAgICAgICAgICAgICAgIA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGU01DX05PUlNSQU1Jbml0KEZTTUNfTk9SU1JBTUluaXRUeXBlRGVmKiBGU01DX05PUlNSQU1Jbml0U3RydWN0KQ0KLXsgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTk9SU1JBTV9CQU5LKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFuaykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTVVYKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRGF0YUFkZHJlc3NNdXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX01FTU9SWShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX01lbW9yeVR5cGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX01FTU9SWV9XSURUSChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX01lbW9yeURhdGFXaWR0aCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQlVSU1RNT0RFKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQnVyc3RBY2Nlc3NNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BU1lOV0FJVChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0FzeW5jaHJvbm91c1dhaXQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRfUE9MQVJJVFkoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsUG9sYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1dSQVBfTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyYXBNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1NJR05BTF9BQ1RJVkUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsQWN0aXZlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XUklURV9PUEVSQVRJT04oRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZU9wZXJhdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVEVfU0lHTkFMKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfRVhURU5ERURfTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0V4dGVuZGVkTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV1JJVEVfQlVSU1QoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZUJ1cnN0KSk7ICANCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0FERFJFU1NfU0VUVVBfVElNRShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzU2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BRERSRVNTX0hPTERfVElNRShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0RBVEFTRVRVUF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1RVUk5BUk9VTkRfVElNRShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19CdXNUdXJuQXJvdW5kRHVyYXRpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0NMS19ESVYoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0RBVEFfTEFURU5DWShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQUNDRVNTX01PREUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZSkpOyANCi0gIA0KLSAgLyogQmFuazEgTk9SL1NSQU0gY29udHJvbCByZWdpc3RlciBjb25maWd1cmF0aW9uICovIA0KLSAgRlNNQ19CYW5rMS0+QlRDUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdID0gDQotICAgICAgICAgICAgKHVpbnQzMl90KUZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRGF0YUFkZHJlc3NNdXggfA0KLSAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5VHlwZSB8DQotICAgICAgICAgICAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGggfA0KLSAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQnVyc3RBY2Nlc3NNb2RlIHwNCi0gICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0FzeW5jaHJvbm91c1dhaXQgfA0KLSAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbFBvbGFyaXR5IHwNCi0gICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyYXBNb2RlIHwNCi0gICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWxBY3RpdmUgfA0KLSAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVPcGVyYXRpb24gfA0KLSAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbCB8DQotICAgICAgICAgICAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19FeHRlbmRlZE1vZGUgfA0KLSAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVCdXJzdDsNCi0NCi0gIGlmKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5VHlwZSA9PSBGU01DX01lbW9yeVR5cGVfTk9SKQ0KLSAgew0KLSAgICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFua10gfD0gKHVpbnQzMl90KUJDUl9GQUNDRU5fU2V0Ow0KLSAgfQ0KLSAgDQotICAvKiBCYW5rMSBOT1IvU1JBTSB0aW1pbmcgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAqLw0KLSAgRlNNQ19CYW5rMS0+QlRDUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmsrMV0gPSANCi0gICAgICAgICAgICAodWludDMyX3QpRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc1NldHVwVGltZSB8DQotICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NIb2xkVGltZSA8PCA0KSB8DQotICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUgPDwgOCkgfA0KLSAgICAgICAgICAgIChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19CdXNUdXJuQXJvdW5kRHVyYXRpb24gPDwgMTYpIHwNCi0gICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPDwgMjApIHwNCi0gICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kgPDwgMjQpIHwNCi0gICAgICAgICAgICAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZTsNCi0gICAgICAgICAgICANCi0gICAgDQotICAvKiBCYW5rMSBOT1IvU1JBTSB0aW1pbmcgcmVnaXN0ZXIgZm9yIHdyaXRlIGNvbmZpZ3VyYXRpb24sIGlmIGV4dGVuZGVkIG1vZGUgaXMgdXNlZCAqLw0KLSAgaWYoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19FeHRlbmRlZE1vZGUgPT0gRlNNQ19FeHRlbmRlZE1vZGVfRW5hYmxlKQ0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BRERSRVNTX1NFVFVQX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzU2V0dXBUaW1lKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19GU01DX0FERFJFU1NfSE9MRF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc0hvbGRUaW1lKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19GU01DX0RBVEFTRVRVUF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YVNldHVwVGltZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19DTEtfRElWKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24pKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQV9MQVRFTkNZKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQUNDRVNTX01PREUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BY2Nlc3NNb2RlKSk7DQotICAgIEZTTUNfQmFuazFFLT5CV1RSW0ZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFua10gPSANCi0gICAgICAgICAgICAgICh1aW50MzJfdClGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgfA0KLSAgICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc0hvbGRUaW1lIDw8IDQgKXwNCi0gICAgICAgICAgICAgIChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUgPDwgOCkgfA0KLSAgICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPDwgMjApIHwNCi0gICAgICAgICAgICAgIChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFMYXRlbmN5IDw8IDI0KSB8DQotICAgICAgICAgICAgICAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BY2Nlc3NNb2RlOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBGU01DX0JhbmsxRS0+QldUUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdID0gMHgwRkZGRkZGRjsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEZTTUMgTkFORCBCYW5rcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCANCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBGU01DX05BTkRJbml0U3RydWN0Lg0KLSAgKiBAcGFyYW0gIEZTTUNfTkFOREluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgRlNNQ19OQU5ESW5pdFR5cGVEZWYgDQotICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBGU01DIE5BTkQgc3BlY2lmaWVkIEJhbmtzLiAgICAgICAgICAgICAgICAgICAgICAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfTkFOREluaXQoRlNNQ19OQU5ESW5pdFR5cGVEZWYqIEZTTUNfTkFOREluaXRTdHJ1Y3QpDQotew0KLSAgdWludDMyX3QgdG1wcGNyID0gMHgwMDAwMDAwMCwgdG1wcG1lbSA9IDB4MDAwMDAwMDAsIHRtcHBhdHQgPSAweDAwMDAwMDAwOyANCi0gICAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX05BTkRfQkFOSyhGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0JhbmspKTsNCi0gIGFzc2VydF9wYXJhbSggSVNfRlNNQ19XQUlUX0ZFQVRVUkUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19XYWl0ZmVhdHVyZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX01FTU9SWV9XSURUSChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX01lbW9yeURhdGFXaWR0aCkpOw0KLSAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX0VDQ19TVEFURShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQykpOw0KLSAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX0VDQ1BBR0VfU0laRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQ1BhZ2VTaXplKSk7DQotICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfVENMUl9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX1RBUl9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19TRVRVUF9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19ISVpfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfU0VUVVBfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSE9MRF9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSElaX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCi0gIA0KLSAgLyogU2V0IHRoZSB0bXBwY3IgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfTkFOREluaXRTdHJ1Y3QgcGFyYW1ldGVycyAqLw0KLSAgdG1wcGNyID0gKHVpbnQzMl90KUZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfV2FpdGZlYXR1cmUgfA0KLSAgICAgICAgICAgIFBDUl9NZW1vcnlUeXBlX05BTkQgfA0KLSAgICAgICAgICAgIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5RGF0YVdpZHRoIHwNCi0gICAgICAgICAgICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQyB8DQotICAgICAgICAgICAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19FQ0NQYWdlU2l6ZSB8DQotICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSA8PCA5ICl8DQotICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lIDw8IDEzKTsNCi0gICAgICAgICAgICANCi0gIC8qIFNldCB0bXBwbWVtIHZhbHVlIGFjY29yZGluZyB0byBGU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCi0gIHRtcHBtZW0gPSAodWludDMyX3QpRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgfA0KLSAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KLSAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KLSAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA8PCAyNCk7IA0KLSAgICAgICAgICAgIA0KLSAgLyogU2V0IHRtcHBhdHQgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3R1cmUgcGFyYW1ldGVycyAqLw0KLSAgdG1wcGF0dCA9ICh1aW50MzJfdClGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSB8DQotICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSA8PCA4KSB8DQotICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA8PCAxNil8DQotICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lIDw8IDI0KTsNCi0gIA0KLSAgaWYoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCi0gIHsNCi0gICAgLyogRlNNQ19CYW5rMl9OQU5EIHJlZ2lzdGVycyBjb25maWd1cmF0aW9uICovDQotICAgIEZTTUNfQmFuazItPlBDUjIgPSB0bXBwY3I7DQotICAgIEZTTUNfQmFuazItPlBNRU0yID0gdG1wcG1lbTsNCi0gICAgRlNNQ19CYW5rMi0+UEFUVDIgPSB0bXBwYXR0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBGU01DX0JhbmszX05BTkQgcmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKi8NCi0gICAgRlNNQ19CYW5rMy0+UENSMyA9IHRtcHBjcjsNCi0gICAgRlNNQ19CYW5rMy0+UE1FTTMgPSB0bXBwbWVtOw0KLSAgICBGU01DX0JhbmszLT5QQVRUMyA9IHRtcHBhdHQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIFBDQ0FSRCBCYW5rIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIEZTTUNfUENDQVJESW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgRlNNQ19QQ0NBUkRJbml0VHlwZURlZg0KLSAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRlNNQyBQQ0NBUkQgQmFuay4gICAgICAgICAgICAgICAgICAgICAgIA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGU01DX1BDQ0FSREluaXQoRlNNQ19QQ0NBUkRJbml0VHlwZURlZiogRlNNQ19QQ0NBUkRJbml0U3RydWN0KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX0ZFQVRVUkUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19UQ0xSX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1RDTFJTZXR1cFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1RBUl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19UQVJTZXR1cFRpbWUpKTsNCi0gDQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19TRVRVUF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSE9MRF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19ISVpfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lKSk7DQotICANCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1NFVFVQX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0hJWl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX1NFVFVQX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSE9MRF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0hJWl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSkpOw0KLSAgDQotICAvKiBTZXQgdGhlIFBDUjQgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfUENDQVJESW5pdFN0cnVjdCBwYXJhbWV0ZXJzICovDQotICBGU01DX0Jhbms0LT5QQ1I0ID0gKHVpbnQzMl90KUZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19XYWl0ZmVhdHVyZSB8DQotICAgICAgICAgICAgICAgICAgICAgRlNNQ19NZW1vcnlEYXRhV2lkdGhfMTZiIHwgIA0KLSAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSA8PCA5KSB8DQotICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19UQVJTZXR1cFRpbWUgPDwgMTMpOw0KLSAgICAgICAgICAgIA0KLSAgLyogU2V0IFBNRU00IHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyB0byBGU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCi0gIEZTTUNfQmFuazQtPlBNRU00ID0gKHVpbnQzMl90KUZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgfA0KLSAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KLSAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KLSAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA8PCAyNCk7IA0KLSAgICAgICAgICAgIA0KLSAgLyogU2V0IFBBVFQ0IHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyB0byBGU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCi0gIEZTTUNfQmFuazQtPlBBVFQ0ID0gKHVpbnQzMl90KUZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgfA0KLSAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KLSAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KLSAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA8PCAyNCk7CQ0KLSAgICAgICAgICAgIA0KLSAgLyogU2V0IFBJTzQgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdHVyZSBwYXJhbWV0ZXJzICovDQotICBGU01DX0Jhbms0LT5QSU80ID0gKHVpbnQzMl90KUZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSB8DQotICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KLSAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lIDw8IDE2KXwNCi0gICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lIDw8IDI0KTsgICAgICAgICAgICAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggRlNNQ19OT1JTUkFNSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBGU01DX05PUlNSQU1Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgRlNNQ19OT1JTUkFNSW5pdFR5cGVEZWYgDQotICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfTk9SU1JBTVN0cnVjdEluaXQoRlNNQ19OT1JTUkFNSW5pdFR5cGVEZWYqIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QpDQoteyAgDQotICAvKiBSZXNldCBOT1IvU1JBTSBJbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAqLw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19CYW5rID0gRlNNQ19CYW5rMV9OT1JTUkFNMTsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRGF0YUFkZHJlc3NNdXggPSBGU01DX0RhdGFBZGRyZXNzTXV4X0VuYWJsZTsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5VHlwZSA9IEZTTUNfTWVtb3J5VHlwZV9TUkFNOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGggPSBGU01DX01lbW9yeURhdGFXaWR0aF84YjsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQnVyc3RBY2Nlc3NNb2RlID0gRlNNQ19CdXJzdEFjY2Vzc01vZGVfRGlzYWJsZTsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQXN5bmNocm9ub3VzV2FpdCA9IEZTTUNfQXN5bmNocm9ub3VzV2FpdF9EaXNhYmxlOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsUG9sYXJpdHkgPSBGU01DX1dhaXRTaWduYWxQb2xhcml0eV9Mb3c7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyYXBNb2RlID0gRlNNQ19XcmFwTW9kZV9EaXNhYmxlOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsQWN0aXZlID0gRlNNQ19XYWl0U2lnbmFsQWN0aXZlX0JlZm9yZVdhaXRTdGF0ZTsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVPcGVyYXRpb24gPSBGU01DX1dyaXRlT3BlcmF0aW9uX0VuYWJsZTsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbCA9IEZTTUNfV2FpdFNpZ25hbF9FbmFibGU7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0V4dGVuZGVkTW9kZSA9IEZTTUNfRXh0ZW5kZWRNb2RlX0Rpc2FibGU7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlQnVyc3QgPSBGU01DX1dyaXRlQnVyc3RfRGlzYWJsZTsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgPSAweEY7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUgPSAweEY7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhU2V0dXBUaW1lID0gMHhGRjsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0J1c1R1cm5Bcm91bmREdXJhdGlvbiA9IDB4RjsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0NMS0RpdmlzaW9uID0gMHhGOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kgPSAweEY7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BY2Nlc3NNb2RlID0gRlNNQ19BY2Nlc3NNb2RlX0E7IA0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzU2V0dXBUaW1lID0gMHhGOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUgPSAweEY7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUgPSAweEZGOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19CdXNUdXJuQXJvdW5kRHVyYXRpb24gPSAweEY7DQotICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0NMS0RpdmlzaW9uID0gMHhGOw0KLSAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSA9IDB4RjsNCi0gIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZSA9IEZTTUNfQWNjZXNzTW9kZV9BOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGaWxscyBlYWNoIEZTTUNfTkFOREluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQotICAqIEBwYXJhbSAgRlNNQ19OQU5ESW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEZTTUNfTkFOREluaXRUeXBlRGVmIA0KLSAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGU01DX05BTkRTdHJ1Y3RJbml0KEZTTUNfTkFOREluaXRUeXBlRGVmKiBGU01DX05BTkRJbml0U3RydWN0KQ0KLXsgDQotICAvKiBSZXNldCBOQU5EIEluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQotICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0JhbmsgPSBGU01DX0JhbmsyX05BTkQ7DQotICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlID0gRlNNQ19XYWl0ZmVhdHVyZV9EaXNhYmxlOw0KLSAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGggPSBGU01DX01lbW9yeURhdGFXaWR0aF84YjsNCi0gIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfRUNDID0gRlNNQ19FQ0NfRGlzYWJsZTsNCi0gIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfRUNDUGFnZVNpemUgPSBGU01DX0VDQ1BhZ2VTaXplXzI1NkJ5dGVzOw0KLSAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19UQ0xSU2V0dXBUaW1lID0gMHgwOw0KLSAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19UQVJTZXR1cFRpbWUgPSAweDA7DQotICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQotICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KLSAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lID0gMHhGQzsNCi0gIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCi0gIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lID0gMHhGQzsNCi0gIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSA9IDB4RkM7DQotICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KLSAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPSAweEZDOwkgIA0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGaWxscyBlYWNoIEZTTUNfUENDQVJESW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBGU01DX1BDQ0FSREluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBGU01DX1BDQ0FSREluaXRUeXBlRGVmIA0KLSAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGU01DX1BDQ0FSRFN0cnVjdEluaXQoRlNNQ19QQ0NBUkRJbml0VHlwZURlZiogRlNNQ19QQ0NBUkRJbml0U3RydWN0KQ0KLXsNCi0gIC8qIFJlc2V0IFBDQ0FSRCBJbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAqLw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlID0gRlNNQ19XYWl0ZmVhdHVyZV9EaXNhYmxlOw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1RDTFJTZXR1cFRpbWUgPSAweDA7DQotICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lID0gMHgwOw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQotICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSA9IDB4RkM7DQotICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA9IDB4RkM7DQotICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCi0gIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgPSAweEZDOw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA9IDB4RkM7CQ0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lID0gMHhGQzsNCi0gIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KLSAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA9IDB4RkM7DQotICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPSAweEZDOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgTk9SL1NSQU0gTWVtb3J5IEJhbmsuDQotICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMTogRlNNQyBCYW5rMSBOT1IvU1JBTTEgIA0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmsxX05PUlNSQU0yOiBGU01DIEJhbmsxIE5PUi9TUkFNMiANCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMzogRlNNQyBCYW5rMSBOT1IvU1JBTTMgDQotICAqICAgICBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTQ6IEZTTUMgQmFuazEgTk9SL1NSQU00IA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEZTTUNfQmFuay4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRlNNQ19OT1JTUkFNQ21kKHVpbnQzMl90IEZTTUNfQmFuaywgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX05PUlNSQU1fQkFOSyhGU01DX0JhbmspKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIE5PUi9TUkFNIEJhbmsgYnkgc2V0dGluZyB0aGUgUEJLRU4gYml0IGluIHRoZSBCQ1J4IHJlZ2lzdGVyICovDQotICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSB8PSBCQ1JfTUJLRU5fU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBOT1IvU1JBTSBCYW5rIGJ5IGNsZWFyaW5nIHRoZSBQQktFTiBiaXQgaW4gdGhlIEJDUnggcmVnaXN0ZXIgKi8NCi0gICAgRlNNQ19CYW5rMS0+QlRDUltGU01DX0JhbmtdICY9IEJDUl9NQktFTl9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIE5BTkQgTWVtb3J5IEJhbmsuDQotICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQotICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRlNNQ19CYW5rLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBGU01DX05BTkRDbWQodWludDMyX3QgRlNNQ19CYW5rLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfQmFuaykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgTkFORCBCYW5rIGJ5IHNldHRpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgUENSeCByZWdpc3RlciAqLw0KLSAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMi0+UENSMiB8PSBQQ1JfUEJLRU5fU2V0Ow0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIEZTTUNfQmFuazMtPlBDUjMgfD0gUENSX1BCS0VOX1NldDsNCi0gICAgfQ0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBOQU5EIEJhbmsgYnkgY2xlYXJpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgUENSeCByZWdpc3RlciAqLw0KLSAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMi0+UENSMiAmPSBQQ1JfUEJLRU5fUmVzZXQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMy0+UENSMyAmPSBQQ1JfUEJLRU5fUmVzZXQ7DQotICAgIH0NCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUENDQVJEIE1lbW9yeSBCYW5rLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBDQ0FSRCBNZW1vcnkgQmFuay4gIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfUENDQVJEQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBQQ0NBUkQgQmFuayBieSBzZXR0aW5nIHRoZSBQQktFTiBiaXQgaW4gdGhlIFBDUjQgcmVnaXN0ZXIgKi8NCi0gICAgRlNNQ19CYW5rNC0+UENSNCB8PSBQQ1JfUEJLRU5fU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBQQ0NBUkQgQmFuayBieSBjbGVhcmluZyB0aGUgUEJLRU4gYml0IGluIHRoZSBQQ1I0IHJlZ2lzdGVyICovDQotICAgIEZTTUNfQmFuazQtPlBDUjQgJj0gUENSX1BCS0VOX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBGU01DIE5BTkQgRUNDIGZlYXR1cmUuDQotICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQotICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRlNNQyBOQU5EIEVDQyBmZWF0dXJlLiAgDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRlNNQ19OQU5ERUNDQ21kKHVpbnQzMl90IEZTTUNfQmFuaywgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX05BTkRfQkFOSyhGU01DX0JhbmspKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIE5BTkQgQmFuayBFQ0MgZnVuY3Rpb24gYnkgc2V0dGluZyB0aGUgRUNDRU4gYml0IGluIHRoZSBQQ1J4IHJlZ2lzdGVyICovDQotICAgIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQotICAgIHsNCi0gICAgICBGU01DX0JhbmsyLT5QQ1IyIHw9IFBDUl9FQ0NFTl9TZXQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMy0+UENSMyB8PSBQQ1JfRUNDRU5fU2V0Ow0KLSAgICB9DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIE5BTkQgQmFuayBFQ0MgZnVuY3Rpb24gYnkgY2xlYXJpbmcgdGhlIEVDQ0VOIGJpdCBpbiB0aGUgUENSeCByZWdpc3RlciAqLw0KLSAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMi0+UENSMiAmPSBQQ1JfRUNDRU5fUmVzZXQ7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMy0+UENSMyAmPSBQQ1JfRUNDRU5fUmVzZXQ7DQotICAgIH0NCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyB0aGUgZXJyb3IgY29ycmVjdGlvbiBjb2RlIHJlZ2lzdGVyIHZhbHVlLg0KLSAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KLSAgKiBAcmV0dmFsIFRoZSBFcnJvciBDb3JyZWN0aW9uIENvZGUgKEVDQykgdmFsdWUuDQotICAqLw0KLXVpbnQzMl90IEZTTUNfR2V0RUNDKHVpbnQzMl90IEZTTUNfQmFuaykNCi17DQotICB1aW50MzJfdCBlY2N2YWwgPSAweDAwMDAwMDAwOw0KLSAgDQotICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KLSAgew0KLSAgICAvKiBHZXQgdGhlIEVDQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQotICAgIGVjY3ZhbCA9IEZTTUNfQmFuazItPkVDQ1IyOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBHZXQgdGhlIEVDQ1IzIHJlZ2lzdGVyIHZhbHVlICovDQotICAgIGVjY3ZhbCA9IEZTTUNfQmFuazMtPkVDQ1IzOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBlcnJvciBjb3JyZWN0aW9uIGNvZGUgdmFsdWUgKi8NCi0gIHJldHVybihlY2N2YWwpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgRlNNQyBpbnRlcnJ1cHRzLg0KLSAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KLSAgKiAgICAgQGFyZyBGU01DX0Jhbms0X1BDQ0FSRDogRlNNQyBCYW5rNCBQQ0NBUkQNCi0gICogQHBhcmFtICBGU01DX0lUOiBzcGVjaWZpZXMgdGhlIEZTTUMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBGU01DX0lUX1Jpc2luZ0VkZ2U6IFJpc2luZyBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuIA0KLSAgKiAgICAgQGFyZyBGU01DX0lUX0xldmVsOiBMZXZlbCBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIEZTTUNfSVRfRmFsbGluZ0VkZ2U6IEZhbGxpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBGU01DIGludGVycnVwdHMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgRlNNQ19JVENvbmZpZyh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVF9CQU5LKEZTTUNfQmFuaykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSVQoRlNNQ19JVCkpOwkNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEZTTUNfQmFuazIgaW50ZXJydXB0cyAqLw0KLSAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KLSAgICB7DQotICAgICAgRlNNQ19CYW5rMi0+U1IyIHw9IEZTTUNfSVQ7DQotICAgIH0NCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBGU01DX0JhbmszIGludGVycnVwdHMgKi8NCi0gICAgZWxzZSBpZiAoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCi0gICAgew0KLSAgICAgIEZTTUNfQmFuazMtPlNSMyB8PSBGU01DX0lUOw0KLSAgICB9DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgRlNNQ19CYW5rNCBpbnRlcnJ1cHRzICovDQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIEZTTUNfQmFuazQtPlNSNCB8PSBGU01DX0lUOyAgICANCi0gICAgfQ0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGU01DX0JhbmsyIGludGVycnVwdHMgKi8NCi0gICAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCi0gICAgew0KLSAgICAgIA0KLSAgICAgIEZTTUNfQmFuazItPlNSMiAmPSAodWludDMyX3QpfkZTTUNfSVQ7DQotICAgIH0NCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRlNNQ19CYW5rMyBpbnRlcnJ1cHRzICovDQotICAgIGVsc2UgaWYgKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQotICAgIHsNCi0gICAgICBGU01DX0JhbmszLT5TUjMgJj0gKHVpbnQzMl90KX5GU01DX0lUOw0KLSAgICB9DQotICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEZTTUNfQmFuazQgaW50ZXJydXB0cyAqLw0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBGU01DX0Jhbms0LT5TUjQgJj0gKHVpbnQzMl90KX5GU01DX0lUOyAgICANCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEZTTUMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KLSAgKiAgICAgQGFyZyBGU01DX0Jhbms0X1BDQ0FSRDogRlNNQyBCYW5rNCBQQ0NBUkQNCi0gICogQHBhcmFtICBGU01DX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBGU01DX0ZMQUdfUmlzaW5nRWRnZTogUmlzaW5nIGVnZGUgZGV0ZWN0aW9uIEZsYWcuDQotICAqICAgICBAYXJnIEZTTUNfRkxBR19MZXZlbDogTGV2ZWwgZGV0ZWN0aW9uIEZsYWcuDQotICAqICAgICBAYXJnIEZTTUNfRkxBR19GYWxsaW5nRWRnZTogRmFsbGluZyBlZ2RlIGRldGVjdGlvbiBGbGFnLg0KLSAgKiAgICAgQGFyZyBGU01DX0ZMQUdfRkVNUFQ6IEZpZm8gZW1wdHkgRmxhZy4gDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBGU01DX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUZsYWdTdGF0dXMgRlNNQ19HZXRGbGFnU3RhdHVzKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19GTEFHKQ0KLXsNCi0gIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICB1aW50MzJfdCB0bXBzciA9IDB4MDAwMDAwMDA7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19HRVRGTEFHX0JBTksoRlNNQ19CYW5rKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19HRVRfRkxBRyhGU01DX0ZMQUcpKTsNCi0gIA0KLSAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCi0gIHsNCi0gICAgdG1wc3IgPSBGU01DX0JhbmsyLT5TUjI7DQotICB9ICANCi0gIGVsc2UgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCi0gIHsNCi0gICAgdG1wc3IgPSBGU01DX0JhbmszLT5TUjM7DQotICB9DQotICAvKiBGU01DX0Jhbms0X1BDQ0FSRCovDQotICBlbHNlDQotICB7DQotICAgIHRtcHNyID0gRlNNQ19CYW5rNC0+U1I0Ow0KLSAgfSANCi0gIA0KLSAgLyogR2V0IHRoZSBmbGFnIHN0YXR1cyAqLw0KLSAgaWYgKCh0bXBzciAmIEZTTUNfRkxBRykgIT0gKHVpbnQxNl90KVJFU0VUICkNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIC8qIFJldHVybiB0aGUgZmxhZyBzdGF0dXMgKi8NCi0gIHJldHVybiBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgRlNNQ5JzIHBlbmRpbmcgZmxhZ3MuDQotICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQotICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQotICAqICAgICBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KLSAgKiBAcGFyYW0gIEZTTUNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZTTUNfRkxBR19SaXNpbmdFZGdlOiBSaXNpbmcgZWdkZSBkZXRlY3Rpb24gRmxhZy4NCi0gICogICAgIEBhcmcgRlNNQ19GTEFHX0xldmVsOiBMZXZlbCBkZXRlY3Rpb24gRmxhZy4NCi0gICogICAgIEBhcmcgRlNNQ19GTEFHX0ZhbGxpbmdFZGdlOiBGYWxsaW5nIGVnZGUgZGV0ZWN0aW9uIEZsYWcuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfQ2xlYXJGbGFnKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19GTEFHKQ0KLXsNCi0gLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0dFVEZMQUdfQkFOSyhGU01DX0JhbmspKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0NMRUFSX0ZMQUcoRlNNQ19GTEFHKSkgOw0KLSAgICANCi0gIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQotICB7DQotICAgIEZTTUNfQmFuazItPlNSMiAmPSB+RlNNQ19GTEFHOyANCi0gIH0gIA0KLSAgZWxzZSBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rM19OQU5EKQ0KLSAgew0KLSAgICBGU01DX0JhbmszLT5TUjMgJj0gfkZTTUNfRkxBRzsNCi0gIH0NCi0gIC8qIEZTTUNfQmFuazRfUENDQVJEKi8NCi0gIGVsc2UNCi0gIHsNCi0gICAgRlNNQ19CYW5rNC0+U1I0ICY9IH5GU01DX0ZMQUc7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRlNNQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0gICogQHBhcmFtICBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCi0gICogICAgIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rNF9QQ0NBUkQ6IEZTTUMgQmFuazQgUENDQVJEDQotICAqIEBwYXJhbSAgRlNNQ19JVDogc3BlY2lmaWVzIHRoZSBGU01DIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19JVF9SaXNpbmdFZGdlOiBSaXNpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0LiANCi0gICogICAgIEBhcmcgRlNNQ19JVF9MZXZlbDogTGV2ZWwgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBGU01DX0lUX0ZhbGxpbmdFZGdlOiBGYWxsaW5nIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4gDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBGU01DX0lUIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1JVFN0YXR1cyBGU01DX0dldElUU3RhdHVzKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19JVCkNCi17DQotICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIHVpbnQzMl90IHRtcHNyID0gMHgwLCBpdHN0YXR1cyA9IDB4MCwgaXRlbmFibGUgPSAweDA7IA0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSVRfQkFOSyhGU01DX0JhbmspKTsNCi0gIGFzc2VydF9wYXJhbShJU19GU01DX0dFVF9JVChGU01DX0lUKSk7DQotICANCi0gIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQotICB7DQotICAgIHRtcHNyID0gRlNNQ19CYW5rMi0+U1IyOw0KLSAgfSAgDQotICBlbHNlIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQotICB7DQotICAgIHRtcHNyID0gRlNNQ19CYW5rMy0+U1IzOw0KLSAgfQ0KLSAgLyogRlNNQ19CYW5rNF9QQ0NBUkQqLw0KLSAgZWxzZQ0KLSAgew0KLSAgICB0bXBzciA9IEZTTUNfQmFuazQtPlNSNDsNCi0gIH0gDQotICANCi0gIGl0c3RhdHVzID0gdG1wc3IgJiBGU01DX0lUOw0KLSAgDQotICBpdGVuYWJsZSA9IHRtcHNyICYgKEZTTUNfSVQgPj4gMyk7DQotICBpZiAoKGl0c3RhdHVzICE9ICh1aW50MzJfdClSRVNFVCkgICYmIChpdGVuYWJsZSAhPSAodWludDMyX3QpUkVTRVQpKQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgcmV0dXJuIGJpdHN0YXR1czsgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgRlNNQ5JzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQotICAqIEBwYXJhbSAgRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQotICAqICAgICBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQotICAqICAgICBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KLSAgKiBAcGFyYW0gIEZTTUNfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEZTTUNfSVRfUmlzaW5nRWRnZTogUmlzaW5nIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4gDQotICAqICAgICBAYXJnIEZTTUNfSVRfTGV2ZWw6IExldmVsIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4NCi0gICogICAgIEBhcmcgRlNNQ19JVF9GYWxsaW5nRWRnZTogRmFsbGluZyBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEZTTUNfQ2xlYXJJVFBlbmRpbmdCaXQodWludDMyX3QgRlNNQ19CYW5rLCB1aW50MzJfdCBGU01DX0lUKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVF9CQU5LKEZTTUNfQmFuaykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSVQoRlNNQ19JVCkpOw0KLSAgICANCi0gIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQotICB7DQotICAgIEZTTUNfQmFuazItPlNSMiAmPSB+KEZTTUNfSVQgPj4gMyk7IA0KLSAgfSAgDQotICBlbHNlIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmszX05BTkQpDQotICB7DQotICAgIEZTTUNfQmFuazMtPlNSMyAmPSB+KEZTTUNfSVQgPj4gMyk7DQotICB9DQotICAvKiBGU01DX0Jhbms0X1BDQ0FSRCovDQotICBlbHNlDQotICB7DQotICAgIEZTTUNfQmFuazQtPlNSNCAmPSB+KEZTTUNfSVQgPj4gMyk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2kyYy5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfaTJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjUyMWMuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfaTJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg1ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9pMmMuYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBJMkMgZmlybXdhcmUgZnVuY3Rpb25zLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4X2kyYy5oIg0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQotDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDIA0KLSAgKiBAYnJpZWYgSTJDIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiBJMkMgU1BFIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9QRV9TZXQgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKQ0KLSNkZWZpbmUgQ1IxX1BFX1Jlc2V0ICAgICAgICAgICAgKCh1aW50MTZfdCkweEZGRkUpDQotDQotLyogSTJDIFNUQVJUIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9TVEFSVF9TZXQgICAgICAgICAgICgodWludDE2X3QpMHgwMTAwKQ0KLSNkZWZpbmUgQ1IxX1NUQVJUX1Jlc2V0ICAgICAgICAgKCh1aW50MTZfdCkweEZFRkYpDQotDQotLyogSTJDIFNUT1AgbWFzayAqLw0KLSNkZWZpbmUgQ1IxX1NUT1BfU2V0ICAgICAgICAgICAgKCh1aW50MTZfdCkweDAyMDApDQotI2RlZmluZSBDUjFfU1RPUF9SZXNldCAgICAgICAgICAoKHVpbnQxNl90KTB4RkRGRikNCi0NCi0vKiBJMkMgQUNLIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9BQ0tfU2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDAwKQ0KLSNkZWZpbmUgQ1IxX0FDS19SZXNldCAgICAgICAgICAgKCh1aW50MTZfdCkweEZCRkYpDQotDQotLyogSTJDIEVOR0MgbWFzayAqLw0KLSNkZWZpbmUgQ1IxX0VOR0NfU2V0ICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwNDApDQotI2RlZmluZSBDUjFfRU5HQ19SZXNldCAgICAgICAgICAoKHVpbnQxNl90KTB4RkZCRikNCi0NCi0vKiBJMkMgU1dSU1QgbWFzayAqLw0KLSNkZWZpbmUgQ1IxX1NXUlNUX1NldCAgICAgICAgICAgKCh1aW50MTZfdCkweDgwMDApDQotI2RlZmluZSBDUjFfU1dSU1RfUmVzZXQgICAgICAgICAoKHVpbnQxNl90KTB4N0ZGRikNCi0NCi0vKiBJMkMgUEVDIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9QRUNfU2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwKQ0KLSNkZWZpbmUgQ1IxX1BFQ19SZXNldCAgICAgICAgICAgKCh1aW50MTZfdCkweEVGRkYpDQotDQotLyogSTJDIEVOUEVDIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9FTlBFQ19TZXQgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwKQ0KLSNkZWZpbmUgQ1IxX0VOUEVDX1Jlc2V0ICAgICAgICAgKCh1aW50MTZfdCkweEZGREYpDQotDQotLyogSTJDIEVOQVJQIG1hc2sgKi8NCi0jZGVmaW5lIENSMV9FTkFSUF9TZXQgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwKQ0KLSNkZWZpbmUgQ1IxX0VOQVJQX1Jlc2V0ICAgICAgICAgKCh1aW50MTZfdCkweEZGRUYpDQotDQotLyogSTJDIE5PU1RSRVRDSCBtYXNrICovDQotI2RlZmluZSBDUjFfTk9TVFJFVENIX1NldCAgICAgICAoKHVpbnQxNl90KTB4MDA4MCkNCi0jZGVmaW5lIENSMV9OT1NUUkVUQ0hfUmVzZXQgICAgICgodWludDE2X3QpMHhGRjdGKQ0KLQ0KLS8qIEkyQyByZWdpc3RlcnMgTWFza3MgKi8NCi0jZGVmaW5lIENSMV9DTEVBUl9NYXNrICAgICAgICAgICgodWludDE2X3QpMHhGQkY1KQ0KLQ0KLS8qIEkyQyBETUFFTiBtYXNrICovDQotI2RlZmluZSBDUjJfRE1BRU5fU2V0ICAgICAgICAgICAoKHVpbnQxNl90KTB4MDgwMCkNCi0jZGVmaW5lIENSMl9ETUFFTl9SZXNldCAgICAgICAgICgodWludDE2X3QpMHhGN0ZGKQ0KLQ0KLS8qIEkyQyBMQVNUIG1hc2sgKi8NCi0jZGVmaW5lIENSMl9MQVNUX1NldCAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwKQ0KLSNkZWZpbmUgQ1IyX0xBU1RfUmVzZXQgICAgICAgICAgKCh1aW50MTZfdCkweEVGRkYpDQotDQotLyogSTJDIEZSRVEgbWFzayAqLw0KLSNkZWZpbmUgQ1IyX0ZSRVFfUmVzZXQgICAgICAgICAgKCh1aW50MTZfdCkweEZGQzApDQotDQotLyogSTJDIEFERDAgbWFzayAqLw0KLSNkZWZpbmUgT0FSMV9BREQwX1NldCAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQotI2RlZmluZSBPQVIxX0FERDBfUmVzZXQgICAgICAgICAoKHVpbnQxNl90KTB4RkZGRSkNCi0NCi0vKiBJMkMgRU5EVUFMIG1hc2sgKi8NCi0jZGVmaW5lIE9BUjJfRU5EVUFMX1NldCAgICAgICAgICgodWludDE2X3QpMHgwMDAxKQ0KLSNkZWZpbmUgT0FSMl9FTkRVQUxfUmVzZXQgICAgICAgKCh1aW50MTZfdCkweEZGRkUpDQotDQotLyogSTJDIEFERDIgbWFzayAqLw0KLSNkZWZpbmUgT0FSMl9BREQyX1Jlc2V0ICAgICAgICAgKCh1aW50MTZfdCkweEZGMDEpDQotDQotLyogSTJDIEYvUyBtYXNrICovDQotI2RlZmluZSBDQ1JfRlNfU2V0ICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4ODAwMCkNCi0NCi0vKiBJMkMgQ0NSIG1hc2sgKi8NCi0jZGVmaW5lIENDUl9DQ1JfU2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgwRkZGKQ0KLQ0KLS8qIEkyQyBGTEFHIG1hc2sgKi8NCi0jZGVmaW5lIEZMQUdfTWFzayAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMEZGRkZGRikNCi0NCi0vKiBJMkMgSW50ZXJydXB0IEVuYWJsZSBtYXNrICovDQotI2RlZmluZSBJVEVOX01hc2sgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDcwMDAwMDApDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIEkyQ3ggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19EZUluaXQoSTJDX1R5cGVEZWYqIEkyQ3gpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotDQotICBpZiAoSTJDeCA9PSBJMkMxKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgSTJDMSByZXNldCBzdGF0ZSAqLw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0kyQzEsIEVOQUJMRSk7DQotICAgIC8qIFJlbGVhc2UgSTJDMSBmcm9tIHJlc2V0IHN0YXRlICovDQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfSTJDMSwgRElTQUJMRSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIEVuYWJsZSBJMkMyIHJlc2V0IHN0YXRlICovDQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfSTJDMiwgRU5BQkxFKTsNCi0gICAgLyogUmVsZWFzZSBJMkMyIGZyb20gcmVzZXQgc3RhdGUgKi8NCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9JMkMyLCBESVNBQkxFKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEkyQ3ggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCANCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBJMkNfSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAgKiAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMkNfSW5pdChJMkNfVHlwZURlZiogSTJDeCwgSTJDX0luaXRUeXBlRGVmKiBJMkNfSW5pdFN0cnVjdCkNCi17DQotICB1aW50MTZfdCB0bXByZWcgPSAwLCBmcmVxcmFuZ2UgPSAwOw0KLSAgdWludDE2X3QgcmVzdWx0ID0gMHgwNDsNCi0gIHVpbnQzMl90IHBjbGsxID0gODAwMDAwMDsNCi0gIFJDQ19DbG9ja3NUeXBlRGVmICByY2NfY2xvY2tzOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0NMT0NLX1NQRUVEKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NT0RFKEkyQ19Jbml0U3RydWN0LT5JMkNfTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19EVVRZX0NZQ0xFKEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX09XTl9BRERSRVNTMShJMkNfSW5pdFN0cnVjdC0+STJDX093bkFkZHJlc3MxKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FDS19TVEFURShJMkNfSW5pdFN0cnVjdC0+STJDX0FjaykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BQ0tOT1dMRURHRV9BRERSRVNTKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcykpOw0KLQ0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBHZXQgdGhlIEkyQ3ggQ1IyIHZhbHVlICovDQotICB0bXByZWcgPSBJMkN4LT5DUjI7DQotICAvKiBDbGVhciBmcmVxdWVuY3kgRlJFUVs1OjBdIGJpdHMgKi8NCi0gIHRtcHJlZyAmPSBDUjJfRlJFUV9SZXNldDsNCi0gIC8qIEdldCBwY2xrMSBmcmVxdWVuY3kgdmFsdWUgKi8NCi0gIFJDQ19HZXRDbG9ja3NGcmVxKCZyY2NfY2xvY2tzKTsNCi0gIHBjbGsxID0gcmNjX2Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7DQotICAvKiBTZXQgZnJlcXVlbmN5IGJpdHMgZGVwZW5kaW5nIG9uIHBjbGsxIHZhbHVlICovDQotICBmcmVxcmFuZ2UgPSAodWludDE2X3QpKHBjbGsxIC8gMTAwMDAwMCk7DQotICB0bXByZWcgfD0gZnJlcXJhbmdlOw0KLSAgLyogV3JpdGUgdG8gSTJDeCBDUjIgKi8NCi0gIEkyQ3gtPkNSMiA9IHRtcHJlZzsNCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgdG8gY29uZmlndXJlIFRSSVNFICovDQotICBJMkN4LT5DUjEgJj0gQ1IxX1BFX1Jlc2V0Ow0KLSAgLyogUmVzZXQgdG1wcmVnIHZhbHVlICovDQotICAvKiBDbGVhciBGL1MsIERVVFkgYW5kIENDUlsxMTowXSBiaXRzICovDQotICB0bXByZWcgPSAwOw0KLQ0KLSAgLyogQ29uZmlndXJlIHNwZWVkIGluIHN0YW5kYXJkIG1vZGUgKi8NCi0gIGlmIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgPD0gMTAwMDAwKQ0KLSAgew0KLSAgICAvKiBTdGFuZGFyZCBtb2RlIHNwZWVkIGNhbGN1bGF0ZSAqLw0KLSAgICByZXN1bHQgPSAodWludDE2X3QpKHBjbGsxIC8gKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCA8PCAxKSk7DQotICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4NCovDQotICAgIGlmIChyZXN1bHQgPCAweDA0KQ0KLSAgICB7DQotICAgICAgLyogU2V0IG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAqLw0KLSAgICAgIHJlc3VsdCA9IDB4MDQ7ICANCi0gICAgfQ0KLSAgICAvKiBTZXQgc3BlZWQgdmFsdWUgZm9yIHN0YW5kYXJkIG1vZGUgKi8NCi0gICAgdG1wcmVnIHw9IHJlc3VsdDsJICANCi0gICAgLyogU2V0IE1heGltdW0gUmlzZSBUaW1lIGZvciBzdGFuZGFyZCBtb2RlICovDQotICAgIEkyQ3gtPlRSSVNFID0gZnJlcXJhbmdlICsgMTsgDQotICB9DQotICAvKiBDb25maWd1cmUgc3BlZWQgaW4gZmFzdCBtb2RlICovDQotICBlbHNlIC8qKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCA8PSA0MDAwMDApKi8NCi0gIHsNCi0gICAgaWYgKEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID09IEkyQ19EdXR5Q3ljbGVfMikNCi0gICAgew0KLSAgICAgIC8qIEZhc3QgbW9kZSBzcGVlZCBjYWxjdWxhdGU6IFRsb3cvVGhpZ2ggPSAyICovDQotICAgICAgcmVzdWx0ID0gKHVpbnQxNl90KShwY2xrMSAvIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgKiAzKSk7DQotICAgIH0NCi0gICAgZWxzZSAvKkkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID09IEkyQ19EdXR5Q3ljbGVfMTZfOSovDQotICAgIHsNCi0gICAgICAvKiBGYXN0IG1vZGUgc3BlZWQgY2FsY3VsYXRlOiBUbG93L1RoaWdoID0gMTYvOSAqLw0KLSAgICAgIHJlc3VsdCA9ICh1aW50MTZfdCkocGNsazEgLyAoSTJDX0luaXRTdHJ1Y3QtPkkyQ19DbG9ja1NwZWVkICogMjUpKTsNCi0gICAgICAvKiBTZXQgRFVUWSBiaXQgKi8NCi0gICAgICByZXN1bHQgfD0gSTJDX0R1dHlDeWNsZV8xNl85Ow0KLSAgICB9DQotDQotICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4MSovDQotICAgIGlmICgocmVzdWx0ICYgQ0NSX0NDUl9TZXQpID09IDApDQotICAgIHsNCi0gICAgICAvKiBTZXQgbWluaW11bSBhbGxvd2VkIHZhbHVlICovDQotICAgICAgcmVzdWx0IHw9ICh1aW50MTZfdCkweDAwMDE7ICANCi0gICAgfQ0KLSAgICAvKiBTZXQgc3BlZWQgdmFsdWUgYW5kIHNldCBGL1MgYml0IGZvciBmYXN0IG1vZGUgKi8NCi0gICAgdG1wcmVnIHw9ICh1aW50MTZfdCkocmVzdWx0IHwgQ0NSX0ZTX1NldCk7DQotICAgIC8qIFNldCBNYXhpbXVtIFJpc2UgVGltZSBmb3IgZmFzdCBtb2RlICovDQotICAgIEkyQ3gtPlRSSVNFID0gKHVpbnQxNl90KSgoKGZyZXFyYW5nZSAqICh1aW50MTZfdCkzMDApIC8gKHVpbnQxNl90KTEwMDApICsgKHVpbnQxNl90KTEpOyAgDQotICB9DQotDQotICAvKiBXcml0ZSB0byBJMkN4IENDUiAqLw0KLSAgSTJDeC0+Q0NSID0gdG1wcmVnOw0KLSAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLw0KLSAgSTJDeC0+Q1IxIHw9IENSMV9QRV9TZXQ7DQotDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIEdldCB0aGUgSTJDeCBDUjEgdmFsdWUgKi8NCi0gIHRtcHJlZyA9IEkyQ3gtPkNSMTsNCi0gIC8qIENsZWFyIEFDSywgU01CVFlQRSBhbmQgIFNNQlVTIGJpdHMgKi8NCi0gIHRtcHJlZyAmPSBDUjFfQ0xFQVJfTWFzazsNCi0gIC8qIENvbmZpZ3VyZSBJMkN4OiBtb2RlIGFuZCBhY2tub3dsZWRnZW1lbnQgKi8NCi0gIC8qIFNldCBTTUJUWVBFIGFuZCBTTUJVUyBiaXRzIGFjY29yZGluZyB0byBJMkNfTW9kZSB2YWx1ZSAqLw0KLSAgLyogU2V0IEFDSyBiaXQgYWNjb3JkaW5nIHRvIEkyQ19BY2sgdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSAodWludDE2X3QpKCh1aW50MzJfdClJMkNfSW5pdFN0cnVjdC0+STJDX01vZGUgfCBJMkNfSW5pdFN0cnVjdC0+STJDX0Fjayk7DQotICAvKiBXcml0ZSB0byBJMkN4IENSMSAqLw0KLSAgSTJDeC0+Q1IxID0gdG1wcmVnOw0KLQ0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBTZXQgSTJDeCBPd24gQWRkcmVzczEgYW5kIGFja25vd2xlZGdlZCBhZGRyZXNzICovDQotICBJMkN4LT5PQVIxID0gKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcyB8IEkyQ19Jbml0U3RydWN0LT5JMkNfT3duQWRkcmVzczEpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGaWxscyBlYWNoIEkyQ19Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KLSAgKiBAcGFyYW0gIEkyQ19Jbml0U3RydWN0OiBwb2ludGVyIHRvIGFuIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgSTJDX1N0cnVjdEluaXQoSTJDX0luaXRUeXBlRGVmKiBJMkNfSW5pdFN0cnVjdCkNCi17DQotLyotLS0tLS0tLS0tLS0tLS0tIFJlc2V0IEkyQyBpbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIGluaXRpYWxpemUgdGhlIEkyQ19DbG9ja1NwZWVkIG1lbWJlciAqLw0KLSAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19DbG9ja1NwZWVkID0gNTAwMDsNCi0gIC8qIEluaXRpYWxpemUgdGhlIEkyQ19Nb2RlIG1lbWJlciAqLw0KLSAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlID0gSTJDX01vZGVfSTJDOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0R1dHlDeWNsZSBtZW1iZXIgKi8NCi0gIEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID0gSTJDX0R1dHlDeWNsZV8yOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX093bkFkZHJlc3MxIG1lbWJlciAqLw0KLSAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Pd25BZGRyZXNzMSA9IDA7DQotICAvKiBJbml0aWFsaXplIHRoZSBJMkNfQWNrIG1lbWJlciAqLw0KLSAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2sgPSBJMkNfQWNrX0Rpc2FibGU7DQotICAvKiBJbml0aWFsaXplIHRoZSBJMkNfQWNrbm93bGVkZ2VkQWRkcmVzcyBtZW1iZXIgKi8NCi0gIEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcyA9IEkyQ19BY2tub3dsZWRnZWRBZGRyZXNzXzdiaXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19DbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLw0KLSAgICBJMkN4LT5DUjEgfD0gQ1IxX1BFX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgKi8NCi0gICAgSTJDeC0+Q1IxICY9IENSMV9QRV9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBETUEgcmVxdWVzdHMuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIERNQSB0cmFuc2Zlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMkNfRE1BQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIERNQSByZXF1ZXN0cyAqLw0KLSAgICBJMkN4LT5DUjIgfD0gQ1IyX0RNQUVOX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIERNQSByZXF1ZXN0cyAqLw0KLSAgICBJMkN4LT5DUjIgJj0gQ1IyX0RNQUVOX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTcGVjaWZpZXMgaWYgdGhlIG5leHQgRE1BIHRyYW5zZmVyIHdpbGwgYmUgdGhlIGxhc3Qgb25lLg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBETUEgbGFzdCB0cmFuc2Zlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMkNfRE1BTGFzdFRyYW5zZmVyQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIE5leHQgRE1BIHRyYW5zZmVyIGlzIHRoZSBsYXN0IHRyYW5zZmVyICovDQotICAgIEkyQ3gtPkNSMiB8PSBDUjJfTEFTVF9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIE5leHQgRE1BIHRyYW5zZmVyIGlzIG5vdCB0aGUgbGFzdCB0cmFuc2ZlciAqLw0KLSAgICBJMkN4LT5DUjIgJj0gQ1IyX0xBU1RfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdlbmVyYXRlcyBJMkN4IGNvbW11bmljYXRpb24gU1RBUlQgY29uZGl0aW9uLg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbi4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUuDQotICAqLw0KLXZvaWQgSTJDX0dlbmVyYXRlU1RBUlQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogR2VuZXJhdGUgYSBTVEFSVCBjb25kaXRpb24gKi8NCi0gICAgSTJDeC0+Q1IxIHw9IENSMV9TVEFSVF9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uICovDQotICAgIEkyQ3gtPkNSMSAmPSBDUjFfU1RBUlRfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdlbmVyYXRlcyBJMkN4IGNvbW11bmljYXRpb24gU1RPUCBjb25kaXRpb24uDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIEkyQ19HZW5lcmF0ZVNUT1AoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogR2VuZXJhdGUgYSBTVE9QIGNvbmRpdGlvbiAqLw0KLSAgICBJMkN4LT5DUjEgfD0gQ1IxX1NUT1BfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uICovDQotICAgIEkyQ3gtPkNSMSAmPSBDUjFfU1RPUF9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBhY2tub3dsZWRnZSBmZWF0dXJlLg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBBY2tub3dsZWRnZW1lbnQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lLg0KLSAgKi8NCi12b2lkIEkyQ19BY2tub3dsZWRnZUNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIGFja25vd2xlZGdlbWVudCAqLw0KLSAgICBJMkN4LT5DUjEgfD0gQ1IxX0FDS19TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIGFja25vd2xlZGdlbWVudCAqLw0KLSAgICBJMkN4LT5DUjEgJj0gQ1IxX0FDS19SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIEkyQyBvd24gYWRkcmVzczIuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQWRkcmVzczogc3BlY2lmaWVzIHRoZSA3Yml0IEkyQyBvd24gYWRkcmVzczIuDQotICAqIEByZXR2YWwgTm9uZS4NCi0gICovDQotdm9pZCBJMkNfT3duQWRkcmVzczJDb25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQ4X3QgQWRkcmVzcykNCi17DQotICB1aW50MTZfdCB0bXByZWcgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotDQotICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wcmVnID0gSTJDeC0+T0FSMjsNCi0NCi0gIC8qIFJlc2V0IEkyQ3ggT3duIGFkZHJlc3MyIGJpdCBbNzoxXSAqLw0KLSAgdG1wcmVnICY9IE9BUjJfQUREMl9SZXNldDsNCi0NCi0gIC8qIFNldCBJMkN4IE93biBhZGRyZXNzMiAqLw0KLSAgdG1wcmVnIHw9ICh1aW50MTZfdCkoKHVpbnQxNl90KUFkZHJlc3MgJiAodWludDE2X3QpMHgwMEZFKTsNCi0NCi0gIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIEkyQ3gtPk9BUjIgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgZHVhbCBhZGRyZXNzaW5nIG1vZGUuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIGR1YWwgYWRkcmVzc2luZyBtb2RlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19EdWFsQWRkcmVzc0NtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgZHVhbCBhZGRyZXNzaW5nIG1vZGUgKi8NCi0gICAgSTJDeC0+T0FSMiB8PSBPQVIyX0VORFVBTF9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgZHVhbCBhZGRyZXNzaW5nIG1vZGUgKi8NCi0gICAgSTJDeC0+T0FSMiAmPSBPQVIyX0VORFVBTF9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBnZW5lcmFsIGNhbGwgZmVhdHVyZS4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgR2VuZXJhbCBjYWxsLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19HZW5lcmFsQ2FsbENtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgZ2VuZXJhbGwgY2FsbCAqLw0KLSAgICBJMkN4LT5DUjEgfD0gQ1IxX0VOR0NfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIGdlbmVyYWxsIGNhbGwgKi8NCi0gICAgSTJDeC0+Q1IxICY9IENSMV9FTkdDX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdHMuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgSTJDX0lUOiBzcGVjaWZpZXMgdGhlIEkyQyBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgSTJDX0lUX0JVRjogQnVmZmVyIGludGVycnVwdCBtYXNrDQotICAqICAgICBAYXJnIEkyQ19JVF9FVlQ6IEV2ZW50IGludGVycnVwdCBtYXNrDQotICAqICAgICBAYXJnIEkyQ19JVF9FUlI6IEVycm9yIGludGVycnVwdCBtYXNrDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHRzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19JVENvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdWludDE2X3QgSTJDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19DT05GSUdfSVQoSTJDX0lUKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBpbnRlcnJ1cHRzICovDQotICAgIEkyQ3gtPkNSMiB8PSBJMkNfSVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBpbnRlcnJ1cHRzICovDQotICAgIEkyQ3gtPkNSMiAmPSAodWludDE2X3QpfkkyQ19JVDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2VuZHMgYSBkYXRhIGJ5dGUgdGhyb3VnaCB0aGUgSTJDeCBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIERhdGE6IEJ5dGUgdG8gYmUgdHJhbnNtaXR0ZWQuLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMkNfU2VuZERhdGEoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQ4X3QgRGF0YSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIC8qIFdyaXRlIGluIHRoZSBEUiByZWdpc3RlciB0aGUgZGF0YSB0byBiZSBzZW50ICovDQotICBJMkN4LT5EUiA9IERhdGE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHJlY2VpdmVkIGRhdGEgYnkgdGhlIEkyQ3ggcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBUaGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVkIGRhdGEuDQotICAqLw0KLXVpbnQ4X3QgSTJDX1JlY2VpdmVEYXRhKEkyQ19UeXBlRGVmKiBJMkN4KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLSAgLyogUmV0dXJuIHRoZSBkYXRhIGluIHRoZSBEUiByZWdpc3RlciAqLw0KLSAgcmV0dXJuICh1aW50OF90KUkyQ3gtPkRSOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBUcmFuc21pdHMgdGhlIGFkZHJlc3MgYnl0ZSB0byBzZWxlY3QgdGhlIHNsYXZlIGRldmljZS4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBBZGRyZXNzOiBzcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3Mgd2hpY2ggd2lsbCBiZSB0cmFuc21pdHRlZA0KLSAgKiBAcGFyYW0gIEkyQ19EaXJlY3Rpb246IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBJMkMgZGV2aWNlIHdpbGwgYmUgYQ0KLSAgKiAgIFRyYW5zbWl0dGVyIG9yIGEgUmVjZWl2ZXIuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCi0gICogICAgIEBhcmcgSTJDX0RpcmVjdGlvbl9UcmFuc21pdHRlcjogVHJhbnNtaXR0ZXIgbW9kZQ0KLSAgKiAgICAgQGFyZyBJMkNfRGlyZWN0aW9uX1JlY2VpdmVyOiBSZWNlaXZlciBtb2RlDQotICAqIEByZXR2YWwgTm9uZS4NCi0gICovDQotdm9pZCBJMkNfU2VuZDdiaXRBZGRyZXNzKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50OF90IEFkZHJlc3MsIHVpbnQ4X3QgSTJDX0RpcmVjdGlvbikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19JMkNfRElSRUNUSU9OKEkyQ19EaXJlY3Rpb24pKTsNCi0gIC8qIFRlc3Qgb24gdGhlIGRpcmVjdGlvbiB0byBzZXQvcmVzZXQgdGhlIHJlYWQvd3JpdGUgYml0ICovDQotICBpZiAoSTJDX0RpcmVjdGlvbiAhPSBJMkNfRGlyZWN0aW9uX1RyYW5zbWl0dGVyKQ0KLSAgew0KLSAgICAvKiBTZXQgdGhlIGFkZHJlc3MgYml0MCBmb3IgcmVhZCAqLw0KLSAgICBBZGRyZXNzIHw9IE9BUjFfQUREMF9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFJlc2V0IHRoZSBhZGRyZXNzIGJpdDAgZm9yIHdyaXRlICovDQotICAgIEFkZHJlc3MgJj0gT0FSMV9BREQwX1Jlc2V0Ow0KLSAgfQ0KLSAgLyogU2VuZCB0aGUgYWRkcmVzcyAqLw0KLSAgSTJDeC0+RFIgPSBBZGRyZXNzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZWFkcyB0aGUgc3BlY2lmaWVkIEkyQyByZWdpc3RlciBhbmQgcmV0dXJucyBpdHMgdmFsdWUuDQotICAqIEBwYXJhbSAgSTJDX1JlZ2lzdGVyOiBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRvIHJlYWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX0NSMTogIENSMSByZWdpc3Rlci4NCi0gICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX0NSMjogICBDUjIgcmVnaXN0ZXIuDQotICAqICAgICBAYXJnIEkyQ19SZWdpc3Rlcl9PQVIxOiAgT0FSMSByZWdpc3Rlci4NCi0gICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX09BUjI6ICBPQVIyIHJlZ2lzdGVyLg0KLSAgKiAgICAgQGFyZyBJMkNfUmVnaXN0ZXJfRFI6ICAgIERSIHJlZ2lzdGVyLg0KLSAgKiAgICAgQGFyZyBJMkNfUmVnaXN0ZXJfU1IxOiAgIFNSMSByZWdpc3Rlci4NCi0gICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX1NSMjogICBTUjIgcmVnaXN0ZXIuDQotICAqICAgICBAYXJnIEkyQ19SZWdpc3Rlcl9DQ1I6ICAgQ0NSIHJlZ2lzdGVyLg0KLSAgKiAgICAgQGFyZyBJMkNfUmVnaXN0ZXJfVFJJU0U6IFRSSVNFIHJlZ2lzdGVyLg0KLSAgKiBAcmV0dmFsIFRoZSB2YWx1ZSBvZiB0aGUgcmVhZCByZWdpc3Rlci4NCi0gICovDQotdWludDE2X3QgSTJDX1JlYWRSZWdpc3RlcihJMkNfVHlwZURlZiogSTJDeCwgdWludDhfdCBJMkNfUmVnaXN0ZXIpDQotew0KLSAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX1JFR0lTVEVSKEkyQ19SZWdpc3RlcikpOw0KLQ0KLSAgdG1wID0gKHVpbnQzMl90KSBJMkN4Ow0KLSAgdG1wICs9IEkyQ19SZWdpc3RlcjsNCi0NCi0gIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHJldHVybiAoKihfX0lPIHVpbnQxNl90ICopIHRtcCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgc29mdHdhcmUgcmVzZXQuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIHNvZnR3YXJlIHJlc2V0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19Tb2Z0d2FyZVJlc2V0Q21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIFBlcmlwaGVyYWwgdW5kZXIgcmVzZXQgKi8NCi0gICAgSTJDeC0+Q1IxIHw9IENSMV9TV1JTVF9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFBlcmlwaGVyYWwgbm90IHVuZGVyIHJlc2V0ICovDQotICAgIEkyQ3gtPkNSMSAmPSBDUjFfU1dSU1RfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERyaXZlcyB0aGUgU01CdXNBbGVydCBwaW4gaGlnaCBvciBsb3cgZm9yIHRoZSBzcGVjaWZpZWQgSTJDLg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEkyQ19TTUJ1c0FsZXJ0OiBzcGVjaWZpZXMgU01CQWxlcnQgcGluIGxldmVsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBJMkNfU01CdXNBbGVydF9Mb3c6IFNNQkFsZXJ0IHBpbiBkcml2ZW4gbG93DQotICAqICAgICBAYXJnIEkyQ19TTUJ1c0FsZXJ0X0hpZ2g6IFNNQkFsZXJ0IHBpbiBkcml2ZW4gaGlnaA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMkNfU01CdXNBbGVydENvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdWludDE2X3QgSTJDX1NNQnVzQWxlcnQpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX1NNQlVTX0FMRVJUKEkyQ19TTUJ1c0FsZXJ0KSk7DQotICBpZiAoSTJDX1NNQnVzQWxlcnQgPT0gSTJDX1NNQnVzQWxlcnRfTG93KQ0KLSAgew0KLSAgICAvKiBEcml2ZSB0aGUgU01CdXNBbGVydCBwaW4gTG93ICovDQotICAgIEkyQ3gtPkNSMSB8PSBJMkNfU01CdXNBbGVydF9Mb3c7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERyaXZlIHRoZSBTTUJ1c0FsZXJ0IHBpbiBIaWdoICAqLw0KLSAgICBJMkN4LT5DUjEgJj0gSTJDX1NNQnVzQWxlcnRfSGlnaDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBQRUMgdHJhbnNmZXIuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIFBFQyB0cmFuc21pc3Npb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgSTJDX1RyYW5zbWl0UEVDKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyB0cmFuc21pc3Npb24gKi8NCi0gICAgSTJDeC0+Q1IxIHw9IENSMV9QRUNfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgUEVDIHRyYW5zbWlzc2lvbiAqLw0KLSAgICBJMkN4LT5DUjEgJj0gQ1IxX1BFQ19SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2VsZWN0cyB0aGUgc3BlY2lmaWVkIEkyQyBQRUMgcG9zaXRpb24uDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgSTJDX1BFQ1Bvc2l0aW9uOiBzcGVjaWZpZXMgdGhlIFBFQyBwb3NpdGlvbi4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgSTJDX1BFQ1Bvc2l0aW9uX05leHQ6IGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IGJ5dGUgaXMgUEVDDQotICAqICAgICBAYXJnIEkyQ19QRUNQb3NpdGlvbl9DdXJyZW50OiBpbmRpY2F0ZXMgdGhhdCBjdXJyZW50IGJ5dGUgaXMgUEVDDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19QRUNQb3NpdGlvbkNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdWludDE2X3QgSTJDX1BFQ1Bvc2l0aW9uKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19QRUNfUE9TSVRJT04oSTJDX1BFQ1Bvc2l0aW9uKSk7DQotICBpZiAoSTJDX1BFQ1Bvc2l0aW9uID09IEkyQ19QRUNQb3NpdGlvbl9OZXh0KQ0KLSAgew0KLSAgICAvKiBOZXh0IGJ5dGUgaW4gc2hpZnQgcmVnaXN0ZXIgaXMgUEVDICovDQotICAgIEkyQ3gtPkNSMSB8PSBJMkNfUEVDUG9zaXRpb25fTmV4dDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogQ3VycmVudCBieXRlIGluIHNoaWZ0IHJlZ2lzdGVyIGlzIFBFQyAqLw0KLSAgICBJMkN4LT5DUjEgJj0gSTJDX1BFQ1Bvc2l0aW9uX0N1cnJlbnQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBFQyB2YWx1ZSBjYWxjdWxhdGlvbiBvZiB0aGUgdHJhbnNmZXJlZCBieXRlcy4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IFBFQyB2YWx1ZSBjYWxjdWxhdGlvbi4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMkNfQ2FsY3VsYXRlUEVDKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyBjYWxjdWxhdGlvbiAqLw0KLSAgICBJMkN4LT5DUjEgfD0gQ1IxX0VOUEVDX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyBjYWxjdWxhdGlvbiAqLw0KLSAgICBJMkN4LT5DUjEgJj0gQ1IxX0VOUEVDX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSBQRUMgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgSTJDLg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIFRoZSBQRUMgdmFsdWUuDQotICAqLw0KLXVpbnQ4X3QgSTJDX0dldFBFQyhJMkNfVHlwZURlZiogSTJDeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgSTJDIFBFQyB2YWx1ZSAqLw0KLSAgcmV0dXJuICgoSTJDeC0+U1IyKSA+PiA4KTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBBUlAuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDeCBBUlAuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19BUlBDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgQVJQICovDQotICAgIEkyQ3gtPkNSMSB8PSBDUjFfRU5BUlBfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgQVJQICovDQotICAgIEkyQ3gtPkNSMSAmPSBDUjFfRU5BUlBfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgQ2xvY2sgc3RyZXRjaGluZy4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IENsb2NrIHN0cmV0Y2hpbmcuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgSTJDX1N0cmV0Y2hDbG9ja0NtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGlmIChOZXdTdGF0ZSA9PSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBDbG9jayBzdHJldGNoaW5nICovDQotICAgIEkyQ3gtPkNSMSB8PSBDUjFfTk9TVFJFVENIX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIENsb2NrIHN0cmV0Y2hpbmcgKi8NCi0gICAgSTJDeC0+Q1IxICY9IENSMV9OT1NUUkVUQ0hfUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIHNwZWNpZmllZCBJMkMgZmFzdCBtb2RlIGR1dHkgY3ljbGUuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgSTJDX0R1dHlDeWNsZTogc3BlY2lmaWVzIHRoZSBmYXN0IG1vZGUgZHV0eSBjeWNsZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBJMkNfRHV0eUN5Y2xlXzI6IEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaCA9IDINCi0gICogICAgIEBhcmcgSTJDX0R1dHlDeWNsZV8xNl85OiBJMkMgZmFzdCBtb2RlIFRsb3cvVGhpZ2ggPSAxNi85DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19GYXN0TW9kZUR1dHlDeWNsZUNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdWludDE2X3QgSTJDX0R1dHlDeWNsZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19JMkNfRFVUWV9DWUNMRShJMkNfRHV0eUN5Y2xlKSk7DQotICBpZiAoSTJDX0R1dHlDeWNsZSAhPSBJMkNfRHV0eUN5Y2xlXzE2XzkpDQotICB7DQotICAgIC8qIEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaD0yICovDQotICAgIEkyQ3gtPkNDUiAmPSBJMkNfRHV0eUN5Y2xlXzI7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaD0xNi85ICovDQotICAgIEkyQ3gtPkNDUiB8PSBJMkNfRHV0eUN5Y2xlXzE2Xzk7DQotICB9DQotfQ0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIEBicmllZg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICoNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBJMkMgU3RhdGUgTW9uaXRvcmluZyBGdW5jdGlvbnMNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICANCi0gKiBUaGlzIEkyQyBkcml2ZXIgcHJvdmlkZXMgdGhyZWUgZGlmZmVyZW50IHdheXMgZm9yIEkyQyBzdGF0ZSBtb25pdG9yaW5nDQotICogIGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzIGFuZCBjb25zdHJhaW50czoNCi0gKiAgICAgICAgDQotICogIA0KLSAqIDEpIEJhc2ljIHN0YXRlIG1vbml0b3Jpbmc6DQotICogICAgVXNpbmcgSTJDX0NoZWNrRXZlbnQoKSBmdW5jdGlvbjoNCi0gKiAgICBJdCBjb21wYXJlcyB0aGUgc3RhdHVzIHJlZ2lzdGVycyAoU1IxIGFuZCBTUjIpIGNvbnRlbnQgdG8gYSBnaXZlbiBldmVudA0KLSAqICAgIChjYW4gYmUgdGhlIGNvbWJpbmF0aW9uIG9mIG9uZSBvciBtb3JlIGZsYWdzKS4NCi0gKiAgICBJdCByZXR1cm5zIFNVQ0NFU1MgaWYgdGhlIGN1cnJlbnQgc3RhdHVzIGluY2x1ZGVzIHRoZSBnaXZlbiBmbGFncyANCi0gKiAgICBhbmQgcmV0dXJucyBFUlJPUiBpZiBvbmUgb3IgbW9yZSBmbGFncyBhcmUgbWlzc2luZyBpbiB0aGUgY3VycmVudCBzdGF0dXMuDQotICogICAgLSBXaGVuIHRvIHVzZToNCi0gKiAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgbW9zdCBhcHBsY2lhdGlvbnMgYXMgd2VsbCBhcyBmb3Igc3RhcnR1cCANCi0gKiAgICAgIGFjdGl2aXR5IHNpbmNlIHRoZSBldmVudHMgYXJlIGZ1bGx5IGRlc2NyaWJlZCBpbiB0aGUgcHJvZHVjdCByZWZlcmVuY2UgbWFudWFsIA0KLSAqICAgICAgKFJNMDAwOCkuDQotICogICAgICAtIEl0IGlzIGFsc28gc3VpdGFibGUgZm9yIHVzZXJzIHdobyBuZWVkIHRvIGRlZmluZSB0aGVpciBvd24gZXZlbnRzLg0KLSAqICAgIC0gTGltaXRhdGlvbnM6DQotICogICAgICAtIElmIGFuIGVycm9yIG9jY3VycyAoaWUuIGVycm9yIGZsYWdzIGFyZSBzZXQgYmVzaWRlcyB0byB0aGUgbW9uaXRvcmVkIGZsYWdzKSwNCi0gKiAgICAgICAgdGhlIEkyQ19DaGVja0V2ZW50KCkgZnVuY3Rpb24gbWF5IHJldHVybiBTVUNDRVNTIGRlc3BpdGUgdGhlIGNvbW11bmljYXRpb24NCi0gKiAgICAgICAgaG9sZCBvciBjb3JydXB0ZWQgcmVhbCBzdGF0ZS4gDQotICogICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgYWR2aXNlZCB0byB1c2UgZXJyb3IgaW50ZXJydXB0cyB0byBtb25pdG9yIHRoZSBlcnJvcg0KLSAqICAgICAgICBldmVudHMgYW5kIGhhbmRsZSB0aGVtIGluIHRoZSBpbnRlcnJ1cHQgSVJRIGhhbmRsZXIuDQotICogICAgICAgIA0KLSAqICAgICAgICBAbm90ZSANCi0gKiAgICAgICAgRm9yIGVycm9yIG1hbmFnZW1lbnQsIGl0IGlzIGFkdmlzZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOg0KLSAqICAgICAgICAgIC0gSTJDX0lUQ29uZmlnKCkgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgdGhlIGVycm9yIGludGVycnVwdHMgKEkyQ19JVF9FUlIpLg0KLSAqICAgICAgICAgIC0gSTJDeF9FUl9JUlFIYW5kbGVyKCkgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIGVycm9yIGludGVydXJwdCBvY2N1cnMuDQotICogICAgICAgICAgICBXaGVyZSB4IGlzIHRoZSBwZXJpcGhlcmFsIGluc3RhbmNlIChJMkMxLCBJMkMyIC4uLikNCi0gKiAgICAgICAgICAtIEkyQ19HZXRGbGFnU3RhdHVzKCkgb3IgSTJDX0dldElUU3RhdHVzKCkgdG8gYmUgY2FsbGVkIGludG8gSTJDeF9FUl9JUlFIYW5kbGVyKCkgDQotICogICAgICAgICAgICBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggZXJyb3Igb2NjdXJlZC4NCi0gKiAgICAgICAgICAtIEkyQ19DbGVhckZsYWcoKSBvciBJMkNfQ2xlYXJJVFBlbmRpbmdCaXQoKSBhbmQvb3IgSTJDX1NvZnR3YXJlUmVzZXRDbWQoKQ0KLSAqICAgICAgICAgICAgYW5kL29yIEkyQ19HZW5lcmF0ZVN0b3AoKSBpbiBvcmRlciB0byBjbGVhciB0aGUgZXJyb3IgZmxhZyBhbmQgc291cmNlLA0KLSAqICAgICAgICAgICAgYW5kIHJldHVybiB0byBjb3JyZWN0IGNvbW11bmljYXRpb24gc3RhdHVzLg0KLSAqICAgICAgICAgICAgDQotICoNCi0gKiAgMikgQWR2YW5jZWQgc3RhdGUgbW9uaXRvcmluZzoNCi0gKiAgICAgVXNpbmcgdGhlIGZ1bmN0aW9uIEkyQ19HZXRMYXN0RXZlbnQoKSB3aGljaCByZXR1cm5zIHRoZSBpbWFnZSBvZiBib3RoIHN0YXR1cyANCi0gKiAgICAgcmVnaXN0ZXJzIGluIGEgc2luZ2xlIHdvcmQgKHVpbnQzMl90KSAoU3RhdHVzIFJlZ2lzdGVyIDIgdmFsdWUgaXMgc2hpZnRlZCBsZWZ0IA0KLSAqICAgICBieSAxNiBiaXRzIGFuZCBjb25jYXRlbmF0ZWQgdG8gU3RhdHVzIFJlZ2lzdGVyIDEpLg0KLSAqICAgICAtIFdoZW4gdG8gdXNlOg0KLSAqICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdGhlIHNhbWUgYXBwbGljYXRpb25zIGFib3ZlIGJ1dCBpdCBhbGxvd3MgdG8NCi0gKiAgICAgICAgIG92ZXJjb21lIHRoZSBtZW50aW9ubmVkIGxpbWl0YXRpb24gb2YgSTJDX0dldEZsYWdTdGF0dXMoKSBmdW5jdGlvbi4NCi0gKiAgICAgICAgIFRoZSByZXR1cm5lZCB2YWx1ZSBjb3VsZCBiZSBjb21wYXJlZCB0byBldmVudHMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSANCi0gKiAgICAgICAgIGxpYnJhcnkgKHN0bTMyZjEweF9pMmMuaCkgb3IgdG8gY3VzdG9tIHZhbHVlcyBkZWZpZW5kIGJ5IHVzZXIuDQotICogICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIHdoZW4gbXVsdGlwbGUgZmxhZ3MgYXJlIG1vbml0b3JlZCBhdCB0aGUgc2FtZSB0aW1lLg0KLSAqICAgICAgIC0gQXQgdGhlIG9wcG9zaXRlIG9mIEkyQ19DaGVja0V2ZW50KCkgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzZXIgdG8NCi0gKiAgICAgICAgIGNob29zZSB3aGVuIGFuIGV2ZW50IGlzIGFjY2VwdGVkICh3aGVuIGFsbCBldmVudHMgZmxhZ3MgYXJlIHNldCBhbmQgbm8gDQotICogICAgICAgICBvdGhlciBmbGFncyBhcmUgc2V0IG9yIGp1c3Qgd2hlbiB0aGUgbmVlZGVkIGZsYWdzIGFyZSBzZXQgbGlrZSANCi0gKiAgICAgICAgIEkyQ19DaGVja0V2ZW50KCkgZnVuY3Rpb24pLg0KLSAqICAgICAtIExpbWl0YXRpb25zOg0KLSAqICAgICAgIC0gVXNlciBtYXkgbmVlZCB0byBkZWZpbmUgaGlzIG93biBldmVudHMuDQotICogICAgICAgLSBTYW1lIHJlbWFyayBjb25jZXJuaW5nIHRoZSBlcnJvciBtYW5hZ2VtZW50IGlzIGFwcGxpY2FibGUgZm9yIHRoaXMgDQotICogICAgICAgICBmdW5jdGlvbiBpZiB1c2VyIGRlY2lkZXMgdG8gY2hlY2sgb25seSByZWd1bGFyIGNvbW11bmljYXRpb24gZmxhZ3MgKGFuZCANCi0gKiAgICAgICAgIGlnbm9yZXMgZXJyb3IgZmxhZ3MpLg0KLSAqICAgICANCi0gKg0KLSAqICAzKSBGbGFnLWJhc2VkIHN0YXRlIG1vbml0b3Jpbmc6DQotICogICAgIFVzaW5nIHRoZSBmdW5jdGlvbiBJMkNfR2V0RmxhZ1N0YXR1cygpIHdoaWNoIHNpbXBseSByZXR1cm5zIHRoZSBzdGF0dXMgb2YgDQotICogICAgIG9uZSBzaW5nbGUgZmxhZyAoaWUuIEkyQ19GTEFHX1JYTkUgLi4uKS4gDQotICogICAgIC0gV2hlbiB0byB1c2U6DQotICogICAgICAgIC0gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIGZvciBzcGVjaWZpYyBhcHBsaWNhdGlvbnMgb3IgaW4gZGVidWcgcGhhc2UuDQotICogICAgICAgIC0gSXQgaXMgc3VpdGFibGUgd2hlbiBvbmx5IG9uZSBmbGFnIGNoZWNraW5nIGlzIG5lZWRlZCAobW9zdCBJMkMgZXZlbnRzIA0KLSAqICAgICAgICAgIGFyZSBtb25pdG9yZWQgdGhyb3VnaCBtdWx0aXBsZSBmbGFncykuDQotICogICAgIC0gTGltaXRhdGlvbnM6IA0KLSAqICAgICAgICAtIFdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgU3RhdHVzIHJlZ2lzdGVyIGlzIGFjY2Vzc2VkLiBTb21lIGZsYWdzIGFyZQ0KLSAqICAgICAgICAgIGNsZWFyZWQgd2hlbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIGlzIGFjY2Vzc2VkLiBTbyBjaGVja2luZyB0aGUgc3RhdHVzDQotICogICAgICAgICAgb2Ygb25lIEZsYWcsIG1heSBjbGVhciBvdGhlciBvbmVzLg0KLSAqICAgICAgICAtIEZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCB0d2ljZSBvciBtb3JlIGluIG9yZGVyIHRvIG1vbml0b3Igb25lIA0KLSAqICAgICAgICAgIHNpbmdsZSBldmVudC4NCi0gKg0KLSAqICBGb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgRXZlbnRzLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiBJMkNfRXZlbnRzIGluIA0KLSAqICBzdG0zMmYxMHhfaTJjLmggZmlsZS4NCi0gKiAgDQotICovDQotDQotLyoqDQotICogDQotICogIDEpIEJhc2ljIHN0YXRlIG1vbml0b3JpbmcNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBsYXN0IEkyQ3ggRXZlbnQgaXMgZXF1YWwgdG8gdGhlIG9uZSBwYXNzZWQNCi0gICogICBhcyBwYXJhbWV0ZXIuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgSTJDX0VWRU5UOiBzcGVjaWZpZXMgdGhlIGV2ZW50IHRvIGJlIGNoZWNrZWQuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9UUkFOU01JVFRFUl9BRERSRVNTX01BVENIRUQgICAgICAgICAgIDogRVYxDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9SRUNFSVZFUl9BRERSRVNTX01BVENIRUQgICAgICAgICAgICAgIDogRVYxDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9UUkFOU01JVFRFUl9TRUNPTkRBRERSRVNTX01BVENIRUQgICAgIDogRVYxDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9SRUNFSVZFUl9TRUNPTkRBRERSRVNTX01BVENIRUQgICAgICAgIDogRVYxDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9HRU5FUkFMQ0FMTEFERFJFU1NfTUFUQ0hFRCAgICAgICAgICAgIDogRVYxDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9CWVRFX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgICAgIDogRVYyDQotICAqICAgICBAYXJnIChJMkNfRVZFTlRfU0xBVkVfQllURV9SRUNFSVZFRCB8IEkyQ19GTEFHX0RVQUxGKSAgICAgIDogRVYyDQotICAqICAgICBAYXJnIChJMkNfRVZFTlRfU0xBVkVfQllURV9SRUNFSVZFRCB8IEkyQ19GTEFHX0dFTkNBTEwpICAgIDogRVYyDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9CWVRFX1RSQU5TTUlUVEVEICAgICAgICAgICAgICAgICAgICAgIDogRVYzDQotICAqICAgICBAYXJnIChJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRCB8IEkyQ19GTEFHX0RVQUxGKSAgIDogRVYzDQotICAqICAgICBAYXJnIChJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRCB8IEkyQ19GTEFHX0dFTkNBTEwpIDogRVYzDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9BQ0tfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRVYzXzINCi0gICogICAgIEBhcmcgSTJDX0VWRU5UX1NMQVZFX1NUT1BfREVURUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVjQNCi0gICogICAgIEBhcmcgSTJDX0VWRU5UX01BU1RFUl9NT0RFX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVjUNCi0gICogICAgIEBhcmcgSTJDX0VWRU5UX01BU1RFUl9UUkFOU01JVFRFUl9NT0RFX1NFTEVDVEVEICAgICAgICAgICAgOiBFVjYgICAgIA0KLSAgKiAgICAgQGFyZyBJMkNfRVZFTlRfTUFTVEVSX1JFQ0VJVkVSX01PREVfU0VMRUNURUQgICAgICAgICAgICAgICA6IEVWNg0KLSAgKiAgICAgQGFyZyBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICA6IEVWNw0KLSAgKiAgICAgQGFyZyBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfVFJBTlNNSVRUSU5HICAgICAgICAgICAgICAgICAgICA6IEVWOA0KLSAgKiAgICAgQGFyZyBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfVFJBTlNNSVRURUQgICAgICAgICAgICAgICAgICAgICA6IEVWOF8yDQotICAqICAgICBAYXJnIEkyQ19FVkVOVF9NQVNURVJfTU9ERV9BRERSRVNTMTAgICAgICAgICAgICAgICAgICAgICAgIDogRVY5DQotICAqICAgICANCi0gICogQG5vdGU6IEZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBFdmVudHMsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIA0KLSAgKiAgICBJMkNfRXZlbnRzIGluIHN0bTMyZjEweF9pMmMuaCBmaWxlLg0KLSAgKiAgICANCi0gICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtdXJhdGlvbiB2YWx1ZToNCi0gICogLSBTVUNDRVNTOiBMYXN0IGV2ZW50IGlzIGVxdWFsIHRvIHRoZSBJMkNfRVZFTlQNCi0gICogLSBFUlJPUjogTGFzdCBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSTJDX0VWRU5UDQotICAqLw0KLUVycm9yU3RhdHVzIEkyQ19DaGVja0V2ZW50KEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfRVZFTlQpDQotew0KLSAgdWludDMyX3QgbGFzdGV2ZW50ID0gMDsNCi0gIHVpbnQzMl90IGZsYWcxID0gMCwgZmxhZzIgPSAwOw0KLSAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19JMkNfRVZFTlQoSTJDX0VWRU5UKSk7DQotDQotICAvKiBSZWFkIHRoZSBJMkN4IHN0YXR1cyByZWdpc3RlciAqLw0KLSAgZmxhZzEgPSBJMkN4LT5TUjE7DQotICBmbGFnMiA9IEkyQ3gtPlNSMjsNCi0gIGZsYWcyID0gZmxhZzIgPDwgMTY7DQotDQotICAvKiBHZXQgdGhlIGxhc3QgZXZlbnQgdmFsdWUgZnJvbSBJMkMgc3RhdHVzIHJlZ2lzdGVyICovDQotICBsYXN0ZXZlbnQgPSAoZmxhZzEgfCBmbGFnMikgJiBGTEFHX01hc2s7DQotDQotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBsYXN0IGV2ZW50IGNvbnRhaW5zIHRoZSBJMkNfRVZFTlQgKi8NCi0gIGlmICgobGFzdGV2ZW50ICYgSTJDX0VWRU5UKSA9PSBJMkNfRVZFTlQpDQotICB7DQotICAgIC8qIFNVQ0NFU1M6IGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQotICAgIHN0YXR1cyA9IFNVQ0NFU1M7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIEVSUk9SOiBsYXN0IGV2ZW50IGlzIGRpZmZlcmVudCBmcm9tIEkyQ19FVkVOVCAqLw0KLSAgICBzdGF0dXMgPSBFUlJPUjsNCi0gIH0NCi0gIC8qIFJldHVybiBzdGF0dXMgKi8NCi0gIHJldHVybiBzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAqIA0KLSAqICAyKSBBZHZhbmNlZCBzdGF0ZSBtb25pdG9yaW5nDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IEkyQ3ggRXZlbnQuDQotICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQotICAqICAgICANCi0gICogQG5vdGU6IEZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBFdmVudHMsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIA0KLSAgKiAgICBJMkNfRXZlbnRzIGluIHN0bTMyZjEweF9pMmMuaCBmaWxlLg0KLSAgKiAgICANCi0gICogQHJldHZhbCBUaGUgbGFzdCBldmVudA0KLSAgKi8NCi11aW50MzJfdCBJMkNfR2V0TGFzdEV2ZW50KEkyQ19UeXBlRGVmKiBJMkN4KQ0KLXsNCi0gIHVpbnQzMl90IGxhc3RldmVudCA9IDA7DQotICB1aW50MzJfdCBmbGFnMSA9IDAsIGZsYWcyID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KLQ0KLSAgLyogUmVhZCB0aGUgSTJDeCBzdGF0dXMgcmVnaXN0ZXIgKi8NCi0gIGZsYWcxID0gSTJDeC0+U1IxOw0KLSAgZmxhZzIgPSBJMkN4LT5TUjI7DQotICBmbGFnMiA9IGZsYWcyIDw8IDE2Ow0KLQ0KLSAgLyogR2V0IHRoZSBsYXN0IGV2ZW50IHZhbHVlIGZyb20gSTJDIHN0YXR1cyByZWdpc3RlciAqLw0KLSAgbGFzdGV2ZW50ID0gKGZsYWcxIHwgZmxhZzIpICYgRkxBR19NYXNrOw0KLQ0KLSAgLyogUmV0dXJuIHN0YXR1cyAqLw0KLSAgcmV0dXJuIGxhc3RldmVudDsNCi19DQotDQotLyoqDQotICogDQotICogIDMpIEZsYWctYmFzZWQgc3RhdGUgbW9uaXRvcmluZw0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICovDQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBJMkMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIEkyQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIEkyQ19GTEFHX0RVQUxGOiBEdWFsIGZsYWcgKFNsYXZlIG1vZGUpDQotICAqICAgICBAYXJnIEkyQ19GTEFHX1NNQkhPU1Q6IFNNQnVzIGhvc3QgaGVhZGVyIChTbGF2ZSBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19TTUJERUZBVUxUOiBTTUJ1cyBkZWZhdWx0IGhlYWRlciAoU2xhdmUgbW9kZSkNCi0gICogICAgIEBhcmcgSTJDX0ZMQUdfR0VOQ0FMTDogR2VuZXJhbCBjYWxsIGhlYWRlciBmbGFnIChTbGF2ZSBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19UUkE6IFRyYW5zbWl0dGVyL1JlY2VpdmVyIGZsYWcNCi0gICogICAgIEBhcmcgSTJDX0ZMQUdfQlVTWTogQnVzIGJ1c3kgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19NU0w6IE1hc3Rlci9TbGF2ZSBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX1NNQkFMRVJUOiBTTUJ1cyBBbGVydCBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX1RJTUVPVVQ6IFRpbWVvdXQgb3IgVGxvdyBlcnJvciBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX1BFQ0VSUjogUEVDIGVycm9yIGluIHJlY2VwdGlvbiBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX09WUjogT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChTbGF2ZSBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX0FSTE86IEFyYml0cmF0aW9uIGxvc3QgZmxhZyAoTWFzdGVyIG1vZGUpDQotICAqICAgICBAYXJnIEkyQ19GTEFHX0JFUlI6IEJ1cyBlcnJvciBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX1RYRTogRGF0YSByZWdpc3RlciBlbXB0eSBmbGFnIChUcmFuc21pdHRlcikNCi0gICogICAgIEBhcmcgSTJDX0ZMQUdfUlhORTogRGF0YSByZWdpc3RlciBub3QgZW1wdHkgKFJlY2VpdmVyKSBmbGFnDQotICAqICAgICBAYXJnIEkyQ19GTEFHX1NUT1BGOiBTdG9wIGRldGVjdGlvbiBmbGFnIChTbGF2ZSBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19BREQxMDogMTAtYml0IGhlYWRlciBzZW50IGZsYWcgKE1hc3RlciBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19CVEY6IEJ5dGUgdHJhbnNmZXIgZmluaXNoZWQgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19BRERSOiBBZGRyZXNzIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpIJNBRFNMlA0KLSAgKiAgIEFkZHJlc3MgbWF0Y2hlZCBmbGFnIChTbGF2ZSBtb2RlKZRFTkRBRJQNCi0gICogICAgIEBhcmcgSTJDX0ZMQUdfU0I6IFN0YXJ0IGJpdCBmbGFnIChNYXN0ZXIgbW9kZSkNCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEkyQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIEkyQ19HZXRGbGFnU3RhdHVzKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfRkxBRykNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgX19JTyB1aW50MzJfdCBpMmNyZWcgPSAwLCBpMmN4YmFzZSA9IDA7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19JMkNfR0VUX0ZMQUcoSTJDX0ZMQUcpKTsNCi0NCi0gIC8qIEdldCB0aGUgSTJDeCBwZXJpcGhlcmFsIGJhc2UgYWRkcmVzcyAqLw0KLSAgaTJjeGJhc2UgPSAodWludDMyX3QpSTJDeDsNCi0gIA0KLSAgLyogUmVhZCBmbGFnIHJlZ2lzdGVyIGluZGV4ICovDQotICBpMmNyZWcgPSBJMkNfRkxBRyA+PiAyODsNCi0gIA0KLSAgLyogR2V0IGJpdFsyMzowXSBvZiB0aGUgZmxhZyAqLw0KLSAgSTJDX0ZMQUcgJj0gRkxBR19NYXNrOw0KLSAgDQotICBpZihpMmNyZWcgIT0gMCkNCi0gIHsNCi0gICAgLyogR2V0IHRoZSBJMkN4IFNSMSByZWdpc3RlciBhZGRyZXNzICovDQotICAgIGkyY3hiYXNlICs9IDB4MTQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIEZsYWcgaW4gSTJDeCBTUjIgUmVnaXN0ZXIgKi8NCi0gICAgSTJDX0ZMQUcgPSAodWludDMyX3QpKEkyQ19GTEFHID4+IDE2KTsNCi0gICAgLyogR2V0IHRoZSBJMkN4IFNSMiByZWdpc3RlciBhZGRyZXNzICovDQotICAgIGkyY3hiYXNlICs9IDB4MTg7DQotICB9DQotICANCi0gIGlmKCgoKihfX0lPIHVpbnQzMl90ICopaTJjeGJhc2UpICYgSTJDX0ZMQUcpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsNCi0gICAgLyogSTJDX0ZMQUcgaXMgc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogSTJDX0ZMQUcgaXMgcmVzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICANCi0gIC8qIFJldHVybiB0aGUgSTJDX0ZMQUcgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotDQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBJMkN4J3MgcGVuZGluZyBmbGFncy4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBJMkNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19QRUNFUlI6IFBFQyBlcnJvciBpbiByZWNlcHRpb24gZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCi0gICogICAgIEBhcmcgSTJDX0ZMQUdfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19BUkxPOiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcgKE1hc3RlciBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZw0KLSAgKiAgIA0KLSAgKiBAbm90ZQ0KLSAgKiAgIC0gU1RPUEYgKFNUT1AgZGV0ZWN0aW9uKSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIA0KLSAgKiAgICAgdG8gSTJDX1NSMSByZWdpc3RlciAoSTJDX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSBvcGVyYXRpb24gDQotICAqICAgICB0byBJMkNfQ1IxIHJlZ2lzdGVyIChJMkNfQ21kKCkgdG8gcmUtZW5hYmxlIHRoZSBJMkMgcGVyaXBoZXJhbCkuDQotICAqICAgLSBBREQxMCAoMTAtYml0IGhlYWRlciBzZW50KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgDQotICAqICAgICBvcGVyYXRpb24gdG8gSTJDX1NSMSAoSTJDX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgd3JpdGluZyB0aGUgDQotICAqICAgICBzZWNvbmQgYnl0ZSBvZiB0aGUgYWRkcmVzcyBpbiBEUiByZWdpc3Rlci4NCi0gICogICAtIEJURiAoQnl0ZSBUcmFuc2ZlciBGaW5pc2hlZCkgaXMgY2xlYXJlZCBieSBzb2Z0d2FyZSBzZXF1ZW5jZTogYSByZWFkIA0KLSAgKiAgICAgb3BlcmF0aW9uIHRvIEkyQ19TUjEgcmVnaXN0ZXIgKEkyQ19HZXRGbGFnU3RhdHVzKCkpIGZvbGxvd2VkIGJ5IGEgDQotICAqICAgICByZWFkL3dyaXRlIHRvIEkyQ19EUiByZWdpc3RlciAoSTJDX1NlbmREYXRhKCkpLg0KLSAgKiAgIC0gQUREUiAoQWRkcmVzcyBzZW50KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIA0KLSAgKiAgICAgSTJDX1NSMSByZWdpc3RlciAoSTJDX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSByZWFkIG9wZXJhdGlvbiB0byANCi0gICogICAgIEkyQ19TUjIgcmVnaXN0ZXIgKCh2b2lkKShJMkN4LT5TUjIpKS4NCi0gICogICAtIFNCIChTdGFydCBCaXQpIGlzIGNsZWFyZWQgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gSTJDX1NSMQ0KLSAgKiAgICAgcmVnaXN0ZXIgKEkyQ19HZXRGbGFnU3RhdHVzKCkpIGZvbGxvd2VkIGJ5IGEgd3JpdGUgb3BlcmF0aW9uIHRvIEkyQ19EUg0KLSAgKiAgICAgcmVnaXN0ZXIgIChJMkNfU2VuZERhdGEoKSkuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyQ19DbGVhckZsYWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQzMl90IEkyQ19GTEFHKQ0KLXsNCi0gIHVpbnQzMl90IGZsYWdwb3MgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0NMRUFSX0ZMQUcoSTJDX0ZMQUcpKTsNCi0gIC8qIEdldCB0aGUgSTJDIGZsYWcgcG9zaXRpb24gKi8NCi0gIGZsYWdwb3MgPSBJMkNfRkxBRyAmIEZMQUdfTWFzazsNCi0gIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBJMkMgZmxhZyAqLw0KLSAgSTJDeC0+U1IxID0gKHVpbnQxNl90KX5mbGFncG9zOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBJMkNfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgSTJDX0lUX1NNQkFMRVJUOiBTTUJ1cyBBbGVydCBmbGFnDQotICAqICAgICBAYXJnIEkyQ19JVF9USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfSVRfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uIGZsYWcNCi0gICogICAgIEBhcmcgSTJDX0lUX09WUjogT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChTbGF2ZSBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfSVRfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KLSAgKiAgICAgQGFyZyBJMkNfSVRfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBmbGFnIChNYXN0ZXIgbW9kZSkNCi0gICogICAgIEBhcmcgSTJDX0lUX0JFUlI6IEJ1cyBlcnJvciBmbGFnDQotICAqICAgICBAYXJnIEkyQ19JVF9UWEU6IERhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAoVHJhbnNtaXR0ZXIpDQotICAqICAgICBAYXJnIEkyQ19JVF9SWE5FOiBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAoUmVjZWl2ZXIpIGZsYWcNCi0gICogICAgIEBhcmcgSTJDX0lUX1NUT1BGOiBTdG9wIGRldGVjdGlvbiBmbGFnIChTbGF2ZSBtb2RlKQ0KLSAgKiAgICAgQGFyZyBJMkNfSVRfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCi0gICogICAgIEBhcmcgSTJDX0lUX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnDQotICAqICAgICBAYXJnIEkyQ19JVF9BRERSOiBBZGRyZXNzIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpIJNBRFNMlA0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXRjaGVkIGZsYWcgKFNsYXZlIG1vZGUplEVOREFElA0KLSAgKiAgICAgQGFyZyBJMkNfSVRfU0I6IFN0YXJ0IGJpdCBmbGFnIChNYXN0ZXIgbW9kZSkNCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEkyQ19JVCAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotSVRTdGF0dXMgSTJDX0dldElUU3RhdHVzKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfSVQpDQotew0KLSAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICB1aW50MzJfdCBlbmFibGVzdGF0dXMgPSAwOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJDX0dFVF9JVChJMkNfSVQpKTsNCi0NCi0gIC8qIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90ICovDQotICBlbmFibGVzdGF0dXMgPSAodWludDMyX3QpKCgoSTJDX0lUICYgSVRFTl9NYXNrKSA+PiAxNikgJiAoSTJDeC0+Q1IyKSkgOw0KLSAgDQotICAvKiBHZXQgYml0WzIzOjBdIG9mIHRoZSBmbGFnICovDQotICBJMkNfSVQgJj0gRkxBR19NYXNrOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnICovDQotICBpZiAoKChJMkN4LT5TUjEgJiBJMkNfSVQpICE9ICh1aW50MzJfdClSRVNFVCkgJiYgZW5hYmxlc3RhdHVzKQ0KLSAgew0KLSAgICAvKiBJMkNfSVQgaXMgc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogSTJDX0lUIGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBJMkNfSVQgc3RhdHVzICovDQotICByZXR1cm4gIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBJMkN4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBJMkNfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBJMkNfSVRfU01CQUxFUlQ6IFNNQnVzIEFsZXJ0IGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBJMkNfSVRfVElNRU9VVDogVGltZW91dCBvciBUbG93IGVycm9yIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBJMkNfSVRfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uICBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgSTJDX0lUX09WUjogT3ZlcnJ1bi9VbmRlcnJ1biBpbnRlcnJ1cHQgKFNsYXZlIG1vZGUpDQotICAqICAgICBAYXJnIEkyQ19JVF9BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgSTJDX0lUX0FSTE86IEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IChNYXN0ZXIgbW9kZSkNCi0gICogICAgIEBhcmcgSTJDX0lUX0JFUlI6IEJ1cyBlcnJvciBpbnRlcnJ1cHQNCi0gICogICANCi0gICogQG5vdGUNCi0gICogICAtIFNUT1BGIChTVE9QIGRldGVjdGlvbikgaXMgY2xlYXJlZCBieSBzb2Z0d2FyZSBzZXF1ZW5jZTogYSByZWFkIG9wZXJhdGlvbiANCi0gICogICAgIHRvIEkyQ19TUjEgcmVnaXN0ZXIgKEkyQ19HZXRJVFN0YXR1cygpKSBmb2xsb3dlZCBieSBhIHdyaXRlIG9wZXJhdGlvbiB0byANCi0gICogICAgIEkyQ19DUjEgcmVnaXN0ZXIgKEkyQ19DbWQoKSB0byByZS1lbmFibGUgdGhlIEkyQyBwZXJpcGhlcmFsKS4NCi0gICogICAtIEFERDEwICgxMC1iaXQgaGVhZGVyIHNlbnQpIGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCANCi0gICogICAgIG9wZXJhdGlvbiB0byBJMkNfU1IxIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgd3JpdGluZyB0aGUgc2Vjb25kIA0KLSAgKiAgICAgYnl0ZSBvZiB0aGUgYWRkcmVzcyBpbiBJMkNfRFIgcmVnaXN0ZXIuDQotICAqICAgLSBCVEYgKEJ5dGUgVHJhbnNmZXIgRmluaXNoZWQpIGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCANCi0gICogICAgIG9wZXJhdGlvbiB0byBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSANCi0gICogICAgIHJlYWQvd3JpdGUgdG8gSTJDX0RSIHJlZ2lzdGVyIChJMkNfU2VuZERhdGEoKSkuDQotICAqICAgLSBBRERSIChBZGRyZXNzIHNlbnQpIGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gDQotICAqICAgICBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSByZWFkIG9wZXJhdGlvbiB0byANCi0gICogICAgIEkyQ19TUjIgcmVnaXN0ZXIgKCh2b2lkKShJMkN4LT5TUjIpKS4NCi0gICogICAtIFNCIChTdGFydCBCaXQpIGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gDQotICAqICAgICBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSBvcGVyYXRpb24gdG8gDQotICAqICAgICBJMkNfRFIgcmVnaXN0ZXIgKEkyQ19TZW5kRGF0YSgpKS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgSTJDX0NsZWFySVRQZW5kaW5nQml0KEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfSVQpDQotew0KLSAgdWludDMyX3QgZmxhZ3BvcyA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCi0gIGFzc2VydF9wYXJhbShJU19JMkNfQ0xFQVJfSVQoSTJDX0lUKSk7DQotICAvKiBHZXQgdGhlIEkyQyBmbGFnIHBvc2l0aW9uICovDQotICBmbGFncG9zID0gSTJDX0lUICYgRkxBR19NYXNrOw0KLSAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIEkyQyBmbGFnICovDQotICBJMkN4LT5TUjEgPSAodWludDE2X3QpfmZsYWdwb3M7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfaXdkZy5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfaXdkZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM4Y2YzLi4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X2l3ZGcuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfaXdkZy5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIElXREcgZmlybXdhcmUgZnVuY3Rpb25zLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4X2l3ZGcuaCINCi0NCi0vKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCi0gICogQHsNCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJV0RHIA0KLSAgKiBAYnJpZWYgSVdERyBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJV0RHIHJlZ2lzdGVycyBiaXQgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBLUiByZWdpc3RlciBiaXQgbWFzayAqLw0KLSNkZWZpbmUgS1JfS0VZX1JlbG9hZCAgICAoKHVpbnQxNl90KTB4QUFBQSkNCi0jZGVmaW5lIEtSX0tFWV9FbmFibGUgICAgKCh1aW50MTZfdCkweENDQ0MpDQotDQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIElXREdfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgSVdER19Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIElXREdfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiBhbmQgSVdER19STFIgcmVnaXN0ZXJzLg0KLSAgKiBAcGFyYW0gIElXREdfV3JpdGVBY2Nlc3M6IG5ldyBzdGF0ZSBvZiB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiBhbmQgSVdER19STFIgcmVnaXN0ZXJzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIElXREdfV3JpdGVBY2Nlc3NfRW5hYmxlOiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIgYW5kIElXREdfUkxSIHJlZ2lzdGVycw0KLSAgKiAgICAgQGFyZyBJV0RHX1dyaXRlQWNjZXNzX0Rpc2FibGU6IERpc2FibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIgYW5kIElXREdfUkxSIHJlZ2lzdGVycw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJV0RHX1dyaXRlQWNjZXNzQ21kKHVpbnQxNl90IElXREdfV3JpdGVBY2Nlc3MpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19JV0RHX1dSSVRFX0FDQ0VTUyhJV0RHX1dyaXRlQWNjZXNzKSk7DQotICBJV0RHLT5LUiA9IElXREdfV3JpdGVBY2Nlc3M7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgSVdERyBQcmVzY2FsZXIgdmFsdWUuDQotICAqIEBwYXJhbSAgSVdER19QcmVzY2FsZXI6IHNwZWNpZmllcyB0aGUgSVdERyBQcmVzY2FsZXIgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgSVdER19QcmVzY2FsZXJfNDogSVdERyBwcmVzY2FsZXIgc2V0IHRvIDQNCi0gICogICAgIEBhcmcgSVdER19QcmVzY2FsZXJfODogSVdERyBwcmVzY2FsZXIgc2V0IHRvIDgNCi0gICogICAgIEBhcmcgSVdER19QcmVzY2FsZXJfMTY6IElXREcgcHJlc2NhbGVyIHNldCB0byAxNg0KLSAgKiAgICAgQGFyZyBJV0RHX1ByZXNjYWxlcl8zMjogSVdERyBwcmVzY2FsZXIgc2V0IHRvIDMyDQotICAqICAgICBAYXJnIElXREdfUHJlc2NhbGVyXzY0OiBJV0RHIHByZXNjYWxlciBzZXQgdG8gNjQNCi0gICogICAgIEBhcmcgSVdER19QcmVzY2FsZXJfMTI4OiBJV0RHIHByZXNjYWxlciBzZXQgdG8gMTI4DQotICAqICAgICBAYXJnIElXREdfUHJlc2NhbGVyXzI1NjogSVdERyBwcmVzY2FsZXIgc2V0IHRvIDI1Ng0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJV0RHX1NldFByZXNjYWxlcih1aW50OF90IElXREdfUHJlc2NhbGVyKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSVdER19QUkVTQ0FMRVIoSVdER19QcmVzY2FsZXIpKTsNCi0gIElXREctPlBSID0gSVdER19QcmVzY2FsZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgSVdERyBSZWxvYWQgdmFsdWUuDQotICAqIEBwYXJhbSAgUmVsb2FkOiBzcGVjaWZpZXMgdGhlIElXREcgUmVsb2FkIHZhbHVlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweDBGRkYuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIElXREdfU2V0UmVsb2FkKHVpbnQxNl90IFJlbG9hZCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0lXREdfUkVMT0FEKFJlbG9hZCkpOw0KLSAgSVdERy0+UkxSID0gUmVsb2FkOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3Rlcg0KLSAgKiAgICh3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiBhbmQgSVdER19STFIgcmVnaXN0ZXJzIGRpc2FibGVkKS4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIElXREdfUmVsb2FkQ291bnRlcih2b2lkKQ0KLXsNCi0gIElXREctPktSID0gS1JfS0VZX1JlbG9hZDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBJV0RHICh3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiBhbmQgSVdER19STFIgcmVnaXN0ZXJzIGRpc2FibGVkKS4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIElXREdfRW5hYmxlKHZvaWQpDQotew0KLSAgSVdERy0+S1IgPSBLUl9LRVlfRW5hYmxlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIElXREcgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIElXREdfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIElXREdfRkxBR19QVlU6IFByZXNjYWxlciBWYWx1ZSBVcGRhdGUgb24gZ29pbmcNCi0gICogICAgIEBhcmcgSVdER19GTEFHX1JWVTogUmVsb2FkIFZhbHVlIFVwZGF0ZSBvbiBnb2luZw0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgSVdER19GTEFHIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIElXREdfR2V0RmxhZ1N0YXR1cyh1aW50MTZfdCBJV0RHX0ZMQUcpDQotew0KLSAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfSVdER19GTEFHKElXREdfRkxBRykpOw0KLSAgaWYgKChJV0RHLT5TUiAmIElXREdfRkxBRykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBmbGFnIHN0YXR1cyAqLw0KLSAgcmV0dXJuIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9wd3IuYyBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3B3ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVlZWMyLi4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3B3ci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9wd3IuYw0KLSAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KLSAgKiBAdmVyc2lvbiBWMy40LjANCi0gICogQGRhdGUgICAgMTAvMTUvMjAxMA0KLSAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBQV1IgZmlybXdhcmUgZnVuY3Rpb25zLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4X3B3ci5oIg0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSIA0KLSAgKiBAYnJpZWYgUFdSIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLyANCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiAtLS0tLS0tLS0gUFdSIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uIC0tLS0tLS0tLS0gKi8NCi0jZGVmaW5lIFBXUl9PRkZTRVQgICAgICAgICAgICAgICAoUFdSX0JBU0UgLSBQRVJJUEhfQkFTRSkNCi0NCi0vKiAtLS0gQ1IgUmVnaXN0ZXIgLS0tKi8NCi0NCi0vKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgREJQIGJpdCAqLw0KLSNkZWZpbmUgQ1JfT0ZGU0VUICAgICAgICAgICAgICAgIChQV1JfT0ZGU0VUICsgMHgwMCkNCi0jZGVmaW5lIERCUF9CaXROdW1iZXIgICAgICAgICAgICAweDA4DQotI2RlZmluZSBDUl9EQlBfQkIgICAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSX09GRlNFVCAqIDMyKSArIChEQlBfQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFBWREUgYml0ICovDQotI2RlZmluZSBQVkRFX0JpdE51bWJlciAgICAgICAgICAgMHgwNA0KLSNkZWZpbmUgQ1JfUFZERV9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUl9PRkZTRVQgKiAzMikgKyAoUFZERV9CaXROdW1iZXIgKiA0KSkNCi0NCi0vKiAtLS0gQ1NSIFJlZ2lzdGVyIC0tLSovDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEVXVVAgYml0ICovDQotI2RlZmluZSBDU1JfT0ZGU0VUICAgICAgICAgICAgICAgKFBXUl9PRkZTRVQgKyAweDA0KQ0KLSNkZWZpbmUgRVdVUF9CaXROdW1iZXIgICAgICAgICAgIDB4MDgNCi0jZGVmaW5lIENTUl9FV1VQX0JCICAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1NSX09GRlNFVCAqIDMyKSArIChFV1VQX0JpdE51bWJlciAqIDQpKQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLSBQV1IgcmVnaXN0ZXJzIGJpdCBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIENSIHJlZ2lzdGVyIGJpdCBtYXNrICovDQotI2RlZmluZSBDUl9EU19NQVNLICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkZDKQ0KLSNkZWZpbmUgQ1JfUExTX01BU0sgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkYxRikNCi0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfUHJpdmF0ZV9NYWNyb3MNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUFdSX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFBXUl9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBQV1JfUHJpdmF0ZV9GdW5jdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgUFdSIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgUFdSX0RlSW5pdCh2b2lkKQ0KLXsNCi0gIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfUFdSLCBFTkFCTEUpOw0KLSAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9QV1IsIERJU0FCTEUpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIGFjY2VzcyB0byB0aGUgUlRDIGFuZCBiYWNrdXAgcmVnaXN0ZXJzLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIGFjY2VzcyB0byB0aGUgUlRDIGFuZCBiYWNrdXAgcmVnaXN0ZXJzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFBXUl9CYWNrdXBBY2Nlc3NDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgKihfX0lPIHVpbnQzMl90ICopIENSX0RCUF9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcihQVkQpLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBWRC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBQV1JfUFZEQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gICooX19JTyB1aW50MzJfdCAqKSBDUl9QVkRFX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB2b2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcihQVkQpLg0KLSAgKiBAcGFyYW0gIFBXUl9QVkRMZXZlbDogc3BlY2lmaWVzIHRoZSBQVkQgZGV0ZWN0aW9uIGxldmVsDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgUFdSX1BWRExldmVsXzJWMjogUFZEIGRldGVjdGlvbiBsZXZlbCBzZXQgdG8gMi4yVg0KLSAgKiAgICAgQGFyZyBQV1JfUFZETGV2ZWxfMlYzOiBQVkQgZGV0ZWN0aW9uIGxldmVsIHNldCB0byAyLjNWDQotICAqICAgICBAYXJnIFBXUl9QVkRMZXZlbF8yVjQ6IFBWRCBkZXRlY3Rpb24gbGV2ZWwgc2V0IHRvIDIuNFYNCi0gICogICAgIEBhcmcgUFdSX1BWRExldmVsXzJWNTogUFZEIGRldGVjdGlvbiBsZXZlbCBzZXQgdG8gMi41Vg0KLSAgKiAgICAgQGFyZyBQV1JfUFZETGV2ZWxfMlY2OiBQVkQgZGV0ZWN0aW9uIGxldmVsIHNldCB0byAyLjZWDQotICAqICAgICBAYXJnIFBXUl9QVkRMZXZlbF8yVjc6IFBWRCBkZXRlY3Rpb24gbGV2ZWwgc2V0IHRvIDIuN1YNCi0gICogICAgIEBhcmcgUFdSX1BWRExldmVsXzJWODogUFZEIGRldGVjdGlvbiBsZXZlbCBzZXQgdG8gMi44Vg0KLSAgKiAgICAgQGFyZyBQV1JfUFZETGV2ZWxfMlY5OiBQVkQgZGV0ZWN0aW9uIGxldmVsIHNldCB0byAyLjlWDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFBXUl9QVkRMZXZlbENvbmZpZyh1aW50MzJfdCBQV1JfUFZETGV2ZWwpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUFdSX1BWRF9MRVZFTChQV1JfUFZETGV2ZWwpKTsNCi0gIHRtcHJlZyA9IFBXUi0+Q1I7DQotICAvKiBDbGVhciBQTFNbNzo1XSBiaXRzICovDQotICB0bXByZWcgJj0gQ1JfUExTX01BU0s7DQotICAvKiBTZXQgUExTWzc6NV0gYml0cyBhY2NvcmRpbmcgdG8gUFdSX1BWRExldmVsIHZhbHVlICovDQotICB0bXByZWcgfD0gUFdSX1BWRExldmVsOw0KLSAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLw0KLSAgUFdSLT5DUiA9IHRtcHJlZzsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgV2FrZVVwIFBpbiBmdW5jdGlvbmFsaXR5Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFdha2VVcCBQaW4gZnVuY3Rpb25hbGl0eS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBQV1JfV2FrZVVwUGluQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gICooX19JTyB1aW50MzJfdCAqKSBDU1JfRVdVUF9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW50ZXJzIFNUT1AgbW9kZS4NCi0gICogQHBhcmFtICBQV1JfUmVndWxhdG9yOiBzcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTVE9QIG1vZGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgUFdSX1JlZ3VsYXRvcl9PTjogU1RPUCBtb2RlIHdpdGggcmVndWxhdG9yIE9ODQotICAqICAgICBAYXJnIFBXUl9SZWd1bGF0b3JfTG93UG93ZXI6IFNUT1AgbW9kZSB3aXRoIHJlZ3VsYXRvciBpbiBsb3cgcG93ZXIgbW9kZQ0KLSAgKiBAcGFyYW0gIFBXUl9TVE9QRW50cnk6IHNwZWNpZmllcyBpZiBTVE9QIG1vZGUgaW4gZW50ZXJlZCB3aXRoIFdGSSBvciBXRkUgaW5zdHJ1Y3Rpb24uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgUFdSX1NUT1BFbnRyeV9XRkk6IGVudGVyIFNUT1AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbg0KLSAgKiAgICAgQGFyZyBQV1JfU1RPUEVudHJ5X1dGRTogZW50ZXIgU1RPUCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFBXUl9FbnRlclNUT1BNb2RlKHVpbnQzMl90IFBXUl9SZWd1bGF0b3IsIHVpbnQ4X3QgUFdSX1NUT1BFbnRyeSkNCi17DQotICB1aW50MzJfdCB0bXByZWcgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfUkVHVUxBVE9SKFBXUl9SZWd1bGF0b3IpKTsNCi0gIGFzc2VydF9wYXJhbShJU19QV1JfU1RPUF9FTlRSWShQV1JfU1RPUEVudHJ5KSk7DQotICANCi0gIC8qIFNlbGVjdCB0aGUgcmVndWxhdG9yIHN0YXRlIGluIFNUT1AgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgdG1wcmVnID0gUFdSLT5DUjsNCi0gIC8qIENsZWFyIFBERFMgYW5kIExQRFMgYml0cyAqLw0KLSAgdG1wcmVnICY9IENSX0RTX01BU0s7DQotICAvKiBTZXQgTFBEUyBiaXQgYWNjb3JkaW5nIHRvIFBXUl9SZWd1bGF0b3IgdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSBQV1JfUmVndWxhdG9yOw0KLSAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLw0KLSAgUFdSLT5DUiA9IHRtcHJlZzsNCi0gIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0NCLT5TQ1IgfD0gU0NCX1NDUl9TTEVFUERFRVA7DQotICANCi0gIC8qIFNlbGVjdCBTVE9QIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgaWYoUFdSX1NUT1BFbnRyeSA9PSBQV1JfU1RPUEVudHJ5X1dGSSkNCi0gIHsgICANCi0gICAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8NCi0gICAgX19XRkkoKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLw0KLSAgICBfX1dGRSgpOw0KLSAgfQ0KLSAgDQotICAvKiBSZXNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLw0KLSAgU0NCLT5TQ1IgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQKTsgIA0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbnRlcnMgU1RBTkRCWSBtb2RlLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgUFdSX0VudGVyU1RBTkRCWU1vZGUodm9pZCkNCi17DQotICAvKiBDbGVhciBXYWtlLXVwIGZsYWcgKi8NCi0gIFBXUi0+Q1IgfD0gUFdSX0NSX0NXVUY7DQotICAvKiBTZWxlY3QgU1RBTkRCWSBtb2RlICovDQotICBQV1ItPkNSIHw9IFBXUl9DUl9QRERTOw0KLSAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovDQotICBTQ0ItPlNDUiB8PSBTQ0JfU0NSX1NMRUVQREVFUDsNCi0vKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHN0b3JlIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCAqLw0KLSNpZiBkZWZpbmVkICggX19DQ19BUk0gICApDQotICBfX2ZvcmNlX3N0b3JlcygpOw0KLSNlbmRpZg0KLSAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8NCi0gIF9fV0ZJKCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUFdSIGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gICogQHBhcmFtICBQV1JfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFBXUl9GTEFHX1dVOiBXYWtlIFVwIGZsYWcNCi0gICogICAgIEBhcmcgUFdSX0ZMQUdfU0I6IFN0YW5kQnkgZmxhZw0KLSAgKiAgICAgQGFyZyBQV1JfRkxBR19QVkRPOiBQVkQgT3V0cHV0DQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBQV1JfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotRmxhZ1N0YXR1cyBQV1JfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBQV1JfRkxBRykNCi17DQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19QV1JfR0VUX0ZMQUcoUFdSX0ZMQUcpKTsNCi0gIA0KLSAgaWYgKChQV1ItPkNTUiAmIFBXUl9GTEFHKSAhPSAodWludDMyX3QpUkVTRVQpDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIGZsYWcgc3RhdHVzICovDQotICByZXR1cm4gYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIFBXUidzIHBlbmRpbmcgZmxhZ3MuDQotICAqIEBwYXJhbSAgUFdSX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBQV1JfRkxBR19XVTogV2FrZSBVcCBmbGFnDQotICAqICAgICBAYXJnIFBXUl9GTEFHX1NCOiBTdGFuZEJ5IGZsYWcNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgUFdSX0NsZWFyRmxhZyh1aW50MzJfdCBQV1JfRkxBRykNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1BXUl9DTEVBUl9GTEFHKFBXUl9GTEFHKSk7DQotICAgICAgICAgDQotICBQV1ItPkNSIHw9ICBQV1JfRkxBRyA8PCAyOw0KLX0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3J0Yy5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfcnRjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjlmNjQuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfcnRjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGZpbGUgICAgc3RtMzJmMTB4X3J0Yy5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFJUQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcnRjLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDIA0KLSAgKiBAYnJpZWYgUlRDIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KLSAgKiBAew0KLSAgKi8gDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0jZGVmaW5lIFJUQ19MU0JfTUFTSyAgICAgKCh1aW50MzJfdCkweDAwMDBGRkZGKSAgLyohPCBSVEMgTFNCIE1hc2sgKi8NCi0jZGVmaW5lIFBSTEhfTVNCX01BU0sgICAgKCh1aW50MzJfdCkweDAwMEYwMDAwKSAgLyohPCBSVEMgUHJlc2NhbGVyIE1TQiBNYXNrICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBSVENfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBSVEMgaW50ZXJydXB0cy4NCi0gICogQHBhcmFtICBSVENfSVQ6IHNwZWNpZmllcyB0aGUgUlRDIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFJUQ19JVF9PVzogT3ZlcmZsb3cgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFJUQ19JVF9BTFI6IEFsYXJtIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBSVENfSVRfU0VDOiBTZWNvbmQgaW50ZXJydXB0DQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFJUQyBpbnRlcnJ1cHRzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFJUQ19JVENvbmZpZyh1aW50MTZfdCBSVENfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1JUQ19JVChSVENfSVQpKTsgIA0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIFJUQy0+Q1JIIHw9IFJUQ19JVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgUlRDLT5DUkggJj0gKHVpbnQxNl90KX5SVENfSVQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVudGVycyB0aGUgUlRDIGNvbmZpZ3VyYXRpb24gbW9kZS4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFJUQ19FbnRlckNvbmZpZ01vZGUodm9pZCkNCi17DQotICAvKiBTZXQgdGhlIENORiBmbGFnIHRvIGVudGVyIGluIHRoZSBDb25maWd1cmF0aW9uIE1vZGUgKi8NCi0gIFJUQy0+Q1JMIHw9IFJUQ19DUkxfQ05GOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFeGl0cyBmcm9tIHRoZSBSVEMgY29uZmlndXJhdGlvbiBtb2RlLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgUlRDX0V4aXRDb25maWdNb2RlKHZvaWQpDQotew0KLSAgLyogUmVzZXQgdGhlIENORiBmbGFnIHRvIGV4aXQgZnJvbSB0aGUgQ29uZmlndXJhdGlvbiBNb2RlICovDQotICBSVEMtPkNSTCAmPSAodWludDE2X3QpfigodWludDE2X3QpUlRDX0NSTF9DTkYpOyANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgR2V0cyB0aGUgUlRDIGNvdW50ZXIgdmFsdWUuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIFJUQyBjb3VudGVyIHZhbHVlLg0KLSAgKi8NCi11aW50MzJfdCBSVENfR2V0Q291bnRlcih2b2lkKQ0KLXsNCi0gIHVpbnQxNl90IHRtcCA9IDA7DQotICB0bXAgPSBSVEMtPkNOVEw7DQotICByZXR1cm4gKCgodWludDMyX3QpUlRDLT5DTlRIIDw8IDE2ICkgfCB0bXApIDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgUlRDIGNvdW50ZXIgdmFsdWUuDQotICAqIEBwYXJhbSAgQ291bnRlclZhbHVlOiBSVEMgY291bnRlciBuZXcgdmFsdWUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFJUQ19TZXRDb3VudGVyKHVpbnQzMl90IENvdW50ZXJWYWx1ZSkNCi17IA0KLSAgUlRDX0VudGVyQ29uZmlnTW9kZSgpOw0KLSAgLyogU2V0IFJUQyBDT1VOVEVSIE1TQiB3b3JkICovDQotICBSVEMtPkNOVEggPSBDb3VudGVyVmFsdWUgPj4gMTY7DQotICAvKiBTZXQgUlRDIENPVU5URVIgTFNCIHdvcmQgKi8NCi0gIFJUQy0+Q05UTCA9IChDb3VudGVyVmFsdWUgJiBSVENfTFNCX01BU0spOw0KLSAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIFJUQyBwcmVzY2FsZXIgdmFsdWUuDQotICAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWU6IFJUQyBwcmVzY2FsZXIgbmV3IHZhbHVlLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBSVENfU2V0UHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUlRDX1BSRVNDQUxFUihQcmVzY2FsZXJWYWx1ZSkpOw0KLSAgDQotICBSVENfRW50ZXJDb25maWdNb2RlKCk7DQotICAvKiBTZXQgUlRDIFBSRVNDQUxFUiBNU0Igd29yZCAqLw0KLSAgUlRDLT5QUkxIID0gKFByZXNjYWxlclZhbHVlICYgUFJMSF9NU0JfTUFTSykgPj4gMTY7DQotICAvKiBTZXQgUlRDIFBSRVNDQUxFUiBMU0Igd29yZCAqLw0KLSAgUlRDLT5QUkxMID0gKFByZXNjYWxlclZhbHVlICYgUlRDX0xTQl9NQVNLKTsNCi0gIFJUQ19FeGl0Q29uZmlnTW9kZSgpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBSVEMgYWxhcm0gdmFsdWUuDQotICAqIEBwYXJhbSAgQWxhcm1WYWx1ZTogUlRDIGFsYXJtIG5ldyB2YWx1ZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgUlRDX1NldEFsYXJtKHVpbnQzMl90IEFsYXJtVmFsdWUpDQoteyAgDQotICBSVENfRW50ZXJDb25maWdNb2RlKCk7DQotICAvKiBTZXQgdGhlIEFMQVJNIE1TQiB3b3JkICovDQotICBSVEMtPkFMUkggPSBBbGFybVZhbHVlID4+IDE2Ow0KLSAgLyogU2V0IHRoZSBBTEFSTSBMU0Igd29yZCAqLw0KLSAgUlRDLT5BTFJMID0gKEFsYXJtVmFsdWUgJiBSVENfTFNCX01BU0spOw0KLSAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEdldHMgdGhlIFJUQyBkaXZpZGVyIHZhbHVlLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBSVEMgRGl2aWRlciB2YWx1ZS4NCi0gICovDQotdWludDMyX3QgUlRDX0dldERpdmlkZXIodm9pZCkNCi17DQotICB1aW50MzJfdCB0bXAgPSAweDAwOw0KLSAgdG1wID0gKCh1aW50MzJfdClSVEMtPkRJVkggJiAodWludDMyX3QpMHgwMDBGKSA8PCAxNjsNCi0gIHRtcCB8PSBSVEMtPkRJVkw7DQotICByZXR1cm4gdG1wOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBXYWl0cyB1bnRpbCBsYXN0IHdyaXRlIG9wZXJhdGlvbiBvbiBSVEMgcmVnaXN0ZXJzIGhhcyBmaW5pc2hlZC4NCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgd3JpdGUgdG8gUlRDIHJlZ2lzdGVycy4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFJUQ19XYWl0Rm9yTGFzdFRhc2sodm9pZCkNCi17DQotICAvKiBMb29wIHVudGlsIFJUT0ZGIGZsYWcgaXMgc2V0ICovDQotICB3aGlsZSAoKFJUQy0+Q1JMICYgUlRDX0ZMQUdfUlRPRkYpID09ICh1aW50MTZfdClSRVNFVCkNCi0gIHsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgV2FpdHMgdW50aWwgdGhlIFJUQyByZWdpc3RlcnMgKFJUQ19DTlQsIFJUQ19BTFIgYW5kIFJUQ19QUkwpDQotICAqICAgYXJlIHN5bmNocm9uaXplZCB3aXRoIFJUQyBBUEIgY2xvY2suDQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlYWQgb3BlcmF0aW9uIGFmdGVyIGFuIEFQQiByZXNldA0KLSAgKiAgIG9yIGFuIEFQQiBjbG9jayBzdG9wLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgUlRDX1dhaXRGb3JTeW5jaHJvKHZvaWQpDQotew0KLSAgLyogQ2xlYXIgUlNGIGZsYWcgKi8NCi0gIFJUQy0+Q1JMICY9ICh1aW50MTZfdCl+UlRDX0ZMQUdfUlNGOw0KLSAgLyogTG9vcCB1bnRpbCBSU0YgZmxhZyBpcyBzZXQgKi8NCi0gIHdoaWxlICgoUlRDLT5DUkwgJiBSVENfRkxBR19SU0YpID09ICh1aW50MTZfdClSRVNFVCkNCi0gIHsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIFJUQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgUlRDX0ZMQUdfUlRPRkY6IFJUQyBPcGVyYXRpb24gT0ZGIGZsYWcNCi0gICogICAgIEBhcmcgUlRDX0ZMQUdfUlNGOiBSZWdpc3RlcnMgU3luY2hyb25pemVkIGZsYWcNCi0gICogICAgIEBhcmcgUlRDX0ZMQUdfT1c6IE92ZXJmbG93IGZsYWcNCi0gICogICAgIEBhcmcgUlRDX0ZMQUdfQUxSOiBBbGFybSBmbGFnDQotICAqICAgICBAYXJnIFJUQ19GTEFHX1NFQzogU2Vjb25kIGZsYWcNCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFJUQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIFJUQ19HZXRGbGFnU3RhdHVzKHVpbnQxNl90IFJUQ19GTEFHKQ0KLXsNCi0gIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUlRDX0dFVF9GTEFHKFJUQ19GTEFHKSk7IA0KLSAgDQotICBpZiAoKFJUQy0+Q1JMICYgUlRDX0ZMQUcpICE9ICh1aW50MTZfdClSRVNFVCkNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIHJldHVybiBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgUlRDknMgcGVuZGluZyBmbGFncy4NCi0gICogQHBhcmFtICBSVENfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFJUQ19GTEFHX1JTRjogUmVnaXN0ZXJzIFN5bmNocm9uaXplZCBmbGFnLiBUaGlzIGZsYWcgaXMgY2xlYXJlZCBvbmx5IGFmdGVyDQotICAqICAgICAgICAgICAgICAgICAgICAgICAgYW4gQVBCIHJlc2V0IG9yIGFuIEFQQiBDbG9jayBzdG9wLg0KLSAgKiAgICAgQGFyZyBSVENfRkxBR19PVzogT3ZlcmZsb3cgZmxhZw0KLSAgKiAgICAgQGFyZyBSVENfRkxBR19BTFI6IEFsYXJtIGZsYWcNCi0gICogICAgIEBhcmcgUlRDX0ZMQUdfU0VDOiBTZWNvbmQgZmxhZw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBSVENfQ2xlYXJGbGFnKHVpbnQxNl90IFJUQ19GTEFHKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfUlRDX0NMRUFSX0ZMQUcoUlRDX0ZMQUcpKTsgDQotICAgIA0KLSAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIGZsYWcgKi8NCi0gIFJUQy0+Q1JMICY9ICh1aW50MTZfdCl+UlRDX0ZMQUc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIGludGVycnVwdCBoYXMgb2NjdXJlZCBvciBub3QuDQotICAqIEBwYXJhbSAgUlRDX0lUOiBzcGVjaWZpZXMgdGhlIFJUQyBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gY2hlY2suDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgUlRDX0lUX09XOiBPdmVyZmxvdyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgUlRDX0lUX0FMUjogQWxhcm0gaW50ZXJydXB0DQotICAqICAgICBAYXJnIFJUQ19JVF9TRUM6IFNlY29uZCBpbnRlcnJ1cHQNCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBSVENfSVQgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUlUU3RhdHVzIFJUQ19HZXRJVFN0YXR1cyh1aW50MTZfdCBSVENfSVQpDQotew0KLSAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1JUQ19HRVRfSVQoUlRDX0lUKSk7IA0KLSAgDQotICBiaXRzdGF0dXMgPSAoSVRTdGF0dXMpKFJUQy0+Q1JMICYgUlRDX0lUKTsNCi0gIGlmICgoKFJUQy0+Q1JIICYgUlRDX0lUKSAhPSAodWludDE2X3QpUkVTRVQpICYmIChiaXRzdGF0dXMgIT0gKHVpbnQxNl90KVJFU0VUKSkNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIHJldHVybiBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgUlRDknMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gICogQHBhcmFtICBSVENfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFJUQ19JVF9PVzogT3ZlcmZsb3cgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFJUQ19JVF9BTFI6IEFsYXJtIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBSVENfSVRfU0VDOiBTZWNvbmQgaW50ZXJydXB0DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFJUQ19DbGVhcklUUGVuZGluZ0JpdCh1aW50MTZfdCBSVENfSVQpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19SVENfSVQoUlRDX0lUKSk7ICANCi0gIA0KLSAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIHBlbmRpbmcgYml0ICovDQotICBSVEMtPkNSTCAmPSAodWludDE2X3QpflJUQ19JVDsNCi19DQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9zZGlvLmMgYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9zZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmNhZDUuLjAwMDAwMDAKLS0tIGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfc2Rpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF9zZGlvLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgU0RJTyBmaXJtd2FyZSBmdW5jdGlvbnMuDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICogQGNvcHkNCi0gICoNCi0gICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQotICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQotICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCi0gICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KLSAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQotICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCi0gICoNCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQotICAqLyANCi0NCi0vKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSNpbmNsdWRlICJzdG0zMmYxMHhfc2Rpby5oIg0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJTyANCi0gICogQGJyaWVmIFNESU8gZHJpdmVyIG1vZHVsZXMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovIA0KLQ0KLS8qIC0tLS0tLS0tLS0tLSBTRElPIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uIC0tLS0tLS0tLS0tICovDQotI2RlZmluZSBTRElPX09GRlNFVCAgICAgICAgICAgICAgICAoU0RJT19CQVNFIC0gUEVSSVBIX0JBU0UpDQotDQotLyogLS0tIENMS0NSIFJlZ2lzdGVyIC0tLSovDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENMS0VOIGJpdCAqLw0KLSNkZWZpbmUgQ0xLQ1JfT0ZGU0VUICAgICAgICAgICAgICAoU0RJT19PRkZTRVQgKyAweDA0KQ0KLSNkZWZpbmUgQ0xLRU5fQml0TnVtYmVyICAgICAgICAgICAweDA4DQotI2RlZmluZSBDTEtDUl9DTEtFTl9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDTEtDUl9PRkZTRVQgKiAzMikgKyAoQ0xLRU5fQml0TnVtYmVyICogNCkpDQotDQotLyogLS0tIENNRCBSZWdpc3RlciAtLS0qLw0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBTRElPU1VTUEVORCBiaXQgKi8NCi0jZGVmaW5lIENNRF9PRkZTRVQgICAgICAgICAgICAgICAgKFNESU9fT0ZGU0VUICsgMHgwQykNCi0jZGVmaW5lIFNESU9TVVNQRU5EX0JpdE51bWJlciAgICAgMHgwQg0KLSNkZWZpbmUgQ01EX1NESU9TVVNQRU5EX0JCICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ01EX09GRlNFVCAqIDMyKSArIChTRElPU1VTUEVORF9CaXROdW1iZXIgKiA0KSkNCi0NCi0vKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgRU5DTURDT01QTCBiaXQgKi8NCi0jZGVmaW5lIEVOQ01EQ09NUExfQml0TnVtYmVyICAgICAgMHgwQw0KLSNkZWZpbmUgQ01EX0VOQ01EQ09NUExfQkIgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ01EX09GRlNFVCAqIDMyKSArIChFTkNNRENPTVBMX0JpdE51bWJlciAqIDQpKQ0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBOSUVOIGJpdCAqLw0KLSNkZWZpbmUgTklFTl9CaXROdW1iZXIgICAgICAgICAgICAweDBEDQotI2RlZmluZSBDTURfTklFTl9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDTURfT0ZGU0VUICogMzIpICsgKE5JRU5fQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEFUQUNNRCBiaXQgKi8NCi0jZGVmaW5lIEFUQUNNRF9CaXROdW1iZXIgICAgICAgICAgMHgwRQ0KLSNkZWZpbmUgQ01EX0FUQUNNRF9CQiAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ01EX09GRlNFVCAqIDMyKSArIChBVEFDTURfQml0TnVtYmVyICogNCkpDQotDQotLyogLS0tIERDVFJMIFJlZ2lzdGVyIC0tLSovDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIERNQUVOIGJpdCAqLw0KLSNkZWZpbmUgRENUUkxfT0ZGU0VUICAgICAgICAgICAgICAoU0RJT19PRkZTRVQgKyAweDJDKQ0KLSNkZWZpbmUgRE1BRU5fQml0TnVtYmVyICAgICAgICAgICAweDAzDQotI2RlZmluZSBEQ1RSTF9ETUFFTl9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChEQ1RSTF9PRkZTRVQgKiAzMikgKyAoRE1BRU5fQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFJXU1RBUlQgYml0ICovDQotI2RlZmluZSBSV1NUQVJUX0JpdE51bWJlciAgICAgICAgIDB4MDgNCi0jZGVmaW5lIERDVFJMX1JXU1RBUlRfQkIgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKERDVFJMX09GRlNFVCAqIDMyKSArIChSV1NUQVJUX0JpdE51bWJlciAqIDQpKQ0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBSV1NUT1AgYml0ICovDQotI2RlZmluZSBSV1NUT1BfQml0TnVtYmVyICAgICAgICAgIDB4MDkNCi0jZGVmaW5lIERDVFJMX1JXU1RPUF9CQiAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKERDVFJMX09GRlNFVCAqIDMyKSArIChSV1NUT1BfQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFJXTU9EIGJpdCAqLw0KLSNkZWZpbmUgUldNT0RfQml0TnVtYmVyICAgICAgICAgICAweDBBDQotI2RlZmluZSBEQ1RSTF9SV01PRF9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChEQ1RSTF9PRkZTRVQgKiAzMikgKyAoUldNT0RfQml0TnVtYmVyICogNCkpDQotDQotLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFNESU9FTiBiaXQgKi8NCi0jZGVmaW5lIFNESU9FTl9CaXROdW1iZXIgICAgICAgICAgMHgwQg0KLSNkZWZpbmUgRENUUkxfU0RJT0VOX0JCICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoRENUUkxfT0ZGU0VUICogMzIpICsgKFNESU9FTl9CaXROdW1iZXIgKiA0KSkNCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gcmVnaXN0ZXJzIGJpdCBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLSBDTEtDUiBSZWdpc3RlciAtLS0qLw0KLQ0KLS8qIENMS0NSIHJlZ2lzdGVyIGNsZWFyIG1hc2sgKi8NCi0jZGVmaW5lIENMS0NSX0NMRUFSX01BU0sgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRjgxMDApIA0KLQ0KLS8qIC0tLSBQV1JDVFJMIFJlZ2lzdGVyIC0tLSovDQotDQotLyogU0RJTyBQV1JDVFJMIE1hc2sgKi8NCi0jZGVmaW5lIFBXUl9QV1JDVFJMX01BU0sgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRkMpDQotDQotLyogLS0tIERDVFJMIFJlZ2lzdGVyIC0tLSovDQotDQotLyogU0RJTyBEQ1RSTCBDbGVhciBNYXNrICovDQotI2RlZmluZSBEQ1RSTF9DTEVBUl9NQVNLICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRjA4KQ0KLQ0KLS8qIC0tLSBDTUQgUmVnaXN0ZXIgLS0tKi8NCi0NCi0vKiBDTUQgUmVnaXN0ZXIgY2xlYXIgbWFzayAqLw0KLSNkZWZpbmUgQ01EX0NMRUFSX01BU0sgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRjgwMCkNCi0NCi0vKiBTRElPIFJFU1AgUmVnaXN0ZXJzIEFkZHJlc3MgKi8NCi0jZGVmaW5lIFNESU9fUkVTUF9BRERSICAgICAgICAgICAoKHVpbnQzMl90KShTRElPX0JBU0UgKyAweDE0KSkNCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNESU9fUHJpdmF0ZV9WYXJpYWJsZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU0RJT19Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIFNESU8gcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX0RlSW5pdCh2b2lkKQ0KLXsNCi0gIFNESU8tPlBPV0VSID0gMHgwMDAwMDAwMDsNCi0gIFNESU8tPkNMS0NSID0gMHgwMDAwMDAwMDsNCi0gIFNESU8tPkFSRyA9IDB4MDAwMDAwMDA7DQotICBTRElPLT5DTUQgPSAweDAwMDAwMDAwOw0KLSAgU0RJTy0+RFRJTUVSID0gMHgwMDAwMDAwMDsNCi0gIFNESU8tPkRMRU4gPSAweDAwMDAwMDAwOw0KLSAgU0RJTy0+RENUUkwgPSAweDAwMDAwMDAwOw0KLSAgU0RJTy0+SUNSID0gMHgwMEMwMDdGRjsNCi0gIFNESU8tPk1BU0sgPSAweDAwMDAwMDAwOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0RJTyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFNESU9fSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBTRElPX0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgU0RJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgDQotICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFNESU8gcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU0RJT19Jbml0KFNESU9fSW5pdFR5cGVEZWYqIFNESU9fSW5pdFN0cnVjdCkNCi17DQotICB1aW50MzJfdCB0bXByZWcgPSAwOw0KLSAgICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU0RJT19DTE9DS19FREdFKFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja0VkZ2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TRElPX0NMT0NLX0JZUEFTUyhTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tCeXBhc3MpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TRElPX0NMT0NLX1BPV0VSX1NBVkUoU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrUG93ZXJTYXZlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU0RJT19CVVNfV0lERShTRElPX0luaXRTdHJ1Y3QtPlNESU9fQnVzV2lkZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fSEFSRFdBUkVfRkxPV19DT05UUk9MKFNESU9fSW5pdFN0cnVjdC0+U0RJT19IYXJkd2FyZUZsb3dDb250cm9sKSk7IA0KLSAgIA0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIENMS0NSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KLSAgLyogR2V0IHRoZSBTRElPIENMS0NSIHZhbHVlICovDQotICB0bXByZWcgPSBTRElPLT5DTEtDUjsNCi0gIA0KLSAgLyogQ2xlYXIgQ0xLRElWLCBQV1JTQVYsIEJZUEFTUywgV0lEQlVTLCBORUdFREdFLCBIV0ZDX0VOIGJpdHMgKi8NCi0gIHRtcHJlZyAmPSBDTEtDUl9DTEVBUl9NQVNLOw0KLSAgDQotICAvKiBTZXQgQ0xLRElWIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ2xvY2tEaXYgdmFsdWUgKi8NCi0gIC8qIFNldCBQV1JTQVYgYml0IGFjY29yZGluZyB0byBTRElPX0Nsb2NrUG93ZXJTYXZlIHZhbHVlICovDQotICAvKiBTZXQgQllQQVNTIGJpdCBhY2NvcmRpbmcgdG8gU0RJT19DbG9ja0J5cGFzcyB2YWx1ZSAqLw0KLSAgLyogU2V0IFdJREJVUyBiaXRzIGFjY29yZGluZyB0byBTRElPX0J1c1dpZGUgdmFsdWUgKi8NCi0gIC8qIFNldCBORUdFREdFIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ2xvY2tFZGdlIHZhbHVlICovDQotICAvKiBTZXQgSFdGQ19FTiBiaXRzIGFjY29yZGluZyB0byBTRElPX0hhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSAoU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRGl2ICB8IFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja1Bvd2VyU2F2ZSB8DQotICAgICAgICAgICAgIFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja0J5cGFzcyB8IFNESU9fSW5pdFN0cnVjdC0+U0RJT19CdXNXaWRlIHwNCi0gICAgICAgICAgICAgU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRWRnZSB8IFNESU9fSW5pdFN0cnVjdC0+U0RJT19IYXJkd2FyZUZsb3dDb250cm9sKTsgDQotICANCi0gIC8qIFdyaXRlIHRvIFNESU8gQ0xLQ1IgKi8NCi0gIFNESU8tPkNMS0NSID0gdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGaWxscyBlYWNoIFNESU9fSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBTRElPX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYW4gU0RJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggDQotICAqICAgd2lsbCBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU0RJT19TdHJ1Y3RJbml0KFNESU9fSW5pdFR5cGVEZWYqIFNESU9fSW5pdFN0cnVjdCkNCi17DQotICAvKiBTRElPX0luaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQotICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tEaXYgPSAweDAwOw0KLSAgU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRWRnZSA9IFNESU9fQ2xvY2tFZGdlX1Jpc2luZzsNCi0gIFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja0J5cGFzcyA9IFNESU9fQ2xvY2tCeXBhc3NfRGlzYWJsZTsNCi0gIFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja1Bvd2VyU2F2ZSA9IFNESU9fQ2xvY2tQb3dlclNhdmVfRGlzYWJsZTsNCi0gIFNESU9fSW5pdFN0cnVjdC0+U0RJT19CdXNXaWRlID0gU0RJT19CdXNXaWRlXzFiOw0KLSAgU0RJT19Jbml0U3RydWN0LT5TRElPX0hhcmR3YXJlRmxvd0NvbnRyb2wgPSBTRElPX0hhcmR3YXJlRmxvd0NvbnRyb2xfRGlzYWJsZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU0RJTyBDbG9jay4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTRElPIENsb2NrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX0Nsb2NrQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgKihfX0lPIHVpbnQzMl90ICopIENMS0NSX0NMS0VOX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBwb3dlciBzdGF0dXMgb2YgdGhlIGNvbnRyb2xsZXIuDQotICAqIEBwYXJhbSAgU0RJT19Qb3dlclN0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBvd2VyIHN0YXRlLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBTRElPX1Bvd2VyU3RhdGVfT0ZGDQotICAqICAgICBAYXJnIFNESU9fUG93ZXJTdGF0ZV9PTg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX1NldFBvd2VyU3RhdGUodWludDMyX3QgU0RJT19Qb3dlclN0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU0RJT19QT1dFUl9TVEFURShTRElPX1Bvd2VyU3RhdGUpKTsNCi0gIA0KLSAgU0RJTy0+UE9XRVIgJj0gUFdSX1BXUkNUUkxfTUFTSzsNCi0gIFNESU8tPlBPV0VSIHw9IFNESU9fUG93ZXJTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgR2V0cyB0aGUgcG93ZXIgc3RhdHVzIG9mIHRoZSBjb250cm9sbGVyLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBQb3dlciBzdGF0dXMgb2YgdGhlIGNvbnRyb2xsZXIuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4NCi0gICogICBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoNCi0gICogLSAweDAwOiBQb3dlciBPRkYNCi0gICogLSAweDAyOiBQb3dlciBVUA0KLSAgKiAtIDB4MDM6IFBvd2VyIE9OIA0KLSAgKi8NCi11aW50MzJfdCBTRElPX0dldFBvd2VyU3RhdGUodm9pZCkNCi17DQotICByZXR1cm4gKFNESU8tPlBPV0VSICYgKH5QV1JfUFdSQ1RSTF9NQVNLKSk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNESU8gaW50ZXJydXB0cy4NCi0gICogQHBhcmFtICBTRElPX0lUOiBzcGVjaWZpZXMgdGhlIFNESU8gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFNESU9fSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfRFRJTUVPVVQ6IERhdGEgdGltZW91dCBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfU1RCSVRFUlI6IFN0YXJ0IGJpdCBub3QgZGV0ZWN0ZWQgb24gYWxsIGRhdGEgc2lnbmFscyBpbiB3aWRlIA0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9DTURBQ1Q6ICAgQ29tbWFuZCB0cmFuc2ZlciBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWEFDVDogICAgRGF0YSB0cmFuc21pdCBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWEFDVDogICAgRGF0YSByZWNlaXZlIGluIHByb2dyZXNzIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX1RYRklGT0hFOiBUcmFuc21pdCBGSUZPIEhhbGYgRW1wdHkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfUlhGSUZPSEY6IFJlY2VpdmUgRklGTyBIYWxmIEZ1bGwgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPRjogIFRyYW5zbWl0IEZJRk8gZnVsbCBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWEZJRk9GOiAgUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPRTogIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gdHJhbnNtaXQgRklGTyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gcmVjZWl2ZSBGSUZPIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjEgaW50ZXJydXB0DQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFNESU8gaW50ZXJydXB0cy4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUgDQotICAqLw0KLXZvaWQgU0RJT19JVENvbmZpZyh1aW50MzJfdCBTRElPX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TRElPX0lUKFNESU9fSVQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIFNESU8gaW50ZXJydXB0cyAqLw0KLSAgICBTRElPLT5NQVNLIHw9IFNESU9fSVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIFNESU8gaW50ZXJydXB0cyAqLw0KLSAgICBTRElPLT5NQVNLICY9IH5TRElPX0lUOw0KLSAgfSANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU0RJTyBETUEgcmVxdWVzdC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBTRElPIERNQSByZXF1ZXN0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNESU9fRE1BQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgKihfX0lPIHVpbnQzMl90ICopIERDVFJMX0RNQUVOX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0RJTyBDb21tYW5kIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFNESU9fQ21kSW5pdFN0cnVjdCBhbmQgc2VuZCB0aGUgY29tbWFuZC4NCi0gICogQHBhcmFtICBTRElPX0NtZEluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgU0RJT19DbWRJbml0VHlwZURlZiANCi0gICogICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFNESU8gY29tbWFuZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU0RJT19TZW5kQ29tbWFuZChTRElPX0NtZEluaXRUeXBlRGVmICpTRElPX0NtZEluaXRTdHJ1Y3QpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TRElPX0NNRF9JTkRFWChTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fQ21kSW5kZXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TRElPX1JFU1BPTlNFKFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19SZXNwb25zZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fV0FJVChTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fV2FpdCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fQ1BTTShTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fQ1BTTSkpOw0KLSAgDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gQVJHIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIFNldCB0aGUgU0RJTyBBcmd1bWVudCB2YWx1ZSAqLw0KLSAgU0RJTy0+QVJHID0gU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0FyZ3VtZW50Ow0KLSAgDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gQ01EIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KLSAgLyogR2V0IHRoZSBTRElPIENNRCB2YWx1ZSAqLw0KLSAgdG1wcmVnID0gU0RJTy0+Q01EOw0KLSAgLyogQ2xlYXIgQ01ESU5ERVgsIFdBSVRSRVNQLCBXQUlUSU5ULCBXQUlUUEVORCwgQ1BTTUVOIGJpdHMgKi8NCi0gIHRtcHJlZyAmPSBDTURfQ0xFQVJfTUFTSzsNCi0gIC8qIFNldCBDTURJTkRFWCBiaXRzIGFjY29yZGluZyB0byBTRElPX0NtZEluZGV4IHZhbHVlICovDQotICAvKiBTZXQgV0FJVFJFU1AgYml0cyBhY2NvcmRpbmcgdG8gU0RJT19SZXNwb25zZSB2YWx1ZSAqLw0KLSAgLyogU2V0IFdBSVRJTlQgYW5kIFdBSVRQRU5EIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fV2FpdCB2YWx1ZSAqLw0KLSAgLyogU2V0IENQU01FTiBiaXRzIGFjY29yZGluZyB0byBTRElPX0NQU00gdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSAodWludDMyX3QpU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NtZEluZGV4IHwgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX1Jlc3BvbnNlDQotICAgICAgICAgICB8IFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0IHwgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU007DQotICANCi0gIC8qIFdyaXRlIHRvIFNESU8gQ01EICovDQotICBTRElPLT5DTUQgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggU0RJT19DbWRJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KLSAgKiBAcGFyYW0gIFNESU9fQ21kSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBTRElPX0NtZEluaXRUeXBlRGVmIA0KLSAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX0NtZFN0cnVjdEluaXQoU0RJT19DbWRJbml0VHlwZURlZiogU0RJT19DbWRJbml0U3RydWN0KQ0KLXsNCi0gIC8qIFNESU9fQ21kSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCi0gIFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19Bcmd1bWVudCA9IDB4MDA7DQotICBTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fQ21kSW5kZXggPSAweDAwOw0KLSAgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX1Jlc3BvbnNlID0gU0RJT19SZXNwb25zZV9ObzsNCi0gIFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0ID0gU0RJT19XYWl0X05vOw0KLSAgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU00gPSBTRElPX0NQU01fRGlzYWJsZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyBjb21tYW5kIGluZGV4IG9mIGxhc3QgY29tbWFuZCBmb3Igd2hpY2ggcmVzcG9uc2UgcmVjZWl2ZWQuDQotICAqIEBwYXJhbSAgTm9uZQ0KLSAgKiBAcmV0dmFsIFJldHVybnMgdGhlIGNvbW1hbmQgaW5kZXggb2YgdGhlIGxhc3QgY29tbWFuZCByZXNwb25zZSByZWNlaXZlZC4NCi0gICovDQotdWludDhfdCBTRElPX0dldENvbW1hbmRSZXNwb25zZSh2b2lkKQ0KLXsNCi0gIHJldHVybiAodWludDhfdCkoU0RJTy0+UkVTUENNRCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0aGUgY2FyZCBmb3IgdGhlIGxhc3QgY29tbWFuZC4NCi0gICogQHBhcmFtICBTRElPX1JFU1A6IFNwZWNpZmllcyB0aGUgU0RJTyByZXNwb25zZSByZWdpc3Rlci4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU0RJT19SRVNQMTogUmVzcG9uc2UgUmVnaXN0ZXIgMQ0KLSAgKiAgICAgQGFyZyBTRElPX1JFU1AyOiBSZXNwb25zZSBSZWdpc3RlciAyDQotICAqICAgICBAYXJnIFNESU9fUkVTUDM6IFJlc3BvbnNlIFJlZ2lzdGVyIDMNCi0gICogICAgIEBhcmcgU0RJT19SRVNQNDogUmVzcG9uc2UgUmVnaXN0ZXIgNA0KLSAgKiBAcmV0dmFsIFRoZSBDb3JyZXNwb25kaW5nIHJlc3BvbnNlIHJlZ2lzdGVyIHZhbHVlLg0KLSAgKi8NCi11aW50MzJfdCBTRElPX0dldFJlc3BvbnNlKHVpbnQzMl90IFNESU9fUkVTUCkNCi17DQotICBfX0lPIHVpbnQzMl90IHRtcCA9IDA7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fUkVTUChTRElPX1JFU1ApKTsNCi0NCi0gIHRtcCA9IFNESU9fUkVTUF9BRERSICsgU0RJT19SRVNQOw0KLSAgDQotICByZXR1cm4gKCooX19JTyB1aW50MzJfdCAqKSB0bXApOyANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNESU8gZGF0YSBwYXRoIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFNESU9fRGF0YUluaXRTdHJ1Y3QuDQotICAqIEBwYXJhbSAgU0RJT19EYXRhSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBTRElPX0RhdGFJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KLSAgKiAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgU0RJTyBjb21tYW5kLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX0RhdGFDb25maWcoU0RJT19EYXRhSW5pdFR5cGVEZWYqIFNESU9fRGF0YUluaXRTdHJ1Y3QpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TRElPX0RBVEFfTEVOR1RIKFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YUxlbmd0aCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fQkxPQ0tfU0laRShTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFCbG9ja1NpemUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TRElPX1RSQU5TRkVSX0RJUihTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX1RyYW5zZmVyRGlyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU0RJT19UUkFOU0ZFUl9NT0RFKFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJNb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU0RJT19EUFNNKFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRFBTTSkpOw0KLQ0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIERUSU1FUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBTZXQgdGhlIFNESU8gRGF0YSBUaW1lT3V0IHZhbHVlICovDQotICBTRElPLT5EVElNRVIgPSBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFUaW1lT3V0Ow0KLQ0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIERMRU4gQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICAvKiBTZXQgdGhlIFNESU8gRGF0YUxlbmd0aCB2YWx1ZSAqLw0KLSAgU0RJTy0+RExFTiA9IFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YUxlbmd0aDsNCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RJTyBEQ1RSTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgDQotICAvKiBHZXQgdGhlIFNESU8gRENUUkwgdmFsdWUgKi8NCi0gIHRtcHJlZyA9IFNESU8tPkRDVFJMOw0KLSAgLyogQ2xlYXIgREVOLCBEVE1PREUsIERURElSIGFuZCBEQkNLU0laRSBiaXRzICovDQotICB0bXByZWcgJj0gRENUUkxfQ0xFQVJfTUFTSzsNCi0gIC8qIFNldCBERU4gYml0IGFjY29yZGluZyB0byBTRElPX0RQU00gdmFsdWUgKi8NCi0gIC8qIFNldCBEVE1PREUgYml0IGFjY29yZGluZyB0byBTRElPX1RyYW5zZmVyTW9kZSB2YWx1ZSAqLw0KLSAgLyogU2V0IERURElSIGJpdCBhY2NvcmRpbmcgdG8gU0RJT19UcmFuc2ZlckRpciB2YWx1ZSAqLw0KLSAgLyogU2V0IERCQ0tTSVpFIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fRGF0YUJsb2NrU2l6ZSB2YWx1ZSAqLw0KLSAgdG1wcmVnIHw9ICh1aW50MzJfdClTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFCbG9ja1NpemUgfCBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX1RyYW5zZmVyRGlyDQotICAgICAgICAgICB8IFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJNb2RlIHwgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EUFNNOw0KLQ0KLSAgLyogV3JpdGUgdG8gU0RJTyBEQ1RSTCAqLw0KLSAgU0RJTy0+RENUUkwgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggU0RJT19EYXRhSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBTRElPX0RhdGFJbml0U3RydWN0OiBwb2ludGVyIHRvIGFuIFNESU9fRGF0YUluaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaA0KLSAgKiAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNESU9fRGF0YVN0cnVjdEluaXQoU0RJT19EYXRhSW5pdFR5cGVEZWYqIFNESU9fRGF0YUluaXRTdHJ1Y3QpDQotew0KLSAgLyogU0RJT19EYXRhSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCi0gIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YVRpbWVPdXQgPSAweEZGRkZGRkZGOw0KLSAgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhTGVuZ3RoID0gMHgwMDsNCi0gIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YUJsb2NrU2l6ZSA9IFNESU9fRGF0YUJsb2NrU2l6ZV8xYjsNCi0gIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJEaXIgPSBTRElPX1RyYW5zZmVyRGlyX1RvQ2FyZDsNCi0gIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJNb2RlID0gU0RJT19UcmFuc2Zlck1vZGVfQmxvY2s7ICANCi0gIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRFBTTSA9IFNESU9fRFBTTV9EaXNhYmxlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZC4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTnVtYmVyIG9mIHJlbWFpbmluZyBkYXRhIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkDQotICAqLw0KLXVpbnQzMl90IFNESU9fR2V0RGF0YUNvdW50ZXIodm9pZCkNCi17IA0KLSAgcmV0dXJuIFNESU8tPkRDT1VOVDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmVhZCBvbmUgZGF0YSB3b3JkIGZyb20gUnggRklGTy4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgRGF0YSByZWNlaXZlZA0KLSAgKi8NCi11aW50MzJfdCBTRElPX1JlYWREYXRhKHZvaWQpDQoteyANCi0gIHJldHVybiBTRElPLT5GSUZPOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBXcml0ZSBvbmUgZGF0YSB3b3JkIHRvIFR4IEZJRk8uDQotICAqIEBwYXJhbSAgRGF0YTogMzItYml0IGRhdGEgd29yZCB0byB3cml0ZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU0RJT19Xcml0ZURhdGEodWludDMyX3QgRGF0YSkNCi17IA0KLSAgU0RJTy0+RklGTyA9IERhdGE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyBsZWZ0IHRvIGJlIHdyaXR0ZW4gdG8gb3IgcmVhZCBmcm9tIEZJRk8uCQ0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBSZW1haW5pbmcgbnVtYmVyIG9mIHdvcmRzLg0KLSAgKi8NCi11aW50MzJfdCBTRElPX0dldEZJRk9Db3VudCh2b2lkKQ0KLXsgDQotICByZXR1cm4gU0RJTy0+RklGT0NOVDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU3RhcnRzIHRoZSBTRCBJL08gUmVhZCBXYWl0IG9wZXJhdGlvbi4JDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU3RhcnQgU0RJTyBSZWFkIFdhaXQgb3BlcmF0aW9uLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX1N0YXJ0U0RJT1JlYWRXYWl0KEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gICooX19JTyB1aW50MzJfdCAqKSBEQ1RSTF9SV1NUQVJUX0JCID0gKHVpbnQzMl90KSBOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU3RvcHMgdGhlIFNEIEkvTyBSZWFkIFdhaXQgb3BlcmF0aW9uLgkNCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTdG9wIFNESU8gUmVhZCBXYWl0IG9wZXJhdGlvbi4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU0RJT19TdG9wU0RJT1JlYWRXYWl0KEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gICooX19JTyB1aW50MzJfdCAqKSBEQ1RSTF9SV1NUT1BfQkIgPSAodWludDMyX3QpIE5ld1N0YXRlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIG9uZSBvZiB0aGUgdHdvIG9wdGlvbnMgb2YgaW5zZXJ0aW5nIHJlYWQgd2FpdCBpbnRlcnZhbC4NCi0gICogQHBhcmFtICBTRElPX1JlYWRXYWl0TW9kZTogU0QgSS9PIFJlYWQgV2FpdCBvcGVyYXRpb24gbW9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRyZSBjYW4gYmU6DQotICAqICAgICBAYXJnIFNESU9fUmVhZFdhaXRNb2RlX0NMSzogUmVhZCBXYWl0IGNvbnRyb2wgYnkgc3RvcHBpbmcgU0RJT0NMSw0KLSAgKiAgICAgQGFyZyBTRElPX1JlYWRXYWl0TW9kZV9EQVRBMjogUmVhZCBXYWl0IGNvbnRyb2wgdXNpbmcgU0RJT19EQVRBMg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX1NldFNESU9SZWFkV2FpdE1vZGUodWludDMyX3QgU0RJT19SZWFkV2FpdE1vZGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TRElPX1JFQURXQUlUX01PREUoU0RJT19SZWFkV2FpdE1vZGUpKTsNCi0gIA0KLSAgKihfX0lPIHVpbnQzMl90ICopIERDVFJMX1JXTU9EX0JCID0gU0RJT19SZWFkV2FpdE1vZGU7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNEIEkvTyBNb2RlIE9wZXJhdGlvbi4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIFNESU8gc3BlY2lmaWMgb3BlcmF0aW9uLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX1NldFNESU9PcGVyYXRpb24oRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgKihfX0lPIHVpbnQzMl90ICopIERDVFJMX1NESU9FTl9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU0QgSS9PIE1vZGUgc3VzcGVuZCBjb21tYW5kIHNlbmRpbmcuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU0QgSS9PIE1vZGUgc3VzcGVuZCBjb21tYW5kLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNESU9fU2VuZFNESU9TdXNwZW5kQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gICooX19JTyB1aW50MzJfdCAqKSBDTURfU0RJT1NVU1BFTkRfQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGNvbW1hbmQgY29tcGxldGlvbiBzaWduYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiBjb21tYW5kIGNvbXBsZXRpb24gc2lnbmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX0NvbW1hbmRDb21wbGV0aW9uQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gICooX19JTyB1aW50MzJfdCAqKSBDTURfRU5DTURDT01QTF9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQ0UtQVRBIGludGVycnVwdC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIENFLUFUQSBpbnRlcnJ1cHQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNESU9fQ0VBVEFJVENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQoteyANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICAqKF9fSU8gdWludDMyX3QgKikgQ01EX05JRU5fQkIgPSAodWludDMyX3QpKCh+KCh1aW50MzJfdClOZXdTdGF0ZSkpICYgKCh1aW50MzJfdCkweDEpKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2VuZHMgQ0UtQVRBIGNvbW1hbmQgKENNRDYxKS4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIENFLUFUQSBjb21tYW5kLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX1NlbmRDRUFUQUNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQoteyANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICAqKF9fSU8gdWludDMyX3QgKikgQ01EX0FUQUNNRF9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTRElPIGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gICogQHBhcmFtICBTRElPX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQ0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0RUSU1FT1VUOiBEYXRhIHRpbWVvdXQNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX1RYVU5ERVJSOiBUcmFuc21pdCBGSUZPIHVuZGVycnVuIGVycm9yDQotICAqICAgICBAYXJnIFNESU9fRkxBR19SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yDQotICAqICAgICBAYXJnIFNESU9fRkxBR19DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQ0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX1NUQklURVJSOiBTdGFydCBiaXQgbm90IGRldGVjdGVkIG9uIGFsbCBkYXRhIHNpZ25hbHMgaW4gd2lkZSANCi0gICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZS4NCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0RCQ0tFTkQ6ICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpDQotICAqICAgICBAYXJnIFNESU9fRkxBR19DTURBQ1Q6ICAgQ29tbWFuZCB0cmFuc2ZlciBpbiBwcm9ncmVzcw0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX1JYQUNUOiAgICBEYXRhIHJlY2VpdmUgaW4gcHJvZ3Jlc3MNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX1RYRklGT0hFOiBUcmFuc21pdCBGSUZPIEhhbGYgRW1wdHkNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX1JYRklGT0hGOiBSZWNlaXZlIEZJRk8gSGFsZiBGdWxsDQotICAqICAgICBAYXJnIFNESU9fRkxBR19UWEZJRk9GOiAgVHJhbnNtaXQgRklGTyBmdWxsDQotICAqICAgICBAYXJnIFNESU9fRkxBR19SWEZJRk9GOiAgUmVjZWl2ZSBGSUZPIGZ1bGwNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX1RYRklGT0U6ICBUcmFuc21pdCBGSUZPIGVtcHR5DQotICAqICAgICBAYXJnIFNESU9fRkxBR19SWEZJRk9FOiAgUmVjZWl2ZSBGSUZPIGVtcHR5DQotICAqICAgICBAYXJnIFNESU9fRkxBR19UWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gdHJhbnNtaXQgRklGTw0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTw0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfU0RJT0lUOiAgIFNEIEkvTyBpbnRlcnJ1cHQgcmVjZWl2ZWQNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjENCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFNESU9fRkxBRyAoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotRmxhZ1N0YXR1cyBTRElPX0dldEZsYWdTdGF0dXModWludDMyX3QgU0RJT19GTEFHKQ0KLXsgDQotICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fRkxBRyhTRElPX0ZMQUcpKTsNCi0gIA0KLSAgaWYgKChTRElPLT5TVEEgJiBTRElPX0ZMQUcpICE9ICh1aW50MzJfdClSRVNFVCkNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIHJldHVybiBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgU0RJTydzIHBlbmRpbmcgZmxhZ3MuDQotICAqIEBwYXJhbSAgU0RJT19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuICANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFNESU9fRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpDQotICAqICAgICBAYXJnIFNESU9fRkxBR19DVElNRU9VVDogQ29tbWFuZCByZXNwb25zZSB0aW1lb3V0DQotICAqICAgICBAYXJnIFNESU9fRkxBR19EVElNRU9VVDogRGF0YSB0aW1lb3V0DQotICAqICAgICBAYXJnIFNESU9fRkxBR19UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvcg0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvcg0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpDQotICAqICAgICBAYXJnIFNESU9fRkxBR19DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pDQotICAqICAgICBAYXJnIFNESU9fRkxBR19TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUNCi0gICogICAgIEBhcmcgU0RJT19GTEFHX0RCQ0tFTkQ6ICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpDQotICAqICAgICBAYXJnIFNESU9fRkxBR19TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZA0KLSAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ0VBVEFFTkQ6IENFLUFUQSBjb21tYW5kIGNvbXBsZXRpb24gc2lnbmFsIHJlY2VpdmVkIGZvciBDTUQ2MQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTRElPX0NsZWFyRmxhZyh1aW50MzJfdCBTRElPX0ZMQUcpDQoteyANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU0RJT19DTEVBUl9GTEFHKFNESU9fRkxBRykpOw0KLSAgIA0KLSAgU0RJTy0+SUNSID0gU0RJT19GTEFHOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNESU8gaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQotICAqIEBwYXJhbSAgU0RJT19JVDogc3BlY2lmaWVzIHRoZSBTRElPIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFNESU9fSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfRFRJTUVPVVQ6IERhdGEgdGltZW91dCBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfU1RCSVRFUlI6IFN0YXJ0IGJpdCBub3QgZGV0ZWN0ZWQgb24gYWxsIGRhdGEgc2lnbmFscyBpbiB3aWRlIA0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9DTURBQ1Q6ICAgQ29tbWFuZCB0cmFuc2ZlciBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWEFDVDogICAgRGF0YSB0cmFuc21pdCBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWEFDVDogICAgRGF0YSByZWNlaXZlIGluIHByb2dyZXNzIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX1RYRklGT0hFOiBUcmFuc21pdCBGSUZPIEhhbGYgRW1wdHkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfUlhGSUZPSEY6IFJlY2VpdmUgRklGTyBIYWxmIEZ1bGwgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPRjogIFRyYW5zbWl0IEZJRk8gZnVsbCBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWEZJRk9GOiAgUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPRTogIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gdHJhbnNtaXQgRklGTyBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gcmVjZWl2ZSBGSUZPIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjEgaW50ZXJydXB0DQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBTRElPX0lUIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1JVFN0YXR1cyBTRElPX0dldElUU3RhdHVzKHVpbnQzMl90IFNESU9fSVQpDQoteyANCi0gIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NESU9fR0VUX0lUKFNESU9fSVQpKTsNCi0gIGlmICgoU0RJTy0+U1RBICYgU0RJT19JVCkgIT0gKHVpbnQzMl90KVJFU0VUKSAgDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICByZXR1cm4gYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIFNESU+ScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KLSAgKiBAcGFyYW0gIFNESU9fSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFNESU9fSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfRFRJTUVPVVQ6IERhdGEgdGltZW91dCBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9UWFVOREVSUjogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBTRElPX0lUX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFNESU9fSVRfU1RCSVRFUlI6IFN0YXJ0IGJpdCBub3QgZGV0ZWN0ZWQgb24gYWxsIGRhdGEgc2lnbmFscyBpbiB3aWRlIA0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgU0RJT19JVF9DRUFUQUVORDogQ0UtQVRBIGNvbW1hbmQgY29tcGxldGlvbiBzaWduYWwgcmVjZWl2ZWQgZm9yIENNRDYxDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNESU9fQ2xlYXJJVFBlbmRpbmdCaXQodWludDMyX3QgU0RJT19JVCkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TRElPX0NMRUFSX0lUKFNESU9fSVQpKTsNCi0gICANCi0gIFNESU8tPklDUiA9IFNESU9fSVQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfc3BpLmMgYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9zcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkZDIzZC4uMDAwMDAwMAotLS0gYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF9zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNyArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfc3BpLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgU1BJIGZpcm13YXJlIGZ1bmN0aW9ucy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweF9zcGkuaCINCi0jaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSSANCi0gICogQGJyaWVmIFNQSSBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8gDQotDQotLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotDQotLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9EZWZpbmVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qIFNQSSBTUEUgbWFzayAqLw0KLSNkZWZpbmUgQ1IxX1NQRV9TZXQgICAgICAgICAgKCh1aW50MTZfdCkweDAwNDApDQotI2RlZmluZSBDUjFfU1BFX1Jlc2V0ICAgICAgICAoKHVpbnQxNl90KTB4RkZCRikNCi0NCi0vKiBJMlMgSTJTRSBtYXNrICovDQotI2RlZmluZSBJMlNDRkdSX0kyU0VfU2V0ICAgICAoKHVpbnQxNl90KTB4MDQwMCkNCi0jZGVmaW5lIEkyU0NGR1JfSTJTRV9SZXNldCAgICgodWludDE2X3QpMHhGQkZGKQ0KLQ0KLS8qIFNQSSBDUkNOZXh0IG1hc2sgKi8NCi0jZGVmaW5lIENSMV9DUkNOZXh0X1NldCAgICAgICgodWludDE2X3QpMHgxMDAwKQ0KLQ0KLS8qIFNQSSBDUkNFTiBtYXNrICovDQotI2RlZmluZSBDUjFfQ1JDRU5fU2V0ICAgICAgICAoKHVpbnQxNl90KTB4MjAwMCkNCi0jZGVmaW5lIENSMV9DUkNFTl9SZXNldCAgICAgICgodWludDE2X3QpMHhERkZGKQ0KLQ0KLS8qIFNQSSBTU09FIG1hc2sgKi8NCi0jZGVmaW5lIENSMl9TU09FX1NldCAgICAgICAgICgodWludDE2X3QpMHgwMDA0KQ0KLSNkZWZpbmUgQ1IyX1NTT0VfUmVzZXQgICAgICAgKCh1aW50MTZfdCkweEZGRkIpDQotDQotLyogU1BJIHJlZ2lzdGVycyBNYXNrcyAqLw0KLSNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgKCh1aW50MTZfdCkweDMwNDApDQotI2RlZmluZSBJMlNDRkdSX0NMRUFSX01hc2sgICAoKHVpbnQxNl90KTB4RjA0MCkNCi0NCi0vKiBTUEkgb3IgSTJTIG1vZGUgc2VsZWN0aW9uIG1hc2tzICovDQotI2RlZmluZSBTUElfTW9kZV9TZWxlY3QgICAgICAoKHVpbnQxNl90KTB4RjdGRikNCi0jZGVmaW5lIEkyU19Nb2RlX1NlbGVjdCAgICAgICgodWludDE2X3QpMHgwODAwKSANCi0NCi0vKiBJMlMgY2xvY2sgc291cmNlIHNlbGVjdGlvbiBtYXNrcyAqLw0KLSNkZWZpbmUgSTJTMl9DTE9DS19TUkMgICAgICAgKCh1aW50MzJfdCkoMHgwMDAyMDAwMCkpDQotI2RlZmluZSBJMlMzX0NMT0NLX1NSQyAgICAgICAoKHVpbnQzMl90KSgweDAwMDQwMDAwKSkNCi0jZGVmaW5lIEkyU19NVUxfTUFTSyAgICAgICAgICgodWludDMyX3QpKDB4MDAwMEYwMDApKQ0KLSNkZWZpbmUgSTJTX0RJVl9NQVNLICAgICAgICAgKCh1aW50MzJfdCkoMHgwMDAwMDBGMCkpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfTWFjcm9zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfRnVuY3Rpb25zDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIFNQSXggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KLSAgKiAgIHJlc2V0IHZhbHVlcyAoQWZmZWN0cyBhbHNvIHRoZSBJMlNzKS4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU1BJX0kyU19EZUluaXQoU1BJX1R5cGVEZWYqIFNQSXgpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotDQotICBpZiAoU1BJeCA9PSBTUEkxKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgU1BJMSByZXNldCBzdGF0ZSAqLw0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1NQSTEsIEVOQUJMRSk7DQotICAgIC8qIFJlbGVhc2UgU1BJMSBmcm9tIHJlc2V0IHN0YXRlICovDQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfU1BJMSwgRElTQUJMRSk7DQotICB9DQotICBlbHNlIGlmIChTUEl4ID09IFNQSTIpDQotICB7DQotICAgIC8qIEVuYWJsZSBTUEkyIHJlc2V0IHN0YXRlICovDQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfU1BJMiwgRU5BQkxFKTsNCi0gICAgLyogUmVsZWFzZSBTUEkyIGZyb20gcmVzZXQgc3RhdGUgKi8NCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9TUEkyLCBESVNBQkxFKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgaWYgKFNQSXggPT0gU1BJMykNCi0gICAgew0KLSAgICAgIC8qIEVuYWJsZSBTUEkzIHJlc2V0IHN0YXRlICovDQotICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9TUEkzLCBFTkFCTEUpOw0KLSAgICAgIC8qIFJlbGVhc2UgU1BJMyBmcm9tIHJlc2V0IHN0YXRlICovDQotICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9TUEkzLCBESVNBQkxFKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU1BJeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFNQSV9Jbml0U3RydWN0Lg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFNQSV9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICAqICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNQSV9Jbml0KFNQSV9UeXBlRGVmKiBTUEl4LCBTUElfSW5pdFR5cGVEZWYqIFNQSV9Jbml0U3RydWN0KQ0KLXsNCi0gIHVpbnQxNl90IHRtcHJlZyA9IDA7DQotICANCi0gIC8qIGNoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOyAgIA0KLSAgDQotICAvKiBDaGVjayB0aGUgU1BJIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OX01PREUoU1BJX0luaXRTdHJ1Y3QtPlNQSV9EaXJlY3Rpb24pKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfTU9ERShTUElfSW5pdFN0cnVjdC0+U1BJX01vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfREFUQVNJWkUoU1BJX0luaXRTdHJ1Y3QtPlNQSV9EYXRhU2l6ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUE9MKFNQSV9Jbml0U3RydWN0LT5TUElfQ1BPTCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUEhBKFNQSV9Jbml0U3RydWN0LT5TUElfQ1BIQSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9OU1MoU1BJX0luaXRTdHJ1Y3QtPlNQSV9OU1MpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfQkFVRFJBVEVfUFJFU0NBTEVSKFNQSV9Jbml0U3RydWN0LT5TUElfQmF1ZFJhdGVQcmVzY2FsZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfRklSU1RfQklUKFNQSV9Jbml0U3RydWN0LT5TUElfRmlyc3RCaXQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX1BPTFlOT01JQUwoU1BJX0luaXRTdHJ1Y3QtPlNQSV9DUkNQb2x5bm9taWFsKSk7DQotDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIEdldCB0aGUgU1BJeCBDUjEgdmFsdWUgKi8NCi0gIHRtcHJlZyA9IFNQSXgtPkNSMTsNCi0gIC8qIENsZWFyIEJJRElNb2RlLCBCSURJT0UsIFJ4T05MWSwgU1NNLCBTU0ksIExTQkZpcnN0LCBCUiwgTVNUUiwgQ1BPTCBhbmQgQ1BIQSBiaXRzICovDQotICB0bXByZWcgJj0gQ1IxX0NMRUFSX01hc2s7DQotICAvKiBDb25maWd1cmUgU1BJeDogZGlyZWN0aW9uLCBOU1MgbWFuYWdlbWVudCwgZmlyc3QgdHJhbnNtaXR0ZWQgYml0LCBCYXVkUmF0ZSBwcmVzY2FsZXINCi0gICAgIG1hc3Rlci9zYWx2ZSBtb2RlLCBDUE9MIGFuZCBDUEhBICovDQotICAvKiBTZXQgQklESW1vZGUsIEJJRElPRSBhbmQgUnhPTkxZIGJpdHMgYWNjb3JkaW5nIHRvIFNQSV9EaXJlY3Rpb24gdmFsdWUgKi8NCi0gIC8qIFNldCBTU00sIFNTSSBhbmQgTVNUUiBiaXRzIGFjY29yZGluZyB0byBTUElfTW9kZSBhbmQgU1BJX05TUyB2YWx1ZXMgKi8NCi0gIC8qIFNldCBMU0JGaXJzdCBiaXQgYWNjb3JkaW5nIHRvIFNQSV9GaXJzdEJpdCB2YWx1ZSAqLw0KLSAgLyogU2V0IEJSIGJpdHMgYWNjb3JkaW5nIHRvIFNQSV9CYXVkUmF0ZVByZXNjYWxlciB2YWx1ZSAqLw0KLSAgLyogU2V0IENQT0wgYml0IGFjY29yZGluZyB0byBTUElfQ1BPTCB2YWx1ZSAqLw0KLSAgLyogU2V0IENQSEEgYml0IGFjY29yZGluZyB0byBTUElfQ1BIQSB2YWx1ZSAqLw0KLSAgdG1wcmVnIHw9ICh1aW50MTZfdCkoKHVpbnQzMl90KVNQSV9Jbml0U3RydWN0LT5TUElfRGlyZWN0aW9uIHwgU1BJX0luaXRTdHJ1Y3QtPlNQSV9Nb2RlIHwNCi0gICAgICAgICAgICAgICAgICBTUElfSW5pdFN0cnVjdC0+U1BJX0RhdGFTaXplIHwgU1BJX0luaXRTdHJ1Y3QtPlNQSV9DUE9MIHwgIA0KLSAgICAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5TUElfQ1BIQSB8IFNQSV9Jbml0U3RydWN0LT5TUElfTlNTIHwgIA0KLSAgICAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5TUElfQmF1ZFJhdGVQcmVzY2FsZXIgfCBTUElfSW5pdFN0cnVjdC0+U1BJX0ZpcnN0Qml0KTsNCi0gIC8qIFdyaXRlIHRvIFNQSXggQ1IxICovDQotICBTUEl4LT5DUjEgPSB0bXByZWc7DQotICANCi0gIC8qIEFjdGl2YXRlIHRoZSBTUEkgbW9kZSAoUmVzZXQgSTJTTU9EIGJpdCBpbiBJMlNDRkdSIHJlZ2lzdGVyKSAqLw0KLSAgU1BJeC0+STJTQ0ZHUiAmPSBTUElfTW9kZV9TZWxlY3Q7CQkNCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUkNQT0xZIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogV3JpdGUgdG8gU1BJeCBDUkNQT0xZICovDQotICBTUEl4LT5DUkNQUiA9IFNQSV9Jbml0U3RydWN0LT5TUElfQ1JDUG9seW5vbWlhbDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNQSXggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCANCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBJMlNfSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZSAgMiBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwNCi0gICogICAoY29uZmlndXJlZCBpbiBJMlMgbW9kZSkuDQotICAqIEBwYXJhbSAgSTJTX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYW4gSTJTX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICAqICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIHBlcmlwaGVyYWwNCi0gICogICBjb25maWd1cmVkIGluIEkyUyBtb2RlLg0KLSAgKiBAbm90ZQ0KLSAgKiAgVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG9wdGltYWwgcHJlc2NhbGVyIG5lZWRlZCB0byBvYnRhaW4gdGhlIG1vc3QgDQotICAqICBhY2N1cmF0ZSBhdWRpbyBmcmVxdWVuY3kgKGRlcGVuZGluZyBvbiB0aGUgSTJTIGNsb2NrIHNvdXJjZSwgdGhlIFBMTCB2YWx1ZXMgDQotICAqICBhbmQgdGhlIHByb2R1Y3QgY29uZmlndXJhdGlvbikuIEJ1dCBpbiBjYXNlIHRoZSBwcmVzY2FsZXIgdmFsdWUgaXMgZ3JlYXRlciANCi0gICogIHRoYW4gNTExLCB0aGUgZGVmYXVsdCB2YWx1ZSAoMHgwMikgd2lsbCBiZSBjb25maWd1cmVkIGluc3RlYWQuICAqICAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIEkyU19Jbml0KFNQSV9UeXBlRGVmKiBTUEl4LCBJMlNfSW5pdFR5cGVEZWYqIEkyU19Jbml0U3RydWN0KQ0KLXsNCi0gIHVpbnQxNl90IHRtcHJlZyA9IDAsIGkyc2RpdiA9IDIsIGkyc29kZCA9IDAsIHBhY2tldGxlbmd0aCA9IDE7DQotICB1aW50MzJfdCB0bXAgPSAwOw0KLSAgUkNDX0Nsb2Nrc1R5cGVEZWYgUkNDX0Nsb2NrczsNCi0gIHVpbnQzMl90IHNvdXJjZWNsb2NrID0gMDsNCi0gIA0KLSAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJXzIzX1BFUklQSChTUEl4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJTX01PREUoSTJTX0luaXRTdHJ1Y3QtPkkyU19Nb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJTX1NUQU5EQVJEKEkyU19Jbml0U3RydWN0LT5JMlNfU3RhbmRhcmQpKTsNCi0gIGFzc2VydF9wYXJhbShJU19JMlNfREFUQV9GT1JNQVQoSTJTX0luaXRTdHJ1Y3QtPkkyU19EYXRhRm9ybWF0KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJTX01DTEtfT1VUUFVUKEkyU19Jbml0U3RydWN0LT5JMlNfTUNMS091dHB1dCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0kyU19BVURJT19GUkVRKEkyU19Jbml0U3RydWN0LT5JMlNfQXVkaW9GcmVxKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfSTJTX0NQT0woSTJTX0luaXRTdHJ1Y3QtPkkyU19DUE9MKSk7ICANCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTQ0ZHUiAmIEkyU1BSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogQ2xlYXIgSTJTTU9ELCBJMlNFLCBJMlNDRkcsIFBDTVNZTkMsIEkyU1NURCwgQ0tQT0wsIERBVExFTiBhbmQgQ0hMRU4gYml0cyAqLw0KLSAgU1BJeC0+STJTQ0ZHUiAmPSBJMlNDRkdSX0NMRUFSX01hc2s7IA0KLSAgU1BJeC0+STJTUFIgPSAweDAwMDI7DQotICANCi0gIC8qIEdldCB0aGUgSTJTQ0ZHUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wcmVnID0gU1BJeC0+STJTQ0ZHUjsNCi0gIA0KLSAgLyogSWYgdGhlIGRlZmF1bHQgdmFsdWUgaGFzIHRvIGJlIHdyaXR0ZW4sIHJlaW5pdGlhbGl6ZSBpMnNkaXYgYW5kIGkyc29kZCovDQotICBpZihJMlNfSW5pdFN0cnVjdC0+STJTX0F1ZGlvRnJlcSA9PSBJMlNfQXVkaW9GcmVxX0RlZmF1bHQpDQotICB7DQotICAgIGkyc29kZCA9ICh1aW50MTZfdCkwOw0KLSAgICBpMnNkaXYgPSAodWludDE2X3QpMjsgICANCi0gIH0NCi0gIC8qIElmIHRoZSByZXF1ZXN0ZWQgYXVkaW8gZnJlcXVlbmN5IGlzIG5vdCB0aGUgZGVmYXVsdCwgY29tcHV0ZSB0aGUgcHJlc2NhbGVyICovDQotICBlbHNlDQotICB7DQotICAgIC8qIENoZWNrIHRoZSBmcmFtZSBsZW5ndGggKEZvciB0aGUgUHJlc2NhbGVyIGNvbXB1dGluZykgKi8NCi0gICAgaWYoSTJTX0luaXRTdHJ1Y3QtPkkyU19EYXRhRm9ybWF0ID09IEkyU19EYXRhRm9ybWF0XzE2YikNCi0gICAgew0KLSAgICAgIC8qIFBhY2tldCBsZW5ndGggaXMgMTYgYml0cyAqLw0KLSAgICAgIHBhY2tldGxlbmd0aCA9IDE7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogUGFja2V0IGxlbmd0aCBpcyAzMiBiaXRzICovDQotICAgICAgcGFja2V0bGVuZ3RoID0gMjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBHZXQgdGhlIEkyUyBjbG9jayBzb3VyY2UgbWFzayBkZXBlbmRpbmcgb24gdGhlIHBlcmlwaGVyYWwgbnVtYmVyICovDQotICAgIGlmKCgodWludDMyX3QpU1BJeCkgPT0gU1BJMl9CQVNFKQ0KLSAgICB7DQotICAgICAgLyogVGhlIG1hc2sgaXMgcmVsYXRpdmUgdG8gSTJTMiAqLw0KLSAgICAgIHRtcCA9IEkyUzJfQ0xPQ0tfU1JDOw0KLSAgICB9DQotICAgIGVsc2UgDQotICAgIHsNCi0gICAgICAvKiBUaGUgbWFzayBpcyByZWxhdGl2ZSB0byBJMlMzICovICAgICAgDQotICAgICAgdG1wID0gSTJTM19DTE9DS19TUkM7DQotICAgIH0NCi0NCi0gICAgLyogQ2hlY2sgdGhlIEkyUyBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gdGhlIERldmljZToNCi0gICAgICAgT25seSBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzIGhhdmUgdGhlIFBMTDMgVkNPIGNsb2NrICovDQotI2lmZGVmIFNUTTMyRjEwWF9DTA0KLSAgICBpZigoUkNDLT5DRkdSMiAmIHRtcCkgIT0gMCkNCi0gICAgew0KLSAgICAgIC8qIEdldCB0aGUgY29uZmlndXJhdGlvbiBiaXRzIG9mIFJDQyBQTEwzIG11bHRpcGxpZXIgKi8NCi0gICAgICB0bXAgPSAodWludDMyX3QpKChSQ0MtPkNGR1IyICYgSTJTX01VTF9NQVNLKSA+PiAxMik7DQotDQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgUExMMyBtdWx0aXBsaWVyICovICAgICAgDQotICAgICAgaWYoKHRtcCA+IDUpICYmICh0bXAgPCAxNSkpDQotICAgICAgew0KLSAgICAgICAgLyogTXVsdHBsaWVyIGlzIGJldHdlZW4gOCBhbmQgMTQgKHZhbHVlIDE1IGlzIGZvcmJpZGRlbikgKi8NCi0gICAgICAgIHRtcCArPSAyOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgaWYgKHRtcCA9PSAxNSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgLyogTXVsdGlwbGllciBpcyAyMCAqLw0KLSAgICAgICAgICB0bXAgPSAyMDsNCi0gICAgICAgIH0NCi0gICAgICB9ICAgICAgDQotICAgICAgLyogR2V0IHRoZSBQUkVESVYyIHZhbHVlICovDQotICAgICAgc291cmNlY2xvY2sgPSAodWludDMyX3QpKCgoUkNDLT5DRkdSMiAmIEkyU19ESVZfTUFTSykgPj4gNCkgKyAxKTsNCi0gICAgICANCi0gICAgICAvKiBDYWxjdWxhdGUgdGhlIFNvdXJjZSBDbG9jayBmcmVxdWVuY3kgYmFzZWQgb24gUExMMyBhbmQgUFJFRElWMiB2YWx1ZXMgKi8NCi0gICAgICBzb3VyY2VjbG9jayA9ICh1aW50MzJfdCkgKChIU0VfVmFsdWUgLyBzb3VyY2VjbG9jaykgKiB0bXAgKiAyKTsgDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgLyogSTJTIENsb2NrIHNvdXJjZSBpcyBTeXN0ZW0gY2xvY2s6IEdldCBTeXN0ZW0gQ2xvY2sgZnJlcXVlbmN5ICovDQotICAgICAgUkNDX0dldENsb2Nrc0ZyZXEoJlJDQ19DbG9ja3MpOyAgICAgIA0KLSAgICAgIA0KLSAgICAgIC8qIEdldCB0aGUgc291cmNlIGNsb2NrIHZhbHVlOiBiYXNlZCBvbiBTeXN0ZW0gQ2xvY2sgdmFsdWUgKi8NCi0gICAgICBzb3VyY2VjbG9jayA9IFJDQ19DbG9ja3MuU1lTQ0xLX0ZyZXF1ZW5jeTsNCi0gICAgfSAgICAgICAgDQotI2Vsc2UgLyogU1RNMzJGMTBYX0hEICovDQotICAgIC8qIEkyUyBDbG9jayBzb3VyY2UgaXMgU3lzdGVtIGNsb2NrOiBHZXQgU3lzdGVtIENsb2NrIGZyZXF1ZW5jeSAqLw0KLSAgICBSQ0NfR2V0Q2xvY2tzRnJlcSgmUkNDX0Nsb2Nrcyk7ICAgICAgDQotICAgICAgDQotICAgIC8qIEdldCB0aGUgc291cmNlIGNsb2NrIHZhbHVlOiBiYXNlZCBvbiBTeXN0ZW0gQ2xvY2sgdmFsdWUgKi8NCi0gICAgc291cmNlY2xvY2sgPSBSQ0NfQ2xvY2tzLlNZU0NMS19GcmVxdWVuY3k7ICAgIA0KLSNlbmRpZiAvKiBTVE0zMkYxMFhfQ0wgKi8gICAgDQotDQotICAgIC8qIENvbXB1dGUgdGhlIFJlYWwgZGl2aWRlciBkZXBlbmRpbmcgb24gdGhlIE1DTEsgb3V0cHV0IHN0YXRlIHdpdGggYSBmbGFvdGluZyBwb2ludCAqLw0KLSAgICBpZihJMlNfSW5pdFN0cnVjdC0+STJTX01DTEtPdXRwdXQgPT0gSTJTX01DTEtPdXRwdXRfRW5hYmxlKQ0KLSAgICB7DQotICAgICAgLyogTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCAqLw0KLSAgICAgIHRtcCA9ICh1aW50MTZfdCkoKCgoKHNvdXJjZWNsb2NrIC8gMjU2KSAqIDEwKSAvIEkyU19Jbml0U3RydWN0LT5JMlNfQXVkaW9GcmVxKSkgKyA1KTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAvKiBNQ0xLIG91dHB1dCBpcyBkaXNhYmxlZCAqLw0KLSAgICAgIHRtcCA9ICh1aW50MTZfdCkoKCgoKHNvdXJjZWNsb2NrIC8gKDMyICogcGFja2V0bGVuZ3RoKSkgKjEwICkgLyBJMlNfSW5pdFN0cnVjdC0+STJTX0F1ZGlvRnJlcSkpICsgNSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qIFJlbW92ZSB0aGUgZmxhb3RpbmcgcG9pbnQgKi8NCi0gICAgdG1wID0gdG1wIC8gMTA7ICANCi0gICAgICANCi0gICAgLyogQ2hlY2sgdGhlIHBhcml0eSBvZiB0aGUgZGl2aWRlciAqLw0KLSAgICBpMnNvZGQgPSAodWludDE2X3QpKHRtcCAmICh1aW50MTZfdCkweDAwMDEpOw0KLSAgIA0KLSAgICAvKiBDb21wdXRlIHRoZSBpMnNkaXYgcHJlc2NhbGVyICovDQotICAgIGkyc2RpdiA9ICh1aW50MTZfdCkoKHRtcCAtIGkyc29kZCkgLyAyKTsNCi0gICANCi0gICAgLyogR2V0IHRoZSBNYXNrIGZvciB0aGUgT2RkIGJpdCAoU1BJX0kyU1BSWzhdKSByZWdpc3RlciAqLw0KLSAgICBpMnNvZGQgPSAodWludDE2X3QpIChpMnNvZGQgPDwgOCk7DQotICB9DQotICANCi0gIC8qIFRlc3QgaWYgdGhlIGRpdmlkZXIgaXMgMSBvciAwIG9yIGdyZWF0ZXIgdGhhbiAweEZGICovDQotICBpZiAoKGkyc2RpdiA8IDIpIHx8IChpMnNkaXYgPiAweEZGKSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyAqLw0KLSAgICBpMnNkaXYgPSAyOw0KLSAgICBpMnNvZGQgPSAwOw0KLSAgfQ0KLQ0KLSAgLyogV3JpdGUgdG8gU1BJeCBJMlNQUiByZWdpc3RlciB0aGUgY29tcHV0ZWQgdmFsdWUgKi8NCi0gIFNQSXgtPkkyU1BSID0gKHVpbnQxNl90KShpMnNkaXYgfCAodWludDE2X3QpKGkyc29kZCB8ICh1aW50MTZfdClJMlNfSW5pdFN0cnVjdC0+STJTX01DTEtPdXRwdXQpKTsgIA0KLSANCi0gIC8qIENvbmZpZ3VyZSB0aGUgSTJTIHdpdGggdGhlIFNQSV9Jbml0U3RydWN0IHZhbHVlcyAqLw0KLSAgdG1wcmVnIHw9ICh1aW50MTZfdCkoSTJTX01vZGVfU2VsZWN0IHwgKHVpbnQxNl90KShJMlNfSW5pdFN0cnVjdC0+STJTX01vZGUgfCBcDQotICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KShJMlNfSW5pdFN0cnVjdC0+STJTX1N0YW5kYXJkIHwgKHVpbnQxNl90KShJMlNfSW5pdFN0cnVjdC0+STJTX0RhdGFGb3JtYXQgfCBcDQotICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KUkyU19Jbml0U3RydWN0LT5JMlNfQ1BPTCkpKSk7DQotIA0KLSAgLyogV3JpdGUgdG8gU1BJeCBJMlNDRkdSICovICANCi0gIFNQSXgtPkkyU0NGR1IgPSB0bXByZWc7ICAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggU1BJX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQotICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfU3RydWN0SW5pdChTUElfSW5pdFR5cGVEZWYqIFNQSV9Jbml0U3RydWN0KQ0KLXsNCi0vKi0tLS0tLS0tLS0tLS0tLSBSZXNldCBTUEkgaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0RpcmVjdGlvbiBtZW1iZXIgKi8NCi0gIFNQSV9Jbml0U3RydWN0LT5TUElfRGlyZWN0aW9uID0gU1BJX0RpcmVjdGlvbl8yTGluZXNfRnVsbER1cGxleDsNCi0gIC8qIGluaXRpYWxpemUgdGhlIFNQSV9Nb2RlIG1lbWJlciAqLw0KLSAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9Nb2RlID0gU1BJX01vZGVfU2xhdmU7DQotICAvKiBpbml0aWFsaXplIHRoZSBTUElfRGF0YVNpemUgbWVtYmVyICovDQotICBTUElfSW5pdFN0cnVjdC0+U1BJX0RhdGFTaXplID0gU1BJX0RhdGFTaXplXzhiOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0NQT0wgbWVtYmVyICovDQotICBTUElfSW5pdFN0cnVjdC0+U1BJX0NQT0wgPSBTUElfQ1BPTF9Mb3c7DQotICAvKiBJbml0aWFsaXplIHRoZSBTUElfQ1BIQSBtZW1iZXIgKi8NCi0gIFNQSV9Jbml0U3RydWN0LT5TUElfQ1BIQSA9IFNQSV9DUEhBXzFFZGdlOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX05TUyBtZW1iZXIgKi8NCi0gIFNQSV9Jbml0U3RydWN0LT5TUElfTlNTID0gU1BJX05TU19IYXJkOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0JhdWRSYXRlUHJlc2NhbGVyIG1lbWJlciAqLw0KLSAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9CYXVkUmF0ZVByZXNjYWxlciA9IFNQSV9CYXVkUmF0ZVByZXNjYWxlcl8yOw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0ZpcnN0Qml0IG1lbWJlciAqLw0KLSAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9GaXJzdEJpdCA9IFNQSV9GaXJzdEJpdF9NU0I7DQotICAvKiBJbml0aWFsaXplIHRoZSBTUElfQ1JDUG9seW5vbWlhbCBtZW1iZXIgKi8NCi0gIFNQSV9Jbml0U3RydWN0LT5TUElfQ1JDUG9seW5vbWlhbCA9IDc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggSTJTX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQotICAqIEBwYXJhbSAgSTJTX0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgSTJTX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMlNfU3RydWN0SW5pdChJMlNfSW5pdFR5cGVEZWYqIEkyU19Jbml0U3RydWN0KQ0KLXsNCi0vKi0tLS0tLS0tLS0tLS0tLSBSZXNldCBJMlMgaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSTJTX01vZGUgbWVtYmVyICovDQotICBJMlNfSW5pdFN0cnVjdC0+STJTX01vZGUgPSBJMlNfTW9kZV9TbGF2ZVR4Ow0KLSAgDQotICAvKiBJbml0aWFsaXplIHRoZSBJMlNfU3RhbmRhcmQgbWVtYmVyICovDQotICBJMlNfSW5pdFN0cnVjdC0+STJTX1N0YW5kYXJkID0gSTJTX1N0YW5kYXJkX1BoaWxsaXBzOw0KLSAgDQotICAvKiBJbml0aWFsaXplIHRoZSBJMlNfRGF0YUZvcm1hdCBtZW1iZXIgKi8NCi0gIEkyU19Jbml0U3RydWN0LT5JMlNfRGF0YUZvcm1hdCA9IEkyU19EYXRhRm9ybWF0XzE2YjsNCi0gIA0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgSTJTX01DTEtPdXRwdXQgbWVtYmVyICovDQotICBJMlNfSW5pdFN0cnVjdC0+STJTX01DTEtPdXRwdXQgPSBJMlNfTUNMS091dHB1dF9EaXNhYmxlOw0KLSAgDQotICAvKiBJbml0aWFsaXplIHRoZSBJMlNfQXVkaW9GcmVxIG1lbWJlciAqLw0KLSAgSTJTX0luaXRTdHJ1Y3QtPkkyU19BdWRpb0ZyZXEgPSBJMlNfQXVkaW9GcmVxX0RlZmF1bHQ7DQotICANCi0gIC8qIEluaXRpYWxpemUgdGhlIEkyU19DUE9MIG1lbWJlciAqLw0KLSAgSTJTX0luaXRTdHJ1Y3QtPkkyU19DUE9MID0gSTJTX0NQT0xfTG93Ow0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgU1BJIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgU1BJeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU1BJeCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfQ21kKFNQSV9UeXBlRGVmKiBTUEl4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIHBlcmlwaGVyYWwgKi8NCi0gICAgU1BJeC0+Q1IxIHw9IENSMV9TUEVfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkgcGVyaXBoZXJhbCAqLw0KLSAgICBTUEl4LT5DUjEgJj0gQ1IxX1NQRV9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkuDQotICAqIEBwYXJhbSAgU1BJeDogd2hlcmUgeCBjYW4gYmUgMiBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU1BJeCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBJMlNfQ21kKFNQSV9UeXBlRGVmKiBTUEl4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfMjNfUEVSSVBIKFNQSXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTUEkgcGVyaXBoZXJhbCAoaW4gSTJTIG1vZGUpICovDQotICAgIFNQSXgtPkkyU0NGR1IgfD0gSTJTQ0ZHUl9JMlNFX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIHBlcmlwaGVyYWwgKGluIEkyUyBtb2RlKSAqLw0KLSAgICBTUEl4LT5JMlNDRkdSICY9IEkyU0NGR1JfSTJTRV9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFNQSS9JMlMgaW50ZXJydXB0cy4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZQ0KLSAgKiAgIC0gMSwgMiBvciAzIGluIFNQSSBtb2RlIA0KLSAgKiAgIC0gMiBvciAzIGluIEkyUyBtb2RlDQotICAqIEBwYXJhbSAgU1BJX0kyU19JVDogc3BlY2lmaWVzIHRoZSBTUEkvSTJTIGludGVycnVwdCBzb3VyY2UgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU1BJX0kyU19JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgbWFzaw0KLSAgKiAgICAgQGFyZyBTUElfSTJTX0lUX1JYTkU6IFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IG1hc2sNCi0gICogICAgIEBhcmcgU1BJX0kyU19JVF9FUlI6IEVycm9yIGludGVycnVwdCBtYXNrDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFNQSS9JMlMgaW50ZXJydXB0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNQSV9JMlNfSVRDb25maWcoU1BJX1R5cGVEZWYqIFNQSXgsIHVpbnQ4X3QgU1BJX0kyU19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIHVpbnQxNl90IGl0cG9zID0gMCwgaXRtYXNrID0gMCA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfUEVSSVBIKFNQSXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0kyU19DT05GSUdfSVQoU1BJX0kyU19JVCkpOw0KLQ0KLSAgLyogR2V0IHRoZSBTUEkvSTJTIElUIGluZGV4ICovDQotICBpdHBvcyA9IFNQSV9JMlNfSVQgPj4gNDsNCi0NCi0gIC8qIFNldCB0aGUgSVQgbWFzayAqLw0KLSAgaXRtYXNrID0gKHVpbnQxNl90KTEgPDwgKHVpbnQxNl90KWl0cG9zOw0KLQ0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJL0kyUyBpbnRlcnJ1cHQgKi8NCi0gICAgU1BJeC0+Q1IyIHw9IGl0bWFzazsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU1BJL0kyUyBpbnRlcnJ1cHQgKi8NCi0gICAgU1BJeC0+Q1IyICY9ICh1aW50MTZfdCl+aXRtYXNrOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTUEl4L0kyU3ggRE1BIGludGVyZmFjZS4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZQ0KLSAgKiAgIC0gMSwgMiBvciAzIGluIFNQSSBtb2RlIA0KLSAgKiAgIC0gMiBvciAzIGluIEkyUyBtb2RlDQotICAqIEBwYXJhbSAgU1BJX0kyU19ETUFSZXE6IHNwZWNpZmllcyB0aGUgU1BJL0kyUyBETUEgdHJhbnNmZXIgcmVxdWVzdCB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBTUElfSTJTX0RNQVJlcV9UeDogVHggYnVmZmVyIERNQSB0cmFuc2ZlciByZXF1ZXN0DQotICAqICAgICBAYXJnIFNQSV9JMlNfRE1BUmVxX1J4OiBSeCBidWZmZXIgRE1BIHRyYW5zZmVyIHJlcXVlc3QNCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBTUEkvSTJTIERNQSB0cmFuc2ZlciByZXF1ZXN0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNQSV9JMlNfRE1BQ21kKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfSTJTX0RNQVJlcSwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfSTJTX0RNQVJFUShTUElfSTJTX0RNQVJlcSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJL0kyUyBETUEgcmVxdWVzdHMgKi8NCi0gICAgU1BJeC0+Q1IyIHw9IFNQSV9JMlNfRE1BUmVxOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkvSTJTIERNQSByZXF1ZXN0cyAqLw0KLSAgICBTUEl4LT5DUjIgJj0gKHVpbnQxNl90KX5TUElfSTJTX0RNQVJlcTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgVHJhbnNtaXRzIGEgRGF0YSB0aHJvdWdoIHRoZSBTUEl4L0kyU3ggcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZQ0KLSAgKiAgIC0gMSwgMiBvciAzIGluIFNQSSBtb2RlIA0KLSAgKiAgIC0gMiBvciAzIGluIEkyUyBtb2RlDQotICAqIEBwYXJhbSAgRGF0YSA6IERhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNQSV9JMlNfU2VuZERhdGEoU1BJX1R5cGVEZWYqIFNQSXgsIHVpbnQxNl90IERhdGEpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotICANCi0gIC8qIFdyaXRlIGluIHRoZSBEUiByZWdpc3RlciB0aGUgZGF0YSB0byBiZSBzZW50ICovDQotICBTUEl4LT5EUiA9IERhdGE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHJlY2VpdmVkIGRhdGEgYnkgdGhlIFNQSXgvSTJTeCBwZXJpcGhlcmFsLiANCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZQ0KLSAgKiAgIC0gMSwgMiBvciAzIGluIFNQSSBtb2RlIA0KLSAgKiAgIC0gMiBvciAzIGluIEkyUyBtb2RlDQotICAqIEByZXR2YWwgVGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlZCBkYXRhLg0KLSAgKi8NCi11aW50MTZfdCBTUElfSTJTX1JlY2VpdmVEYXRhKFNQSV9UeXBlRGVmKiBTUEl4KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgDQotICAvKiBSZXR1cm4gdGhlIGRhdGEgaW4gdGhlIERSIHJlZ2lzdGVyICovDQotICByZXR1cm4gU1BJeC0+RFI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgaW50ZXJuYWxseSBieSBzb2Z0d2FyZSB0aGUgTlNTIHBpbiBmb3IgdGhlIHNlbGVjdGVkIFNQSS4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBTUElfTlNTSW50ZXJuYWxTb2Z0OiBzcGVjaWZpZXMgdGhlIFNQSSBOU1MgaW50ZXJuYWwgc3RhdGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU1BJX05TU0ludGVybmFsU29mdF9TZXQ6IFNldCBOU1MgcGluIGludGVybmFsbHkNCi0gICogICAgIEBhcmcgU1BJX05TU0ludGVybmFsU29mdF9SZXNldDogUmVzZXQgTlNTIHBpbiBpbnRlcm5hbGx5DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFNQSV9OU1NJbnRlcm5hbFNvZnR3YXJlQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfTlNTSW50ZXJuYWxTb2Z0KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9OU1NfSU5URVJOQUwoU1BJX05TU0ludGVybmFsU29mdCkpOw0KLSAgaWYgKFNQSV9OU1NJbnRlcm5hbFNvZnQgIT0gU1BJX05TU0ludGVybmFsU29mdF9SZXNldCkNCi0gIHsNCi0gICAgLyogU2V0IE5TUyBwaW4gaW50ZXJuYWxseSBieSBzb2Z0d2FyZSAqLw0KLSAgICBTUEl4LT5DUjEgfD0gU1BJX05TU0ludGVybmFsU29mdF9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFJlc2V0IE5TUyBwaW4gaW50ZXJuYWxseSBieSBzb2Z0d2FyZSAqLw0KLSAgICBTUEl4LT5DUjEgJj0gU1BJX05TU0ludGVybmFsU29mdF9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU1Mgb3V0cHV0IGZvciB0aGUgc2VsZWN0ZWQgU1BJLg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFNQSXggU1Mgb3V0cHV0LiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfU1NPdXRwdXRDbWQoU1BJX1R5cGVEZWYqIFNQSXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfUEVSSVBIKFNQSXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTUEkgU1Mgb3V0cHV0ICovDQotICAgIFNQSXgtPkNSMiB8PSBDUjJfU1NPRV9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNQSSBTUyBvdXRwdXQgKi8NCi0gICAgU1BJeC0+Q1IyICY9IENSMl9TU09FX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBkYXRhIHNpemUgZm9yIHRoZSBzZWxlY3RlZCBTUEkuDQotICAqIEBwYXJhbSAgU1BJeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgU1BJX0RhdGFTaXplOiBzcGVjaWZpZXMgdGhlIFNQSSBkYXRhIHNpemUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU1BJX0RhdGFTaXplXzE2YjogU2V0IGRhdGEgZnJhbWUgZm9ybWF0IHRvIDE2Yml0DQotICAqICAgICBAYXJnIFNQSV9EYXRhU2l6ZV84YjogU2V0IGRhdGEgZnJhbWUgZm9ybWF0IHRvIDhiaXQNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU1BJX0RhdGFTaXplQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfRGF0YVNpemUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RBVEFTSVpFKFNQSV9EYXRhU2l6ZSkpOw0KLSAgLyogQ2xlYXIgREZGIGJpdCAqLw0KLSAgU1BJeC0+Q1IxICY9ICh1aW50MTZfdCl+U1BJX0RhdGFTaXplXzE2YjsNCi0gIC8qIFNldCBuZXcgREZGIGJpdCB2YWx1ZSAqLw0KLSAgU1BJeC0+Q1IxIHw9IFNQSV9EYXRhU2l6ZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgVHJhbnNtaXQgdGhlIFNQSXggQ1JDIHZhbHVlLg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfVHJhbnNtaXRDUkMoU1BJX1R5cGVEZWYqIFNQSXgpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotICANCi0gIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIENSQyB0cmFuc21pc3Npb24gKi8NCi0gIFNQSXgtPkNSMSB8PSBDUjFfQ1JDTmV4dF9TZXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIENSQyB2YWx1ZSBjYWxjdWxhdGlvbiBvZiB0aGUgdHJhbnNmZXJlZCBieXRlcy4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTUEl4IENSQyB2YWx1ZSBjYWxjdWxhdGlvbi4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfQ2FsY3VsYXRlQ1JDKFNQSV9UeXBlRGVmKiBTUEl4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIENSQyBjYWxjdWxhdGlvbiAqLw0KLSAgICBTUEl4LT5DUjEgfD0gQ1IxX0NSQ0VOX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIENSQyBjYWxjdWxhdGlvbiAqLw0KLSAgICBTUEl4LT5DUjEgJj0gQ1IxX0NSQ0VOX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBSZXR1cm5zIHRoZSB0cmFuc21pdCBvciB0aGUgcmVjZWl2ZSBDUkMgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgU1BJLg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFNQSV9DUkM6IHNwZWNpZmllcyB0aGUgQ1JDIHJlZ2lzdGVyIHRvIGJlIHJlYWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU1BJX0NSQ19UeDogU2VsZWN0cyBUeCBDUkMgcmVnaXN0ZXINCi0gICogICAgIEBhcmcgU1BJX0NSQ19SeDogU2VsZWN0cyBSeCBDUkMgcmVnaXN0ZXINCi0gICogQHJldHZhbCBUaGUgc2VsZWN0ZWQgQ1JDIHJlZ2lzdGVyIHZhbHVlLi4NCi0gICovDQotdWludDE2X3QgU1BJX0dldENSQyhTUElfVHlwZURlZiogU1BJeCwgdWludDhfdCBTUElfQ1JDKQ0KLXsNCi0gIHVpbnQxNl90IGNyY3JlZyA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfUEVSSVBIKFNQSXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19TUElfQ1JDKFNQSV9DUkMpKTsNCi0gIGlmIChTUElfQ1JDICE9IFNQSV9DUkNfUngpDQotICB7DQotICAgIC8qIEdldCB0aGUgVHggQ1JDIHJlZ2lzdGVyICovDQotICAgIGNyY3JlZyA9IFNQSXgtPlRYQ1JDUjsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogR2V0IHRoZSBSeCBDUkMgcmVnaXN0ZXIgKi8NCi0gICAgY3JjcmVnID0gU1BJeC0+UlhDUkNSOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBzZWxlY3RlZCBDUkMgcmVnaXN0ZXIgKi8NCi0gIHJldHVybiBjcmNyZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIENSQyBQb2x5bm9taWFsIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIFNQSS4NCi0gICogQHBhcmFtICBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBUaGUgQ1JDIFBvbHlub21pYWwgcmVnaXN0ZXIgdmFsdWUuDQotICAqLw0KLXVpbnQxNl90IFNQSV9HZXRDUkNQb2x5bm9taWFsKFNQSV9UeXBlRGVmKiBTUEl4KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgDQotICAvKiBSZXR1cm4gdGhlIENSQyBwb2x5bm9taWFsIHJlZ2lzdGVyICovDQotICByZXR1cm4gU1BJeC0+Q1JDUFI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGluIGJpLWRpcmVjdGlvbmFsIG1vZGUgZm9yIHRoZSBzcGVjaWZpZWQgU1BJLg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFNQSV9EaXJlY3Rpb246IHNwZWNpZmllcyB0aGUgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gaW4gYmktZGlyZWN0aW9uYWwgbW9kZS4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU1BJX0RpcmVjdGlvbl9UeDogU2VsZWN0cyBUeCB0cmFuc21pc3Npb24gZGlyZWN0aW9uDQotICAqICAgICBAYXJnIFNQSV9EaXJlY3Rpb25fUng6IFNlbGVjdHMgUnggcmVjZWl2ZSBkaXJlY3Rpb24NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgU1BJX0JpRGlyZWN0aW9uYWxMaW5lQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfRGlyZWN0aW9uKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT04oU1BJX0RpcmVjdGlvbikpOw0KLSAgaWYgKFNQSV9EaXJlY3Rpb24gPT0gU1BJX0RpcmVjdGlvbl9UeCkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBUeCBvbmx5IG1vZGUgKi8NCi0gICAgU1BJeC0+Q1IxIHw9IFNQSV9EaXJlY3Rpb25fVHg7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFNldCB0aGUgUnggb25seSBtb2RlICovDQotICAgIFNQSXgtPkNSMSAmPSBTUElfRGlyZWN0aW9uX1J4Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSS9JMlMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlDQotICAqICAgLSAxLCAyIG9yIDMgaW4gU1BJIG1vZGUgDQotICAqICAgLSAyIG9yIDMgaW4gSTJTIG1vZGUNCi0gICogQHBhcmFtICBTUElfSTJTX0ZMQUc6IHNwZWNpZmllcyB0aGUgU1BJL0kyUyBmbGFnIHRvIGNoZWNrLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBTUElfSTJTX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZy4NCi0gICogICAgIEBhcmcgU1BJX0kyU19GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnLg0KLSAgKiAgICAgQGFyZyBTUElfSTJTX0ZMQUdfQlNZOiBCdXN5IGZsYWcuDQotICAqICAgICBAYXJnIFNQSV9JMlNfRkxBR19PVlI6IE92ZXJydW4gZmxhZy4NCi0gICogICAgIEBhcmcgU1BJX0ZMQUdfTU9ERjogTW9kZSBGYXVsdCBmbGFnLg0KLSAgKiAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBFcnJvciBmbGFnLg0KLSAgKiAgICAgQGFyZyBJMlNfRkxBR19VRFI6IFVuZGVycnVuIEVycm9yIGZsYWcuDQotICAqICAgICBAYXJnIEkyU19GTEFHX0NIU0lERTogQ2hhbm5lbCBTaWRlIGZsYWcuDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBTUElfSTJTX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUZsYWdTdGF0dXMgU1BJX0kyU19HZXRGbGFnU3RhdHVzKFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50MTZfdCBTUElfSTJTX0ZMQUcpDQotew0KLSAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9JMlNfR0VUX0ZMQUcoU1BJX0kyU19GTEFHKSk7DQotICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgU1BJL0kyUyBmbGFnICovDQotICBpZiAoKFNQSXgtPlNSICYgU1BJX0kyU19GTEFHKSAhPSAodWludDE2X3QpUkVTRVQpDQotICB7DQotICAgIC8qIFNQSV9JMlNfRkxBRyBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBTUElfSTJTX0ZMQUcgaXMgcmVzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICAvKiBSZXR1cm4gdGhlIFNQSV9JMlNfRkxBRyBzdGF0dXMgKi8NCi0gIHJldHVybiAgYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIFNQSXggQ1JDIEVycm9yIChDUkNFUlIpIGZsYWcuDQotICAqIEBwYXJhbSAgU1BJeDogd2hlcmUgeCBjYW4gYmUNCi0gICogICAtIDEsIDIgb3IgMyBpbiBTUEkgbW9kZSANCi0gICogQHBhcmFtICBTUElfSTJTX0ZMQUc6IHNwZWNpZmllcyB0aGUgU1BJIGZsYWcgdG8gY2xlYXIuIA0KLSAgKiAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIG9ubHkgQ1JDRVJSIGZsYWcuDQotICAqIEBub3RlDQotICAqICAgLSBPVlIgKE92ZXJSdW4gZXJyb3IpIGZsYWcgaXMgY2xlYXJlZCBieSBzb2Z0d2FyZSBzZXF1ZW5jZTogYSByZWFkIA0KLSAgKiAgICAgb3BlcmF0aW9uIHRvIFNQSV9EUiByZWdpc3RlciAoU1BJX0kyU19SZWNlaXZlRGF0YSgpKSBmb2xsb3dlZCBieSBhIHJlYWQgDQotICAqICAgICBvcGVyYXRpb24gdG8gU1BJX1NSIHJlZ2lzdGVyIChTUElfSTJTX0dldEZsYWdTdGF0dXMoKSkuDQotICAqICAgLSBVRFIgKFVuZGVyUnVuIGVycm9yKSBmbGFnIGlzIGNsZWFyZWQgYnkgYSByZWFkIG9wZXJhdGlvbiB0byANCi0gICogICAgIFNQSV9TUiByZWdpc3RlciAoU1BJX0kyU19HZXRGbGFnU3RhdHVzKCkpLg0KLSAgKiAgIC0gTU9ERiAoTW9kZSBGYXVsdCkgZmxhZyBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQvd3JpdGUgDQotICAqICAgICBvcGVyYXRpb24gdG8gU1BJX1NSIHJlZ2lzdGVyIChTUElfSTJTX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSANCi0gICogICAgIHdyaXRlIG9wZXJhdGlvbiB0byBTUElfQ1IxIHJlZ2lzdGVyIChTUElfQ21kKCkgdG8gZW5hYmxlIHRoZSBTUEkpLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfSTJTX0NsZWFyRmxhZyhTUElfVHlwZURlZiogU1BJeCwgdWludDE2X3QgU1BJX0kyU19GTEFHKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9JMlNfQ0xFQVJfRkxBRyhTUElfSTJTX0ZMQUcpKTsNCi0gICAgDQotICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBTUEkgQ1JDIEVycm9yIChDUkNFUlIpIGZsYWcgKi8NCi0gICAgU1BJeC0+U1IgPSAodWludDE2X3QpflNQSV9JMlNfRkxBRzsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkvSTJTIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIFNQSXg6IHdoZXJlIHggY2FuIGJlDQotICAqICAgLSAxLCAyIG9yIDMgaW4gU1BJIG1vZGUgDQotICAqICAgLSAyIG9yIDMgaW4gSTJTIG1vZGUNCi0gICogQHBhcmFtICBTUElfSTJTX0lUOiBzcGVjaWZpZXMgdGhlIFNQSS9JMlMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgU1BJX0kyU19JVF9UWEU6IFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIFNQSV9JMlNfSVRfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdC4NCi0gICogICAgIEBhcmcgU1BJX0kyU19JVF9PVlI6IE92ZXJydW4gaW50ZXJydXB0Lg0KLSAgKiAgICAgQGFyZyBTUElfSVRfTU9ERjogTW9kZSBGYXVsdCBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIFNQSV9JVF9DUkNFUlI6IENSQyBFcnJvciBpbnRlcnJ1cHQuDQotICAqICAgICBAYXJnIEkyU19JVF9VRFI6IFVuZGVycnVuIEVycm9yIGludGVycnVwdC4NCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFNQSV9JMlNfSVQgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUlUU3RhdHVzIFNQSV9JMlNfR2V0SVRTdGF0dXMoU1BJX1R5cGVEZWYqIFNQSXgsIHVpbnQ4X3QgU1BJX0kyU19JVCkNCi17DQotICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIHVpbnQxNl90IGl0cG9zID0gMCwgaXRtYXNrID0gMCwgZW5hYmxlc3RhdHVzID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9QRVJJUEgoU1BJeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1NQSV9JMlNfR0VUX0lUKFNQSV9JMlNfSVQpKTsNCi0NCi0gIC8qIEdldCB0aGUgU1BJL0kyUyBJVCBpbmRleCAqLw0KLSAgaXRwb3MgPSAweDAxIDw8IChTUElfSTJTX0lUICYgMHgwRik7DQotDQotICAvKiBHZXQgdGhlIFNQSS9JMlMgSVQgbWFzayAqLw0KLSAgaXRtYXNrID0gU1BJX0kyU19JVCA+PiA0Ow0KLQ0KLSAgLyogU2V0IHRoZSBJVCBtYXNrICovDQotICBpdG1hc2sgPSAweDAxIDw8IGl0bWFzazsNCi0NCi0gIC8qIEdldCB0aGUgU1BJX0kyU19JVCBlbmFibGUgYml0IHN0YXR1cyAqLw0KLSAgZW5hYmxlc3RhdHVzID0gKFNQSXgtPkNSMiAmIGl0bWFzaykgOw0KLQ0KLSAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIFNQSS9JMlMgaW50ZXJydXB0ICovDQotICBpZiAoKChTUEl4LT5TUiAmIGl0cG9zKSAhPSAodWludDE2X3QpUkVTRVQpICYmIGVuYWJsZXN0YXR1cykNCi0gIHsNCi0gICAgLyogU1BJX0kyU19JVCBpcyBzZXQgKi8NCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBTUElfSTJTX0lUIGlzIHJlc2V0ICovDQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgLyogUmV0dXJuIHRoZSBTUElfSTJTX0lUIHN0YXR1cyAqLw0KLSAgcmV0dXJuIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBTUEl4IENSQyBFcnJvciAoQ1JDRVJSKSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQuDQotICAqIEBwYXJhbSAgU1BJeDogd2hlcmUgeCBjYW4gYmUNCi0gICogICAtIDEsIDIgb3IgMyBpbiBTUEkgbW9kZSANCi0gICogQHBhcmFtICBTUElfSTJTX0lUOiBzcGVjaWZpZXMgdGhlIFNQSSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQotICAqICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgb25seSBDUkNFUlIgaW50ZXRycnVwdCBwZW5kaW5nIGJpdC4gICANCi0gICogQG5vdGUNCi0gICogICAtIE9WUiAoT3ZlclJ1biBFcnJvcikgaW50ZXJydXB0IHBlbmRpbmcgYml0IGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgDQotICAqICAgICBzZXF1ZW5jZTogYSByZWFkIG9wZXJhdGlvbiB0byBTUElfRFIgcmVnaXN0ZXIgKFNQSV9JMlNfUmVjZWl2ZURhdGEoKSkgDQotICAqICAgICBmb2xsb3dlZCBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIFNQSV9TUiByZWdpc3RlciAoU1BJX0kyU19HZXRJVFN0YXR1cygpKS4NCi0gICogICAtIFVEUiAoVW5kZXJSdW4gRXJyb3IpIGludGVycnVwdCBwZW5kaW5nIGJpdCBpcyBjbGVhcmVkIGJ5IGEgcmVhZCANCi0gICogICAgIG9wZXJhdGlvbiB0byBTUElfU1IgcmVnaXN0ZXIgKFNQSV9JMlNfR2V0SVRTdGF0dXMoKSkuDQotICAqICAgLSBNT0RGIChNb2RlIEZhdWx0KSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgaXMgY2xlYXJlZCBieSBzb2Z0d2FyZSBzZXF1ZW5jZToNCi0gICogICAgIGEgcmVhZC93cml0ZSBvcGVyYXRpb24gdG8gU1BJX1NSIHJlZ2lzdGVyIChTUElfSTJTX0dldElUU3RhdHVzKCkpIA0KLSAgKiAgICAgZm9sbG93ZWQgYnkgYSB3cml0ZSBvcGVyYXRpb24gdG8gU1BJX0NSMSByZWdpc3RlciAoU1BJX0NtZCgpIHRvIGVuYWJsZSANCi0gICogICAgIHRoZSBTUEkpLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBTUElfSTJTX0NsZWFySVRQZW5kaW5nQml0KFNQSV9UeXBlRGVmKiBTUEl4LCB1aW50OF90IFNQSV9JMlNfSVQpDQotew0KLSAgdWludDE2X3QgaXRwb3MgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19TUElfQUxMX1BFUklQSChTUEl4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfU1BJX0kyU19DTEVBUl9JVChTUElfSTJTX0lUKSk7DQotDQotICAvKiBHZXQgdGhlIFNQSSBJVCBpbmRleCAqLw0KLSAgaXRwb3MgPSAweDAxIDw8IChTUElfSTJTX0lUICYgMHgwRik7DQotDQotICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgU1BJIENSQyBFcnJvciAoQ1JDRVJSKSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8NCi0gIFNQSXgtPlNSID0gKHVpbnQxNl90KX5pdHBvczsNCi19DQotLyoqDQotICAqIEB9DQotICAqLyANCi0NCi0vKioNCi0gICogQH0NCi0gICovIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8gDQotDQotLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCmRpZmYgLS1naXQgYS9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF90aW0uYyBiL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3RpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAxMDU1Li4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3RpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg4OCArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfdGltLmMNCi0gICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCi0gICogQHZlcnNpb24gVjMuNC4wDQotICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCi0gICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVElNIGZpcm13YXJlIGZ1bmN0aW9ucy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweF90aW0uaCINCi0jaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTSANCi0gICogQGJyaWVmIFRJTSBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRGVmaW5lcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTSByZWdpc3RlcnMgYml0IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotI2RlZmluZSBTTUNSX0VUUl9NYXNrICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwRkYpIA0KLSNkZWZpbmUgQ0NNUl9PZmZzZXQgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDE4KQ0KLSNkZWZpbmUgQ0NFUl9DQ0VfU2V0ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKSAgDQotI2RlZmluZQlDQ0VSX0NDTkVfU2V0ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpIA0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9WYXJpYWJsZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLXN0YXRpYyB2b2lkIFRJMV9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0KLXN0YXRpYyB2b2lkIFRJMl9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0KLXN0YXRpYyB2b2lkIFRJM19Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0KLXN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9WYXJpYWJsZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBUSU14IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0RlSW5pdChUSU1fVHlwZURlZiogVElNeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsgDQotIA0KLSAgaWYgKFRJTXggPT0gVElNMSkNCi0gIHsNCi0gICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xLCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTEsIERJU0FCTEUpOyAgDQotICB9ICAgICANCi0gIGVsc2UgaWYgKFRJTXggPT0gVElNMikNCi0gIHsNCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU0yLCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTIsIERJU0FCTEUpOw0KLSAgfQ0KLSAgZWxzZSBpZiAoVElNeCA9PSBUSU0zKQ0KLSAgew0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTMsIEVOQUJMRSk7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMywgRElTQUJMRSk7DQotICB9DQotICBlbHNlIGlmIChUSU14ID09IFRJTTQpDQotICB7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNCwgRU5BQkxFKTsNCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU00LCBESVNBQkxFKTsNCi0gIH0gDQotICBlbHNlIGlmIChUSU14ID09IFRJTTUpDQotICB7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNSwgRU5BQkxFKTsNCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU01LCBESVNBQkxFKTsNCi0gIH0gDQotICBlbHNlIGlmIChUSU14ID09IFRJTTYpDQotICB7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNiwgRU5BQkxFKTsNCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU02LCBESVNBQkxFKTsNCi0gIH0gDQotICBlbHNlIGlmIChUSU14ID09IFRJTTcpDQotICB7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNywgRU5BQkxFKTsNCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU03LCBESVNBQkxFKTsNCi0gIH0gDQotICBlbHNlIGlmIChUSU14ID09IFRJTTgpDQotICB7DQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNOCwgRU5BQkxFKTsNCi0gICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU04LCBESVNBQkxFKTsNCi0gIH0NCi0gIGVsc2UgaWYgKFRJTXggPT0gVElNOSkNCi0gIHsgICAgICANCi0gICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU05LCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTksIERJU0FCTEUpOyAgDQotICAgfSAgDQotICBlbHNlIGlmIChUSU14ID09IFRJTTEwKQ0KLSAgeyAgICAgIA0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTEwLCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTEwLCBESVNBQkxFKTsgIA0KLSAgfSAgDQotICBlbHNlIGlmIChUSU14ID09IFRJTTExKSANCi0gIHsgICAgIA0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTExLCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTExLCBESVNBQkxFKTsgIA0KLSAgfSAgDQotICBlbHNlIGlmIChUSU14ID09IFRJTTEyKQ0KLSAgeyAgICAgIA0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTEyLCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTEyLCBESVNBQkxFKTsgIA0KLSAgfSAgDQotICBlbHNlIGlmIChUSU14ID09IFRJTTEzKSANCi0gIHsgICAgICAgDQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTMsIEVOQUJMRSk7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTMsIERJU0FCTEUpOyAgDQotICB9DQotICBlbHNlIGlmIChUSU14ID09IFRJTTE0KSANCi0gIHsgICAgICAgDQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTQsIEVOQUJMRSk7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTQsIERJU0FCTEUpOyAgDQotICB9ICAgICAgICANCi0gIGVsc2UgaWYgKFRJTXggPT0gVElNMTUpDQotICB7DQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTUsIEVOQUJMRSk7DQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTUsIERJU0FCTEUpOw0KLSAgfSANCi0gIGVsc2UgaWYgKFRJTXggPT0gVElNMTYpDQotICB7DQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTYsIEVOQUJMRSk7DQotICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTYsIERJU0FCTEUpOw0KLSAgfSANCi0gIGVsc2UNCi0gIHsNCi0gICAgaWYgKFRJTXggPT0gVElNMTcpDQotICAgIHsNCi0gICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTE3LCBFTkFCTEUpOw0KLSAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTcsIERJU0FCTEUpOw0KLSAgICB9ICANCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggVGltZSBCYXNlIFVuaXQgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gDQotICAqICAgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fVGltZUJhc2VJbml0U3RydWN0Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fVGltZUJhc2VJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYNCi0gICogICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1RpbWVCYXNlSW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYqIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QpDQotew0KLSAgdWludDE2X3QgdG1wY3IxID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOyANCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9Db3VudGVyTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DS0RfRElWKFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9DbG9ja0RpdmlzaW9uKSk7DQotDQotICB0bXBjcjEgPSBUSU14LT5DUjE7ICANCi0NCi0gIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpfHwgKFRJTXggPT0gVElNMikgfHwgKFRJTXggPT0gVElNMyl8fA0KLSAgICAgKFRJTXggPT0gVElNNCkgfHwgKFRJTXggPT0gVElNNSkpIA0KLSAgew0KLSAgICAvKiBTZWxlY3QgdGhlIENvdW50ZXIgTW9kZSAqLw0KLSAgICB0bXBjcjEgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdCkoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUykpKTsNCi0gICAgdG1wY3IxIHw9ICh1aW50MzJfdClUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ291bnRlck1vZGU7DQotICB9DQotIA0KLSAgaWYoKFRJTXggIT0gVElNNikgJiYgKFRJTXggIT0gVElNNykpDQotICB7DQotICAgIC8qIFNldCB0aGUgY2xvY2sgZGl2aXNpb24gKi8NCi0gICAgdG1wY3IxICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NSMV9DS0QpKTsNCi0gICAgdG1wY3IxIHw9ICh1aW50MzJfdClUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ2xvY2tEaXZpc2lvbjsNCi0gIH0NCi0NCi0gIFRJTXgtPkNSMSA9IHRtcGNyMTsNCi0NCi0gIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLw0KLSAgVElNeC0+QVJSID0gVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX1BlcmlvZCA7DQotIA0KLSAgLyogU2V0IHRoZSBQcmVzY2FsZXIgdmFsdWUgKi8NCi0gIFRJTXgtPlBTQyA9IFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QcmVzY2FsZXI7DQotICAgIA0KLSAgaWYgKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpfHwgKFRJTXggPT0gVElNMTUpfHwgKFRJTXggPT0gVElNMTYpIHx8IChUSU14ID09IFRJTTE3KSkgIA0KLSAgew0KLSAgICAvKiBTZXQgdGhlIFJlcGV0aXRpb24gQ291bnRlciB2YWx1ZSAqLw0KLSAgICBUSU14LT5SQ1IgPSBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUmVwZXRpdGlvbkNvdW50ZXI7DQotICB9DQotDQotICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIgYW5kIHRoZSBSZXBldGl0aW9uIGNvdW50ZXINCi0gICAgIHZhbHVlcyBpbW1lZGlhdGVseSAqLw0KLSAgVElNeC0+RUdSID0gVElNX1BTQ1JlbG9hZE1vZGVfSW1tZWRpYXRlOyAgICAgICAgICAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU14IENoYW5uZWwxIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICAqICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fT0NJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gICogICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0MxSW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcnggPSAwLCB0bXBjY2VyID0gMCwgdG1wY3IyID0gMDsNCi0gICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q4X1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX01PREUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7ICAgDQotIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovDQotICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCkofih1aW50MTZfdClUSU1fQ0NFUl9DQzFFKTsNCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNyMiA9ICBUSU14LT5DUjI7DQotICANCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsNCi0gICAgDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovDQotICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzFNKSk7DQotICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMV9DQzFTKSk7DQotDQotICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCi0gIHRtcGNjbXJ4IHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGU7DQotICANCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCi0gIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFQKSk7DQotICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQotICB0bXBjY2VyIHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5Ow0KLSAgDQotICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KLSAgdG1wY2NlciB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0U3RhdGU7DQotICAgIA0KLSAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCl8fCAoVElNeCA9PSBUSU0xNSl8fA0KLSAgICAgKFRJTXggPT0gVElNMTYpfHwgKFRJTXggPT0gVElNMTcpKQ0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09VVFBVVE5fU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dE5TdGF0ZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOUG9sYXJpdHkpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGUpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DSWRsZVN0YXRlKSk7DQotICAgIA0KLSAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8NCi0gICAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMU5QKSk7DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8NCi0gICAgdG1wY2NlciB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOUG9sYXJpdHk7DQotICAgIA0KLSAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8NCi0gICAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMU5FKSk7ICAgIA0KLSAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQotICAgIHRtcGNjZXIgfD0gVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dE5TdGF0ZTsNCi0gICAgDQotICAgIC8qIFJlc2V0IHRoZSBPdXB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8NCi0gICAgdG1wY3IyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NSMl9PSVMxKSk7DQotICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTMU4pKTsNCi0gICAgDQotICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCi0gICAgdG1wY3IyIHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ0lkbGVTdGF0ZTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOSWRsZVN0YXRlOw0KLSAgfQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCi0gIFRJTXgtPkNSMiA9IHRtcGNyMjsNCi0gIA0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLw0KLSAgVElNeC0+Q0NNUjEgPSB0bXBjY21yeDsNCi0NCi0gIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQotICBUSU14LT5DQ1IxID0gVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlOyANCi0gDQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNeCBDaGFubmVsMiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCANCi0gICogICB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KLSAgKiAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzJJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fT0NJbml0VHlwZURlZiogVElNX09DSW5pdFN0cnVjdCkNCi17DQotICB1aW50MTZfdCB0bXBjY21yeCA9IDAsIHRtcGNjZXIgPSAwLCB0bXBjcjIgPSAwOw0KLSAgIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsgDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX01PREUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7ICAgDQotICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKSk7DQotICANCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovICANCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLSAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY3IyID0gIFRJTXgtPkNSMjsNCi0gIA0KLSAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY21yeCA9IFRJTXgtPkNDTVIxOw0KLSAgICANCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8NCi0gIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIxX09DMk0pKTsNCi0gIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIxX0NDMlMpKTsNCi0gIA0KLSAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovDQotICB0bXBjY21yeCB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUgPDwgOCk7DQotICANCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCi0gIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJQKSk7DQotICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQotICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPDwgNCk7DQotICANCi0gIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovDQotICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlIDw8IDQpOw0KLSAgICANCi0gIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpKQ0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09VVFBVVE5fU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dE5TdGF0ZSkpOw0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOUG9sYXJpdHkpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGUpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DSWRsZVN0YXRlKSk7DQotICAgIA0KLSAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8NCi0gICAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMk5QKSk7DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8NCi0gICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05Qb2xhcml0eSA8PCA0KTsNCi0gICAgDQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLw0KLSAgICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MyTkUpKTsgICAgDQotICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8NCi0gICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXROU3RhdGUgPDwgNCk7DQotICAgIA0KLSAgICAvKiBSZXNldCB0aGUgT3VwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovDQotICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTMikpOw0KLSAgICB0bXBjcjIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IyX09JUzJOKSk7DQotICAgIA0KLSAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ0lkbGVTdGF0ZSA8PCAyKTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQotICAgIHRtcGNyMiB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGUgPDwgMik7DQotICB9DQotICAvKiBXcml0ZSB0byBUSU14IENSMiAqLw0KLSAgVElNeC0+Q1IyID0gdG1wY3IyOw0KLSAgDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4Ow0KLQ0KLSAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIFRJTXgtPkNDUjIgPSBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2U7DQotICANCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU14IENoYW5uZWwzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICAqICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KLSAgKiAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzNJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fT0NJbml0VHlwZURlZiogVElNX09DSW5pdFN0cnVjdCkNCi17DQotICB1aW50MTZfdCB0bXBjY21yeCA9IDAsIHRtcGNjZXIgPSAwLCB0bXBjcjIgPSAwOw0KLSAgIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsgDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX01PREUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7ICAgDQotICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDM0UpKTsNCi0gIA0KLSAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLSAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY3IyID0gIFRJTXgtPkNSMjsNCi0gIA0KLSAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY21yeCA9IFRJTXgtPkNDTVIyOw0KLSAgICANCi0gIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8NCi0gIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIyX09DM00pKTsNCi0gIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIyX0NDM1MpKTsgIA0KLSAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovDQotICB0bXBjY21yeCB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlOw0KLSAgDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovDQotICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MzUCkpOw0KLSAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KLSAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5IDw8IDgpOw0KLSAgDQotICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KLSAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSA8PCA4KTsNCi0gICAgDQotICBpZigoVElNeCA9PSBUSU0xKSB8fCAoVElNeCA9PSBUSU04KSkNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVROX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXROU3RhdGUpKTsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05fUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTlBvbGFyaXR5KSk7DQotICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOSWRsZVN0YXRlKSk7DQotICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ0lkbGVTdGF0ZSkpOw0KLSAgICANCi0gICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5IGxldmVsICovDQotICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzNOUCkpOw0KLSAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovDQotICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOUG9sYXJpdHkgPDwgOCk7DQotICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLw0KLSAgICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MzTkUpKTsNCi0gICAgDQotICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8NCi0gICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXROU3RhdGUgPDwgOCk7DQotICAgIC8qIFJlc2V0IHRoZSBPdXB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8NCi0gICAgdG1wY3IyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NSMl9PSVMzKSk7DQotICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTM04pKTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLw0KLSAgICB0bXBjcjIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NJZGxlU3RhdGUgPDwgNCk7DQotICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLw0KLSAgICB0bXBjcjIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOSWRsZVN0YXRlIDw8IDQpOw0KLSAgfQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCi0gIFRJTXgtPkNSMiA9IHRtcGNyMjsNCi0gIA0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLw0KLSAgVElNeC0+Q0NNUjIgPSB0bXBjY21yeDsNCi0NCi0gIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQotICBUSU14LT5DQ1IzID0gVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlOw0KLSAgDQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNeCBDaGFubmVsNCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KLSAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fT0NJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gICogICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0M0SW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcnggPSAwLCB0bXBjY2VyID0gMCwgdG1wY3IyID0gMDsNCi0gICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7IA0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT1VUUFVUX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NQb2xhcml0eSkpOyAgIA0KLSAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzRFKSk7DQotICANCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNyMiA9ICBUSU14LT5DUjI7DQotICANCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsNCi0gICAgDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovDQotICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRNKSk7DQotICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMl9DQzRTKSk7DQotICANCi0gIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KLSAgdG1wY2NtcnggfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlIDw8IDgpOw0KLSAgDQotICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovDQotICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0M0UCkpOw0KLSAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KLSAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5IDw8IDEyKTsNCi0gIA0KLSAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8NCi0gIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0U3RhdGUgPDwgMTIpOw0KLSAgICANCi0gIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpKQ0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NJZGxlU3RhdGUpKTsNCi0gICAgLyogUmVzZXQgdGhlIE91cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLw0KLSAgICB0bXBjcjIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IyX09JUzQpKTsNCi0gICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLw0KLSAgICB0bXBjcjIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NJZGxlU3RhdGUgPDwgNik7DQotICB9DQotICAvKiBXcml0ZSB0byBUSU14IENSMiAqLw0KLSAgVElNeC0+Q1IyID0gdG1wY3IyOw0KLSAgDQotICAvKiBXcml0ZSB0byBUSU14IENDTVIyICovICANCi0gIFRJTXgtPkNDTVIyID0gdG1wY2Ntcng7DQotDQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NSNCA9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9QdWxzZTsNCi0gIA0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovDQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQotICAqICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0lDSW5pdFN0cnVjdC4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gICogICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fSUNJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DSEFOTkVMKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsKSk7ICANCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpKTsNCi0gIA0KLSAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCkgfHwgKFRJTXggPT0gVElNMikgfHwgKFRJTXggPT0gVElNMykgfHwNCi0gICAgIChUSU14ID09IFRJTTQpIHx8KFRJTXggPT0gVElNNSkpDQotICB7DQotICAgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHkpKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWV9MSVRFKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5KSk7DQotICB9DQotICBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMSkNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KLSAgICBUSTFfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KLSAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQotICAgIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCi0gIH0NCi0gIGVsc2UgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzIpDQotICB7DQotICAgIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gICAgLyogVEkyIENvbmZpZ3VyYXRpb24gKi8NCi0gICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwNCi0gICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCi0gICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KLSAgICBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQotICB9DQotICBlbHNlIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8zKQ0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQotICAgIC8qIFRJMyBDb25maWd1cmF0aW9uICovDQotICAgIFRJM19Db25maWcoVElNeCwgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KLSAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQotICAgIFRJTV9TZXRJQzNQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLw0KLSAgICBUSTRfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LA0KLSAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KLSAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQotICAgIFRJTV9TZXRJQzRQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNJbml0U3RydWN0IHRvIG1lYXN1cmUgYW4gZXh0ZXJuYWwgUFdNIHNpZ25hbC4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX0lDSW5pdFR5cGVEZWYgc3RydWN0dXJlDQotICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1BXTUlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9JQ0luaXRUeXBlRGVmKiBUSU1fSUNJbml0U3RydWN0KQ0KLXsNCi0gIHVpbnQxNl90IGljb3Bwb3NpdGVwb2xhcml0eSA9IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzsNCi0gIHVpbnQxNl90IGljb3Bwb3NpdGVzZWxlY3Rpb24gPSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KLSAgLyogU2VsZWN0IHRoZSBPcHBvc2l0ZSBJbnB1dCBQb2xhcml0eSAqLw0KLSAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5ID09IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZykNCi0gIHsNCi0gICAgaWNvcHBvc2l0ZXBvbGFyaXR5ID0gVElNX0lDUG9sYXJpdHlfRmFsbGluZzsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgaWNvcHBvc2l0ZXBvbGFyaXR5ID0gVElNX0lDUG9sYXJpdHlfUmlzaW5nOw0KLSAgfQ0KLSAgLyogU2VsZWN0IHRoZSBPcHBvc2l0ZSBJbnB1dCAqLw0KLSAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiA9PSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEkpDQotICB7DQotICAgIGljb3Bwb3NpdGVzZWxlY3Rpb24gPSBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgaWNvcHBvc2l0ZXNlbGVjdGlvbiA9IFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTsNCi0gIH0NCi0gIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8xKQ0KLSAgew0KLSAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KLSAgICBUSTFfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCi0gICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KLSAgICBUSU1fU2V0SUMxUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQotICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQotICAgIFRJMl9Db25maWcoVElNeCwgaWNvcHBvc2l0ZXBvbGFyaXR5LCBpY29wcG9zaXRlc2VsZWN0aW9uLCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KLSAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQotICAgIFRJTV9TZXRJQzJQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsgDQotICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQotICAgIFRJMl9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KLSAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQotICAgIFRJTV9TZXRJQzJQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCi0gICAgLyogVEkxIENvbmZpZ3VyYXRpb24gKi8NCi0gICAgVEkxX0NvbmZpZyhUSU14LCBpY29wcG9zaXRlcG9sYXJpdHksIGljb3Bwb3NpdGVzZWxlY3Rpb24sIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQotICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCi0gICAgVElNX1NldElDMVByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZTogQnJlYWsgZmVhdHVyZSwgZGVhZCB0aW1lLCBMb2NrIGxldmVsLCB0aGUgT1NTSSwNCi0gICogICB0aGUgT1NTUiBTdGF0ZSBhbmQgdGhlIEFPRShhdXRvbWF0aWMgb3V0cHV0IGVuYWJsZSkuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSANCi0gICogQHBhcmFtICBUSU1fQkRUUkluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fQkRUUkluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQotICAqICAgY29udGFpbnMgdGhlIEJEVFIgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiAgaW5mb3JtYXRpb24gZm9yIHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0JEVFJDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9CRFRSSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUMl9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PU1NSX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX09TU1JTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PU1NJX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX09TU0lTdGF0ZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MT0NLX0xFVkVMKFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0xPQ0tMZXZlbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19TVEFURShUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9CcmVhaykpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19QT0xBUklUWShUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9CcmVha1BvbGFyaXR5KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5USU1fQXV0b21hdGljT3V0cHV0KSk7DQotICAvKiBTZXQgdGhlIExvY2sgbGV2ZWwsIHRoZSBCcmVhayBlbmFibGUgQml0IGFuZCB0aGUgUGxvYXJpdHksIHRoZSBPU1NSIFN0YXRlLA0KLSAgICAgdGhlIE9TU0kgU3RhdGUsIHRoZSBkZWFkIHRpbWUgdmFsdWUgYW5kIHRoZSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBCaXQgKi8NCi0gIFRJTXgtPkJEVFIgPSAodWludDMyX3QpVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTUlN0YXRlIHwgVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTSVN0YXRlIHwNCi0gICAgICAgICAgICAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fTE9DS0xldmVsIHwgVElNX0JEVFJJbml0U3RydWN0LT5USU1fRGVhZFRpbWUgfA0KLSAgICAgICAgICAgICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9CcmVhayB8IFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0JyZWFrUG9sYXJpdHkgfA0KLSAgICAgICAgICAgICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9BdXRvbWF0aWNPdXRwdXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVElNX1RpbWVCYXNlSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBUSU1fVGltZUJhc2VJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmDQotICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9UaW1lQmFzZVN0cnVjdEluaXQoVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYqIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QpDQotew0KLSAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCi0gIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QZXJpb2QgPSAweEZGRkY7DQotICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUHJlc2NhbGVyID0gMHgwMDAwOw0KLSAgVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0Nsb2NrRGl2aXNpb24gPSBUSU1fQ0tEX0RJVjE7DQotICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ291bnRlck1vZGUgPSBUSU1fQ291bnRlck1vZGVfVXA7DQotICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUmVwZXRpdGlvbkNvdW50ZXIgPSAweDAwMDA7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVElNX09DSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsDQotICAqICAgYmUgaW5pdGlhbGl6ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQ1N0cnVjdEluaXQoVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQotew0KLSAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCi0gIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUgPSBUSU1fT0NNb2RlX1RpbWluZzsNCi0gIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSA9IFRJTV9PdXRwdXRTdGF0ZV9EaXNhYmxlOw0KLSAgVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dE5TdGF0ZSA9IFRJTV9PdXRwdXROU3RhdGVfRGlzYWJsZTsNCi0gIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9QdWxzZSA9IDB4MDAwMDsNCi0gIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5ID0gVElNX09DUG9sYXJpdHlfSGlnaDsNCi0gIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05Qb2xhcml0eSA9IFRJTV9PQ1BvbGFyaXR5X0hpZ2g7DQotICBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NJZGxlU3RhdGUgPSBUSU1fT0NJZGxlU3RhdGVfUmVzZXQ7DQotICBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOSWRsZVN0YXRlID0gVElNX09DTklkbGVTdGF0ZV9SZXNldDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRmlsbHMgZWFjaCBUSU1fSUNJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KLSAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgVElNX0lDSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwNCi0gICogICBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0lDU3RydWN0SW5pdChUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCkNCi17DQotICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLw0KLSAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPSBUSU1fQ2hhbm5lbF8xOw0KLSAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9SaXNpbmc7DQotICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24gPSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk7DQotICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIgPSBUSU1fSUNQU0NfRElWMTsNCi0gIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlciA9IDB4MDA7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVElNX0JEVFJJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KLSAgKiBAcGFyYW0gIFRJTV9CRFRSSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9CRFRSSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoDQotICAqICAgd2lsbCBiZSBpbml0aWFsaXplZC4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0JEVFJTdHJ1Y3RJbml0KFRJTV9CRFRSSW5pdFR5cGVEZWYqIFRJTV9CRFRSSW5pdFN0cnVjdCkNCi17DQotICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLw0KLSAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTUlN0YXRlID0gVElNX09TU1JTdGF0ZV9EaXNhYmxlOw0KLSAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTSVN0YXRlID0gVElNX09TU0lTdGF0ZV9EaXNhYmxlOw0KLSAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fTE9DS0xldmVsID0gVElNX0xPQ0tMZXZlbF9PRkY7DQotICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9EZWFkVGltZSA9IDB4MDA7DQotICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9CcmVhayA9IFRJTV9CcmVha19EaXNhYmxlOw0KLSAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fQnJlYWtQb2xhcml0eSA9IFRJTV9CcmVha1BvbGFyaXR5X0xvdzsNCi0gIFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0F1dG9tYXRpY091dHB1dCA9IFRJTV9BdXRvbWF0aWNPdXRwdXRfRGlzYWJsZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU14IHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9DbWQoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIFRJTSBDb3VudGVyICovDQotICAgIFRJTXgtPkNSMSB8PSBUSU1fQ1IxX0NFTjsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgVElNIENvdW50ZXIgKi8NCi0gICAgVElNeC0+Q1IxICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NSMV9DRU4pKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNIHBlcmlwaGVyYWwgTWFpbiBPdXRwdXRzLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDgsIDE1LCAxNiBvciAxNyB0byBzZWxlY3QgdGhlIFRJTXggcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU0gcGVyaXBoZXJhbCBNYWluIE91dHB1dHMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0N0cmxQV01PdXRwdXRzKFRJTV9UeXBlRGVmKiBUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDJfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBUSU0gTWFpbiBPdXRwdXQgKi8NCi0gICAgVElNeC0+QkRUUiB8PSBUSU1fQkRUUl9NT0U7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIFRJTSBNYWluIE91dHB1dCAqLw0KLSAgICBUSU14LT5CRFRSICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0JEVFJfTU9FKSk7DQotICB9ICANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHRzLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU14IHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0lUOiBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fSVRfVXBkYXRlOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX0NPTTogVElNIENvbW11dGF0aW9uIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0lUX0JyZWFrOiBUSU0gQnJlYWsgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiBAbm90ZSANCi0gICogICAtIFRJTTYgYW5kIFRJTTcgY2FuIG9ubHkgZ2VuZXJhdGUgYW4gdXBkYXRlIGludGVycnVwdC4NCi0gICogICAtIFRJTTksIFRJTTEyIGFuZCBUSU0xNSBjYW4gaGF2ZSBvbmx5IFRJTV9JVF9VcGRhdGUsIFRJTV9JVF9DQzEsDQotICAqICAgICAgVElNX0lUX0NDMiBvciBUSU1fSVRfVHJpZ2dlci4gDQotICAqICAgLSBUSU0xMCwgVElNMTEsIFRJTTEzLCBUSU0xNCwgVElNMTYgYW5kIFRJTTE3IGNhbiBoYXZlIFRJTV9JVF9VcGRhdGUgb3IgVElNX0lUX0NDMS4gICANCi0gICogICAtIFRJTV9JVF9CcmVhayBpcyB1c2VkIG9ubHkgd2l0aCBUSU0xLCBUSU04IGFuZCBUSU0xNS4gDQotICAqICAgLSBUSU1fSVRfQ09NIGlzIHVzZWQgb25seSB3aXRoIFRJTTEsIFRJTTgsIFRJTTE1LCBUSU0xNiBhbmQgVElNMTcuICAgIA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTSBpbnRlcnJ1cHRzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9JVENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQoteyAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSVQoVElNX0lUKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBJbnRlcnJ1cHQgc291cmNlcyAqLw0KLSAgICBUSU14LT5ESUVSIHw9IFRJTV9JVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0IHNvdXJjZXMgKi8NCi0gICAgVElNeC0+RElFUiAmPSAodWludDE2X3QpflRJTV9JVDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBldmVudCB0byBiZSBnZW5lcmF0ZSBieSBzb2Z0d2FyZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0V2ZW50U291cmNlOiBzcGVjaWZpZXMgdGhlIGV2ZW50IHNvdXJjZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CSAgIA0KLSAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfVXBkYXRlOiBUaW1lciB1cGRhdGUgRXZlbnQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9FdmVudFNvdXJjZV9DQzE6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAxIEV2ZW50IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MyOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMiBFdmVudCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0V2ZW50U291cmNlX0NDMzogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDMgRXZlbnQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9FdmVudFNvdXJjZV9DQzQ6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSA0IEV2ZW50IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ09NOiBUaW1lciBDT00gZXZlbnQgc291cmNlICANCi0gICogICAgIEBhcmcgVElNX0V2ZW50U291cmNlX1RyaWdnZXI6IFRpbWVyIFRyaWdnZXIgRXZlbnQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9FdmVudFNvdXJjZV9CcmVhazogVGltZXIgQnJlYWsgZXZlbnQgc291cmNlDQotICAqIEBub3RlIA0KLSAgKiAgIC0gVElNNiBhbmQgVElNNyBjYW4gb25seSBnZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQuIA0KLSAgKiAgIC0gVElNX0V2ZW50U291cmNlX0NPTSBhbmQgVElNX0V2ZW50U291cmNlX0JyZWFrIGFyZSB1c2VkIG9ubHkgd2l0aCBUSU0xIGFuZCBUSU04LiAgICAgIA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fR2VuZXJhdGVFdmVudChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0V2ZW50U291cmNlKQ0KLXsgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRVZFTlRfU09VUkNFKFRJTV9FdmVudFNvdXJjZSkpOw0KLSAgDQotICAvKiBTZXQgdGhlIGV2ZW50IHNvdXJjZXMgKi8NCi0gIFRJTXgtPkVHUiA9IFRJTV9FdmVudFNvdXJjZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeJJzIERNQSBpbnRlcmZhY2UuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUsIDgsIDE1LCAxNiBvciAxNyB0byBzZWxlY3QgDQotICAqICAgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9ETUFCYXNlOiBETUEgQmFzZSBhZGRyZXNzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9ETUFCYXNlX0NSLCBUSU1fRE1BQmFzZV9DUjIsIFRJTV9ETUFCYXNlX1NNQ1IsDQotICAqICAgVElNX0RNQUJhc2VfRElFUiwgVElNMV9ETUFCYXNlX1NSLCBUSU1fRE1BQmFzZV9FR1IsDQotICAqICAgVElNX0RNQUJhc2VfQ0NNUjEsIFRJTV9ETUFCYXNlX0NDTVIyLCBUSU1fRE1BQmFzZV9DQ0VSLA0KLSAgKiAgIFRJTV9ETUFCYXNlX0NOVCwgVElNX0RNQUJhc2VfUFNDLCBUSU1fRE1BQmFzZV9BUlIsDQotICAqICAgVElNX0RNQUJhc2VfUkNSLCBUSU1fRE1BQmFzZV9DQ1IxLCBUSU1fRE1BQmFzZV9DQ1IyLA0KLSAgKiAgIFRJTV9ETUFCYXNlX0NDUjMsIFRJTV9ETUFCYXNlX0NDUjQsIFRJTV9ETUFCYXNlX0JEVFIsDQotICAqICAgVElNX0RNQUJhc2VfRENSLg0KLSAgKiBAcGFyYW0gIFRJTV9ETUFCdXJzdExlbmd0aDogRE1BIEJ1cnN0IGxlbmd0aC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIGJldHdlZW46DQotICAqICAgVElNX0RNQUJ1cnN0TGVuZ3RoXzFCeXRlIGFuZCBUSU1fRE1BQnVyc3RMZW5ndGhfMThCeXRlcy4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0RNQUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0RNQUJhc2UsIHVpbnQxNl90IFRJTV9ETUFCdXJzdExlbmd0aCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQkFTRShUSU1fRE1BQmFzZSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKFRJTV9ETUFCdXJzdExlbmd0aCkpOw0KLSAgLyogU2V0IHRoZSBETUEgQmFzZSBhbmQgdGhlIERNQSBCdXJzdCBMZW5ndGggKi8NCi0gIFRJTXgtPkRDUiA9IFRJTV9ETUFCYXNlIHwgVElNX0RNQUJ1cnN0TGVuZ3RoOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14knMgRE1BIFJlcXVlc3RzLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxNSwgMTYgb3IgMTcgDQotICAqICAgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4gDQotICAqIEBwYXJhbSAgVElNX0RNQVNvdXJjZTogc3BlY2lmaWVzIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9ETUFfVXBkYXRlOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UNCi0gICogICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fRE1BX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UNCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9ETUFDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9ETUFTb3VyY2UsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDlfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShUSU1fRE1BU291cmNlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBETUEgc291cmNlcyAqLw0KLSAgICBUSU14LT5ESUVSIHw9IFRJTV9ETUFTb3VyY2U7IA0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBETUEgc291cmNlcyAqLw0KLSAgICBUSU14LT5ESUVSICY9ICh1aW50MTZfdCl+VElNX0RNQVNvdXJjZTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBpbnRlcnJuYWwgQ2xvY2sNCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUNCi0gICogICB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fSW50ZXJuYWxDbG9ja0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KLSAgLyogRGlzYWJsZSBzbGF2ZSBtb2RlIHRvIGNsb2NrIHRoZSBwcmVzY2FsZXIgZGlyZWN0bHkgd2l0aCB0aGUgaW50ZXJuYWwgY2xvY2sgKi8NCi0gIFRJTXgtPlNNQ1IgJj0gICh1aW50MTZfdCkofigodWludDE2X3QpVElNX1NNQ1JfU01TKSk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggSW50ZXJuYWwgVHJpZ2dlciBhcyBFeHRlcm5hbCBDbG9jaw0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9JVFJTb3VyY2U6IFRyaWdnZXIgc291cmNlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqIEBwYXJhbSAgVElNX1RTX0lUUjA6IEludGVybmFsIFRyaWdnZXIgMA0KLSAgKiBAcGFyYW0gIFRJTV9UU19JVFIxOiBJbnRlcm5hbCBUcmlnZ2VyIDENCi0gICogQHBhcmFtICBUSU1fVFNfSVRSMjogSW50ZXJuYWwgVHJpZ2dlciAyDQotICAqIEBwYXJhbSAgVElNX1RTX0lUUjM6IEludGVybmFsIFRyaWdnZXIgMw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fSVRSeEV4dGVybmFsQ2xvY2tDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSU5URVJOQUxfVFJJR0dFUl9TRUxFQ1RJT04oVElNX0lucHV0VHJpZ2dlclNvdXJjZSkpOw0KLSAgLyogU2VsZWN0IHRoZSBJbnRlcm5hbCBUcmlnZ2VyICovDQotICBUSU1fU2VsZWN0SW5wdXRUcmlnZ2VyKFRJTXgsIFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpOw0KLSAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSAqLw0KLSAgVElNeC0+U01DUiB8PSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBUcmlnZ2VyIGFzIEV4dGVybmFsIENsb2NrDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX1RJeEV4dGVybmFsQ0xLU291cmNlOiBUcmlnZ2VyIHNvdXJjZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMUVEOiBUSTEgRWRnZSBEZXRlY3Rvcg0KLSAgKiAgICAgQGFyZyBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMTogRmlsdGVyZWQgVGltZXIgSW5wdXQgMQ0KLSAgKiAgICAgQGFyZyBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMjogRmlsdGVyZWQgVGltZXIgSW5wdXQgMg0KLSAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIFRJeCBQb2xhcml0eS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCi0gICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KLSAgKiBAcGFyYW0gIElDRmlsdGVyIDogc3BlY2lmaWVzIHRoZSBmaWx0ZXIgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwIGFuZCAweEYuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9USXhFeHRlcm5hbENsb2NrQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgSUNGaWx0ZXIpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fVElYQ0xLX1NPVVJDRShUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2UpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoVElNX0lDUG9sYXJpdHkpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKElDRmlsdGVyKSk7DQotICAvKiBDb25maWd1cmUgdGhlIFRpbWVyIElucHV0IENsb2NrIFNvdXJjZSAqLw0KLSAgaWYgKFRJTV9USXhFeHRlcm5hbENMS1NvdXJjZSA9PSBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMikNCi0gIHsNCi0gICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNQb2xhcml0eSwgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJLCBJQ0ZpbHRlcik7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIFRJMV9Db25maWcoVElNeCwgVElNX0lDUG9sYXJpdHksIFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSSwgSUNGaWx0ZXIpOw0KLSAgfQ0KLSAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNvdXJjZSAqLw0KLSAgVElNX1NlbGVjdElucHV0VHJpZ2dlcihUSU14LCBUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2UpOw0KLSAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSAqLw0KLSAgVElNeC0+U01DUiB8PSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgRXh0ZXJuYWwgY2xvY2sgTW9kZTENCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0V4dFRSR1ByZXNjYWxlcjogVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfT0ZGOiBFVFJQIFByZXNjYWxlciBPRkYuDQotICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWMjogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSAyLg0KLSAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX0RJVjQ6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgNC4NCi0gICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY4OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguDQotICAqIEBwYXJhbSAgVElNX0V4dFRSR1BvbGFyaXR5OiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4NCi0gICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X05vbkludmVydGVkOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZSBhY3RpdmUuDQotICAqIEBwYXJhbSAgRXh0VFJHRmlsdGVyOiBFeHRlcm5hbCBUcmlnZ2VyIEZpbHRlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9FVFJDbG9ja01vZGUxQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBFeHRUUkdGaWx0ZXIpDQotew0KLSAgdWludDE2X3QgdG1wc21jciA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRVhUX1BPTEFSSVRZKFRJTV9FeHRUUkdQb2xhcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfRklMVEVSKEV4dFRSR0ZpbHRlcikpOw0KLSAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovDQotICBUSU1fRVRSQ29uZmlnKFRJTXgsIFRJTV9FeHRUUkdQcmVzY2FsZXIsIFRJTV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCi0gIA0KLSAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KLSAgLyogUmVzZXQgdGhlIFNNUyBCaXRzICovDQotICB0bXBzbWNyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX1NNQ1JfU01TKSk7DQotICAvKiBTZWxlY3QgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUxICovDQotICB0bXBzbWNyIHw9IFRJTV9TbGF2ZU1vZGVfRXh0ZXJuYWwxOw0KLSAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNlbGVjdGlvbiA6IEVUUkYgKi8NCi0gIHRtcHNtY3IgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fU01DUl9UUykpOw0KLSAgdG1wc21jciB8PSBUSU1fVFNfRVRSRjsNCi0gIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLw0KLSAgVElNeC0+U01DUiA9IHRtcHNtY3I7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEV4dGVybmFsIGNsb2NrIE1vZGUyDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQcmVzY2FsZXI6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX09GRjogRVRSUCBQcmVzY2FsZXIgT0ZGLg0KLSAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX0RJVjI6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgMi4NCi0gICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQotICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWODogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA4Lg0KLSAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQb2xhcml0eTogVGhlIGV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X0ludmVydGVkOiBhY3RpdmUgbG93IG9yIGZhbGxpbmcgZWRnZSBhY3RpdmUuDQotICAqICAgICBAYXJnIFRJTV9FeHRUUkdQb2xhcml0eV9Ob25JbnZlcnRlZDogYWN0aXZlIGhpZ2ggb3IgcmlzaW5nIGVkZ2UgYWN0aXZlLg0KLSAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fRVRSQ2xvY2tNb2RlMkNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0V4dFRSR1ByZXNjYWxlciwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksIHVpbnQxNl90IEV4dFRSR0ZpbHRlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRVhUX1BPTEFSSVRZKFRJTV9FeHRUUkdQb2xhcml0eSkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfRklMVEVSKEV4dFRSR0ZpbHRlcikpOw0KLSAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovDQotICBUSU1fRVRSQ29uZmlnKFRJTXgsIFRJTV9FeHRUUkdQcmVzY2FsZXIsIFRJTV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCi0gIC8qIEVuYWJsZSB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTIgKi8NCi0gIFRJTXgtPlNNQ1IgfD0gVElNX1NNQ1JfRUNFOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQcmVzY2FsZXI6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX09GRjogRVRSUCBQcmVzY2FsZXIgT0ZGLg0KLSAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX0RJVjI6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgMi4NCi0gICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQotICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWODogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA4Lg0KLSAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQb2xhcml0eTogVGhlIGV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X0ludmVydGVkOiBhY3RpdmUgbG93IG9yIGZhbGxpbmcgZWRnZSBhY3RpdmUuDQotICAqICAgICBAYXJnIFRJTV9FeHRUUkdQb2xhcml0eV9Ob25JbnZlcnRlZDogYWN0aXZlIGhpZ2ggb3IgcmlzaW5nIGVkZ2UgYWN0aXZlLg0KLSAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fRVRSQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksDQotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IEV4dFRSR0ZpbHRlcikNCi17DQotICB1aW50MTZfdCB0bXBzbWNyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VYVF9QUkVTQ0FMRVIoVElNX0V4dFRSR1ByZXNjYWxlcikpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUE9MQVJJVFkoVElNX0V4dFRSR1BvbGFyaXR5KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VYVF9GSUxURVIoRXh0VFJHRmlsdGVyKSk7DQotICB0bXBzbWNyID0gVElNeC0+U01DUjsNCi0gIC8qIFJlc2V0IHRoZSBFVFIgQml0cyAqLw0KLSAgdG1wc21jciAmPSBTTUNSX0VUUl9NYXNrOw0KLSAgLyogU2V0IHRoZSBQcmVzY2FsZXIsIHRoZSBGaWx0ZXIgdmFsdWUgYW5kIHRoZSBQb2xhcml0eSAqLw0KLSAgdG1wc21jciB8PSAodWludDE2X3QpKFRJTV9FeHRUUkdQcmVzY2FsZXIgfCAodWludDE2X3QpKFRJTV9FeHRUUkdQb2xhcml0eSB8ICh1aW50MTZfdCkoRXh0VFJHRmlsdGVyIDw8ICh1aW50MTZfdCk4KSkpOw0KLSAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQotICBUSU14LT5TTUNSID0gdG1wc21jcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBQcmVzY2FsZXIuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFByZXNjYWxlcjogc3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUNCi0gICogQHBhcmFtICBUSU1fUFNDUmVsb2FkTW9kZTogc3BlY2lmaWVzIHRoZSBUSU0gUHJlc2NhbGVyIFJlbG9hZCBtb2RlDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX1BTQ1JlbG9hZE1vZGVfVXBkYXRlOiBUaGUgUHJlc2NhbGVyIGlzIGxvYWRlZCBhdCB0aGUgdXBkYXRlIGV2ZW50Lg0KLSAgKiAgICAgQGFyZyBUSU1fUFNDUmVsb2FkTW9kZV9JbW1lZGlhdGU6IFRoZSBQcmVzY2FsZXIgaXMgbG9hZGVkIGltbWVkaWF0ZWx5Lg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fUHJlc2NhbGVyQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBQcmVzY2FsZXIsIHVpbnQxNl90IFRJTV9QU0NSZWxvYWRNb2RlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QUkVTQ0FMRVJfUkVMT0FEKFRJTV9QU0NSZWxvYWRNb2RlKSk7DQotICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLw0KLSAgVElNeC0+UFNDID0gUHJlc2NhbGVyOw0KLSAgLyogU2V0IG9yIHJlc2V0IHRoZSBVRyBCaXQgKi8NCi0gIFRJTXgtPkVHUiA9IFRJTV9QU0NSZWxvYWRNb2RlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTcGVjaWZpZXMgdGhlIFRJTXggQ291bnRlciBNb2RlIHRvIGJlIHVzZWQuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9Db3VudGVyTW9kZTogc3BlY2lmaWVzIHRoZSBDb3VudGVyIE1vZGUgdG8gYmUgdXNlZA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9Db3VudGVyTW9kZV9VcDogVElNIFVwIENvdW50aW5nIE1vZGUNCi0gICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX0Rvd246IFRJTSBEb3duIENvdW50aW5nIE1vZGUNCi0gICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQxOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTENCi0gICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQyOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTINCi0gICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQzOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTMNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0NvdW50ZXJNb2RlQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fQ291bnRlck1vZGUpDQotew0KLSAgdWludDE2X3QgdG1wY3IxID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShUSU1fQ291bnRlck1vZGUpKTsNCi0gIHRtcGNyMSA9IFRJTXgtPkNSMTsNCi0gIC8qIFJlc2V0IHRoZSBDTVMgYW5kIERJUiBCaXRzICovDQotICB0bXBjcjEgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdCkoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUykpKTsNCi0gIC8qIFNldCB0aGUgQ291bnRlciBNb2RlICovDQotICB0bXBjcjEgfD0gVElNX0NvdW50ZXJNb2RlOw0KLSAgLyogV3JpdGUgdG8gVElNeCBDUjEgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNSMSA9IHRtcGNyMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2VsZWN0cyB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UNCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fSW5wdXRUcmlnZ2VyU291cmNlOiBUaGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX1RTX0lUUjA6IEludGVybmFsIFRyaWdnZXIgMA0KLSAgKiAgICAgQGFyZyBUSU1fVFNfSVRSMTogSW50ZXJuYWwgVHJpZ2dlciAxDQotICAqICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCBUcmlnZ2VyIDINCi0gICogICAgIEBhcmcgVElNX1RTX0lUUjM6IEludGVybmFsIFRyaWdnZXIgMw0KLSAgKiAgICAgQGFyZyBUSU1fVFNfVEkxRl9FRDogVEkxIEVkZ2UgRGV0ZWN0b3INCi0gICogICAgIEBhcmcgVElNX1RTX1RJMUZQMTogRmlsdGVyZWQgVGltZXIgSW5wdXQgMQ0KLSAgKiAgICAgQGFyZyBUSU1fVFNfVEkyRlAyOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyDQotICAqICAgICBAYXJnIFRJTV9UU19FVFJGOiBFeHRlcm5hbCBUcmlnZ2VyIGlucHV0DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZWxlY3RJbnB1dFRyaWdnZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpDQotew0KLSAgdWludDE2X3QgdG1wc21jciA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihUSU1fSW5wdXRUcmlnZ2VyU291cmNlKSk7DQotICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wc21jciA9IFRJTXgtPlNNQ1I7DQotICAvKiBSZXNldCB0aGUgVFMgQml0cyAqLw0KLSAgdG1wc21jciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9TTUNSX1RTKSk7DQotICAvKiBTZXQgdGhlIElucHV0IFRyaWdnZXIgc291cmNlICovDQotICB0bXBzbWNyIHw9IFRJTV9JbnB1dFRyaWdnZXJTb3VyY2U7DQotICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8NCi0gIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEVuY29kZXIgSW50ZXJmYWNlLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fRW5jb2Rlck1vZGU6IHNwZWNpZmllcyB0aGUgVElNeCBFbmNvZGVyIE1vZGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0VuY29kZXJNb2RlX1RJMTogQ291bnRlciBjb3VudHMgb24gVEkxRlAxIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMkZQMiBsZXZlbC4NCi0gICogICAgIEBhcmcgVElNX0VuY29kZXJNb2RlX1RJMjogQ291bnRlciBjb3VudHMgb24gVEkyRlAyIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMUZQMSBsZXZlbC4NCi0gICogICAgIEBhcmcgVElNX0VuY29kZXJNb2RlX1RJMTI6IENvdW50ZXIgY291bnRzIG9uIGJvdGggVEkxRlAxIGFuZCBUSTJGUDIgZWRnZXMgZGVwZW5kaW5nDQotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0Lg0KLSAgKiBAcGFyYW0gIFRJTV9JQzFQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBJQzEgUG9sYXJpdHkNCi0gICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmc6IElDIEZhbGxpbmcgZWRnZS4NCi0gICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nOiBJQyBSaXNpbmcgZWRnZS4NCi0gICogQHBhcmFtICBUSU1fSUMyUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgSUMyIFBvbGFyaXR5DQotICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9GYWxsaW5nOiBJQyBGYWxsaW5nIGVkZ2UuDQotICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzogSUMgUmlzaW5nIGVkZ2UuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9FbmNvZGVySW50ZXJmYWNlQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRW5jb2Rlck1vZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUMxUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQzJQb2xhcml0eSkNCi17DQotICB1aW50MTZfdCB0bXBzbWNyID0gMDsNCi0gIHVpbnQxNl90IHRtcGNjbXIxID0gMDsNCi0gIHVpbnQxNl90IHRtcGNjZXIgPSAwOw0KLSAgICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q1X1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfTU9ERShUSU1fRW5jb2Rlck1vZGUpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoVElNX0lDMVBvbGFyaXR5KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQzJQb2xhcml0eSkpOw0KLQ0KLSAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KLSAgDQotICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQotICANCi0gIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIA0KLSAgLyogU2V0IHRoZSBlbmNvZGVyIE1vZGUgKi8NCi0gIHRtcHNtY3IgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fU01DUl9TTVMpKTsNCi0gIHRtcHNtY3IgfD0gVElNX0VuY29kZXJNb2RlOw0KLSAgDQotICAvKiBTZWxlY3QgdGhlIENhcHR1cmUgQ29tcGFyZSAxIGFuZCB0aGUgQ2FwdHVyZSBDb21wYXJlIDIgYXMgaW5wdXQgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpICYgKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MyUykpKTsNCi0gIHRtcGNjbXIxIHw9IFRJTV9DQ01SMV9DQzFTXzAgfCBUSU1fQ0NNUjFfQ0MyU18wOw0KLSAgDQotICAvKiBTZXQgdGhlIFRJMSBhbmQgdGhlIFRJMiBQb2xhcml0aWVzICovDQotICB0bXBjY2VyICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFQKSkgJiAoKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMlApKSk7DQotICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX0lDMVBvbGFyaXR5IHwgKHVpbnQxNl90KShUSU1fSUMyUG9sYXJpdHkgPDwgKHVpbnQxNl90KTQpKTsNCi0gIA0KLSAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQotICBUSU14LT5TTUNSID0gdG1wc21jcjsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGb3JjZXMgdGhlIFRJTXggb3V0cHV0IDEgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0ZvcmNlZEFjdGlvbjogc3BlY2lmaWVzIHRoZSBmb3JjZWQgQWN0aW9uIHRvIGJlIHNldCB0byB0aGUgb3V0cHV0IHdhdmVmb3JtLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0MxUkVGDQotICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmU6IEZvcmNlIGluYWN0aXZlIGxldmVsIG9uIE9DMVJFRi4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0ZvcmNlZE9DMUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZvcmNlZEFjdGlvbikNCi17DQotICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9GT1JDRURfQUNUSU9OKFRJTV9Gb3JjZWRBY3Rpb24pKTsNCi0gIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQotICAvKiBSZXNldCB0aGUgT0MxTSBCaXRzICovDQotICB0bXBjY21yMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX09DMU0pOw0KLSAgLyogQ29uZmlndXJlIFRoZSBGb3JjZWQgb3V0cHV0IE1vZGUgKi8NCi0gIHRtcGNjbXIxIHw9IFRJTV9Gb3JjZWRBY3Rpb247DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxIHJlZ2lzdGVyICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGb3JjZXMgdGhlIFRJTXggb3V0cHV0IDIgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8gdGhlIG91dHB1dCB3YXZlZm9ybS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DMlJFRg0KLSAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbiBPQzJSRUYuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9Gb3JjZWRPQzJDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQotICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KLSAgLyogUmVzZXQgdGhlIE9DMk0gQml0cyAqLw0KLSAgdG1wY2NtcjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzJNKTsNCi0gIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQotICB0bXBjY21yMSB8PSAodWludDE2X3QpKFRJTV9Gb3JjZWRBY3Rpb24gPDwgOCk7DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxIHJlZ2lzdGVyICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGb3JjZXMgdGhlIFRJTXggb3V0cHV0IDMgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fRm9yY2VkQWN0aW9uOiBzcGVjaWZpZXMgdGhlIGZvcmNlZCBBY3Rpb24gdG8gYmUgc2V0IHRvIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQzNSRUYNCi0gICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24gT0MzUkVGLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fRm9yY2VkT0MzQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRm9yY2VkQWN0aW9uKQ0KLXsNCi0gIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0ZPUkNFRF9BQ1RJT04oVElNX0ZvcmNlZEFjdGlvbikpOw0KLSAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCi0gIC8qIFJlc2V0IHRoZSBPQzFNIEJpdHMgKi8NCi0gIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0MzTSk7DQotICAvKiBDb25maWd1cmUgVGhlIEZvcmNlZCBvdXRwdXQgTW9kZSAqLw0KLSAgdG1wY2NtcjIgfD0gVElNX0ZvcmNlZEFjdGlvbjsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgNCB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8gdGhlIG91dHB1dCB3YXZlZm9ybS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DNFJFRg0KLSAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbiBPQzRSRUYuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9Gb3JjZWRPQzRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQotICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KLSAgLyogUmVzZXQgdGhlIE9DMk0gQml0cyAqLw0KLSAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRNKTsNCi0gIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQotICB0bXBjY21yMiB8PSAodWludDE2X3QpKFRJTV9Gb3JjZWRBY3Rpb24gPDwgOCk7DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIyIHJlZ2lzdGVyICovDQotICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIEFSUi4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0FSUlByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBBUlIgUHJlbG9hZCBCaXQgKi8NCi0gICAgVElNeC0+Q1IxIHw9IFRJTV9DUjFfQVJQRTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogUmVzZXQgdGhlIEFSUiBQcmVsb2FkIEJpdCAqLw0KLSAgICBUSU14LT5DUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjFfQVJQRSk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTSBwZXJpcGhlcmFsIENvbW11dGF0aW9uIGV2ZW50Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCA4LCAxNSwgMTYgb3IgMTcgdG8gc2VsZWN0IHRoZSBUSU14IHBlcmlwaGVyYWwNCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDb21tdXRhdGlvbiBldmVudC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fU2VsZWN0Q09NKFRJTV9UeXBlRGVmKiBUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDJfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBDT00gQml0ICovDQotICAgIFRJTXgtPkNSMiB8PSBUSU1fQ1IyX0NDVVM7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFJlc2V0IHRoZSBDT00gQml0ICovDQotICAgIFRJTXgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMl9DQ1VTKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2VsZWN0cyB0aGUgVElNeCBwZXJpcGhlcmFsIENhcHR1cmUgQ29tcGFyZSBETUEgc291cmNlLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA4LCAxNSwgMTYgb3IgMTcgdG8gc2VsZWN0IA0KLSAgKiAgIHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDYXB0dXJlIENvbXBhcmUgRE1BIHNvdXJjZQ0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZWxlY3RDQ0RNQShUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q0X1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIFNldCB0aGUgQ0NEUyBCaXQgKi8NCi0gICAgVElNeC0+Q1IyIHw9IFRJTV9DUjJfQ0NEUzsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogUmVzZXQgdGhlIENDRFMgQml0ICovDQotICAgIFRJTXgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMl9DQ0RTKTsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyBvciBSZXNldHMgdGhlIFRJTSBwZXJpcGhlcmFsIENhcHR1cmUgQ29tcGFyZSBQcmVsb2FkIENvbnRyb2wgYml0Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAgMSwgMiwgMywgNCwgNSwgOCBvciAxNSANCi0gICogICB0byBzZWxlY3QgdGhlIFRJTXggcGVyaXBoZXJhbA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBQcmVsb2FkIENvbnRyb2wgYml0DQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0NDUHJlbG9hZENvbnRyb2woVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17IA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDVfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBDQ1BDIEJpdCAqLw0KLSAgICBUSU14LT5DUjIgfD0gVElNX0NSMl9DQ1BDOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBSZXNldCB0aGUgQ0NQQyBCaXQgKi8NCi0gICAgVElNeC0+Q1IyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ1IyX0NDUEMpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBDQ1IxLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DUHJlbG9hZDogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3Rlcg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRW5hYmxlDQotICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRGlzYWJsZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0MxUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCkNCi17DQotICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ1BSRUxPQURfU1RBVEUoVElNX09DUHJlbG9hZCkpOw0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0gIC8qIFJlc2V0IHRoZSBPQzFQRSBCaXQgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MxUEUpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIFByZWxvYWQgZmVhdHVyZSAqLw0KLSAgdG1wY2NtcjEgfD0gVElNX09DUHJlbG9hZDsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjIuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCANCi0gICogICB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DUHJlbG9hZDogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3Rlcg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRW5hYmxlDQotICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRGlzYWJsZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0MyUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCkNCi17DQotICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ1BSRUxPQURfU1RBVEUoVElNX09DUHJlbG9hZCkpOw0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0gIC8qIFJlc2V0IHRoZSBPQzJQRSBCaXQgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyUEUpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIFByZWxvYWQgZmVhdHVyZSAqLw0KLSAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fT0NQcmVsb2FkIDw8IDgpOw0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KLSAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXIgb24gQ0NSMy4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DUHJlbG9hZDogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3Rlcg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRW5hYmxlDQotICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRGlzYWJsZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0MzUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCkNCi17DQotICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ1BSRUxPQURfU1RBVEUoVElNX09DUHJlbG9hZCkpOw0KLSAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCi0gIC8qIFJlc2V0IHRoZSBPQzNQRSBCaXQgKi8NCi0gIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0MzUEUpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIFByZWxvYWQgZmVhdHVyZSAqLw0KLSAgdG1wY2NtcjIgfD0gVElNX09DUHJlbG9hZDsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjQuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0VuYWJsZQ0KLSAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX09DNFByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1ByZWxvYWQpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCi0gIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQotICAvKiBSZXNldCB0aGUgT0M0UEUgQml0ICovDQotICB0bXBjY21yMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX09DNFBFKTsNCi0gIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCi0gIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX09DUHJlbG9hZCA8PCA4KTsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggT3V0cHV0IENvbXBhcmUgMSBGYXN0IGZlYXR1cmUuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fT0NGYXN0X0VuYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZW5hYmxlDQotICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRGlzYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZGlzYWJsZQ0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0MxRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCkNCi17DQotICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0ZBU1RfU1RBVEUoVElNX09DRmFzdCkpOw0KLSAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovDQotICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KLSAgLyogUmVzZXQgdGhlIE9DMUZFIEJpdCAqLw0KLSAgdG1wY2NtcjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzFGRSk7DQotICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBCaXQgKi8NCi0gIHRtcGNjbXIxIHw9IFRJTV9PQ0Zhc3Q7DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IE91dHB1dCBDb21wYXJlIDIgRmFzdCBmZWF0dXJlLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgDQotICAqICAgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ0Zhc3Q6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBFbmFibGUgQml0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRW5hYmxlOiBUSU0gb3V0cHV0IGNvbXBhcmUgZmFzdCBlbmFibGUNCi0gICogICAgIEBhcmcgVElNX09DRmFzdF9EaXNhYmxlOiBUSU0gb3V0cHV0IGNvbXBhcmUgZmFzdCBkaXNhYmxlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzJGYXN0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NGYXN0KQ0KLXsNCi0gIHVpbnQxNl90IHRtcGNjbXIxID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DRkFTVF9TVEFURShUSU1fT0NGYXN0KSk7DQotICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQotICAvKiBSZXNldCB0aGUgT0MyRkUgQml0ICovDQotICB0bXBjY21yMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX09DMkZFKTsNCi0gIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEJpdCAqLw0KLSAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fT0NGYXN0IDw8IDgpOw0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLw0KLSAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSAzIEZhc3QgZmVhdHVyZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBCaXQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KLSAgKiAgICAgQGFyZyBUSU1fT0NGYXN0X0Rpc2FibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGRpc2FibGUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX09DM0Zhc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0Zhc3QpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCi0gIC8qIFJlc2V0IHRoZSBPQzNGRSBCaXQgKi8NCi0gIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0MzRkUpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgQml0ICovDQotICB0bXBjY21yMiB8PSBUSU1fT0NGYXN0Ow0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLw0KLSAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSA0IEZhc3QgZmVhdHVyZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBCaXQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KLSAgKiAgICAgQGFyZyBUSU1fT0NGYXN0X0Rpc2FibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGRpc2FibGUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX09DNEZhc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0Zhc3QpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCi0gIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KLSAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCi0gIC8qIFJlc2V0IHRoZSBPQzRGRSBCaXQgKi8NCi0gIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0M0RkUpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgQml0ICovDQotICB0bXBjY21yMiB8PSAodWludDE2X3QpKFRJTV9PQ0Zhc3QgPDwgOCk7DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIyICovDQotICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgb3Igc2FmZWd1YXJkcyB0aGUgT0NSRUYxIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudA0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fT0NDbGVhcjogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBDbGVhciBFbmFibGUgQml0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0VuYWJsZTogVElNIE91dHB1dCBjbGVhciBlbmFibGUNCi0gICogICAgIEBhcmcgVElNX09DQ2xlYXJfRGlzYWJsZTogVElNIE91dHB1dCBjbGVhciBkaXNhYmxlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9DbGVhck9DMVJlZihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DQ2xlYXIpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NDTEVBUl9TVEFURShUSU1fT0NDbGVhcikpOw0KLQ0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0NCi0gIC8qIFJlc2V0IHRoZSBPQzFDRSBCaXQgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MxQ0UpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEJpdCAqLw0KLSAgdG1wY2NtcjEgfD0gVElNX09DQ2xlYXI7DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIxIHJlZ2lzdGVyICovDQotICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgb3Igc2FmZWd1YXJkcyB0aGUgT0NSRUYyIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudA0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fT0NDbGVhcjogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBDbGVhciBFbmFibGUgQml0Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0VuYWJsZTogVElNIE91dHB1dCBjbGVhciBlbmFibGUNCi0gICogICAgIEBhcmcgVElNX09DQ2xlYXJfRGlzYWJsZTogVElNIE91dHB1dCBjbGVhciBkaXNhYmxlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9DbGVhck9DMlJlZihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DQ2xlYXIpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NDTEVBUl9TVEFURShUSU1fT0NDbGVhcikpOw0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0gIC8qIFJlc2V0IHRoZSBPQzJDRSBCaXQgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyQ0UpOw0KLSAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEJpdCAqLw0KLSAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fT0NDbGVhciA8PCA4KTsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyBvciBzYWZlZ3VhcmRzIHRoZSBPQ1JFRjMgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50DQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ0NsZWFyOiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEVuYWJsZSBCaXQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KLSAgKiAgICAgQGFyZyBUSU1fT0NDbGVhcl9EaXNhYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGRpc2FibGUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0NsZWFyT0MzUmVmKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NDbGVhcikNCi17DQotICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQotICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KLSAgLyogUmVzZXQgdGhlIE9DM0NFIEJpdCAqLw0KLSAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzNDRSk7DQotICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgQml0ICovDQotICB0bXBjY21yMiB8PSBUSU1fT0NDbGVhcjsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyBvciBzYWZlZ3VhcmRzIHRoZSBPQ1JFRjQgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50DQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ0NsZWFyOiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEVuYWJsZSBCaXQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KLSAgKiAgICAgQGFyZyBUSU1fT0NDbGVhcl9EaXNhYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGRpc2FibGUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0NsZWFyT0M0UmVmKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NDbGVhcikNCi17DQotICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQotICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KLSAgLyogUmVzZXQgdGhlIE9DNENFIEJpdCAqLw0KLSAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRDRSk7DQotICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgQml0ICovDQotICB0bXBjY21yMiB8PSAodWludDE2X3QpKFRJTV9PQ0NsZWFyIDw8IDgpOw0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiByZWdpc3RlciAqLw0KLSAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBjaGFubmVsIDEgcG9sYXJpdHkuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMSBQb2xhcml0eQ0KLSAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCi0gICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzFQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpDQotew0KLSAgdWludDE2X3QgdG1wY2NlciA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NQb2xhcml0eSkpOw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDMVAgQml0ICovDQotICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFQKTsNCi0gIHRtcGNjZXIgfD0gVElNX09DUG9sYXJpdHk7DQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IENoYW5uZWwgMU4gcG9sYXJpdHkuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgOCwgMTUsIDE2IG9yIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DTlBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMU4gUG9sYXJpdHkNCi0gICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ05Qb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KLSAgKiAgICAgQGFyZyBUSU1fT0NOUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzFOUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ05Qb2xhcml0eSkNCi17DQotICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QyX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShUSU1fT0NOUG9sYXJpdHkpKTsNCi0gICANCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLSAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzFOUCBCaXQgKi8NCi0gIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMU5QKTsNCi0gIHRtcGNjZXIgfD0gVElNX09DTlBvbGFyaXR5Ow0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ0VSIHJlZ2lzdGVyICovDQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBjaGFubmVsIDIgcG9sYXJpdHkuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzIgUG9sYXJpdHkNCi0gICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQotICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fT0MyUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1BvbGFyaXR5KQ0KLXsNCi0gIHVpbnQxNl90IHRtcGNjZXIgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DUG9sYXJpdHkpKTsNCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLSAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzJQIEJpdCAqLw0KLSAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MyUCk7DQotICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DUG9sYXJpdHkgPDwgNCk7DQotICAvKiBXcml0ZSB0byBUSU14IENDRVIgcmVnaXN0ZXIgKi8NCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IENoYW5uZWwgMk4gcG9sYXJpdHkuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DTlBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMk4gUG9sYXJpdHkNCi0gICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9PQ05Qb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KLSAgKiAgICAgQGFyZyBUSU1fT0NOUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzJOUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ05Qb2xhcml0eSkNCi17DQotICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QxX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShUSU1fT0NOUG9sYXJpdHkpKTsNCi0gIA0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDMk5QIEJpdCAqLw0KLSAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MyTlApOw0KLSAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ05Qb2xhcml0eSA8PCA0KTsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggY2hhbm5lbCAzIHBvbGFyaXR5Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMyBQb2xhcml0eQ0KLSAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCi0gICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9PQzNQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpDQotew0KLSAgdWludDE2X3QgdG1wY2NlciA9IDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NQb2xhcml0eSkpOw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDM1AgQml0ICovDQotICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzNQKTsNCi0gIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NQb2xhcml0eSA8PCA4KTsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggQ2hhbm5lbCAzTiBwb2xhcml0eS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fT0NOUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0MzTiBQb2xhcml0eQ0KLSAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DTlBvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQotICAqICAgICBAYXJnIFRJTV9PQ05Qb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX09DM05Qb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DTlBvbGFyaXR5KQ0KLXsNCi0gIHVpbnQxNl90IHRtcGNjZXIgPSAwOw0KLSANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QxX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShUSU1fT0NOUG9sYXJpdHkpKTsNCi0gICAgDQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIFNldCBvciBSZXNldCB0aGUgQ0MzTlAgQml0ICovDQotICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzNOUCk7DQotICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DTlBvbGFyaXR5IDw8IDgpOw0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ0VSIHJlZ2lzdGVyICovDQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBjaGFubmVsIDQgcG9sYXJpdHkuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0M0IFBvbGFyaXR5DQotICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KLSAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX09DNFBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NQb2xhcml0eSkNCi17DQotICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ1BvbGFyaXR5KSk7DQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIC8qIFNldCBvciBSZXNldCB0aGUgQ0M0UCBCaXQgKi8NCi0gIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDNFApOw0KLSAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ1BvbGFyaXR5IDw8IDEyKTsNCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgQ2hhbm5lbCB4Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fQ2hhbm5lbDogc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbA0KLSAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0NoYW5uZWxfMTogVElNIENoYW5uZWwgMQ0KLSAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8yOiBUSU0gQ2hhbm5lbCAyDQotICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzM6IFRJTSBDaGFubmVsIDMNCi0gICogICAgIEBhcmcgVElNX0NoYW5uZWxfNDogVElNIENoYW5uZWwgNA0KLSAgKiBAcGFyYW0gIFRJTV9DQ3g6IHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4RSBiaXQgbmV3IHN0YXRlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeF9FbmFibGUgb3IgVElNX0NDeF9EaXNhYmxlLiANCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0NDeENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NoYW5uZWwsIHVpbnQxNl90IFRJTV9DQ3gpDQotew0KLSAgdWludDE2X3QgdG1wID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q4X1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUwoVElNX0NoYW5uZWwpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0NYKFRJTV9DQ3gpKTsNCi0NCi0gIHRtcCA9IENDRVJfQ0NFX1NldCA8PCBUSU1fQ2hhbm5lbDsNCi0NCi0gIC8qIFJlc2V0IHRoZSBDQ3hFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpfiB0bXA7DQotDQotICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeEUgQml0ICovIA0KLSAgVElNeC0+Q0NFUiB8PSAgKHVpbnQxNl90KShUSU1fQ0N4IDw8IFRJTV9DaGFubmVsKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBDaGFubmVsIHhOLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDgsIDE1LCAxNiBvciAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsDQotICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8xOiBUSU0gQ2hhbm5lbCAxDQotICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzI6IFRJTSBDaGFubmVsIDINCi0gICogICAgIEBhcmcgVElNX0NoYW5uZWxfMzogVElNIENoYW5uZWwgMw0KLSAgKiBAcGFyYW0gIFRJTV9DQ3hOOiBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsIENDeE5FIGJpdCBuZXcgc3RhdGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBUSU1fQ0N4Tl9FbmFibGUgb3IgVElNX0NDeE5fRGlzYWJsZS4gDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9DQ3hOQ21kKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fQ2hhbm5lbCwgdWludDE2X3QgVElNX0NDeE4pDQotew0KLSAgdWludDE2X3QgdG1wID0gMDsNCi0NCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QyX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPTVBMRU1FTlRBUllfQ0hBTk5FTChUSU1fQ2hhbm5lbCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOKFRJTV9DQ3hOKSk7DQotDQotICB0bXAgPSBDQ0VSX0NDTkVfU2V0IDw8IFRJTV9DaGFubmVsOw0KLQ0KLSAgLyogUmVzZXQgdGhlIENDeE5FIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpIH50bXA7DQotDQotICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeE5FIEJpdCAqLyANCi0gIFRJTXgtPkNDRVIgfD0gICh1aW50MTZfdCkoVElNX0NDeE4gPDwgVElNX0NoYW5uZWwpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZWxlY3RzIHRoZSBUSU0gT3VwdXQgQ29tcGFyZSBNb2RlLg0KLSAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYmVmb3JlIGNoYW5naW5nIHRoZSBPdXB1dA0KLSAgKiAgICAgICAgIENvbXBhcmUgTW9kZS4NCi0gICogICAgICAgICBVc2VyIGhhcyB0byBlbmFibGUgdGhpcyBjaGFubmVsIHVzaW5nIFRJTV9DQ3hDbWQgYW5kIFRJTV9DQ3hOQ21kIGZ1bmN0aW9ucy4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0NoYW5uZWw6IHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwNCi0gICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzE6IFRJTSBDaGFubmVsIDENCi0gICogICAgIEBhcmcgVElNX0NoYW5uZWxfMjogVElNIENoYW5uZWwgMg0KLSAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8zOiBUSU0gQ2hhbm5lbCAzDQotICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzQ6IFRJTSBDaGFubmVsIDQNCi0gICogQHBhcmFtICBUSU1fT0NNb2RlOiBzcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBNb2RlLg0KLSAgKiAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX09DTW9kZV9UaW1pbmcNCi0gICogICAgIEBhcmcgVElNX09DTW9kZV9BY3RpdmUNCi0gICogICAgIEBhcmcgVElNX09DTW9kZV9Ub2dnbGUNCi0gICogICAgIEBhcmcgVElNX09DTW9kZV9QV00xDQotICAqICAgICBAYXJnIFRJTV9PQ01vZGVfUFdNMg0KLSAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZQ0KLSAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZWxlY3RPQ3hNKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fQ2hhbm5lbCwgdWludDE2X3QgVElNX09DTW9kZSkNCi17DQotICB1aW50MzJfdCB0bXAgPSAwOw0KLSAgdWludDE2X3QgdG1wMSA9IDA7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DSEFOTkVMKFRJTV9DaGFubmVsKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTShUSU1fT0NNb2RlKSk7DQotDQotICB0bXAgPSAodWludDMyX3QpIFRJTXg7DQotICB0bXAgKz0gQ0NNUl9PZmZzZXQ7DQotDQotICB0bXAxID0gQ0NFUl9DQ0VfU2V0IDw8ICh1aW50MTZfdClUSU1fQ2hhbm5lbDsNCi0NCi0gIC8qIERpc2FibGUgdGhlIENoYW5uZWw6IFJlc2V0IHRoZSBDQ3hFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpIH50bXAxOw0KLQ0KLSAgaWYoKFRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzEpIHx8KFRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzMpKQ0KLSAgew0KLSAgICB0bXAgKz0gKFRJTV9DaGFubmVsPj4xKTsNCi0NCi0gICAgLyogUmVzZXQgdGhlIE9DeE0gYml0cyBpbiB0aGUgQ0NNUnggcmVnaXN0ZXIgKi8NCi0gICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCAmPSAodWludDMyX3QpfigodWludDMyX3QpVElNX0NDTVIxX09DMU0pOw0KLSAgIA0KLSAgICAvKiBDb25maWd1cmUgdGhlIE9DeE0gYml0cyBpbiB0aGUgQ0NNUnggcmVnaXN0ZXIgKi8NCi0gICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCB8PSBUSU1fT0NNb2RlOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICB0bXAgKz0gKHVpbnQxNl90KShUSU1fQ2hhbm5lbCAtICh1aW50MTZfdCk0KT4+ICh1aW50MTZfdCkxOw0KLQ0KLSAgICAvKiBSZXNldCB0aGUgT0N4TSBiaXRzIGluIHRoZSBDQ01SeCByZWdpc3RlciAqLw0KLSAgICAqKF9fSU8gdWludDMyX3QgKikgdG1wICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClUSU1fQ0NNUjFfT0MyTSk7DQotICAgIA0KLSAgICAvKiBDb25maWd1cmUgdGhlIE9DeE0gYml0cyBpbiB0aGUgQ0NNUnggcmVnaXN0ZXIgKi8NCi0gICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCB8PSAodWludDE2X3QpKFRJTV9PQ01vZGUgPDwgOCk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgRGlzYWJsZXMgdGhlIFRJTXggVXBkYXRlIGV2ZW50Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU14IFVESVMgYml0DQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1VwZGF0ZURpc2FibGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBVcGRhdGUgRGlzYWJsZSBCaXQgKi8NCi0gICAgVElNeC0+Q1IxIHw9IFRJTV9DUjFfVURJUzsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogUmVzZXQgdGhlIFVwZGF0ZSBEaXNhYmxlIEJpdCAqLw0KLSAgICBUSU14LT5DUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjFfVURJUyk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggVXBkYXRlIFJlcXVlc3QgSW50ZXJydXB0IHNvdXJjZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX1VwZGF0ZVNvdXJjZTogc3BlY2lmaWVzIHRoZSBVcGRhdGUgc291cmNlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9VcGRhdGVTb3VyY2VfUmVndWxhcjogU291cmNlIG9mIHVwZGF0ZSBpcyB0aGUgY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgc2V0dGluZyBvZiBVRyBiaXQsIG9yIGFuIHVwZGF0ZSBnZW5lcmF0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyLg0KLSAgKiAgICAgQGFyZyBUSU1fVXBkYXRlU291cmNlX0dsb2JhbDogU291cmNlIG9mIHVwZGF0ZSBpcyBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdy4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1VwZGF0ZVJlcXVlc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9VcGRhdGVTb3VyY2UpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX1VQREFURV9TT1VSQ0UoVElNX1VwZGF0ZVNvdXJjZSkpOw0KLSAgaWYgKFRJTV9VcGRhdGVTb3VyY2UgIT0gVElNX1VwZGF0ZVNvdXJjZV9HbG9iYWwpDQotICB7DQotICAgIC8qIFNldCB0aGUgVVJTIEJpdCAqLw0KLSAgICBUSU14LT5DUjEgfD0gVElNX0NSMV9VUlM7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFJlc2V0IHRoZSBVUlMgQml0ICovDQotICAgIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9VUlMpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14knMgSGFsbCBzZW5zb3IgaW50ZXJmYWNlLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggSGFsbCBzZW5zb3IgaW50ZXJmYWNlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZWxlY3RIYWxsU2Vuc29yKFRJTV9UeXBlRGVmKiBUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogU2V0IHRoZSBUSTFTIEJpdCAqLw0KLSAgICBUSU14LT5DUjIgfD0gVElNX0NSMl9USTFTOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBSZXNldCB0aGUgVEkxUyBCaXQgKi8NCi0gICAgVElNeC0+Q1IyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ1IyX1RJMVMpOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZWxlY3RzIHRoZSBUSU14knMgT25lIFB1bHNlIE1vZGUuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9PUE1vZGU6IHNwZWNpZmllcyB0aGUgT1BNIE1vZGUgdG8gYmUgdXNlZC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fT1BNb2RlX1NpbmdsZQ0KLSAgKiAgICAgQGFyZyBUSU1fT1BNb2RlX1JlcGV0aXRpdmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NlbGVjdE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09QTW9kZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fT1BNX01PREUoVElNX09QTW9kZSkpOw0KLSAgLyogUmVzZXQgdGhlIE9QTSBCaXQgKi8NCi0gIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9PUE0pOw0KLSAgLyogQ29uZmlndXJlIHRoZSBPUE0gTW9kZSAqLw0KLSAgVElNeC0+Q1IxIHw9IFRJTV9PUE1vZGU7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTXggVHJpZ2dlciBPdXRwdXQgTW9kZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9UUkdPU291cmNlOiBzcGVjaWZpZXMgdGhlIFRyaWdnZXIgT3V0cHV0IHNvdXJjZS4NCi0gICogICBUaGlzIHBhcmFtdGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqDQotICAqICAtIEZvciBhbGwgVElNeA0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9SZXNldDogIFRoZSBVRyBiaXQgaW4gdGhlIFRJTV9FR1IgcmVnaXN0ZXIgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9FbmFibGU6IFRoZSBDb3VudGVyIEVuYWJsZSBDRU4gaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9VcGRhdGU6IFRoZSB1cGRhdGUgZXZlbnQgaXMgc2VsZWN0ZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCi0gICoNCi0gICogIC0gRm9yIGFsbCBUSU14IGV4Y2VwdCBUSU02IGFuZCBUSU03DQotICAqICAgICBAYXJnIFRJTV9UUkdPU291cmNlX09DMTogVGhlIHRyaWdnZXIgb3V0cHV0IHNlbmRzIGEgcG9zaXRpdmUgcHVsc2Ugd2hlbiB0aGUgQ0MxSUYgZmxhZw0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIHNldCwgYXMgc29vbiBhcyBhIGNhcHR1cmUgb3IgY29tcGFyZSBtYXRjaCBvY2N1cnMgKFRSR08pLg0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzFSZWY6IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzJSZWY6IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzNSZWY6IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KLSAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzRSZWY6IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KLSAgKg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fU2VsZWN0T3V0cHV0VHJpZ2dlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1RSR09Tb3VyY2UpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDdfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fVFJHT19TT1VSQ0UoVElNX1RSR09Tb3VyY2UpKTsNCi0gIC8qIFJlc2V0IHRoZSBNTVMgQml0cyAqLw0KLSAgVElNeC0+Q1IyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ1IyX01NUyk7DQotICAvKiBTZWxlY3QgdGhlIFRSR08gc291cmNlICovDQotICBUSU14LT5DUjIgfD0gIFRJTV9UUkdPU291cmNlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZWxlY3RzIHRoZSBUSU14IFNsYXZlIE1vZGUuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fU2xhdmVNb2RlOiBzcGVjaWZpZXMgdGhlIFRpbWVyIFNsYXZlIE1vZGUuDQotICAqICAgVGhpcyBwYXJhbXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fU2xhdmVNb2RlX1Jlc2V0OiBSaXNpbmcgZWRnZSBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBzaWduYWwgKFRSR0kpIHJlLWluaXRpYWxpemVzDQotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3VudGVyIGFuZCB0cmlnZ2VycyBhbiB1cGRhdGUgb2YgdGhlIHJlZ2lzdGVycy4NCi0gICogICAgIEBhcmcgVElNX1NsYXZlTW9kZV9HYXRlZDogICAgIFRoZSBjb3VudGVyIGNsb2NrIGlzIGVuYWJsZWQgd2hlbiB0aGUgdHJpZ2dlciBzaWduYWwgKFRSR0kpIGlzIGhpZ2guDQotICAqICAgICBAYXJnIFRJTV9TbGF2ZU1vZGVfVHJpZ2dlcjogICBUaGUgY291bnRlciBzdGFydHMgYXQgYSByaXNpbmcgZWRnZSBvZiB0aGUgdHJpZ2dlciBUUkdJLg0KLSAgKiAgICAgQGFyZyBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMTogUmlzaW5nIGVkZ2VzIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChUUkdJKSBjbG9jayB0aGUgY291bnRlci4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NlbGVjdFNsYXZlTW9kZShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1NsYXZlTW9kZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9NT0RFKFRJTV9TbGF2ZU1vZGUpKTsNCi0gLyogUmVzZXQgdGhlIFNNUyBCaXRzICovDQotICBUSU14LT5TTUNSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fU01DUl9TTVMpOw0KLSAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovDQotICBUSU14LT5TTUNSIHw9IFRJTV9TbGF2ZU1vZGU7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgb3IgUmVzZXRzIHRoZSBUSU14IE1hc3Rlci9TbGF2ZSBNb2RlLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX01hc3RlclNsYXZlTW9kZTogc3BlY2lmaWVzIHRoZSBUaW1lciBNYXN0ZXIgU2xhdmUgTW9kZS4NCi0gICogICBUaGlzIHBhcmFtdGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9NYXN0ZXJTbGF2ZU1vZGVfRW5hYmxlOiBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgY3VycmVudCB0aW1lcg0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cyBzbGF2ZXMgKHRocm91Z2ggVFJHTykuDQotICAqICAgICBAYXJnIFRJTV9NYXN0ZXJTbGF2ZU1vZGVfRGlzYWJsZTogTm8gYWN0aW9uDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZWxlY3RNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9NYXN0ZXJTbGF2ZU1vZGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fTVNNX1NUQVRFKFRJTV9NYXN0ZXJTbGF2ZU1vZGUpKTsNCi0gIC8qIFJlc2V0IHRoZSBNU00gQml0ICovDQotICBUSU14LT5TTUNSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fU01DUl9NU00pOw0KLSAgDQotICAvKiBTZXQgb3IgUmVzZXQgdGhlIE1TTSBCaXQgKi8NCi0gIFRJTXgtPlNNQ1IgfD0gVElNX01hc3RlclNsYXZlTW9kZTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIENvdW50ZXI6IHNwZWNpZmllcyB0aGUgQ291bnRlciByZWdpc3RlciBuZXcgdmFsdWUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZXRDb3VudGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb3VudGVyKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KLSAgLyogU2V0IHRoZSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlICovDQotICBUSU14LT5DTlQgPSBDb3VudGVyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBUSU14IEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUNCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQXV0b3JlbG9hZDogc3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NldEF1dG9yZWxvYWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IEF1dG9yZWxvYWQpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQotICAvKiBTZXQgdGhlIEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIFRJTXgtPkFSUiA9IEF1dG9yZWxvYWQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlMSBSZWdpc3RlciB2YWx1ZQ0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBDb21wYXJlMTogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUxIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NldENvbXBhcmUxKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb21wYXJlMSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUxIFJlZ2lzdGVyIHZhbHVlICovDQotICBUSU14LT5DQ1IxID0gQ29tcGFyZTE7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlMiBSZWdpc3RlciB2YWx1ZQ0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgQ29tcGFyZTI6IHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlMiByZWdpc3RlciBuZXcgdmFsdWUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZXRDb21wYXJlMihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgQ29tcGFyZTIpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlMiBSZWdpc3RlciB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NSMiA9IENvbXBhcmUyOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBUSU14IENhcHR1cmUgQ29tcGFyZTMgUmVnaXN0ZXIgdmFsdWUNCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBDb21wYXJlMzogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUzIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NldENvbXBhcmUzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb21wYXJlMykNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUzIFJlZ2lzdGVyIHZhbHVlICovDQotICBUSU14LT5DQ1IzID0gQ29tcGFyZTM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlNCBSZWdpc3RlciB2YWx1ZQ0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIENvbXBhcmU0OiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTQgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fU2V0Q29tcGFyZTQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IENvbXBhcmU0KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQotICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTQgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIFRJTXgtPkNDUjQgPSBDb21wYXJlNDsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDEgcHJlc2NhbGVyLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fSUNQU0M6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTEgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMTogbm8gcHJlc2NhbGVyDQotICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cw0KLSAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMNCi0gICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjg6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BTQykNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDUFNDKSk7DQotICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8NCi0gIFRJTXgtPkNDTVIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMxUFNDKTsNCi0gIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovDQotICBUSU14LT5DQ01SMSB8PSBUSU1fSUNQU0M7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAyIHByZXNjYWxlci4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9JQ1BTQzogc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlMiBwcmVzY2FsZXIgbmV3IHZhbHVlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCi0gICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQotICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KLSAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NldElDMlByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUFNDKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUNQU0MpKTsNCi0gIC8qIFJlc2V0IHRoZSBJQzJQU0MgQml0cyAqLw0KLSAgVElNeC0+Q0NNUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9JQzJQU0MpOw0KLSAgLyogU2V0IHRoZSBJQzJQU0MgdmFsdWUgKi8NCi0gIFRJTXgtPkNDTVIxIHw9ICh1aW50MTZfdCkoVElNX0lDUFNDIDw8IDgpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMyBwcmVzY2FsZXIuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0lDUFNDOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUzIHByZXNjYWxlciBuZXcgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KLSAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCi0gICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQotICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fU2V0SUMzUHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKFRJTV9JQ1BTQykpOw0KLSAgLyogUmVzZXQgdGhlIElDM1BTQyBCaXRzICovDQotICBUSU14LT5DQ01SMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0lDM1BTQyk7DQotICAvKiBTZXQgdGhlIElDM1BTQyB2YWx1ZSAqLw0KLSAgVElNeC0+Q0NNUjIgfD0gVElNX0lDUFNDOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgNCBwcmVzY2FsZXIuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0lDUFNDOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmU0IHByZXNjYWxlciBuZXcgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KLSAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCi0gICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQotICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBUSU1fU2V0SUM0UHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpDQoteyAgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDUFNDKSk7DQotICAvKiBSZXNldCB0aGUgSUM0UFNDIEJpdHMgKi8NCi0gIFRJTXgtPkNDTVIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfSUM0UFNDKTsNCi0gIC8qIFNldCB0aGUgSUM0UFNDIHZhbHVlICovDQotICBUSU14LT5DQ01SMiB8PSAodWludDE2X3QpKFRJTV9JQ1BTQyA8PCA4KTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBDbG9jayBEaXZpc2lvbiB2YWx1ZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgDQotICAqICAgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9DS0Q6IHNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24gdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KLSAgKiAgICAgQGFyZyBUSU1fQ0tEX0RJVjE6IFREVFMgPSBUY2tfdGltDQotICAqICAgICBAYXJnIFRJTV9DS0RfRElWMjogVERUUyA9IDIqVGNrX3RpbQ0KLSAgKiAgICAgQGFyZyBUSU1fQ0tEX0RJVjQ6IFREVFMgPSA0KlRja190aW0NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX1NldENsb2NrRGl2aXNpb24oVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9DS0QpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0tEX0RJVihUSU1fQ0tEKSk7DQotICAvKiBSZXNldCB0aGUgQ0tEIEJpdHMgKi8NCi0gIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9DS0QpOw0KLSAgLyogU2V0IHRoZSBDS0QgdmFsdWUgKi8NCi0gIFRJTXgtPkNSMSB8PSBUSU1fQ0tEOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMSB2YWx1ZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDEgUmVnaXN0ZXIgdmFsdWUuDQotICAqLw0KLXVpbnQxNl90IFRJTV9HZXRDYXB0dXJlMShUSU1fVHlwZURlZiogVElNeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KLSAgLyogR2V0IHRoZSBDYXB0dXJlIDEgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHJldHVybiBUSU14LT5DQ1IxOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMiB2YWx1ZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIENhcHR1cmUgQ29tcGFyZSAyIFJlZ2lzdGVyIHZhbHVlLg0KLSAgKi8NCi11aW50MTZfdCBUSU1fR2V0Q2FwdHVyZTIoVElNX1R5cGVEZWYqIFRJTXgpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCi0gIC8qIEdldCB0aGUgQ2FwdHVyZSAyIFJlZ2lzdGVyIHZhbHVlICovDQotICByZXR1cm4gVElNeC0+Q0NSMjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDMgdmFsdWUuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDMgUmVnaXN0ZXIgdmFsdWUuDQotICAqLw0KLXVpbnQxNl90IFRJTV9HZXRDYXB0dXJlMyhUSU1fVHlwZURlZiogVElNeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOyANCi0gIC8qIEdldCB0aGUgQ2FwdHVyZSAzIFJlZ2lzdGVyIHZhbHVlICovDQotICByZXR1cm4gVElNeC0+Q0NSMzsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDQgdmFsdWUuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDQgUmVnaXN0ZXIgdmFsdWUuDQotICAqLw0KLXVpbnQxNl90IFRJTV9HZXRDYXB0dXJlNChUSU1fVHlwZURlZiogVElNeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KLSAgLyogR2V0IHRoZSBDYXB0dXJlIDQgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHJldHVybiBUSU14LT5DQ1I0Ow0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBHZXRzIHRoZSBUSU14IENvdW50ZXIgdmFsdWUuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIENvdW50ZXIgUmVnaXN0ZXIgdmFsdWUuDQotICAqLw0KLXVpbnQxNl90IFRJTV9HZXRDb3VudGVyKFRJTV9UeXBlRGVmKiBUSU14KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KLSAgLyogR2V0IHRoZSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlICovDQotICByZXR1cm4gVElNeC0+Q05UOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBHZXRzIHRoZSBUSU14IFByZXNjYWxlciB2YWx1ZS4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEByZXR2YWwgUHJlc2NhbGVyIFJlZ2lzdGVyIHZhbHVlLg0KLSAgKi8NCi11aW50MTZfdCBUSU1fR2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KLSAgLyogR2V0IHRoZSBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUgKi8NCi0gIHJldHVybiBUSU14LT5QU0M7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGZsYWcgaXMgc2V0IG9yIG5vdC4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19VcGRhdGU6IFRJTSB1cGRhdGUgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0NPTTogVElNIENvbW11dGF0aW9uIEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfVHJpZ2dlcjogVElNIFRyaWdnZXIgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19CcmVhazogVElNIEJyZWFrIEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfQ0MxT0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBvdmVyY2FwdHVyZSBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMk9GOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgb3ZlcmNhcHR1cmUgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogVElNIENhcHR1cmUgQ29tcGFyZSAzIG92ZXJjYXB0dXJlIEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfQ0M0T0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBvdmVyY2FwdHVyZSBGbGFnDQotICAqIEBub3RlDQotICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBoYXZlIG9ubHkgb25lIHVwZGF0ZSBmbGFnLiANCi0gICogICAtIFRJTTksIFRJTTEyIGFuZCBUSU0xNSBjYW4gaGF2ZSBvbmx5IFRJTV9GTEFHX1VwZGF0ZSwgVElNX0ZMQUdfQ0MxLA0KLSAgKiAgICAgIFRJTV9GTEFHX0NDMiBvciBUSU1fRkxBR19UcmlnZ2VyLiANCi0gICogICAtIFRJTTEwLCBUSU0xMSwgVElNMTMsIFRJTTE0LCBUSU0xNiBhbmQgVElNMTcgY2FuIGhhdmUgVElNX0ZMQUdfVXBkYXRlIG9yIFRJTV9GTEFHX0NDMS4gICANCi0gICogICAtIFRJTV9GTEFHX0JyZWFrIGlzIHVzZWQgb25seSB3aXRoIFRJTTEsIFRJTTggYW5kIFRJTTE1LiANCi0gICogICAtIFRJTV9GTEFHX0NPTSBpcyB1c2VkIG9ubHkgd2l0aCBUSU0xLCBUSU04LCBUSU0xNSwgVElNMTYgYW5kIFRJTTE3LiAgICANCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFRJTV9GTEFHIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIFRJTV9HZXRGbGFnU3RhdHVzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRkxBRykNCi17IA0KLSAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7ICANCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9HRVRfRkxBRyhUSU1fRkxBRykpOw0KLSAgDQotICBpZiAoKFRJTXgtPlNSICYgVElNX0ZMQUcpICE9ICh1aW50MTZfdClSRVNFVCkNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gU0VUOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCi0gIH0NCi0gIHJldHVybiBiaXRzdGF0dXM7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgVElNeCdzIHBlbmRpbmcgZmxhZ3MuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgYml0IHRvIGNsZWFyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9GTEFHX1VwZGF0ZTogVElNIHVwZGF0ZSBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfQ09NOiBUSU0gQ29tbXV0YXRpb24gRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19UcmlnZ2VyOiBUSU0gVHJpZ2dlciBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0JyZWFrOiBUSU0gQnJlYWsgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogVElNIENhcHR1cmUgQ29tcGFyZSAxIG92ZXJjYXB0dXJlIEZsYWcNCi0gICogICAgIEBhcmcgVElNX0ZMQUdfQ0MyT0Y6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBvdmVyY2FwdHVyZSBGbGFnDQotICAqICAgICBAYXJnIFRJTV9GTEFHX0NDM09GOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgb3ZlcmNhcHR1cmUgRmxhZw0KLSAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogVElNIENhcHR1cmUgQ29tcGFyZSA0IG92ZXJjYXB0dXJlIEZsYWcNCi0gICogQG5vdGUNCi0gICogICAtIFRJTTYgYW5kIFRJTTcgY2FuIGhhdmUgb25seSBvbmUgdXBkYXRlIGZsYWcuIA0KLSAgKiAgIC0gVElNOSwgVElNMTIgYW5kIFRJTTE1IGNhbiBoYXZlIG9ubHkgVElNX0ZMQUdfVXBkYXRlLCBUSU1fRkxBR19DQzEsDQotICAqICAgICAgVElNX0ZMQUdfQ0MyIG9yIFRJTV9GTEFHX1RyaWdnZXIuIA0KLSAgKiAgIC0gVElNMTAsIFRJTTExLCBUSU0xMywgVElNMTQsIFRJTTE2IGFuZCBUSU0xNyBjYW4gaGF2ZSBUSU1fRkxBR19VcGRhdGUgb3IgVElNX0ZMQUdfQ0MxLiAgIA0KLSAgKiAgIC0gVElNX0ZMQUdfQnJlYWsgaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCBhbmQgVElNMTUuIA0KLSAgKiAgIC0gVElNX0ZMQUdfQ09NIGlzIHVzZWQgb25seSB3aXRoIFRJTTEsIFRJTTgsIFRJTTE1LCBUSU0xNiBhbmQgVElNMTcuICAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFRJTV9DbGVhckZsYWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9GTEFHKQ0KLXsgIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSX0ZMQUcoVElNX0ZMQUcpKTsNCi0gICANCi0gIC8qIENsZWFyIHRoZSBmbGFncyAqLw0KLSAgVElNeC0+U1IgPSAodWludDE2X3QpflRJTV9GTEFHOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgVElNIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fSVQ6IHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lUX1VwZGF0ZTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9DT006IFRJTSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9UcmlnZ2VyOiBUSU0gVHJpZ2dlciBJbnRlcnJ1cHQgc291cmNlDQotICAqICAgICBAYXJnIFRJTV9JVF9CcmVhazogVElNIEJyZWFrIEludGVycnVwdCBzb3VyY2UNCi0gICogQG5vdGUNCi0gICogICAtIFRJTTYgYW5kIFRJTTcgY2FuIGdlbmVyYXRlIG9ubHkgYW4gdXBkYXRlIGludGVycnVwdC4NCi0gICogICAtIFRJTTksIFRJTTEyIGFuZCBUSU0xNSBjYW4gaGF2ZSBvbmx5IFRJTV9JVF9VcGRhdGUsIFRJTV9JVF9DQzEsDQotICAqICAgICAgVElNX0lUX0NDMiBvciBUSU1fSVRfVHJpZ2dlci4gDQotICAqICAgLSBUSU0xMCwgVElNMTEsIFRJTTEzLCBUSU0xNCwgVElNMTYgYW5kIFRJTTE3IGNhbiBoYXZlIFRJTV9JVF9VcGRhdGUgb3IgVElNX0lUX0NDMS4gICANCi0gICogICAtIFRJTV9JVF9CcmVhayBpcyB1c2VkIG9ubHkgd2l0aCBUSU0xLCBUSU04IGFuZCBUSU0xNS4gDQotICAqICAgLSBUSU1fSVRfQ09NIGlzIHVzZWQgb25seSB3aXRoIFRJTTEsIFRJTTgsIFRJTTE1LCBUSU0xNiBhbmQgVElNMTcuICANCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBUSU1fSVQoU0VUIG9yIFJFU0VUKS4NCi0gICovDQotSVRTdGF0dXMgVElNX0dldElUU3RhdHVzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSVQpDQotew0KLSAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7ICANCi0gIHVpbnQxNl90IGl0c3RhdHVzID0gMHgwLCBpdGVuYWJsZSA9IDB4MDsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9HRVRfSVQoVElNX0lUKSk7DQotICAgDQotICBpdHN0YXR1cyA9IFRJTXgtPlNSICYgVElNX0lUOw0KLSAgDQotICBpdGVuYWJsZSA9IFRJTXgtPkRJRVIgJiBUSU1fSVQ7DQotICBpZiAoKGl0c3RhdHVzICE9ICh1aW50MTZfdClSRVNFVCkgJiYgKGl0ZW5hYmxlICE9ICh1aW50MTZfdClSRVNFVCkpDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFNFVDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgYml0c3RhdHVzID0gUkVTRVQ7DQotICB9DQotICByZXR1cm4gYml0c3RhdHVzOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDbGVhcnMgdGhlIFRJTXgncyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fSVQ6IHNwZWNpZmllcyB0aGUgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lUX1VwZGF0ZTogVElNMSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfQ09NOiBUSU0gQ29tbXV0YXRpb24gSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfVHJpZ2dlcjogVElNIFRyaWdnZXIgSW50ZXJydXB0IHNvdXJjZQ0KLSAgKiAgICAgQGFyZyBUSU1fSVRfQnJlYWs6IFRJTSBCcmVhayBJbnRlcnJ1cHQgc291cmNlDQotICAqIEBub3RlDQotICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBnZW5lcmF0ZSBvbmx5IGFuIHVwZGF0ZSBpbnRlcnJ1cHQuDQotICAqICAgLSBUSU05LCBUSU0xMiBhbmQgVElNMTUgY2FuIGhhdmUgb25seSBUSU1fSVRfVXBkYXRlLCBUSU1fSVRfQ0MxLA0KLSAgKiAgICAgIFRJTV9JVF9DQzIgb3IgVElNX0lUX1RyaWdnZXIuIA0KLSAgKiAgIC0gVElNMTAsIFRJTTExLCBUSU0xMywgVElNMTQsIFRJTTE2IGFuZCBUSU0xNyBjYW4gaGF2ZSBUSU1fSVRfVXBkYXRlIG9yIFRJTV9JVF9DQzEuICAgDQotICAqICAgLSBUSU1fSVRfQnJlYWsgaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCBhbmQgVElNMTUuIA0KLSAgKiAgIC0gVElNX0lUX0NPTSBpcyB1c2VkIG9ubHkgd2l0aCBUSU0xLCBUSU04LCBUSU0xNSwgVElNMTYgYW5kIFRJTTE3LiAgICANCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVElNX0NsZWFySVRQZW5kaW5nQml0KFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSVQpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lUKFRJTV9JVCkpOw0KLSAgLyogQ2xlYXIgdGhlIElUIHBlbmRpbmcgQml0ICovDQotICBUSU14LT5TUiA9ICh1aW50MTZfdCl+VElNX0lUOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMSBhcyBJbnB1dC4NCi0gICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgOiBUaGUgSW5wdXQgUG9sYXJpdHkuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nDQotICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCi0gICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzEuDQotICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMyLg0KLSAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fVFJDOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLg0KLSAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlcjogU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotc3RhdGljIHZvaWQgVEkxX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcikNCi17DQotICB1aW50MTZfdCB0bXBjY21yMSA9IDAsIHRtcGNjZXIgPSAwOw0KLSAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8NCi0gIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMUUpOw0KLSAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCi0gIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KLSAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMxRikpKTsNCi0gIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX0lDU2VsZWN0aW9uIHwgKHVpbnQxNl90KShUSU1fSUNGaWx0ZXIgPDwgKHVpbnQxNl90KTQpKTsNCi0gIA0KLSAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCkgfHwgKFRJTXggPT0gVElNMikgfHwgKFRJTXggPT0gVElNMykgfHwNCi0gICAgIChUSU14ID09IFRJTTQpIHx8KFRJTXggPT0gVElNNSkpDQotICB7DQotICAgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8NCi0gICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDMVApKTsNCi0gICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IHwgKHVpbnQxNl90KVRJTV9DQ0VSX0NDMUUpOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMUUgQml0ICovDQotICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KShUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApKTsNCi0gICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IHwgKHVpbnQxNl90KVRJTV9DQ0VSX0NDMUUpOw0KLSAgfQ0KLQ0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQotICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTIgYXMgSW5wdXQuDQotICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSA6IFRoZSBJbnB1dCBQb2xhcml0eS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCi0gICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KLSAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbjogc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMi4NCi0gICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzEuDQotICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9UUkM6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuDQotICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi1zdGF0aWMgdm9pZCBUSTJfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgVElNX0lDU2VsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0lDRmlsdGVyKQ0KLXsNCi0gIHVpbnQxNl90IHRtcGNjbXIxID0gMCwgdG1wY2NlciA9IDAsIHRtcCA9IDA7DQotICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MyRSk7DQotICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICB0bXAgPSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IDw8IDQpOw0KLSAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgKi8NCi0gIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MyUykpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMyRikpKTsNCi0gIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX0lDRmlsdGVyIDw8IDEyKTsNCi0gIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX0lDU2VsZWN0aW9uIDw8IDgpOw0KLSAgDQotICBpZigoVElNeCA9PSBUSU0xKSB8fCAoVElNeCA9PSBUSU04KSB8fCAoVElNeCA9PSBUSU0yKSB8fCAoVElNeCA9PSBUSU0zKSB8fA0KLSAgICAgKFRJTXggPT0gVElNNCkgfHwoVElNeCA9PSBUSU01KSkNCi0gIHsNCi0gICAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLw0KLSAgICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MyUCkpOw0KLSAgICB0bXBjY2VyIHw9ICAodWludDE2X3QpKHRtcCB8ICh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKTsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLw0KLSAgICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKSk7DQotICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fSUNQb2xhcml0eSB8ICh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKTsNCi0gIH0NCi0gIA0KLSAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8NCi0gIFRJTXgtPkNDTVIxID0gdG1wY2NtcjEgOw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkzIGFzIElucHV0Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZw0KLSAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9GYWxsaW5nDQotICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMzLg0KLSAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4NCi0gICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX1RSQzogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4NCi0gICogQHBhcmFtICBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXN0YXRpYyB2b2lkIFRJM19Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjIgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCi0gIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovDQotICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzNFKTsNCi0gIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQotICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCi0gIHRtcCA9ICh1aW50MTZfdCkoVElNX0lDUG9sYXJpdHkgPDwgOCk7DQotICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciAqLw0KLSAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KSgoKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9DQzNTKSkgJiAoKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9JQzNGKSkpOw0KLSAgdG1wY2NtcjIgfD0gKHVpbnQxNl90KShUSU1fSUNTZWxlY3Rpb24gfCAodWludDE2X3QpKFRJTV9JQ0ZpbHRlciA8PCAodWludDE2X3QpNCkpOw0KLSAgICANCi0gIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpIHx8IChUSU14ID09IFRJTTIpIHx8IChUSU14ID09IFRJTTMpIHx8DQotICAgICAoVElNeCA9PSBUSU00KSB8fChUSU14ID09IFRJTTUpKQ0KLSAgew0KLSAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDM0UgQml0ICovDQotICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KShUSU1fQ0NFUl9DQzNQKSk7DQotICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KSh0bXAgfCAodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MzRSBCaXQgKi8NCi0gICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCkpOw0KLSAgICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX0lDUG9sYXJpdHkgfCAodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQotICB9DQotICANCi0gIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovDQotICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KLSAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEk0IGFzIElucHV0Lg0KLSAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZw0KLSAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9GYWxsaW5nDQotICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUM0Lg0KLSAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4NCi0gICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX1RSQzogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4NCi0gICogQHBhcmFtICBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpDQotew0KLSAgdWludDE2X3QgdG1wY2NtcjIgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCi0NCi0gICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLw0KLSAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0M0RSk7DQotICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KLSAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQotICB0bXAgPSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IDw8IDEyKTsNCi0gIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQotICB0bXBjY21yMiAmPSAodWludDE2X3QpKCh1aW50MTZfdCkofih1aW50MTZfdClUSU1fQ0NNUjJfQ0M0UykgJiAoKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9JQzRGKSkpOw0KLSAgdG1wY2NtcjIgfD0gKHVpbnQxNl90KShUSU1fSUNTZWxlY3Rpb24gPDwgOCk7DQotICB0bXBjY21yMiB8PSAodWludDE2X3QpKFRJTV9JQ0ZpbHRlciA8PCAxMik7DQotICANCi0gIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpIHx8IChUSU14ID09IFRJTTIpIHx8IChUSU14ID09IFRJTTMpIHx8DQotICAgICAoVElNeCA9PSBUSU00KSB8fChUSU14ID09IFRJTTUpKQ0KLSAgew0KLSAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDNEUgQml0ICovDQotICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KShUSU1fQ0NFUl9DQzRQKSk7DQotICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KSh0bXAgfCAodWludDE2X3QpVElNX0NDRVJfQ0M0RSk7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0M0RSBCaXQgKi8NCi0gICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzROUCkpOw0KLSAgICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX0lDUG9sYXJpdHkgfCAodWludDE2X3QpVElNX0NDRVJfQ0M0RSk7DQotICB9DQotICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLw0KLSAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCi0gIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KLX0NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0KZGlmZiAtLWdpdCBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3VzYXJ0LmMgYi9EZW1vL0NPUlRFWF9TVE0zMkYxMDBfQXRvbGxpYy9MaWJyYXJpZXMvU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXIvc3JjL3N0bTMyZjEweF91c2FydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg0ZDk3Li4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3VzYXJ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU1ICswLDAgQEAKLS8qKg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBmaWxlICAgIHN0bTMyZjEweF91c2FydC5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFVTQVJUIGZpcm13YXJlIGZ1bmN0aW9ucy4NCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAY29weQ0KLSAgKg0KLSAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCi0gICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCi0gICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KLSAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQotICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCi0gICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KLSAgKg0KLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCi0gICovIA0KLQ0KLS8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotI2luY2x1ZGUgInN0bTMyZjEweF91c2FydC5oIg0KLSNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQotDQotLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgVVNBUlQgDQotICAqIEBicmllZiBVU0FSVCBkcml2ZXIgbW9kdWxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0RlZmluZXMNCi0gICogQHsNCi0gICovDQotDQotI2RlZmluZSBDUjFfVUVfU2V0ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgyMDAwKSAgLyohPCBVU0FSVCBFbmFibGUgTWFzayAqLw0KLSNkZWZpbmUgQ1IxX1VFX1Jlc2V0ICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4REZGRikgIC8qITwgVVNBUlQgRGlzYWJsZSBNYXNrICovDQotDQotI2RlZmluZSBDUjFfV0FLRV9NYXNrICAgICAgICAgICAgICgodWludDE2X3QpMHhGN0ZGKSAgLyohPCBVU0FSVCBXYWtlVXAgTWV0aG9kIE1hc2sgKi8NCi0NCi0jZGVmaW5lIENSMV9SV1VfU2V0ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpICAvKiE8IFVTQVJUIG11dGUgbW9kZSBFbmFibGUgTWFzayAqLw0KLSNkZWZpbmUgQ1IxX1JXVV9SZXNldCAgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZGRCkgIC8qITwgVVNBUlQgbXV0ZSBtb2RlIEVuYWJsZSBNYXNrICovDQotI2RlZmluZSBDUjFfU0JLX1NldCAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKSAgLyohPCBVU0FSVCBCcmVhayBDaGFyYWN0ZXIgc2VuZCBNYXNrICovDQotI2RlZmluZSBDUjFfQ0xFQVJfTWFzayAgICAgICAgICAgICgodWludDE2X3QpMHhFOUYzKSAgLyohPCBVU0FSVCBDUjEgTWFzayAqLw0KLSNkZWZpbmUgQ1IyX0FkZHJlc3NfTWFzayAgICAgICAgICAoKHVpbnQxNl90KTB4RkZGMCkgIC8qITwgVVNBUlQgYWRkcmVzcyBNYXNrICovDQotDQotI2RlZmluZSBDUjJfTElORU5fU2V0ICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4NDAwMCkgIC8qITwgVVNBUlQgTElOIEVuYWJsZSBNYXNrICovDQotI2RlZmluZSBDUjJfTElORU5fUmVzZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4QkZGRikgIC8qITwgVVNBUlQgTElOIERpc2FibGUgTWFzayAqLw0KLQ0KLSNkZWZpbmUgQ1IyX0xCRExfTWFzayAgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZERikgIC8qITwgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBNYXNrICovDQotI2RlZmluZSBDUjJfU1RPUF9DTEVBUl9NYXNrICAgICAgICgodWludDE2X3QpMHhDRkZGKSAgLyohPCBVU0FSVCBDUjIgU1RPUCBCaXRzIE1hc2sgKi8NCi0jZGVmaW5lIENSMl9DTE9DS19DTEVBUl9NYXNrICAgICAgKCh1aW50MTZfdCkweEYwRkYpICAvKiE8IFVTQVJUIENSMiBDbG9jayBNYXNrICovDQotDQotI2RlZmluZSBDUjNfU0NFTl9TZXQgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDIwKSAgLyohPCBVU0FSVCBTQyBFbmFibGUgTWFzayAqLw0KLSNkZWZpbmUgQ1IzX1NDRU5fUmVzZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZERikgIC8qITwgVVNBUlQgU0MgRGlzYWJsZSBNYXNrICovDQotDQotI2RlZmluZSBDUjNfTkFDS19TZXQgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwKSAgLyohPCBVU0FSVCBTQyBOQUNLIEVuYWJsZSBNYXNrICovDQotI2RlZmluZSBDUjNfTkFDS19SZXNldCAgICAgICAgICAgICgodWludDE2X3QpMHhGRkVGKSAgLyohPCBVU0FSVCBTQyBOQUNLIERpc2FibGUgTWFzayAqLw0KLQ0KLSNkZWZpbmUgQ1IzX0hEU0VMX1NldCAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkgIC8qITwgVVNBUlQgSGFsZi1EdXBsZXggRW5hYmxlIE1hc2sgKi8NCi0jZGVmaW5lIENSM19IRFNFTF9SZXNldCAgICAgICAgICAgKCh1aW50MTZfdCkweEZGRjcpICAvKiE8IFVTQVJUIEhhbGYtRHVwbGV4IERpc2FibGUgTWFzayAqLw0KLQ0KLSNkZWZpbmUgQ1IzX0lSTFBfTWFzayAgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZGQikgIC8qITwgVVNBUlQgSXJEQSBMb3dQb3dlciBtb2RlIE1hc2sgKi8NCi0jZGVmaW5lIENSM19DTEVBUl9NYXNrICAgICAgICAgICAgKCh1aW50MTZfdCkweEZDRkYpICAvKiE8IFVTQVJUIENSMyBNYXNrICovDQotDQotI2RlZmluZSBDUjNfSVJFTl9TZXQgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKSAgLyohPCBVU0FSVCBJckRBIEVuYWJsZSBNYXNrICovDQotI2RlZmluZSBDUjNfSVJFTl9SZXNldCAgICAgICAgICAgICgodWludDE2X3QpMHhGRkZEKSAgLyohPCBVU0FSVCBJckRBIERpc2FibGUgTWFzayAqLw0KLSNkZWZpbmUgR1RQUl9MU0JfTWFzayAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDBGRikgIC8qITwgR3VhcmQgVGltZSBSZWdpc3RlciBMU0IgTWFzayAqLw0KLSNkZWZpbmUgR1RQUl9NU0JfTWFzayAgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkYwMCkgIC8qITwgR3VhcmQgVGltZSBSZWdpc3RlciBNU0IgTWFzayAqLw0KLSNkZWZpbmUgSVRfTWFzayAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxRikgIC8qITwgVVNBUlQgSW50ZXJydXB0IE1hc2sgKi8NCi0NCi0vKiBVU0FSVCBPdmVyU2FtcGxpbmctOCBNYXNrICovDQotI2RlZmluZSBDUjFfT1ZFUjhfU2V0ICAgICAgICAgICAgICgodTE2KTB4ODAwMCkgIC8qIFVTQVJUIE9WRVI4IG1vZGUgRW5hYmxlIE1hc2sgKi8NCi0jZGVmaW5lIENSMV9PVkVSOF9SZXNldCAgICAgICAgICAgKCh1MTYpMHg3RkZGKSAgLyogVVNBUlQgT1ZFUjggbW9kZSBEaXNhYmxlIE1hc2sgKi8NCi0NCi0vKiBVU0FSVCBPbmUgQml0IFNhbXBsaW5nIE1hc2sgKi8NCi0jZGVmaW5lIENSM19PTkVCSVRFX1NldCAgICAgICAgICAgKCh1MTYpMHgwODAwKSAgLyogVVNBUlQgT05FQklURSBtb2RlIEVuYWJsZSBNYXNrICovDQotI2RlZmluZSBDUjNfT05FQklURV9SZXNldCAgICAgICAgICgodTE2KTB4RjdGRikgIC8qIFVTQVJUIE9ORUJJVEUgbW9kZSBEaXNhYmxlIE1hc2sgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX1ZhcmlhYmxlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBVU0FSVHggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9EZUluaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4KQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0NCi0gIGlmIChVU0FSVHggPT0gVVNBUlQxKQ0KLSAgew0KLSAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1VTQVJUMSwgRU5BQkxFKTsNCi0gICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9VU0FSVDEsIERJU0FCTEUpOw0KLSAgfQ0KLSAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMikNCi0gIHsNCi0gICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDIsIEVOQUJMRSk7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQyLCBESVNBQkxFKTsNCi0gIH0NCi0gIGVsc2UgaWYgKFVTQVJUeCA9PSBVU0FSVDMpDQotICB7DQotICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQzLCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VTQVJUMywgRElTQUJMRSk7DQotICB9ICAgIA0KLSAgZWxzZSBpZiAoVVNBUlR4ID09IFVBUlQ0KQ0KLSAgew0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ0LCBFTkFCTEUpOw0KLSAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ0LCBESVNBQkxFKTsNCi0gIH0gICAgDQotICBlbHNlDQotICB7DQotICAgIGlmIChVU0FSVHggPT0gVUFSVDUpDQotICAgIHsgDQotICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VQVJUNSwgRU5BQkxFKTsNCi0gICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ1LCBESVNBQkxFKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVVNBUlR4IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCi0gICogICBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9Jbml0U3RydWN0IC4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHBhcmFtICBVU0FSVF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVVNBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQotICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVCBwZXJpcGhlcmFsLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9Jbml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgVVNBUlRfSW5pdFR5cGVEZWYqIFVTQVJUX0luaXRTdHJ1Y3QpDQotew0KLSAgdWludDMyX3QgdG1wcmVnID0gMHgwMCwgYXBiY2xvY2sgPSAweDAwOw0KLSAgdWludDMyX3QgaW50ZWdlcmRpdmlkZXIgPSAweDAwOw0KLSAgdWludDMyX3QgZnJhY3Rpb25hbGRpdmlkZXIgPSAweDAwOw0KLSAgdWludDMyX3QgdXNhcnR4YmFzZSA9IDA7DQotICBSQ0NfQ2xvY2tzVHlwZURlZiBSQ0NfQ2xvY2tzU3RhdHVzOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0JBVURSQVRFKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0JhdWRSYXRlKSk7ICANCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9XT1JEX0xFTkdUSChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfU1RPUEJJVFMoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfU3RvcEJpdHMpKTsNCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9QQVJJVFkoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfUGFyaXR5KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTU9ERShVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Nb2RlKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSEFSRFdBUkVfRkxPV19DT05UUk9MKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wpKTsNCi0gIC8qIFRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIFVTQVJUMSwgVVNBUlQyIGFuZCBVU0FSVDMgKi8NCi0gIGlmIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sICE9IFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfTm9uZSkNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQotICB9DQotDQotICB1c2FydHhiYXNlID0gKHVpbnQzMl90KVVTQVJUeDsNCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgdG1wcmVnID0gVVNBUlR4LT5DUjI7DQotICAvKiBDbGVhciBTVE9QWzEzOjEyXSBiaXRzICovDQotICB0bXByZWcgJj0gQ1IyX1NUT1BfQ0xFQVJfTWFzazsNCi0gIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgU3RvcCBCaXRzLCBDbG9jaywgQ1BPTCwgQ1BIQSBhbmQgTGFzdEJpdCAtLS0tLS0tLS0tLS0qLw0KLSAgLyogU2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX1N0b3BCaXRzIHZhbHVlICovDQotICB0bXByZWcgfD0gKHVpbnQzMl90KVVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1N0b3BCaXRzOw0KLSAgDQotICAvKiBXcml0ZSB0byBVU0FSVCBDUjIgKi8NCi0gIFVTQVJUeC0+Q1IyID0gKHVpbnQxNl90KXRtcHJlZzsNCi0NCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgdG1wcmVnID0gVVNBUlR4LT5DUjE7DQotICAvKiBDbGVhciBNLCBQQ0UsIFBTLCBURSBhbmQgUkUgYml0cyAqLw0KLSAgdG1wcmVnICY9IENSMV9DTEVBUl9NYXNrOw0KLSAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBXb3JkIExlbmd0aCwgUGFyaXR5IGFuZCBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotICAvKiBTZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfV29yZExlbmd0aCB2YWx1ZSAqLw0KLSAgLyogU2V0IFBDRSBhbmQgUFMgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfUGFyaXR5IHZhbHVlICovDQotICAvKiBTZXQgVEUgYW5kIFJFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX01vZGUgdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSAodWludDMyX3QpVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfV29yZExlbmd0aCB8IFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1Bhcml0eSB8DQotICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTW9kZTsNCi0gIC8qIFdyaXRlIHRvIFVTQVJUIENSMSAqLw0KLSAgVVNBUlR4LT5DUjEgPSAodWludDE2X3QpdG1wcmVnOw0KLQ0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICANCi0gIHRtcHJlZyA9IFVTQVJUeC0+Q1IzOw0KLSAgLyogQ2xlYXIgQ1RTRSBhbmQgUlRTRSBiaXRzICovDQotICB0bXByZWcgJj0gQ1IzX0NMRUFSX01hc2s7DQotICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIEhGQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIFNldCBDVFNFIGFuZCBSVFNFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sOw0KLSAgLyogV3JpdGUgdG8gVVNBUlQgQ1IzICovDQotICBVU0FSVHgtPkNSMyA9ICh1aW50MTZfdCl0bXByZWc7DQotDQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0gIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgQmF1ZCBSYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLSAgUkNDX0dldENsb2Nrc0ZyZXEoJlJDQ19DbG9ja3NTdGF0dXMpOw0KLSAgaWYgKHVzYXJ0eGJhc2UgPT0gVVNBUlQxX0JBU0UpDQotICB7DQotICAgIGFwYmNsb2NrID0gUkNDX0Nsb2Nrc1N0YXR1cy5QQ0xLMl9GcmVxdWVuY3k7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIGFwYmNsb2NrID0gUkNDX0Nsb2Nrc1N0YXR1cy5QQ0xLMV9GcmVxdWVuY3k7DQotICB9DQotICANCi0gIC8qIERldGVybWluZSB0aGUgaW50ZWdlciBwYXJ0ICovDQotICBpZiAoKFVTQVJUeC0+Q1IxICYgQ1IxX09WRVI4X1NldCkgIT0gMCkNCi0gIHsNCi0gICAgLyogSW50ZWdlciBwYXJ0IGNvbXB1dGluZyBpbiBjYXNlIE92ZXJzYW1wbGluZyBtb2RlIGlzIDggU2FtcGxlcyAqLw0KLSAgICBpbnRlZ2VyZGl2aWRlciA9ICgoMjUgKiBhcGJjbG9jaykgLyAoMiAqIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSkpKTsgICAgDQotICB9DQotICBlbHNlIC8qIGlmICgoVVNBUlR4LT5DUjEgJiBDUjFfT1ZFUjhfU2V0KSA9PSAwKSAqLw0KLSAgew0KLSAgICAvKiBJbnRlZ2VyIHBhcnQgY29tcHV0aW5nIGluIGNhc2UgT3ZlcnNhbXBsaW5nIG1vZGUgaXMgMTYgU2FtcGxlcyAqLw0KLSAgICBpbnRlZ2VyZGl2aWRlciA9ICgoMjUgKiBhcGJjbG9jaykgLyAoNCAqIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSkpKTsgICAgDQotICB9DQotICB0bXByZWcgPSAoaW50ZWdlcmRpdmlkZXIgLyAxMDApIDw8IDQ7DQotDQotICAvKiBEZXRlcm1pbmUgdGhlIGZyYWN0aW9uYWwgcGFydCAqLw0KLSAgZnJhY3Rpb25hbGRpdmlkZXIgPSBpbnRlZ2VyZGl2aWRlciAtICgxMDAgKiAodG1wcmVnID4+IDQpKTsNCi0NCi0gIC8qIEltcGxlbWVudCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluIHRoZSByZWdpc3RlciAqLw0KLSAgaWYgKChVU0FSVHgtPkNSMSAmIENSMV9PVkVSOF9TZXQpICE9IDApDQotICB7DQotICAgIHRtcHJlZyB8PSAoKCgoZnJhY3Rpb25hbGRpdmlkZXIgKiA4KSArIDUwKSAvIDEwMCkpICYgKCh1aW50OF90KTB4MDcpOw0KLSAgfQ0KLSAgZWxzZSAvKiBpZiAoKFVTQVJUeC0+Q1IxICYgQ1IxX09WRVI4X1NldCkgPT0gMCkgKi8NCi0gIHsNCi0gICAgdG1wcmVnIHw9ICgoKChmcmFjdGlvbmFsZGl2aWRlciAqIDE2KSArIDUwKSAvIDEwMCkpICYgKCh1aW50OF90KTB4MEYpOw0KLSAgfQ0KLSAgDQotICAvKiBXcml0ZSB0byBVU0FSVCBCUlIgKi8NCi0gIFVTQVJUeC0+QlJSID0gKHVpbnQxNl90KXRtcHJlZzsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRmlsbHMgZWFjaCBVU0FSVF9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KLSAgKiBAcGFyYW0gIFVTQVJUX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCi0gICogICB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9TdHJ1Y3RJbml0KFVTQVJUX0luaXRUeXBlRGVmKiBVU0FSVF9Jbml0U3RydWN0KQ0KLXsNCi0gIC8qIFVTQVJUX0luaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQotICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSA9IDk2MDA7DQotICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoID0gVVNBUlRfV29yZExlbmd0aF84YjsNCi0gIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1N0b3BCaXRzID0gVVNBUlRfU3RvcEJpdHNfMTsNCi0gIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1Bhcml0eSA9IFVTQVJUX1Bhcml0eV9ObyA7DQotICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Nb2RlID0gVVNBUlRfTW9kZV9SeCB8IFVTQVJUX01vZGVfVHg7DQotICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sID0gVVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbF9Ob25lOyAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBVU0FSVHggcGVyaXBoZXJhbCBDbG9jayBhY2NvcmRpbmcgdG8gdGhlIA0KLSAgKiAgIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMyB0byBzZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVVNBUlRfQ2xvY2tJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVVNBUlRfQ2xvY2tJbml0VHlwZURlZg0KLSAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIA0KLSAgKiAgIFVTQVJUIHBlcmlwaGVyYWwuICANCi0gICogQG5vdGUgVGhlIFNtYXJ0IENhcmQgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX0Nsb2NrSW5pdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYqIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCkNCi17DQotICB1aW50MzJfdCB0bXByZWcgPSAweDAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NMT0NLKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2spKTsNCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9DUE9MKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BPTCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NQSEEoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUEhBKSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTEFTVEJJVChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0xhc3RCaXQpKTsNCi0gIA0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotICB0bXByZWcgPSBVU0FSVHgtPkNSMjsNCi0gIC8qIENsZWFyIENMS0VOLCBDUE9MLCBDUEhBIGFuZCBMQkNMIGJpdHMgKi8NCi0gIHRtcHJlZyAmPSBDUjJfQ0xPQ0tfQ0xFQVJfTWFzazsNCi0gIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgQ2xvY2ssIENQT0wsIENQSEEgYW5kIExhc3RCaXQgLS0tLS0tLS0tLS0tKi8NCi0gIC8qIFNldCBDTEtFTiBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0Nsb2NrIHZhbHVlICovDQotICAvKiBTZXQgQ1BPTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0NQT0wgdmFsdWUgKi8NCi0gIC8qIFNldCBDUEhBIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ1BIQSB2YWx1ZSAqLw0KLSAgLyogU2V0IExCQ0wgYml0IGFjY29yZGluZyB0byBVU0FSVF9MYXN0Qml0IHZhbHVlICovDQotICB0bXByZWcgfD0gKHVpbnQzMl90KVVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2sgfCBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQT0wgfCANCi0gICAgICAgICAgICAgICAgIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BIQSB8IFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfTGFzdEJpdDsNCi0gIC8qIFdyaXRlIHRvIFVTQVJUIENSMiAqLw0KLSAgVVNBUlR4LT5DUjIgPSAodWludDE2X3QpdG1wcmVnOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBGaWxscyBlYWNoIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCi0gICogQHBhcmFtICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9DbG9ja0luaXRUeXBlRGVmDQotICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX0Nsb2NrU3RydWN0SW5pdChVU0FSVF9DbG9ja0luaXRUeXBlRGVmKiBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpDQotew0KLSAgLyogVVNBUlRfQ2xvY2tJbml0U3RydWN0IG1lbWJlcnMgZGVmYXVsdCB2YWx1ZSAqLw0KLSAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DbG9jayA9IFVTQVJUX0Nsb2NrX0Rpc2FibGU7DQotICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQT0wgPSBVU0FSVF9DUE9MX0xvdzsNCi0gIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BIQSA9IFVTQVJUX0NQSEFfMUVkZ2U7DQotICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0xhc3RCaXQgPSBVU0FSVF9MYXN0Qml0X0Rpc2FibGU7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVU0FSVCBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUeCBwZXJpcGhlcmFsLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX0NtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBVU0FSVCBieSBzZXR0aW5nIHRoZSBVRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMSB8PSBDUjFfVUVfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBVU0FSVCBieSBjbGVhcmluZyB0aGUgVUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjEgJj0gQ1IxX1VFX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0cy4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHBhcmFtICBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFVTQVJUX0lUX0NUUzogIENUUyBjaGFuZ2UgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUpDQotICAqICAgICBAYXJnIFVTQVJUX0lUX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQotICAqICAgICBAYXJnIFVTQVJUX0lUX1RYRTogIFRhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfVEM6ICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9SWE5FOiBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9JRExFOiBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9QRTogICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0DQotICAqICAgICBAYXJnIFVTQVJUX0lUX0VSUjogIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFVTQVJUeCBpbnRlcnJ1cHRzLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX0lUQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICB1aW50MzJfdCB1c2FydHJlZyA9IDB4MDAsIGl0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMDsNCi0gIHVpbnQzMl90IHVzYXJ0eGJhc2UgPSAweDAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NPTkZJR19JVChVU0FSVF9JVCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIC8qIFRoZSBDVFMgaW50ZXJydXB0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSAqLw0KLSAgaWYgKFVTQVJUX0lUID09IFVTQVJUX0lUX0NUUykNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQotICB9ICAgDQotICANCi0gIHVzYXJ0eGJhc2UgPSAodWludDMyX3QpVVNBUlR4Ow0KLQ0KLSAgLyogR2V0IHRoZSBVU0FSVCByZWdpc3RlciBpbmRleCAqLw0KLSAgdXNhcnRyZWcgPSAoKCh1aW50OF90KVVTQVJUX0lUKSA+PiAweDA1KTsNCi0NCi0gIC8qIEdldCB0aGUgaW50ZXJydXB0IHBvc2l0aW9uICovDQotICBpdHBvcyA9IFVTQVJUX0lUICYgSVRfTWFzazsNCi0gIGl0bWFzayA9ICgoKHVpbnQzMl90KTB4MDEpIDw8IGl0cG9zKTsNCi0gICAgDQotICBpZiAodXNhcnRyZWcgPT0gMHgwMSkgLyogVGhlIElUIGlzIGluIENSMSByZWdpc3RlciAqLw0KLSAgew0KLSAgICB1c2FydHhiYXNlICs9IDB4MEM7DQotICB9DQotICBlbHNlIGlmICh1c2FydHJlZyA9PSAweDAyKSAvKiBUaGUgSVQgaXMgaW4gQ1IyIHJlZ2lzdGVyICovDQotICB7DQotICAgIHVzYXJ0eGJhc2UgKz0gMHgxMDsNCi0gIH0NCi0gIGVsc2UgLyogVGhlIElUIGlzIGluIENSMyByZWdpc3RlciAqLw0KLSAgew0KLSAgICB1c2FydHhiYXNlICs9IDB4MTQ7IA0KLSAgfQ0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgICooX19JTyB1aW50MzJfdCopdXNhcnR4YmFzZSAgfD0gaXRtYXNrOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAqKF9fSU8gdWludDMyX3QqKXVzYXJ0eGJhc2UgJj0gfml0bWFzazsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBETUEgaW50ZXJmYWNlLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIFVTQVJUX0RNQVJlcTogc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBVU0FSVF9ETUFSZXFfVHg6IFVTQVJUIERNQSB0cmFuc21pdCByZXF1ZXN0DQotICAqICAgICBAYXJnIFVTQVJUX0RNQVJlcV9SeDogVVNBUlQgRE1BIHJlY2VpdmUgcmVxdWVzdA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIERNQSBSZXF1ZXN0IHNvdXJjZXMuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCi0gICogQG5vdGUgVGhlIERNQSBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ1IGV4Y2VwdCBpbiB0aGUgU1RNMzINCi0gICogICAgICAgSGlnaCBkZW5zaXR5IHZhbHVlIGxpbmUgZGV2aWNlcyhTVE0zMkYxMFhfSERfVkwpLiAgDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX0RNQUNtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0RNQVJlcSwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9ETUFSRVEoVVNBUlRfRE1BUmVxKSk7ICANCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciBzZWxlY3RlZCByZXF1ZXN0cyBieSBzZXR0aW5nIHRoZSBETUFUIGFuZC9vcg0KLSAgICAgICBETUFSIGJpdHMgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMyB8PSBVU0FSVF9ETUFSZXE7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igc2VsZWN0ZWQgcmVxdWVzdHMgYnkgY2xlYXJpbmcgdGhlIERNQVQgYW5kL29yDQotICAgICAgIERNQVIgYml0cyBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovDQotICAgIFVTQVJUeC0+Q1IzICY9ICh1aW50MTZfdCl+VVNBUlRfRE1BUmVxOw0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIFVTQVJUX0FkZHJlc3M6IEluZGljYXRlcyB0aGUgYWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVVNBUlRfU2V0QWRkcmVzcyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQ4X3QgVVNBUlRfQWRkcmVzcykNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUREUkVTUyhVU0FSVF9BZGRyZXNzKSk7IA0KLSAgICANCi0gIC8qIENsZWFyIHRoZSBVU0FSVCBhZGRyZXNzICovDQotICBVU0FSVHgtPkNSMiAmPSBDUjJfQWRkcmVzc19NYXNrOw0KLSAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8NCi0gIFVTQVJUeC0+Q1IyIHw9IFVTQVJUX0FkZHJlc3M7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFVTQVJUIFdha2VVcCBtZXRob2QuDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEBwYXJhbSAgVVNBUlRfV2FrZVVwOiBzcGVjaWZpZXMgdGhlIFVTQVJUIHdha2V1cCBtZXRob2QuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVVNBUlRfV2FrZVVwX0lkbGVMaW5lOiBXYWtlVXAgYnkgYW4gaWRsZSBsaW5lIGRldGVjdGlvbg0KLSAgKiAgICAgQGFyZyBVU0FSVF9XYWtlVXBfQWRkcmVzc01hcms6IFdha2VVcCBieSBhbiBhZGRyZXNzIG1hcmsNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVVNBUlRfV2FrZVVwQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfV2FrZVVwKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9XQUtFVVAoVVNBUlRfV2FrZVVwKSk7DQotICANCi0gIFVTQVJUeC0+Q1IxICY9IENSMV9XQUtFX01hc2s7DQotICBVU0FSVHgtPkNSMSB8PSBVU0FSVF9XYWtlVXA7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIERldGVybWluZXMgaWYgdGhlIFVTQVJUIGlzIGluIG11dGUgbW9kZSBvciBub3QuDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlQgbXV0ZSBtb2RlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX1JlY2VpdmVyV2FrZVVwQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KLSAgDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSBVU0FSVCBtdXRlIG1vZGUgIGJ5IHNldHRpbmcgdGhlIFJXVSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMSB8PSBDUjFfUldVX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBSV1UgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjEgJj0gQ1IxX1JXVV9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBsZW5ndGguDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEBwYXJhbSAgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGg6IHNwZWNpZmllcyB0aGUgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGguDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhfMTBiOiAxMC1iaXQgYnJlYWsgZGV0ZWN0aW9uDQotICAqICAgICBAYXJnIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoXzExYjogMTEtYml0IGJyZWFrIGRldGVjdGlvbg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aENvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aCkpOw0KLSAgDQotICBVU0FSVHgtPkNSMiAmPSBDUjJfTEJETF9NYXNrOw0KLSAgVVNBUlR4LT5DUjIgfD0gVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGg7ICANCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBMSU4gbW9kZS4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBMSU4gbW9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9MSU5DbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgYnkgc2V0dGluZyB0aGUgTElORU4gYml0IGluIHRoZSBDUjIgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjIgfD0gQ1IyX0xJTkVOX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgTElOIG1vZGUgYnkgY2xlYXJpbmcgdGhlIExJTkVOIGJpdCBpbiB0aGUgQ1IyIHJlZ2lzdGVyICovDQotICAgIFVTQVJUeC0+Q1IyICY9IENSMl9MSU5FTl9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgVHJhbnNtaXRzIHNpbmdsZSBkYXRhIHRocm91Z2ggdGhlIFVTQVJUeCBwZXJpcGhlcmFsLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIERhdGE6IHRoZSBkYXRhIHRvIHRyYW5zbWl0Lg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9TZW5kRGF0YShVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IERhdGEpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0RBVEEoRGF0YSkpOyANCi0gICAgDQotICAvKiBUcmFuc21pdCBEYXRhICovDQotICBVU0FSVHgtPkRSID0gKERhdGEgJiAodWludDE2X3QpMHgwMUZGKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgcmVjZWl2ZWQgZGF0YSBieSB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEByZXR2YWwgVGhlIHJlY2VpdmVkIGRhdGEuDQotICAqLw0KLXVpbnQxNl90IFVTQVJUX1JlY2VpdmVEYXRhKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICANCi0gIC8qIFJlY2VpdmUgRGF0YSAqLw0KLSAgcmV0dXJuICh1aW50MTZfdCkoVVNBUlR4LT5EUiAmICh1aW50MTZfdCkweDAxRkYpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBUcmFuc21pdHMgYnJlYWsgY2hhcmFjdGVycy4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVVNBUlRfU2VuZEJyZWFrKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICANCi0gIC8qIFNlbmQgYnJlYWsgY2hhcmFjdGVycyAqLw0KLSAgVVNBUlR4LT5DUjEgfD0gQ1IxX1NCS19TZXQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIHNwZWNpZmllZCBVU0FSVCBndWFyZCB0aW1lLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBVU0FSVF9HdWFyZFRpbWU6IHNwZWNpZmllcyB0aGUgZ3VhcmQgdGltZS4NCi0gICogQG5vdGUgVGhlIGd1YXJkIHRpbWUgYml0cyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1LiAgIA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9TZXRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50OF90IFVTQVJUX0d1YXJkVGltZSkNCi17ICAgIA0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOw0KLSAgDQotICAvKiBDbGVhciB0aGUgVVNBUlQgR3VhcmQgdGltZSAqLw0KLSAgVVNBUlR4LT5HVFBSICY9IEdUUFJfTFNCX01hc2s7DQotICAvKiBTZXQgdGhlIFVTQVJUIGd1YXJkIHRpbWUgKi8NCi0gIFVTQVJUeC0+R1RQUiB8PSAodWludDE2X3QpKCh1aW50MTZfdClVU0FSVF9HdWFyZFRpbWUgPDwgMHgwOCk7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIHN5c3RlbSBjbG9jayBwcmVzY2FsZXIuDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEBwYXJhbSAgVVNBUlRfUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIHByZXNjYWxlciBjbG9jay4gIA0KLSAgKiBAbm90ZSAgIFRoZSBmdW5jdGlvbiBpcyB1c2VkIGZvciBJckRBIG1vZGUgd2l0aCBVQVJUNCBhbmQgVUFSVDUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX1NldFByZXNjYWxlcihVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQ4X3QgVVNBUlRfUHJlc2NhbGVyKQ0KLXsgDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICANCi0gIC8qIENsZWFyIHRoZSBVU0FSVCBwcmVzY2FsZXIgKi8NCi0gIFVTQVJUeC0+R1RQUiAmPSBHVFBSX01TQl9NYXNrOw0KLSAgLyogU2V0IHRoZSBVU0FSVCBwcmVzY2FsZXIgKi8NCi0gIFVTQVJUeC0+R1RQUiB8PSBVU0FSVF9QcmVzY2FsZXI7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgU21hcnQgQ2FyZCBtb2RlLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4NCi0gICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTbWFydCBDYXJkIG1vZGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4gICAgIA0KLSAgKiBAbm90ZSBUaGUgU21hcnQgQ2FyZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNS4gDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX1NtYXJ0Q2FyZENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgU0MgbW9kZSBieSBzZXR0aW5nIHRoZSBTQ0VOIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQotICAgIFVTQVJUeC0+Q1IzIHw9IENSM19TQ0VOX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgU0MgbW9kZSBieSBjbGVhcmluZyB0aGUgU0NFTiBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMyAmPSBDUjNfU0NFTl9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyBOQUNLIHRyYW5zbWlzc2lvbi4NCi0gICogQHBhcmFtICBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIE5BQ0sgdHJhbnNtaXNzaW9uLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuICANCi0gICogQG5vdGUgVGhlIFNtYXJ0IENhcmQgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX1NtYXJ0Q2FyZE5BQ0tDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOyAgDQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgTkFDSyB0cmFuc21pc3Npb24gYnkgc2V0dGluZyB0aGUgTkFDSyBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMyB8PSBDUjNfTkFDS19TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdGhlIE5BQ0sgdHJhbnNtaXNzaW9uIGJ5IGNsZWFyaW5nIHRoZSBOQUNLIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQotICAgIFVTQVJUeC0+Q1IzICY9IENSM19OQUNLX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIEhhbGYgRHVwbGV4IGNvbW11bmljYXRpb24uDQotICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlQgQ29tbXVuaWNhdGlvbi4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9IYWxmRHVwbGV4Q21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICANCi0gIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KLSAgew0KLSAgICAvKiBFbmFibGUgdGhlIEhhbGYtRHVwbGV4IG1vZGUgYnkgc2V0dGluZyB0aGUgSERTRUwgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjMgfD0gQ1IzX0hEU0VMX1NldDsNCi0gIH0NCi0gIGVsc2UNCi0gIHsNCi0gICAgLyogRGlzYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBjbGVhcmluZyB0aGUgSERTRUwgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjMgJj0gQ1IzX0hEU0VMX1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVCdzIDh4IG92ZXJzYW1wbGluZyBtb2RlLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQotICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlQgb25lIGJpdCBzYW1wbGluZyBtZXRob2RlLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQotICAqIEBub3RlDQotICAqICAgICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgVVNBUlRfSW5pdCgpDQotICAqICAgICBmdW5jdGlvbiBpbiBvcmRlciB0byBoYXZlIGNvcnJlY3QgYmF1ZHJhdGUgRGl2aWRlciB2YWx1ZS4gICANCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgVVNBUlRfT3ZlclNhbXBsaW5nOENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KLSAgDQotICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCi0gIHsNCi0gICAgLyogRW5hYmxlIHRoZSA4eCBPdmVyc2FtcGxpbmcgbW9kZSBieSBzZXR0aW5nIHRoZSBPVkVSOCBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMSB8PSBDUjFfT1ZFUjhfU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSA4eCBPdmVyc2FtcGxpbmcgbW9kZSBieSBjbGVhcmluZyB0aGUgT1ZFUjggYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjEgJj0gQ1IxX09WRVI4X1Jlc2V0Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVCdzIG9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kZS4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIG9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9PbmVCaXRNZXRob2RDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQotew0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KLSAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCi0gIA0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgb25lIGJpdCBtZXRob2QgYnkgc2V0dGluZyB0aGUgT05FQklURSBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMyB8PSBDUjNfT05FQklURV9TZXQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIC8qIERpc2FibGUgdHRoZSBvbmUgYml0IG1ldGhvZCBieSBjbGVhcmluZyB0aGUgT05FQklURSBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KLSAgICBVU0FSVHgtPkNSMyAmPSBDUjNfT05FQklURV9SZXNldDsNCi0gIH0NCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVVNBUlSScyBJckRBIGludGVyZmFjZS4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHBhcmFtICBVU0FSVF9JckRBTW9kZTogc3BlY2lmaWVzIHRoZSBJckRBIG1vZGUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVVNBUlRfSXJEQU1vZGVfTG93UG93ZXINCi0gICogICAgIEBhcmcgVVNBUlRfSXJEQU1vZGVfTm9ybWFsDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFVTQVJUX0lyREFDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9JckRBTW9kZSkNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSVJEQV9NT0RFKFVTQVJUX0lyREFNb2RlKSk7DQotICAgIA0KLSAgVVNBUlR4LT5DUjMgJj0gQ1IzX0lSTFBfTWFzazsNCi0gIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0lyREFNb2RlOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIElyREEgaW50ZXJmYWNlLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIElyREEgbW9kZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9JckRBQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQotICAgIA0KLSAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQotICB7DQotICAgIC8qIEVuYWJsZSB0aGUgSXJEQSBtb2RlIGJ5IHNldHRpbmcgdGhlIElSRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjMgfD0gQ1IzX0lSRU5fU2V0Ow0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICAvKiBEaXNhYmxlIHRoZSBJckRBIG1vZGUgYnkgY2xlYXJpbmcgdGhlIElSRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCi0gICAgVVNBUlR4LT5DUjMgJj0gQ1IzX0lSRU5fUmVzZXQ7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIFVTQVJUX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0NUUzogIENUUyBDaGFuZ2UgZmxhZyAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KQ0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gZmxhZw0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1RYRTogIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZw0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1RDOiAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnDQotICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfUlhORTogUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnDQotICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfSURMRTogSWRsZSBMaW5lIGRldGVjdGlvbiBmbGFnDQotICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfT1JFOiAgT3ZlclJ1biBFcnJvciBmbGFnDQotICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfTkU6ICAgTm9pc2UgRXJyb3IgZmxhZw0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0ZFOiAgIEZyYW1pbmcgRXJyb3IgZmxhZw0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1BFOiAgIFBhcml0eSBFcnJvciBmbGFnDQotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBVU0FSVF9GTEFHIChTRVQgb3IgUkVTRVQpLg0KLSAgKi8NCi1GbGFnU3RhdHVzIFVTQVJUX0dldEZsYWdTdGF0dXMoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9GTEFHKQ0KLXsNCi0gIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfRkxBRyhVU0FSVF9GTEFHKSk7DQotICAvKiBUaGUgQ1RTIGZsYWcgaXMgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1ICovDQotICBpZiAoVVNBUlRfRkxBRyA9PSBVU0FSVF9GTEFHX0NUUykNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQotICB9ICANCi0gIA0KLSAgaWYgKChVU0FSVHgtPlNSICYgVVNBUlRfRkxBRykgIT0gKHVpbnQxNl90KVJFU0VUKQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgcmV0dXJuIGJpdHN0YXR1czsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBVU0FSVHgncyBwZW5kaW5nIGZsYWdzLg0KLSAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KLSAgKiBAcGFyYW0gIFVTQVJUX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0NUUzogIENUUyBDaGFuZ2UgZmxhZyAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KS4NCi0gICogICAgIEBhcmcgVVNBUlRfRkxBR19MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcuDQotICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfVEM6ICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcuDQotICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfUlhORTogUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnLg0KLSAgKiAgIA0KLSAgKiBAbm90ZQ0KLSAgKiAgIC0gUEUgKFBhcml0eSBlcnJvciksIEZFIChGcmFtaW5nIGVycm9yKSwgTkUgKE5vaXNlIGVycm9yKSwgT1JFIChPdmVyUnVuIA0KLSAgKiAgICAgZXJyb3IpIGFuZCBJRExFIChJZGxlIGxpbmUgZGV0ZWN0ZWQpIGZsYWdzIGFyZSBjbGVhcmVkIGJ5IHNvZnR3YXJlIA0KLSAgKiAgICAgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gVVNBUlRfU1IgcmVnaXN0ZXIgKFVTQVJUX0dldEZsYWdTdGF0dXMoKSkgDQotICAqICAgICBmb2xsb3dlZCBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIFVTQVJUX0RSIHJlZ2lzdGVyIChVU0FSVF9SZWNlaXZlRGF0YSgpKS4NCi0gICogICAtIFJYTkUgZmxhZyBjYW4gYmUgYWxzbyBjbGVhcmVkIGJ5IGEgcmVhZCB0byB0aGUgVVNBUlRfRFIgcmVnaXN0ZXIgDQotICAqICAgICAoVVNBUlRfUmVjZWl2ZURhdGEoKSkuDQotICAqICAgLSBUQyBmbGFnIGNhbiBiZSBhbHNvIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gDQotICAqICAgICBVU0FSVF9TUiByZWdpc3RlciAoVVNBUlRfR2V0RmxhZ1N0YXR1cygpKSBmb2xsb3dlZCBieSBhIHdyaXRlIG9wZXJhdGlvbg0KLSAgKiAgICAgdG8gVVNBUlRfRFIgcmVnaXN0ZXIgKFVTQVJUX1NlbmREYXRhKCkpLg0KLSAgKiAgIC0gVFhFIGZsYWcgaXMgY2xlYXJlZCBvbmx5IGJ5IGEgd3JpdGUgdG8gdGhlIFVTQVJUX0RSIHJlZ2lzdGVyIA0KLSAgKiAgICAgKFVTQVJUX1NlbmREYXRhKCkpLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9DbGVhckZsYWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9GTEFHKQ0KLXsNCi0gIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCi0gIGFzc2VydF9wYXJhbShJU19VU0FSVF9DTEVBUl9GTEFHKFVTQVJUX0ZMQUcpKTsNCi0gIC8qIFRoZSBDVFMgZmxhZyBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8NCi0gIGlmICgoVVNBUlRfRkxBRyAmIFVTQVJUX0ZMQUdfQ1RTKSA9PSBVU0FSVF9GTEFHX0NUUykNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQotICB9IA0KLSAgIA0KLSAgVVNBUlR4LT5TUiA9ICh1aW50MTZfdCl+VVNBUlRfRkxBRzsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHBhcmFtICBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KLSAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQotICAqICAgICBAYXJnIFVTQVJUX0lUX0NUUzogIENUUyBjaGFuZ2UgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUpDQotICAqICAgICBAYXJnIFVTQVJUX0lUX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQotICAqICAgICBAYXJnIFVTQVJUX0lUX1RYRTogIFRhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfVEM6ICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9SWE5FOiBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9JRExFOiBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9PUkU6ICBPdmVyUnVuIEVycm9yIGludGVycnVwdA0KLSAgKiAgICAgQGFyZyBVU0FSVF9JVF9ORTogICBOb2lzZSBFcnJvciBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfRkU6ICAgRnJhbWluZyBFcnJvciBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfUEU6ICAgUGFyaXR5IEVycm9yIGludGVycnVwdA0KLSAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgVVNBUlRfSVQgKFNFVCBvciBSRVNFVCkuDQotICAqLw0KLUlUU3RhdHVzIFVTQVJUX0dldElUU3RhdHVzKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSVQpDQotew0KLSAgdWludDMyX3QgYml0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMCwgdXNhcnRyZWcgPSAweDAwOw0KLSAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfR0VUX0lUKFVTQVJUX0lUKSk7DQotICAvKiBUaGUgQ1RTIGludGVycnVwdCBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8gDQotICBpZiAoVVNBUlRfSVQgPT0gVVNBUlRfSVRfQ1RTKQ0KLSAgew0KLSAgICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfMTIzX1BFUklQSChVU0FSVHgpKTsNCi0gIH0gICANCi0gIA0KLSAgLyogR2V0IHRoZSBVU0FSVCByZWdpc3RlciBpbmRleCAqLw0KLSAgdXNhcnRyZWcgPSAoKCh1aW50OF90KVVTQVJUX0lUKSA+PiAweDA1KTsNCi0gIC8qIEdldCB0aGUgaW50ZXJydXB0IHBvc2l0aW9uICovDQotICBpdG1hc2sgPSBVU0FSVF9JVCAmIElUX01hc2s7DQotICBpdG1hc2sgPSAodWludDMyX3QpMHgwMSA8PCBpdG1hc2s7DQotICANCi0gIGlmICh1c2FydHJlZyA9PSAweDAxKSAvKiBUaGUgSVQgIGlzIGluIENSMSByZWdpc3RlciAqLw0KLSAgew0KLSAgICBpdG1hc2sgJj0gVVNBUlR4LT5DUjE7DQotICB9DQotICBlbHNlIGlmICh1c2FydHJlZyA9PSAweDAyKSAvKiBUaGUgSVQgIGlzIGluIENSMiByZWdpc3RlciAqLw0KLSAgew0KLSAgICBpdG1hc2sgJj0gVVNBUlR4LT5DUjI7DQotICB9DQotICBlbHNlIC8qIFRoZSBJVCAgaXMgaW4gQ1IzIHJlZ2lzdGVyICovDQotICB7DQotICAgIGl0bWFzayAmPSBVU0FSVHgtPkNSMzsNCi0gIH0NCi0gIA0KLSAgYml0cG9zID0gVVNBUlRfSVQgPj4gMHgwODsNCi0gIGJpdHBvcyA9ICh1aW50MzJfdCkweDAxIDw8IGJpdHBvczsNCi0gIGJpdHBvcyAmPSBVU0FSVHgtPlNSOw0KLSAgaWYgKChpdG1hc2sgIT0gKHVpbnQxNl90KVJFU0VUKSYmKGJpdHBvcyAhPSAodWludDE2X3QpUkVTRVQpKQ0KLSAgew0KLSAgICBiaXRzdGF0dXMgPSBTRVQ7DQotICB9DQotICBlbHNlDQotICB7DQotICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KLSAgfQ0KLSAgDQotICByZXR1cm4gYml0c3RhdHVzOyAgDQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIENsZWFycyB0aGUgVVNBUlR4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCi0gICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCi0gICogQHBhcmFtICBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfQ1RTOiAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQgKG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSkNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfTEJEOiAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQNCi0gICogICAgIEBhcmcgVVNBUlRfSVRfVEM6ICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdC4gDQotICAqICAgICBAYXJnIFVTQVJUX0lUX1JYTkU6IFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0Lg0KLSAgKiAgIA0KLSAgKiBAbm90ZQ0KLSAgKiAgIC0gUEUgKFBhcml0eSBlcnJvciksIEZFIChGcmFtaW5nIGVycm9yKSwgTkUgKE5vaXNlIGVycm9yKSwgT1JFIChPdmVyUnVuIA0KLSAgKiAgICAgZXJyb3IpIGFuZCBJRExFIChJZGxlIGxpbmUgZGV0ZWN0ZWQpIHBlbmRpbmcgYml0cyBhcmUgY2xlYXJlZCBieSANCi0gICogICAgIHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIFVTQVJUX1NSIHJlZ2lzdGVyIA0KLSAgKiAgICAgKFVTQVJUX0dldElUU3RhdHVzKCkpIGZvbGxvd2VkIGJ5IGEgcmVhZCBvcGVyYXRpb24gdG8gVVNBUlRfRFIgcmVnaXN0ZXIgDQotICAqICAgICAoVVNBUlRfUmVjZWl2ZURhdGEoKSkuDQotICAqICAgLSBSWE5FIHBlbmRpbmcgYml0IGNhbiBiZSBhbHNvIGNsZWFyZWQgYnkgYSByZWFkIHRvIHRoZSBVU0FSVF9EUiByZWdpc3RlciANCi0gICogICAgIChVU0FSVF9SZWNlaXZlRGF0YSgpKS4NCi0gICogICAtIFRDIHBlbmRpbmcgYml0IGNhbiBiZSBhbHNvIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCANCi0gICogICAgIG9wZXJhdGlvbiB0byBVU0FSVF9TUiByZWdpc3RlciAoVVNBUlRfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSANCi0gICogICAgIG9wZXJhdGlvbiB0byBVU0FSVF9EUiByZWdpc3RlciAoVVNBUlRfU2VuZERhdGEoKSkuDQotICAqICAgLSBUWEUgcGVuZGluZyBiaXQgaXMgY2xlYXJlZCBvbmx5IGJ5IGEgd3JpdGUgdG8gdGhlIFVTQVJUX0RSIHJlZ2lzdGVyIA0KLSAgKiAgICAgKFVTQVJUX1NlbmREYXRhKCkpLg0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBVU0FSVF9DbGVhcklUUGVuZGluZ0JpdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0lUKQ0KLXsNCi0gIHVpbnQxNl90IGJpdHBvcyA9IDB4MDAsIGl0bWFzayA9IDB4MDA7DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQotICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ0xFQVJfSVQoVVNBUlRfSVQpKTsNCi0gIC8qIFRoZSBDVFMgaW50ZXJydXB0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSAqLw0KLSAgaWYgKFVTQVJUX0lUID09IFVTQVJUX0lUX0NUUykNCi0gIHsNCi0gICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQotICB9ICAgDQotICANCi0gIGJpdHBvcyA9IFVTQVJUX0lUID4+IDB4MDg7DQotICBpdG1hc2sgPSAoKHVpbnQxNl90KTB4MDEgPDwgKHVpbnQxNl90KWJpdHBvcyk7DQotICBVU0FSVHgtPlNSID0gKHVpbnQxNl90KX5pdG1hc2s7DQotfQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQpkaWZmIC0tZ2l0IGEvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfd3dkZy5jIGIvRGVtby9DT1JURVhfU1RNMzJGMTAwX0F0b2xsaWMvTGlicmFyaWVzL1NUTTMyRjEweF9TdGRQZXJpcGhfRHJpdmVyL3NyYy9zdG0zMmYxMHhfd3dkZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTNhNzEwLi4wMDAwMDAwCi0tLSBhL0RlbW8vQ09SVEVYX1NUTTMyRjEwMF9BdG9sbGljL0xpYnJhcmllcy9TVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlci9zcmMvc3RtMzJmMTB4X3d3ZGcuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKiBAZmlsZSAgICBzdG0zMmYxMHhfd3dkZy5jDQotICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQotICAqIEB2ZXJzaW9uIFYzLjQuMA0KLSAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQotICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFdXREcgZmlybXdhcmUgZnVuY3Rpb25zLg0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqIEBjb3B5DQotICAqDQotICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KLSAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KLSAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQotICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCi0gICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KLSAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQotICAqDQotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KLSAgKi8gDQotDQotLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0jaW5jbHVkZSAic3RtMzJmMTB4X3d3ZGcuaCINCi0jaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KLQ0KLS8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFdXREcgDQotICAqIEBicmllZiBXV0RHIGRyaXZlciBtb2R1bGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgV1dER19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgV1dER19Qcml2YXRlX0RlZmluZXMNCi0gICogQHsNCi0gICovDQotDQotLyogLS0tLS0tLS0tLS0gV1dERyByZWdpc3RlcnMgYml0IGFkZHJlc3MgaW4gdGhlIGFsaWFzIHJlZ2lvbiAtLS0tLS0tLS0tLSAqLw0KLSNkZWZpbmUgV1dER19PRkZTRVQgICAgICAgKFdXREdfQkFTRSAtIFBFUklQSF9CQVNFKQ0KLQ0KLS8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBFV0kgYml0ICovDQotI2RlZmluZSBDRlJfT0ZGU0VUICAgICAgICAoV1dER19PRkZTRVQgKyAweDA0KQ0KLSNkZWZpbmUgRVdJX0JpdE51bWJlciAgICAgMHgwOQ0KLSNkZWZpbmUgQ0ZSX0VXSV9CQiAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENGUl9PRkZTRVQgKiAzMikgKyAoRVdJX0JpdE51bWJlciAqIDQpKQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXV0RHIHJlZ2lzdGVycyBiaXQgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0vKiBDUiByZWdpc3RlciBiaXQgbWFzayAqLw0KLSNkZWZpbmUgQ1JfV0RHQV9TZXQgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwKQ0KLQ0KLS8qIENGUiByZWdpc3RlciBiaXQgbWFzayAqLw0KLSNkZWZpbmUgQ0ZSX1dER1RCX01hc2sgICAgKCh1aW50MzJfdCkweEZGRkZGRTdGKQ0KLSNkZWZpbmUgQ0ZSX1dfTWFzayAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRjgwKQ0KLSNkZWZpbmUgQklUX01hc2sgICAgICAgICAgKCh1aW50OF90KTB4N0YpDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgV1dER19Qcml2YXRlX01hY3Jvcw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqIEBkZWZncm91cCBXV0RHX1ByaXZhdGVfVmFyaWFibGVzDQotICAqIEB7DQotICAqLw0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKiogQGRlZmdyb3VwIFdXREdfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCi0gICogQHsNCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKiBAZGVmZ3JvdXAgV1dER19Qcml2YXRlX0Z1bmN0aW9ucw0KLSAgKiBAew0KLSAgKi8NCi0NCi0vKioNCi0gICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBXV0RHIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgV1dER19EZUluaXQodm9pZCkNCi17DQotICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1dXREcsIEVOQUJMRSk7DQotICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1dXREcsIERJU0FCTEUpOw0KLX0NCi0NCi0vKioNCi0gICogQGJyaWVmICBTZXRzIHRoZSBXV0RHIFByZXNjYWxlci4NCi0gICogQHBhcmFtICBXV0RHX1ByZXNjYWxlcjogc3BlY2lmaWVzIHRoZSBXV0RHIFByZXNjYWxlci4NCi0gICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgKiAgICAgQGFyZyBXV0RHX1ByZXNjYWxlcl8xOiBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMQ0KLSAgKiAgICAgQGFyZyBXV0RHX1ByZXNjYWxlcl8yOiBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMg0KLSAgKiAgICAgQGFyZyBXV0RHX1ByZXNjYWxlcl80OiBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvNA0KLSAgKiAgICAgQGFyZyBXV0RHX1ByZXNjYWxlcl84OiBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvOA0KLSAgKiBAcmV0dmFsIE5vbmUNCi0gICovDQotdm9pZCBXV0RHX1NldFByZXNjYWxlcih1aW50MzJfdCBXV0RHX1ByZXNjYWxlcikNCi17DQotICB1aW50MzJfdCB0bXByZWcgPSAwOw0KLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCi0gIGFzc2VydF9wYXJhbShJU19XV0RHX1BSRVNDQUxFUihXV0RHX1ByZXNjYWxlcikpOw0KLSAgLyogQ2xlYXIgV0RHVEJbMTowXSBiaXRzICovDQotICB0bXByZWcgPSBXV0RHLT5DRlIgJiBDRlJfV0RHVEJfTWFzazsNCi0gIC8qIFNldCBXREdUQlsxOjBdIGJpdHMgYWNjb3JkaW5nIHRvIFdXREdfUHJlc2NhbGVyIHZhbHVlICovDQotICB0bXByZWcgfD0gV1dER19QcmVzY2FsZXI7DQotICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQotICBXV0RHLT5DRlIgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIFNldHMgdGhlIFdXREcgd2luZG93IHZhbHVlLg0KLSAgKiBAcGFyYW0gIFdpbmRvd1ZhbHVlOiBzcGVjaWZpZXMgdGhlIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bmNvdW50ZXIuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgdmFsdWUgbXVzdCBiZSBsb3dlciB0aGFuIDB4ODAuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFdXREdfU2V0V2luZG93VmFsdWUodWludDhfdCBXaW5kb3dWYWx1ZSkNCi17DQotICBfX0lPIHVpbnQzMl90IHRtcHJlZyA9IDA7DQotDQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1dXREdfV0lORE9XX1ZBTFVFKFdpbmRvd1ZhbHVlKSk7DQotICAvKiBDbGVhciBXWzY6MF0gYml0cyAqLw0KLQ0KLSAgdG1wcmVnID0gV1dERy0+Q0ZSICYgQ0ZSX1dfTWFzazsNCi0NCi0gIC8qIFNldCBXWzY6MF0gYml0cyBhY2NvcmRpbmcgdG8gV2luZG93VmFsdWUgdmFsdWUgKi8NCi0gIHRtcHJlZyB8PSBXaW5kb3dWYWx1ZSAmICh1aW50MzJfdCkgQklUX01hc2s7DQotDQotICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQotICBXV0RHLT5DRlIgPSB0bXByZWc7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIFdXREcgRWFybHkgV2FrZXVwIGludGVycnVwdChFV0kpLg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgV1dER19FbmFibGVJVCh2b2lkKQ0KLXsNCi0gICooX19JTyB1aW50MzJfdCAqKSBDRlJfRVdJX0JCID0gKHVpbnQzMl90KUVOQUJMRTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgU2V0cyB0aGUgV1dERyBjb3VudGVyIHZhbHVlLg0KLSAgKiBAcGFyYW0gIENvdW50ZXI6IHNwZWNpZmllcyB0aGUgd2F0Y2hkb2cgY291bnRlciB2YWx1ZS4NCi0gICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHg0MCBhbmQgMHg3Ri4NCi0gICogQHJldHZhbCBOb25lDQotICAqLw0KLXZvaWQgV1dER19TZXRDb3VudGVyKHVpbnQ4X3QgQ291bnRlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihDb3VudGVyKSk7DQotICAvKiBXcml0ZSB0byBUWzY6MF0gYml0cyB0byBjb25maWd1cmUgdGhlIGNvdW50ZXIgdmFsdWUsIG5vIG5lZWQgdG8gZG8NCi0gICAgIGEgcmVhZC1tb2RpZnktd3JpdGU7IHdyaXRpbmcgYSAwIHRvIFdER0EgYml0IGRvZXMgbm90aGluZyAqLw0KLSAgV1dERy0+Q1IgPSBDb3VudGVyICYgQklUX01hc2s7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAYnJpZWYgIEVuYWJsZXMgV1dERyBhbmQgbG9hZCB0aGUgY291bnRlciB2YWx1ZS4gICAgICAgICAgICAgICAgICANCi0gICogQHBhcmFtICBDb3VudGVyOiBzcGVjaWZpZXMgdGhlIHdhdGNoZG9nIGNvdW50ZXIgdmFsdWUuDQotICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4NDAgYW5kIDB4N0YuDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFdXREdfRW5hYmxlKHVpbnQ4X3QgQ291bnRlcikNCi17DQotICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KLSAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihDb3VudGVyKSk7DQotICBXV0RHLT5DUiA9IENSX1dER0FfU2V0IHwgQ291bnRlcjsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIEVhcmx5IFdha2V1cCBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90Lg0KLSAgKiBAcGFyYW0gIE5vbmUNCi0gICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBFYXJseSBXYWtldXAgaW50ZXJydXB0IGZsYWcgKFNFVCBvciBSRVNFVCkNCi0gICovDQotRmxhZ1N0YXR1cyBXV0RHX0dldEZsYWdTdGF0dXModm9pZCkNCi17DQotICByZXR1cm4gKEZsYWdTdGF0dXMpKFdXREctPlNSKTsNCi19DQotDQotLyoqDQotICAqIEBicmllZiAgQ2xlYXJzIEVhcmx5IFdha2V1cCBpbnRlcnJ1cHQgZmxhZy4NCi0gICogQHBhcmFtICBOb25lDQotICAqIEByZXR2YWwgTm9uZQ0KLSAgKi8NCi12b2lkIFdXREdfQ2xlYXJGbGFnKHZvaWQpDQotew0KLSAgV1dERy0+U1IgPSAodWludDMyX3QpUkVTRVQ7DQotfQ0KLQ0KLS8qKg0KLSAgKiBAfQ0KLSAgKi8NCi0NCi0vKioNCi0gICogQH0NCi0gICovDQotDQotLyoqDQotICAqIEB9DQotICAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=