LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X2kyYy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgSTJDIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X2kyYy5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBJMkMgU1BFIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX1BFX1NldCAgICAgICAgICAgICAgKCh1MTYpMHgwMDAxKQ0KI2RlZmluZSBDUjFfUEVfUmVzZXQgICAgICAgICAgICAoKHUxNikweEZGRkUpDQoNCi8qIEkyQyBETUFFTiBtYXNrICovDQojZGVmaW5lIENSMl9ETUFFTl9TZXQgICAgICAgICAgICgodTE2KTB4MDgwMCkNCiNkZWZpbmUgQ1IyX0RNQUVOX1Jlc2V0ICAgICAgICAgKCh1MTYpMHhGN0ZGKQ0KDQovKiBJMkMgTEFTVCBtYXNrICovDQojZGVmaW5lIENSMl9MQVNUX1NldCAgICAgICAgICAgICgodTE2KTB4MTAwMCkNCiNkZWZpbmUgQ1IyX0xBU1RfUmVzZXQgICAgICAgICAgKCh1MTYpMHhFRkZGKQ0KDQovKiBJMkMgU1RBUlQgbWFzayAqLw0KI2RlZmluZSBDUjFfU1RBUlRfU2V0ICAgICAgICAgICAoKHUxNikweDAxMDApDQojZGVmaW5lIENSMV9TVEFSVF9SZXNldCAgICAgICAgICgodTE2KTB4RkVGRikNCg0KLyogSTJDIFNUT1AgbWFzayAqLw0KI2RlZmluZSBDUjFfU1RPUF9TZXQgICAgICAgICAgICAoKHUxNikweDAyMDApDQojZGVmaW5lIENSMV9TVE9QX1Jlc2V0ICAgICAgICAgICgodTE2KTB4RkRGRikNCg0KLyogSTJDIEFDSyBtYXNrICovDQojZGVmaW5lIENSMV9BQ0tfU2V0ICAgICAgICAgICAgICgodTE2KTB4MDQwMCkNCiNkZWZpbmUgQ1IxX0FDS19SZXNldCAgICAgICAgICAgKCh1MTYpMHhGQkZGKQ0KDQovKiBJMkMgRU5HQyBtYXNrICovDQojZGVmaW5lIENSMV9FTkdDX1NldCAgICAgICAgICAgICgodTE2KTB4MDA0MCkNCiNkZWZpbmUgQ1IxX0VOR0NfUmVzZXQgICAgICAgICAgKCh1MTYpMHhGRkJGKQ0KDQovKiBJMkMgQUREMCBtYXNrICovDQojZGVmaW5lIE9BUjFfQUREMF9TZXQgICAgICAgICAgICgodTE2KTB4MDAwMSkNCiNkZWZpbmUgT0FSMV9BREQwX1Jlc2V0ICAgICAgICAgKCh1MTYpMHhGRkZFKQ0KDQovKiBJMkMgU1dSU1QgbWFzayAqLw0KI2RlZmluZSBDUjFfU1dSU1RfU2V0ICAgICAgICAgICAoKHUxNikweDgwMDApDQojZGVmaW5lIENSMV9TV1JTVF9SZXNldCAgICAgICAgICgodTE2KTB4N0ZGRikNCg0KLyogSTJDIFBFQyBtYXNrICovDQojZGVmaW5lIENSMV9QRUNfU2V0ICAgICAgICAgICAgICgodTE2KTB4MTAwMCkNCg0KLyogSTJDIEVOUEVDIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0VOUEVDX1NldCAgICAgICAgICAgKCh1MTYpMHgwMDIwKQ0KI2RlZmluZSBDUjFfRU5QRUNfUmVzZXQgICAgICAgICAoKHUxNikweEZGREYpDQoNCi8qIEkyQyBFTkFSUCBtYXNrICovDQojZGVmaW5lIENSMV9FTkFSUF9TZXQgICAgICAgICAgICgodTE2KTB4MDAxMCkNCiNkZWZpbmUgQ1IxX0VOQVJQX1Jlc2V0ICAgICAgICAgKCh1MTYpMHhGRkVGKQ0KDQovKiBJMkMgTk9TVFJFVENIIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX05PU1RSRVRDSF9TZXQgICAgICAgKCh1MTYpMHgwMDgwKQ0KI2RlZmluZSBDUjFfTk9TVFJFVENIX1Jlc2V0ICAgICAoKHUxNikweEZGN0YpDQoNCi8qIEkyQyBFTkRVQUwgbWFzayAqLw0KI2RlZmluZSBPQVIyX0VORFVBTF9TZXQgICAgICAgICAoKHUxNikweDAwMDEpDQojZGVmaW5lIE9BUjJfRU5EVUFMX1Jlc2V0ICAgICAgICgodTE2KTB4RkZGRSkNCg0KLyogSTJDIEYvUyBtYXNrICovDQojZGVmaW5lIENDUl9GU19TZXQgICAgICAgICAgICAgICgodTE2KTB4ODAwMCkNCg0KLyogSTJDIEFERDIgbWFzayAqLw0KI2RlZmluZSBPQVIyX0FERDJfUmVzZXQgICAgICAgICAoKHUxNikweEZGMDEpDQoNCi8qIEkyQyBGUkVRIG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0ZSRVFfUmVzZXQgICAgICAgICAgKCh1MTYpMHhGRkMwKQ0KDQovKiBJMkMgQ0NSIG1hc2sgKi8NCiNkZWZpbmUgQ0NSX0NDUl9TZXQgICAgICAgICAgICAgKCh1MTYpMHgwRkZGKQ0KDQovKiBJMkMgRkxBRyBtYXNrICovDQojZGVmaW5lIEkyQ19GTEFHX01hc2sgICAgICAgICAgICgodTMyKTB4MDBGRkZGRkYpDQoNCi8qIEkyQyByZWdpc3RlcnMgTWFza3MgKi8NCiNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgICAgKCh1MTYpMHhGQkY1KQ0KDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBJMkN4IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0RlSW5pdChJMkNfVHlwZURlZiogSTJDeCkNCnsNCiAgc3dpdGNoICgqKHUzMiopJkkyQ3gpDQogIHsNCiAgICBjYXNlIEkyQzFfQkFTRToNCiAgICAgIC8qIEVuYWJsZSBJMkMxIHJlc2V0IHN0YXRlICovDQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0kyQzEsIEVOQUJMRSk7DQogICAgICAvKiBSZWxlYXNlIEkyQzEgZnJvbSByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9JMkMxLCBESVNBQkxFKTsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBJMkMyX0JBU0U6DQogICAgICAvKiBFbmFibGUgSTJDMiByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9JMkMyLCBFTkFCTEUpOw0KICAgICAgLyogUmVsZWFzZSBJMkMyIGZyb20gcmVzZXQgc3RhdGUgKi8NCiAgICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfSTJDMiwgRElTQUJMRSk7DQogICAgICBicmVhazsNCg0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19Jbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIEkyQ3ggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycw0KKiAgICAgICAgICAgICAgICAgIGluIHRoZSBJMkNfSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBJMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgICBJMkMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfSW5pdChJMkNfVHlwZURlZiogSTJDeCwgSTJDX0luaXRUeXBlRGVmKiBJMkNfSW5pdFN0cnVjdCkNCnsNCiAgdTE2IHRtcHJlZyA9IDAsIGZyZXFyYW5nZSA9IDA7DQogIHUxNiByZXN1bHQgPSAweDA0Ow0KICB1MzIgcGNsazFjbG9jayA9IDEyMDAwMDAwOw0KICBSQ0NfQ2xvY2tzVHlwZURlZiAgUkNDX0Nsb2NrczsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfSTJDX01PREUoSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlKSk7DQogIGFzc2VydChJU19JMkNfRFVUWV9DWUNMRShJMkNfSW5pdFN0cnVjdC0+STJDX0R1dHlDeWNsZSkpOw0KICBhc3NlcnQoSVNfSTJDX09XTl9BRERSRVNTMShJMkNfSW5pdFN0cnVjdC0+STJDX093bkFkZHJlc3MxKSk7DQogIGFzc2VydChJU19JMkNfQUNLX1NUQVRFKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrKSk7DQogIGFzc2VydChJU19JMkNfQUNLTk9XTEVER0VfQUREUkVTUyhJMkNfSW5pdFN0cnVjdC0+STJDX0Fja25vd2xlZGdlZEFkZHJlc3MpKTsNCiAgYXNzZXJ0KElTX0kyQ19DTE9DS19TUEVFRChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQpKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogR2V0IHRoZSBJMkN4IENSMiB2YWx1ZSAqLw0KICB0bXByZWcgPSBJMkN4LT5DUjI7DQogIC8qIENsZWFyIGZyZXF1ZW5jeSBGUkVRWzU6MF0gYml0cyAqLw0KICB0bXByZWcgJj0gQ1IyX0ZSRVFfUmVzZXQ7DQogIC8qIEdldCBQQ0xLMUNsb2NrIGZyZXF1ZW5jeSB2YWx1ZSAqLw0KICBSQ0NfR2V0Q2xvY2tzRnJlcSgmUkNDX0Nsb2Nrcyk7DQogIHBjbGsxY2xvY2sgPSBSQ0NfQ2xvY2tzLlBDTEsxX0ZyZXF1ZW5jeTsNCiAgLyogU2V0IGZyZXF1ZW5jeSBiaXRzIGRlcGVuZGluZyBvbiBQQ0xLMUNsb2NrIHZhbHVlICovDQogIGZyZXFyYW5nZSA9ICh1MTYpKHBjbGsxY2xvY2sgLyAxMDAwMDAwKTsNCiAgdG1wcmVnIHw9IGZyZXFyYW5nZTsNCiAgLyogV3JpdGUgdG8gSTJDeCBDUjIgKi8NCiAgSTJDeC0+Q1IyID0gdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBEaXNhYmxlIEkyQ3ggdG8gY29uZmlndXJlIFRSSVNFICovDQogIEkyQ19DbWQoSTJDeCwgRElTQUJMRSk7DQoNCiAgLyogUmVzZXQgdG1wcmVnIHZhbHVlICovDQogIC8qIENsZWFyIEYvUywgRFVUWSBhbmQgQ0NSWzExOjBdIGJpdHMgKi8NCiAgdG1wcmVnID0gMDsNCg0KICAvKiBDb25maWd1cmUgc3BlZWQgaW4gc3RhbmRhcmQgbW9kZSAqLw0KICBpZiAoSTJDX0luaXRTdHJ1Y3QtPkkyQ19DbG9ja1NwZWVkIDw9IDEwMDAwMCkNCiAgew0KICAgIC8qIFN0YW5kYXJkIG1vZGUgc3BlZWQgY2FsY3VsYXRlICovDQogICAgcmVzdWx0ID0gKHUxNikocGNsazFjbG9jayAvIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgPDwgMSkpOw0KICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4NCovDQogICAgaWYgKHJlc3VsdCA8IDB4MDQpDQogICAgew0KICAgICAgLyogU2V0IG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAqLw0KICAgICAgcmVzdWx0ID0gMHgwNDsgIA0KICAgIH0NCiAgICAvKiBTZXQgc3BlZWQgdmFsdWUgZm9yIHN0YW5kYXJkIG1vZGUgKi8NCiAgICB0bXByZWcgfD0gcmVzdWx0OwkgIA0KICAgIC8qIFNldCBNYXhpbXVtIFJpc2UgVGltZTogKCgxMDAwLygxMDAwMDAwMDAwL3BjbGsxY2xvY2spKSsxICovDQogICAgSTJDeC0+VFJJU0UgPSBmcmVxcmFuZ2UgKyAxOyANCiAgfQ0KICAvKiBDb25maWd1cmUgc3BlZWQgaW4gZmFzdCBtb2RlICovDQogIGVsc2UgLyooSTJDX0luaXRTdHJ1Y3QtPkkyQ19DbG9ja1NwZWVkIDw9IDQwMDAwMCkqLw0KICB7DQogICAgaWYgKEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID09IEkyQ19EdXR5Q3ljbGVfMikNCiAgICB7DQogICAgICAvKiBGYXN0IG1vZGUgc3BlZWQgY2FsY3VsYXRlOiBUbG93L1RoaWdoID0gMiAqLw0KICAgICAgcmVzdWx0ID0gKHUxNikocGNsazFjbG9jayAvIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgKiAzKSk7DQogICAgfQ0KICAgIGVsc2UgLypJMkNfSW5pdFN0cnVjdC0+STJDX0R1dHlDeWNsZSA9PSBJMkNfRHV0eUN5Y2xlXzE2XzkqLw0KICAgIHsNCiAgICAgIC8qIEZhc3QgbW9kZSBzcGVlZCBjYWxjdWxhdGU6IFRsb3cvVGhpZ2ggPSAxNi85ICovDQogICAgICByZXN1bHQgPSAodTE2KShwY2xrMWNsb2NrIC8gKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCAqIDI1KSk7DQogICAgICAvKiBTZXQgRFVUWSBiaXQgKi8NCiAgICAgIHJlc3VsdCB8PSBJMkNfRHV0eUN5Y2xlXzE2Xzk7DQogICAgfQ0KICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4MSovDQogICAgaWYgKChyZXN1bHQgJiBDQ1JfQ0NSX1NldCkgPT0gMCkNCiAgICB7DQogICAgICAvKiBTZXQgbWluaW11bSBhbGxvd2VkIHZhbHVlICovDQogICAgICByZXN1bHQgfD0gKHUxNikweDAwMDE7ICANCiAgICB9DQogICAgLyogU2V0IHNwZWVkIHZhbHVlIGFuZCBzZXQgRi9TIGJpdCBmb3IgZmFzdCBtb2RlICovDQogICAgdG1wcmVnIHw9IHJlc3VsdCB8IENDUl9GU19TZXQ7DQogICAgLyogU2V0IE1heGltdW0gUmlzZSBUaW1lOiAoKDMwMC8oMTAwMDAwMDAwMC9wY2xrMWNsb2NrKSkrMSAqLw0KICAgIEkyQ3gtPlRSSVNFID0gKHUxNikoKChmcmVxcmFuZ2UgKiAzMDApIC8gMTAwMCkgKyAxKTsgIA0KICB9DQogIC8qIFdyaXRlIHRvIEkyQ3ggQ0NSICovDQogIEkyQ3gtPkNDUiA9IHRtcHJlZzsNCg0KICAvKiBFbmFibGUgSTJDeCAqLw0KICBJMkNfQ21kKEkyQ3gsIEVOQUJMRSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgSTJDeCBDUjEgdmFsdWUgKi8NCiAgdG1wcmVnID0gSTJDeC0+Q1IxOw0KICAvKiBDbGVhciBBQ0ssIFNNQlRZUEUgYW5kICBTTUJVUyBiaXRzICovDQogIHRtcHJlZyAmPSBDUjFfQ0xFQVJfTWFzazsNCiAgLyogQ29uZmlndXJlIEkyQ3g6IG1vZGUgYW5kIGFja25vd2xlZGdlbWVudCAqLw0KICAvKiBTZXQgU01CVFlQRSBhbmQgU01CVVMgYml0cyBhY2NvcmRpbmcgdG8gSTJDX01vZGUgdmFsdWUgKi8NCiAgLyogU2V0IEFDSyBiaXQgYWNjb3JkaW5nIHRvIEkyQ19BY2sgdmFsdWUgKi8NCiAgdG1wcmVnIHw9ICh1MTYpKCh1MzIpSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlIHwgSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2spOw0KICAvKiBXcml0ZSB0byBJMkN4IENSMSAqLw0KICBJMkN4LT5DUjEgPSB0bXByZWc7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFNldCBJMkN4IE93biBBZGRyZXNzMSBhbmQgYWNrbm93bGVkZ2VkIGFkZHJlc3MgKi8NCiAgSTJDeC0+T0FSMSA9IChJMkNfSW5pdFN0cnVjdC0+STJDX0Fja25vd2xlZGdlZEFkZHJlc3MgfCBJMkNfSW5pdFN0cnVjdC0+STJDX093bkFkZHJlc3MxKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggSTJDX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19TdHJ1Y3RJbml0KEkyQ19Jbml0VHlwZURlZiogSTJDX0luaXRTdHJ1Y3QpDQp7DQovKi0tLS0tLS0tLS0tLS0tLS0gUmVzZXQgSTJDIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBJbml0aWFsaXplIHRoZSBJMkNfTW9kZSBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlID0gSTJDX01vZGVfSTJDOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIEkyQ19EdXR5Q3ljbGUgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID0gSTJDX0R1dHlDeWNsZV8yOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIEkyQ19Pd25BZGRyZXNzMSBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Pd25BZGRyZXNzMSA9IDA7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0FjayBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2sgPSBJMkNfQWNrX0Rpc2FibGU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0Fja25vd2xlZGdlZEFkZHJlc3MgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcyA9IEkyQ19BY2tub3dsZWRnZWRBZGRyZXNzXzdiaXQ7DQoNCiAgLyogaW5pdGlhbGl6ZSB0aGUgSTJDX0Nsb2NrU3BlZWQgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCA9IDUwMDA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDeCBwZXJpcGhlcmFsLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0NtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfUEVfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9QRV9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19ETUFDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIERNQSByZXF1ZXN0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIERNQSB0cmFuc2Zlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19ETUFDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIERNQSByZXF1ZXN0cyAqLw0KICAgIEkyQ3gtPkNSMiB8PSBDUjJfRE1BRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBETUEgcmVxdWVzdHMgKi8NCiAgICBJMkN4LT5DUjIgJj0gQ1IyX0RNQUVOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0RNQUxhc3RUcmFuc2ZlckNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IFNwZWNpZmllcyB0aGF0IHRoZSBuZXh0IERNQSB0cmFuc2ZlciBpcyB0aGUgbGFzdCBvbmUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBETUEgbGFzdCB0cmFuc2Zlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19ETUFMYXN0VHJhbnNmZXJDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIE5leHQgRE1BIGVuZCBvZiB0cmFuc2ZlciBpcyB0aGUgbGFzdCB0cmFuc2ZlciAqLw0KICAgIEkyQ3gtPkNSMiB8PSBDUjJfTEFTVF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogTmV4dCBETUEgZW5kIG9mIHRyYW5zZmVyIGlzIG5vdCB0aGUgbGFzdCB0cmFuc2ZlciAqLw0KICAgIEkyQ3gtPkNSMiAmPSBDUjJfTEFTVF9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZW5lcmF0ZVNUQVJUDQoqIERlc2NyaXB0aW9uICAgIDogR2VuZXJhdGVzIEkyQ3ggY29tbXVuaWNhdGlvbiBTVEFSVCBjb25kaXRpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfR2VuZXJhdGVTVEFSVChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogR2VuZXJhdGUgYSBTVEFSVCBjb25kaXRpb24gKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX1NUQVJUX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbiAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfU1RBUlRfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2VuZXJhdGVTVE9QDQoqIERlc2NyaXB0aW9uICAgIDogR2VuZXJhdGVzIEkyQ3ggY29tbXVuaWNhdGlvbiBTVE9QIGNvbmRpdGlvbi4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0dlbmVyYXRlU1RPUChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogR2VuZXJhdGUgYSBTVE9QIGNvbmRpdGlvbiAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfU1RPUF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgU1RPUCBjb25kaXRpb24gZ2VuZXJhdGlvbiAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfU1RPUF9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19BY2tub3dsZWRnZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgYWNrbm93bGVkZ2UgZmVhdHVyZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIEFja25vd2xlZGdlbWVudC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfQWNrbm93bGVkZ2VDb25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgYWNrbm93bGVkZ2VtZW50ICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9BQ0tfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIGFja25vd2xlZGdlbWVudCAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfQUNLX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX093bkFkZHJlc3MyQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIEkyQyBvd24gYWRkcmVzczIuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEFkZHJlc3M6IHNwZWNpZmllcyB0aGUgN2JpdCBJMkMgb3duIGFkZHJlc3MyLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX093bkFkZHJlc3MyQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1OCBBZGRyZXNzKQ0Kew0KICB1MTYgdG1wcmVnID0gMDsNCg0KICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXByZWcgPSBJMkN4LT5PQVIyOw0KICAvKiBSZXNldCBJMkN4IE93biBhZGRyZXNzMiBiaXQgWzc6MV0gKi8NCiAgdG1wcmVnICY9IE9BUjJfQUREMl9SZXNldDsNCiAgLyogU2V0IEkyQ3ggT3duIGFkZHJlc3MyICovDQogIHRtcHJlZyB8PSAodTE2KShBZGRyZXNzICYgKHUxNikweDAwRkUpOw0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEkyQ3gtPk9BUjIgPSB0bXByZWc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0R1YWxBZGRyZXNzQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBkdWFsIGFkZHJlc3NpbmcgbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIGR1YWwgYWRkcmVzc2luZyBtb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0R1YWxBZGRyZXNzQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgZHVhbCBhZGRyZXNzaW5nIG1vZGUgKi8NCiAgICBJMkN4LT5PQVIyIHw9IE9BUjJfRU5EVUFMX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGR1YWwgYWRkcmVzc2luZyBtb2RlICovDQogICAgSTJDeC0+T0FSMiAmPSBPQVIyX0VORFVBTF9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZW5lcmFsQ2FsbENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgZ2VuZXJhbCBjYWxsIGZlYXR1cmUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBHZW5lcmFsIGNhbGwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfR2VuZXJhbENhbGxDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSBnZW5lcmFsbCBjYWxsICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9FTkdDX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGdlbmVyYWxsIGNhbGwgKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX0VOR0NfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEkyQ19JVDogc3BlY2lmaWVzIHRoZSBJMkMgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGJlIGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgIG9yIGRpc2FibGVkLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9CVUY6IEJ1ZmZlciBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfRVZUOiBFdmVudCBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0lUQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1MTYgSTJDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGFzc2VydChJU19JMkNfQ09ORklHX0lUKEkyQ19JVCkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBpbnRlcnJ1cHRzICovDQogICAgSTJDeC0+Q1IyIHw9IEkyQ19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgaW50ZXJydXB0cyAqLw0KICAgIEkyQ3gtPkNSMiAmPSAodTE2KX5JMkNfSVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU2VuZERhdGENCiogRGVzY3JpcHRpb24gICAgOiBTZW5kcyBhIGRhdGEgYnl0ZSB0aHJvdWdoIHRoZSBJMkN4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIERhdGE6IEJ5dGUgdG8gYmUgdHJhbnNtaXR0ZWQuLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU2VuZERhdGEoSTJDX1R5cGVEZWYqIEkyQ3gsIHU4IERhdGEpDQp7DQogIC8qIFdyaXRlIGluIHRoZSBEUiByZWdpc3RlciB0aGUgZGF0YSB0byBiZSBzZW50ICovDQogIEkyQ3gtPkRSID0gRGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfUmVjZWl2ZURhdGENCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCByZWNlaXZlZCBkYXRhIGJ5IHRoZSBJMkN4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlZCBkYXRhLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IEkyQ19SZWNlaXZlRGF0YShJMkNfVHlwZURlZiogSTJDeCkNCnsNCiAgLyogUmV0dXJuIHRoZSBkYXRhIGluIHRoZSBEUiByZWdpc3RlciAqLw0KICByZXR1cm4gKHU4KUkyQ3gtPkRSOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19TZW5kN2JpdEFkZHJlc3MNCiogRGVzY3JpcHRpb24gICAgOiBUcmFuc21pdHMgdGhlIGFkZHJlc3MgYnl0ZSB0byBzZWxlY3QgdGhlIHNsYXZlIGRldmljZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQWRkcmVzczogc3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHdoaWNoIHdpbGwgYmUgdHJhbnNtaXR0ZWQNCiogICAgICAgICAgICAgICAgICAtIERpcmVjdGlvbjogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEkyQyBkZXZpY2Ugd2lsbCBiZSBhDQoqICAgICAgICAgICAgICAgICAgICBUcmFuc21pdHRlciBvciBhIFJlY2VpdmVyLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0RpcmVjdGlvbl9UcmFuc21pdHRlcjogVHJhbnNtaXR0ZXIgbW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRGlyZWN0aW9uX1JlY2VpdmVyOiBSZWNlaXZlciBtb2RlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU2VuZDdiaXRBZGRyZXNzKEkyQ19UeXBlRGVmKiBJMkN4LCB1OCBBZGRyZXNzLCB1OCBJMkNfRGlyZWN0aW9uKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfSTJDX0RJUkVDVElPTihJMkNfRGlyZWN0aW9uKSk7DQoNCiAgLyogVGVzdCBvbiB0aGUgZGlyZWN0aW9uIHRvIHNldC9yZXNldCB0aGUgcmVhZC93cml0ZSBiaXQgKi8NCiAgaWYgKEkyQ19EaXJlY3Rpb24gIT0gSTJDX0RpcmVjdGlvbl9UcmFuc21pdHRlcikNCiAgew0KICAgIC8qIFNldCB0aGUgYWRkcmVzcyBBREQwIGJpdDAgZm9yIHJlYWQgKi8NCiAgICBBZGRyZXNzIHw9IE9BUjFfQUREMF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIGFkZHJlc3MgYml0MCBmb3Igd3JpdGUgKi8NCiAgICBBZGRyZXNzICY9IE9BUjFfQUREMF9SZXNldDsNCiAgfQ0KICAvKiBTZW5kIHRoZSBhZGRyZXNzICovDQogIEkyQ3gtPkRSID0gQWRkcmVzczsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfUmVhZFJlZ2lzdGVyDQoqIERlc2NyaXB0aW9uICAgIDogUmVhZHMgdGhlIHNwZWNpZmllZCBJMkMgcmVnaXN0ZXIgYW5kIHJldHVybnMgaXRzIHZhbHVlLg0KKiBJbnB1dDEgICAgICAgICA6IC0gSTJDX1JlZ2lzdGVyOiBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRvIHJlYWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfQ1IxOiAgQ1IxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfQ1IyOiAgIENSMiByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1JlZ2lzdGVyX09BUjE6ICBPQVIxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfT0FSMjogIE9BUjIgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19SZWdpc3Rlcl9EUjogICAgRFIgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19SZWdpc3Rlcl9TUjE6ICAgU1IxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfU1IyOiAgIFNSMiByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1JlZ2lzdGVyX0NDUjogICBDQ1IgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19SZWdpc3Rlcl9UUklTRTogVFJJU0UgcmVnaXN0ZXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSB2YWx1ZSBvZiB0aGUgcmVhZCByZWdpc3Rlci4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgSTJDX1JlYWRSZWdpc3RlcihJMkNfVHlwZURlZiogSTJDeCwgdTggSTJDX1JlZ2lzdGVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfSTJDX1JFR0lTVEVSKEkyQ19SZWdpc3RlcikpOw0KDQogIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuICgqKHUxNiAqKSgqKCh1MzIgKikmSTJDeCkgKyBJMkNfUmVnaXN0ZXIpKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU29mdHdhcmVSZXNldENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgc29mdHdhcmUgcmVzZXQuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBzb2Z0d2FyZSByZXNldC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19Tb2Z0d2FyZVJlc2V0Q21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBQZXJpcGhlcmFsIHVuZGVyIHJlc2V0ICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9TV1JTVF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUGVyaXBoZXJhbCBub3QgdW5kZXIgcmVzZXQgKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX1NXUlNUX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX1NNQnVzQWxlcnRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBEcml2ZXMgdGhlIFNNQnVzQWxlcnQgcGluIGhpZ2ggb3IgbG93IGZvciB0aGUgc3BlY2lmaWVkIEkyQy4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX1NNQnVzQWxlcnQ6IHNwZWNpZmllcyBTTUJBbGVydCBwaW4gbGV2ZWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1NNQnVzQWxlcnRfTG93OiBTTUJBbGVydCBwaW4gZHJpdmVuIGxvdw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfU01CdXNBbGVydF9IaWdoOiBTTUJBbGVydCBwaW4gZHJpdmVuIGhpZ2gNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX1NNQnVzQWxlcnRDb25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHUxNiBJMkNfU01CdXNBbGVydCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0kyQ19TTUJVU19BTEVSVChJMkNfU01CdXNBbGVydCkpOw0KDQogIGlmIChJMkNfU01CdXNBbGVydCA9PSBJMkNfU01CdXNBbGVydF9Mb3cpDQogIHsNCiAgICAvKiBEcml2ZSB0aGUgU01CdXNBbGVydCBwaW4gTG93ICovDQogICAgSTJDeC0+Q1IxIHw9IEkyQ19TTUJ1c0FsZXJ0X0xvdzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEcml2ZSB0aGUgU01CdXNBbGVydCBwaW4gSGlnaCAgKi8NCiAgICBJMkN4LT5DUjEgJj0gSTJDX1NNQnVzQWxlcnRfSGlnaDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19UcmFuc21pdFBFQw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgUEVDIHRyYW5zZmVyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19UcmFuc21pdFBFQyhJMkNfVHlwZURlZiogSTJDeCkNCnsNCiAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgUEVDIHRyYW5zbWlzc2lvbiAqLw0KICBJMkN4LT5DUjEgfD0gQ1IxX1BFQ19TZXQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX1BFQ1Bvc2l0aW9uQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIEkyQyBQRUMgcG9zaXRpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEkyQ19QRUNQb3NpdGlvbjogc3BlY2lmaWVzIHRoZSBQRUMgcG9zaXRpb24uIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1BFQ1Bvc2l0aW9uX05leHQ6IFBFQyBiaXQgaW5kaWNhdGVzIHRoYXQgY3VycmVudA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGlzIFBFQw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUEVDUG9zaXRpb25fQ3VycmVudDogUEVDIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUNCiogICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBieXRlIGlzIFBFQw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfUEVDUG9zaXRpb25Db25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHUxNiBJMkNfUEVDUG9zaXRpb24pDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19JMkNfUEVDX1BPU0lUSU9OKEkyQ19QRUNQb3NpdGlvbikpOw0KDQogIGlmIChJMkNfUEVDUG9zaXRpb24gPT0gSTJDX1BFQ1Bvc2l0aW9uX05leHQpDQogIHsNCiAgICAvKiBQRUMgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgYnl0ZSBpbiBzaGlmdCByZWdpc3RlciBpcyBQRUMgKi8NCiAgICBJMkN4LT5DUjEgfD0gSTJDX1BFQ1Bvc2l0aW9uX05leHQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUEVDIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGJ5dGUgaW4gc2hpZnQgcmVnaXN0ZXIgaXMgUEVDICovDQogICAgSTJDeC0+Q1IxICY9IEkyQ19QRUNQb3NpdGlvbl9DdXJyZW50Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0NhbGN1bGF0ZVBFQw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBFQyB2YWx1ZSBjYWxjdWxhdGlvbiBvZiB0aGUNCiogICAgICAgICAgICAgICAgICB0cmFuc2ZlcmVkIGJ5dGVzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IFBFQyB2YWx1ZSBjYWxjdWxhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19DYWxjdWxhdGVQRUMoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyBjYWxjdWxhdGlvbiAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfRU5QRUNfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBQRUMgY2FsY3VsYXRpb24gKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX0VOUEVDX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0dldFBFQw0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIFBFQyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBJMkMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIFBFQyB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1OCBJMkNfR2V0UEVDKEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICB1OCBwZWM7DQoNCiAgLyogR2V0IHRoZSBQRUMgdmFsdWUgKi8NCiAgcGVjID0gKEkyQ3gtPlNSMikgPj4gODsNCiAgLyogUmV0dXJuIHRoZSBzZWxlY3RlZCBJMkMgUEVDIHJlZ2lzdGVyIHZhbHVlICovDQogIHJldHVybiBwZWM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0FSUENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgQVJQLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IEFSUC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfQVJQQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBBUlAgKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX0VOQVJQX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgQVJQICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9FTkFSUF9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19TdHJldGNoQ2xvY2tDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIENsb2NrIHN0cmV0Y2hpbmcuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQ3ggQ2xvY2sgc3RyZXRjaGluZy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19TdHJldGNoQ2xvY2tDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgPT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIENsb2NrIHN0cmV0Y2hpbmcgKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX05PU1RSRVRDSF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIENsb2NrIHN0cmV0Y2hpbmcgKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX05PU1RSRVRDSF9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19GYXN0TW9kZUR1dHlDeWNsZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbGVjdHMgdGhlIHNwZWNpZmllZCBJMkMgZmFzdCBtb2RlIGR1dHkgY3ljbGUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEkyQ19EdXR5Q3ljbGU6IHNwZWNpZmllcyB0aGUgZmFzdCBtb2RlIGR1dHkgY3ljbGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRHV0eUN5Y2xlXzI6IEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaCA9IDINCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0R1dHlDeWNsZV8xNl85OiBJMkMgZmFzdCBtb2RlIFRsb3cvVGhpZ2ggPSAxNi85DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19GYXN0TW9kZUR1dHlDeWNsZUNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdTE2IEkyQ19EdXR5Q3ljbGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19JMkNfRFVUWV9DWUNMRShJMkNfRHV0eUN5Y2xlKSk7DQoNCiAgaWYgKEkyQ19EdXR5Q3ljbGUgIT0gSTJDX0R1dHlDeWNsZV8xNl85KQ0KICB7DQogICAgLyogSTJDIGZhc3QgbW9kZSBUbG93L1RoaWdoPTIgKi8NCiAgICBJMkN4LT5DQ1IgJj0gSTJDX0R1dHlDeWNsZV8yOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaD0xNi85ICovDQogICAgSTJDeC0+Q0NSIHw9IEkyQ19EdXR5Q3ljbGVfMTZfOTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZXRMYXN0RXZlbnQNCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBMYXN0IEkyQyBFdmVudC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbGFzdCBldmVudA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBJMkNfR2V0TGFzdEV2ZW50KEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICB1MzIgTGFzdEV2ZW50ID0gMDsNCiAgdTMyIEZsYWcxID0gMCwgRmxhZzIgPSAwOw0KDQogIEZsYWcxID0gSTJDeC0+U1IxOw0KICBGbGFnMiA9IEkyQ3gtPlNSMjsNCiAgRmxhZzIgPSBGbGFnMiA8PCAxNjsNCg0KICAvKiBHZXQgdGhlIGxhc3QgZXZlbnQgdmFsdWUgZnJvbSBJMkMgc3RhdHVzIHJlZ2lzdGVyICovDQogIExhc3RFdmVudCA9IChGbGFnMSB8IEZsYWcyKSAmIEkyQ19GTEFHX01hc2s7DQoNCiAgLyogUmV0dXJuIHN0YXR1cyAqLw0KICByZXR1cm4gTGFzdEV2ZW50Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19DaGVja0V2ZW50DQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIExhc3QgSTJDIEV2ZW50IGlzIGVxdWFsIHRvIHRoZSBvbmUgcGFzc2VkDQoqICAgICAgICAgICAgICAgICAgYXMgcGFyYW1ldGVyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlQ6IHNwZWNpZmllcyB0aGUgZXZlbnQgdG8gYmUgY2hlY2tlZC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfU0xBVkVfQUREUkVTU19NQVRDSEVEICAgOiBFVjENCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX1NMQVZFX0JZVEVfUkVDRUlWRUQgICAgIDogRVYyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9TTEFWRV9CWVRFX1RSQU5TTUlUVEVEICA6IEVWMw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfU0xBVkVfQUNLX0ZBSUxVUkUgICAgICAgOiBFVjMtMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfTUFTVEVSX01PREVfU0VMRUNUICAgICAgOiBFVjUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9NT0RFX1NFTEVDVEVEICAgIDogRVY2DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9NQVNURVJfQllURV9SRUNFSVZFRCAgICA6IEVWNw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfVFJBTlNNSVRURUQgOiBFVjgNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9NT0RFX0FERFJFU1MxMCAgIDogRVY5DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9TTEFWRV9TVE9QX0RFVEVDVEVEICAgICA6IEVWNA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBBbiBFcnJvclN0YXR1cyBlbnVtdXJhdGlvbiB2YWx1ZToNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1VDQ0VTUzogTGFzdCBldmVudCBpcyBlcXVhbCB0byB0aGUgSTJDX0V2ZW50DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEVSUk9SOiBMYXN0IGV2ZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBJMkNfRXZlbnQNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpFcnJvclN0YXR1cyBJMkNfQ2hlY2tFdmVudChJMkNfVHlwZURlZiogSTJDeCwgdTMyIEkyQ19FVkVOVCkNCnsNCiAgdTMyIExhc3RFdmVudCA9IDA7DQogIHUzMiBGbGFnMSA9IDAsIEZsYWcyID0gMDsNCiAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0kyQ19FVkVOVChJMkNfRVZFTlQpKTsNCg0KICBGbGFnMSA9IEkyQ3gtPlNSMTsNCiAgRmxhZzIgPSBJMkN4LT5TUjI7DQogIEZsYWcyID0gRmxhZzIgPDwgMTY7DQoNCiAgLyogR2V0IHRoZSBsYXN0IGV2ZW50IHZhbHVlIGZyb20gSTJDIHN0YXR1cyByZWdpc3RlciAqLw0KICBMYXN0RXZlbnQgPSAoRmxhZzEgfCBGbGFnMikgJiBJMkNfRkxBR19NYXNrOw0KDQogIC8qIENoZWNrIHdoZXRoZXIgdGhlIGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQogIGlmIChMYXN0RXZlbnQgPT0gSTJDX0VWRU5UICkNCiAgew0KICAgIC8qIFNVQ0NFU1M6IGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQogICAgc3RhdHVzID0gU1VDQ0VTUzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBFUlJPUjogbGFzdCBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSBJMkNfRVZFTlQgKi8NCiAgICBzdGF0dXMgPSBFUlJPUjsNCiAgfQ0KDQogIC8qIFJldHVybiBzdGF0dXMgKi8NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19EVUFMRjogRHVhbCBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TTUJIT1NUOiBTTUJ1cyBob3N0IGhlYWRlciAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfU01CREVGQVVMVDogU01CdXMgZGVmYXVsdCBoZWFkZXIgKFNsYXZlIG1vZGUpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0dFTkNBTEw6IEdlbmVyYWwgY2FsbCBoZWFkZXIgZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfVFJBOiBUcmFuc21pdHRlci9SZWNlaXZlciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0JVU1k6IEJ1cyBidXN5IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfTVNMOiBNYXN0ZXIvU2xhdmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19QRUNFUlI6IFBFQyBlcnJvciBpbiByZWNlcHRpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BUkxPOiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19UWEU6IERhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAoVHJhbnNtaXR0ZXIpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1JYTkU6IERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IChSZWNlaXZlcikgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TVE9QRjogU3RvcCBkZXRlY3Rpb24gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQlRGOiBCeXRlIHRyYW5zZmVyIGZpbmlzaGVkIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREUjogQWRkcmVzcyBzZW50IGZsYWcgKE1hc3RlciBtb2RlKSCTQURTTJQNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXRjaGVkIGZsYWcgKFNsYXZlIG1vZGUplEVOREFElA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIEkyQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgSTJDX0dldEZsYWdTdGF0dXMoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgdTMyIGkyY3N0YXR1cyA9IDA7DQogIHUzMiBGbGFnMSA9IDAsIEZsYWcyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfSTJDX0dFVF9GTEFHKEkyQ19GTEFHKSk7DQoNCiAgLyogUmVhZCB0aGUgSTJDeCBzdGF0dXMgcmVnaXN0ZXIgKi8NCiAgRmxhZzEgPSBJMkN4LT5TUjE7DQogIEZsYWcyID0gSTJDeC0+U1IyOw0KICBGbGFnMiA9IChGbGFnMiAmIEkyQ19GTEFHX01hc2spIDw8IDE2Ow0KDQogIC8qIEdldCB0aGUgSTJDIHN0YXR1cyB2YWx1ZSAqLw0KICBpMmNzdGF0dXMgPSBGbGFnMSB8IEZsYWcyOw0KDQogIC8qIEdldCBiaXRbMjc6MF0gb2YgdGhlIGZsYWcgKi8NCiAgSTJDX0ZMQUcgJj0gSTJDX0ZMQUdfTWFzazsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgKi8NCiAgaWYgKChpMmNzdGF0dXMgJiBJMkNfRkxBRykgIT0gKHUzMilSRVNFVCkNCiAgew0KICAgIC8qIEkyQ19GTEFHIGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBJMkNfRkxBRyBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgSTJDX0ZMQUcgc3RhdHVzICovDQogIHJldHVybiAgYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIEkyQ3gncyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1NNQkFMRVJUOiBTTUJ1cyBBbGVydCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1RJTUVPVVQ6IFRpbWVvdXQgb3IgVGxvdyBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1BFQ0VSUjogUEVDIGVycm9yIGluIHJlY2VwdGlvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX09WUjogT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0FSTE86IEFyYml0cmF0aW9uIGxvc3QgZmxhZyAoTWFzdGVyIG1vZGUpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0JFUlI6IEJ1cyBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1NUT1BGOiBTdG9wIGRldGVjdGlvbiBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BREQxMDogMTAtYml0IGhlYWRlciBzZW50IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19CVEY6IEJ5dGUgdHJhbnNmZXIgZmluaXNoZWQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BRERSOiBBZGRyZXNzIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpIJNBRFNMlA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoU2xhdmUgbW9kZSmURU5EQUSUDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1NCOiBTdGFydCBiaXQgZmxhZyAoTWFzdGVyIG1vZGUpDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19DbGVhckZsYWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfRkxBRykNCnsNCiAgdTMyIGZsYWdwb3MgPSAwOw0KICB1OCBmbGFnaW5kZXggPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19JMkNfQ0xFQVJfRkxBRyhJMkNfRkxBRykpOw0KDQogIC8qIEdldCB0aGUgSTJDIGZsYWcgcG9zaXRpb24gKi8NCiAgZmxhZ3BvcyA9IEkyQ19GTEFHICYgSTJDX0ZMQUdfTWFzazsNCg0KICAvKiBHZXQgdGhlIEkyQyBmbGFnIGluZGV4ICovDQogIGZsYWdpbmRleCA9IEkyQ19GTEFHID4+IDI4Ow0KDQogIC8qIENsZWFyIHRoZSBmbGFnIGJ5IHdyaXRpbmcgMCAqLw0KICBpZiAoZmxhZ2luZGV4ID09IDEpDQogIHsNCiAgICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgSTJDIGZsYWcgKi8NCiAgICBJMkN4LT5TUjEgJj0gfmZsYWdwb3M7DQogIH0NCiAgLyogRmxhZ3MgdGhhdCBuZWVkIGEgcmVhZCBvZiB0aGUgU1IxIHJlZ2lzdGVyIHRvIGJlIGNsZWFyZWQgKi8NCiAgZWxzZSBpZiAoZmxhZ2luZGV4ID09IDIpDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQogIH0NCiAgLyogRmxhZ3MgdGhhdCBuZWVkIGEgcmVhZCBvZiBTUjEgYW5kIGEgd3JpdGUgb24gQ1IyIHJlZ2lzdGVycyB0byBiZSBjbGVhcmVkICovDQogIGVsc2UgaWYgKGZsYWdpbmRleCA9PSA2KQ0KICB7DQogICAgLyogUmVhZCB0aGUgU1IxIHJlZ2lzdGVyICovDQogICAgKHZvaWQpSTJDeC0+U1IxOw0KDQogICAgLyogV3JpdGUgb24gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfUEVfU2V0Ow0KICB9DQogIC8qIEZsYWdzIHRoYXQgbmVlZCBhIHJlYWQgb2YgU1IxIGFuZCBhIHdyaXRlIG9uIENSMiByZWdpc3RlcnMgdG8gYmUgY2xlYXJlZCAqLw0KICBlbHNlIC8qZmxhZ2luZGV4ID09IDB4QSovDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQoNCiAgICAvKiBSZWFkIHRoZSBTUjIgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjI7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1NNQkFMRVJUOiBTTUJ1cyBBbGVydCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX09WUjogT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0JFUlI6IEJ1cyBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9UWEU6IERhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAoVHJhbnNtaXR0ZXIpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9SWE5FOiBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAoUmVjZWl2ZXIpIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1NUT1BGOiBTdG9wIGRldGVjdGlvbiBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9BRERSOiBBZGRyZXNzIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpIJNBRFNMlA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoU2xhdmUgbW9kZSmURU5EQUSUDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIEkyQ19JVCAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBJMkNfR2V0SVRTdGF0dXMoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1MzIgaTJjc3RhdHVzID0gMDsNCiAgdTMyIEZsYWcxID0gMCwgRmxhZzIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19JMkNfR0VUX0lUKEkyQ19JVCkpOw0KDQogIC8qIFJlYWQgdGhlIEkyQ3ggc3RhdHVzIHJlZ2lzdGVyICovDQogIEZsYWcxID0gSTJDeC0+U1IxOw0KICBGbGFnMiA9IEkyQ3gtPlNSMjsNCiAgRmxhZzIgPSAoRmxhZzIgJiBJMkNfRkxBR19NYXNrKSA8PCAxNjsNCg0KICAvKiBHZXQgdGhlIEkyQyBzdGF0dXMgdmFsdWUgKi8NCiAgaTJjc3RhdHVzID0gRmxhZzEgfCBGbGFnMjsNCg0KICAvKiBHZXQgYml0WzI3OjBdIG9mIHRoZSBmbGFnICovDQogIEkyQ19JVCAmPSBJMkNfRkxBR19NYXNrOw0KDQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBJMkMgZmxhZyAqLw0KICBpZiAoKGkyY3N0YXR1cyAmIEkyQ19JVCkgIT0gKHUzMilSRVNFVCkNCiAgew0KICAgIC8qIEkyQ19JVCBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogSTJDX0lUIGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBJMkNfSVQgc3RhdHVzICovDQogIHJldHVybiAgYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgSTJDeJJzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEkyQ19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyB0byBjbGVhci4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfU01CQUxFUlQ6IFNNQnVzIEFsZXJ0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1RJTUVPVVQ6IFRpbWVvdXQgb3IgVGxvdyBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9QRUNFUlI6IFBFQyBlcnJvciBpbiByZWNlcHRpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfT1ZSOiBPdmVycnVuL1VuZGVycnVuIGZsYWcgKFNsYXZlIG1vZGUpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9BUkxPOiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQkVSUjogQnVzIGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1NUT1BGOiBTdG9wIGRldGVjdGlvbiBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9BRERSOiBBZGRyZXNzIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpIJNBRFNMlA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoU2xhdmUgbW9kZSmURU5EQUSUDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfQ2xlYXJJVFBlbmRpbmdCaXQoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfSVQpDQp7DQogIHUzMiBmbGFncG9zID0gMDsNCiAgdTggZmxhZ2luZGV4ID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfSTJDX0NMRUFSX0lUKEkyQ19JVCkpOw0KDQogIC8qIEdldCB0aGUgSTJDIGZsYWcgcG9zaXRpb24gKi8NCiAgZmxhZ3BvcyA9IEkyQ19JVCAmIEkyQ19GTEFHX01hc2s7DQoNCiAgLyogR2V0IHRoZSBJMkMgZmxhZyBpbmRleCAqLw0KICBmbGFnaW5kZXggPSBJMkNfSVQgPj4gMjg7DQoNCiAgLyogQ2xlYXIgdGhlIGZsYWcgYnkgd3JpdGluZyAwICovDQogIGlmIChmbGFnaW5kZXggPT0gMSkNCiAgew0KICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBJMkMgZmxhZyAqLw0KICAgIEkyQ3gtPlNSMSAmPSB+ZmxhZ3BvczsNCiAgfQ0KICAvKiBGbGFncyB0aGF0IG5lZWQgYSByZWFkIG9mIHRoZSBTUjEgcmVnaXN0ZXIgdG8gYmUgY2xlYXJlZCAqLw0KICBlbHNlIGlmIChmbGFnaW5kZXggPT0gMikNCiAgew0KICAgIC8qIFJlYWQgdGhlIFNSMSByZWdpc3RlciAqLw0KICAgICh2b2lkKUkyQ3gtPlNSMTsNCiAgfQ0KICAvKiBGbGFncyB0aGF0IG5lZWQgYSByZWFkIG9mIFNSMSBhbmQgYSB3cml0ZSBvbiBDUjIgcmVnaXN0ZXJzIHRvIGJlIGNsZWFyZWQgKi8NCiAgZWxzZSBpZiAoZmxhZ2luZGV4ID09IDYpDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQoNCiAgICAvKiBXcml0ZSBvbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9QRV9TZXQ7DQogIH0NCiAgLyogRmxhZ3MgdGhhdCBuZWVkIGEgcmVhZCBvZiBTUjEgYW5kIGEgd3JpdGUgb24gQ1IyIHJlZ2lzdGVycyB0byBiZSBjbGVhcmVkICovDQogIGVsc2UgLypmbGFnaW5kZXggPT0gMHhBKi8NCiAgew0KICAgIC8qIFJlYWQgdGhlIFNSMSByZWdpc3RlciAqLw0KICAgICh2b2lkKUkyQ3gtPlNSMTsNCg0KICAgIC8qIFJlYWQgdGhlIFNSMiByZWdpc3RlciAqLw0KICAgICh2b2lkKUkyQ3gtPlNSMjsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDcgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K