ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vamF2YS50eHQgYi9Eb2N1bWVudGF0aW9uL2phdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODE0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2phdmEudHh0CkBAIC0wLDAgKzEsMzk2IEBACisgICAgICAgICAgICAgICBKYXZhKHRtKSBCaW5hcnkgS2VybmVsIFN1cHBvcnQgZm9yIExpbnV4IHYxLjAzCisgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpbnV4IGJlYXRzIHRoZW0gQUxMISBXaGlsZSBhbGwgb3RoZXIgT1MncyBhcmUgVEFMS0lORyBhYm91dCBkaXJlY3QKK3N1cHBvcnQgb2YgSmF2YSBCaW5hcmllcyBpbiB0aGUgT1MsIExpbnV4IGlzIGRvaW5nIGl0IQorCitZb3UgY2FuIGV4ZWN1dGUgSmF2YSBhcHBsaWNhdGlvbnMgYW5kIEphdmEgQXBwbGV0cyBqdXN0IGxpa2UgYW55CitvdGhlciBwcm9ncmFtIGFmdGVyIHlvdSBoYXZlIGRvbmUgdGhlIGZvbGxvd2luZzoKKworMSkgWW91IE1VU1QgRklSU1QgaW5zdGFsbCB0aGUgSmF2YSBEZXZlbG9wZXJzIEtpdCBmb3IgTGludXguCisgICBUaGUgSmF2YSBvbiBMaW51eCBIT1dUTyBnaXZlcyB0aGUgZGV0YWlscyBvbiBnZXR0aW5nIGFuZAorICAgaW5zdGFsbGluZyB0aGlzLiBUaGlzIEhPV1RPIGNhbiBiZSBmb3VuZCBhdDoKKworCWZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvZG9jcy9IT1dUTy9KYXZhLUhPV1RPCisKKyAgIFlvdSBzaG91bGQgYWxzbyBzZXQgdXAgYSByZWFzb25hYmxlIENMQVNTUEFUSCBlbnZpcm9ubWVudAorICAgdmFyaWFibGUgdG8gdXNlIEphdmEgYXBwbGljYXRpb25zIHRoYXQgbWFrZSB1c2Ugb2YgYW55CisgICBub25zdGFuZGFyZCBjbGFzc2VzIChub3QgaW5jbHVkZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CisgICBhcyB0aGUgYXBwbGljYXRpb24gaXRzZWxmKS4KKworMikgWW91IGhhdmUgdG8gY29tcGlsZSBCSU5GTVRfTUlTQyBlaXRoZXIgYXMgYSBtb2R1bGUgb3IgaW50bworICAgdGhlIGtlcm5lbCAoQ09ORklHX0JJTkZNVF9NSVNDKSBhbmQgc2V0IGl0IHVwIHByb3Blcmx5LgorICAgSWYgeW91IGNob29zZSB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCB5b3Ugd2lsbCBoYXZlCisgICB0byBpbnNlcnQgaXQgbWFudWFsbHkgd2l0aCBtb2Rwcm9iZS9pbnNtb2QsIGFzIGttb2QKKyAgIGNhbiBub3QgZWFzaWx5IGJlIHN1cHBvcnRlZCB3aXRoIGJpbmZtdF9taXNjLiAKKyAgIFJlYWQgdGhlIGZpbGUgJ2JpbmZtdF9taXNjLnR4dCcgaW4gdGhpcyBkaXJlY3RvcnkgdG8ga25vdworICAgbW9yZSBhYm91dCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgorCiszKSBBZGQgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGl0ZW1zIHRvIGJpbmZtdF9taXNjCisgICAoeW91IHNob3VsZCByZWFsbHkgaGF2ZSByZWFkIGJpbmZtdF9taXNjLnR4dCBub3cpOgorICAgc3VwcG9ydCBmb3IgSmF2YSBhcHBsaWNhdGlvbnM6CisgICAgICc6SmF2YTpNOjpceGNhXHhmZVx4YmFceGJlOjovdXNyL2xvY2FsL2Jpbi9qYXZhd3JhcHBlcjonCisgICBzdXBwb3J0IGZvciBleGVjdXRhYmxlIEphciBmaWxlczoKKyAgICAgJzpFeGVjdXRhYmxlSkFSOkU6Omphcjo6L3Vzci9sb2NhbC9iaW4vamFyd3JhcHBlcjonCisgICBzdXBwb3J0IGZvciBKYXZhIEFwcGxldHM6CisgICAgICc6QXBwbGV0OkU6Omh0bWw6Oi91c3IvYmluL2FwcGxldHZpZXdlcjonCisgICBvciB0aGUgZm9sbG93aW5nLCBpZiB5b3Ugd2FudCB0byBiZSBtb3JlIHNlbGVjdGl2ZToKKyAgICAgJzpBcHBsZXQ6TTo6PCEtLWFwcGxldDo6L3Vzci9iaW4vYXBwbGV0dmlld2VyOicKKworICAgT2YgY2F1c2UgeW91IGhhdmUgdG8gZml4IHRoZSBwYXRoIG5hbWVzLiBHaXZlbiBwYXRoL2ZpbGUgbmFtZXMgaW4gdGhpcworICAgZG9jdW1lbnQgbWF0Y2ggdGhlIERlYmlhbiAyLjEgc3lzdGVtLiAoaS5lLiBqZGsgaW5zdGFsbGVkIGluIC91c3IsCisgICBjdXN0b20gd3JhcHBlcnMgZnJvbSB0aGlzIGRvY3VtZW50IGluIC91c3IvbG9jYWwpCisKKyAgIE5vdGUsIHRoYXQgZm9yIHRoZSBtb3JlIHNlbGVjdGl2ZSBhcHBsZXQgc3VwcG9ydCB5b3UgaGF2ZSB0byBtb2RpZnkKKyAgIGV4aXN0aW5nIGh0bWwtZmlsZXMgdG8gY29udGFpbiA8IS0tYXBwbGV0LS0+IGluIHRoZSBmaXJzdCBsaW5lCisgICAoJzwnIGhhcyB0byBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyISkgdG8gbGV0IHRoaXMgd29yayEKKworICAgRm9yIHRoZSBjb21waWxlZCBKYXZhIHByb2dyYW1zIHlvdSBuZWVkIGEgd3JhcHBlciBzY3JpcHQgbGlrZSB0aGUKKyAgIGZvbGxvd2luZyAodGhpcyBpcyBiZWNhdXNlIEphdmEgaXMgYnJva2VuIGluIGNhc2Ugb2YgdGhlIGZpbGVuYW1lCisgICBoYW5kbGluZyksIGFnYWluIGZpeCB0aGUgcGF0aCBuYW1lcywgYm90aCBpbiB0aGUgc2NyaXB0IGFuZCBpbiB0aGUKKyAgIGFib3ZlIGdpdmVuIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgorCisgICBZb3UsIHRvbywgbmVlZCB0aGUgbGl0dGxlIHByb2dyYW0gYWZ0ZXIgdGhlIHNjcmlwdC4gQ29tcGlsZSBsaWtlCisgICBnY2MgLU8yIC1vIGphdmFjbGFzc25hbWUgamF2YWNsYXNzbmFtZS5jCisgICBhbmQgc3RpY2sgaXQgdG8gL3Vzci9sb2NhbC9iaW4uCisKKyAgIEJvdGggdGhlIGphdmF3cmFwcGVyIHNoZWxsc2NyaXB0IGFuZCB0aGUgamF2YWNsYXNzbmFtZSBwcm9ncmFtCisgICB3ZXJlIHN1cHBsaWVkIGJ5IENvbGluIEouIFdhdHNvbiA8Y2p3NDRAY2FtLmFjLnVrPi4KKworPT09PT09PT09PT09PT09PT09PT09PSBDdXQgaGVyZSA9PT09PT09PT09PT09PT09PT09CisjIS9iaW4vYmFzaAorIyAvdXNyL2xvY2FsL2Jpbi9qYXZhd3JhcHBlciAtIHRoZSB3cmFwcGVyIGZvciBiaW5mbXRfbWlzYy9qYXZhCisKK2lmIFsgLXogIiQxIiBdOyB0aGVuCisJZXhlYyAxPiYyCisJZWNobyBVc2FnZTogJDAgY2xhc3MtZmlsZQorCWV4aXQgMQorZmkKKworQ0xBU1M9JDEKK0ZRQ0xBU1M9YC91c3IvbG9jYWwvYmluL2phdmFjbGFzc25hbWUgJDFgCitGUUNMQVNTTj1gZWNobyAkRlFDTEFTUyB8IHNlZCAtZSAncy9eLipcLlwoW14uXSpcKSQvXDEvJ2AKK0ZRQ0xBU1NQPWBlY2hvICRGUUNMQVNTIHwgc2VkIC1lICdzLVwuLS8tZycgLWUgJ3MtXlteL10qJC0tJyAtZSAncy0vW14vXSokLS0nYAorCisjIGZvciBleGFtcGxlOgorIyBDTEFTUz1UZXN0LmNsYXNzCisjIEZRQ0xBU1M9Zm9vLmJhci5UZXN0CisjIEZRQ0xBU1NOPVRlc3QKKyMgRlFDTEFTU1A9Zm9vL2JhcgorCit1bnNldCBDTEFTU0JBU0UKKworZGVjbGFyZSAtaSBMSU5LTEVWRUw9MAorCit3aGlsZSA6OyBkbworCWlmIFsgImBiYXNlbmFtZSAkQ0xBU1MgLmNsYXNzYCIgPT0gIiRGUUNMQVNTTiIgXTsgdGhlbgorCQkjIFNlZSBpZiB0aGlzIGRpcmVjdG9yeSB3b3JrcyBzdHJhaWdodCBvZmYKKwkJY2QgLUwgYGRpcm5hbWUgJENMQVNTYAorCQlDTEFTU0RJUj0kUFdECisJCWNkICRPTERQV0QKKwkJaWYgZWNobyAkQ0xBU1NESVIgfCBncmVwIC1xICIkRlFDTEFTU1AkIjsgdGhlbgorCQkJQ0xBU1NCQVNFPWBlY2hvICRDTEFTU0RJUiB8IHNlZCAtZSAicy4kRlFDTEFTU1AkLi4iYAorCQkJYnJlYWs7CisJCWZpCisJCSMgVHJ5IGRlcmVmZXJlbmNpbmcgdGhlIGRpcmVjdG9yeSBuYW1lCisJCWNkIC1QIGBkaXJuYW1lICRDTEFTU2AKKwkJQ0xBU1NESVI9JFBXRAorCQljZCAkT0xEUFdECisJCWlmIGVjaG8gJENMQVNTRElSIHwgZ3JlcCAtcSAiJEZRQ0xBU1NQJCI7IHRoZW4KKwkJCUNMQVNTQkFTRT1gZWNobyAkQ0xBU1NESVIgfCBzZWQgLWUgInMuJEZRQ0xBU1NQJC4uImAKKwkJCWJyZWFrOworCQlmaQorCQkjIElmIG5vIG90aGVyIHBvc3NpYmxlIGZpbGVuYW1lIGV4aXN0cworCQlpZiBbICEgLUwgJENMQVNTIF07IHRoZW4KKwkJCWV4ZWMgMT4mMgorCQkJZWNobyAkMDoKKwkJCWVjaG8gIiAgJENMQVNTIHNob3VsZCBiZSBpbiBhIiBcCisJCQkgICAgICJkaXJlY3RvcnkgdHJlZSBjYWxsZWQgJEZRQ0xBU1NQIgorCQkJZXhpdCAxCisJCWZpCisJZmkKKwlpZiBbICEgLUwgJENMQVNTIF07IHRoZW4gYnJlYWs7IGZpCisJIyBHbyBkb3duIG9uZSBtb3JlIGxldmVsIG9mIHN5bWJvbGljIGxpbmtzCisJbGV0IExJTktMRVZFTCs9MQorCWlmIFsgJExJTktMRVZFTCAtZ3QgNSBdOyB0aGVuCisJCWV4ZWMgMT4mMgorCQllY2hvICQwOgorCQllY2hvICIgIFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIgorCQlleGl0IDEKKwlmaQorCUNMQVNTPWBscyAtLWNvbG9yPW5vIC1sICRDTEFTUyB8IHNlZCAtZSAncy9eLiogXChbXiBdKlwpJC9cMS8nYAorZG9uZQorCitpZiBbIC16ICIkQ0xBU1NCQVNFIiBdOyB0aGVuCisJaWYgWyAteiAiJEZRQ0xBU1NQIiBdOyB0aGVuCisJCUdPT0ROQU1FPSRGUUNMQVNTTi5jbGFzcworCWVsc2UKKwkJR09PRE5BTUU9JEZRQ0xBU1NQLyRGUUNMQVNTTi5jbGFzcworCWZpCisJZXhlYyAxPiYyCisJZWNobyAkMDoKKwllY2hvICIgICRGUUNMQVNTIHNob3VsZCBiZSBpbiBhIGZpbGUgY2FsbGVkICRHT09ETkFNRSIKKwlleGl0IDEKK2ZpCisKK2lmICEgZWNobyAkQ0xBU1NQQVRIIHwgZ3JlcCAtcSAiXlwoLio6XCkqJENMQVNTQkFTRVwoOi4qXCkqIjsgdGhlbgorCSMgY2xhc3MgaXMgbm90IGluIENMQVNTUEFUSCwgc28gcHJlcGVuZCBkaXIgb2YgY2xhc3MgdG8gQ0xBU1NQQVRICisJaWYgWyAteiAiJHtDTEFTU1BBVEh9IiBdIDsgdGhlbgorCQlleHBvcnQgQ0xBU1NQQVRIPSRDTEFTU0JBU0UKKwllbHNlCisJCWV4cG9ydCBDTEFTU1BBVEg9JENMQVNTQkFTRTokQ0xBU1NQQVRICisJZmkKK2ZpCisKK3NoaWZ0CisvdXNyL2Jpbi9qYXZhICRGUUNMQVNTICIkQCIKKz09PT09PT09PT09PT09PT09PT09PT0gQ3V0IGhlcmUgPT09PT09PT09PT09PT09PT09PQorCisKKz09PT09PT09PT09PT09PT09PT09PT0gQ3V0IGhlcmUgPT09PT09PT09PT09PT09PT09PQorLyogamF2YWNsYXNzbmFtZS5jCisgKgorICogRXh0cmFjdHMgdGhlIGNsYXNzIG5hbWUgZnJvbSBhIEphdmEgY2xhc3MgZmlsZTsgaW50ZW5kZWQgZm9yIHVzZSBpbiBhIEphdmEKKyAqIHdyYXBwZXIgb2YgdGhlIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBiaW5mbXRfbWlzYyBvcHRpb24gaW4gdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQ29saW4gSi4gV2F0c29uIDxjanc0NEBjYW0uYWMudWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogRnJvbSBTdW4ncyBKYXZhIFZNIFNwZWNpZmljYXRpb24sIGFzIHRhZyBlbnRyaWVzIGluIHRoZSBjb25zdGFudCBwb29sLiAqLworCisjZGVmaW5lIENQX1VURjggMQorI2RlZmluZSBDUF9JTlRFR0VSIDMKKyNkZWZpbmUgQ1BfRkxPQVQgNAorI2RlZmluZSBDUF9MT05HIDUKKyNkZWZpbmUgQ1BfRE9VQkxFIDYKKyNkZWZpbmUgQ1BfQ0xBU1MgNworI2RlZmluZSBDUF9TVFJJTkcgOAorI2RlZmluZSBDUF9GSUVMRFJFRiA5CisjZGVmaW5lIENQX01FVEhPRFJFRiAxMAorI2RlZmluZSBDUF9JTlRFUkZBQ0VNRVRIT0RSRUYgMTEKKyNkZWZpbmUgQ1BfTkFNRUFORFRZUEUgMTIKKworLyogRGVmaW5lIHNvbWUgY29tbW9ubHkgdXNlZCBlcnJvciBtZXNzYWdlcyAqLworCisjZGVmaW5lIHNlZWtfZXJyb3IoKSBlcnJvcigiJXM6IENhbm5vdCBzZWVrXG4iLCBwcm9ncmFtKQorI2RlZmluZSBjb3JydXB0X2Vycm9yKCkgZXJyb3IoIiVzOiBDbGFzcyBmaWxlIGNvcnJ1cHRcbiIsIHByb2dyYW0pCisjZGVmaW5lIGVvZl9lcnJvcigpIGVycm9yKCIlczogVW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiwgcHJvZ3JhbSkKKyNkZWZpbmUgdXRmOF9lcnJvcigpIGVycm9yKCIlczogT25seSBBU0NJSSAxLTI1NSBzdXBwb3J0ZWRcbiIsIHByb2dyYW0pOworCitjaGFyICpwcm9ncmFtOworCitsb25nICpwb29sOworCit1X2ludDhfdCByZWFkXzgoRklMRSAqY2xhc3NmaWxlKTsKK3VfaW50MTZfdCByZWFkXzE2KEZJTEUgKmNsYXNzZmlsZSk7Cit2b2lkIHNraXBfY29uc3RhbnQoRklMRSAqY2xhc3NmaWxlLCB1X2ludDE2X3QgKmN1cik7Cit2b2lkIGVycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKy8qIFJlYWRzIGluIGFuIHVuc2lnbmVkIDgtYml0IGludGVnZXIuICovCit1X2ludDhfdCByZWFkXzgoRklMRSAqY2xhc3NmaWxlKQoreworCWludCBiID0gZmdldGMoY2xhc3NmaWxlKTsKKwlpZihiID09IEVPRikKKwkJZW9mX2Vycm9yKCk7CisJcmV0dXJuICh1X2ludDhfdCliOworfQorCisvKiBSZWFkcyBpbiBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4gKi8KK3VfaW50MTZfdCByZWFkXzE2KEZJTEUgKmNsYXNzZmlsZSkKK3sKKwlpbnQgYjEsIGIyOworCWIxID0gZmdldGMoY2xhc3NmaWxlKTsKKwlpZihiMSA9PSBFT0YpCisJCWVvZl9lcnJvcigpOworCWIyID0gZmdldGMoY2xhc3NmaWxlKTsKKwlpZihiMiA9PSBFT0YpCisJCWVvZl9lcnJvcigpOworCXJldHVybiAodV9pbnQxNl90KSgoYjEgPDwgOCkgfCBiMik7Cit9CisKKy8qIFJlYWRzIGluIGEgdmFsdWUgZnJvbSB0aGUgY29uc3RhbnQgcG9vbC4gKi8KK3ZvaWQgc2tpcF9jb25zdGFudChGSUxFICpjbGFzc2ZpbGUsIHVfaW50MTZfdCAqY3VyKQoreworCXVfaW50MTZfdCBsZW47CisJaW50IHNlZWtlcnIgPSAxOworCXBvb2xbKmN1cl0gPSBmdGVsbChjbGFzc2ZpbGUpOworCXN3aXRjaChyZWFkXzgoY2xhc3NmaWxlKSkKKwl7CisJY2FzZSBDUF9VVEY4OgorCQlsZW4gPSByZWFkXzE2KGNsYXNzZmlsZSk7CisJCXNlZWtlcnIgPSBmc2VlayhjbGFzc2ZpbGUsIGxlbiwgU0VFS19DVVIpOworCQlicmVhazsKKwljYXNlIENQX0NMQVNTOgorCWNhc2UgQ1BfU1RSSU5HOgorCQlzZWVrZXJyID0gZnNlZWsoY2xhc3NmaWxlLCAyLCBTRUVLX0NVUik7CisJCWJyZWFrOworCWNhc2UgQ1BfSU5URUdFUjoKKwljYXNlIENQX0ZMT0FUOgorCWNhc2UgQ1BfRklFTERSRUY6CisJY2FzZSBDUF9NRVRIT0RSRUY6CisJY2FzZSBDUF9JTlRFUkZBQ0VNRVRIT0RSRUY6CisJY2FzZSBDUF9OQU1FQU5EVFlQRToKKwkJc2Vla2VyciA9IGZzZWVrKGNsYXNzZmlsZSwgNCwgU0VFS19DVVIpOworCQlicmVhazsKKwljYXNlIENQX0xPTkc6CisJY2FzZSBDUF9ET1VCTEU6CisJCXNlZWtlcnIgPSBmc2VlayhjbGFzc2ZpbGUsIDgsIFNFRUtfQ1VSKTsKKwkJKysoKmN1cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvcnJ1cHRfZXJyb3IoKTsKKwl9CisJaWYoc2Vla2VycikKKwkJc2Vla19lcnJvcigpOworfQorCit2b2lkIGVycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpjbGFzc2ZpbGU7CisJdV9pbnQxNl90IGNwX2NvdW50LCBpLCB0aGlzX2NsYXNzLCBjbGFzc2luZm9fcHRyOworCXVfaW50OF90IGxlbmd0aDsKKworCXByb2dyYW0gPSBhcmd2WzBdOworCisJaWYoIWFyZ3ZbMV0pCisJCWVycm9yKCIlczogTWlzc2luZyBpbnB1dCBmaWxlXG4iLCBwcm9ncmFtKTsKKwljbGFzc2ZpbGUgPSBmb3Blbihhcmd2WzFdLCAicmIiKTsKKwlpZighY2xhc3NmaWxlKQorCQllcnJvcigiJXM6IEVycm9yIG9wZW5pbmcgJXNcbiIsIHByb2dyYW0sIGFyZ3ZbMV0pOworCisJaWYoZnNlZWsoY2xhc3NmaWxlLCA4LCBTRUVLX1NFVCkpICAvKiBza2lwIG1hZ2ljIGFuZCB2ZXJzaW9uIG51bWJlcnMgKi8KKwkJc2Vla19lcnJvcigpOworCWNwX2NvdW50ID0gcmVhZF8xNihjbGFzc2ZpbGUpOworCXBvb2wgPSBjYWxsb2MoY3BfY291bnQsIHNpemVvZihsb25nKSk7CisJaWYoIXBvb2wpCisJCWVycm9yKCIlczogT3V0IG9mIG1lbW9yeSBmb3IgY29uc3RhbnQgcG9vbFxuIiwgcHJvZ3JhbSk7CisKKwlmb3IoaSA9IDE7IGkgPCBjcF9jb3VudDsgKytpKQorCQlza2lwX2NvbnN0YW50KGNsYXNzZmlsZSwgJmkpOworCWlmKGZzZWVrKGNsYXNzZmlsZSwgMiwgU0VFS19DVVIpKQkvKiBza2lwIGFjY2VzcyBmbGFncyAqLworCQlzZWVrX2Vycm9yKCk7CisKKwl0aGlzX2NsYXNzID0gcmVhZF8xNihjbGFzc2ZpbGUpOworCWlmKHRoaXNfY2xhc3MgPCAxIHx8IHRoaXNfY2xhc3MgPj0gY3BfY291bnQpCisJCWNvcnJ1cHRfZXJyb3IoKTsKKwlpZighcG9vbFt0aGlzX2NsYXNzXSB8fCBwb29sW3RoaXNfY2xhc3NdID09IC0xKQorCQljb3JydXB0X2Vycm9yKCk7CisJaWYoZnNlZWsoY2xhc3NmaWxlLCBwb29sW3RoaXNfY2xhc3NdICsgMSwgU0VFS19TRVQpKQorCQlzZWVrX2Vycm9yKCk7CisKKwljbGFzc2luZm9fcHRyID0gcmVhZF8xNihjbGFzc2ZpbGUpOworCWlmKGNsYXNzaW5mb19wdHIgPCAxIHx8IGNsYXNzaW5mb19wdHIgPj0gY3BfY291bnQpCisJCWNvcnJ1cHRfZXJyb3IoKTsKKwlpZighcG9vbFtjbGFzc2luZm9fcHRyXSB8fCBwb29sW2NsYXNzaW5mb19wdHJdID09IC0xKQorCQljb3JydXB0X2Vycm9yKCk7CisJaWYoZnNlZWsoY2xhc3NmaWxlLCBwb29sW2NsYXNzaW5mb19wdHJdICsgMSwgU0VFS19TRVQpKQorCQlzZWVrX2Vycm9yKCk7CisKKwlsZW5ndGggPSByZWFkXzE2KGNsYXNzZmlsZSk7CisJZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisJeworCQl1X2ludDhfdCB4ID0gcmVhZF84KGNsYXNzZmlsZSk7CisJCWlmKCh4ICYgMHg4MCkgfHwgIXgpCisJCXsKKwkJCWlmKCh4ICYgMHhFMCkgPT0gMHhDMCkKKwkJCXsKKwkJCQl1X2ludDhfdCB5ID0gcmVhZF84KGNsYXNzZmlsZSk7CisJCQkJaWYoKHkgJiAweEMwKSA9PSAweDgwKQorCQkJCXsKKwkJCQkJaW50IGMgPSAoKHggJiAweDFmKSA8PCA2KSArICh5ICYgMHgzZik7CisJCQkJCWlmKGMpIHB1dGNoYXIoYyk7CisJCQkJCWVsc2UgdXRmOF9lcnJvcigpOworCQkJCX0KKwkJCQllbHNlIHV0ZjhfZXJyb3IoKTsKKwkJCX0KKwkJCWVsc2UgdXRmOF9lcnJvcigpOworCQl9CisJCWVsc2UgaWYoeCA9PSAnLycpIHB1dGNoYXIoJy4nKTsKKwkJZWxzZSBwdXRjaGFyKHgpOworCX0KKwlwdXRjaGFyKCdcbicpOworCWZyZWUocG9vbCk7CisJZmNsb3NlKGNsYXNzZmlsZSk7CisJcmV0dXJuIDA7Cit9Cis9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KKworCis9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KKyMhL2Jpbi9iYXNoCisjIC91c3IvbG9jYWwvamF2YS9iaW4vamFyd3JhcHBlciAtIHRoZSB3cmFwcGVyIGZvciBiaW5mbXRfbWlzYy9qYXIKKworamF2YSAtamFyICQxCis9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KKworCitOb3cgc2ltcGx5IGNobW9kICt4IHRoZSAuY2xhc3MsIC5qYXIgYW5kL29yIC5odG1sIGZpbGVzIHlvdSB3YW50IHRvIGV4ZWN1dGUuCitUbyBhZGQgYSBKYXZhIHByb2dyYW0gdG8geW91ciBwYXRoIGJlc3QgcHV0IGEgc3ltYm9saWMgbGluayB0byB0aGUgbWFpbgorLmNsYXNzIGZpbGUgaW50byAvdXNyL2JpbiAob3IgYW5vdGhlciBwbGFjZSB5b3UgbGlrZSkgb21pdHRpbmcgdGhlIC5jbGFzcworZXh0ZW5zaW9uLiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIC5jbGFzcyBmaWxlIHdpbGwgYmUKK2FkZGVkIHRvIHlvdXIgQ0xBU1NQQVRIIGR1cmluZyBleGVjdXRpb24uCisKKworVG8gdGVzdCB5b3VyIG5ldyBzZXR1cCwgZW50ZXIgaW4gdGhlIGZvbGxvd2luZyBzaW1wbGUgSmF2YSBhcHAsIGFuZCBuYW1lCitpdCAiSGVsbG9Xb3JsZC5qYXZhIjoKKworCWNsYXNzIEhlbGxvV29ybGQgeworCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIFdvcmxkISIpOworCQl9CisJfQorCitOb3cgY29tcGlsZSB0aGUgYXBwbGljYXRpb24gd2l0aDoKKwlqYXZhYyBIZWxsb1dvcmxkLmphdmEKKworU2V0IHRoZSBleGVjdXRhYmxlIHBlcm1pc3Npb25zIG9mIHRoZSBiaW5hcnkgZmlsZSwgd2l0aDoKKwljaG1vZCA3NTUgSGVsbG9Xb3JsZC5jbGFzcworCitBbmQgdGhlbiBleGVjdXRlIGl0OgorCS4vSGVsbG9Xb3JsZC5jbGFzcworCisKK1RvIGV4ZWN1dGUgSmF2YSBKYXIgZmlsZXMsIHNpbXBsZSBjaG1vZCB0aGUgKi5qYXIgZmlsZXMgdG8gaW5jbHVkZQordGhlIGV4ZWN1dGlvbiBiaXQsIHRoZW4ganVzdCBkbworICAgICAgIC4vQXBwbGljYXRpb24uamFyCisKKworVG8gZXhlY3V0ZSBKYXZhIEFwcGxldHMsIHNpbXBsZSBjaG1vZCB0aGUgKi5odG1sIGZpbGVzIHRvIGluY2x1ZGUKK3RoZSBleGVjdXRpb24gYml0LCB0aGVuIGp1c3QgZG8KKwkuL0FwcGxldC5odG1sCisKKworb3JpZ2luYWxseSBieSBCcmlhbiBBLiBMYW50eiwgYnJpYW5AbGFudHouY29tCitoZWF2aWx5IGVkaXRlZCBmb3IgYmluZm10X21pc2MgYnkgUmljaGFyZCBH/G50aGVyCituZXcgc2NyaXB0cyBieSBDb2xpbiBKLiBXYXRzb24gPGNqdzQ0QGNhbS5hYy51az4KK2FkZGVkIGV4ZWN1dGFibGUgSmFyIGZpbGUgc3VwcG9ydCBieSBLdXJ0IEh1d2lnIDxrdXJ0QGlrdS1uZXR6LmRlPgorCg==