IyBUaGlzIGlzIGEgZnJvemVuIHN0YXRlIGZpbGUgZ2VuZXJhdGVkIGJ5IEdOVSBNNCAxLjQuMTcKVjEKUTEsMQpbXQpUMjgsMjcKbTRfbG9jYXRpb24oQUNfUFJPR19DWFhfQ19PKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00Ojc3OQpUMjcsMzAKbTRfbG9jYXRpb24oQUNfTEFOR19BU1NFUlQpLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTU2ClQyMiwxMzMKX0FTX0xJVEVSQUxfSEVSRURPQ19JRm00X2lmKG00X2luZGV4KFskMV0sIFtAU3xAXSksIFstMV0sCiAgW200X2lmKG00X2luZGV4KG00X3RyYW5zbGl0KFtbJDFdXSwgW1xgXSwgWyRdKSwgWyRdKSwgWy0xXSwKICAgIFskMF9ZRVNdLCBbJDBfTk9dKV0sCiAgWyQwX05PXSkKVDE2LDY1CkFDX1RZUEVfVUlOVDE2X1RfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1RZUEVfVU5TSUdORURfSU5UKDE2KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsNTQKQUNfUEFUSF9QUk9HU19GRUFUVVJFX0NIRUNLXyQwKFskMV0sIFskMl0sIFskM10sIG00X2RlZmF1bHQoWyQ0XSwgWzpdKSwgWyQ1XSlkbmwKClQzNywzMgptNF9sb2NhdGlvbihBQ19FUkxBTkdfU1VCU1RfUk9PVF9ESVIpLi4vLi4vbGliL2F1dG9jb25mL2VybGFuZy5tNDoyMTcKVDE2LDQwMApfQVNfRVhJVF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkVfU0hFTExfRk4oW2FzX2ZuX3NldF9zdGF0dXNdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYXNfZm5fc2V0X3N0YXR1c10sIFtTVEFUVVNdLAogICAgW1NldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy5dKV0sIFsgIHJldHVybiAkW10xXSlBU19SRVFVSVJFX1NIRUxMX0ZOKFthc19mbl9leGl0XSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX2V4aXRdLCBbU1RBVFVTXSwKICAgIFtFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuXSldLApbICBzZXQgK2UKICBhc19mbl9zZXRfc3RhdHVzICRbMV0KICBleGl0ICRbMV1dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMzYyCkFDX1NZU19QT1NJWF9URVJNSU9TX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtQT1NJWCB0ZXJtaW9zXSwgYWNfY3Zfc3lzX3Bvc2l4X3Rlcm1pb3MsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDx0ZXJtaW9zLmg+Cl1dLAoJICAgICBbLyogU3VuT1MgNC4wLjMgaGFzIHRlcm1pb3MuaCBidXQgbm90IHRoZSBsaWJyYXJ5IGNhbGxzLiAgKi8KICAgdGNnZXRhdHRyKDAsIDApO10pXSwKCSAgICAgYWNfY3Zfc3lzX3Bvc2l4X3Rlcm1pb3M9eWVzLAoJICAgICBhY19jdl9zeXNfcG9zaXhfdGVybWlvcz1ubyldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDE0MApBQ19QUk9HX0Y3N19DX09fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbiA3NylkbmwKX0FDX1BST0dfRkNfQ19PCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNjkKX200X2xpc3RfY21wbTRfaWYoWyQxXSwgW10sIFswbTRfaWdub3JlXSwgWyQyXSwgWzBdLCBbbTRfdW5xdW90ZV0sIFskMm00X2lnbm9yZV0pClQyNCwxMDIwCkFDX0xBTkdfRlVOQ19MSU5LX1RSWShDKUFDX0xBTkdfUFJPR1JBTSgKWy8qIERlZmluZSAkMSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQxLgogICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KI2RlZmluZSAkMSBpbm5vY3VvdXNfJDEKCi8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDEgKCk7IGJlbG93LgogICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KCiNpZmRlZiBfX1NURENfXwojIGluY2x1ZGUgPGxpbWl0cy5oPgojZWxzZQojIGluY2x1ZGUgPGFzc2VydC5oPgojZW5kaWYKCiN1bmRlZiAkMQoKLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMSAoKTsKLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwojaWYgZGVmaW5lZCBfX3N0dWJfJDEgfHwgZGVmaW5lZCBfX3N0dWJfX18kMQpjaG9rZSBtZQojZW5kaWYKXSwgW3JldHVybiAkMSAoKTtdKQpGMTIsOQptNF9kZWJ1Z2ZpbGVkZWJ1Z2ZpbGUKVDExLDEKX0FIX0NPVU5URVIwClQyMSw4NjQKX0FDX1RZUEVfVU5TSUdORURfSU5UX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX2NfZmluZF91aW50WF90XSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX2NfZmluZF91aW50WF90XSwgW0xJTkVOTyBCSVRTIFZBUl0sCiAgICBbRmluZHMgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIHdpdGggd2lkdGggQklUUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKICAgICBhY2NvcmRpbmdseS5dKV0sCiAgWyQwX0JPRFldKWFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiJDEiICJhY19jdl9jX3VpbnQkMV90IgpjYXNlICRhY19jdl9jX3VpbnQkMV90IGluICMoCiAgbm98eWVzKSA7OyAjKAogICopCiAgICBtNF9ibWF0Y2goWyQxXSwgW15cKDhcfDMyXHw2NFwpJF0sCiAgICAgIFtBQ19ERUZJTkUoW19VSU5UJDFfVF0sIDEsCgkgW0RlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludCQxX3QgdHlwZWRlZiBmcm9tCgkgIDxzeXMvc3luY2guaD4sIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLgoJICBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZSAjZGVmaW5lIGJlbG93IHdvdWxkIGNhdXNlIGEKCSAgc3ludGF4IGVycm9yLl0pXSkKICAgIEFDX0RFRklORV9VTlFVT1RFRChbdWludCQxX3RdLCBbJGFjX2N2X2NfdWludCQxX3RdLAogICAgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5ICQxIGJpdHMKICAgICAgIGlmIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuXSk7OwogIGVzYWMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxODMKX0FDX0ZPUlRSQU5fQVNTRVJUX200X2RlZnVuX3BybyhbJDBdKW00X2lmKF9BQ19MQU5HLCBbRm9ydHJhbl0sIFtdLAogICAgICAgW200X2lmKF9BQ19MQU5HLCBbRm9ydHJhbiA3N10sIFtdLAoJICAgICAgW200X2ZhdGFsKFskMDogY3VycmVudCBsYW5ndWFnZSBpcyBub3QgRm9ydHJhbjogXSBfQUNfTEFORyldKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwxNTcKX0FDX0RFRklORV9VTlFVT1RFRG00X2lmKG00X2JyZWdleHAoWyQxXSwgW1xcXHxgXHxcJChcfFwke1x8QF0pLCBbLTFdLAogICAgICAgW0FTX0VDSE8oWyJBU19FU0NBUEUoWyQxXSwgWyIiXSkiXSkgPj5jb25mZGVmcy5oXSwKICAgICAgIFtjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GClskMV0KX0FDRU9GXSkKVDIxLDYwOQpBQ19MQU5HX0lOVF9TQVZFKEMrKylBQ19MQU5HX1BST0dSQU0oWyQxCnN0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CnN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQpAJTpAaW5jbHVkZSA8c3RkaW8uaD4KQCU6QGluY2x1ZGUgPHN0ZGxpYi5oPl0sClsKICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwogIGlmICghIGYpCiAgICByZXR1cm4gMTsKICBpZiAoKCQyKSA8IDApCiAgICB7CiAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOwogICAgICBpZiAoaSAhPSAoJDIpKQoJcmV0dXJuIDE7CiAgICAgIGZwcmludGYgKGYsICIlbGQiLCBpKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKICAgICAgaWYgKGkgIT0gKCQyKSkKCXJldHVybiAxOwogICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CiAgICB9CiAgLyogRG8gbm90IG91dHB1dCBhIHRyYWlsaW5nIG5ld2xpbmUsIGFzIHRoaXMgY2F1c2VzIFxyXG4gY29uZnVzaW9uCiAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLwogIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKXSkKVDE2LDc5NQpBQ19IRUFERVJfQVNTRVJUX200X2RlZnVuX29uY2UoW0FDX0hFQURFUl9BU1NFUlRdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBhc3NlcnRpb25zXSkKICBBQ19BUkdfRU5BQkxFKFthc3NlcnRdLAogICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYXNzZXJ0XSwgW3R1cm4gb2ZmIGFzc2VydGlvbnNdKV0sCiAgICBbYWNfZW5hYmxlX2Fzc2VydD0kZW5hYmxldmFsCiAgICAgQVNfSUYoZG5sCiAgICAgIFt0ZXN0ICJ4JGVuYWJsZXZhbCIgPSB4bm9dLAoJW0FDX0RFRklORShbTkRFQlVHXSwgWzFdLAoJICBbRGVmaW5lIHRvIDEgaWYgYXNzZXJ0aW9ucyBzaG91bGQgYmUgZGlzYWJsZWQuXSldLAogICAgICBbdGVzdCAieCRlbmFibGV2YWwiICE9IHh5ZXNdLAoJW0FDX01TR19XQVJOKFtpbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIC0tZW5hYmxlLWFzc2VydF0pCglhY19lbmFibGVfYXNzZXJ0PXllc10pXSwKICAgIFthY19lbmFibGVfYXNzZXJ0PXllc10pCiAgQUNfTVNHX1JFU1VMVChbJGFjX2VuYWJsZV9hc3NlcnRdKQpdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfSEVBREVSX0FTU0VSVF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0hFQURFUl9BU1NFUlRdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfSEVBREVSX0FTU0VSVF0pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX0hFQURFUl9BU1NFUlRdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQ2LDE1MwpBQ19BSVhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQUlYJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlNbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDMxCm00X2xvY2F0aW9uKEFDX0VSTEFOR19QQVRIX0VSTCkuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjczClQxNywwCkFTX01FU1NBR0VfTE9HX0ZEClQyOCw2OApBQ19MQU5HX1BSRVBST0MoT2JqZWN0aXZlIEMpX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfT0JKQ1BQXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDMzCm00X2xvY2F0aW9uKF9BQ19QUk9HX0ZDKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjMyMwpUMjMsMzQKbTRfbG9jYXRpb24oQUNfVFJZX0NQUCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNTI5ClQzNCwzMwptNF9sb2NhdGlvbihBQ19GQ19MSUJSQVJZX0xERkxBR1MpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6NzM3ClQyMiwxNDA2CkFDX1NZU19MT05HX0ZJTEVfTkFNRVNfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soZm9yIGxvbmcgZmlsZSBuYW1lcywgYWNfY3Zfc3lzX2xvbmdfZmlsZV9uYW1lcywKW2FjX2N2X3N5c19sb25nX2ZpbGVfbmFtZXM9eWVzCiMgVGVzdCBmb3IgbG9uZyBmaWxlIG5hbWVzIGluIGFsbCB0aGUgcGxhY2VzIHdlIGtub3cgbWlnaHQgbWF0dGVyOgojICAgICAgLgkJdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGVyZSBidWlsZGluZyB3aWxsIGhhcHBlbgojICAgICAgJHByZWZpeC9saWIJd2hlcmUgd2Ugd2lsbCBiZSBpbnN0YWxsaW5nIHRoaW5ncwojICAgICAgJGV4ZWNfcHJlZml4L2xpYglsaWtld2lzZQojICAgICAgJFRNUERJUgkJaWYgc2V0LCB3aGVyZSBpdCBtaWdodCB3YW50IHRvIHdyaXRlIHRlbXBvcmFyeSBmaWxlcwojICAgICAgL3RtcAkJd2hlcmUgaXQgbWlnaHQgd2FudCB0byB3cml0ZSB0ZW1wb3JhcnkgZmlsZXMKIyAgICAgIC92YXIvdG1wCQlsaWtld2lzZQojICAgICAgL3Vzci90bXAJCWxpa2V3aXNlCmZvciBhY19kaXIgaW4gLiAiJFRNUERJUiIgL3RtcCAvdmFyL3RtcCAvdXNyL3RtcCAiJHByZWZpeC9saWIiICIkZXhlY19wcmVmaXgvbGliIjsgZG8KICAjIFNraXAgJFRNUERJUiBpZiBpdCBpcyBlbXB0eSBvciBib2d1cywgYW5kIHNraXAgJGV4ZWNfcHJlZml4L2xpYgogICMgaW4gdGhlIHVzdWFsIGNhc2Ugd2hlcmUgZXhlY19wcmVmaXggaXMgJyR7cHJlZml4fScuCiAgY2FzZSAkYWNfZGlyIGluICMoCiAgICAuIHwgLyogfCA/OltbXFwvXV0qKSA7OyAjKAogICAgKikgY29udGludWU7OwogIGVzYWMKICB0ZXN0IC13ICIkYWNfZGlyLy4iIHx8IGNvbnRpbnVlICMgSXQgaXMgbGVzcyBjb25mdXNpbmcgdG8gbm90IGVjaG8gYW55dGhpbmcgaGVyZS4KICBhY194ZGlyPSRhY19kaXIvY2YkJAogICh1bWFzayAwNzcgJiYgbWtkaXIgIiRhY194ZGlyIiAyPi9kZXYvbnVsbCkgfHwgY29udGludWUKICBhY190ZjE9JGFjX3hkaXIvY29uZnRlc3Q5MDEyMzQ1CiAgYWNfdGYyPSRhY194ZGlyL2NvbmZ0ZXN0OTAxMjM0NgogIHRvdWNoICIkYWNfdGYxIiAyPi9kZXYvbnVsbCAmJiB0ZXN0IC1mICIkYWNfdGYxIiAmJiB0ZXN0ICEgLWYgIiRhY190ZjIiIHx8CiAgICBhY19jdl9zeXNfbG9uZ19maWxlX25hbWVzPW5vCiAgcm0gLWYgLXIgIiRhY194ZGlyIiAyPi9kZXYvbnVsbAogIHRlc3QgJGFjX2N2X3N5c19sb25nX2ZpbGVfbmFtZXMgPSBubyAmJiBicmVhawpkb25lXSkKaWYgdGVzdCAkYWNfY3Zfc3lzX2xvbmdfZmlsZV9uYW1lcyA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX0xPTkdfRklMRV9OQU1FUywgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91IHN1cHBvcnQgZmlsZSBuYW1lcyBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMzYKbTRfbG9jYXRpb24oX0FDX0ZVTkNfVkZPUkspLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxODQ1ClQzNCwzMAptNF9sb2NhdGlvbihBQ19MQU5HX0ZVTkNfTElOS19UUlkpLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MjgwClQyOSwyMTIKX0FDX0NIRUNLX0hFQURFUl9QUkVQUk9DX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTJdLCBbJFtdM10sCiAgW0FDX1BSRVBST0NfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbQCU6QGluY2x1ZGUgPCRbXTI+XSldLAoJCSAgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbeWVzXSldLAoJCSAgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbbm9dKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUMTgsNjUKQUNfTEFOR19QUkVQUk9DKEMpX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ1BQXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDM0Cm00X2xvY2F0aW9uKF9BQ19ET19UT0tFTlMpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjQwMwpUMTQsMTU5CmFjX2N2X3Byb2dfZ3h4X200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYGFjX2N2X3Byb2dfZ3h4JyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAphY19jdl9jeHhfY29tcGlsZXJfZ251W11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDAKX200X3dhcm4KVDksMjIyNgpBQ19PVVRQVVRkbmwgRGlzcGF0Y2ggdGhlIGV4dHJhIGFyZ3VtZW50cyB0byB0aGVpciBuYXRpdmUgbWFjcm9zLgptNF9pZnZhbG4oWyQxXSwKCSAgW0FDX0NPTkZJR19GSUxFUyhbJDFdKV0pZG5sCm00X2lmdmFsbihbJDIkM10sCgkgIFtBQ19DT05GSUdfQ09NTUFORFMoZGVmYXVsdCwgWyQyXSwgWyQzXSldKWRubAptNF9pZnZhbChbJDEkMiQzXSwKCSBbQUNfRElBR05PU0UoW29ic29sZXRlXSwKCQkgICAgICBbJDAgc2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhcmd1bWVudHMuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSldKWRubApBQ19DQUNIRV9TQVZFCgp0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CiMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4Lgp0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCgptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwgW0RFRlM9LURIQVZFX0NPTkZJR19IXSwgW0FDX09VVFBVVF9NQUtFX0RFRlMoKV0pCgpkbmwgQ29tbWFuZHMgdG8gcnVuIGJlZm9yZSBjcmVhdGluZyBjb25maWcuc3RhdHVzLgpBQ19PVVRQVVRfQ09NTUFORFNfUFJFKClkbmwKCjogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgphY193cml0ZV9mYWlsPTAKYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKX0FDX09VVFBVVF9DT05GSUdfU1RBVFVTKClkbmwKYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKCnRlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CiAgQUNfTVNHX0VSUk9SKFt3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTXSkKCmRubCBDb21tYW5kcyB0byBydW4gYWZ0ZXIgY29uZmlnLnN0YXR1cyB3YXMgY3JlYXRlZApBQ19PVVRQVVRfQ09NTUFORFNfUE9TVCgpZG5sCgojIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCiMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgojIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgojIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAojIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCiAgYWNfY3Nfc3VjY2Vzcz06CiAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQogIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCiAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAogICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCiAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KICAkYWNfY3Nfc3VjY2VzcyB8fCBBU19FWElUKFsxXSkKZmkKZG5sIGNvbmZpZy5zdGF0dXMgc2hvdWxkIG5vdCBkbyByZWN1cnNpb24uCkFDX1BST1ZJREVfSUZFTFNFKFtBQ19DT05GSUdfU1VCRElSU10sIFtfQUNfT1VUUFVUX1NVQkRJUlMoKV0pZG5sCmlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCiAgQUNfTVNHX1dBUk4oW3VucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHNdKQpmaQoKVDI2LDMzCm00X2xvY2F0aW9uKF9BQ19QUk9HX0ZDX1YpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6NTgxClQzMSwzMQptNF9sb2NhdGlvbihBQ19FUkxBTkdfTkVFRF9FUkwpLi4vLi4vbGliL2F1dG9jb25mL2VybGFuZy5tNDo4NgpUMTcsMTEwNQpBQ19GVU5DX0dFVEdST1VQU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19UWVBFX0dFVEdST1VQU10pZG5sCkFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKQUNfQ0hFQ0tfRlVOQyhnZXRncm91cHMpCgojIElmIHdlIGRvbid0IHlldCBoYXZlIGdldGdyb3Vwcywgc2VlIGlmIGl0J3MgaW4gLWxic2QuCiMgVGhpcyBpcyByZXBvcnRlZCB0byBiZSBuZWNlc3Nhcnkgb24gYW4gSVRPUyAzMDAwV1MgcnVubmluZyBTRUlVWCAzLjEuCmFjX3NhdmVfTElCUz0kTElCUwppZiB0ZXN0ICRhY19jdl9mdW5jX2dldGdyb3VwcyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfTElCKGJzZCwgZ2V0Z3JvdXBzLCBbR0VUR1JPVVBTX0xJQj0tbGJzZF0pCmZpCgojIFJ1biB0aGUgcHJvZ3JhbSB0byB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBzeXN0ZW0tc3VwcGxpZWQKIyBnZXRncm91cHMgZnVuY3Rpb24gb25seSBpZiB0aGVyZSBpcyBzdWNoIGEgZnVuY3Rpb24uCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzID0geWVzOyB0aGVuCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIGdldGdyb3Vwc10sIGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzLAogICBbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwKICAgICAgW1svKiBPbiBVbHRyaXggNC4zLCBnZXRncm91cHMgKDAsIDApIGFsd2F5cyBmYWlscy4gICovCiAgICAgICByZXR1cm4gZ2V0Z3JvdXBzICgwLCAwKSA9PSAtMTtdXSldLAoJCSAgW2FjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPXllc10sCgkJICBbYWNfY3ZfZnVuY19nZXRncm91cHNfd29ya3M9bm9dLAoJCSAgW2FjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPW5vXSkKICAgXSkKZWxzZQogIGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPW5vCmZpCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfR0VUR1JPVVBTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSB3b3JraW5nIGBnZXRncm91cHMnIGZ1bmN0aW9uLl0pCmZpCkxJQlM9JGFjX3NhdmVfTElCUwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDIzCkFDX0RFRklORV9VTlFVT1RFRF9BQ19ERUZJTkVfUShbXyQwXSwgJEApClQyNywzMAptNF9sb2NhdGlvbihfQVNfTUVfUFJFUEFSRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjExMjIKVDIwLDI5Cm00X2xvY2F0aW9uKEFTX0VYSVQpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo1ODUKVDI0LDMzCm00X2xvY2F0aW9uKEFDX1RJTUVaT05FKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo4MApUMjUsMzAKbTRfbG9jYXRpb24oQUNfUEFUSF9YVFJBKS4uLy4uL2xpYi9hdXRvY29uZi9saWJzLm00OjM2NQpUMjgsMzIKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfSEVBREVSKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjY3ClQyMSw0NzkKX0FTX1ZBUl9BUklUSF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX0ZVTkNUSU9OX0RFU0NSSUJFKFthc19mbl9hcml0aF0sIFtBUkcuLi5dLApbUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluCnRoZSBnbG9iYWwgJGFzX3ZhbC4gIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4KVGhlIGFyZ3VtZW50cyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci5dKQpBU19JRihbX0FTX1JVTihbIkFTX0VTQ0FQRShtNF9xdW90ZShfQVNfVkFSX0FSSVRIX1dPUktTKSkiXSldLApbZXZhbCAnYXNfZm5fYXJpdGggKCkKICB7CiAgICBhc192YWw9JCgoICRbXSogKSkKICB9J10sClthc19mbl9hcml0aCAoKQogIHsKICAgIGFzX3ZhbD1gZXhwciAiJFtdQCIgfHwgdGVzdCAkPyAtZXEgMWAKICB9XSkgIyBhc19mbl9hcml0aApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDcyCkFDX1BST0dfUkFOTElCX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCw0MzQKX0FDX1BSRVBST0NfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9jcHBdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfdHJ5X2NwcF0sIFtMSU5FTk9dLAogICAgW1RyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC5dKV0sCiAgWyQwX0JPRFldKW00X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pQVNfSUYoW2FjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fdHJ5X2NwcCAiJExJTkVOTyJdLCBbJDJdLCBbJDNdKQpybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaVtdbTRfaWZ2YWwoWyQxXSwgWyBjb25mdGVzdC4kYWNfZXh0XSlbXWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDQzNwpBQ19BUkdfRU5BQkxFX200X2RlZnVuX3BybyhbJDBdKUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUkVTRVJWRV9IRUxQX09SREVSXSwKW10sClttNF9kaXZlcnRfb25jZShbSEVMUF9FTkFCTEVdLCBbWwpPcHRpb25hbCBGZWF0dXJlczoKICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCiAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQogIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc11dXSldKWRubAptNF9kaXZlcnRfb25jZShbSEVMUF9FTkFCTEVdLCBbJDJdKWRubApfQUNfRU5BQkxFX0lGKFtlbmFibGVdLCBbJDFdLCBbJDNdLCBbJDRdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDIxOAptNF9tYXBfYXJnc19zZXBtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkI10pXSwKICAgICAgIFskI10sIFsxXSwgW10sCiAgICAgICBbJCNdLCBbMl0sIFtdLAogICAgICAgWyQjXSwgWzNdLCBbXSwKICAgICAgIFskI10sIFs0XSwgWyQxWyQ0XSQyW11dLAogICAgICAgWyQxWyQ0XSQyW11fbTRfZm9yZWFjaChbJDNbXSQxXSwgWyQyXSwgbTRfc2hpZnQzKCRAKSldKQpUMjcsMzMKbTRfbG9jYXRpb24oQUNfSEVMUF9TVFJJTkcpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3ClQyMCwzMzQKQUNfSEVBREVSX1RJT0NHV0lOU1pfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0hFQURFUl9USU9DR1dJTlNaX0lOX1RFUk1JT1NfSAppZiB0ZXN0ICRhY19jdl9zeXNfdGlvY2d3aW5zel9pbl90ZXJtaW9zX2ggIT0geWVzOyB0aGVuCiAgX0FDX0hFQURFUl9USU9DR1dJTlNaX0lOX1NZU19JT0NUTAogIGlmIHRlc3QgJGFjX2N2X3N5c190aW9jZ3dpbnN6X2luX3N5c19pb2N0bF9oID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoR1dJTlNaX0lOX1NZU19JT0NUTCwxLAoJICAgICAgW0RlZmluZSB0byAxIGlmIGBUSU9DR1dJTlNaJyByZXF1aXJlcyA8c3lzL2lvY3RsLmg+Ll0pCiAgZmkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSw3NgpBQ19MQU5HX0NPTkZURVNUKEMrKyljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci8qIGVuZCBjb25mZGVmcy5oLiAgKi8KJDEKX0FDRU9GClQyMiwzMAptNF9sb2NhdGlvbihBU19URVNUX1gpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxMDkwClQyMywzNAptNF9sb2NhdGlvbihBQ19GQ19GVU5DKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjExMjEKRjUsNQppZmRlZmlmZGVmClQyMCwxMTMKX0FDX0VOQUJMRV9JRl9BQ1RJT05tNF9hcHBlbmRfdW5pcShbX0FDX1VTRVJfT1BUU10sIFskMV8kMl0sIFsKXSlkbmwKQVNfSUYoW3Rlc3QgIiR7JDFfJDIrc2V0fSIgPSBzZXRdLCBbJDF2YWw9JCQxXyQyOyAkM10sIFskNF0pZG5sCgpUMjgsMzMKbTRfbG9jYXRpb24oX0FDX0lOSVRfU1JDRElSKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjUxMApUMjgsMzAKbTRfbG9jYXRpb24oX0FDX0xBTkdfQUJCUkVWKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE0MQpUMjgsMzEKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfU0laRU9GKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo3NzMKVDgsMTUwCm00X2RlZnVubTRfZGVmaW5lKFttNF9sb2NhdGlvbigkMSldLCBtNF9sb2NhdGlvbiltNF9kZWZhdWx0KFskM10sIFttNF9kZWZpbmVdKShbJDFdLAogIFtfbTRfZGVmdW5fcHJvKF1tNF9kcXVvdGUoJFswXSlbKSQyW11fbTRfZGVmdW5fZXBpKF1tNF9kcXVvdGUoJFswXSlbKV0pClQzMCwyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oRm9ydHJhbilBQ19MQU5HX1BST0dSQU0oW10sIFtdKQpUMzAsNTIzCkFDX1RZUEVfVU5TSUdORURfTE9OR19MT05HX0lOVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnRdLAogICAgW2FjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nX2ludF0sCiAgICBbYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmdfaW50PXllcwogICAgIGlmIHRlc3QgIngke2FjX2N2X3Byb2dfY2NfYzk5LW5vfSIgPSB4bm87IHRoZW4KICAgICAgIEFDX0xJTktfSUZFTFNFKAoJIFtfQUNfVFlQRV9MT05HX0xPTkdfU05JUFBFVF0sCgkgW10sCgkgW2FjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nX2ludD1ub10pCiAgICAgZmldKQogIGlmIHRlc3QgJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nX2ludCA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKFtIQVZFX1VOU0lHTkVEX0xPTkdfTE9OR19JTlRdLCBbMV0sCiAgICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgdW5zaWduZWQgbG9uZyBsb25nIGludCcuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDIyMQpBQ19NSU5HVzMyX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX01JTkdXMzInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NBTk9OSUNBTF9IT1NUCmNhc2UgJGhvc3Rfb3MgaW4KICAqbWluZ3czMiogKSBNSU5HVzMyPXllczs7CgkgICogKSBNSU5HVzMyPW5vOzsKZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjYsNgpzeXNjbWRzeXNjbWQKVDMwLDMzCm00X2xvY2F0aW9uKF9BQ19MSU5LRVJfT1BUSU9OKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjEyMwpUMjgsMzMKbTRfbG9jYXRpb24oQUNfSEFWRV9IRUFERVJTKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDozNQpUMTgsNTAKX200X3NldF9jb250ZW50c18xX200X3N0YWNrX3JldmVyc2UoW19tNF9zZXQoWyQxXSldLCBbX200X3NldF8oJDEpXSkKRjgsOApwYXRzdWJzdHBhdHN1YnN0ClQxMSwxMTAKbTRfcGF0c3Vic3RtNF9leHBhbmRfb25jZShbbTRfd2Fybihbc3ludGF4XSwKCQkgW2RvIG5vdCB1c2UgbTRfcGF0c3Vic3Q6IHVzZSBwYXRzdWJzdCBvciBtNF9icGF0c3Vic3RdKV0pZG5sCnBhdHN1YnN0KCRAKQpUMzQsMzQKbTRfbG9jYXRpb24oX0FDX0xJQk9CSlNfTk9STUFMSVpFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI5NDkKVDE4LDk0Cl9tNF9zZXRfY29udGVudHNfMl9tNF9zdGFja19yZXZlcnNlKFtfbTRfc2V0XygkMSldLCBbX200X3NldChbJDFdKV0sCiAgWyQyW11fbTRfZGVmbihbX200X3NldF8oJDEpXSkkM10sIFskNFtdXSkKVDE1LDMyMwpBQ19MQU5HKEVybGFuZylhY19leHQ9ZXJsCmFjX2NvbXBpbGU9JyRFUkxDICRFUkxDRkxBR1MgLWIgYmVhbSBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2xpbms9JyRFUkxDICRFUkxDRkxBR1MgLWIgYmVhbSBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQgJiYgZWNobyAiWyNdIS9iaW4vc2giID4gY29uZnRlc3QkYWNfZXhlZXh0ICYmIEFTX0VDSE8oWyJcIiRFUkxcIiAtcnVuIGNvbmZ0ZXN0IHN0YXJ0IC1ydW4gaW5pdCBzdG9wIC1ub3NoZWxsIl0pID4+IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiBjaG1vZCAreCBjb25mdGVzdCRhY19leGVleHQnCgpUMjcsMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9TSVpFX1QpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjYwMgpUMjcsMzMKbTRfbG9jYXRpb24oQUNfSEVBREVSX1NUQVQpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6NTY0ClQ4LDgxCm00X2Nob21wbTRfZm9ybWF0KFtbJS4qc11dLCBtNF9pbmRleChtNF90cmFuc2xpdChbWyQxXV0sIFsKLy5dLCBbLyAgXSlbLi8uXSwgWy8uXSksIFskMV0pClQyNCwzCl9tNF9kaXZlcnQoSU5JVF9QUkVQQVJFKTMwMApUMTAsNjgKX0FTX1RSX0NQUF9BU19MSVRFUkFMX0lGKFskMV0sIFsqXVsJIF1bCl0pKFtdLCBbJDBfSU5ESVJdLCBbJDBfTElURVJBTF0pKFskMV0pClQxNiwyODMKX0FTX1RFU1RfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFX1NIRUxMX0ZOKFthc19mbl9leGVjdXRhYmxlX3BdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYXNfZm5fZXhlY3V0YWJsZV9wXSwgW0ZJTEVdLAogICAgW1Rlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5dKV0sCiAgWyAgdGVzdCAtZiAiJFtdMSIgJiYgdGVzdCAteCAiJFtdMSJdKWFzX3Rlc3RfeD0ndGVzdCAteCcKYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDMwMwpfQVNfRUNIT19OX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KY2FzZSBgZWNobyAtbiB4YCBpbiBAJTpAKCgoKCgKLW4qKQogIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgogICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgogIHh5KSAgRUNIT19DPSdcYyc7OwogICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKICAgICAgIEVDSE9fVD0nCSc7OwogIGVzYWM7OwoqKQogIEVDSE9fTj0nLW4nOzsKZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDM2NQpfQUNfSU5JVF9OT1RJQ0VtNF9jbGVhcmRpdmVydChbSEVBREVSLUNPTU1FTlRdKW00X2RpdmVydF90ZXh0KFtIRUFERVItQ09NTUVOVF0sCltAJTpAIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCkAlOkAgR2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HW11kbmwKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfU1RSSU5HXSwgWyBmb3IgQUNfUEFDS0FHRV9TVFJJTkddKS5dKQoKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwKCSBbbTRfZGl2ZXJ0X3RleHQoW0hFQURFUi1DT01NRU5UXSwKCQkJIFtAJTpACkAlOkAgUmVwb3J0IGJ1Z3MgdG8gPEFDX1BBQ0tBR0VfQlVHUkVQT1JUPi5dKV0pCgpUOSwwCkFOX09VVFBVVApUMjcsMzUKbTRfbG9jYXRpb24oQUNfRlVOQ19BTExPQ0EpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDozNjIKVDMwLDM0Cm00X2xvY2F0aW9uKEFDX0ZDX0xJTkVfTEVOR1RIKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjE0ODYKVDI5LDMzCm00X2xvY2F0aW9uKEFDX0NIRUNLX0hFQURFUlMpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6MjQ5ClQyMywxMDMKQUNfTEFOR19QUkVQUk9DKEVybGFuZylfbTRfZGVmdW5fcHJvKFskMF0pbTRfd2Fybihbc3ludGF4XSwKCSBbJDA6IE5vIHByZXByb2Nlc3NvciBkZWZpbmVkIGZvciBdX0FDX0xBTkcpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxOTgwCkFDX0ZDX0NIRUNLX0JPVU5EU19tNF9kZWZ1bl9vbmNlKFtBQ19GQ19DSEVDS19CT1VORFNdLCBbQUNfTEFOR19QVVNIKFtGb3J0cmFuXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBGb3J0cmFuIGZsYWcgdG8gZW5hYmxlIGFycmF5LWJvdW5kcyBjaGVja2luZ10sCiAgICAgICAgICAgICAgIFthY19jdl9mY19jaGVja19ib3VuZHNdLApbYWNfY3ZfZmNfY2hlY2tfYm91bmRzPXVua25vd24KYWNfZmNfY2hlY2tfYm91bmRzX0ZDRkxBR1Nfc2F2ZT0kRkNGTEFHUwpmb3IgYWNfZmxhZyBpbiAtZmNoZWNrPWJvdW5kcyAtZmJvdW5kcy1jaGVjayAtY2hlY2tfYm91bmRzIC1NYm91bmRzIC1xY2hlY2sgXAogICAgICAgICAgICAgICAnLWNoZWNrIGJvdW5kcycgK2NoZWNrPWFsbCAtLWNoZWNrICctUmIgLVJjJyAtQ0IgLUM9YWxsIC1DIFwKICAgICAgICAgICAgICAgLWZmb3J0cmFuLWJvdW5kcy1jaGVjayAiLS1jaGsgZSxzIiAiLWNoayBlIC1jaGsgcyIgLWJvdW5kcwpkbwogIEZDRkxBR1M9IiRhY19mY19jaGVja19ib3VuZHNfRkNGTEFHU19zYXZlICRhY19mbGFnIgogICMgV2Ugc2hvdWxkIGJlIGFibGUgdG8gbGluayBhIGNvcnJlY3QgcHJvZ3JhbS4KICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbXSldLAogICAgW0FDX0xJTktfSUZFTFNFKFtbCiAgICAgIHN1YnJvdXRpbmUgc3ViKGEpCiAgICAgIGludGVnZXIgYSg6KQogICAgICBhKDgpID0gMAogICAgICBlbmQgc3Vicm91dGluZQoKICAgICAgcHJvZ3JhbSBtYWluCiAgICAgIGludGVnZXIgYSgxOjcpCiAgICAgIGludGVyZmFjZQogICAgICAgICBzdWJyb3V0aW5lIHN1YihhKQogICAgICAgICBpbnRlZ2VyIGEoOikKICAgICAgICAgZW5kIHN1YnJvdXRpbmUKICAgICAgZW5kIGludGVyZmFjZQoKICAgICAgY2FsbCBzdWIoYSkKICAgICAgZW5kIHByb2dyYW1dXSwKICAgICAgIFsjIElmIHdlIGNhbiBydW4gdGhlIHByb2dyYW0sIHJlcXVpcmUgZmFpbHVyZSBhdCBydW4gdGltZS4KCSMgSW4gY3Jvc3MtY29tcGlsaW5nIG1vZGUsIHdlIHJlbHkgb24gdGhlIGNvbXBpbGVyIG5vdCBhY2NlcHRpbmcKCSMgdW5rbm93biBvcHRpb25zLgoJQVNfSUYoW3Rlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzXSwKCSAgW2FjX2N2X2ZjX2NoZWNrX2JvdW5kcz0kYWNfZmxhZzsgYnJlYWtdLAoJICBbQVNfSUYoW19BQ19ET19UT0tFTlMoLi9jb25mdGVzdCRhY19leGVleHQpXSwKCSAgICAgW10sCgkgICAgIFthY19jdl9mY19jaGVja19ib3VuZHM9JGFjX2ZsYWc7IGJyZWFrXSldKV0pXSkKZG9uZQpybSAtZiBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dCBcCiAgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qCkZDRkxBR1M9JGFjX2ZjX2NoZWNrX2JvdW5kc19GQ0ZMQUdTX3NhdmUKXSkKaWYgdGVzdCAieCRhY19jdl9mY19jaGVja19ib3VuZHMiID0geHVua25vd247IHRoZW4KICBtNF9kZWZhdWx0KFskMl0sCiAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtubyBGb3J0cmFuIGZsYWcgZm9yIGJvdW5kcyBjaGVja2luZyBmb3VuZF0sIDc3KV0pCmVsc2UKICBpZiB0ZXN0ICJ4JGFjX2N2X2ZjX2NoZWNrX2JvdW5kcyIgIT0geG5vbmU7IHRoZW4KICAgIEZDRkxBR1M9IiRGQ0ZMQUdTICRhY19jdl9mY19jaGVja19ib3VuZHMiCiAgZmkKICAkMQpmaQpBQ19MQU5HX1BPUChbRm9ydHJhbl0pZG5sCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19GQ19DSEVDS19CT1VORFNdKW00X3VucXVvdGUoXSwgWylfbTRfZGVmdW5fZXBpKFtBQ19GQ19DSEVDS19CT1VORFNdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfRkNfQ0hFQ0tfQk9VTkRTXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfRkNfQ0hFQ0tfQk9VTkRTXSxdLCBbLCBfbTRfZGl2ZXJ0X2R1bXApXV0pKQpUMjksMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9VSU5UMTZfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjI5ClQxMyw4MgptNF9kcXVvdGVfZWx0bTRfaWYoWyQjXSwgWzBdLCBbXSwKICAgICAgIFskI10sIFsxXSwgW1tbJDFdXV0sCiAgICAgICBbW1skMV1dLCQwKG00X3NoaWZ0KCRAKSldKQpUMjQsMzIKbTRfZGVmYXVsdF9uYmxhbmtfcXVvdGVkbTRfaWZibGFuayhbJDFdLCBbWyQyXV0sIFtbJDFdXSkKVDExLDgxCkFDX1BST0dfQVdLX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1BST0dTKEFXSywgZ2F3ayBtYXdrIG5hd2sgYXdrLCApW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxMjcyCkFDX0ZVTkNfU1RSRVJST1JfUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19ERUNMUyhbc3RyZXJyb3Jfcl0pCkFDX0NIRUNLX0ZVTkNTKFtzdHJlcnJvcl9yXSkKQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKl0sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcCwKICAgWwogICAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD1ubwogICAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsX3N0cmVycm9yX3IgPSB5ZXM7IHRoZW4KICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCglbWwoJICBjaGFyIGJ1ZlsxMDBdOwoJICBjaGFyIHggPSAqc3RyZXJyb3JfciAoMCwgYnVmLCBzaXplb2YgYnVmKTsKCSAgY2hhciAqcCA9IHN0cmVycm9yX3IgKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CgkgIHJldHVybiAhcCB8fCB4OwoJXV0pXSwKCQkJYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD15ZXMpCiAgICBlbHNlCiAgICAgICMgc3RyZXJyb3JfciBpcyBub3QgZGVjbGFyZWQuICBDaG9vc2UgYmV0d2VlbgogICAgICAjIHN5c3RlbXMgdGhhdCBoYXZlIHJlbGF0aXZlbHkgaW5hY2Nlc3NpYmxlIGRlY2xhcmF0aW9ucyBmb3IgdGhlCiAgICAgICMgZnVuY3Rpb24uICBCZU9TIGFuZCBERUMgVU5JWCA0LjAgZmFsbCBpbiB0aGlzIGNhdGVnb3J5LCBidXQgdGhlCiAgICAgICMgZm9ybWVyIGhhcyBhIHN0cmVycm9yX3IgdGhhdCByZXR1cm5zIGNoYXIqLCB3aGlsZSB0aGUgbGF0dGVyCiAgICAgICMgaGFzIGEgc3RyZXJyb3JfciB0aGF0IHJldHVybnMgYGludCcuCiAgICAgICMgVGhpcyB0ZXN0IHNob3VsZCBzZWdmYXVsdCBvbiB0aGUgREVDIHN5c3RlbS4KICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUCglleHRlcm4gY2hhciAqc3RyZXJyb3JfciAoKTtdLAoJW1tjaGFyIGJ1ZlsxMDBdOwoJICBjaGFyIHggPSAqc3RyZXJyb3JfciAoMCwgYnVmLCBzaXplb2YgYnVmKTsKCSAgcmV0dXJuICEgaXNhbHBoYSAoeCk7XV0pXSwKCQkgICAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD15ZXMsICwgOikKICAgIGZpCiAgXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcCA9IHllczsgdGhlbgogIEFDX0RFRklORShbU1RSRVJST1JfUl9DSEFSX1BdLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMzYKbTRfbG9jYXRpb24oQUNfVVRJTUVfTlVMTCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE3NzkKVDI4LDMzCm00X2xvY2F0aW9uKEFDX0hFQURFUl9DSEVDSykuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6MzYKVDksNTcKbTRfYXBwZW5kbTRfZGVmaW5lKFskMV0sIG00X2lmZGVmKFskMV0sIFtfbTRfZGVmbihbJDFdKVskM11dKVskMl0pClQyMiwxMjIKX0FDX0xBTkdfSU9fUFJPR1JBTShDKUFDX0xBTkdfUFJPR1JBTShbQCU6QGluY2x1ZGUgPHN0ZGlvLmg+XSwKW0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CiByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Cl0pClQxMSwzNwptNF9saXN0X2NtcF8kMF9yYXcobTRfZHF1b3RlKCQxKSwgbTRfZHF1b3RlKCQyKSkKVDcsODQKX200X2ZvciQ0WyQxXSQ1W11tNF9pZihbJDFdLCBbJDJdLCBbXSwKCQkgWyQwKG00X2V2YWwoWyQxICsgJDNdKSwgWyQyXSwgWyQzXSwgWyQ0XSwgWyQ1XSldKQpUOCwxMjQKX0FDX0VWQUxfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1JVTl9MT0coW2V2YWwgJDFdLAoJICAgICBbZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkMVwiIl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw1MwpfQUNfRE9fVkFSX200X2RlZnVuX3BybyhbJDBdKV9BQ19ETyhbJCQxXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDkwCl9BQ19DT01QSUxFUl9PQkpFWFRfUkVKRUNUKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNClQxMiw3OAptNF9mb3JlYWNoX3dtNF9wdXNoZGVmKFskMV0pbTRfbWFwX2FyZ3NfdyhbJDJdLAogIFttNF9kZWZpbmUoWyQxXSxdLCBbKSQzXSltNF9wb3BkZWYoWyQxXSkKVDUsMTEzCkFTX0lGX200X2RlZnVuX3BybyhbJDBdKWlmICQxOyB0aGVuIDoKICAkMgptNF9tYXBfYXJnc19wYWlyKFtfJDBdLCBbXyQwX0VMU0VdLCBtNF9zaGlmdDIoJEApKWZpW11bXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDU2CkFDX1RZUEVfSU5UMzJfVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfVFlQRV9JTlQoMzIpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwyCkFDX0xBTkdfU09VUkNFKEdvKSQxClQzMywzMwptNF9sb2NhdGlvbihfQUNfT1VUUFVUX01BSU5fTE9PUCkuLi8uLi9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjE1OTkKVDI0LDMwCm00X2xvY2F0aW9uKEFDX0xBTkdfUE9QKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEwNwpUMTEsMTY1Cl9tNF9kdW1wZGVmbTRfaWYoWyQjXSwgWzBdLCBbbTRfZmF0YWwoWyQwOiBtaXNzaW5nIGFyZ3VtZW50XSldLAogICAgICAgWyQjXSwgWzFdLCBbbTRfYnVpbHRpbihbZHVtcGRlZl0sIFskMV0pXSwKICAgICAgIFttNF9tYXBfYXJnc19zZXAoW200X2J1aWx0aW4oW2R1bXBkZWZdLF0sIFspXSwgW10sICRAKV0pClQyMCwzCl9tNF9kaXZlcnQoU0hFTExfRk4pMjUwClQyNywxOTEyCl9BQ19DT01QSUxFUl9FWEVFWFRfREVGQVVMVCMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgojIG9mIGV4ZWV4dC4KQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBfQUNfTEFORyBjb21waWxlciB3b3Jrc10pCmFjX2xpbmtfZGVmYXVsdD1gQVNfRUNITyhbIiRhY19saW5rIl0pIHwgc2VkIFsncy8gLW8gKmNvbmZ0ZXN0W14gXSovLyddYAoKIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgphY19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgoKYWNfcm1maWxlcz0KZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCmRvCiAgY2FzZSAkYWNfZmlsZSBpbgogICAgX0FDX0NPTVBJTEVSX0VYRUVYVF9SRUpFQ1QgKSA7OwogICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CiAgZXNhYwpkb25lCnJtIC1mICRhY19ybWZpbGVzCgpBU19JRihbX0FDX0RPX1ZBUihhY19saW5rX2RlZmF1bHQpXSwKWyMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgojIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwojIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAojIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwojIEF1dG9jb25mLgpmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKZG8KICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKICBjYXNlICRhY19maWxlIGluCiAgICBfQUNfQ09NUElMRVJfRVhFRVhUX1JFSkVDVCApCgk7OwogICAgW1thYl1dLm91dCApCgkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAoJIyBjZXJ0YWlubHkgcmlnaHQuCglicmVhazs7CiAgICAqLiogKQoJaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Cgl0aGVuIDo7IGVsc2UKCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogWydbXi5dKlwoXC4uKlwpJ11gCglmaQoJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90CgkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgoJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCgkjIGFjdHVhbGx5IHdvcmtpbmcuCglicmVhazs7CiAgICAqICkKCWJyZWFrOzsKICBlc2FjCmRvbmUKdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Cl0sCiAgICAgIFthY19maWxlPScnXSkKQVNfSUYoW3Rlc3QgLXogIiRhY19maWxlIl0sCltBQ19NU0dfUkVTVUxUKFtub10pCl9BQ19NU0dfTE9HX0NPTkZURVNUCkFDX01TR19GQUlMVVJFKFtfQUNfTEFORyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzXSwgNzcpXSwKW0FDX01TR19SRVNVTFQoW3llc10pXSkKQUNfTVNHX0NIRUNLSU5HKFtmb3IgX0FDX0xBTkcgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lXSkKQUNfTVNHX1JFU1VMVChbJGFjX2ZpbGVdKQphY19leGVleHQ9JGFjX2N2X2V4ZWV4dAoKVDI0LDY3CkFDX0xBTkdfQ09ORlRFU1QoRXJsYW5nKWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEW10kMQpfQUNFT0YKVDE1LDg5MQpBQ19GVU5DX1NUUk5MRU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TXSlkbmwKQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKSBkbmwgZm9yIGNyb3NzLWNvbXBpbGVzCkFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBzdHJubGVuXSwgYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmcsCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLCBbWwojZGVmaW5lIFMgImZvb2JhciIKI2RlZmluZSBTX0xFTiAoc2l6ZW9mIFMgLSAxKQoKICAvKiBBdCBsZWFzdCBvbmUgaW1wbGVtZW50YXRpb24gaXMgYnVnZ3k6IHRoYXQgb2YgQUlYIDQuMyB3b3VsZAogICAgIGdpdmUgc3RybmxlbiAoUywgMSkgPT0gMy4gICovCgogIGludCBpOwogIGZvciAoaSA9IDA7IGkgPCBTX0xFTiArIDE7ICsraSkKICAgIHsKICAgICAgaW50IGV4cGVjdGVkID0gaSA8PSBTX0xFTiA/IGkgOiBTX0xFTjsKICAgICAgaWYgKHN0cm5sZW4gKFMsIGkpICE9IGV4cGVjdGVkKQoJcmV0dXJuIDE7CiAgICB9CiAgcmV0dXJuIDA7Cl1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5nPXllc10sCgkgICAgICAgW2FjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5nPW5vXSwKCSAgICAgICBbIyBHdWVzcyBubyBvbiBBSVggc3lzdGVtcywgeWVzIG90aGVyd2lzZS4KCQljYXNlICIkaG9zdF9vcyIgaW4KCQkgIGFpeCopIGFjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5nPW5vOzsKCQkgICopICAgIGFjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5nPXllczs7CgkJZXNhY10pXSkKdGVzdCAkYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmcgPSBubyAmJiBBQ19MSUJPQkooW3N0cm5sZW5dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDU0OApfQUNfRlVOQ19SRUFMTE9DX0lGX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCkKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBHTlUgbGliYyBjb21wYXRpYmxlIHJlYWxsb2NdLCBhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsLApbQUNfUlVOX0lGRUxTRSgKW0FDX0xBTkdfUFJPR1JBTSgKW1sjaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBIQVZFX1NURExJQl9ICiMgaW5jbHVkZSA8c3RkbGliLmg+CiNlbHNlCmNoYXIgKnJlYWxsb2MgKCk7CiNlbmRpZgpdXSwKCQkgW3JldHVybiAhIHJlYWxsb2MgKDAsIDApO10pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9ubnVsbD15ZXNdLAoJICAgICAgIFthY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPW5vXSwKCSAgICAgICBbYWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9ubnVsbD1ub10pXSkKQVNfSUYoW3Rlc3QgJGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwgPSB5ZXNdLCBbJDFdLCBbJDJdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDMzCm00X2xvY2F0aW9uKEFDX1BST0dfRkNfQ19PKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjQ3NQpUMjksMzMKbTRfbG9jYXRpb24oQUNfUFJPR1JBTV9DSEVDSykuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NDEKVDE2LDIKQUNfTEFOR19TT1VSQ0UoKSQxClQyMiw3NzcKQUNfRkNfTU9EVUxFX0VYVEVOU0lPTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbRm9ydHJhbiA5MCBtb2R1bGUgZXh0ZW5zaW9uXSwgW2FjX2N2X2ZjX21vZHVsZV9leHRdLApbQUNfTEFOR19QVVNIKEZvcnRyYW4pCm1rZGlyIGNvbmZ0ZXN0LmRpcgpjZCBjb25mdGVzdC5kaXIKYWNfY3ZfZmNfbW9kdWxlX2V4dD11bmtub3duCkFDX0NPTVBJTEVfSUZFTFNFKFtbCiAgICAgIG1vZHVsZSBjb25mdGVzdF9tb2R1bGUKICAgICAgY29udGFpbnMKICAgICAgc3Vicm91dGluZSBjb25mdGVzdF9yb3V0aW5lCiAgICAgIHdyaXRlKCosJyhhKScpICdnb3RjaGEhJwogICAgICBlbmQgc3Vicm91dGluZQogICAgICBlbmQgbW9kdWxlXV0sCiAgW2FjX2N2X2ZjX21vZHVsZV9leHQ9YGxzIHwgc2VkIC1uICdzLGNvbmZ0ZXN0X21vZHVsZVwuLCxwJ2AKICAgaWYgdGVzdCB4JGFjX2N2X2ZjX21vZHVsZV9leHQgPSB4OyB0aGVuCmRubCBTb21lIEY5MCBjb21waWxlcnMgdXNlIHVwcGVyIGNhc2UgY2hhcmFjdGVycyBmb3IgdGhlIG1vZHVsZSBmaWxlIG5hbWUuCiAgICAgYWNfY3ZfZmNfbW9kdWxlX2V4dD1gbHMgfCBzZWQgLW4gJ3MsQ09ORlRFU1RfTU9EVUxFXC4sLHAnYAogICBmaV0pCmNkIC4uCnJtIC1yZiBjb25mdGVzdC5kaXIKQUNfTEFOR19QT1AoRm9ydHJhbikKXSkKRkNfTU9ERVhUPSRhY19jdl9mY19tb2R1bGVfZXh0CmlmIHRlc3QgIiRGQ19NT0RFWFQiID0gdW5rbm93bjsgdGhlbgogIEZDX01PREVYVD0KZmkKQUNfU1VCU1QoW0ZDX01PREVYVF0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMjA0CkFDX0NBTk9OSUNBTF9TWVNURU1fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ0FOT05JQ0FMX1NZU1RFTScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DQU5PTklDQUxfVEFSR0VUXSwgW0FDX0NBTk9OSUNBTF9UQVJHRVQoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDAKbTRfaW5jbHVkZShhdXRvY29uZi9nZW5lcmFsLm00KQpUNCwxNTYKZGVmbm00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF9kZWZuKFskMV0pXSwKCQkJICAgIFttNF9mYXRhbChbJDA6IHVuZGVmaW5lZCBtYWNybzogJDFdKV0pXSwKICAgICAgIFttNF9tYXBfYXJncyhbJDBdLCAkQCldKQpUMjAsMwpfbTRfZGl2ZXJ0KEhFTFBfRU5EKTEwNgpUMTUsMjY3Cl9BQ19DT05GSUdfRk9PU200X21hcF9hcmdzX3coWyQyXSwgW19BQ19DT05GSUdfUkVHSVNURVIoWyQxXSxdLCBbLCBbJDNdKV0pbTRfZGVmaW5lKFtfQUNfU0VFTl9DT05GSUcoQU5ZKV0pbTRfZGVmaW5lKFtfQUNfU0VFTl9DT05GSUcoJDEpXSlfQUNfQ09ORklHX0NPTU1BTkRTX0lOSVQoWyQ0XSlhY19jb25maWdfW11tNF90b2xvd2VyKFskMV0pPSIkYWNfY29uZmlnX1tdbTRfdG9sb3dlcihbJDFdKSBtNF9pZihbJDFdLCBbQ09NTUFORFNdLCBbJDJdLCBbbTRfbm9ybWFsaXplKFskMl0pXSkiCgpUMjUsMzAKbTRfbG9jYXRpb24oQVNfVkFSX0FSSVRIKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTk4MQpUMTQsNDQxCkFDX0NfVkFSQVJSQVlTX200X2RlZnVuX3BybyhbJDBdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgdmFyaWFibGUtbGVuZ3RoIGFycmF5c10sCiAgICBhY19jdl9jX3ZhcmFycmF5cywKICAgIFtBQ19DT01QSUxFX0lGRUxTRSgKICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW10sCgkgIFtbc3RhdGljIGludCB4OyBjaGFyIGFbKyt4XTsgYVtzaXplb2YgYSAtIDFdID0gMDsgcmV0dXJuIGFbMF07XV0pXSwKICAgICAgIFthY19jdl9jX3ZhcmFycmF5cz15ZXNdLAogICAgICAgW2FjX2N2X2NfdmFyYXJyYXlzPW5vXSldKQogIGlmIHRlc3QgJGFjX2N2X2NfdmFyYXJyYXlzID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW0hBVkVfQ19WQVJBUlJBWVNdLCAxLAogICAgICBbRGVmaW5lIHRvIDEgaWYgQyBzdXBwb3J0cyB2YXJpYWJsZS1sZW5ndGggYXJyYXlzLl0pCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDE4NApBQ19BTExPQ0FfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQUxMT0NBJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfQUxMT0NBXSwgW0FDX0ZVTkNfQUxMT0NBKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxMzEKbTRfc2V0X2FkZF9hbGxtNF9kZWZpbmUoW19tNF9zZXRfc2l6ZSgkMSldLCBtNF9ldmFsKG00X3NldF9zaXplKFskMV0pCiAgKyBtNF9sZW4obTRfaWZkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldLCBbXyQwX2NoZWNrXSwgW18kMF0pKFskMV0sICRAKSkpKQpUMzEsMzYKbTRfbG9jYXRpb24oQUNfRlVOQ19TVFJFUlJPUl9SKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTYyNQpGNyw0Cm00X2luY3JpbmNyCkY4LDQKX200X2RlZm5kZWZuClQzMywzNgpBQ19MQU5HX0ZVTkNfTElOS19UUlkoRm9ydHJhbiA3NylBQ19MQU5HX1BST0dSQU0oW10sClsgICAgICBjYWxsICQxXSkKVDI4LDM0Cm00X2xvY2F0aW9uKF9BQ19DT01QVVRFX0lOVCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDozMDc0ClQxMywxMjQKX200X2RlZnVuX3Byb200X2lmZGVmKFtfbTRfZXhwYW5zaW9uX3N0YWNrXSwgW10sIFtfbTRfZGVmdW5fcHJvX291dGVyKFskMV0pXSltNF9leHBhbnNpb25fc3RhY2tfcHVzaChbJDFdKW00X3B1c2hkZWYoW19tNF9leHBhbmRpbmcoJDEpXSkKVDE1LDExNApBU19WQVJfVEVTVF9TRVRBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwKICBbJHskMSs6fSBmYWxzZV0sCiAgW3sgYXNfdmFyPSQxOyBldmFsIFwkeyRhc192YXIrOn0gZmFsc2U7IH1dLAogIFtldmFsIFwkeyQxKzp9IGZhbHNlXSkKVDcsMTExCkFTX0VYSVRfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX0VYSVRfUFJFUEFSRV0pW11hc19mbl9leGl0IG00X2lmdmFsKFskMV0sIFskMV0sIFskXVs/XSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDEwMwpBQ19MQU5HX1BSRVBST0MoRm9ydHJhbiA3NylfbTRfZGVmdW5fcHJvKFskMF0pbTRfd2Fybihbc3ludGF4XSwKCSBbJDA6IE5vIHByZXByb2Nlc3NvciBkZWZpbmVkIGZvciBdX0FDX0xBTkcpW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywzMAptNF9sb2NhdGlvbihfQVNfQ1JfUFJFUEFSRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjE3OTMKVDEzLDE3NQptNF9kZWZ1bl9pbml0bTRfZGVmaW5lKFskMV0sIFskM1tdXSltNF9kZWZ1bihbJDFdLAogICBbJDJbXV9tNF9wb3BkZWYoXW00X2RxdW90ZSgkWzBdKVspbTRfaW5kaXIoXW00X2RxdW90ZSgkWzBdKWRubApbbTRfaWYoXW00X2RxdW90ZSgkWyNdKVssIFswXSwgW10sIF1tNF9kcXVvdGUoWywkXUApWykpXSwgW200X3B1c2hkZWZdKQpUMTIsNjQKX0FTX0VDSE9fTE9HX0FTX0VDSE8oWyRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJDFdLCBBU19NRVNTQUdFX0xPR19GRClbXQpUMTIsMTMxCl9BU19FQ0hPX0xPR19tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfTElORU5PX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxMTAKQUNfRElWRVJUX1BVU0htNF9kaXZlcnRfc3RhY2tfcHVzaChbJDBdLCBbJDFdKW00X3B1c2hkZWYoW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSwgWyQxXSlfbTRfZGl2ZXJ0X3JhdyhfbTRfZGl2ZXJ0KFskMV0sIFskMl0pKQpUMjksMzMKbTRfbG9jYXRpb24oQUNfSEVBREVSX0RJUkVOVCkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo0ODUKVDE3LDYwNApfQVNfU0hFTExfRk5fV09SS2FzX2ZuX3JldHVybiAoKSB7IChleGl0IFskXTEpOyB9CmFzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQphc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQphc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9CgpleGl0Y29kZT0wCmFzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQphc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KQVNfSUYoWyggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIlskXTEiICldLCBbXSwKICAgICAgW2V4aXRjb2RlPTE7IGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLl0pCnRlc3QgeCRleGl0Y29kZSA9IHgwW10KVDEwLDMKX0FDX0NDKEdvKUdPQwpUMjYsMTE4MApBQ19DX0ZMRVhJQkxFX0FSUkFZX01FTUJFUl9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yIGZsZXhpYmxlIGFycmF5IG1lbWJlcnNdLAogICAgYWNfY3ZfY19mbGV4bWVtYmVyLAogICAgW0FDX0NPTVBJTEVfSUZFTFNFKAogICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKCSAgW1sjaW5jbHVkZSA8c3RkbGliLmg+CgkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CgkgICAgI2luY2x1ZGUgPHN0ZGRlZi5oPgoJICAgIHN0cnVjdCBzIHsgaW50IG47IGRvdWJsZSBkW107IH07XV0sCgkgIFtbaW50IG0gPSBnZXRjaGFyICgpOwoJICAgIHN0cnVjdCBzICpwID0gbWFsbG9jIChvZmZzZXRvZiAoc3RydWN0IHMsIGQpCgkJCQkgICsgbSAqIHNpemVvZiAoZG91YmxlKSk7CgkgICAgcC0+ZFswXSA9IDAuMDsKCSAgICByZXR1cm4gcC0+ZCAhPSAoZG91YmxlICopIE5VTEw7XV0pXSwKICAgICAgIFthY19jdl9jX2ZsZXhtZW1iZXI9eWVzXSwKICAgICAgIFthY19jdl9jX2ZsZXhtZW1iZXI9bm9dKV0pCiAgaWYgdGVzdCAkYWNfY3ZfY19mbGV4bWVtYmVyID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl0sIFtdLAogICAgICBbRGVmaW5lIHRvIG5vdGhpbmcgaWYgQyBzdXBwb3J0cyBmbGV4aWJsZSBhcnJheSBtZW1iZXJzLCBhbmQgdG8KICAgICAgIDEgaWYgaXQgZG9lcyBub3QuICBUaGF0IHdheSwgd2l0aCBhIGRlY2xhcmF0aW9uIGxpa2UgYHN0cnVjdCBzCiAgICAgICB7IGludCBuOyBkb3VibGUgZEA8OkBGTEVYSUJMRV9BUlJBWV9NRU1CRVJAOj5AOyB9OycsIHRoZSBzdHJ1Y3QgaGFjawogICAgICAgY2FuIGJlIHVzZWQgd2l0aCBwcmUtQzk5IGNvbXBpbGVycy4KICAgICAgIFdoZW4gY29tcHV0aW5nIHRoZSBzaXplIG9mIHN1Y2ggYW4gb2JqZWN0LCBkb24ndCB1c2UgJ3NpemVvZiAoc3RydWN0IHMpJwogICAgICAgYXMgaXQgb3ZlcmVzdGltYXRlcyB0aGUgc2l6ZS4gIFVzZSAnb2Zmc2V0b2YgKHN0cnVjdCBzLCBkKScgaW5zdGVhZC4KICAgICAgIERvbid0IHVzZSAnb2Zmc2V0b2YgKHN0cnVjdCBzLCBkQDw6QDBAOj5AKScsIGFzIHRoaXMgZG9lc24ndCB3b3JrIHdpdGgKICAgICAgIE1TVkMgYW5kIHdpdGggQysrIGNvbXBpbGVycy5dKQogIGVsc2UKICAgIEFDX0RFRklORShbRkxFWElCTEVfQVJSQVlfTUVNQkVSXSwgMSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM0LDMzCm00X2xvY2F0aW9uKF9fQUNfRkNfTkFNRV9NQU5HTElORykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo5MjQKVDI3LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfTU9ERV9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MTQKVDIwLDM0Cm00X2xvY2F0aW9uKEFDX0lOSVQpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTM1OApUMjcsMjgKbTRfbG9jYXRpb24oQUNfQ19WQVJBUlJBWVMpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MTg4MgpUMjEsOTcKbTRfY29weXJpZ2h0X2NvbmRlbnNlbTRfdGV4dF93cmFwKG00X2JwYXRzdWJzdChtNF9mbGF0dGVuKFtbJDFdXSksClsoQylbLQkgLDAtOV0qXChbMS05XVswLTldWzAtOV1bMC05XVwpXSwgWyhDKSBcMV0pKQpUMTcsOTUwCl9BQ19UWVBFX0lOVF9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpbnQkW10yX3RdLCBbJFtdM10sCiAgICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pCiAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCiAgICAgIyB0aGFuIGhhbGYgb2YgdGhlIGV4cGVjdGVkIHRhcmdldCB3aWR0aC4KICAgICBmb3IgYWNfdHlwZSBpbiBpbnQkW10yX3QgJ2ludCcgJ2xvbmcgaW50JyBcCgkgJ2xvbmcgbG9uZyBpbnQnICdzaG9ydCBpbnQnICdzaWduZWQgY2hhcic7IGRvCiAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKCSBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgIFtBQ19JTkNMVURFU19ERUZBVUxUCgkgICAgIGVudW0geyBOID0gJFtdMiAvIDIgLSAxIH07XSwKCSAgICBbMCA8ICgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpXSldLAoJIFtBQ19DT01QSUxFX0lGRUxTRSgKCSAgICBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgICAgIFtBQ19JTkNMVURFU19ERUZBVUxUCgkgICAgICAgIGVudW0geyBOID0gJFtdMiAvIDIgLSAxIH07XSwKCSAgICAgICBbKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMSkKCQkgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAyKV0pXSwKCSAgICBbXSwKCSAgICBbQVNfQ0FTRShbJGFjX3R5cGVdLCBbaW50JFtdMl90XSwKCSAgICAgICBbQVNfVkFSX1NFVChbJFtdM10sIFt5ZXNdKV0sCgkgICAgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbJGFjX3R5cGVdKV0pXSldKQogICAgICAgQVNfVkFSX0lGKFskW10zXSwgW25vXSwgW10sIFticmVha10pCiAgICAgZG9uZV0pCiAgQVNfTElORU5PX1BPUAoKVDE3LDE5NgpfQUNfTElCT0JKX1NUUlRPREFDX0xJQk9CSihzdHJ0b2QpCkFDX0NIRUNLX0ZVTkMocG93KQppZiB0ZXN0ICRhY19jdl9mdW5jX3BvdyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfTElCKG0sIHBvdywKCSAgICAgICBbUE9XX0xJQj0tbG1dLAoJICAgICAgIFtBQ19NU0dfV0FSTihbY2Fubm90IGZpbmQgbGlicmFyeSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgcG93XSldKQpmaQoKVDI0LDEyMgpfQUNfTEFOR19JT19QUk9HUkFNKEMrKylBQ19MQU5HX1BST0dSQU0oW0AlOkBpbmNsdWRlIDxzdGRpby5oPl0sCltGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOwogcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpUMzEsMzIKbTRfbG9jYXRpb24oX0FDX0xJU1RfTUVNQkVSX0lGKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00Ojc5ClQxNywyMDMKbTRfY3Jfbm90X0xldHRlcnMBAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyolJicoKSQrLC4vMDEyMzQ1Njc4OTo7PD0+P0BbXF1eX2B7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTUsODA4CkFDX1BST0dfQ1hYX0NfT19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCkFDX0xBTkdfUFVTSChbQysrXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgJENYWCB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXJdLAoJICAgICAgIFthY19jdl9wcm9nX2N4eF9jX29dLApbQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFtdKV0pCiMgV2UgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcKIyBgLm8nIGZpbGUgd2l0aCBgLW8nLCBhbHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KYWNfdHJ5PSckQ1hYICRDWFhGTEFHUyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCnJtIC1mIGNvbmZ0ZXN0Mi4qCmlmIF9BQ19ET19WQVIoYWNfdHJ5KSAmJgogICAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYKICAgICBfQUNfRE9fVkFSKGFjX3RyeSk7IHRoZW4KICBhY19jdl9wcm9nX2N4eF9jX289eWVzCmVsc2UKICBhY19jdl9wcm9nX2N4eF9jX289bm8KZmkKcm0gLWYgY29uZnRlc3QqXSkKaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfY19vID0gbm87IHRoZW4KICBBQ19ERUZJTkUoQ1hYX05PX01JTlVTX0NfTUlOVVNfTywgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBDKysgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQKCSAgICAgLWMgYW5kIC1vIHRvZ2V0aGVyLl0pCmZpCkFDX0xBTkdfUE9QKFtDKytdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDczCkFDX0xBTkdfQ09NUElMRVIoRXJsYW5nKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19FUkxBTkdfUEFUSF9FUkxDXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDEwMDEKQUNfQ09ORklHX1RFU1RESVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ09ORklHX0NPTU1BTkRTKFskMS9hdGNvbmZpZ10sCltjYXQgPiQxL2F0Y29uZmlnIDw8QVRFT0YKQCU6QCBDb25maWd1cmFibGUgdmFyaWFibGUgdmFsdWVzIGZvciBidWlsZGluZyB0ZXN0IHN1aXRlcy4KQCU6QCBHZW5lcmF0ZWQgYnkgJFswXS4KQCU6QCBDb3B5cmlnaHQgKEMpIG00X1BBQ0tBR0VfWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhlIHRlc3Qgc3VpdGUgd2lsbCBkZWZpbmUgdG9wX3NyY2Rpcj0kYXRfdG9wX3NyY2Rpci8uLi8uLiBldGMuCmF0X3Rlc3RkaXI9JyQxJwphYnNfYnVpbGRkaXI9JyRhY19hYnNfYnVpbGRkaXInCmF0X3NyY2Rpcj0nJGFjX3NyY2RpcicKYWJzX3NyY2Rpcj0nJGFjX2Fic19zcmNkaXInCmF0X3RvcF9zcmNkaXI9JyRhY190b3Bfc3JjZGlyJwphYnNfdG9wX3NyY2Rpcj0nJGFjX2Fic190b3Bfc3JjZGlyJwphdF90b3BfYnVpbGRfcHJlZml4PSckYWNfdG9wX2J1aWxkX3ByZWZpeCcKYWJzX3RvcF9idWlsZGRpcj0nJGFjX2Fic190b3BfYnVpbGRkaXInCgojIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBBdXRvdGVzdCA8PSAyLjU5YjoKYXRfdG9wX2J1aWxkZGlyPVwkYXRfdG9wX2J1aWxkX3ByZWZpeAoKQVVUT1RFU1RfUEFUSD0nbTRfZGVmYXVsdChbJDJdLCBbJDFdKScKClNIRUxMPVwke0NPTkZJR19TSEVMTC0nJFNIRUxMJ30KbTRfcHJvdmlkZV9pZihbQUNfRVJMQU5HX1BBVEhfRVJMXSwgWwpFUkw9JyRFUkwnCl0pZG5sCm00X3Byb3ZpZGVfaWYoW0FDX0VSTEFOR19QQVRIX0VSTENdLCBbCkVSTEM9JyRFUkxDJwpFUkxDRkxBR1M9JyRFUkxDRkxBR1MnCl0pZG5sCkFURU9GCl0sClttNF9wcm92aWRlX2lmKFtBQ19FUkxBTkdfUEFUSF9FUkxdLCBbRVJMPSIkRVJMIgpdKW00X3Byb3ZpZGVfaWYoW0FDX0VSTEFOR19QQVRIX0VSTENdLCBbRVJMQz0iJEVSTEMiCkVSTENGTEFHUz0iJEVSTENGTEFHUyIKXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMzQKbTRfbG9jYXRpb24oQUNfUFJFUFJPQ19JRkVMU0UpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjUxOApUMTgsMzIxOQpBQ19GVU5DX0dFVExPQURBVkdfbTRfZGVmdW5fcHJvKFskMF0pYWNfaGF2ZV9mdW5jPW5vICMgeWVzIG1lYW5zIHdlJ3ZlIGZvdW5kIGEgd2F5IHRvIGdldCB0aGUgbG9hZCBhdmVyYWdlLgoKIyBNYWtlIHN1cmUgZ2V0bG9hZGF2Zy5jIGlzIHdoZXJlIGl0IGJlbG9uZ3MsIGF0IGNvbmZpZ3VyZS10aW1lLgp0ZXN0IC1mICIkc3JjZGlyLyRhY19jb25maWdfbGlib2JqX2Rpci9nZXRsb2FkYXZnLmMiIHx8CiAgQUNfTVNHX0VSUk9SKFskc3JjZGlyLyRhY19jb25maWdfbGlib2JqX2Rpci9nZXRsb2FkYXZnLmMgaXMgbWlzc2luZ10pCgphY19zYXZlX0xJQlM9JExJQlMKCiMgQ2hlY2sgZm9yIGdldGxvYWRhdmcsIGJ1dCBiZSBzdXJlIG5vdCB0byB0b3VjaCB0aGUgY2FjaGUgdmFyaWFibGUuCihBQ19DSEVDS19GVU5DKGdldGxvYWRhdmcsIGV4aXQgMCwgZXhpdCAxKSkgJiYgYWNfaGF2ZV9mdW5jPXllcwoKIyBPbiBIUFVYOSwgYW4gdW5wcml2aWxlZ2VkIHVzZXIgY2FuIGdldCBsb2FkIGF2ZXJhZ2VzIHRocm91Z2ggdGhpcyBmdW5jdGlvbi4KQUNfQ0hFQ0tfRlVOQ1MocHN0YXRfZ2V0ZHluYW1pYykKCiMgU29sYXJpcyBoYXMgbGlia3N0YXQgd2hpY2ggZG9lcyBub3QgcmVxdWlyZSByb290LgpBQ19DSEVDS19MSUIoa3N0YXQsIGtzdGF0X29wZW4pCnRlc3QgJGFjX2N2X2xpYl9rc3RhdF9rc3RhdF9vcGVuID0geWVzICYmIGFjX2hhdmVfZnVuYz15ZXMKCiMgU29tZSBzeXN0ZW1zIHdpdGggLWx1dGlsIGhhdmUgKGFuZCBuZWVkKSAtbGt2bSBhcyB3ZWxsLCBzb21lIGRvIG5vdC4KIyBPbiBTb2xhcmlzLCAtbGt2bSByZXF1aXJlcyBubGlzdCBmcm9tIC1sZWxmLCBzbyBjaGVjayB0aGF0IGZpcnN0CiMgdG8gZ2V0IHRoZSByaWdodCBhbnN3ZXIgaW50byB0aGUgY2FjaGUuCiMgRm9yIGtzdGF0IG9uIHNvbGFyaXMsIHdlIG5lZWQgbGliZWxmIHRvIGZvcmNlIHRoZSBkZWZpbml0aW9uIG9mIFNWUjQgYmVsb3cuCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfTElCKGVsZiwgZWxmX2JlZ2luLCBMSUJTPSItbGVsZiAkTElCUyIpCmZpCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfTElCKGt2bSwga3ZtX29wZW4sIExJQlM9Ii1sa3ZtICRMSUJTIikKICAjIENoZWNrIGZvciB0aGUgNC40QlNEIGRlZmluaXRpb24gb2YgZ2V0bG9hZGF2Zy4KICBBQ19DSEVDS19MSUIodXRpbCwgZ2V0bG9hZGF2ZywKICAgIFtMSUJTPSItbHV0aWwgJExJQlMiIGFjX2hhdmVfZnVuYz15ZXMgYWNfY3ZfZnVuY19nZXRsb2FkYXZnX3NldGdpZD15ZXNdKQpmaQoKaWYgdGVzdCAkYWNfaGF2ZV9mdW5jID0gbm87IHRoZW4KICAjIFRoZXJlIGlzIGEgY29tbW9ubHkgYXZhaWxhYmxlIGxpYnJhcnkgZm9yIFJTLzYwMDAgQUlYLgogICMgU2luY2UgaXQgaXMgbm90IGEgc3RhbmRhcmQgcGFydCBvZiBBSVgsIGl0IG1pZ2h0IGJlIGluc3RhbGxlZCBsb2NhbGx5LgogIGFjX2dldGxvYWRhdmdfTElCUz0kTElCUwogIExJQlM9Ii1ML3Vzci9sb2NhbC9saWIgJExJQlMiCiAgQUNfQ0hFQ0tfTElCKGdldGxvYWRhdmcsIGdldGxvYWRhdmcsCgkgICAgICAgW0xJQlM9Ii1sZ2V0bG9hZGF2ZyAkTElCUyJdLCBbTElCUz0kYWNfZ2V0bG9hZGF2Z19MSUJTXSkKZmkKCiMgTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBpbiB0aGUgbGlicmFyeSwgaWYgd2UgdGhpbmsgd2UgZm91bmQgaXQsCiMgb3RoZXJ3aXNlIHNldCB1cCB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24uCkFDX0NIRUNLX0ZVTkNTKGdldGxvYWRhdmcsIFtdLAoJICAgICAgIFtfQUNfTElCT0JKX0dFVExPQURBVkddKQoKIyBTb21lIGRlZmluaXRpb25zIG9mIGdldGxvYWRhdmcgcmVxdWlyZSB0aGF0IHRoZSBwcm9ncmFtIGJlIGluc3RhbGxlZCBzZXRnaWQuCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgZ2V0bG9hZGF2ZyByZXF1aXJlcyBzZXRnaWQsCgkgICAgICAgYWNfY3ZfZnVuY19nZXRsb2FkYXZnX3NldGdpZCwKW0FDX0VHUkVQX0NQUChbWW93emEgQW0gSSBTRVRHSUQgeWV0XSwKWyNpbmNsdWRlICIkc3JjZGlyLyRhY19jb25maWdfbGlib2JqX2Rpci9nZXRsb2FkYXZnLmMiCiNpZmRlZiBMREFWX1BSSVZJTEVHRUQKWW93emEgQW0gSSBTRVRHSUQgeWV0CkAlOkBlbmRpZl0sCgkgICAgICBhY19jdl9mdW5jX2dldGxvYWRhdmdfc2V0Z2lkPXllcywKCSAgICAgIGFjX2N2X2Z1bmNfZ2V0bG9hZGF2Z19zZXRnaWQ9bm8pXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19nZXRsb2FkYXZnX3NldGdpZCA9IHllczsgdGhlbgogIE5FRURfU0VUR0lEPXRydWUKICBBQ19ERUZJTkUoR0VUTE9BREFWR19QUklWSUxFR0VELCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgYGdldGxvYWRhdmcnIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJ1biBzZXR1aWQKCSAgICAgb3Igc2V0Z2lkLl0pCmVsc2UKICBORUVEX1NFVEdJRD1mYWxzZQpmaQpBQ19TVUJTVChORUVEX1NFVEdJRClkbmwKCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0bG9hZGF2Z19zZXRnaWQgPSB5ZXM7IHRoZW4KICBBQ19DQUNIRV9DSEVDSyhncm91cCBvZiAvZGV2L2ttZW0sIGFjX2N2X2dyb3VwX2ttZW0sClsgIyBPbiBTb2xhcmlzLCAvZGV2L2ttZW0gaXMgYSBzeW1saW5rLiAgR2V0IGluZm8gb24gdGhlIHJlYWwgZmlsZS4KICBhY19sc19vdXRwdXQ9YGxzIC1sZ0wgL2Rldi9rbWVtIDI+L2Rldi9udWxsYAogICMgSWYgd2UgZ290IGFuIGVycm9yIChzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBzeW1saW5rcyksIHRyeSB3aXRob3V0IC1MLgogIHRlc3QgLXogIiRhY19sc19vdXRwdXQiICYmIGFjX2xzX291dHB1dD1gbHMgLWxnIC9kZXYva21lbWAKICBhY19jdl9ncm91cF9rbWVtPWBBU19FQ0hPKFsiJGFjX2xzX291dHB1dCJdKSBcCiAgICB8IHNlZCAtbmUgWydzL1sJIF1bCSBdKi8gL2c7CgkgICAgICAgcy9eLltzU3J3eC1dKiAqWzAtOV0qICpcKFteMC05XSpcKSAgKi4qL1wxLzsKCSAgICAgICAvIC9zLy4qIC8vO3A7J11gCl0pCiAgQUNfU1VCU1QoS01FTV9HUk9VUCwgJGFjX2N2X2dyb3VwX2ttZW0pZG5sCmZpCmlmIHRlc3QgIngkYWNfc2F2ZV9MSUJTIiA9IHg7IHRoZW4KICBHRVRMT0FEQVZHX0xJQlM9JExJQlMKZWxzZQogIEdFVExPQURBVkdfTElCUz1gQVNfRUNITyhbIiRMSUJTIl0pIHwgc2VkICJzfCRhY19zYXZlX0xJQlN8fCJgCmZpCkxJQlM9JGFjX3NhdmVfTElCUwoKQUNfU1VCU1QoR0VUTE9BREFWR19MSUJTKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDQ3MQpBQ19BUkdfVkFSX200X2RlZnVuX3BybyhbJDBdKW00X2RpdmVydF9vbmNlKFtIRUxQX1ZBUl0sIFtbClNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOl1dKWRubAptNF9kaXZlcnRfb25jZShbSEVMUF9WQVJfRU5EXSwgW1sKVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLl1dKWRubAptNF9leHBhbmRfb25jZShbbTRfZGl2ZXJ0X3RleHQoW0hFTFBfVkFSXSwKCQkJICAgICAgIFtBU19IRUxQX1NUUklORyhbJDFdLCBbJDJdLCBbICAgICAgICAgICAgICBdKV0pXSwKCSAgICAgICBbJDAoJDEpXSlkbmwKQUNfU1VCU1QoWyQxXSlkbmwKX0FDX0FSR19WQVJfUFJFQ0lPVVMoWyQxXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwzMQptNF9sb2NhdGlvbihBTV9UWVBFX1BUUkRJRkZfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzA0ClQyNywzMwptNF9sb2NhdGlvbihBQ19IRUFERVJfVElNRSkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo3NjEKVDIxLDEKX200X2RpdmVydChNNFNILUlOSVQpNgpUMTgsMQpfQUNfTEFOR19BQkJSRVYoQyljClQxNywxNjAyCl9BQ19JTklUX0RFRkFVTFRTbTRfZGl2ZXJ0X3B1c2goW0RFRkFVTFRTXSlkbmwKCnRlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyBBU19PUklHSU5BTF9TVERJTl9GRDwmMCA8L2Rldi9udWxsCmV4ZWMgQVNfTUVTU0FHRV9GRD4mMQoKIyBOYW1lIG9mIHRoZSBob3N0LgojIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCiMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgphY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKCiMKIyBJbml0aWFsaXphdGlvbnMuCiMKYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAphY19jbGVhbl9maWxlcz0KYWNfY29uZmlnX2xpYm9ial9kaXI9LgpMSUJAJnRAT0JKUz0KY3Jvc3NfY29tcGlsaW5nPW5vCnN1YmRpcnM9Ck1GTEFHUz0KTUFLRUZMQUdTPQpBQ19TVUJTVChbU0hFTExdKWRubApBQ19TVUJTVChbUEFUSF9TRVBBUkFUT1JdKWRubAoKIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCkFDX1NVQlNUKFtQQUNLQUdFX05BTUVdLAoJIFttNF9pZmRlZihbQUNfUEFDS0FHRV9OQU1FXSwgICAgICBbJ0FDX1BBQ0tBR0VfTkFNRSddKV0pZG5sCkFDX1NVQlNUKFtQQUNLQUdFX1RBUk5BTUVdLAoJIFttNF9pZmRlZihbQUNfUEFDS0FHRV9UQVJOQU1FXSwgICBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKV0pZG5sCkFDX1NVQlNUKFtQQUNLQUdFX1ZFUlNJT05dLAoJIFttNF9pZmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwgICBbJ0FDX1BBQ0tBR0VfVkVSU0lPTiddKV0pZG5sCkFDX1NVQlNUKFtQQUNLQUdFX1NUUklOR10sCgkgW200X2lmZGVmKFtBQ19QQUNLQUdFX1NUUklOR10sICAgIFsnQUNfUEFDS0FHRV9TVFJJTkcnXSldKWRubApBQ19TVUJTVChbUEFDS0FHRV9CVUdSRVBPUlRdLAoJIFttNF9pZmRlZihbQUNfUEFDS0FHRV9CVUdSRVBPUlRdLCBbJ0FDX1BBQ0tBR0VfQlVHUkVQT1JUJ10pXSlkbmwKQUNfU1VCU1QoW1BBQ0tBR0VfVVJMXSwKCSBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVVJMXSwgICAgICAgWydBQ19QQUNLQUdFX1VSTCddKV0pZG5sCgptNF9kaXZlcnRfcG9wKFtERUZBVUxUU10pZG5sCm00X3dyYXBfbGlmbyhbbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwKW2FjX3N1YnN0X3ZhcnM9J200X3NldF9kdW1wKFtfQUNfU1VCU1RfVkFSU10sIG00X25ld2xpbmUpJwphY19zdWJzdF9maWxlcz0nbTRfaWZkZWYoW19BQ19TVUJTVF9GSUxFU10sIFttNF9kZWZuKFtfQUNfU1VCU1RfRklMRVNdKV0pJwphY191c2VyX29wdHM9JwplbmFibGVfb3B0aW9uX2NoZWNraW5nCm00X2lmZGVmKFtfQUNfVVNFUl9PUFRTXSwgW200X2RlZm4oW19BQ19VU0VSX09QVFNdKQpdKScKbTRfaWZkZWYoW19BQ19QUkVDSU9VU19WQVJTXSwKICBbX0FDX0FSR19WQVJfU1RPUkVbXWRubAogICBfQUNfQVJHX1ZBUl9WQUxJREFURVtdZG5sCiAgIGFjX3ByZWNpb3VzX3ZhcnM9J200X2RlZm4oW19BQ19QUkVDSU9VU19WQVJTXSknXSkKbTRfaWZkZWYoW19BQ19MSVNUX1NVQkRJUlNdLAogIFthY19zdWJkaXJzX2FsbD0nbTRfZGVmbihbX0FDX0xJU1RfU1VCRElSU10pJ10pZG5sCl0pXSlkbmwKClQxMywzMzUKQUNfUlVOX0lGRUxTRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX0NPTVBJTEVSX1JFUVVJUkUoKWRubAptNF9pZnZhbChbJDRdLCBbXSwKCSBbQUNfRElBR05PU0UoW2Nyb3NzXSwKCQkgICAgIFskMCBjYWxsZWQgd2l0aG91dCBkZWZhdWx0IHRvIGFsbG93IGNyb3NzIGNvbXBpbGluZ10pXSlkbmwKQVNfSUYoW3Rlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzXSwKICBbbTRfZGVmYXVsdChbJDRdLAoJICAgW0FDX01TR19GQUlMVVJFKFtjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmddKV0pXSwKICBbX0FDX1JVTl9JRkVMU0UoJEApXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiw2NgptNF9yZV9zdHJpbmdbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8wMTIzNDU2Nzg5XSoKVDMxLDM0Cm00X2xvY2F0aW9uKF9BQ19SVU5fTE9HX1NUREVSUikuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMzE1ClQyNCwzMwptNF9sb2NhdGlvbihBQ19VTklTVERfSCkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo4MzMKVDMxLDg2Cl9BQ19MQU5HX0lPX1BST0dSQU0oRm9ydHJhbiA3NylBQ19MQU5HX1BST0dSQU0oW10sCltkbmwKICAgICAgb3Blbih1bml0PTksZmlsZT0nY29uZnRlc3Qub3V0JykKICAgICAgY2xvc2UodW5pdD05KQpdKQpUNiwxMjMKX0FDX0ZDX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0xBTkdfQ0FTRShbRm9ydHJhbiA3N10sIFtGNzddLAoJICAgICBbRm9ydHJhbl0sICAgIFtGQ10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw1NQpBQ19UWVBFX0lOVDhfVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfVFlQRV9JTlQoOClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDY2CkFDX1NUUlVDVF9ESVJFTlRfRF9JTk9fbTRfZGVmdW5fcHJvKFskMF0pX0FDX1NUUlVDVF9ESVJFTlQoW2RfaW5vXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDE2MgpBQ19DSEVDS0lOR19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DSEVDS0lORycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQVNfTUVTU0FHRShbY2hlY2tpbmcgJDEuLi5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMzMKbTRfbG9jYXRpb24oQUNfQ1JPU1NfQ0hFQ0spLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjU2ClQxNiw1Cl9tNF9kaXZlcnQoR1JPVykxMDAwMApUMTUsOTUKX0FDX0xBTkdfT1BFTk1QX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfU09VUkNFKFtfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDk5OQpBQ19UWVBFX0xPTkdfRE9VQkxFX1dJREVSX200X2RlZnVuX3BybyhbJDBdKQogIEFDX0NBQ0hFX0NIRUNLKAogICAgW2ZvciBsb25nIGRvdWJsZSB3aXRoIG1vcmUgcmFuZ2Ugb3IgcHJlY2lzaW9uIHRoYW4gZG91YmxlXSwKICAgIFthY19jdl90eXBlX2xvbmdfZG91YmxlX3dpZGVyXSwKICAgIFtBQ19DT01QSUxFX0lGRUxTRSgKICAgICAgIFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoCgkgIFtbI2luY2x1ZGUgPGZsb2F0Lmg+CgkgICAgbG9uZyBkb3VibGUgY29uc3QgYVtdID0KCSAgICAgIHsKCQkgMC4wTCwgREJMX01JTiwgREJMX01BWCwgREJMX0VQU0lMT04sCgkJIExEQkxfTUlOLCBMREJMX01BWCwgTERCTF9FUFNJTE9OCgkgICAgICB9OwoJICAgIGxvbmcgZG91YmxlCgkgICAgZiAobG9uZyBkb3VibGUgeCkKCSAgICB7CgkgICAgICAgcmV0dXJuICgoeCArICh1bnNpZ25lZCBsb25nIGludCkgMTApICogKC0xIC8geCkgKyBhWzBdCgkJCSsgKHggPyBmICh4KSA6ICdjJykpOwoJICAgIH0KCSAgXV0sCgkgIFtbKDAgPCAoKERCTF9NQVhfRVhQIDwgTERCTF9NQVhfRVhQKQoJCSAgICsgKERCTF9NQU5UX0RJRyA8IExEQkxfTUFOVF9ESUcpCgkJICAgLSAoTERCTF9NQVhfRVhQIDwgREJMX01BWF9FWFApCgkJICAgLSAoTERCTF9NQU5UX0RJRyA8IERCTF9NQU5UX0RJRykpKQoJICAgICYmIChpbnQpIExEQkxfRVBTSUxPTiA9PSAwCgkgIF1dKV0sCiAgICAgICBhY19jdl90eXBlX2xvbmdfZG91YmxlX3dpZGVyPXllcywKICAgICAgIGFjX2N2X3R5cGVfbG9uZ19kb3VibGVfd2lkZXI9bm8pXSkKICBpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfZG91YmxlX3dpZGVyID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW0hBVkVfTE9OR19ET1VCTEVfV0lERVJdLCAxLAogICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHR5cGUgYGxvbmcgZG91YmxlJyB3b3JrcyBhbmQgaGFzIG1vcmUgcmFuZ2Ugb3IKICAgICAgIHByZWNpc2lvbiB0aGFuIGBkb3VibGUnLl0pCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwzNgptNF9sb2NhdGlvbihBQ19TRVRWQlVGX1JFVkVSU0VEKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTcxOQpUMjUsMzQKbTRfbG9jYXRpb24oQUNfUEFUSF9UT09MKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoxOTgKVDIzLDQ3Cl9BQ19DT05GSUdfQ09NUFVURV9ERVNUbTRfZm9ybWF0KFtbJS4qc11dLCBtNF9pbmRleChbJDE6XSwgWzpdKSwgWyQxXSkKVDE4LDY3NgpBQ19IRUFERVJfU1lTX1dBSVRfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlXSwKICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCwKW0FDX0NPTVBJTEVfSUZFTFNFKApbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaWZuZGVmIFdFWElUU1RBVFVTCiMgZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKHVuc2lnbmVkIGludCkgKHN0YXRfdmFsKSA+PiA4KQojZW5kaWYKI2lmbmRlZiBXSUZFWElURUQKIyBkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgJiAyNTUpID09IDApCiNlbmRpZgpdLApbICBpbnQgczsKICB3YWl0ICgmcyk7CiAgcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxO10pXSwKCQkgW2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllc10sCgkJIFthY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ub10pXSkKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TWVNfV0FJVF9ILCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCw3MgptNF92ZXJzaW9uX2NvbXBhcmVfbTRfbGlzdF9jbXBfcmF3KF9tNF92ZXJzaW9uX3VubGV0dGVyKFskMV0pLCBfbTRfdmVyc2lvbl91bmxldHRlcihbJDJdKSkKVDIxLDM4NgpfQUNfQ0hFQ0tfTUVNQkVSX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTIuJFtdM10sIFskW100XSwKICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbJFtdNV0sCltzdGF0aWMgJFtdMiBhY19hZ2dyOwppZiAoYWNfYWdnci4kW10zKQpyZXR1cm4gMDtdKV0sCgkJW0FTX1ZBUl9TRVQoWyRbXTRdLCBbeWVzXSldLAogIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFskW101XSwKW3N0YXRpYyAkW10yIGFjX2FnZ3I7CmlmIChzaXplb2YgYWNfYWdnci4kW10zKQpyZXR1cm4gMDtdKV0sCgkJW0FTX1ZBUl9TRVQoWyRbXTRdLCBbeWVzXSldLAoJCVtBU19WQVJfU0VUKFskW100XSwgW25vXSldKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUOSwxNDIKQUNfTEFOR19DX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfQycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTEFORyhDKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMTk1CkFDX0xBTkcoR28pYWNfZXh0PWdvCmFjX2NvbXBpbGU9JyRHT0MgLWMgJEdPRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19saW5rPSckR09DIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkR09GTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2NvbXBpbGVyX2dudT15ZXMKClQzMSwzMAptNF9sb2NhdGlvbihfQVNfTElORU5PX1BSRVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxMTY3ClQyNiwzNAptNF9sb2NhdGlvbihBQ19SVU5fSUZFTFNFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI3NDgKVDI1LDEKX200X2RpdmVydChNNFNILVNBTklUSVpFKTQKVDEwLDEyMApfQVNfRVNDQVBFbTRfaWYobTRfaW5kZXgobTRfdHJhbnNsaXQoW1skMV1dLCBbJDNdLCBbJDIkMiQyJDJdKSwgWyQyXSksIFstMV0sCiAgICAgICBbJDBfXSwgW200X2JwYXRzdWJzdF0pKFskMV0sIFtbJDIkM11dLCBbXFxcJl0pClQyMSwxOTIKX0FDX0Y3N19OQU1FX01BTkdMSU5HX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0Y3N19MSUJSQVJZX0xERkxBR1NdKWRubApBQ19SRVFVSVJFKFtBQ19GNzdfRFVNTVlfTUFJTl0pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuIDc3KWRubApfX0FDX0ZDX05BTUVfTUFOR0xJTkcKQUNfTEFOR19QT1AoRm9ydHJhbiA3NylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwyOQptNF9sb2NhdGlvbihfQVNfRVhJVF9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NTY4ClQzNCwzNQptNF9sb2NhdGlvbihBTV9GVU5DX0VSUk9SX0FUX0xJTkUpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1MDEKVDE1LDE2NQpfbTRfc2V0X2FkZF9hbGxtNF9pZihbJCNdLCBbMl0sIFtdLAogICAgICAgW200X2lmZGVmKFtfbTRfc2V0KFskMV0sJDMpXSwgW10sCgkJIFttNF9kZWZpbmUoW19tNF9zZXQoWyQxXSwkMyldLCBbMV0pbTRfcHVzaGRlZihbX200X3NldChbJDFdKV0sCgkgICBbJDNdKS1dKSQwKFskMV0sIG00X3NoaWZ0MigkQCkpXSkKVDIzLDMyMgpfQUNfQ09NUElMRV9JRkVMU0VfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKICBBU19JRihbX0FDX0RPX1NUREVSUigkYWNfY29tcGlsZSkgJiYgewoJIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAoJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0XSwKICAgICAgW2FjX3JldHZhbD0wXSwKICAgICAgW19BQ19NU0dfTE9HX0NPTkZURVNUCglhY19yZXR2YWw9MV0pCiAgQVNfTElORU5PX1BPUAogIEFTX1NFVF9TVEFUVVMoWyRhY19yZXR2YWxdKQoKVDE3LDc4MApfQVNfRVJST1JfUFJFUEFSRUFTX1JFUVVJUkVfU0hFTExfRk4oW2FzX2ZuX2Vycm9yXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX2Vycm9yXSwgW1NUQVRVUyBFUlJPUl1tNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKICAgICAgW1sgW1tMSU5FTk8gTE9HX0ZEXV1dXSksCiAgICBbT3V0cHV0ICJgYmFzZW5hbWUgQFN8QDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci5dCm00X2lmdmFsKEFTX01FU1NBR0VfTE9HX0ZELAogICAgW1tJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsCiAgICAgIHJlZmVyZW5jaW5nIExJTkVOTy5dXSkKICAgIFtUaGVuIGV4aXQgdGhlIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLl0pXSwKWyAgYXNfc3RhdHVzPSRbMV07IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQptNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKW200X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSwgWyRbNF1dKWRubAogIGlmIHRlc3QgIiRbNF0iOyB0aGVuCiAgICBBU19MSU5FTk9fUFVTSChbJFszXV0pCiAgICBfQVNfRUNIT19MT0coW2Vycm9yOiAkWzJdXSkKICBmaQptNF9kZWZpbmUoW0FTX01FU1NBR0VfTE9HX0ZEXSldLCBbbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV0pZG5sCiAgQVNfTUVTU0FHRShbZXJyb3I6ICRbMl1dLCBbMl0pCl9tNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlkbmwKICBBU19FWElUKFskYXNfc3RhdHVzXSldKQpUMTIsMApBQ19MSUJTT1VSQ0UKVDksNDAKQUNfRVhFRVhUX200X2RlZnVuX3BybyhbJDBdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTI0Cl9BQ19DT01QVVRFX0lOVF9SVU5fQUNfUlVOX0lGRUxTRShbQUNfTEFOR19JTlRfU0FWRShbJDNdLCBbJDFdKV0sCgkJW2VjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDIgPGNvbmZ0ZXN0LnZhbDsgJDRdLCBbJDVdKQpybSAtZiBjb25mdGVzdC52YWwKClQxMCwxODcKQUNfVlBSSU5URl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19WUFJJTlRGJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfVlBSSU5URl0sIFtBQ19GVU5DX1ZQUklOVEYoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDM2Cm00X2xvY2F0aW9uKEFNX0ZVTkNfTUtUSU1FKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTE5NQpUMjAsMTg2MQpfQUNfQVJHX1ZBUl9WQUxJREFURW00X2RpdmVydF90ZXh0KFtJTklUX1BSRVBBUkVdLApbIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQojIHZhbHVlLgphY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAogIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CiAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQogIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCiAgICBzZXQsKQogICAgICBBU19NRVNTQUdFKFtlcnJvcjogYCRhY192YXInIHdhcyBzZXQgdG8gYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuXSwgMikKICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKICAgICxzZXQpCiAgICAgIEFTX01FU1NBR0UoW2Vycm9yOiBgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1bl0sIDIpCiAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CiAgICAsKTs7CiAgICAqKQogICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCgkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KCWFjX29sZF92YWxfdz1gZWNobyB4ICRhY19vbGRfdmFsYAoJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCglpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KCSAgQVNfTUVTU0FHRShbZXJyb3I6IGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOl0sIDIpCgkgIGFjX2NhY2hlX2NvcnJ1cHRlZD06CgllbHNlCgkgIEFTX01FU1NBR0UoW3dhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjpdLCAyKQoJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCglmaQoJQVNfTUVTU0FHRShbICBmb3JtZXIgdmFsdWU6ICBgJGFjX29sZF92YWwnXSwgMikKCUFTX01FU1NBR0UoWyAgY3VycmVudCB2YWx1ZTogYCRhY19uZXdfdmFsJ10sIDIpCiAgICAgIGZpOzsKICBlc2FjCiAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgogIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgogICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgogICAgKlwnKikgYWNfYXJnPSRhY192YXI9YEFTX0VDSE8oWyIkYWNfbmV3X3ZhbCJdKSB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwogICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKICAgIGVzYWMKICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgogICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KICAgICAgKikgQVNfVkFSX0FQUEVORChbYWNfY29uZmlndXJlX2FyZ3NdLCBbIiAnJGFjX2FyZyciXSkgOzsKICAgIGVzYWMKICBmaQpkb25lCmlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KICBBU19NRVNTQUdFKFtlcnJvcjogaW4gYCRhY19wd2QnOl0sIDIpCiAgQVNfTUVTU0FHRShbZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZF0sIDIpCiAgQVNfRVJST1IoW3J1biBgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyXSkKZmldKWRubAoKVDE0LDUyMwpBQ19UWVBFX1NJR05BTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UWVBFX1NJR05BTCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW3JldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVyc10sIGFjX2N2X3R5cGVfc2lnbmFsLApbQUNfQ09NUElMRV9JRkVMU0UoCltBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgpdLAoJCSBbcmV0dXJuICooc2lnbmFsICgwLCAwKSkgKDApID09IDE7XSldLAoJCSAgIFthY19jdl90eXBlX3NpZ25hbD1pbnRdLAoJCSAgIFthY19jdl90eXBlX3NpZ25hbD12b2lkXSldKQpBQ19ERUZJTkVfVU5RVU9URUQoUkVUU0lHVFlQRSwgJGFjX2N2X3R5cGVfc2lnbmFsLAoJCSAgIFtEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycwoJCSAgICAoYGludCcgb3IgYHZvaWQnKS5dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDI5MApBQ19JTlRfMTZfQklUU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19JTlRfMTZfQklUUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0hFQ0tfU0laRU9GKFtpbnRdKQp0ZXN0ICRhY19jdl9zaXplb2ZfaW50ID0gMiAmJgogIEFDX0RFRklORShJTlRfMTZfQklUUywgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgYHNpemVvZiAoaW50KScgPSAyLiAgT2Jzb2xldGUsIHVzZSBgU0laRU9GX0lOVCcuXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDQKbTRfcXVvdGVbJCpdClQxNSw0Cm00X1BBQ0tBR0VfWUVBUjIwMTIKVDQ0LDM0Cm00X2xvY2F0aW9uKEFDX1ZBTElEQVRFX0NBQ0hFRF9TWVNURU1fVFVQTEUpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTg2NQpUMzAsMzMKbTRfbG9jYXRpb24oQUNfUFJFRklYX1BST0dSQU0pLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6NDYzClQxMCwyMTEKbTRfZHVtcGRlZm00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFskMDogbWlzc2luZyBhcmd1bWVudF0pXSwKICAgICAgIFskI10sIFsxXSwgW200X2lmZGVmKFskMV0sIFttNF9lcnJwcmludG4oCiAgWyQxOgldbTRfZHF1b3RlKF9tNF9kZWZuKFskMV0pKSldLCBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDE1LDE5MwptNF9jcl9ub3RfYWxudW0BAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyolJicoKSQrLC4vOjs8PT4/QFtcXV5fYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tClQ2LDIxCl9BU19JRmVsaWYgJDE7IHRoZW4gOgogICQyCgpUMTQsMzY2CkFDX0ZVTkNfTUFMTE9DX200X2RlZnVuX3BybyhbJDBdKV9BQ19GVU5DX01BTExPQ19JRigKICBbQUNfREVGSU5FKFtIQVZFX01BTExPQ10sIDEsCgkgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSBHTlUgbGliYyBjb21wYXRpYmxlIGBtYWxsb2MnCgkgICAgICBmdW5jdGlvbiwgYW5kIHRvIDAgb3RoZXJ3aXNlLl0pXSwKICBbQUNfREVGSU5FKFtIQVZFX01BTExPQ10sIDApCiAgIEFDX0xJQk9CSihtYWxsb2MpCiAgIEFDX0RFRklORShbbWFsbG9jXSwgW3JwbF9tYWxsb2NdLAogICAgICBbRGVmaW5lIHRvIHJwbF9tYWxsb2MgaWYgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywxNQpBU19WQVJfUE9QREVGbTRfcG9wZGVmKFskMV0pClQxMSwyODQKQUNfTUVNT1JZX0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTUVNT1JZX0gnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX0hFQURFUihtZW1vcnkuaCwKCQlbQUNfREVGSU5FKFtORUVEX01FTU9SWV9IXSwgMSwKCQkJICAgW1NhbWUgYXMgYEhBVkVfTUVNT1JZX0gnLCBkb24ndCBkZXBlbmQgb24gbWUuXSldKQpBQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIG1lbW9yeS5oKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTAwMgpBQ19GQ19QUF9ERUZJTkVfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QVVNIKFtGb3J0cmFuXSlkbmwKYWNfZmNfcHBfZGVmaW5lX3NyY2V4dF9zYXZlPSRhY19mY19zcmNleHQKQUNfRkNfUFBfU1JDRVhUKFtGXSkKQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byBkZWZpbmUgc3ltYm9scyBmb3IgcHJlcHJvY2Vzc2VkIEZvcnRyYW5dLAogIFthY19jdl9mY19wcF9kZWZpbmVdLApbYWNfZmNfcHBfZGVmaW5lX3NyY2V4dF9zYXZlPSRhY19mY19zcmNleHQKYWNfY3ZfZmNfcHBfZGVmaW5lPXVua25vd24KYWNfZmNfcHBfZGVmaW5lX0ZDRkxBR1Nfc2F2ZT0kRkNGTEFHUwpmb3IgYWNfZmxhZyBpbiAtRCAtV0YsLUQgLVdwLC1EIC1XYywtRApkbwogIEZDRkxBR1M9IiRhY19mY19wcF9kZWZpbmVfRkNGTEFHU19zYXZlICR7YWNfZmxhZ31GT09CQVIgJHthY19mbGFnfVpPUks9NDIiCiAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgW1sKI2lmbmRlZiBGT09CQVIKICAgICAgY2hva2UgbWUKI2VuZGlmCiNpZiBaT1JLICE9IDQyCiAgICAgIGNob2tlIG1lCiNlbmRpZl1dKV0sCiAgICBbYWNfY3ZfZmNfcHBfZGVmaW5lPSRhY19mbGFnXSkKICB0ZXN0IHgiJGFjX2N2X2ZjX3BwX2RlZmluZSIgIT0geHVua25vd24gJiYgYnJlYWsKZG9uZQpGQ0ZMQUdTPSRhY19mY19wcF9kZWZpbmVfRkNGTEFHU19zYXZlCl0pCmFjX2ZjX3NyY2V4dD0kYWNfZmNfcHBfZGVmaW5lX3NyY2V4dF9zYXZlCmlmIHRlc3QgIngkYWNfY3ZfZmNfcHBfZGVmaW5lIiA9IHh1bmtub3duOyB0aGVuCiAgRkNfREVGSU5FPQogIG00X2RlZmF1bHQoWyQyXSwKCSAgICAgW0FDX01TR19FUlJPUihbRm9ydHJhbiBkb2VzIG5vdCBhbGxvdyB0byBkZWZpbmUgcHJlcHJvY2Vzc29yIHN5bWJvbHNdLCA3NyldKQplbHNlCiAgRkNfREVGSU5FPSRhY19jdl9mY19wcF9kZWZpbmUKICAkMQpmaQpBQ19TVUJTVChbRkNfREVGSU5FXSlkbmwKQUNfTEFOR19QT1AoW0ZvcnRyYW5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDI5Cm00X2xvY2F0aW9uKEFTX1JFUVVJUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDozODUKRjYsMwptNF9sZW5sZW4KVDE0LDQyCm00X2RpdmVydF90ZXh0bTRfZGl2ZXJ0X3B1c2goWyQxXSkkMgptNF9kaXZlcnRfcG9wKFskMV0pClQyMiwzCl9tNF9kaXZlcnQoSEVMUF9DQU5PTikxMDEKVDIxLDY2OQpfQUNfTElCT0JKU19OT1JNQUxJWkVfbTRfZGVmdW5fcHJvKFskMF0pYWNfbGlib2Jqcz0KYWNfbHRsaWJvYmpzPQptNF9pZm5kZWYoW0FNX0NfUFJPVE9UWVBFU10sIFtVPQpdKWRubApmb3IgYWNfaSBpbiA6ICRMSUJAJnRAT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCiAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgogIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwogIGFjX2k9YEFTX0VDSE8oWyIkYWNfaSJdKSB8IHNlZCAiJGFjX3NjcmlwdCJgCiAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgogICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgogIEFTX1ZBUl9BUFBFTkQoW2FjX2xpYm9ianNdLCBbIiBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCJdKQogIEFTX1ZBUl9BUFBFTkQoW2FjX2x0bGlib2Jqc10sIFsiIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nXSkKZG9uZQpBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbJGFjX2xpYm9ianNdKQpBQ19TVUJTVChbTFRMSUJPQkpTXSwgWyRhY19sdGxpYm9ianNdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsOTQKQVNfVU5TRVRfbTRfZGVmdW5fcHJvKFskMF0peyBBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwgW10sIFtldmFsIF0pJDE9OyB1bnNldCAkMTt9W11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxMTUKQVNfVkFSX0dFVEFTX0xJVEVSQUxfV09SRF9JRihbJDFdLAoJICAgICAgIFskJDFdLAogIFtgZXZhbCAnYXNfdmFsPSR7J19BU19FU0NBUEUoW1skMV1dLCBbYF0sIFtcXSknfTtBU19FQ0hPKFsiJGFzX3ZhbCJdKSdgXSkKVDE3LDE4NwpBQ19IRUFERVJfU1REQk9PTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19IRUFERVJfU1REQk9PTAppZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYm9vbF9oID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfU1REQk9PTF9ILCAxLCBbRGVmaW5lIHRvIDEgaWYgc3RkYm9vbC5oIGNvbmZvcm1zIHRvIEM5OS5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDE0NwpBQ19GNzdfTElCUkFSWV9MREZMQUdTX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfRjc3XSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpZG5sCl9BQ19GQ19MSUJSQVJZX0xERkxBR1MKQUNfTEFOR19QT1AoRm9ydHJhbiA3NylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwzMAptNF9sb2NhdGlvbihfQVNfTE5fU19QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTIyMwpUMTIsNDY5NwpBQ19QQVRIX1hUUkFfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUEFUSF9YXSlkbmwKaWYgdGVzdCAiJG5vX3giID0geWVzOyB0aGVuCiAgIyBOb3QgYWxsIHByb2dyYW1zIG1heSB1c2UgdGhpcyBzeW1ib2wsIGJ1dCBpdCBkb2VzIG5vdCBodXJ0IHRvIGRlZmluZSBpdC4KICBBQ19ERUZJTkUoW1hfRElTUExBWV9NSVNTSU5HXSwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIFggV2luZG93IFN5c3RlbSBpcyBtaXNzaW5nIG9yIG5vdCBiZWluZyB1c2VkLl0pCiAgWF9DRkxBR1M9IFhfUFJFX0xJQlM9IFhfTElCUz0gWF9FWFRSQV9MSUJTPQplbHNlCiAgaWYgdGVzdCAtbiAiJHhfaW5jbHVkZXMiOyB0aGVuCiAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCiAgZmkKCiAgIyBJdCB3b3VsZCBhbHNvIGJlIG5pY2UgdG8gZG8gdGhpcyBmb3IgYWxsIC1MIG9wdGlvbnMsIG5vdCBqdXN0IHRoaXMgb25lLgogIGlmIHRlc3QgLW4gIiR4X2xpYnJhcmllcyI7IHRoZW4KICAgIFhfTElCUz0iJFhfTElCUyAtTCR4X2xpYnJhcmllcyIKICAgICMgRm9yIFNvbGFyaXM7IHNvbWUgdmVyc2lvbnMgb2YgU3VuIENDIHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtUiBhbmQKICAgICMgb3RoZXJzIHJlcXVpcmUgbm8gc3BhY2UuICBXb3JkcyBhcmUgbm90IHN1ZmZpY2llbnQgLiAuIC4gLgogICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZV0pCiAgICBhY194c2F2ZV9MSUJTPSRMSUJTOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKICAgIGFjX3hzYXZlX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9JGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWcKICAgIGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9eWVzCiAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAogICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKQogICAgICAgWF9MSUJTPSIkWF9MSUJTIC1SJHhfbGlicmFyaWVzIl0sCiAgICAgIFtMSUJTPSIkYWNfeHNhdmVfTElCUyAtUiAkeF9saWJyYXJpZXMiCiAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQoJICBYX0xJQlM9IiRYX0xJQlMgLVIgJHhfbGlicmFyaWVzIl0sCgkgW0FDX01TR19SRVNVTFQoW25laXRoZXIgd29ya3NdKV0pXSkKICAgIGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9JGFjX3hzYXZlX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWcKICAgIExJQlM9JGFjX3hzYXZlX0xJQlMKICBmaQoKICAjIENoZWNrIGZvciBzeXN0ZW0tZGVwZW5kZW50IGxpYnJhcmllcyBYIHByb2dyYW1zIG11c3QgbGluayB3aXRoLgogICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgUjYgbGlicmFyaWVzCiAgIyAoLWxJQ0UpLCBzaW5jZSB3ZSBtYXkgbmVlZCAtbHNvY2tldCBvciB3aGF0ZXZlciBmb3IgWCBsaW5raW5nLgoKICBpZiB0ZXN0ICIkSVNDIiA9IHllczsgdGhlbgogICAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sbnNsX3MgLWxpbmV0IgogIGVsc2UKICAgICMgTWFydHluIEpvaG5zb24gc2F5cyB0aGlzIGlzIG5lZWRlZCBmb3IgVWx0cml4LCBpZiB0aGUgWAogICAgIyBsaWJyYXJpZXMgd2VyZSBidWlsdCB3aXRoIERFQ25ldCBzdXBwb3J0LiAgQW5kIEthcmwgQmVycnkgc2F5cwogICAgIyB0aGUgQWxwaGEgbmVlZHMgZG5ldF9zdHViIChkbmV0IGRvZXMgbm90IGV4aXN0KS4KICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgJFhfTElCUyAtbFgxMSIKICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX0NBTEwoW10sIFtYT3BlbkRpc3BsYXldKV0sCgkJICAgW10sCiAgICBbQUNfQ0hFQ0tfTElCKGRuZXQsIGRuZXRfbnRvYSwgW1hfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXQiXSkKICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSA9IG5vOyB0aGVuCiAgICAgIEFDX0NIRUNLX0xJQihkbmV0X3N0dWIsIGRuZXRfbnRvYSwKCVtYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxkbmV0X3N0dWIiXSkKICAgIGZpXSkKICAgIExJQlM9IiRhY194c2F2ZV9MSUJTIgoKICAgICMgbXNoQGNpcy51ZmwuZWR1IHNheXMgLWxuc2wgKGFuZCAtbHNvY2tldCkgYXJlIG5lZWRlZCBmb3IgaGlzIDM4Ni9BVCwKICAgICMgdG8gZ2V0IHRoZSBTeXNWIHRyYW5zcG9ydCBmdW5jdGlvbnMuCiAgICAjIENoYWQgUi4gTGFyc29uIHNheXMgdGhlIFB5cmFtaXMgTUlTLUVTIHJ1bm5pbmcgREMvT1N4IChTVlI0KQogICAgIyBuZWVkcyAtbG5zbC4KICAgICMgVGhlIG5zbCBsaWJyYXJ5IHByZXZlbnRzIHByb2dyYW1zIGZyb20gb3BlbmluZyB0aGUgWCBkaXNwbGF5CiAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gVC5FLiBEaWNrZXkuCiAgICAjIFRoZSBmdW5jdGlvbnMgZ2V0aG9zdGJ5bmFtZSwgZ2V0c2VydmJ5bmFtZSwgYW5kIGluZXRfYWRkciBhcmUKICAgICMgaW4gLWxic2Qgb24gTHlueE9TIDMuMC4xL2kzODYsIGFjY29yZGluZyB0byBMYXJzIEhlY2tpbmcuCiAgICBBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUpCiAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgogICAgICBBQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lLCBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2wiKQogICAgICBpZiB0ZXN0ICRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgoJQUNfQ0hFQ0tfTElCKGJzZCwgZ2V0aG9zdGJ5bmFtZSwgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sYnNkIikKICAgICAgZmkKICAgIGZpCgogICAgIyBsaWVkZXJAc2t5bGVyLm1hdmQuaG9uZXl3ZWxsLmNvbSBzYXlzIHdpdGhvdXQgLWxzb2NrZXQsCiAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQKICAgICMgMi4wLiAgQnV0IC1sc29ja2V0IGlzIGJyb2tlbiBvbiBJUklYIDUuMiAoYW5kIGlzIG5vdCBuZWNlc3NhcnkKICAgICMgb24gbGF0ZXIgdmVyc2lvbnMpLCBzYXlzIFNpbW9uIExlaW5lbjogaXQgY29udGFpbnMgZ2V0aG9zdGJ5KgogICAgIyB2YXJpYW50cyB0aGF0IGRvbid0IHVzZSB0aGUgbmFtZSBzZXJ2ZXIgKG9yIHNvbWV0aGluZykuICAtbHNvY2tldAogICAgIyBtdXN0IGJlIGdpdmVuIGJlZm9yZSAtbG5zbCBpZiBib3RoIGFyZSBuZWVkZWQuICBXZSBhc3N1bWUgdGhhdAogICAgIyBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCiAgICBBQ19DSEVDS19GVU5DKGNvbm5lY3QpCiAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2Nvbm5lY3QgPSBubzsgdGhlbgogICAgICBBQ19DSEVDS19MSUIoc29ja2V0LCBjb25uZWN0LCBYX0VYVFJBX0xJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMiLCAsCgkkWF9FWFRSQV9MSUJTKQogICAgZmkKCiAgICAjIEd1aWxsZXJtbyBHb21leiBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCiAgICBBQ19DSEVDS19GVU5DKHJlbW92ZSkKICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVtb3ZlID0gbm87IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKHBvc2l4LCByZW1vdmUsIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbHBvc2l4IikKICAgIGZpCgogICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KICAgIEFDX0NIRUNLX0ZVTkMoc2htYXQpCiAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKGlwYywgc2htYXQsIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGlwYyIpCiAgICBmaQogIGZpCgogICMgQ2hlY2sgZm9yIGxpYnJhcmllcyB0aGF0IFgxMVI2IFh0L1hhdyBwcm9ncmFtcyBuZWVkLgogIGFjX3NhdmVfTERGTEFHUz0kTERGTEFHUwogIHRlc3QgLW4gIiR4X2xpYnJhcmllcyIgJiYgTERGTEFHUz0iJExERkxBR1MgLUwkeF9saWJyYXJpZXMiCiAgIyBTTSBuZWVkcyBJQ0UgdG8gKGR5bmFtaWNhbGx5KSBsaW5rIHVuZGVyIFN1bk9TIDQueCAoc28gd2UgaGF2ZSB0bwogICMgY2hlY2sgZm9yIElDRSBmaXJzdCksIGJ1dCB3ZSBtdXN0IGxpbmsgaW4gdGhlIG9yZGVyIC1sU00gLWxJQ0Ugb3IKICAjIHdlIGdldCB1bmRlZmluZWQgc3ltYm9scy4gIFNvIGFzc3VtZSB3ZSBoYXZlIFNNIGlmIHdlIGhhdmUgSUNFLgogICMgVGhlc2UgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBiZWZvcmUgLWxYMTEsIHVubGlrZSB0aGUgb3RoZXIKICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KICAjIEpvaG4gSW50ZXJyYW50ZSwgS2FybCBCZXJyeQogIEFDX0NIRUNLX0xJQihJQ0UsIEljZUNvbm5lY3Rpb25OdW1iZXIsCiAgICBbWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxTTSAtbElDRSJdLCAsICRYX0VYVFJBX0xJQlMpCiAgTERGTEFHUz0kYWNfc2F2ZV9MREZMQUdTCgpmaQpBQ19TVUJTVChYX0NGTEFHUylkbmwKQUNfU1VCU1QoWF9QUkVfTElCUylkbmwKQUNfU1VCU1QoWF9MSUJTKWRubApBQ19TVUJTVChYX0VYVFJBX0xJQlMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsMzQKbTRfbG9jYXRpb24oX0FDX0ZDX0ZVTkMpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTA5NApUMzAsMzQKbTRfbG9jYXRpb24oQUNfQ09ORklHX0FVWF9ESVIpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTY3MApGMTIsOQptNF9kZWJ1Z21vZGVkZWJ1Z21vZGUKVDEwLDI4MAptNF9zZXRfYWRkbTRfaWZkZWYoW19tNF9zZXQoWyQxXSwkMildLAoJICBbbTRfaWYobTRfaW5kaXIoW19tNF9zZXQoWyQxXSwkMildKSwgWzBdLAoJCSBbbTRfZGVmaW5lKFtfbTRfc2V0KFskMV0sJDIpXSwKCQkJICAgIFsxXSlfbTRfc2V0X3NpemUoWyQxXSwgW200X2luY3JdKSQzXSwgWyQ0XSldLAoJICBbbTRfZGVmaW5lKFtfbTRfc2V0KFskMV0sJDIpXSwKCQkgICAgIFsxXSltNF9wdXNoZGVmKFtfbTRfc2V0KFskMV0pXSwKCQkJCSAgICBbJDJdKV9tNF9zZXRfc2l6ZShbJDFdLCBbbTRfaW5jcl0pJDNdKQpUMjgsMzEKbTRfbG9jYXRpb24oQUNfTE9OR182NF9CSVRTKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo4NDEKVDE0LDU0OQpfQUNfUlVOX0lGRUxTRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW190cnlfcnVuXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9ydW5dLCBbTElORU5PXSwKICAgIFtUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCiAgICAgQXNzdW1lcyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi5dKV0sCiAgWyQwX0JPRFldKW00X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pQVNfSUYoW2FjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fdHJ5X3J1biAiJExJTkVOTyJdLCBbJDJdLCBbJDNdKQpybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCiAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtW11tNF9pZnZhbChbJDFdLCBbIGNvbmZ0ZXN0LiRhY19leHRdKVtdZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsOTUKQUNfTEFOR19QUk9HUkFNX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfU09VUkNFKFtfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDI2NQpBQ19MQU5HKEMrKylhY19leHQ9Y3BwCmFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCmFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKClQyNCwzNAptNF9sb2NhdGlvbihBQ19UUllfRVZBTCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDUyClQxNCwxMjIKbTRfYXBwZW5kX3VuaXFtNF9pZnZhbChbJDNdLCBbbTRfaWYobTRfaW5kZXgoWyQyXSwgWyQzXSksIFstMV0sIFtdLAoJCSAgICAgICBbbTRfd2Fybihbc3ludGF4XSwKCQkJCVskMDogYCQyJyBjb250YWlucyBgJDMnXSldKV0pXyQwKCRAKQpUMTUsMApfbTRfZGl2ZXJ0X2R1bXAKVDIzLDMKX0FDX0xBTkdfQUJCUkVWKEVybGFuZyllcmwKVDE5LDE5NApfQUNfQ0hFQ0tfRlVOQ19CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkW10yXSwgWyRbXTNdLAogIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19GVU5DX0xJTktfVFJZKCRbXTIpXSwKCQkgIFtBU19WQVJfU0VUKFskW10zXSwgW3llc10pXSwKCQkgIFtBU19WQVJfU0VUKFskW10zXSwgW25vXSldKV0pCiAgQVNfTElORU5PX1BPUAoKVDIyLDI4MgpBQ19MQU5HKE9iamVjdGl2ZSBDKyspYWNfZXh0PW1tCmFjX2NwcD0nJE9CSkNYWENQUCAkQ1BQRkxBR1MnCmFjX2NvbXBpbGU9JyRPQkpDWFggLWMgJE9CSkNYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2xpbms9JyRPQkpDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRPQkpDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19jb21waWxlcl9nbnU9JGFjX2N2X29iamN4eF9jb21waWxlcl9nbnUKClQxMiwxMTc0CkFDX0ZVTkNfRk9SS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19UWVBFX1BJRF9UXSlkbmwKQUNfQ0hFQ0tfSEVBREVSUyh2Zm9yay5oKQpBQ19DSEVDS19GVU5DUyhmb3JrIHZmb3JrKQppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9yayIgPSB4eWVzOyB0aGVuCiAgX0FDX0ZVTkNfRk9SSwplbHNlCiAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPSRhY19jdl9mdW5jX2ZvcmsKZmkKaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCiAgY2FzZSAkaG9zdCBpbgogICAgKi0qLWFtaWdhb3MqIHwgKi0qLW1zZG9zZGpncHAqKQogICAgICAjIE92ZXJyaWRlLCBhcyB0aGVzZSBzeXN0ZW1zIGhhdmUgb25seSBhIGR1bW15IGZvcmsoKSBzdHViCiAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1ubwogICAgICA7OwogICAgKikKICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcwogICAgICA7OwogIGVzYWMKICBBQ19NU0dfV0FSTihbcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uXSkKZmkKYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yawppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmsiID0geHllczsgdGhlbgogIF9BQ19GVU5DX1ZGT1JLCmZpOwppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4Y3Jvc3M7IHRoZW4KICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCiAgQUNfTVNHX1dBUk4oW3Jlc3VsdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb25dKQpmaQoKaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9XT1JLSU5HX1ZGT1JLLCAxLCBbRGVmaW5lIHRvIDEgaWYgYHZmb3JrJyB3b3Jrcy5dKQplbHNlCiAgQUNfREVGSU5FKHZmb3JrLCBmb3JrLCBbRGVmaW5lIGFzIGBmb3JrJyBpZiBgdmZvcmsnIGRvZXMgbm90IHdvcmsuXSkKZmkKaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1dPUktJTkdfRk9SSywgMSwgW0RlZmluZSB0byAxIGlmIGBmb3JrJyB3b3Jrcy5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDkyCkFDX0NIRUNLX0RFQ0xTX09OQ0VfbTRfZGVmdW5fcHJvKFskMF0pbTRfbWFwX2FyZ3Nfc2VwKFtfQUNfQ0hFQ0tfREVDTF9PTkNFKF0sIFspXSwgW10sICQxKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMzAKbTRfbG9jYXRpb24oQVNfVkFSX1BVU0hERUYpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoyMDY2ClQyNSwzNAptNF9sb2NhdGlvbihBQ19QUk9HX1lBQ0MpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00Ojg5NApUMjcsMQpfQUNfTEFOR19QUkVGSVgoRm9ydHJhbiA3NylGClQyMywyOAptNF9sb2NhdGlvbihBQ19QUk9HX0dPKS4uLy4uL2xpYi9hdXRvY29uZi9nby5tNDoxNTAKVDMyLDAKbTRfaW5jbHVkZShhdXRvY29uZi9wcm9ncmFtcy5tNCkKVDEwLDQxMgpBQ19SRVFVSVJFbTRfaWZkZWYoW19tNF9leHBhbmRpbmcoJDEpXSwKICBbbTRfZmF0YWwoWyQwOiBjaXJjdWxhciBkZXBlbmRlbmN5IG9mICQxXSldKW00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW200X2ZhdGFsKFskMCgkMSk6IGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYW4gXWRubAptNF9pZihbJDBdLCBbbTRfcmVxdWlyZV0sIFtbbTRfZGVmdW5dXSwgW1tBQ19ERUZVTl1dKVsnZCBtYWNyb10pXSltNF9wcm92aWRlX2lmKFskMV0sIFttNF9zZXRfY29udGFpbnMoW19tNF9wcm92aWRlXSwgWyQxXSwKICAgIFtfbTRfcmVxdWlyZV9jaGVjayhbJDFdLCBfbTRfZGVmbihbbTRfcHJvdmlkZSgkMSldKSwgWyQwXSldLCBbbTRfaWdub3JlXSldLAogIFtfbTRfcmVxdWlyZV9jYWxsXSkoWyQxXSwgWyQyXSwgX200X2RpdmVydF9kdW1wKQpUMjksMTI1CkFDX0xBTkdfQk9PTF9DT01QSUxFX1RSWShDKyspQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDA7CnJldHVybiB0ZXN0X2FycmF5IEA8OkAwQDo+QDsKXSkKVDM3LDMzCm00X2xvY2F0aW9uKF9BQ19DSEVDS19IRUFERVJfQ09NUElMRSkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDoxNjIKVDMzLDM0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1RPT0xfUFJFRklYKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoxODMKVDE3LDkyCkFDX0NPTVBJTEVfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfQ09NUElMRVJfUkVRVUlSRSgpZG5sCl9BQ19DT01QSUxFX0lGRUxTRSgkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDIwCm00X1BBQ0tBR0VfQlVHUkVQT1JUYnVnLWF1dG9jb25mQGdudS5vcmcKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX0FSR19QUk9HUkFNKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE2MzYKVDE4LDI2OApfQUNfSU5JVF9DT1BZUklHSFRBQ19DT1BZUklHSFQobTRfZGVmbihbX0FDX0NPUFlSSUdIVF9ZRUFSU10pLCBbVkVSU0lPTl9GU0ZdLCBbCm00X2NvcHlyaWdodF9jb25kZW5zZV0pZG5sCkFDX0NPUFlSSUdIVCgKW1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCmdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC5dLAoJICAgICBbVkVSU0lPTl9GU0ZdLCBbbTRfZWNob10pClQyNCwxMDExCl9BQ19GRUFUVVJFX0NIRUNLX0xFTkdUSCMgQ2hlY2sgZm9yIEdOVSAkMSBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgogIF9BQ19QQVRIX1BST0dfRkxBVk9SX0dOVShbJCQxXSwKICAgIFskMj0iJCQxIiAkMV9mb3VuZD06XSwKICBbYWNfY291bnQ9MAogIEFTX0VDSE9fTihbMDEyMzQ1Njc4OV0pID4iY29uZnRlc3QuaW4iCiAgd2hpbGUgOgogIGRvCiAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgogICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgogICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCiAgICBBU19FQ0hPKFsnJDQnXSkgPj4gImNvbmZ0ZXN0Lm5sIgogICAgJDMgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawogICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawogICAgQVNfVkFSX0FSSVRIKFthY19jb3VudF0sIFskYWNfY291bnQgKyAxXSkKICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAkeyQxX21heC0wfTsgdGhlbgogICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKICAgICAgJDI9IiQkMSIKZG5sICAgIyBVc2luZyAkMV9tYXggc28gdGhhdCBlYWNoIHRvb2wgZmVhdHVyZSBjaGVja2VkIGdldHMgaXRzCmRubCAgICMgb3duIHZhcmlhYmxlLiAgRG9uJ3QgcmVzZXQgaXQgb3RoZXJ3aXNlIHRoZSBpbXBsaWVkIHNlYXJjaApkbmwgICAjIGZvciBiZXN0IHBlcmZvcm1pbmcgdG9vbCBpbiBhIGxpc3QgYnJlYWtzIGRvd24uCiAgICAgICQxX21heD0kYWNfY291bnQKICAgIGZpCiAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCiAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKICBkb25lCiAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dF0pZG5sCgpUMjQsMzQKbTRfbG9jYXRpb24oQUNfUFJPR19BV0spLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjM0OQpUMzEsMzQKbTRfbG9jYXRpb24oQUNfRkNfQ0hFQ0tfQk9VTkRTKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjE1NjQKVDE5LDcwMApBQ19UWVBFX0xPTkdfRE9VQkxFX200X2RlZnVuX3BybyhbJDBdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbG9uZyBkb3VibGVdLCBbYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV0sCiAgICBbaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KICAgICAgIGFjX2N2X3R5cGVfbG9uZ19kb3VibGU9eWVzCiAgICAgZWxzZQogICAgICAgQUNfQ09NUElMRV9JRkVMU0UoCgkgW0FDX0xBTkdfQk9PTF9DT01QSUxFX1RSWSgKCSAgICBbWy8qIFRoZSBTdGFyZGVudCBWaXN0cmEga25vd3Mgc2l6ZW9mIChsb25nIGRvdWJsZSksIGJ1dCBkb2VzCgkJIG5vdCBzdXBwb3J0IGl0LiAgKi8KCSAgICAgIGxvbmcgZG91YmxlIGZvbyA9IDAuMEw7XV0sCgkgICAgW1svKiBPbiBVbHRyaXggNC4zIGNjLCBsb25nIGRvdWJsZSBpcyA0IGFuZCBkb3VibGUgaXMgOC4gICovCgkgICAgICBzaXplb2YgKGRvdWJsZSkgPD0gc2l6ZW9mIChsb25nIGRvdWJsZSldXSldLAoJIFthY19jdl90eXBlX2xvbmdfZG91YmxlPXllc10sCgkgW2FjX2N2X3R5cGVfbG9uZ19kb3VibGU9bm9dKQogICAgIGZpXSkKICBpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfZG91YmxlID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW0hBVkVfTE9OR19ET1VCTEVdLCAxLAogICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgZG91YmxlJy5dKQogIGZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsMzMKbTRfbG9jYXRpb24oQUNfUFJFRklYKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDozOApUMjIsMjU0CkFDX01TR19SRVNVTFRfVU5RVU9URURfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTVNHX1JFU1VMVF9VTlFVT1RFRCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKX0FTX0VDSE9fVU5RVU9URUQoWyRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkMV0sIEFTX01FU1NBR0VfTE9HX0ZEKQpfQVNfRUNIT19VTlFVT1RFRChbJDFdKVtdZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsNzc2CkFDX1NFQVJDSF9MSUJTX200X2RlZnVuX3BybyhbJDBdKUFTX1ZBUl9QVVNIREVGKFthY19TZWFyY2hdLCBbYWNfY3Zfc2VhcmNoXyQxXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgJDFdLCBbYWNfU2VhcmNoXSwKW2FjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwpBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX0NBTEwoW10sIFskMV0pXSkKZm9yIGFjX2xpYiBpbiAnJyAkMjsgZG8KICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgogICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgogIGVsc2UKICAgIGFjX3Jlcz0tbCRhY19saWIKICAgIExJQlM9Ii1sJGFjX2xpYiAkNSAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgogIGZpCiAgQUNfTElOS19JRkVMU0UoW10sIFtBU19WQVJfU0VUKFthY19TZWFyY2hdLCBbJGFjX3Jlc10pXSkKICBBU19WQVJfU0VUX0lGKFthY19TZWFyY2hdLCBbYnJlYWtdKQpkb25lCkFTX1ZBUl9TRVRfSUYoW2FjX1NlYXJjaF0sICwgW0FTX1ZBUl9TRVQoW2FjX1NlYXJjaF0sIFtub10pXSkKcm0gY29uZnRlc3QuJGFjX2V4dApMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlNdKQpBU19WQVJfQ09QWShbYWNfcmVzXSwgW2FjX1NlYXJjaF0pCkFTX0lGKFt0ZXN0ICIkYWNfcmVzIiAhPSBub10sCiAgW3Rlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCiAgJDNdLAogICAgICBbJDRdKQpBU19WQVJfUE9QREVGKFthY19TZWFyY2hdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDM2MjEKQUNfUFJPR19JTlNUQUxMX200X2RlZnVuX29uY2UoW0FDX1BST0dfSU5TVEFMTF0sIFtBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKQUNfUkVRVUlSRV9BVVhfRklMRShbaW5zdGFsbC1zaF0pZG5sCiMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAojIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CiMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCiMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAojIElSSVggL3NiaW4vaW5zdGFsbAojIEFJWCAvYmluL2luc3RhbGwKIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCiMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCiMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwojIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwojIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGxdKQppZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfaW5zdGFsbCwKW19BU19QQVRIX1dBTEsoWyRQQVRIXSwKW1sjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KY2FzZSAkYXNfZGlyLyBpbiBAJTpAKCgKICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCiAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCiAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCiAgL3Vzci91Y2IvKiApIDs7CiAgKildCiAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgogICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CiAgICAjIGJ5IGRlZmF1bHQuCiAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCiAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwoJaWYgQVNfRVhFQ1VUQUJMRV9QKFsiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCJdKTsgdGhlbgoJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgoJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCgkgICAgOgoJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCgkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgoJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgoJICAgIDoKCSAgZWxzZQoJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgoJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCgkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KCSAgICBta2RpciBjb25mdGVzdC5kaXIKCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgoJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgoJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCgkgICAgdGhlbgoJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgoJICAgICAgYnJlYWsgMwoJICAgIGZpCgkgIGZpCglmaQogICAgICBkb25lCiAgICBkb25lCiAgICA7Owplc2FjCl0pCnJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgpdKWRubAogIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCiAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKICBlbHNlCiAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCiAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCiAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwogICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgogICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAogIGZpCmZpCmRubCBEbyBzcGVjaWFsIG1hZ2ljIGZvciBJTlNUQUxMIGluc3RlYWQgb2YgQUNfU1VCU1QsIHRvIGdldApkbmwgcmVsYXRpdmUgbmFtZXMgcmlnaHQuCkFDX01TR19SRVNVTFQoWyRJTlNUQUxMXSkKCiMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwpBQ19TVUJTVChJTlNUQUxMX1BST0dSQU0pZG5sCgp0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwpBQ19TVUJTVChJTlNUQUxMX1NDUklQVClkbmwKCnRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCkFDX1NVQlNUKElOU1RBTExfREFUQSlkbmwKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX1BST0dfSU5TVEFMTF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX1BST0dfSU5TVEFMTF0pXV0sCm00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFtBQ19QUk9HX0lOU1RBTExdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19QUk9HX0lOU1RBTExdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQxNyw3MApBQ19DT05GSUdfSEVBREVSU19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfQ09ORklHX0ZPT1MoW0hFQURFUlNdLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDM1Cm00X2xvY2F0aW9uKEFDX0NIRUNLX0ZVTkNTX09OQ0UpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxMDcKVDgsNjYKbTRfaWZzZXRtNF9pZmRlZihbJDFdLAoJICBbbTRfaWZ2YWwoX200X2RlZm4oWyQxXSksIFskMl0sIFskM10pXSwKCSAgWyQzXSkKVDcsMTgyCm00X2NvbmRtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNdKV0sCiAgICAgICBbJCNdLCBbMV0sIFskMV0sCiAgICAgICBtNF9ldmFsKFskIyAlIDNdKSwgWzJdLCBbbTRfZmF0YWwoWyQwOiBtaXNzaW5nIGFuIGFyZ3VtZW50XSldLAogICAgICAgW18kMCgkQCldKQpUMjIsMgpfbTRfZGl2ZXJ0KFBBUlNFX0FSR1MpMjAKVDMzLDE1MQpfQUNfQ0hFQ0tfVFlQRV9SRVBMQUNFTUVOVF9UWVBFX1BtNF9ibWF0Y2goWyQxXSwKCSAgW15cKF9Cb29sXHxib29sXHxjaGFyXHxkb3VibGVcfGZsb2F0XHxpbnRcfGxvbmdcfHNob3J0XHxcKHVuXCk/c2lnbmVkXHxbX2EtekEtWl1bX2EtekEtWjAtOV0qX3RcKVtdW19hLXpBLVowLTkoKSAqXSokXSwKCSAgMSwgMClkbmwKClQ5LDE1CkFTX0VDSE9fTiRhc19lY2hvX24gJDFbXQpUOSwxMjkKQVNfRUNIT19OX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19FQ0hPX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNyw0MQpBQ19QUk9WSURFX0lGRUxTRW00X2lmZGVmKFttNF9wcm92aWRlKCQxKV0sCgkgIFskMl0sIFskM10pClQyNywyOAptNF9sb2NhdGlvbihBQ19DX0JJR0VORElBTikuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxNDQ0ClQxMiwzMAptNF9lc3lzY21kX3NtNF9jaG9tcF9hbGwobTRfZXN5c2NtZChbJDFdKSkKVDYsMjY0CkFTX0ZPUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9wdXNoZGVmKFskMV0sIG00X2lmKFskM10sIFtdLCBbWyQkMl1dLCBtNF90cmFuc2xpdChbJDNdLCBbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8wMTIzNDU2Nzg5XVslKz06LC4vLV0pLCBbXSwgW1skM11dLCBbWyQkMl1dKSlmb3IgJDJbXW00X2lmdmFsKFskM10sIFsgaW4gJDNdKQpkbyA6CiAgJDQKZG9uZVtdX200X3BvcGRlZihbJDFdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMjc2Cl9BU19DUl9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCmFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwphc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5Jwphc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSw4OApBQ19DSEVDS19GVU5DU19PTkNFX200X2RlZnVuX3BybyhbJDBdKW00X21hcF9hcmdzX3coWyQxXSwgW19BQ19DSEVDS19GVU5DX09OQ0UoXSwgWyldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMAptNF9pbmNsdWRlKGF1dG9jb25mL3R5cGVzLm00KQpUMTAsMjgKX0FDX0Y5MF9GQ3hsZjkwIGY5MCBwZ2Y5MCBwZ2hwZiBlcGNmOTAKVDE1LDE0OApfbTRfYXBwZW5kX3VuaXFtNF9pZmRlZihbJDFdLAoJICBbbTRfaWYobTRfaW5kZXgoWyQzXV9tNF9kZWZuKFskMV0pWyQzXSwgWyQzJDIkM10pLCBbLTFdLAoJCSBbbTRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLCBbJDVdKV0sCgkgIFttNF9kZWZpbmUoWyQxXSwgWyQyXSkkNF0pClQzMiwzMAptNF9sb2NhdGlvbihfQVNfTUtESVJfUF9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTI5NgpUMzIsMAptNF9pbmNsdWRlKGF1dG9jb25mL2F1dG9zY2FuLm00KQpUMjAsMjAxCl9BU19CQVNFTkFNRV9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19FWFBSX1BSRVBBUkVdKWlmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KICBhc19iYXNlbmFtZT1iYXNlbmFtZQplbHNlCiAgYXNfYmFzZW5hbWU9ZmFsc2UKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywyCl9BQ19TRURfQ01EX0xJTUlUOTkKVDE3LDE2NQpBTV9UWVBFX1BUUkRJRkZfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9UWVBFX1BUUkRJRkZfVCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0hFQ0tfVFlQRVMocHRyZGlmZl90KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTgyCkFDX1RFU1RfUFJPR1JBTV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19URVNUX1BST0dSQU0nIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFJZX1JVTl0sIFtBQ19UUllfUlVOKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMywzNAptNF9sb2NhdGlvbihBQ19DT05GSUdfTElCT0JKX0RJUikuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyOTA3ClQxNywyNzIKX0FTX0lERU5USUZJRVJfSUZtNF9jb25kKFtbJDFdXSwgW10sIFtdLAoJIFttNF9ldmFsKG00X2xlbihtNF90cmFuc2xpdChbWyQxXV0sIF1bW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfMDEyMzQ1Njc4OV1dWykpID4gMCldLCBbMV0sIFtdLAoJIFttNF9sZW4obTRfdHJhbnNsaXQobTRfZm9ybWF0KFtbJS4xc11dLCBbJDFdKSwgXVtbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9dXVspKV0sIFswXSwgWy1dKQpUMjQsNjA0Cl9BQ19DSEVDS19IRUFERVJfQ09NUElMRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19oZWFkZXJfY29tcGlsZV0sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19oZWFkZXJfY29tcGlsZV0sCiAgICBbTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVNdLAogICAgW1Rlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzCiAgICAgaW4gSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS5dKV0sCiAgWyQwX0JPRFldKUFTX1ZBUl9QVVNIREVGKFthY19IZWFkZXJdLCBbYWNfY3ZfaGVhZGVyXyQxXSlhY19mbl9bXV9BQ19MQU5HX0FCQlJFVltdX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiJDEiICJhY19IZWFkZXIiICJBU19FU0NBUEUoW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQ0XSldLCBbIiJdKSIKQVNfVkFSX0lGKFthY19IZWFkZXJdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfSGVhZGVyXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDg1CkFTX0JBU0VOQU1FJGFzX2Jhc2VuYW1lIC0tICQxIHx8Cl9BU19CQVNFTkFNRV9FWFBSKFskMV0pIDI+L2Rldi9udWxsIHx8Cl9BU19CQVNFTkFNRV9TRUQoWyQxXSlbXQpUMTEsMTI0CkFTX0JBU0VOQU1FX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOSwzMQpfbTRfYXBwbHltNF9pZihbJDJdLCBbXSwgW10sIFskMSgkMilbXV0pClQzMywxMDM5Cl9BQ19JTkNMVURFU19ERUZBVUxUX1JFUVVJUkVNRU5UU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfdGV4dChbREVGQVVMVFNdLApbIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgpkbmwgSWYgZXZlciB5b3UgY2hhbmdlIHRoaXMgdmFyaWFibGUsIHBsZWFzZSBrZWVwIGF1dG9jb25mLnRleGkgaW4gc3luYy4KYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAojaW5jbHVkZSA8c3RkaW8uaD4KI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmZGVmIFNURENfSEVBREVSUwojIGluY2x1ZGUgPHN0ZGxpYi5oPgojIGluY2x1ZGUgPHN0ZGRlZi5oPgojZWxzZQojIGlmZGVmIEhBVkVfU1RETElCX0gKIyAgaW5jbHVkZSA8c3RkbGliLmg+CiMgZW5kaWYKI2VuZGlmCiNpZmRlZiBIQVZFX1NUUklOR19ICiMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAojICBpbmNsdWRlIDxtZW1vcnkuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1RSSU5HU19ICiMgaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAojIGluY2x1ZGUgPGludHR5cGVzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TVERJTlRfSAojIGluY2x1ZGUgPHN0ZGludC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmIgpdKWRubApBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCiMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCkFDX0NIRUNLX0hFQURFUlMoW3N5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmhdLAoJCSBbXSwgW10sICRhY19pbmNsdWRlc19kZWZhdWx0KQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDE5MApBQ19TVERDX0hFQURFUlNfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1REQ19IRUFERVJTJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0hFQURFUl9TVERDXSwgW0FDX0hFQURFUl9TVERDKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwxMDIwCkFDX0xBTkdfRlVOQ19MSU5LX1RSWShDKyspQUNfTEFOR19QUk9HUkFNKApbLyogRGVmaW5lICQxIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJDEuCiAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwojZGVmaW5lICQxIGlubm9jdW91c18kMQoKLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMSAoKTsgYmVsb3cuCiAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCiAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwoKI2lmZGVmIF9fU1REQ19fCiMgaW5jbHVkZSA8bGltaXRzLmg+CiNlbHNlCiMgaW5jbHVkZSA8YXNzZXJ0Lmg+CiNlbmRpZgoKI3VuZGVmICQxCgovKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCiAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiCiNlbmRpZgpjaGFyICQxICgpOwovKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCiAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCiNpZiBkZWZpbmVkIF9fc3R1Yl8kMSB8fCBkZWZpbmVkIF9fc3R1Yl9fXyQxCmNob2tlIG1lCiNlbmRpZgpdLCBbcmV0dXJuICQxICgpO10pClQyOSwxNTYKX0FDX0NPTkZJR19ERVBFTkRFTkNZX0RFRkFVTFRtNF9pZihtNF9pbmRleChbJDJdLCBbOl0pLCBbLTFdLAoJICAgW200X2lmKFskMV0sIFtMSU5LU10sCgkJICBbQVNfTElURVJBTF9JRihbJDJdLAoJCSAgICBbbTRfZmF0YWwoW0ludmFsaWQgQUNfQ09ORklHX0xJTktTIHRhZzogYCQyJ10pXSldLAoJCSAgWzokMi5pbl0pXSkKVDgsMTgxCkFDX1VJRF9UX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1VJRF9UJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1RZUEVfVUlEX1RdLCBbQUNfVFlQRV9VSURfVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMTg5CkFDX1BST0dSQU1TX1BBVEhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUFJPR1JBTVNfUEFUSCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QQVRIX1BST0dTXSwgW0FDX1BBVEhfUFJPR1MoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDI5Cm00X2xvY2F0aW9uKF9BQ19MQU5HX1NFVCkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDo4MQpUMjcsMzQKbTRfbG9jYXRpb24oQUNfUFJPR19SQU5MSUIpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00Ojg1MQpUMTMsODQKX0FTX1FVT1RFX09MRG00X3dhcm4oW29ic29sZXRlXSwKICAgW2JhY2sgcXVvdGVzIGFuZCBkb3VibGUgcXVvdGVzIG11c3Qgbm90IGJlIGVzY2FwZWQgaW46ICQxXSkkMQpUMTAsMgptNF91bnF1b3RlJCoKVDEzLDE3NApfQUNfUFJPR19HUkVQX0FDX1BBVEhfUFJPR1NfRkVBVFVSRV9DSEVDSyhbJDFdLCBbJDJdLAoJW19BQ19GRUFUVVJFX0NIRUNLX0xFTkdUSChbYWNfcGF0aF8kMV0sIFthY19jdl9wYXRoXyQxXSwKCQlbIiRhY19wYXRoXyQxIiAkM10sIFskMV0pXSwgW10sCglbJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluXSlkbmwKClQxOSw0NDMKX0FDX0NBTk9OSUNBTF9TUExJVGNhc2UgJGFjX2N2XyQxIGluCiotKi0qKSA7OwoqKSBBQ19NU0dfRVJST1IoW2ludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsICQxXSk7Owplc2FjCkFDX1NVQlNUKFskMV0sIFskYWNfY3ZfJDFdKWRubAphY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCnNldCB4ICRhY19jdl8kMQpzaGlmdApBQ19TVUJTVChbJDFfY3B1XSwgWyRbMV1dKWRubApBQ19TVUJTVChbJDFfdmVuZG9yXSwgWyRbMl1dKWRubApzaGlmdDsgc2hpZnQKWyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICRdKiwKIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgokMV9vcz0kWypdCklGUz0kYWNfc2F2ZV9JRlMKY2FzZSAkJDFfb3MgaW4gKlwgKikgJDFfb3M9YGVjaG8gIiQkMV9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKQUNfU1VCU1QoWyQxX29zXSlkbmwKClQxNywyNTgKX0FDX0FSR19WQVJfU1RPUkVtNF9kaXZlcnRfdGV4dChbUEFSU0VfQVJHU10sCltmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwogIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CiAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CmRvbmVdKWRubAoKVDksNzIKbTRfbWFwYWxsbTRfaWYoWyQyXSwgW10sIFtdLAogICAgICAgW19tNF9mb3JlYWNoKFttNF9hcHBseShbJDFdLF0sIFspXSwgW10sICQyKV0pClQzNywzMwptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0MoRm9ydHJhbikpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MjQ1CkYxNCw2Cl9tNF9kaXZlcnRfcmF3ZGl2ZXJ0ClQxMyw3MQpBQ19MSUJTT1VSQ0VTX200X2RlZnVuX3BybyhbJDBdKW00X21hcF9hcmdzKFtBQ19MSUJTT1VSQ0VdLCAkMSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM3LDMyCm00X2xvY2F0aW9uKEFDX0VSTEFOR19TVUJTVF9FUlRTX1ZFUikuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjMwMQpUMTIsOTQKQUhfQ0hFQ0tfTElCQUhfVEVNUExBVEUoQVNfVFJfQ1BQKFtIQVZFX0xJQiQxXSksCgkgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYCQxJyBsaWJyYXJ5ICgtbCQxKS5dKQpUNDAsMzMKbTRfbG9jYXRpb24oQUNfTEFOR19QUkVQUk9DKEZvcnRyYW4gNzcpKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjIzOApUNiwxMjIKbTRfY2RybTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKICAgICAgIFskI10sIDEsIFtdLAogICAgICAgW200X2RxdW90ZShtNF9zaGlmdCgkQCkpXSkKRjYsNgpkaXZudW1kaXZudW0KVDE2LDI3Cl9BU19RVU9URV9NT0RFUk5fQVNfRVNDQVBFKFskMV0sIFtgXSwgWyIiXSkKVDE1LDM1MTgKX0FDX09VVFBVVF9GSUxFCiAgIwogICMgQ09ORklHX0ZJTEUKICAjCgpBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19JTlNUQUxMXSwKWyAgY2FzZSAkSU5TVEFMTCBpbgogIFtbXFwvJF1dKiB8ID86W1tcXC9dXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CiAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CiAgZXNhYwpdKWRubApBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19NS0RJUl9QXSwKWyAgYWNfTUtESVJfUD0kTUtESVJfUAogIGNhc2UgJE1LRElSX1AgaW4KICBbW1xcLyRdXSogfCA/OltbXFwvXV0qICkgOzsKICAqLyopIGFjX01LRElSX1A9JGFjX3RvcF9idWlsZF9wcmVmaXgkTUtESVJfUCA7OwogIGVzYWMKXSlkbmwKX0FDRU9GCgptNF9pZm5kZWYoW0FDX0RBVEFST09URElSX0NIRUNLRURdLApbY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQojIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCiMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgphY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KbTRfZGVmaW5lKFtfQUNfZGF0YXJvb3RkaXJfdmFyc10sCgkgIFtkYXRhZGlyLCBkb2NkaXIsIGluZm9kaXIsIGxvY2FsZWRpciwgbWFuZGlyXSldZG5sClttNF9kZWZpbmUoW19BQ19kYXRhcm9vdGRpcl9zdWJzdF0sIFsgIHMmQCRdWzFAJiQkXVsxJmddKV1kbmwKW2FjX3NlZF9kYXRhcm9vdD0nCi9kYXRhcm9vdGRpci8gewogIHAKICBxCn0KbTRfbWFwX2FyZ3Nfc2VwKFsvQF0sIFtAL3BdLCBbCl0sIF9BQ19kYXRhcm9vdGRpcl92YXJzKScKY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgoqZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7CipAW11tNF9qb2luKFtAKnwqQF0sIF9BQ19kYXRhcm9vdGRpcl92YXJzKUAqKQogIEFDX01TR19XQVJOKFskYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmddKQpfQUNFT0YKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCm00X21hcF9hcmdzX3NlcChbX0FDX2RhdGFyb290ZGlyX3N1YnN0KF0sIFspXSwgWwpdLCBfQUNfZGF0YXJvb3RkaXJfdmFycykKICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7Owplc2FjCl9BQ0VPRgpdKWRubAoKIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgojIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKJGV4dHJhc3ViCl9BQ0VPRgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCjp0ClsvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiXQpkbmwgY29uZmlndXJlX2lucHV0IGlzIGEgc29tZXdoYXQgc3BlY2lhbCwgc28gd2UgZG9uJ3QgY2FsbCBBQ19TVUJTVF9UUkFDRS4KZG5sIE5vdGUgaWYgeW91IGNoYW5nZSB0aGUgc3x8fCBkZWxpbWl0ZXIgaGVyZSwgZG9uJ3QgZm9yZ2V0IHRvIGFkanVzdApkbmwgYWNfc2VkX2NvbmZfaW5wdXQgYWNjb3JkaW5nbHkuICBVc2luZyAmIGlzIGEgYmFkIGlkZWEgaWYgJiBhcHBlYXJzIGluCmRubCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nLgpzfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0CmRubCBEdXJpbmcgdGhlIHRyYW5zaXRpb24gcGVyaW9kLCB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlOgpzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHRbXUFDX1NVQlNUX1RSQUNFKFt0b3BfYnVpbGRkaXJdKQpkbmwgRm9yIHRoaXMgc3Vic3RpdHV0aW9uIHNlZSB0aGUgd2l0bmVzcyBtYWNybyBfQUNfSEFWRV9UT1BfQlVJTERfUFJFRklYIGFib3ZlLgpzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0W11BQ19TVUJTVF9UUkFDRShbdG9wX2J1aWxkX3ByZWZpeF0pCm00X21hcF9hcmdzX3NlcChbJDBfQURKVVNUX0RJUihdLCBbKV0sIFsKXSwgW3NyY2Rpcl0sIFthYnNfc3JjZGlyXSwgW3RvcF9zcmNkaXJdLCBbYWJzX3RvcF9zcmNkaXJdLAogICBbYnVpbGRkaXJdLCBbYWJzX2J1aWxkZGlyXSwKICAgW2Fic190b3BfYnVpbGRkaXJdQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfSU5TVEFMTF0sCiAgICAgWywgW0lOU1RBTExdXSlBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19NS0RJUl9QXSwgWywgW01LRElSX1BdXSkpCm00X2lmbmRlZihbQUNfREFUQVJPT1RESVJfQ0hFQ0tFRF0sIFskYWNfZGF0YXJvb3RkaXJfaGFjawpdKWRubAoiCmV2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiBtNF9kZWZuKFtfQUNfU1VCU1RfQ01EU10pIFwKICA+JGFjX3RtcC9vdXQgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkKCm00X2lmbmRlZihbQUNfREFUQVJPT1RESVJfQ0hFQ0tFRF0sClt0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgogIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCiAgeyBhY19vdXQ9YHNlZCAtbiAnL15bWwkgXV0qZGF0YXJvb3RkaXJbWwkgXV0qOio9L3AnIFwKICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCiAgQUNfTVNHX1dBUk4oWyRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBgZGF0YXJvb3RkaXInCndoaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZF0pCl0pZG5sCgogIHJtIC1mICIkYWNfdG1wL3N0ZGluIgogIGNhc2UgJGFjX2ZpbGUgaW4KICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CiAgZXNhYyBcCiAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkKZG5sIFRoaXMgd291bGQgYnJlYWsgTWFrZWZpbGUgZGVwZW5kZW5jaWVzOgpkbmwgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9vdXQiID4vZGV2L251bGwgMj4mMTsgdGhlbgpkbmwgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgpkbmwgIGVsc2UKZG5sICAgICBybSAtZiAiJGFjX2ZpbGUiOyBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSIKZG5sICBmaQoKVDE5LDk1Cl9BQ19MQU5HX0lPX1BST0dSQU1fbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19TT1VSQ0UoW19BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsNDU5CkFDX0xBTkdfSU5UX1NBVkUoR28pQUNfTEFOR19QUk9HUkFNKFskMQppbXBvcnQgKAoJImZtdCIKCSJvcyIKKQpdLApbZiwgZXJyIDo9IG9zLk9wZW4oImNvbmZ0ZXN0LnZhbCIsIG9zLk9fQ1JFQVRFfG9zLk9fV1JPTkxZLCAwNzc3KQogaWYgZXJyICE9IG5pbCB7Cglvcy5FeGl0KDEpCiB9CiBpZiAkMiA8IDAgewoJaW50NjQgaSA9IGludDY0KCQyKQoJaWYgaSAhPSAkMiB7CgkJb3MuRXhpdCgxKQoJfQoJaWYgXywgZXJyIDo9IGZtdC5QcmludChmLCBpKTsgZXJyICE9IG5pbCB7CgkJb3MuRXhpdCgxKQoJfQogfSBlbHNlIHsKCXVpbnQ2NCBpID0gdWludDY0KCQyKQoJaWYgaSAhPSAkMiB7CgkJb3MuRXhpdCgxKQoJfQoJaWYgXywgZXJyIDo9IGZtdC5QcmludChmLCBpKTsgZXJyICE9IG5pbCB7CgkJb3MuRXhpdCgxKQoJfQogfQogaWYgZXJyID0gZi5DbG9zZSgpOyBlcnIgIT0gbmlsIHsKCW9zLkV4aXQoMSkKIH0KIG9zLkV4aXQoMCk7Cl0pClQyNCwzMwptNF9sb2NhdGlvbihBQ19TRVRfTUFLRSkuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NzIKVDExLDg3MwpfQUNfUFJPR19GQ19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApBQ19DSEVDS19UT09MUyhbXV9BQ19GQ1tdLAogICAgICBtNF9kZWZhdWx0KFskMl0sCgltNF9jYXNlKF9BQ19GQ19ESUFMRUNUX1lFQVIoWyQxXSksCgkJWzE5OTVdLCBbX0FDX0Y5NV9GQ10sCgkJWzE5OTBdLCBbX0FDX0Y5MF9GQyBfQUNfRjk1X0ZDXSwKCQlbMTk3N10sIFtfQUNfRjc3X0ZDIF9BQ19GOTBfRkMgX0FDX0Y5NV9GQ10sCgkJW19BQ19GOTVfRkMgX0FDX0Y5MF9GQyBfQUNfRjc3X0ZDXSkpKQoKIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgpfQVNfRUNIT19MT0coW2NoZWNraW5nIGZvciBfQUNfTEFORyBjb21waWxlciB2ZXJzaW9uXSkKc2V0IFggJGFjX2NvbXBpbGUKYWNfY29tcGlsZXI9JFsyXQpmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCiAgX0FDX0RPX0xJTUlUKFskYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JkFTX01FU1NBR0VfTE9HX0ZEXSkKZG9uZQpybSAtZiBhLm91dAoKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9FWEVFWFRdKVtdZG5sCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfT0JKRVhUXSlbXWRubAojIElmIHdlIGRvbid0IHVzZSBgLkYnIGFzIGV4dGVuc2lvbiwgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgcnVuIG9uIHRoZQojIGlucHV0IGZpbGUuICAoTm90ZSB0aGF0IHRoaXMgb25seSBuZWVkcyB0byB3b3JrIGZvciBHTlUgY29tcGlsZXJzLikKYWNfc2F2ZV9leHQ9JGFjX2V4dAphY19leHQ9RgpfQUNfTEFOR19DT01QSUxFUl9HTlUKYWNfZXh0PSRhY19zYXZlX2V4dApfQUNfUFJPR19GQ19HCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMzMKbTRfbG9jYXRpb24oQUNfSEVBREVSX0FTU0VSVCkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo0MzcKVDMwLDMzCm00X2xvY2F0aW9uKEFDX0hBVkVfUE9VTkRCQU5HKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo3NgpUMjMsNjAKQUNfTEFOR19QUk9HUkFNKEVybGFuZylbLW1vZHVsZShjb25mdGVzdCkuCi1leHBvcnQoW3N0YXJ0LzBdKS5dCiQxCnN0YXJ0KCkgLT4KJDIKLgoKVDE0LDQxCl9tNF9saXN0X2NtcF8xX200X2xpc3RfY21wXzIoWyQyXSwgW200X3NoaWZ0MigkQCldLCAkMSkKVDIwLDIKX200X2RpdmVydChERUZBVUxUUykxMApUMjgsNjUKQUNfTEFOR19DT01QSUxFUihGb3J0cmFuIDc3KV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw5NQpfbTRfbGlzdF9jbXBfMl9tNF9saXN0X2NtcChbJDEkM10sIG00X2NtcChbJDMrMF0sIFskMSswXSkpKAogIFtfbTRfbGlzdF9jbXBfMShtNF9kcXVvdGUobTRfc2hpZnQzKCRAKSksICQyKV0pClQ5LDIxNwpBQ19FTVhPUzJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRU1YT1MyJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DQU5PTklDQUxfSE9TVApjYXNlICRob3N0X29zIGluCiAgKmVteCogKSBFTVhPUzI9eWVzOzsKICAgICAgKiApIEVNWE9TMj1ubzs7CmVzYWMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxNDgKQUNfREVDTF9ZWVRFWFRfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfREVDTF9ZWVRFWFQnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX1BST0dfTEVYW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSw1MwpfbTRfam9pbmFsbG00X2lmKFskI10sIFsyXSwgW10sIFtbJDEkM10kMChbJDFdLCBtNF9zaGlmdDIoJEApKV0pClQyNSwyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oR28pQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDE4LDMKX0FDX0NDKEZvcnRyYW4gNzcpRjc3ClQxNSwxOTIKQUNfTUFKT1JfSEVBREVSX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX01BSk9SX0hFQURFUicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19IRUFERVJfTUFKT1JdLCBbQUNfSEVBREVSX01BSk9SKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxMzcKX0FTX0RJUk5BTUVfRVhQUiRhc19leHByIFhbXSQxIDogJ1hcKC4qW1teL11dXCkvLypbW14vXVteL11dKi8qJCcgXHwgXAoJIFhbXSQxIDogJ1hcKC8vXClbW14vXV0nIFx8IFwKCSBYW10kMSA6ICdYXCgvL1wpJCcgXHwgXAoJIFhbXSQxIDogJ1hcKC9cKScgXHwgLltdClQxNiwxMjkKX0FTX0RJUk5BTUVfRVhQUl9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfRVhQUl9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOCw0MQpBVV9BTElBU0FVX0RFRlVOKFskMV0sIF9BVV9BTElBU19CT0RZKFskXSwgWyQyXSkpClQxNSw2NTAKQUNfRlVOQ19TRVRQR1JQX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgc2V0cGdycCB0YWtlcyBubyBhcmd1bWVudCwgYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQsCltBQ19SVU5fSUZFTFNFKApbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwKWy8qIElmIHRoaXMgc3lzdGVtIGhhcyBhIEJTRC1zdHlsZSBzZXRwZ3JwIHdoaWNoIHRha2VzIGFyZ3VtZW50cywKICBzZXRwZ3JwKDEsIDEpIHdpbGwgZmFpbCB3aXRoIEVTUkNIIGFuZCByZXR1cm4gLTEsIGluIHRoYXQgY2FzZQogIGV4aXQgc3VjY2Vzc2Z1bGx5LiAqLwogIHJldHVybiBzZXRwZ3JwICgxLDEpICE9IC0xO10pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQ9bm9dLAoJICAgICAgIFthY19jdl9mdW5jX3NldHBncnBfdm9pZD15ZXNdLAoJICAgICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBjaGVjayBzZXRwZ3JwIHdoZW4gY3Jvc3MgY29tcGlsaW5nXSldKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfc2V0cGdycF92b2lkID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKFNFVFBHUlBfVk9JRCwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIGBzZXRwZ3JwJyBmdW5jdGlvbiB0YWtlcyBubyBhcmd1bWVudC5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDksMTU4Cm00X3BvcGRlZm00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF9wb3BkZWYoWyQxXSldLAoJCQkgICAgW200X2ZhdGFsKFskMDogdW5kZWZpbmVkIG1hY3JvOiAkMV0pXSldLAogICAgICAgW200X21hcF9hcmdzKFskMF0sICRAKV0pClQyMSwyOQptNF9sb2NhdGlvbihBU19VTlNFVCkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjY3MQpUMjIsMjgwMApfQUNfRkNfTElCUkFSWV9MREZMQUdTX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKX0FDX0ZPUlRSQU5fQVNTRVJUKClkbmwKX0FDX1BST0dfRkNfVgpBQ19DQUNIRV9DSEVDSyhbZm9yIF9BQ19MQU5HIGxpYnJhcmllcyBvZiAkW11fQUNfRkNbXV0sIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicywKW2lmIHRlc3QgIngkW11fQUNfTEFOR19QUkVGSVhbXUxJQlMiICE9ICJ4IjsgdGhlbgogIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicz0iJFtdX0FDX0xBTkdfUFJFRklYW11MSUJTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KZWxzZQoKX0FDX1BST0dfRkNfVl9PVVRQVVQKCmFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicz0KCiMgU2F2ZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyAoaWYgYW55KQphY19zYXZlX3Bvc2l0aW9uYWw9IiRbQF0iCgpzZXQgWCAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dAp3aGlsZSB0ZXN0ICRbQCU6QF0gIT0gMTsgZG8KICBzaGlmdAogIGFjX2FyZz0kWzFdCiAgY2FzZSAkYWNfYXJnIGluCglbW1xcL11dKi5hIHwgPzpbW1xcL11dKi5hKQoJICBfQUNfTElTVF9NRU1CRVJfSUYoJGFjX2FyZywgJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicywgLAoJICAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzICRhY19hcmciKQoJICA7OwoJLWJJOiopCgkgIF9BQ19MSVNUX01FTUJFUl9JRigkYWNfYXJnLCAkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzLCAsCgkgICAgIFtfQUNfTElOS0VSX09QVElPTihbJGFjX2FyZ10sIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicyldKQoJICA7OwoJICAjIElnbm9yZSB0aGVzZSBmbGFncy4KCS1sYW5nKiB8IC1sY3J0Ki5vIHwgLWxjIHwgLWxnY2MqIHwgLWxTeXN0ZW0gfCAtbGlibWlsIHwgLWxpdHRsZSBcCgkgIHwtTEFORzo9KiB8IC1MSVNUOiogfCAtTE5POiogfCAtbGluaykKCSAgOzsKCS1sa2VybmVsMzIpCgkgIGNhc2UgJGhvc3Rfb3MgaW4KCSAgKmN5Z3dpbiopIDs7CgkgICopIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicyAkYWNfYXJnIgoJICAgIDs7CgkgIGVzYWMKCSAgOzsKCS1bW0xSdVl6XV0pCgkgICMgVGhlc2UgZmxhZ3MsIHdoZW4gc2VlbiBieSB0aGVtc2VsdmVzLCB0YWtlIGFuIGFyZ3VtZW50LgoJICAjIFdlIHJlbW92ZSB0aGUgc3BhY2UgYmV0d2VlbiBvcHRpb24gYW5kIGFyZ3VtZW50IGFuZCByZS1pdGVyYXRlCgkgICMgdW5sZXNzIHdlIGZpbmQgYW4gZW1wdHkgYXJnIG9yIGEgbmV3IG9wdGlvbiAoc3RhcnRpbmcgd2l0aCAtKQoJICBjYXNlICRbMl0gaW4KCSAgICAgIiIgfCAtKik7OwoJICAgICAqKQoJCWFjX2FyZz0iJGFjX2FyZyRbMl0iCgkJc2hpZnQ7IHNoaWZ0CgkJc2V0IFggJGFjX2FyZyAiJFtAXSIKCQk7OwoJICBlc2FjCgkgIDs7CgktWVAsKikKCSAgZm9yIGFjX2ogaW4gYEFTX0VDSE8oWyIkYWNfYXJnIl0pIHwgc2VkIC1lICdzLy1ZUCwvLUwvO3MvOi8gLUwvZydgOyBkbwoJICAgIF9BQ19MSVNUX01FTUJFUl9JRigkYWNfaiwgJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicywgLAoJCQkgICAgICAgW2FjX2FyZz0iJGFjX2FyZyAkYWNfaiIKCQkJICAgICAgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicyAkYWNfaiJdKQoJICBkb25lCgkgIDs7CgktW1tsTFJdXSopCgkgIF9BQ19MSVNUX01FTUJFUl9JRigkYWNfYXJnLCAkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzLCAsCgkJCSAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzICRhY19hcmciKQoJICA7OwoJLXphbGxleHRyYWN0KnwgLXpkZWZhdWx0ZXh0cmFjdCkKCSAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzICRhY19hcmciCgkgIDs7CgkgICMgSWdub3JlIGV2ZXJ5dGhpbmcgZWxzZS4KICBlc2FjCmRvbmUKIyByZXN0b3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzCnNldCBYICRhY19zYXZlX3Bvc2l0aW9uYWw7IHNoaWZ0CgojIFdlIG9ubHkgY29uc2lkZXIgIkxEX1JVTl9QQVRIIiBvbiBTb2xhcmlzIHN5c3RlbXMuICBJZiB0aGlzIGlzIHNlZW4sCiMgdGhlbiB3ZSBpbnNpc3QgdGhhdCB0aGUgInJ1biBwYXRoIiBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGggKGkuZS4gaXQKIyBtdXN0IGJlZ2luIHdpdGggYSAiLyIpLgpjYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KICAgIlN1bk9TIDUiKikKICAgICAgYWNfbGRfcnVuX3BhdGg9YEFTX0VDSE8oWyIkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCJdKSB8CgkJCXNlZCAtbiAncyxeLipMRF9SVU5fUEFUSCAqPSAqXCgvW1teIF1dKlwpLiokLC1SXDEscCdgCiAgICAgIHRlc3QgIngkYWNfbGRfcnVuX3BhdGgiICE9IHggJiYKCV9BQ19MSU5LRVJfT1BUSU9OKFskYWNfbGRfcnVuX3BhdGhdLCBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnMpCiAgICAgIDs7CmVzYWMKZmkgIyB0ZXN0ICJ4JFtdX0FDX0xBTkdfUFJFRklYW11MSUJTIiA9ICJ4IgpdKQpbXV9BQ19MQU5HX1BSRUZJWFtdTElCUz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicyIKQUNfU1VCU1QoW11fQUNfTEFOR19QUkVGSVhbXUxJQlMpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMzQKbTRfbG9jYXRpb24oX0FDX1BSRVBST0NfSUZFTFNFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI1MDMKRjUsNQppbmRpcmluZGlyClQxOSw1NzIKX0FDX0NPTVBJTEVSX0VYRUVYVEFDX0xBTkdfQ09ORlRFU1QoW19BQ19MQU5HX05VTExfUFJPR1JBTV0pCmFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCmFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKX0FDX0NPTVBJTEVSX0VYRUVYVF9ERUZBVUxUCnJtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CmFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCl9BQ19DT01QSUxFUl9FWEVFWFRfTwpybSAtZiBjb25mdGVzdC4kYWNfZXh0CkFDX1NVQlNUKFtFWEVFWFRdLCBbJGFjX2N2X2V4ZWV4dF0pZG5sCmFjX2V4ZWV4dD0kRVhFRVhUCkFDX0xBTkdfQ09ORlRFU1QoW19BQ19MQU5HX0lPX1BST0dSQU1dKQphY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKX0FDX0NPTVBJTEVSX0VYRUVYVF9DUk9TUwpybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKClQxNywxNTEKX0FDX0NIRUNLX01FTUJFUlNbJDFdLCBbQUNfREVGSU5FX1VOUVVPVEVEKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCiAgW0RlZmluZSB0byAxIGlmIGBdbTRfYnBhdHN1YnN0KFskMV0sCiAgICBbXlwoW14uXSpcKVwuXCguKlwpXSwgW1tcMicgaXMgYSBtZW1iZXIgb2YgYFwxXV0pWycuXSldClQxMiwxNTIKX200X3NldF9kdW1wbTRfaWZkZWYoW19tNF9zZXQoWyQxXSldLAoJICBbWyQyXV9tNF9kZWZuKFtfbTRfc2V0KFskMV0pXSlfbTRfcG9wZGVmKFtfbTRfc2V0KFskMV0sXV9tNF9kZWZuKAoJCVtfbTRfc2V0KFskMV0pXSlbKV0sIFtfbTRfc2V0KFskMV0pXSkkMChbJDFdLCBbJDIkM10pXSkKVDE3LDE5NgpBU19TSEVMTF9TQU5JVElaRV9BU19TSEVMTF9TQU5JVElaRQptNF9wcm92aWRlX2lmKFtBU19JTklUXSwgW10sClttNF9wcm92aWRlKFtBU19JTklUXSkKX0FTX0RFVEVDVF9SRVFVSVJFRChbX0FTX1NIRUxMX0ZOX1dPUktdKQpfQVNfREVURUNUX1JFUVVJUkVEKFtfQVNfVEVTVF9YX1dPUktTXSkKX0FTX0RFVEVDVF9CRVRURVJfU0hFTEwKX0FTX1VOU0VUX1BSRVBBUkUKXSkKVDE0LDg5CkFDX0xJTktfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfQ09NUElMRVJfUkVRVUlSRSgpZG5sCl9BQ19MSU5LX0lGRUxTRSgkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDMyCm00X21ha2VfbGlzdG00X2pvaW4oWywKXSwgbTRfZHF1b3RlX2VsdCgkQCkpClQxNyw4MDYKQUNfUFJPR19PQkpDWFhDUFBfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19PQkpDWFhdKWRubApBQ19BUkdfVkFSKFtPQkpDWFhDUFBdLCAgIFtPYmplY3RpdmUgQysrIHByZXByb2Nlc3Nvcl0pZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKQUNfTEFOR19QVVNIKE9iamVjdGl2ZSBDKyspZG5sCkFDX01TR19DSEVDS0lORyhbaG93IHRvIHJ1biB0aGUgT2JqZWN0aXZlIEMrKyBwcmVwcm9jZXNzb3JdKQppZiB0ZXN0IC16ICIkT0JKQ1hYQ1BQIjsgdGhlbgogIEFDX0NBQ0hFX1ZBTChhY19jdl9wcm9nX09CSkNYWENQUCwKICBbZG5sCiAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBPQkpDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKICAgIGZvciBPQkpDWFhDUFAgaW4gIiRPQkpDWFggLUUiICIvbGliL2NwcCIKICAgIGRvCiAgICAgIF9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFKFticmVha10pCiAgICBkb25lCiAgICBhY19jdl9wcm9nX09CSkNYWENQUD0kT0JKQ1hYQ1BQCiAgXSlkbmwKICBPQkpDWFhDUFA9JGFjX2N2X3Byb2dfT0JKQ1hYQ1BQCmVsc2UKICBhY19jdl9wcm9nX09CSkNYWENQUD0kT0JKQ1hYQ1BQCmZpCkFDX01TR19SRVNVTFQoWyRPQkpDWFhDUFBdKQpfQUNfUFJPR19QUkVQUk9DX1dPUktTX0lGRUxTRShbXSwKCSAgW0FDX01TR19GQUlMVVJFKFtPYmplY3RpdmUgQysrIHByZXByb2Nlc3NvciAiJE9CSkNYWENQUCIgZmFpbHMgc2FuaXR5IGNoZWNrXSldKQpBQ19TVUJTVChPQkpDWFhDUFApZG5sCkFDX0xBTkdfUE9QKE9iamVjdGl2ZSBDKyspZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTg1CkFDX0NIRUNLX0hFQURFUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pbmRpcihtNF9jYXNlKFskNF0sCgkJICBbXSwgIFtbX0FDX0NIRUNLX0hFQURFUl9NT05HUkVMXV0sCgkJICBbLV0sIFtbX0FDX0NIRUNLX0hFQURFUl9QUkVQUk9DXV0sCgkJICAgICAgIFtbX0FDX0NIRUNLX0hFQURFUl9DT01QSUxFXV0pLCAkQCkKW11fbTRfZGVmdW5fZXBpKFskMF0pCkY1LDUKaW5kZXhpbmRleApUMTMsMTg4CkFDX0hBVkVfRlVOQ1NfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEFWRV9GVU5DUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DSEVDS19GVU5DU10sIFtBQ19DSEVDS19GVU5DUygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMjkKbTRfbG9jYXRpb24oX0FTX0VDSE9fTl9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6ODA3ClQyOCwzMwptNF9sb2NhdGlvbihBTV9QUk9HX0lOU1RBTEwpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjkyClQzMCwzMAptNF9sb2NhdGlvbihBQ19OT19FWEVDVVRBQkxFUykuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDo0MDYKVDI0LDIzCl9BQ19MQU5HX05VTExfUFJPR1JBTShDKUFDX0xBTkdfUFJPR1JBTShbXSwgW10pClQxOSwyOTUKQUNfREVDTF9TWVNfU0lHTElTVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19ERUNMX1NZU19TSUdMSVNUJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DSEVDS19ERUNMUyhbc3lzX3NpZ2xpc3RdLCwsClsjaW5jbHVkZSA8c2lnbmFsLmg+Ci8qIE5ldEJTRCBkZWNsYXJlcyBzeXNfc2lnbGlzdCBpbiB1bmlzdGQuaC4gICovCiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgpdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDI5Cm00X2xvY2F0aW9uKEFTX0xJTkVOT19QVVNIKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6ODk0ClQzMSwzNQptNF9sb2NhdGlvbihBQ19SRVBMQUNFX0ZOTUFUQ0gpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1NzMKVDI5LDMwCm00X2xvY2F0aW9uKEFDX0xBTkdfSU5UX1NBVkUpLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6Mjk3ClQyOCwyOAptNF9sb2NhdGlvbihBQ19QUk9HX0NDX1NUREMpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MTM3OApUMjYsMjgKbTRfbG9jYXRpb24oQUNfQ19SRVNUUklDVCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxNzM5ClQxMSw0OTgKX0FTX01LRElSX1BjYXNlICRhc19kaXIgaW4gIygKICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CiAgZXNhYwogIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewogICAgYXNfZGlycz0KICAgIHdoaWxlIDo7IGRvCiAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAogICAgICAqXCcqKSBhc19xZGlyPWBBU19FQ0hPKFsiJGFzX2RpciJdKSB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAogICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwogICAgICBlc2FjCiAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCiAgICAgIGFzX2Rpcj1gQVNfRElSTkFNRSgiJGFzX2RpciIpYAogICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawogICAgZG9uZQogICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgogIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgQVNfRVJST1IoW2Nhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXJdKQoKVDI1LDQwCl9BQ19IQVZFX1RPUF9CVUlMRF9QUkVGSVhfbTRfZGVmdW5fcHJvKFskMF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxOTIKQUNfUFJPR1JBTVNfQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUFJPR1JBTVNfQ0hFQ0snIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ0hFQ0tfUFJPR1NdLCBbQUNfQ0hFQ0tfUFJPR1MoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM5LDMwCm00X2xvY2F0aW9uKF9BU19QQVRIX1NFUEFSQVRPUl9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTMxNQpUNSw3MwptNF9kb200X2lmKFskI10sIDAsIFtdLAogICAgICAgWyQjXSwgMSwgWyQxW11dLAogICAgICAgWyQxW10kMChtNF9zaGlmdCgkQCkpXSkKVDEwLDE4NwpBQ19TVFJDT0xMX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NUUkNPTEwnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19TVFJDT0xMXSwgW0FDX0ZVTkNfU1RSQ09MTCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpGOSw2Cm00X3N1YnN0cnN1YnN0cgpUMzMsMjkKbTRfbG9jYXRpb24oX0FTX0RFVEVDVF9TVUdHRVNURUQpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxNjcKVDM0LDMzCm00X2xvY2F0aW9uKEFDX0NIRUNLX0hFQURFUlNfT05DRSkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDoyNzMKVDE4LDgKbTRfUEFDS0FHRV9UQVJOQU1FYXV0b2NvbmYKVDE0LDg3CkFDX1BST0dfQ0NfQzk5X200X2RlZnVuX3BybyhbJDBdKSBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKICBfQUNfUFJPR19DQ19DOTkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywyNTIKbTRfc2V0X3JlbW92ZW00X3NldF9jb250YWlucyhbJDFdLCBbJDJdLCBbX200X3NldF9zaXplKFskMV0sCiAgICBbbTRfZGVjcl0pbTRfaWYoX200X2RlZm4oW19tNF9zZXQoWyQxXSldKSwgWyQyXSwKCQkgICAgW19tNF9wb3BkZWYoW19tNF9zZXQoWyQxXSwkMildLCBbX200X3NldChbJDFdKV0pXSwKCQkgICAgW200X2RlZmluZShbX200X3NldF9jbGVhbnVwKCQxKV0pbTRfZGVmaW5lKAoJCSAgICAgIFtfbTRfc2V0KFskMV0sJDIpXSwgWzBdKV0pJDNdLCBbJDRdKQpUMTksMTA5Cl9tNF9kZWZ1bl9lcGlfb3V0ZXJfbTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X2R1bXBdLCBbX200X2RpdmVydGluZyhbJDFdKV0sIFtfbTRfZGl2ZXJ0aW5nXSltNF9kaXZlcnRfcG9wKFtHUk9XXSltNF91bmRpdmVydChbR1JPV10pClQyMCwzCl9BQ19MQU5HX1BSRUZJWChDKyspQ1hYClQxMCwyNApBTl9NQUtFVkFSQU5fT1VUUFVUKFttYWtldmFyXSwgJEApClQyMSwxMjI5CkFDX1RZUEVfTE9OR19MT05HX0lOVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19SRVFVSVJFKFtBQ19UWVBFX1VOU0lHTkVEX0xPTkdfTE9OR19JTlRdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbG9uZyBsb25nIGludF0sIFthY19jdl90eXBlX2xvbmdfbG9uZ19pbnRdLAogICAgIFthY19jdl90eXBlX2xvbmdfbG9uZ19pbnQ9eWVzCiAgICAgIGlmIHRlc3QgIngke2FjX2N2X3Byb2dfY2NfYzk5LW5vfSIgPSB4bm87IHRoZW4KCWFjX2N2X3R5cGVfbG9uZ19sb25nX2ludD0kYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmdfaW50CglpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfbG9uZ19pbnQgPSB5ZXM7IHRoZW4KCSAgZG5sIENhdGNoIGEgYnVnIGluIFRhbmRlbSBOb25TdG9wIEtlcm5lbCAoT1NTKSBjYyAtTyBjaXJjYSAyMDA0LgoJICBkbmwgSWYgY3Jvc3MgY29tcGlsaW5nLCBhc3N1bWUgdGhlIGJ1ZyBpcyBub3QgaW1wb3J0YW50LCBzaW5jZQoJICBkbmwgbm9ib2R5IGNyb3NzIGNvbXBpbGVzIGZvciB0aGlzIHBsYXRmb3JtIGFzIGZhciBhcyB3ZSBrbm93LgoJICBBQ19SVU5fSUZFTFNFKAoJICAgIFtBQ19MQU5HX1BST0dSQU0oCgkgICAgICAgW1tAJTpAaW5jbHVkZSA8bGltaXRzLmg+CgkJIEAlOkBpZm5kZWYgTExPTkdfTUFYCgkJIEAlOkAgZGVmaW5lIEhBTEYgXAoJCQkgICgxTEwgPDwgKHNpemVvZiAobG9uZyBsb25nIGludCkgKiBDSEFSX0JJVCAtIDIpKQoJCSBAJTpAIGRlZmluZSBMTE9OR19NQVggKEhBTEYgLSAxICsgSEFMRikKCQkgQCU6QGVuZGlmXV0sCgkgICAgICAgW1tsb25nIGxvbmcgaW50IG4gPSAxOwoJCSBpbnQgaTsKCQkgZm9yIChpID0gMDsgOyBpKyspCgkJICAgewoJCSAgICAgbG9uZyBsb25nIGludCBtID0gbiA8PCBpOwoJCSAgICAgaWYgKG0gPj4gaSAhPSBuKQoJCSAgICAgICByZXR1cm4gMTsKCQkgICAgIGlmIChMTE9OR19NQVggLyAyIDwgbSkKCQkgICAgICAgYnJlYWs7CgkJICAgfQoJCSByZXR1cm4gMDtdXSldLAoJICAgIFtdLAoJICAgIFthY19jdl90eXBlX2xvbmdfbG9uZ19pbnQ9bm9dLAoJICAgIFs6XSkKCWZpCiAgICAgIGZpXSkKICBpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfbG9uZ19pbnQgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShbSEFWRV9MT05HX0xPTkdfSU5UXSwgWzFdLAogICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgbG9uZyBpbnQnLl0pCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxOTQKQUNfSEFWRV9IRUFERVJTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hBVkVfSEVBREVSUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DSEVDS19IRUFERVJTXSwgW0FDX0NIRUNLX0hFQURFUlMoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDg3MwpBQ19GVU5DX1NUUlRPTERfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3RydG9sZCBjb25mb3JtcyB0byBDOTldLAogICAgW2FjX2N2X2Z1bmNfc3RydG9sZF0sCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKAoJICBbWy8qIE9uIEhQLVVYIGJlZm9yZSAxMS4yMywgc3RydG9sZCByZXR1cm5zIGEgc3RydWN0IGluc3RlYWQgb2YKCQlsb25nIGRvdWJsZS4gIFJlamVjdCBpbXBsZW1lbnRhdGlvbnMgbGlrZSB0aGF0LCBieSByZXF1aXJpbmcKCQljb21wYXRpYmlsaXR5IHdpdGggdGhlIEM5OSBwcm90b3R5cGUuICAqLwojCSAgICAgaW5jbHVkZSA8c3RkbGliLmg+CgkgICAgIHN0YXRpYyBsb25nIGRvdWJsZSAoKnApIChjaGFyIGNvbnN0ICosIGNoYXIgKiopID0gc3RydG9sZDsKCSAgICAgc3RhdGljIGxvbmcgZG91YmxlCgkgICAgIHRlc3QgKGNoYXIgY29uc3QgKm5wdHIsIGNoYXIgKiplbmRwdHIpCgkgICAgIHsKCSAgICAgICBsb25nIGRvdWJsZSByOwoJICAgICAgIHIgPSBzdHJ0b2xkIChucHRyLCBlbmRwdHIpOwoJICAgICAgIHJldHVybiByOwoJICAgICB9XV0sCgkgICBbW3JldHVybiB0ZXN0ICgiMS4wIiwgTlVMTCkgIT0gMSB8fCBwICgiMS4wIiwgTlVMTCkgIT0gMTtdXSldLAogICAgICAgW2FjX2N2X2Z1bmNfc3RydG9sZD15ZXNdLAogICAgICAgW2FjX2N2X2Z1bmNfc3RydG9sZD1ub10pXSkKICBpZiB0ZXN0ICRhY19jdl9mdW5jX3N0cnRvbGQgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShbSEFWRV9TVFJUT0xEXSwgMSwKICAgICAgW0RlZmluZSB0byAxIGlmIHN0cnRvbGQgZXhpc3RzIGFuZCBjb25mb3JtcyB0byBDOTkuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDkwCkFDX0NIRUNLX0hFQURFUlNfT05DRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUNfQ0hFQ0tfSEVBREVSX09OQ0UoXSwgWyldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMzAKbTRfbG9jYXRpb24oX0FTX1RSX1BSRVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxODc4ClQyNiwzNAptNF9sb2NhdGlvbihBQ19QUk9HX0VHUkVQKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDozNTUKVDE4LDM1NDAKX0FDX09VVFBVVF9TVUJESVJTCiMKIyBDT05GSUdfU1VCRElSUyBzZWN0aW9uLgojCmlmIHRlc3QgIiRub19yZWN1cnNpb24iICE9IHllczsgdGhlbgoKICAjIFJlbW92ZSAtLWNhY2hlLWZpbGUsIC0tc3JjZGlyLCBhbmQgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyBhcmd1bWVudHMKICAjIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCiAgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPQogIGFjX3ByZXY9CiAgZXZhbCAic2V0IHggJGFjX2NvbmZpZ3VyZV9hcmdzIgogIHNoaWZ0CiAgZm9yIGFjX2FyZwogIGRvCiAgICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KICAgICAgYWNfcHJldj0KICAgICAgY29udGludWUKICAgIGZpCiAgICBjYXNlICRhY19hcmcgaW4KICAgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKICAgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQogICAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKICAgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAogICAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogXAogICAgfCAtLWM9KikKICAgICAgOzsKICAgIC0tY29uZmlnLWNhY2hlIHwgLUMpCiAgICAgIDs7CiAgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQogICAgICBhY19wcmV2PXNyY2RpciA7OwogICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKICAgICAgOzsKICAgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCiAgICAgIGFjX3ByZXY9cHJlZml4IDs7CiAgICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCiAgICAgIDs7CiAgICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nKQogICAgICA7OwogICAgKikKICAgICAgY2FzZSAkYWNfYXJnIGluCiAgICAgICpcJyopIGFjX2FyZz1gQVNfRUNITyhbIiRhY19hcmciXSkgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKICAgICAgZXNhYwogICAgICBBU19WQVJfQVBQRU5EKFthY19zdWJfY29uZmlndXJlX2FyZ3NdLCBbIiAnJGFjX2FyZyciXSkgOzsKICAgIGVzYWMKICBkb25lCgogICMgQWx3YXlzIHByZXBlbmQgLS1wcmVmaXggdG8gZW5zdXJlIHVzaW5nIHRoZSBzYW1lIHByZWZpeAogICMgaW4gc3ViZGlyIGNvbmZpZ3VyYXRpb25zLgogIGFjX2FyZz0iLS1wcmVmaXg9JHByZWZpeCIKICBjYXNlICRhY19hcmcgaW4KICAqXCcqKSBhY19hcmc9YEFTX0VDSE8oWyIkYWNfYXJnIl0pIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgZXNhYwogIGFjX3N1Yl9jb25maWd1cmVfYXJncz0iJyRhY19hcmcnICRhY19zdWJfY29uZmlndXJlX2FyZ3MiCgogICMgUGFzcyAtLXNpbGVudAogIGlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCiAgICBhY19zdWJfY29uZmlndXJlX2FyZ3M9Ii0tc2lsZW50ICRhY19zdWJfY29uZmlndXJlX2FyZ3MiCiAgZmkKCiAgIyBBbHdheXMgcHJlcGVuZCAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nIHRvIHNpbGVuY2Ugd2FybmluZ3MsIHNpbmNlCiAgIyBkaWZmZXJlbnQgc3ViZGlycyBjYW4gaGF2ZSBkaWZmZXJlbnQgLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zLgogIGFjX3N1Yl9jb25maWd1cmVfYXJncz0iLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIgoKICBhY19wb3BkaXI9YHB3ZGAKICBmb3IgYWNfZGlyIGluIDogJHN1YmRpcnM7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCgogICAgIyBEbyBub3QgY29tcGxhaW4sIHNvIGEgY29uZmlndXJlIHNjcmlwdCBjYW4gY29uZmlndXJlIHdoaWNoZXZlcgogICAgIyBwYXJ0cyBvZiBhIGxhcmdlIHNvdXJjZSB0cmVlIGFyZSBwcmVzZW50LgogICAgdGVzdCAtZCAiJHNyY2Rpci8kYWNfZGlyIiB8fCBjb250aW51ZQoKICAgIGFjX21zZz0iPT09IGNvbmZpZ3VyaW5nIGluICRhY19kaXIgKGBwd2RgLyRhY19kaXIpIgogICAgX0FTX0VDSE9fTE9HKFskYWNfbXNnXSkKICAgIF9BU19FQ0hPKFskYWNfbXNnXSkKICAgIEFTX01LRElSX1AoWyIkYWNfZGlyIl0pCiAgICBfQUNfU1JDRElSUyhbIiRhY19kaXIiXSkKCiAgICBjZCAiJGFjX2RpciIKCiAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZTsgb3RoZXJ3aXNlIGdldCBDeWdudXMgc3R5bGUgY29uZmlndXJlLgogICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgogICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zcmNkaXIvY29uZmlndXJlLmdudQogICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0kYWNfc3JjZGlyL2NvbmZpZ3VyZQogICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbiI7IHRoZW4KICAgICAgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgogICAgICBhY19zdWJfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZQogICAgZWxzZQogICAgICBBQ19NU0dfV0FSTihbbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyXSkKICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0KICAgIGZpCgogICAgIyBUaGUgcmVjdXJzaW9uIGlzIGhlcmUuCiAgICBpZiB0ZXN0IC1uICIkYWNfc3ViX2NvbmZpZ3VyZSI7IHRoZW4KICAgICAgIyBNYWtlIHRoZSBjYWNoZSBmaWxlIG5hbWUgY29ycmVjdCByZWxhdGl2ZSB0byB0aGUgc3ViZGlyZWN0b3J5LgogICAgICBjYXNlICRjYWNoZV9maWxlIGluCiAgICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKiApIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7CiAgICAgICopICMgUmVsYXRpdmUgbmFtZS4KCWFjX3N1Yl9jYWNoZV9maWxlPSRhY190b3BfYnVpbGRfcHJlZml4JGNhY2hlX2ZpbGUgOzsKICAgICAgZXNhYwoKICAgICAgQUNfTVNHX05PVElDRShbcnVubmluZyAkU0hFTEwgJGFjX3N1Yl9jb25maWd1cmUgJGFjX3N1Yl9jb25maWd1cmVfYXJncyAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zcmNkaXJdKQogICAgICAjIFRoZSBldmFsIG1ha2VzIHF1b3RpbmcgYXJndW1lbnRzIHdvcmsuCiAgICAgIGV2YWwgIlwkU0hFTEwgXCJcJGFjX3N1Yl9jb25maWd1cmVcIiAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIFwKCSAgIC0tY2FjaGUtZmlsZT1cIlwkYWNfc3ViX2NhY2hlX2ZpbGVcIiAtLXNyY2Rpcj1cIlwkYWNfc3JjZGlyXCIiIHx8CglBQ19NU0dfRVJST1IoWyRhY19zdWJfY29uZmlndXJlIGZhaWxlZCBmb3IgJGFjX2Rpcl0pCiAgICBmaQoKICAgIGNkICIkYWNfcG9wZGlyIgogIGRvbmUKZmkKClQ5LDAKQUhfT1VUUFVUClQxNSw3NzcKQUNfQ0hFQ0tfU0laRU9GX200X2RlZnVuX3BybyhbJDBdKUFTX0xJVEVSQUxfSUYobTRfdHJhbnNsaXQoW1skMV1dLCBbKl0sIFtwXSksIFtdLAoJICAgICAgIFttNF9mYXRhbChbJDA6IHJlcXVpcmVzIGxpdGVyYWwgYXJndW1lbnRzXSldKSMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCiMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCiMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCl9BQ19DQUNIRV9DSEVDS19JTlQoW3NpemUgb2YgJDFdLCBbQVNfVFJfU0goW2FjX2N2X3NpemVvZl8kMV0pXSwKICBbKGxvbmcgaW50KSAoc2l6ZW9mICgkMSkpXSwKICBbQUNfSU5DTFVERVNfREVGQVVMVChbJDNdKV0sCiAgW2lmIHRlc3QgIiRBU19UUl9TSChbYWNfY3ZfdHlwZV8kMV0pIiA9IHllczsgdGhlbgogICAgIEFDX01TR19GQUlMVVJFKFtjYW5ub3QgY29tcHV0ZSBzaXplb2YgKCQxKV0sIDc3KQogICBlbHNlCiAgICAgQVNfVFJfU0goW2FjX2N2X3NpemVvZl8kMV0pPTAKICAgZmldKQoKQUNfREVGSU5FX1VOUVVPVEVEKEFTX1RSX0NQUChzaXplb2ZfJDEpLCAkQVNfVFJfU0goW2FjX2N2X3NpemVvZl8kMV0pLAoJCSAgIFtUaGUgc2l6ZSBvZiBgJDEnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwzNAptNF9sb2NhdGlvbihBQ19GQ19NT0RVTEVfRkxBRykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxNzUyClQxNSw1OAptNF9kaXZlcnRfc3RhY2ttNF9zdGFja19mb3JlYWNoX3NlcF9saWZvKFtfbTRfZGl2ZXJ0X3N0YWNrXSwgW10sIFtdLCBbCl0pClQxOSw4MwpBQ19SRVFVSVJFX0FVWF9GSUxFQVNfTElURVJBTF9XT1JEX0lGKFskMV0sIFtdLAoJICAgICAgIFttNF9mYXRhbChbJDA6IHJlcXVpcmVzIGEgbGl0ZXJhbCBhcmd1bWVudF0pXSkKVDE3LDMxCm00X2RlZmF1bHRfcXVvdGVkbTRfaWYoWyQxXSwgW10sIFtbJDJdXSwgW1skMV1dKQpUMjcsMzQKbTRfbG9jYXRpb24oX0FDX1JVTl9JRkVMU0UpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjcyOQpUMjksMjcKbTRfbG9jYXRpb24oX0FDX0FSR19WQVJfTElCUykuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDozMjgKVDExLDg4CkFIX1ZFUkJBVElNQVNfTElURVJBTF9XT1JEX0lGKFskMV0sCgkgICAgICAgW0FIX09VVFBVVChfbTRfZXhwYW5kKFskMV0pLCBBU19FU0NBUEUoW1skMl1dLCBbXCddKSldKQpUMzcsMTI2NgpBQ19GVU5DX0xTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKAogICAgICAgW3doZXRoZXIgbHN0YXQgY29ycmVjdGx5IGhhbmRsZXMgdHJhaWxpbmcgc2xhc2hdLAogICAgICAgW2FjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGlua10sCltybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQplY2hvID5jb25mdGVzdC5maWxlCmlmIHRlc3QgIiRhc19sbl9zIiA9ICJsbiAtcyIgJiYgbG4gLXMgY29uZnRlc3QuZmlsZSBjb25mdGVzdC5zeW07IHRoZW4KICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLAogICAgW3N0cnVjdCBzdGF0IHNidWY7CiAgICAgLyogTGludXggd2lsbCBkZXJlZmVyZW5jZSB0aGUgc3ltbGluayBhbmQgZmFpbCwgYXMgcmVxdWlyZWQgYnkgUE9TSVguCglUaGF0IGlzIGJldHRlciBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtZWFucyB3ZSB3aWxsIG5vdAoJaGF2ZSB0byBjb21waWxlIGFuZCB1c2UgdGhlIGxzdGF0IHdyYXBwZXIuICAqLwogICAgIHJldHVybiBsc3RhdCAoImNvbmZ0ZXN0LnN5bS8iLCAmc2J1ZikgPT0gMDtdKV0sCgkJW2FjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz15ZXNdLAoJCVthY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm9dLAoJCVthY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm9dKQplbHNlCiAgIyBJZiB0aGUgYGxuIC1zJyBjb21tYW5kIGZhaWxlZCwgdGhlbiB3ZSBwcm9iYWJseSBkb24ndCBldmVuCiAgIyBoYXZlIGFuIGxzdGF0IGZ1bmN0aW9uLgogIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubwpmaQpybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQpdKQoKdGVzdCAkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rID0geWVzICYmCiAgQUNfREVGSU5FX1VOUVVPVEVEKFtMU1RBVF9GT0xMT1dTX1NMQVNIRURfU1lNTElOS10sIFsxXSwKCQkgICAgIFtEZWZpbmUgdG8gMSBpZiBgbHN0YXQnIGRlcmVmZXJlbmNlcyBhIHN5bWxpbmsgc3BlY2lmaWVkCgkJICAgICAgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLl0pCgppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIgPSB4bm87IHRoZW4KICBBQ19MSUJPQkooW2xzdGF0XSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwzMjYKX0FDX1JVTl9MT0dfU1RERVJSX200X2RlZnVuX3BybyhbJDBdKXsgeyAkMjsgfSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgKCQxKSAyPmNvbmZ0ZXN0LmVycgogIGFjX3N0YXR1cz0kPwogIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCiAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQogICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCiAgZmkKICBfQVNfRUNIT19MT0coW1wkPyA9ICRhY19zdGF0dXNdKQogIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH1bXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDM1Cm00X2xvY2F0aW9uKEFNX0ZVTkNfRk5NQVRDSCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU5MwpUMjMsMwpfbTRfZGl2ZXJ0KFZFUlNJT05fRlNGKTIwMQpUMTQsMjgKQVNfVkFSX1BVU0hERUZfJDAoWyQxXSwgbTRfZXhwYW5kKFskMl0pKVtdClQxNCwxMzAKQVNfVkFSX1BVU0hERUZfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX1RSX1NIX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiwyMQpBQ19MQU5HX0NBU0VtNF9jYXNlKF9BQ19MQU5HLCAkQCkKVDE4LDI5Cm00X2xvY2F0aW9uKEFTX0lGKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5ClQyNiwzMwptNF9sb2NhdGlvbihBQ19TVF9CTEtTSVpFKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo3NgpUMTUsNDcwCl9BQ19MSU5LX0lGRUxTRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW190cnlfbGlua10sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW190cnlfbGlua10sIFtMSU5FTk9dLAogICAgW1RyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC5dKV0sCiAgWyQwX0JPRFldKW00X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pQVNfSUYoW2FjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fdHJ5X2xpbmsgIiRMSU5FTk8iXSwgWyQyXSwgWyQzXSkKcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICBjb25mdGVzdCRhY19leGVleHRbXW00X2lmdmFsKFskMV0sIFsgY29uZnRlc3QuJGFjX2V4dF0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCw2NwpBQ19MQU5HX0NPTkZURVNUKEZvcnRyYW4gNzcpY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpBQ19MQU5HX0RFRklORVNfUFJPVklERURbXSQxCl9BQ0VPRgpUMzIsMzUKbTRfbG9jYXRpb24oX0FDX0ZVTkNfRk5NQVRDSF9JRikuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjUwOApUMjEsMzMKbTRfbG9jYXRpb24oQUNfVUlEX1QpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjgyClQzMSwzMwptNF9sb2NhdGlvbihBQ19HQ0NfVFJBRElUSU9OQUwpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjU5ClQxMSwxOTQKQUNfVElNRVpPTkVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVElNRVpPTkUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfU1RSVUNUX1RJTUVaT05FXSwgW0FDX1NUUlVDVF9USU1FWk9ORSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNjYKQUNfTVNHX0NIRUNLSU5HeyBfQVNfRUNIT19MT0coW2NoZWNraW5nICQxXSkKX0FTX0VDSE9fTihbY2hlY2tpbmcgJDEuLi4gXSk7IH1kbmwKClQzMSwzMAptNF9sb2NhdGlvbihBU19WRVJTSU9OX0NPTVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxNzY3ClQzMSwzNgptNF9sb2NhdGlvbihBQ19GVU5DX1VUSU1FX05VTEwpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNzQ5ClQyNywzNQptNF9sb2NhdGlvbihBQ19GVU5DX01BTExPQykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjkxMgpUMTQsOTcKQUNfQ0hFQ0tfRklMRVNfbTRfZGVmdW5fcHJvKFskMF0pbTRfbWFwX2FyZ3NfdyhbJDFdLCBbQUNfQ0hFQ0tfRklMRShfJDAoXSwgWylbJDJdLCBbJDNdKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNyw3MzMKQUNfQ0FOT05JQ0FMX0hPU1RfbTRfZGVmdW5fb25jZShbQUNfQ0FOT05JQ0FMX0hPU1RdLCBbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKbTRfZGl2ZXJ0X29uY2UoW0hFTFBfQ0FOT05dLApbWyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdXV0pZG5sCkFDX0NBQ0hFX0NIRUNLKFtob3N0IHN5c3RlbSB0eXBlXSwgW2FjX2N2X2hvc3RdLApbaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAplbHNlCiAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKICAgIEFDX01TR19FUlJPUihbJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkXSkKZmkKXSkKX0FDX0NBTk9OSUNBTF9TUExJVChbaG9zdF0pCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19DQU5PTklDQUxfSE9TVF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0NBTk9OSUNBTF9IT1NUXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0NBTk9OSUNBTF9IT1NUXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfQ0FOT05JQ0FMX0hPU1RdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQyNCwzNAptNF9sb2NhdGlvbihBQ19UUllfTElOSykuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjg3ClQxNywxMDkKX0FDX0xBTkdfRElTUEFUQ0htNF9pZmRlZihbJDEoJDIpXSwKICAgICAgIFttNF9pbmRpcihbJDEoJDIpXSwgbTRfc2hpZnQyKCRAKSldLAogICAgICAgW200X2ZhdGFsKFskMTogdW5rbm93biBsYW5ndWFnZTogJDJdKV0pCkY5LDYKbTRfc3lzY21kc3lzY21kClQyMCwyOQptNF9sb2NhdGlvbihBQ19MQU5HKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00Ojg4ClQxNiwxMTYKX0FDX0FSR19WQVJfTElCU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19BUkdfVkFSKFtMSUJTXSwKCSAgICBbbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5Pl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwzMjQKQUNfUFJPR19GQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKQUNfQVJHX1ZBUihbRkNdLCAgICBbRm9ydHJhbiBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbRkNGTEFHU10sIFtGb3J0cmFuIGNvbXBpbGVyIGZsYWdzXSlkbmwKX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCl9BQ19BUkdfVkFSX0xJQlMoKWRubApfQUNfUFJPR19GQyhbJDJdLCBbJDFdKQppZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KICBHRkM9eWVzCmVsc2UKICBHRkM9CmZpCkFDX0xBTkdfUE9QKEZvcnRyYW4pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMzMKbTRfbG9jYXRpb24oQUNfQ09ORklHX1RFU1RESVIpLi4vLi4vbGliL2F1dG9jb25mL2F1dG90ZXN0Lm00OjQyClQzMiwwCm00X2luY2x1ZGUoYXV0b2NvbmYvYXV0b3Rlc3QubTQpClQxNiw4NApfQUhfQ0hFQ0tfSEVBREVSQUhfVEVNUExBVEUoQVNfVFJfQ1BQKFtIQVZFXyQxXSksCiAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8JDE+IGhlYWRlciBmaWxlLl0pClQxNyw2OTYKX0FDX0NIRUNLX0FMSUdOT0YjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlciwKIyBzZWUgQUNfQ0hFQ0tfU0laRU9GIGZvciBtb3JlIGluZm9ybWF0aW9uLgpfQUNfQ0FDSEVfQ0hFQ0tfSU5UKFthbGlnbm1lbnQgb2YgJDFdLCBbQVNfVFJfU0goW2FjX2N2X2FsaWdub2ZfJDNdKV0sCiAgWyhsb25nIGludCkgb2Zmc2V0b2YgKGFjX190eXBlX2FsaWdub2ZfLCB5KV0sCiAgW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQyXSkKI2lmbmRlZiBvZmZzZXRvZgojIGRlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICgoY2hhciAqKSAmKCh0eXBlICopIDApLT5tZW1iZXIgLSAoY2hhciAqKSAwKQojZW5kaWYKdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIHg7ICQxIHk7IH0gYWNfX3R5cGVfYWxpZ25vZl87XSwKICBbaWYgdGVzdCAiJEFTX1RSX1NIKFthY19jdl90eXBlXyQzXSkiID0geWVzOyB0aGVuCiAgICAgQUNfTVNHX0ZBSUxVUkUoW2Nhbm5vdCBjb21wdXRlIGFsaWdubWVudCBvZiAkMV0sIDc3KQogICBlbHNlCiAgICAgQVNfVFJfU0goW2FjX2N2X2FsaWdub2ZfJDNdKT0wCiAgIGZpXSkKCkFDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoYWxpZ25vZl8kMyksICRBU19UUl9TSChbYWNfY3ZfYWxpZ25vZl8kM10pLAoJCSAgIFtUaGUgbm9ybWFsIGFsaWdubWVudCBvZiBgJDEnLCBpbiBieXRlcy5dKQoKVDIzLDY3CkFDX1NUUlVDVF9ESVJFTlRfRF9UWVBFX200X2RlZnVuX3BybyhbJDBdKV9BQ19TVFJVQ1RfRElSRU5UKFtkX3R5cGVdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksNjQKQUNfTEFOR19DT01QSUxFUihDKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDEzNgptNF9zZXRfZHVtcG00X2lmZGVmKFtfbTRfc2V0X3NpemUoJDEpXSwKCSAgW19tNF9wb3BkZWYoW19tNF9zZXRfc2l6ZSgkMSldKV0pbTRfaWZkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldLAogICAgW18kMF9jaGVja10sIFtfJDBdKShbJDFdLCBbXSwgWyQyXSkKVDI2LDMzCm00X2xvY2F0aW9uKEFDX1JFVFNJR1RZUEUpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjcxClQ5LDU4Cm00X2lmdmFsbm00X2lmKFskMV0sCiAgICAgICBbXSwgICBbbTRfbihbJDNdKV0sCgkgICAgIFttNF9uKFskMl0pXSkKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX0RFQ0xfWVlURVhUKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo3OTIKVDcsMApfX2dudV9fClQxNSwzOTMyCl9BQ19QUk9HX0NDX0M5OV9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfQ19TVERfVFJZKFtjOTldLApbWyNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8d2NoYXIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBDaGVjayB2YXJhcmdzIG1hY3Jvcy4gIFRoZXNlIGV4YW1wbGVzIGFyZSB0YWtlbiBmcm9tIEM5OSA2LjEwLjMuNS4KI2RlZmluZSBkZWJ1ZyguLi4pIGZwcmludGYgKHN0ZGVyciwgX19WQV9BUkdTX18pCiNkZWZpbmUgc2hvd2xpc3QoLi4uKSBwdXRzICgjX19WQV9BUkdTX18pCiNkZWZpbmUgcmVwb3J0KHRlc3QsLi4uKSAoKHRlc3QpID8gcHV0cyAoI3Rlc3QpIDogcHJpbnRmIChfX1ZBX0FSR1NfXykpCnN0YXRpYyB2b2lkCnRlc3RfdmFyYXJnc19tYWNyb3MgKHZvaWQpCnsKICBpbnQgeCA9IDEyMzQ7CiAgaW50IHkgPSA1Njc4OwogIGRlYnVnICgiRmxhZyIpOwogIGRlYnVnICgiWCA9ICVkXG4iLCB4KTsKICBzaG93bGlzdCAoVGhlIGZpcnN0LCBzZWNvbmQsIGFuZCB0aGlyZCBpdGVtcy4pOwogIHJlcG9ydCAoeD55LCAieCBpcyAlZCBidXQgeSBpcyAlZCIsIHgsIHkpOwp9CgovLyBDaGVjayBsb25nIGxvbmcgdHlwZXMuCiNkZWZpbmUgQklHNjQgMTg0NDY3NDQwNzM3MDk1NTE2MTV1bGwKI2RlZmluZSBCSUczMiA0Mjk0OTY3Mjk1dWwKI2RlZmluZSBCSUdfT0sgKEJJRzY0IC8gQklHMzIgPT0gNDI5NDk2NzI5N3VsbCAmJiBCSUc2NCAlIEJJRzMyID09IDApCiNpZiAhQklHX09LCiAgeW91ciBwcmVwcm9jZXNzb3IgaXMgYnJva2VuOwojZW5kaWYKI2lmIEJJR19PSwojZWxzZQogIHlvdXIgcHJlcHJvY2Vzc29yIGlzIGJyb2tlbjsKI2VuZGlmCnN0YXRpYyBsb25nIGxvbmcgaW50IGJpZ251bSA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CnN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHViaWdudW0gPSBCSUc2NDsKCnN0cnVjdCBpbmNvbXBsZXRlX2FycmF5CnsKICBpbnQgZGF0YXNpemU7CiAgZG91YmxlIGRhdGFbXTsKfTsKCnN0cnVjdCBuYW1lZF9pbml0IHsKICBpbnQgbnVtYmVyOwogIGNvbnN0IHdjaGFyX3QgKm5hbWU7CiAgZG91YmxlIGF2ZXJhZ2U7Cn07Cgp0eXBlZGVmIGNvbnN0IGNoYXIgKmNjcDsKCnN0YXRpYyBpbmxpbmUgaW50CnRlc3RfcmVzdHJpY3QgKGNjcCByZXN0cmljdCB0ZXh0KQp7CiAgLy8gU2VlIGlmIEMrKy1zdHlsZSBjb21tZW50cyB3b3JrLgogIC8vIEl0ZXJhdGUgdGhyb3VnaCBpdGVtcyB2aWEgdGhlIHJlc3RyaWN0ZWQgcG9pbnRlci4KICAvLyBBbHNvIGNoZWNrIGZvciBkZWNsYXJhdGlvbnMgaW4gZm9yIGxvb3BzLgogIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyAqKHRleHQraSkgIT0gJ1wwJzsgKytpKQogICAgY29udGludWU7CiAgcmV0dXJuIDA7Cn0KCi8vIENoZWNrIHZhcmFyZ3MgYW5kIHZhX2NvcHkuCnN0YXRpYyB2b2lkCnRlc3RfdmFyYXJncyAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCnsKICB2YV9saXN0IGFyZ3M7CiAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CiAgdmFfbGlzdCBhcmdzX2NvcHk7CiAgdmFfY29weSAoYXJnc19jb3B5LCBhcmdzKTsKCiAgY29uc3QgY2hhciAqc3RyOwogIGludCBudW1iZXI7CiAgZmxvYXQgZm51bWJlcjsKCiAgd2hpbGUgKCpmb3JtYXQpCiAgICB7CiAgICAgIHN3aXRjaCAoKmZvcm1hdCsrKQoJewoJY2FzZSAncyc6IC8vIHN0cmluZwoJICBzdHIgPSB2YV9hcmcgKGFyZ3NfY29weSwgY29uc3QgY2hhciAqKTsKCSAgYnJlYWs7CgljYXNlICdkJzogLy8gaW50CgkgIG51bWJlciA9IHZhX2FyZyAoYXJnc19jb3B5LCBpbnQpOwoJICBicmVhazsKCWNhc2UgJ2YnOiAvLyBmbG9hdAoJICBmbnVtYmVyID0gdmFfYXJnIChhcmdzX2NvcHksIGRvdWJsZSk7CgkgIGJyZWFrOwoJZGVmYXVsdDoKCSAgYnJlYWs7Cgl9CiAgICB9CiAgdmFfZW5kIChhcmdzX2NvcHkpOwogIHZhX2VuZCAoYXJncyk7Cn0KXV0sCltbCiAgLy8gQ2hlY2sgYm9vbC4KICBfQm9vbCBzdWNjZXNzID0gZmFsc2U7CgogIC8vIENoZWNrIHJlc3RyaWN0LgogIGlmICh0ZXN0X3Jlc3RyaWN0ICgiU3RyaW5nIGxpdGVyYWwiKSA9PSAwKQogICAgc3VjY2VzcyA9IHRydWU7CiAgY2hhciAqcmVzdHJpY3QgbmV3dmFyID0gIkFub3RoZXIgc3RyaW5nIjsKCiAgLy8gQ2hlY2sgdmFyYXJncy4KICB0ZXN0X3ZhcmFyZ3MgKCJzLCBkJyBmIC4iLCAic3RyaW5nIiwgNjUsIDM0LjIzNCk7CiAgdGVzdF92YXJhcmdzX21hY3JvcyAoKTsKCiAgLy8gQ2hlY2sgZmxleGlibGUgYXJyYXkgbWVtYmVycy4KICBzdHJ1Y3QgaW5jb21wbGV0ZV9hcnJheSAqaWEgPQogICAgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbmNvbXBsZXRlX2FycmF5KSArIChzaXplb2YgKGRvdWJsZSkgKiAxMCkpOwogIGlhLT5kYXRhc2l6ZSA9IDEwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgaWEtPmRhdGFzaXplOyArK2kpCiAgICBpYS0+ZGF0YVtpXSA9IGkgKiAxLjIzNDsKCiAgLy8gQ2hlY2sgbmFtZWQgaW5pdGlhbGl6ZXJzLgogIHN0cnVjdCBuYW1lZF9pbml0IG5pID0gewogICAgLm51bWJlciA9IDM0LAogICAgLm5hbWUgPSBMIlRlc3Qgd2lkZSBzdHJpbmciLAogICAgLmF2ZXJhZ2UgPSA1NDMuMzQzNDMsCiAgfTsKCiAgbmkubnVtYmVyID0gNTg7CgogIGludCBkeW5hbWljX2FycmF5W25pLm51bWJlcl07CiAgZHluYW1pY19hcnJheVtuaS5udW1iZXIgLSAxXSA9IDU0MzsKCiAgLy8gd29yayBhcm91bmQgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzCiAgcmV0dXJuICghc3VjY2VzcyB8fCBiaWdudW0gPT0gMExMIHx8IHViaWdudW0gPT0gMHVMTCB8fCBuZXd2YXJbMF0gPT0gJ3gnCgkgIHx8IGR5bmFtaWNfYXJyYXlbbmkubnVtYmVyIC0gMV0gIT0gNTQzKTsKXV0sCmRubCBUcnkKZG5sIEdDQwkJLXN0ZD1nbnU5OSAodW51c2VkIHJlc3RyaWN0aXZlIG1vZGVzOiAtc3RkPWM5OSAtc3RkPWlzbzk4OTk6MTk5OSkKZG5sIEFJWAkJLXFsYW5nbHZsPWV4dGM5OSAodW51c2VkIHJlc3RyaWN0aXZlIG1vZGU6IC1xbGFuZ2x2bD1zdGRjOTkpCmRubCBIUCBjYwktQUM5OQpkbmwgSW50ZWwgSUNDCS1zdGQ9Yzk5LCAtYzk5IChkZXByZWNhdGVkKQpkbmwgSVJJWAktYzk5CmRubCBTb2xhcmlzCS1EX1NURENfQzk5PQpkbmwJCWNjJ3MgLXhjOTkgb3B0aW9uIHVzZXMgbGlua2VyIG1hZ2ljIHRvIGRlZmluZSB0aGUgZXh0ZXJuYWwKZG5sCQlzeW1ib2wgX194cGc0IGFzIGlmIGJ5ICJpbnQgX194cGc0ID0gMTsiLCB3aGljaCBlbmFibGVzIEM5OQpkbmwJCWJlaGF2aW9yIGZvciBDIGxpYnJhcnkgZnVuY3Rpb25zLiAgVGhpcyBpcyBub3Qgd2FudGVkIGhlcmUsCmRubAkJYmVjYXVzZSBpdCBtZWFucyB0aGF0IGEgc2luZ2xlIG1vZHVsZSBjb21waWxlZCB3aXRoIC14Yzk5CmRubAkJYWx0ZXJzIEMgcnVudGltZSBiZWhhdmlvciBmb3IgdGhlIGVudGlyZSBwcm9ncmFtLCBub3QgZm9yCmRubAkJanVzdCB0aGUgbW9kdWxlLiAgSW5zdGVhZCwgZGVmaW5lIHRoZSAocHJpdmF0ZSkgc3ltYm9sCmRubAkJX1NURENfQzk5LCB3aGljaCBzdXBwcmVzc2VzIGEgYm9ndXMgZmFpbHVyZSBpbiA8c3RkYm9vbC5oPi4KZG5sCQlUaGUgcmVzdWx0aW5nIGNvbXBpbGVyIHBhc3NlcyB0aGUgdGVzdCBjYXNlIGhlcmUsIGFuZCB0aGF0J3MKZG5sCQlnb29kIGVub3VnaC4gIEZvciBtb3JlLCBwbGVhc2Ugc2VlIHRoZSB0aHJlYWQgc3RhcnRpbmcgYXQ6CmRubCAgICAgICAgICAgIGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9hdXRvY29uZi8yMDEwLTEyL21zZzAwMDU5Lmh0bWwKZG5sIFRydTY0CS1jOTkKZG5sIHdpdGggZXh0ZW5kZWQgbW9kZXMgYmVpbmcgdHJpZWQgZmlyc3QuCltbLXN0ZD1nbnU5OSAtc3RkPWM5OSAtYzk5IC1BQzk5IC1EX1NURENfQzk5PSAtcWxhbmdsdmw9ZXh0Yzk5XV0sIFskMV0sIFskMl0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiw0MApfQUNfT1VUUFVUX0ZJTEVfQURKVVNUX0RJUnMmQCQxQCYkYWNfJDEmO3QgdFtdQUNfU1VCU1RfVFJBQ0UoWyQxXSkKVDEwLDI3Cm00X2pvaW5hbGxbJDJdXyQwKFskMV0sIG00X3NoaWZ0KCRAKSkKVDExLDIKX0FTX0VTQ0FQRV8kMQpUMTMsNzEKQUNfVFlQRV9PRkZfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19UWVBFKG9mZl90LCAgbG9uZyBpbnQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiwxNjcKQUNfTEFOR19TQVZFX200X2RlZnVuX3BybyhbJDBdKW00X3B1c2hkZWYoW19BQ19MQU5HXSwgX0FDX0xBTkcpZG5sCkFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfU0FWRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDUwNjgKQUNfRlVOQ19NS1RJTUVfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfSEVBREVSX1RJTUVdKWRubApBQ19DSEVDS19IRUFERVJTX09OQ0Uoc3lzL3RpbWUuaCB1bmlzdGQuaCkKQUNfQ0hFQ0tfRlVOQ1NfT05DRShhbGFybSkKQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIG1rdGltZV0sIGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUsCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRSgKW1svKiBUZXN0IHByb2dyYW0gZnJvbSBQYXVsIEVnZ2VydCBhbmQgVG9ueSBMZW5laXMuICAqLwojaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWZkZWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2lmbmRlZiBIQVZFX0FMQVJNCiMgZGVmaW5lIGFsYXJtKFgpIC8qIGVtcHR5ICovCiNlbmRpZgoKLyogV29yayBhcm91bmQgcmVkZWZpbml0aW9uIHRvIHJwbF9wdXRlbnYgYnkgb3RoZXIgY29uZmlnIHRlc3RzLiAgKi8KI3VuZGVmIHB1dGVudgoKc3RhdGljIHRpbWVfdCB0aW1lX3RfbWF4OwpzdGF0aWMgdGltZV90IHRpbWVfdF9taW47CgovKiBWYWx1ZXMgd2UnbGwgdXNlIHRvIHNldCB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwpzdGF0aWMgY29uc3QgY2hhciAqdHpfc3RyaW5nc1tdID0gewogIChjb25zdCBjaGFyICopIDAsICJUWj1HTVQwIiwgIlRaPUpTVC05IiwKICAiVFo9RVNUKzNFRFQrMixNMTAuMS4wLzAwOjAwOjAwLE0yLjMuMC8wMDowMDowMCIKfTsKI2RlZmluZSBOX1NUUklOR1MgKHNpemVvZiAodHpfc3RyaW5ncykgLyBzaXplb2YgKHR6X3N0cmluZ3NbMF0pKQoKLyogUmV0dXJuIDAgaWYgbWt0aW1lIGZhaWxzIHRvIGNvbnZlcnQgYSBkYXRlIGluIHRoZSBzcHJpbmctZm9yd2FyZCBnYXAuCiAgIEJhc2VkIG9uIGEgcHJvYmxlbSByZXBvcnQgZnJvbSBBbmRyZWFzIEphZWdlci4gICovCnN0YXRpYyBpbnQKc3ByaW5nX2ZvcndhcmRfZ2FwICgpCnsKICAvKiBnbGliYyAodXAgdG8gYWJvdXQgMTk5OC0xMC0wNykgZmFpbGVkIHRoaXMgdGVzdC4gKi8KICBzdHJ1Y3QgdG0gdG07CgogIC8qIFVzZSB0aGUgcG9ydGFibGUgUE9TSVguMSBzcGVjaWZpY2F0aW9uICJUWj1QU1Q4UERULE00LjEuMCxNMTAuNS4wIgogICAgIGluc3RlYWQgb2YgIlRaPUFtZXJpY2EvVmFuY291dmVyIiBpbiBvcmRlciB0byBkZXRlY3QgdGhlIGJ1ZyBldmVuCiAgICAgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIE9sc29uIGV4dGVuc2lvbiwgb3IgZG9uJ3QgaGF2ZSB0aGUKICAgICBmdWxsIHpvbmVpbmZvIHRhYmxlcyBpbnN0YWxsZWQuICAqLwogIHB1dGVudiAoKGNoYXIqKSAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIpOwoKICB0bS50bV95ZWFyID0gOTg7CiAgdG0udG1fbW9uID0gMzsKICB0bS50bV9tZGF5ID0gNTsKICB0bS50bV9ob3VyID0gMjsKICB0bS50bV9taW4gPSAwOwogIHRtLnRtX3NlYyA9IDA7CiAgdG0udG1faXNkc3QgPSAtMTsKICByZXR1cm4gbWt0aW1lICgmdG0pICE9ICh0aW1lX3QpIC0xOwp9CgpzdGF0aWMgaW50Cm1rdGltZV90ZXN0MSAodGltZV90IG5vdykKewogIHN0cnVjdCB0bSAqbHQ7CiAgcmV0dXJuICEgKGx0ID0gbG9jYWx0aW1lICgmbm93KSkgfHwgbWt0aW1lIChsdCkgPT0gbm93Owp9CgpzdGF0aWMgaW50Cm1rdGltZV90ZXN0ICh0aW1lX3Qgbm93KQp7CiAgcmV0dXJuIChta3RpbWVfdGVzdDEgKG5vdykKCSAgJiYgbWt0aW1lX3Rlc3QxICgodGltZV90KSAodGltZV90X21heCAtIG5vdykpCgkgICYmIG1rdGltZV90ZXN0MSAoKHRpbWVfdCkgKHRpbWVfdF9taW4gKyBub3cpKSk7Cn0KCnN0YXRpYyBpbnQKaXJpeF82XzRfYnVnICgpCnsKICAvKiBCYXNlZCBvbiBjb2RlIGZyb20gQXJpZWwgRmFpZ29uLiAgKi8KICBzdHJ1Y3QgdG0gdG07CiAgdG0udG1feWVhciA9IDk2OwogIHRtLnRtX21vbiA9IDM7CiAgdG0udG1fbWRheSA9IDA7CiAgdG0udG1faG91ciA9IDA7CiAgdG0udG1fbWluID0gMDsKICB0bS50bV9zZWMgPSAwOwogIHRtLnRtX2lzZHN0ID0gLTE7CiAgbWt0aW1lICgmdG0pOwogIHJldHVybiB0bS50bV9tb24gPT0gMiAmJiB0bS50bV9tZGF5ID09IDMxOwp9CgpzdGF0aWMgaW50CmJpZ3RpbWVfdGVzdCAoaW50IGopCnsKICBzdHJ1Y3QgdG0gdG07CiAgdGltZV90IG5vdzsKICB0bS50bV95ZWFyID0gdG0udG1fbW9uID0gdG0udG1fbWRheSA9IHRtLnRtX2hvdXIgPSB0bS50bV9taW4gPSB0bS50bV9zZWMgPSBqOwogIG5vdyA9IG1rdGltZSAoJnRtKTsKICBpZiAobm93ICE9ICh0aW1lX3QpIC0xKQogICAgewogICAgICBzdHJ1Y3QgdG0gKmx0ID0gbG9jYWx0aW1lICgmbm93KTsKICAgICAgaWYgKCEgKGx0CgkgICAgICYmIGx0LT50bV95ZWFyID09IHRtLnRtX3llYXIKCSAgICAgJiYgbHQtPnRtX21vbiA9PSB0bS50bV9tb24KCSAgICAgJiYgbHQtPnRtX21kYXkgPT0gdG0udG1fbWRheQoJICAgICAmJiBsdC0+dG1faG91ciA9PSB0bS50bV9ob3VyCgkgICAgICYmIGx0LT50bV9taW4gPT0gdG0udG1fbWluCgkgICAgICYmIGx0LT50bV9zZWMgPT0gdG0udG1fc2VjCgkgICAgICYmIGx0LT50bV95ZGF5ID09IHRtLnRtX3lkYXkKCSAgICAgJiYgbHQtPnRtX3dkYXkgPT0gdG0udG1fd2RheQoJICAgICAmJiAoKGx0LT50bV9pc2RzdCA8IDAgPyAtMSA6IDAgPCBsdC0+dG1faXNkc3QpCgkJICA9PSAodG0udG1faXNkc3QgPCAwID8gLTEgOiAwIDwgdG0udG1faXNkc3QpKSkpCglyZXR1cm4gMDsKICAgIH0KICByZXR1cm4gMTsKfQoKc3RhdGljIGludAp5ZWFyXzIwNTBfdGVzdCAoKQp7CiAgLyogVGhlIGNvcnJlY3QgYW5zd2VyIGZvciAyMDUwLTAyLTAxIDAwOjAwOjAwIGluIFBhY2lmaWMgdGltZSwKICAgICBpZ25vcmluZyBsZWFwIHNlY29uZHMuICAqLwogIHVuc2lnbmVkIGxvbmcgaW50IGFuc3dlciA9IDI1MjczMTUyMDBVTDsKCiAgc3RydWN0IHRtIHRtOwogIHRpbWVfdCB0OwogIHRtLnRtX3llYXIgPSAyMDUwIC0gMTkwMDsKICB0bS50bV9tb24gPSAyIC0gMTsKICB0bS50bV9tZGF5ID0gMTsKICB0bS50bV9ob3VyID0gdG0udG1fbWluID0gdG0udG1fc2VjID0gMDsKICB0bS50bV9pc2RzdCA9IC0xOwoKICAvKiBVc2UgdGhlIHBvcnRhYmxlIFBPU0lYLjEgc3BlY2lmaWNhdGlvbiAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIKICAgICBpbnN0ZWFkIG9mICJUWj1BbWVyaWNhL1ZhbmNvdXZlciIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBidWcgZXZlbgogICAgIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBPbHNvbiBleHRlbnNpb24sIG9yIGRvbid0IGhhdmUgdGhlCiAgICAgZnVsbCB6b25laW5mbyB0YWJsZXMgaW5zdGFsbGVkLiAgKi8KICBwdXRlbnYgKChjaGFyKikgIlRaPVBTVDhQRFQsTTQuMS4wLE0xMC41LjAiKTsKCiAgdCA9IG1rdGltZSAoJnRtKTsKCiAgLyogQ2hlY2sgdGhhdCB0aGUgcmVzdWx0IGlzIGVpdGhlciBhIGZhaWx1cmUsIG9yIGNsb3NlIGVub3VnaAogICAgIHRvIHRoZSBjb3JyZWN0IGFuc3dlciB0aGF0IHdlIGNhbiBhc3N1bWUgdGhlIGRpc2NyZXBhbmN5IGlzCiAgICAgZHVlIHRvIGxlYXAgc2Vjb25kcy4gICovCiAgcmV0dXJuICh0ID09ICh0aW1lX3QpIC0xCgkgIHx8ICgwIDwgdCAmJiBhbnN3ZXIgLSAxMjAgPD0gdCAmJiB0IDw9IGFuc3dlciArIDEyMCkpOwp9CgppbnQKbWFpbiAoKQp7CiAgdGltZV90IHQsIGRlbHRhOwogIGludCBpLCBqOwoKICAvKiBUaGlzIHRlc3QgbWFrZXMgc29tZSBidWdneSBta3RpbWUgaW1wbGVtZW50YXRpb25zIGxvb3AuCiAgICAgR2l2ZSB1cCBhZnRlciA2MCBzZWNvbmRzOyBhIG1rdGltZSBzbG93ZXIgdGhhbiB0aGF0CiAgICAgaXNuJ3Qgd29ydGggdXNpbmcgYW55d2F5LiAgKi8KICBhbGFybSAoNjApOwoKICBmb3IgKDs7KQogICAgewogICAgICB0ID0gKHRpbWVfdF9tYXggPDwgMSkgKyAxOwogICAgICBpZiAodCA8PSB0aW1lX3RfbWF4KQoJYnJlYWs7CiAgICAgIHRpbWVfdF9tYXggPSB0OwogICAgfQogIHRpbWVfdF9taW4gPSAtICgodGltZV90KSB+ICh0aW1lX3QpIDAgPT0gKHRpbWVfdCkgLTEpIC0gdGltZV90X21heDsKCiAgZGVsdGEgPSB0aW1lX3RfbWF4IC8gOTk3OyAvKiBhIHN1aXRhYmxlIHByaW1lIG51bWJlciAqLwogIGZvciAoaSA9IDA7IGkgPCBOX1NUUklOR1M7IGkrKykKICAgIHsKICAgICAgaWYgKHR6X3N0cmluZ3NbaV0pCglwdXRlbnYgKChjaGFyKikgdHpfc3RyaW5nc1tpXSk7CgogICAgICBmb3IgKHQgPSAwOyB0IDw9IHRpbWVfdF9tYXggLSBkZWx0YTsgdCArPSBkZWx0YSkKCWlmICghIG1rdGltZV90ZXN0ICh0KSkKCSAgcmV0dXJuIDE7CiAgICAgIGlmICghIChta3RpbWVfdGVzdCAoKHRpbWVfdCkgMSkKCSAgICAgJiYgbWt0aW1lX3Rlc3QgKCh0aW1lX3QpICg2MCAqIDYwKSkKCSAgICAgJiYgbWt0aW1lX3Rlc3QgKCh0aW1lX3QpICg2MCAqIDYwICogMjQpKSkpCglyZXR1cm4gMTsKCiAgICAgIGZvciAoaiA9IDE7IDsgaiA8PD0gMSkKCWlmICghIGJpZ3RpbWVfdGVzdCAoaikpCgkgIHJldHVybiAxOwoJZWxzZSBpZiAoSU5UX01BWCAvIDIgPCBqKQoJICBicmVhazsKICAgICAgaWYgKCEgYmlndGltZV90ZXN0IChJTlRfTUFYKSkKCXJldHVybiAxOwogICAgfQogIHJldHVybiAhIChpcml4XzZfNF9idWcgKCkgJiYgc3ByaW5nX2ZvcndhcmRfZ2FwICgpICYmIHllYXJfMjA1MF90ZXN0ICgpKTsKfV1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWU9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY193b3JraW5nX21rdGltZT1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWU9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUgPSBubzsgdGhlbgogIEFDX0xJQk9CSihbbWt0aW1lXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDIyCm00X3NoaWZ0Mm00X3NoaWZ0KG00X3NoaWZ0KCRAKSkKVDIzLDI4Cm00X2xvY2F0aW9uKEFDX0NfQ09OU1QpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MTY2MQpUMTgsODAKbTRfZXhwYW5zaW9uX3N0YWNrbTRfc3RhY2tfZm9yZWFjaF9zZXBfbGlmbyhbXyQwXSwgW18kMF9lbnRyeShdLCBbKQpdKW00X2xvY2F0aW9uWzogdGhlIHRvcCBsZXZlbF0KVDEyLDEwMgpfQUNfRE9fTElNSVRfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1JVTl9MT0dfTElNSVQoW2V2YWwgIiQxIl0sCgkJICAgW19BQ19ET19FQ0hPKFskMV0pXSwgWyQyXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDksMgpfQUNfQ0MoQylDQwpUMTksMjEyCkFDX0xBTkcoRm9ydHJhbiA3NylhY19leHQ9ZgphY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiZBU19NRVNTQUdFX0xPR19GRCcKYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251CgpUOSwzMgptNF9zaGlmdDNtNF9zaGlmdChtNF9zaGlmdChtNF9zaGlmdCgkQCkpKQpUMjYsMzQKbTRfbG9jYXRpb24oQUNfTVNHX05PVElDRSkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMjQ4ClQyNiwzNgptNF9sb2NhdGlvbihBQ19GVU5DX0xTVEFUKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTUyNgpUMTcsNDExCl9BQ19SVU5fTE9HX0xJTUlUX200X2RlZnVuX3BybyhbJDBdKXsgeyAkMjsgfSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgKCQxKSAyPmNvbmZ0ZXN0LmVycgogIGFjX3N0YXR1cz0kPwogIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCiAgICBzZWQgJ200X2RlZmF1bHQoWyQzXSwgWzEwXSlhXAouLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCiAgICAgICAgIG00X2RlZmF1bHQoWyQzXSwgWzEwXSlxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQogICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgZmkKICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCiAgX0FTX0VDSE9fTE9HKFtcJD8gPSAkYWNfc3RhdHVzXSkKICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9W11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxNTIKbTRfdmVyc2lvbl9wcmVyZXFtNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUoWzIuNjldLCBbJDFdKSwKCVstMV0sCglbbTRfZGVmYXVsdChbJDNdLAoJCSAgICBbbTRfZmF0YWwoW0F1dG9jb25mIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKCQkJICAgICAgWzYzXSldKV0sCglbJDJdKQpUMjUsMjkKbTRfbG9jYXRpb24oQUNfTEFOR19QVVNIKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00Ojk3ClQyNSwzNgptNF9sb2NhdGlvbihBQ19GVU5DX01NQVApLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxMjAxClQxMCw0MwpfQUNfREVGSU5FQVNfRUNITyhbIkFTX0VTQ0FQRShbWyQxXV0pIl0pID4+Y29uZmRlZnMuaApUMjQsMzMKbTRfbG9jYXRpb24oQUNfVEVTVF9DUFApLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQ1ClQxNiw1MApfbTRfbGlzdF9jbXBfcmF3bTRfaWYoWyQxXSwgWyQyXSwgWzBdLCBbX200X2xpc3RfY21wXzEoWyQxXSwgJDIpXSkKVDgsMApfX3VuaXhfXwpUMjAsMzAKbTRfbG9jYXRpb24oQVNfTE5fUykuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjEyNTcKVDMwLDM0Cm00X2xvY2F0aW9uKEFDX0NPTVBJTEVfSUZFTFNFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MDYKVDE0LDEwOQptNF9maWxlX2FwcGVuZG00X3N5c2NtZChbY2F0ID4+JDEgPDxfbTRlb2YKJDIKX200ZW9mCl0pCm00X2lmKG00X3N5c3ZhbCwgWzBdLCBbXSwKICAgICAgW200X2ZhdGFsKFskMDogY2Fubm90IHdyaXRlOiAkMV0pXSkKVDE0LDE1MgpBQ19MQU5HX0VSTEFOR19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX0VSTEFORycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTEFORyhFcmxhbmcpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxNDAKX0FTX1ZBUl9QVVNIREVGX0FTX0xJVEVSQUxfSUYoWyQyXSwgWwkgXVsKXSkoW10sIFthc18kMT1fQVNfVFJfU0hfSU5ESVIoWyQyXSkKbTRfcHVzaGRlZihbJDFdLCBbJGFzX1skMV1dKV0sClttNF9wdXNoZGVmKFskMV0sIFtfQVNfVFJfU0hfTElURVJBTChbJDJdKV0pXSkKVDExLDg5CkFIX1RFTVBMQVRFQUhfVkVSQkFUSU0oWyQxXSwKCSAgICAgbTRfdGV4dF93cmFwKFskMiAqL10sIFsgICBdLCBbLyogXSlbCkAlOkB1bmRlZiBdX200X2V4cGFuZChbJDFdKSkKVDExLDE0NwpBQ19GNzdfTUFJTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19GNzdfTElCUkFSWV9MREZMQUdTXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpZG5sCl9BQ19GQ19NQUlOCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNDkKbTRfcmVuYW1lX2ZvcmNlbTRfaWZkZWYoWyQyXSwgW19tNF91bmRlZmluZShbJDJdKV0pbTRfcmVuYW1lKCRAKQpUMjgsMzAKbTRfbG9jYXRpb24oQVNfRVhFQ1VUQUJMRV9QKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTA5OApUMTMsMTEwCl9BQ19FTkFCTEVfSUZAJTpAIENoZWNrIHdoZXRoZXIgLS0kMS0kMiB3YXMgZ2l2ZW4uCl9BQ19FTkFCTEVfSUZfQUNUSU9OKFskMV0sIG00X3RyYW5zbGl0KFskMl0sIFstKy5dLCBbX19fXSksIFskM10sIFskNF0pCgpUOCwxOTEKQUNfU1VCU1RBU19JREVOVElGSUVSX0lGKFskMV0sIFtdLAogIFttNF9mYXRhbChbJDA6IGAkMScgaXMgbm90IGEgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZV0pXSlBQ19TVUJTVF9UUkFDRShbJDFdKW00X3BhdHRlcm5fYWxsb3coW14kMSRdKW00X2lmdmFsbihbJDJdLCBbJDE9JDJdKVtdbTRfc2V0X2FkZChbX0FDX1NVQlNUX1ZBUlNdLCBbJDFdKQpUMjMsMzQKbTRfbG9jYXRpb24oQUNfVkVSQk9TRSkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMjgxClQxOCw0NTcKX0FDX0NPTVBJTEVfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9jb21waWxlXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9jb21waWxlXSwgW0xJTkVOT10sCiAgICBbVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLl0pXSwKICBbJDBfQk9EWV0pbTRfaWZ2YWxuKFskMV0sIFtBQ19MQU5HX0NPTkZURVNUKFskMV0pXSlBU19JRihbYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV90cnlfY29tcGlsZSAiJExJTkVOTyJdLCBbJDJdLCBbJDNdKQpybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0W11tNF9pZnZhbChbJDFdLCBbIGNvbmZ0ZXN0LiRhY19leHRdKVtdZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNjEyCkFDX0ZVTkNfT0JTVEFDS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MSUJTT1VSQ0VTKFtvYnN0YWNrLmgsIG9ic3RhY2suY10pZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3Igb2JzdGFja3NdLCBhY19jdl9mdW5jX29ic3RhY2ssCltBQ19MSU5LX0lGRUxTRSgKICAgIFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFQKCQkgICAgICBbQCU6QGluY2x1ZGUgIm9ic3RhY2suaCJdXSwKCQkgICAgIFtbc3RydWN0IG9ic3RhY2sgbWVtOwoJCSAgICAgICBAJTpAZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgbWFsbG9jCgkJICAgICAgIEAlOkBkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIGZyZWUKCQkgICAgICAgb2JzdGFja19pbml0ICgmbWVtKTsKCQkgICAgICAgb2JzdGFja19mcmVlICgmbWVtLCAwKTtdXSldLAoJCVthY19jdl9mdW5jX29ic3RhY2s9eWVzXSwKCQlbYWNfY3ZfZnVuY19vYnN0YWNrPW5vXSldKQppZiB0ZXN0ICRhY19jdl9mdW5jX29ic3RhY2sgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9PQlNUQUNLLCAxLCBbRGVmaW5lIHRvIDEgaWYgbGliYyBpbmNsdWRlcyBvYnN0YWNrcy5dKQplbHNlCiAgQUNfTElCT0JKKG9ic3RhY2spCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMzIKbTRfbG9jYXRpb24oQUNfQ09ORklHX0hFQURFUikuLi8uLi9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjcxOQpUMTUsOTcKX0FDX0NIRUNLX0ZJTEVTWyQxXSwgW0FDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoW0hBVkVfJDFdKSwgWzFdLAogIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZmlsZSBgJDEnLl0pXQpUNywxNzQKQUNfV0lUSF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19XSVRIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19BUkdfV0lUSChbJDFdLCBbICAtLXdpdGgtJDFdLCBbJDJdLCBbJDNdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUNywxNzYKQUNfV0FSTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19XQVJOJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX01TR19XQVJOXSwgW0FDX01TR19XQVJOKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCw2MzcKQUNfRVJMQU5HX1NVQlNUX1JPT1RfRElSX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0VSTEFOR19ORUVEX0VSTENdKVtdZG5sCkFDX1JFUVVJUkUoW0FDX0VSTEFOR19ORUVEX0VSTF0pW11kbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBFcmxhbmcvT1RQIHJvb3QgZGlyZWN0b3J5XSwKICAgIFthY19jdl9lcmxhbmdfcm9vdF9kaXJdLAogICAgW0FDX0xBTkdfUFVTSChFcmxhbmcpW11kbmwKICAgICBBQ19SVU5fSUZFTFNFKAoJW0FDX0xBTkdfUFJPR1JBTShbXSwgW2RubAoJICAgIFJvb3REaXIgPSBjb2RlOnJvb3RfZGlyKCksCgkgICAgZmlsZTp3cml0ZV9maWxlKCJjb25mdGVzdC5vdXQiLCBSb290RGlyKSwKCSAgICBSZXR1cm5WYWx1ZSA9IDAsCgkgICAgaGFsdChSZXR1cm5WYWx1ZSldKV0sCglbYWNfY3ZfZXJsYW5nX3Jvb3RfZGlyPWBjYXQgY29uZnRlc3Qub3V0YAoJIHJtIC1mIGNvbmZ0ZXN0Lm91dF0sCglbcm0gLWYgY29uZnRlc3Qub3V0CgkgQUNfTVNHX0ZBSUxVUkUoW3Rlc3QgRXJsYW5nIHByb2dyYW0gZXhlY3V0aW9uIGZhaWxlZF0pXSkKICAgICBBQ19MQU5HX1BPUChFcmxhbmcpW11kbmwKICAgIF0pCkFDX1NVQlNUKFtFUkxBTkdfUk9PVF9ESVJdLCBbJGFjX2N2X2VybGFuZ19yb290X2Rpcl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzIsMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9MT05HX0RPVUJMRSkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6Mzg5ClQyOCwyOAptNF9sb2NhdGlvbihBQ19DX1BST1RPVFlQRVMpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MTgyOApUOSwyMjIKbTRfYm1hdGNobTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjXSldLAogICAgICAgWyQjXSwgMSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKICAgICAgIFskI10sIDIsIFskMl0sCiAgICAgICBbbTRfaWYobTRfYnJlZ2V4cChbJDFdLCBbJDJdKSwgLTEsIFskMChbJDFdLCBtNF9zaGlmdDMoJEApKV0sCgkgICAgICBbJDNdKV0pClQxMCwyNgpBU19NS0RJUl9QYXNfZGlyPSQxOyBhc19mbl9ta2Rpcl9wW10KVDEwLDEyNApBU19NS0RJUl9QX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsOTM1CkFDX0ZVTkNfVVRJTUVfTlVMTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19IRUFERVJTX09OQ0UodXRpbWUuaCkKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciB1dGltZSBhY2NlcHRzIGEgbnVsbCBhcmd1bWVudCwgYWNfY3ZfZnVuY191dGltZV9udWxsLApbcm0gLWYgY29uZnRlc3QuZGF0YTsgPmNvbmZ0ZXN0LmRhdGEKIyBTZXF1ZW50IGludGVycHJldHMgdXRpbWUoZmlsZSwgMCkgdG8gbWVhbiB1c2Ugc3RhcnQgb2YgZXBvY2guICBXcm9uZy4KQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUCgkgICAgICAgI2lmZGVmIEhBVkVfVVRJTUVfSAoJICAgICAgICMgaW5jbHVkZSA8dXRpbWUuaD4KCSAgICAgICAjZW5kaWZdLApbW3N0cnVjdCBzdGF0IHMsIHQ7CiAgcmV0dXJuICEgKHN0YXQgKCJjb25mdGVzdC5kYXRhIiwgJnMpID09IDAKCSAgICAmJiB1dGltZSAoImNvbmZ0ZXN0LmRhdGEiLCAwKSA9PSAwCgkgICAgJiYgc3RhdCAoImNvbmZ0ZXN0LmRhdGEiLCAmdCkgPT0gMAoJICAgICYmIHQuc3RfbXRpbWUgPj0gcy5zdF9tdGltZQoJICAgICYmIHQuc3RfbXRpbWUgLSBzLnN0X210aW1lIDwgMTIwKTtdXSldLAoJICAgICAgYWNfY3ZfZnVuY191dGltZV9udWxsPXllcywKCSAgICAgIGFjX2N2X2Z1bmNfdXRpbWVfbnVsbD1ubywKCSAgICAgIGFjX2N2X2Z1bmNfdXRpbWVfbnVsbD0nZ3Vlc3NpbmcgeWVzJyldKQppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdXRpbWVfbnVsbCIgIT0geG5vOyB0aGVuCiAgYWNfY3ZfZnVuY191dGltZV9udWxsPXllcwogIEFDX0RFRklORShIQVZFX1VUSU1FX05VTEwsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIGB1dGltZShmaWxlLCBOVUxMKScgc2V0cyBmaWxlJ3MgdGltZXN0YW1wIHRvIHRoZQoJICAgICBwcmVzZW50Ll0pCmZpCnJtIC1mIGNvbmZ0ZXN0LmRhdGEKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwzNAptNF9sb2NhdGlvbihfQUNfRkNfV1JBUFBFUlMpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTAzMApUMTksMzQKbTRfbG9jYXRpb24oQUNfUlNIKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo4NTgKVDI5LDMxCm00X2xvY2F0aW9uKEFDX0NIRUNLX0FMSUdOT0YpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjgwMApUMTMsMzMzCm00X2RpdmVydF9wb3BtNF9pZihbJDFdLCBbXSwgW10sCiAgICAgICBbJDFdLCBfbTRfZGVmbihbX200X2RpdmVydF9kaXZlcnNpb25dKSwgW10sCiAgICAgICBbbTRfZmF0YWwoWyQwKCQxKTogZGl2ZXJzaW9uIG1pc21hdGNoOgpdbTRfZGl2ZXJ0X3N0YWNrKV0pX200X3BvcGRlZihbX200X2RpdmVydF9zdGFja10sIFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pbTRfaWZkZWYoW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSwgW10sCgkgICBbbTRfZmF0YWwoW3RvbyBtYW55IG00X2RpdmVydF9wb3BdKV0pX200X2RpdmVydF9yYXcoX200X2RpdmVydChfbTRfZGVmbihbX200X2RpdmVydF9kaXZlcnNpb25dKSwgWy1dKSkKVDE2LDE2OQpfQVNfRVhQUl9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCiAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCiAgYXNfZXhwcj1leHByCmVsc2UKICBhc19leHByPWZhbHNlCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMTcyCl9BQ19SVU5fTE9HX200X2RlZnVuX3BybyhbJDBdKXsgeyAkMjsgfSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgKCQxKSAyPiZBU19NRVNTQUdFX0xPR19GRAogIGFjX3N0YXR1cz0kPwogIF9BU19FQ0hPX0xPRyhbXCQ/ID0gJGFjX3N0YXR1c10pCiAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNDQ3CkFDX1BST0dfWUFDQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19QUk9HUyhZQUNDLCAnYmlzb24gLXknIGJ5YWNjLCB5YWNjKWRubApBQ19BUkdfVkFSKFlBQ0MsCltUaGUgYFlldCBBbm90aGVyIENvbXBpbGVyIENvbXBpbGVyJyBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBEZWZhdWx0cyB0bwp0aGUgZmlyc3QgcHJvZ3JhbSBmb3VuZCBvdXQgb2Y6IGBiaXNvbiAteScsIGBieWFjYycsIGB5YWNjJy5dKWRubApBQ19BUkdfVkFSKFlGTEFHUywKW1RoZSBsaXN0IG9mIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIGJ5IGRlZmF1bHQgdG8gJFlBQ0MuICBUaGlzIHNjcmlwdAp3aWxsIGRlZmF1bHQgWUZMQUdTIHRvIHRoZSBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgYSBkZWZhdWx0IHZhbHVlIG9mIGAtZCcgZ2l2ZW4KYnkgc29tZSBtYWtlIGFwcGxpY2F0aW9ucy5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzIsMzMKbTRfbG9jYXRpb24oQUNfUkVRVUlSRV9TSEVMTF9GTikuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxODEKVDksMTkwCkFDX1BSRUZJWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19QUkVGSVgnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUFJFRklYX1BST0dSQU1dLCBbQUNfUFJFRklYX1BST0dSQU0oJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDY0CkFDX0xBTkdfQ09NUElMRVIoR28pX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfR09dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMzU2CkFDX0ZVTkNfR0VUTU5URU5UX200X2RlZnVuX3BybyhbJDBdKSMgZ2V0bW50ZW50IGlzIGluIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgb24gVU5JQ09TLCBpbiAtbHN1biBvbiBJcml4IDQsCiMgLWxzZXEgb24gRHluaXgvUFRYLCAtbGdlbiBvbiBVbml4d2FyZS4KQUNfU0VBUkNIX0xJQlMoZ2V0bW50ZW50LCBbc3VuIHNlcSBnZW5dLAoJICAgICAgIFthY19jdl9mdW5jX2dldG1udGVudD15ZXMKCQlBQ19ERUZJTkUoW0hBVkVfR0VUTU5URU5UXSwgMSwKCQkJICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRtbnRlbnQnIGZ1bmN0aW9uLl0pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19nZXRtbnRlbnQ9bm9dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDMzCm00X2xvY2F0aW9uKEFDX0ZEX0NDKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjM4MwpUMTksOTUKX0FTX0RFVEVDVF9SRVFVSVJFRF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9zZXRfYWRkKFtfQVNfREVURUNUX1JFUVVJUkVEX0JPRFldLCBbJDEgfHwgQVNfRVhJVF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ2LDUyOQpBQ19VU0dfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVVNHJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0Qgc3RyaW5nIGFuZCBtZW1vcnkgZnVuY3Rpb25zXSkKQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW0AlOkBpbmNsdWRlIDxzdHJpbmdzLmg+XV0sCgkJCQlbW3JpbmRleCgwLCAwKTsgYnplcm8oMCwgMCk7XV0pXSwKCSAgICAgICBbQUNfTVNHX1JFU1VMVCh5ZXMpXSwKCSAgICAgICBbQUNfTVNHX1JFU1VMVChubykKCQlBQ19ERUZJTkUoVVNHLCAxLAoJCQkgIFtEZWZpbmUgdG8gMSBpZiB5b3UgZG8gbm90IGhhdmUgPHN0cmluZ3MuaD4sIGluZGV4LAoJCQkgICBiemVybywgZXRjLi4uIFRoaXMgc3ltYm9sIGlzIG9ic29sZXRlLCB5b3Ugc2hvdWxkCgkJCSAgIG5vdCBkZXBlbmQgdXBvbiBpdC5dKV0pCkFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmgpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxMjEKbTRfcmVfd29yZFthYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX11bYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8wMTIzNDU2Nzg5XSoKVDQyLDI3Cm00X2xvY2F0aW9uKF9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjM0NQpUMTIsMTE1CkFDX0NPUFlSSUdIVEFTX0NPUFlSSUdIVChbJDFdKVtdbTRfZGl2ZXJ0X3RleHQobTRfZGVmYXVsdF9xdW90ZWQoWyQyXSwgW1ZFUlNJT05fVVNFUl0pLApbbTRfZGVmYXVsdChbJDNdLCBbbTRfbmV3bGluZV0pKFskMV0pXSkKVDIyLDMwCm00X2xvY2F0aW9uKEFDX0VYRUVYVCkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDo0OTAKVDksNDAKQUNfT0JKRVhUX200X2RlZnVuX3BybyhbJDBdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMTU3CkFDX0Y3N19GVU5DX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW19BQ19GNzdfTkFNRV9NQU5HTElOR10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuIDc3KWRubApfQUNfRkNfRlVOQyhbJDFdLFskMl0pCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMzQKbTRfbG9jYXRpb24oQUNfUFJPR19HUkVQKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDozODgKVDI3LDM1Cm00X2xvY2F0aW9uKEFDX0ZVTkNfTUVNQ01QKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6OTUwClQzMSwwCm00X2luY2x1ZGUoYXV0b2NvbmYvaGVhZGVycy5tNCkKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX0NPTVBVVEVfSU5UKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjMwNTYKVDksODYKQUhfQk9UVE9NbTRfZGVmaW5lKFtfQUhfQ09VTlRFUl0sIG00X2luY3IoX0FIX0NPVU5URVIpKWRubApBSF9WRVJCQVRJTShbenp6el1fQUhfQ09VTlRFUiwgWyQxXSkKVDI4LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfSU5UMTZfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjI1ClQyNSwzMwptNF9sb2NhdGlvbihBQ19GSU5EX1hUUkEpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjU4ClQyNiwzNAptNF9sb2NhdGlvbihBQ19DSEVDS19GSUxFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI3NzcKVDM0LDI5MgpfQUNfSEVBREVSX1RJT0NHV0lOU1pfSU5fU1lTX0lPQ1RMQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3lzL2lvY3RsLmggZGVmaW5lcyBUSU9DR1dJTlNaXSwKCQlhY19jdl9zeXNfdGlvY2d3aW5zel9pbl9zeXNfaW9jdGxfaCwKW0FDX0VHUkVQX0NQUChbeWVzXSwKCSAgICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2lmZGVmIFRJT0NHV0lOU1oKICB5ZXMKI2VuZGlmCl0sCgkJYWNfY3Zfc3lzX3Rpb2Nnd2luc3pfaW5fc3lzX2lvY3RsX2g9eWVzLAoJCWFjX2N2X3N5c190aW9jZ3dpbnN6X2luX3N5c19pb2N0bF9oPW5vKV0pCgpUMTQsNzA4CkFDX1BST0dfQ1hYQ1BQX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKQUNfQVJHX1ZBUihbQ1hYQ1BQXSwgICBbQysrIHByZXByb2Nlc3Nvcl0pZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKQUNfTEFOR19QVVNIKEMrKylkbmwKQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yXSkKaWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KICBBQ19DQUNIRV9WQUwoYWNfY3ZfcHJvZ19DWFhDUFAsCiAgW2RubAogICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1hYQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCiAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCiAgICBkbwogICAgICBfQUNfUFJPR19QUkVQUk9DX1dPUktTX0lGRUxTRShbYnJlYWtdKQogICAgZG9uZQogICAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAogIF0pZG5sCiAgQ1hYQ1BQPSRhY19jdl9wcm9nX0NYWENQUAplbHNlCiAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUApmaQpBQ19NU0dfUkVTVUxUKFskQ1hYQ1BQXSkKX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0UoW10sCgkgIFtBQ19NU0dfRkFJTFVSRShbQysrIHByZXByb2Nlc3NvciAiJENYWENQUCIgZmFpbHMgc2FuaXR5IGNoZWNrXSldKQpBQ19TVUJTVChDWFhDUFApZG5sCkFDX0xBTkdfUE9QKEMrKylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywyCkFDX0xBTkdfU09VUkNFKEMpJDEKVDMzLDMzCm00X2xvY2F0aW9uKF9BQ19DSEVDS19IRUFERVJfTkVXKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjIyMApUMjYsMjkKbTRfbG9jYXRpb24oQVNfU0VUX1NUQVRVUykuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjY0OQpUMjcsMzQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfRklMRVMpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjgwOApUMTQsMzcKbTRfUEFDS0FHRV9VUkxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYvClQxMSw2MgptNF9jcl9hbG51bWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5ClQxNiw0Nzc1Cl9BQ19JTklUX1BSRVBBUkVtNF9kaXZlcnRfcHVzaChbSU5JVF9QUkVQQVJFXSlkbmwKCiMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCiMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgojIFN0cmlwIG91dCAtLXNpbGVudCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb3JkIGl0IGZvciBmdXR1cmUgcnVucy4KIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgojIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KYWNfY29uZmlndXJlX2FyZ3M9CmFjX2NvbmZpZ3VyZV9hcmdzMD0KYWNfY29uZmlndXJlX2FyZ3MxPQphY19tdXN0X2tlZXBfbmV4dD1mYWxzZQpmb3IgYWNfcGFzcyBpbiAxIDIKZG8KICBmb3IgYWNfYXJnCiAgZG8KICAgIGNhc2UgJGFjX2FyZyBpbgogICAgLW5vLWNyZWF0ZSB8IC0tbm8tYyogfCAtbiB8IC1uby1yZWN1cnNpb24gfCAtLW5vLXIqKSBjb250aW51ZSA7OwogICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQogICAgICBjb250aW51ZSA7OwogICAgKlwnKikKICAgICAgYWNfYXJnPWBBU19FQ0hPKFsiJGFjX2FyZyJdKSB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwogICAgZXNhYwogICAgY2FzZSAkYWNfcGFzcyBpbgogICAgMSkgQVNfVkFSX0FQUEVORChbYWNfY29uZmlndXJlX2FyZ3MwXSwgWyIgJyRhY19hcmcnIl0pIDs7CiAgICAyKQogICAgICBBU19WQVJfQVBQRU5EKFthY19jb25maWd1cmVfYXJnczFdLCBbIiAnJGFjX2FyZyciXSkKZG5sIElmIHRyeWluZyB0byByZW1vdmUgZHVwbGljYXRlcywgYmUgc3VyZSB0byAoaSkga2VlcCB0aGUgKmxhc3QqCmRubCB2YWx1ZSAoZS5nLiAtLXByZWZpeD0xIC0tcHJlZml4PTIgLS1wcmVmaXg9MSBtaWdodCBrZWVwIDIgb25seSksCmRubCBhbmQgKGlpKSBub3QgdG8gc3RyaXAgbG9uZyBvcHRpb25zICgtLXByZWZpeCBmb28gLS1wcmVmaXggYmFyIG1pZ2h0CmRubCBnaXZlIC0tcHJlZml4IGZvbyBiYXIpLgogICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KICAgICAgZWxzZQoJY2FzZSAkYWNfYXJnIGluCmRubCBVc2UgYnJvYWQgcGF0dGVybnMsIGFzIGFyZ3VtZW50cyB0aGF0IHdvdWxkIGhhdmUgYWxyZWFkeSBtYWRlIGNvbmZpZ3VyZQpkbmwgZXhpdCBkb24ndCBtYXR0ZXIuCgkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAoJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCgkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCgkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCgkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OwoJICAgIGVzYWMKCSAgICA7OwoJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKCWVzYWMKICAgICAgZmkKICAgICAgQVNfVkFSX0FQUEVORChbYWNfY29uZmlndXJlX2FyZ3NdLCBbIiAnJGFjX2FyZyciXSkKICAgICAgOzsKICAgIGVzYWMKICBkb25lCmRvbmUKQVNfVU5TRVQoYWNfY29uZmlndXJlX2FyZ3MwKQpBU19VTlNFVChhY19jb25maWd1cmVfYXJnczEpCgojIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCiMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCiMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgojIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgp0cmFwICdleGl0X3N0YXR1cz0kPwogICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgogIHsKICAgIGVjaG8KCiAgICBBU19CT1goW0NhY2hlIHZhcmlhYmxlcy5dKQogICAgZWNobwogICAgbTRfYnBhdHN1YnN0cyhtNF9kZWZuKFtfQUNfQ0FDSEVfRFVNUF0pLAoJCSAgW14gKlwoIy4qXCk/Cl0sICAgICAgICAgICAgICAgIFtdLAoJCSAgWyddLCBbJ1xcJyddKQogICAgZWNobwoKICAgIEFTX0JPWChbT3V0cHV0IHZhcmlhYmxlcy5dKQogICAgZWNobwogICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycwogICAgZG8KICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgICAgIGNhc2UgJGFjX3ZhbCBpbgogICAgICAqXCdcJycqKSBhY192YWw9YEFTX0VDSE8oWyIkYWNfdmFsIl0pIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKICAgICAgZXNhYwogICAgICBBU19FQ0hPKFsiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciXSkKICAgIGRvbmUgfCBzb3J0CiAgICBlY2hvCgogICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgogICAgICBBU19CT1goW0ZpbGUgc3Vic3RpdHV0aW9ucy5dKQogICAgICBlY2hvCiAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCiAgICAgIGRvCglldmFsIGFjX3ZhbD1cJCRhY192YXIKCWNhc2UgJGFjX3ZhbCBpbgoJKlwnXCcnKikgYWNfdmFsPWBBU19FQ0hPKFsiJGFjX3ZhbCJdKSB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Cgllc2FjCglBU19FQ0hPKFsiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciXSkKICAgICAgZG9uZSB8IHNvcnQKICAgICAgZWNobwogICAgZmkKCiAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KICAgICAgQVNfQk9YKFtjb25mZGVmcy5oLl0pCiAgICAgIGVjaG8KICAgICAgY2F0IGNvbmZkZWZzLmgKICAgICAgZWNobwogICAgZmkKICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKICAgICAgQVNfRUNITyhbIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIl0pCiAgICBBU19FQ0hPKFsiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyJdKQogIH0gPiZBU19NRVNTQUdFX0xPR19GRAogIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgogICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJFskXSogJGFjX2NsZWFuX2ZpbGVzICYmCiAgICBleGl0ICRleGl0X3N0YXR1cwonIDAKZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCiAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgQVNfRVhJVChbMV0pJyAkYWNfc2lnbmFsCmRvbmUKYWNfc2lnbmFsPTAKCiMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCnJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCgpkbmwgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBOZXh0U3RlcCAzLjMgKHBhdGNoIDMpIGxvc2VzIG9uIGEgZmlsZQpkbmwgY29udGFpbmluZyBsZXNzIHRoYW4gMTQgYnl0ZXMgKGluY2x1ZGluZyB0aGUgbmV3bGluZSkuCkFTX0VDSE8oWyIvKiBjb25mZGVmcy5oICovIl0pID4gY29uZmRlZnMuaAoKIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCkFDX0RFRklORV9VTlFVT1RFRChbUEFDS0FHRV9OQU1FXSwgWyIkUEFDS0FHRV9OQU1FIl0sCgkJICAgW0RlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS5dKWRubApBQ19ERUZJTkVfVU5RVU9URUQoW1BBQ0tBR0VfVEFSTkFNRV0sIFsiJFBBQ0tBR0VfVEFSTkFNRSJdLAoJCSAgIFtEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuXSlkbmwKQUNfREVGSU5FX1VOUVVPVEVEKFtQQUNLQUdFX1ZFUlNJT05dLCBbIiRQQUNLQUdFX1ZFUlNJT04iXSwKCQkgICBbRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS5dKWRubApBQ19ERUZJTkVfVU5RVU9URUQoW1BBQ0tBR0VfU1RSSU5HXSwgWyIkUEFDS0FHRV9TVFJJTkciXSwKCQkgICBbRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLl0pZG5sCkFDX0RFRklORV9VTlFVT1RFRChbUEFDS0FHRV9CVUdSRVBPUlRdLCBbIiRQQUNLQUdFX0JVR1JFUE9SVCJdLAoJCSAgIFtEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZQoJCSAgICBzaG91bGQgYmUgc2VudC5dKWRubApBQ19ERUZJTkVfVU5RVU9URUQoW1BBQ0tBR0VfVVJMXSwgWyIkUEFDS0FHRV9VUkwiXSwKCQkgICBbRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS5dKQoKIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCkFDX1NJVEVfTE9BRApBQ19DQUNIRV9MT0FECm00X2RpdmVydF9wb3AoW0lOSVRfUFJFUEFSRV0pZG5sCgpUMTIsNzEKQVNfQ09QWVJJR0hUbTRfZGl2ZXJ0X3RleHQoW0hFQURFUi1DT1BZUklHSFRdLApbbTRfYnBhdHN1YnN0KFsKJDFdLCBbXl0sIFtAJTpAIF0pXSkKVDEwLDE0OQpBQ19GT1JFQUNIX200X2RlZnVuX3BybyhbJDBdKW00X2ZvcmVhY2hfdygkQClkbmwKQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRk9SRUFDSCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDEzNDcKQUNfRkNfRlJFRUZPUk1fbTRfZGVmdW5fb25jZShbQUNfRkNfRlJFRUZPUk1dLCBbQUNfTEFOR19QVVNIKFtGb3J0cmFuXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBGb3J0cmFuIGZsYWcgbmVlZGVkIHRvIGFjY2VwdCBmcmVlLWZvcm0gc291cmNlXSwKCSAgICAgICBbYWNfY3ZfZmNfZnJlZWZvcm1dLApbYWNfY3ZfZmNfZnJlZWZvcm09dW5rbm93bgphY19mY19mcmVlZm9ybV9GQ0ZMQUdTX3NhdmU9JEZDRkxBR1MKZm9yIGFjX2ZsYWcgaW4gbm9uZSAtZmZyZWUtZm9ybSAtRlIgLWZyZWUgLXFmcmVlIC1NZnJlZSAtTWZyZWVmb3JtIFwKCSAgICAgICAtZnJlZWZvcm0gIi1mIGZyZWUiIC04ICtzb3VyY2U9ZnJlZSAtbmZpeCAtLW5maXggLUZyZWUKZG8KICB0ZXN0ICJ4JGFjX2ZsYWciICE9IHhub25lICYmIEZDRkxBR1M9IiRhY19mY19mcmVlZm9ybV9GQ0ZMQUdTX3NhdmUgJGFjX2ZsYWciCmRubCBVc2UgQCZ0QCBiZWxvdyB0byBlbnN1cmUgdGhhdCBlZGl0b3JzIGRvbid0IHR1cm4gOCsgc3BhY2VzIGludG8gdGFiLgogIEFDX0NPTVBJTEVfSUZFTFNFKFtbCiAgcHJvZ3JhbSBmcmVlZm9ybQogICAgICAgISBGSVhNRTogaG93IHRvIGJlc3QgY29uZnVzZSBub24tZnJlZWZvcm0gY29tcGlsZXJzPwogICAgICAgcHJpbnQgKiwgJ0hlbGxvICcsICYKICAgICBAJnRAICAgICAnd29ybGQuJwogICAgICAgZW5kXV0sCgkJICAgIFthY19jdl9mY19mcmVlZm9ybT0kYWNfZmxhZzsgYnJlYWtdKQpkb25lCnJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKRkNGTEFHUz0kYWNfZmNfZnJlZWZvcm1fRkNGTEFHU19zYXZlCl0pCmlmIHRlc3QgIngkYWNfY3ZfZmNfZnJlZWZvcm0iID0geHVua25vd247IHRoZW4KICBtNF9kZWZhdWx0KFskMl0sCgkgICAgIFtBQ19NU0dfRVJST1IoW0ZvcnRyYW4gZG9lcyBub3QgYWNjZXB0IGZyZWUtZm9ybSBzb3VyY2VdLCA3NyldKQplbHNlCiAgaWYgdGVzdCAieCRhY19jdl9mY19mcmVlZm9ybSIgIT0geG5vbmU7IHRoZW4KICAgIEZDRkxBR1M9IiRGQ0ZMQUdTICRhY19jdl9mY19mcmVlZm9ybSIKICBmaQogICQxCmZpCkFDX0xBTkdfUE9QKFtGb3J0cmFuXSlkbmwKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0ZDX0ZSRUVGT1JNXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfRkNfRlJFRUZPUk1dKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfRkNfRlJFRUZPUk1dKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19GQ19GUkVFRk9STV0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKRjgsOAp0cmFuc2xpdHRyYW5zbGl0CkYxMSw4Cm00X3RyYW5zbGl0dHJhbnNsaXQKVDI4LDM1Cm00X2xvY2F0aW9uKGZwX0ZVTkNfRk5NQVRDSCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU5NApUMjcsMzQKbTRfbG9jYXRpb24oQUNfRkNfRlJFRUZPUk0pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTM2MwpUMjksMjIwCl9BQ19DSEVDS19IRUFERVJfQ09NUElMRV9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkW10yXSwgWyRbXTNdLAoJCSBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFskW100CkAlOkBpbmNsdWRlIDwkW10yPl0pXSwKCQkJCSAgICBbQVNfVkFSX1NFVChbJFtdM10sIFt5ZXNdKV0sCgkJCQkgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbbm9dKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUMTMsNjAKQUNfRlVOQ19MU1RBVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRlVOQ19TVEFUKGxzdGF0KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMzIKbTRfbG9jYXRpb24oQUNfQ09ORklHX0xJTktTKS4uLy4uL2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6OTIxClQxNywxNTgKQUNfSEFWRV9QT1VOREJBTkdfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEFWRV9QT1VOREJBTkcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX1NZU19JTlRFUlBSRVRFUltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTEwCm00X2RpdmVydF9wdXNobTRfZGl2ZXJ0X3N0YWNrX3B1c2goWyQwXSwgWyQxXSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0sIFskMV0pX200X2RpdmVydF9yYXcoX200X2RpdmVydChbJDFdLCBbJDJdKSkKVDIxLDk1Cl9BQ19MQU5HX05VTExfUFJPR1JBTV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1NPVVJDRShbX0FDX0xBTkdfRElTUEFUQ0goWyQwXSwgX0FDX0xBTkcsICRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwzMQptNF9sb2NhdGlvbihBQ19UWVBFX0dFVEdST1VQUykuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MjU5ClQ4LDg3Cm00X2ZhdGFsbTRfZXJycHJpbnRuKG00X2xvY2F0aW9uWzogZXJyb3I6ICQxXQptNF9leHBhbnNpb25fc3RhY2spbTRfZXhpdChtNF9pZihbJDJdLCwgMSwgWyQyXSkpClQyMywzCl9BQ19MQU5HX1BSRUZJWChFcmxhbmcpRVJMClQzNiwxMDIwCkFDX0xBTkdfRlVOQ19MSU5LX1RSWShPYmplY3RpdmUgQysrKUFDX0xBTkdfUFJPR1JBTSgKWy8qIERlZmluZSAkMSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQxLgogICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KI2RlZmluZSAkMSBpbm5vY3VvdXNfJDEKCi8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDEgKCk7IGJlbG93LgogICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KCiNpZmRlZiBfX1NURENfXwojIGluY2x1ZGUgPGxpbWl0cy5oPgojZWxzZQojIGluY2x1ZGUgPGFzc2VydC5oPgojZW5kaWYKCiN1bmRlZiAkMQoKLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMSAoKTsKLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwojaWYgZGVmaW5lZCBfX3N0dWJfJDEgfHwgZGVmaW5lZCBfX3N0dWJfX18kMQpjaG9rZSBtZQojZW5kaWYKXSwgW3JldHVybiAkMSAoKTtdKQpGOCw1Cm00X2lmZGVmaWZkZWYKVDE5LDcxNApBQ19PVVRQVVRfTUFLRV9ERUZTWyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgojIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgojIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCiMKIyBJZiB0aGUgZmlyc3Qgc2VkIHN1YnN0aXR1dGlvbiBpcyBleGVjdXRlZCAod2hpY2ggbG9va3MgZm9yIG1hY3JvcyB0aGF0CiMgdGFrZSBhcmd1bWVudHMpLCB0aGVuIGJyYW5jaCB0byB0aGUgcXVvdGUgc2VjdGlvbi4gIE90aGVyd2lzZSwKIyBsb29rIGZvciBhIG1hY3JvIHRoYXQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cy4KYWNfc2NyaXB0PScKOm1saW5lCi9cXCQvewogTgogcyxcXFxuLCwKIGIgbWxpbmUKfQp0IGNsZWFyCjpjbGVhcgpzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIChdW14JIChdKihbXildKilcKVsJIF0qXCguKlwpLy1EXDE9XDIvZwp0IHF1b3RlCnMvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgXVteCSBdKlwpWwkgXSpcKC4qXCkvLURcMT1cMi9nCnQgcXVvdGUKYiBhbnkKOnF1b3RlCnMvWwkgYH4jJF4mKigpe31cXHw7J1wnJyI8Pj9dL1xcJi9nCnMvXFsvXFwmL2cKcy9cXS9cXCYvZwpzL1wkLyQkL2cKSAo6YW55CiR7CglnCglzL15cbi8vCglzL1xuLyAvZwoJcAp9CicKREVGUz1gc2VkIC1uICIkYWNfc2NyaXB0IiBjb25mZGVmcy5oYApdClQyNiwzMQptNF9sb2NhdGlvbihBQ19UWVBFX1VJRF9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo1OTAKVDI0LDMzCm00X2xvY2F0aW9uKEFDX0Y3N19NQUlOKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00Ojg5MQpUMjAsOTgKX0FDX0xBTkdfT1BFTk1QKEMrKykKI2lmbmRlZiBfT1BFTk1QCiBjaG9rZSBtZQojZW5kaWYKI2luY2x1ZGUgPG9tcC5oPgppbnQgbWFpbiAoKSB7IHJldHVybiBvbXBfZ2V0X251bV90aHJlYWRzICgpOyB9CgpUMjcsMgpBQ19MQU5HX1NPVVJDRShPYmplY3RpdmUgQykkMQpUMjQsMzQKbTRfbG9jYXRpb24oX0FDX0RPX0VDSE8pLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjM1MApUMjksMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9VSU5UNjRfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjMxClQyMCwzMwptNF9sb2NhdGlvbihBQ19MTl9TKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2MgpUMjcsMzEKbTRfbG9jYXRpb24oQUNfSU5UXzE2X0JJVFMpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjgyOQpUMTYsMjI1Cl9BU19MSU5FTk9fV09SS1MgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KICBhc19saW5lbm9fMj0kTElORU5PIGFzX2xpbmVub18yYT0kTElORU5PCiAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCiAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicKVDEzLDc4NgpfQUNfUFJPR19DQ19HYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQphY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENDIGFjY2VwdHMgLWcsIGFjX2N2X3Byb2dfY2NfZywKICBbYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCiAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCiAgIGFjX2N2X3Byb2dfY2NfZz1ubwogICBDRkxBR1M9Ii1nIgogICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKICAgICBbYWNfY3ZfcHJvZ19jY19nPXllc10sCiAgICAgW0NGTEFHUz0iIgogICAgICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKCVtdLAoJW2FjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwoJIENGTEFHUz0iLWciCgkgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCgkgICBbYWNfY3ZfcHJvZ19jY19nPXllc10pXSldKQogICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWddKQppZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCiAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwplbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgogIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAgICBDRkxBR1M9Ii1nIC1PMiIKICBlbHNlCiAgICBDRkxBR1M9Ii1nIgogIGZpCmVsc2UKICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgogICAgQ0ZMQUdTPSItTzIiCiAgZWxzZQogICAgQ0ZMQUdTPQogIGZpCmZpW11kbmwKClQyMCwxMzM3Cl9BQ19GQ19JTVBMSUNJVF9OT05FX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgZmxhZyB0byBkaXNhbGxvdyBfQUNfTEFORyBpbXBsaWNpdCBkZWNsYXJhdGlvbnNdLAogICAgICAgICAgICAgICBbYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9pbXBsaWNpdF9ub25lXSwKW2FjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11faW1wbGljaXRfbm9uZT11bmtub3duCmFjX2ZjX2ltcGxpY2l0X25vbmVfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTX3NhdmU9JFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUwpmb3IgYWNfZmxhZyBpbiBub25lIC1maW1wbGljaXQtbm9uZSAtdSAtV2ltcGxpY2l0IC1pbXBsaWNpdG5vbmUgK2ltcGxpY2l0X25vbmUgXAogICAgICAgICAgICAgICAtcXVuZGVmICItd2FybiBkZWNsYXJhdGlvbnMiIC1pbiAtLWluIC1BVCAiLWUgSSIgLU1kY2xjaGsgXAogICAgICAgICAgICAgICAiLXUgLXdhcm4gZXJyb3JzIgpkbwogIGlmIHRlc3QgIngkYWNfZmxhZyIgIT0geG5vbmU7IHRoZW4KICAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9IiRhY19mY19pbXBsaWNpdF9ub25lX1tdX0FDX0xBTkdfUFJFRklYW11GTEFHU19zYXZlICRhY19mbGFnIgogIGZpCiAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgW10pXSwKICAgIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbWwogICAgICBpID0gMAogICAgICBwcmludCAqLCBpXV0pXSwKICAgICAgIFtdLAogICAgICAgW2FjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11faW1wbGljaXRfbm9uZT0kYWNfZmxhZzsgYnJlYWtdKV0pCmRvbmUKcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dApfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRhY19mY19pbXBsaWNpdF9ub25lX1tdX0FDX0xBTkdfUFJFRklYW11GTEFHU19zYXZlCl0pCmlmIHRlc3QgIngkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9pbXBsaWNpdF9ub25lIiA9IHh1bmtub3duOyB0aGVuCiAgbTRfZGVmYXVsdChbJDNdLAogICAgW0FDX01TR19FUlJPUihbbm8gRm9ydHJhbiBmbGFnIHRvIGRpc2FsbG93IGltcGxpY2l0IGRlY2xhcmF0aW9ucyBmb3VuZF0sIDc3KV0pCmVsc2UKICBpZiB0ZXN0ICJ4JGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11faW1wbGljaXRfbm9uZSIgIT0geG5vbmU7IHRoZW4KICAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9IiRfQUNfTEFOR19QUkVGSVhbXUZMQUdTICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2ltcGxpY2l0X25vbmUiCiAgZmkKICAkMgpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDcsMjAKbTRfd3JhcF9tNF93cmFwKFtdLCBbJDFbXV0pClQxNiw5Cl9BU19URVNUX1hfV09SS1N0ZXN0IC14IC8KVDI4LDM1Cm00X2xvY2F0aW9uKEFDX0ZVTkNfTUJSVE9XQykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjkyNwpUMjUsMzQKbTRfbG9jYXRpb24oQUNfRUdSRVBfQ1BQKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI1MzgKVDI5LDM0Cm00X2xvY2F0aW9uKEFDX0NPTVBJTEVfQ0hFQ0spLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY5NApUMjYsMzYKbTRfbG9jYXRpb24oX0FDX0ZVTkNfRk9SSykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE4MjkKVDI1LDM0Cm00X2xvY2F0aW9uKEFDX1hFTklYX0RJUikuLi8uLi9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6NDUxClQyNiwzNAptNF9sb2NhdGlvbihBQ19MSUJTT1VSQ0VTKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI5MjAKVDIyLDM0Cm00X2xvY2F0aW9uKEFDX0xJQk9CSikuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyOTM4ClQxMiwxMTAKX200X3NldF9zaXplbTRfZGVmaW5lKFtfbTRfc2V0X3NpemUoJDEpXSwKCSAgIG00X2lmZGVmKFtfbTRfc2V0X3NpemUoJDEpXSwgWyQyKG00X2luZGlyKFtfbTRfc2V0X3NpemUoJDEpXSkpXSwKCQkgICAgWzFdKSkKVDExLDEwMDkKX0FDX0ZDX01BSU5fbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZPUlRSQU5fQVNTRVJUKClkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBhbHRlcm5hdGUgbWFpbiB0byBsaW5rIHdpdGggX0FDX0xBTkcgbGlicmFyaWVzXSwKCSAgICAgICBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21haW4sClthY19bXV9BQ19MQU5HX0FCQlJFVltdX21fc2F2ZV9MSUJTPSRMSUJTCiBMSUJTPSIkTElCUyAkW11fQUNfTEFOR19QUkVGSVhbXUxJQlMiCiBhY19mb3J0cmFuX2RtX3Zhcj1bXV9BQ19GQ1tdX0RVTU1ZX01BSU4KIEFDX0xBTkdfUFVTSChDKWRubAogYWNfY3ZfZm9ydHJhbl9tYWluPSJtYWluIiAjIGRlZmF1bHQgZW50cnkgcG9pbnQgbmFtZQogZm9yIGFjX2Z1bmMgaW4gTUFJTl9fIE1BSU5fIF9fbWFpbiBNQUlOIF9NQUlOIF9fTUFJTiBtYWluXyBtYWluX18gX21haW47IGRvCiAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0AlOkBpZmRlZiBGQ19EVU1NWV9NQUlOX0VRX0Y3NwpAJTpAICB1bmRlZiBGNzdfRFVNTVlfTUFJTgpAJTpAICB1bmRlZiBGQ19EVU1NWV9NQUlOCkAlOkBlbHNlCkAlOkAgIHVuZGVmICRhY19mb3J0cmFuX2RtX3ZhcgpAJTpAZW5kaWYKQCU6QGRlZmluZSBtYWluICRhY19mdW5jXSldLAoJCSAgW2FjX2N2X2ZvcnRyYW5fbWFpbj0kYWNfZnVuYzsgYnJlYWtdKQogZG9uZQogQUNfTEFOR19QT1AoQylkbmwKIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFpbj0kYWNfY3ZfZm9ydHJhbl9tYWluCiBybSAtcmYgY29uZnRlc3QqCiBMSUJTPSRhY19bXV9BQ19MQU5HX0FCQlJFVltdX21fc2F2ZV9MSUJTCl0pCkFDX0RFRklORV9VTlFVT1RFRChbXV9BQ19GQ1tdX01BSU4sICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21haW4sCgkJICAgW0RlZmluZSB0byBhbHRlcm5hdGUgbmFtZSBmb3IgYG1haW4nIHJvdXRpbmUgdGhhdCBpcwoJCSAgICBjYWxsZWQgZnJvbSBhIGBtYWluJyBpbiB0aGUgRm9ydHJhbiBsaWJyYXJpZXMuXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwyODQKQUNfU1RSVUNUX1NUX0JMT0NLU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9ibG9ja3NdLAoJCSAgW0FDX0RFRklORShIQVZFX1NUX0JMT0NLUywgMSwKCQkJICAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBgc3RydWN0IHN0YXQnIGhhcwoJCQkgICAgICBgc3RfYmxvY2tzJy4gIERlcHJlY2F0ZWQsIHVzZQoJCQkgICAgICBgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTE9DS1MnIGluc3RlYWQuXSldLAoJCSAgW0FDX0xJQk9CSihbZmlsZWJsb2Nrc10pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ2LDQzCm00X21hcF9tNF9mb3JlYWNoKFtfbTRfYXBwbHkoWyQxXSxdLCBbKV0sIFtdLCAkMikKVDI4LDM0Cm00X2xvY2F0aW9uKEFDX1BST0dfSU5TVEFMTCkuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6NTI0ClQxMCw1NAptNF9pbmNsdWRlbTRfaW5jbHVkZV91bmlxdWUoWyQxXSlkbmwKbTRfYnVpbHRpbihbaW5jbHVkZV0sIFskMV0pClQyNCwyCl9BQ19MQU5HX0FCQlJFVihGb3J0cmFuKWZjClQxNywxMzYKX0FTX0JBU0VOQU1FX0VYUFJfbTRfZGVmdW5fcHJvKFskMF0pJGFzX2V4cHIgWC9bXSQxIDogJy4qL1woW1teL11bXi9dKl1cKS8qJCcgXHwgXAoJIFhbXSQxIDogJ1hcKC8vXCkkJyBcfCBcCgkgWFtdJDEgOiAnWFwoL1wpJyBcfCAuW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxNTAKX0FDX0lOSVRfTElURVJBTG00X2lmKG00X2luZGV4KG00X3RyYW5zbGl0KFtbJDFdXSwgWwoiIl0sIFsnJ10pLCBbJ10pQVNfTElURVJBTF9IRVJFRE9DX0lGKFskMV0sIFstXSksIFstMS1dLCBbXSwKICBbbTRfd2Fybihbc3ludGF4XSwgW0FDX0lOSVQ6IG5vdCBhIGxpdGVyYWw6ICQxXSldKQpUMTksNApfQUNfQ0MoT2JqZWN0aXZlIEMpT0JKQwpUMTksMTE5NgpfQUNfRlVOQ19GTk1BVENIX0lGX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKAogICBbZm9yIHdvcmtpbmcgJDEgZm5tYXRjaF0sCiAgIFskMl0sCiAgWyMgU29tZSB2ZXJzaW9ucyBvZiBTb2xhcmlzLCBTQ08sIGFuZCB0aGUgR05VIEMgTGlicmFyeQogICAjIGhhdmUgYSBicm9rZW4gb3IgaW5jb21wYXRpYmxlIGZubWF0Y2guCiAgICMgU28gd2UgcnVuIGEgdGVzdCBwcm9ncmFtLiAgSWYgd2UgYXJlIGNyb3NzLWNvbXBpbGluZywgdGFrZSBubyBjaGFuY2UuCiAgICMgVGhhbmtzIHRvIEpvaG4gT2xleW5pY2ssIEZyYW5jLG9pcyBQaW5hcmQsIGFuZCBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LgogICBBQ19SVU5fSUZFTFNFKAogICAgICBbQUNfTEFOR19QUk9HUkFNKAoJIFsjaW5jbHVkZSA8Zm5tYXRjaC5oPgojCSAgIGRlZmluZSB5KGEsIGIsIGMpIChmbm1hdGNoIChhLCBiLCBjKSA9PSAwKQojCSAgIGRlZmluZSBuKGEsIGIsIGMpIChmbm1hdGNoIChhLCBiLCBjKSA9PSBGTk1fTk9NQVRDSCkKCSBdLAoJIFtyZXR1cm4KCSAgICghKHkgKCJhKiIsICJhYmMiLCAwKQoJICAgICAgJiYgbiAoImQqLyoxIiwgImQvcy8xIiwgRk5NX1BBVEhOQU1FKQoJICAgICAgJiYgeSAoImFcXFxcYmMiLCAiYWJjIiwgMCkKCSAgICAgICYmIG4gKCJhXFxcXGJjIiwgImFiYyIsIEZOTV9OT0VTQ0FQRSkKCSAgICAgICYmIHkgKCIqeCIsICIueCIsIDApCgkgICAgICAmJiBuICgiKngiLCAiLngiLCBGTk1fUEVSSU9EKQoJICAgICAgJiYgbTRfaWYoWyQxXSwgW0dOVV0sCgkJICAgW3kgKCJ4eFhYIiwgInhYeFgiLCBGTk1fQ0FTRUZPTEQpCgkJICAgICYmIHkgKCJhKysoeHx5eSliIiwgImEreHl5eXl4YiIsIEZOTV9FWFRNQVRDSCkKCQkgICAgJiYgbiAoImQqLyoxIiwgImQvcy8xIiwgRk5NX0ZJTEVfTkFNRSkKCQkgICAgJiYgeSAoIioiLCAieCIsIEZOTV9GSUxFX05BTUUgfCBGTk1fTEVBRElOR19ESVIpCgkJICAgICYmIHkgKCJ4KiIsICJ4L3kveiIsIEZOTV9GSUxFX05BTUUgfCBGTk1fTEVBRElOR19ESVIpCgkJICAgICYmIHkgKCIqYyoiLCAiYy94IiwgRk5NX0ZJTEVfTkFNRSB8IEZOTV9MRUFESU5HX0RJUildLAoJCSAgIDEpKSk7XSldLAogICAgICBbJDI9eWVzXSwKICAgICAgWyQyPW5vXSwKICAgICAgWyQyPWNyb3NzXSldKQpBU19JRihbdGVzdCAkJDIgPSB5ZXNdLCBbJDNdLCBbJDRdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsMTE1CkFTX0VSUk9SYXNfZm5fZXJyb3IgbTRfZGVmYXVsdChbJDJdLCBbJD9dKSAiX0FTX1FVT1RFKFskMV0pIm00X2lmdmFsKEFTX01FU1NBR0VfTE9HX0ZELAogIFsgIiRMSU5FTk8iIEFTX01FU1NBR0VfTE9HX0ZEXSlbXQpUOCwxODcKQVNfRVJST1JfbTRfZGVmdW5fcHJvKFskMF0pbTRfYXBwZW5kX3VuaXEoW19BU19DTEVBTlVQXSwKICBbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVC1GTl0sIFtfQVNfRVJST1JfUFJFUEFSRVtdXSldKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE4OQptNF9zcGxpdG00X2lmKFskMV0sIFtdLCBbXSwKICAgICAgIFskMl0sIFsgXSwgW200X2lmKG00X2luZGV4KFskMV0sIFsgXSksIFstMV0sIFtbWyQxXV1dLAoJCQkgW18kMChbJDFdLCBbJDJdLCBbLCBdKV0pXSwKICAgICAgIFskMl0sIFtdLCBbXyQwKFskMV0sIFtbCSBdK10sIFssIF0pXSwKICAgICAgIFtfJDAoWyQxXSwgWyQyXSwgWywgXSldKQpUMjAsMzEzNgpfQUNfUFJPR19GQ19WX09VVFBVVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW10pXSkKCiMgQ29tcGlsZSBhbmQgbGluayBvdXIgc2ltcGxlIHRlc3QgcHJvZ3JhbSBieSBwYXNzaW5nIGEgZmxhZyAoYXJndW1lbnQKIyAxIHRvIHRoaXMgbWFjcm8pIHRvIHRoZSBGb3J0cmFuIGNvbXBpbGVyIGluIG9yZGVyIHRvIGdldAojICJ2ZXJib3NlIiBvdXRwdXQgdGhhdCB3ZSBjYW4gdGhlbiBwYXJzZSBmb3IgdGhlIEZvcnRyYW4gbGlua2VyCiMgZmxhZ3MuCmFjX3NhdmVfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRbXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKX0FDX0xBTkdfUFJFRklYW11GTEFHUz0iJFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUyBtNF9kZWZhdWx0KFskMV0sIFskYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX3ZdKSIKZXZhbCAic2V0IHggJGFjX2xpbmsiCnNoaWZ0Cl9BU19FQ0hPX0xPRyhbJFsqXV0pCiMgZ2ZvcnRyYW4gNC4zIG91dHB1dHMgbGluZXMgc2V0dGluZyBDT0xMRUNUX0dDQ19PUFRJT05TLCBDT01QSUxFUl9QQVRILAojIExJQlJBUllfUEFUSDsgc2tpcCBhbGwgc3VjaCBzZXR0aW5ncy4KYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZXZhbCAkYWNfbGluayBBU19NRVNTQUdFX0xPR19GRD4mMSAyPiYxIHwKICBzZWQgJy9eRHJpdmluZzovZDsgL15Db25maWd1cmVkIHdpdGg6L2Q7CiAgICAgICciL15bW18kYXNfY3JfTGV0dGVyc11dW1tfJGFzX2NyX2FsbnVtXV0qPS9kImAKQVNfRUNITyhbIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0Il0pID4mQVNfTUVTU0FHRV9MT0dfRkQKX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kYWNfc2F2ZV9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKCnJtIC1yZiBjb25mdGVzdCoKCiMgT24gSFAvVVggdGhlcmUgaXMgYSBsaW5lIGxpa2U6ICJMUEFUSCBpczogL2ZvbzovYmFyOi9iYXoiIHdoZXJlCiMgL2ZvbywgL2JhciwgYW5kIC9iYXogYXJlIHNlYXJjaCBkaXJlY3RvcmllcyBmb3IgdGhlIEZvcnRyYW4gbGlua2VyLgojIEhlcmUsIHdlIGNoYW5nZSB0aGVzZSBpbnRvIC1ML2ZvbyAtTC9iYXIgLUwvYmF6IChhbmQgcHV0IGl0IGZpcnN0KToKYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD0iYGVjaG8gJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fdl9vdXRwdXQgfAoJZ3JlcCAnTFBBVEggaXM6JyB8CglzZWQgJ3N8LipMUEFUSCBpc1woOiAqW1teIF1dKlwpLip8XDF8O3N8OiAqL3wgLUwvfGcnYCAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCIKCiMgRklYTUU6IHdlIGtlZXAgZ2V0dGluZyBiaXR0ZW4gYnkgcXVvdGVkIGFyZ3VtZW50czsgYSBtb3JlIGdlbmVyYWwgZml4CiMgICAgICAgIHRoYXQgZGV0ZWN0cyB1bmJhbGFuY2VkIHF1b3RlcyBpbiBGTElCUyBzaG91bGQgYmUgaW1wbGVtZW50ZWQKIyAgICAgICAgYW5kICh1Z2gpIHRlc3RlZCBhdCBzb21lIHBvaW50LgpjYXNlICRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0IGluCiAgIyBXaXRoIHhsZiByZXBsYWNlIGNvbW1hcyB3aXRoIHNwYWNlcywKICAjIGFuZCByZW1vdmUgIi1saW5rIiBhbmQgY2xvc2luZyBwYXJlbnRoZXNpcy4KICAqeGxmZW50cnkqKQogICAgYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZWNobyAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCB8CiAgICAgIHNlZCAnCiAgICAgICAgcy8sLyAvZwogICAgICAgIHMvIC1saW5rIC8gL2cKICAgICAgICBzLykgKiQvLwogICAgICAnCiAgICBgIDs7CgogICMgV2l0aCBJbnRlbCBpZmMsIGlnbm9yZSB0aGUgcXVvdGVkIC1tR0xPQl9vcHRpb25zX3N0cmluZyBzdHVmZiAocXVvdGVkCiAgIyAkTElCUyBjb25mdXNlIHVzLCBhbmQgdGhlIGxpYnJhcmllcyBhcHBlYXIgbGF0ZXIgaW4gdGhlIG91dHB1dCBhbnl3YXkpLgogICptR0xPQl9vcHRpb25zX3N0cmluZyopCiAgICBhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0PWBlY2hvICRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0IHwgc2VkICdzLyItbUdMT0JbW14iXV0qIi8gL2cnYCA7OwoKICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVyIGhhcyBzaW5nbHktIG9yIGRvdWJseS1xdW90ZWQgLWNtZGxpbmUgYXJndW1lbnQKICAjIFNpbmdseS1xdW90ZWQgYXJndW1lbnRzIHdlcmUgcmVwb3J0ZWQgZm9yIHZlcnNpb25zIDUuMi00IGFuZCA2LjAtNC4KICAjIERvdWJseS1xdW90ZWQgYXJndW1lbnRzIHdlcmUgcmVwb3J0ZWQgZm9yICJQR0Y5MC94ODYgTGludXgveDg2IDUuMC0yIi4KICAqLWNtZGxpbmVcICogfCAqLWlnbm9yZVwgKiB8ICotZGVmXCAqKQogICAgYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZWNobyAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCB8IHNlZCAiXAoJcy8tY21kbGluZSAgKidbW14nXV0qJy8gL2c7IHMvLWNtZGxpbmUgICpcIltbXlwiXV0qXCIvIC9nCglzLy1pZ25vcmUgIConW1teJ11dKicvIC9nOyBzLy1pZ25vcmUgICpcIltbXlwiXV0qXCIvIC9nCglzLy1kZWYgIConW1teJ11dKicvIC9nOyBzLy1kZWYgICpcIltbXlwiXV0qXCIvIC9nImAgOzsKCiAgIyBJZiB3ZSBhcmUgdXNpbmcgZm9ydDc3ICh0aGUgZjJjIHdyYXBwZXIpIHRoZW4gZmlsdGVyIG91dHB1dCBhbmQgZGVsZXRlIHF1b3Rlcy4KICAqZm9ydDc3KmYyYypnY2MqKQogICAgYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZWNobyAiJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fdl9vdXRwdXQiIHwgc2VkIC1uICcKICAgICAgICAvOltbCSBdXVwrUnVubmluZ1tbCSBdXVx7MSxcfSJnY2MiL3sKICAgICAgICAgIC8iLWMiL2QKICAgICAgICAgIC9bWy5dXWMiKi9kCiAgICAgICAgICBzL14uKiJnY2MiLyJnY2MiLwogICAgICAgICAgcy8iLy9ncAogICAgICAgIH0nYCA7OwoKICAjIElmIHdlIGFyZSB1c2luZyBDcmF5IEZvcnRyYW4gdGhlbiBkZWxldGUgcXVvdGVzLgogICpjZnQ5MCopCiAgICBhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0PWBlY2hvICRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0IHwgc2VkICdzLyIvL2cnYCA7Owplc2FjCgpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDYsMTkwCm00X21pbm00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFt0b28gZmV3IGFyZ3VtZW50cyB0byAkMF0pXSwKICAgICAgIFskI10sIFsxXSwgW200X2V2YWwoWyQxXSldLAogICAgICAgWyQjJDFdLCBbMiQyXSwgW200X2V2YWwoWyQxXSldLAogICAgICAgWyQjXSwgWzJdLCBbXyQwKCRAKV0sCiAgICAgICBbX200X21pbm1heChbXyQwXSwgJEApXSkKVDI1LDAKbTRfaW5jbHVkZShhdXRvY29uZi9jLm00KQpGMTQsMTEKbTRfY2hhbmdlcXVvdGVjaGFuZ2VxdW90ZQpUMTcsMgpfQVNfTElURVJBTF9JRl9OTyQyClQyMSwzMTEKX0FDX0xBTkdfQ09NUElMRVJfR05VQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgX0FDX0xBTkcgY29tcGlsZXJdLAoJCVthY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2NvbXBpbGVyX2dudV0sCltfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgW1sjaWZuZGVmIF9fR05VQ19fCiAgICAgICBjaG9rZSBtZQojZW5kaWYKXV0pXSwKCQkgICBbYWNfY29tcGlsZXJfZ251PXllc10sCgkJICAgW2FjX2NvbXBpbGVyX2dudT1ub10pCmFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKXSkKVDksMjMKQU5fSEVBREVSQU5fT1VUUFVUKFtoZWFkZXJdLCAkQCkKVDI0LDEwMwpBQ19MQU5HX1BSRVBST0MoRm9ydHJhbilfbTRfZGVmdW5fcHJvKFskMF0pbTRfd2Fybihbc3ludGF4XSwKCSBbJDA6IE5vIHByZXByb2Nlc3NvciBkZWZpbmVkIGZvciBdX0FDX0xBTkcpW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywxMjUKQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKEMpQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDA7CnJldHVybiB0ZXN0X2FycmF5IEA8OkAwQDo+QDsKXSkKVDE3LDM4MgpBQ19DT05GSUdfU1VCRElSU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlBQ19SRVFVSVJFKFtBQ19ESVNBQkxFX09QVElPTl9DSEVDS0lOR10pbTRfbWFwX2FyZ3NfdyhbJDFdLCBbX0FDX0NPTkZJR19VTklRVUUoW1NVQkRJUlNdLAogIF9BQ19DT05GSUdfQ09NUFVURV9ERVNUKF0sIFspKV0pbTRfYXBwZW5kKFtfQUNfTElTVF9TVUJESVJTXSwgWyQxXSwgWwpdKUFTX0xJVEVSQUxfSUYoWyQxXSwgW10sCgkgICAgICAgW0FDX0RJQUdOT1NFKFtzeW50YXhdLCBbJDA6IHlvdSBzaG91bGQgdXNlIGxpdGVyYWxzXSldKUFDX1NVQlNUKFtzdWJkaXJzXSwgWyIkc3ViZGlycyBtNF9ub3JtYWxpemUoWyQxXSkiXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDM2Cm00X2xvY2F0aW9uKEFNX0ZVTkNfT0JTVEFDSykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjEzODUKVDIyLDMwCm00X2xvY2F0aW9uKEFDX1BBVEhfWCkuLi8uLi9saWIvYXV0b2NvbmYvbGlicy5tNDozMjMKVDM2LDMzCm00X2xvY2F0aW9uKEFDX0NPTkZJR19DT01NQU5EU19QT1NUKS4uLy4uL2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTA3MQpUMjYsMQpfbTRfZGl2ZXJ0KEhFQURFUi1DT01NRU5UKTIKVDI2LDY4OApfQUNfVFlQRV9VTlNJR05FRF9JTlRfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgdWludCRbXTJfdF0sICRbXTMsCiAgICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pCiAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCiAgICAgIyB0aGFuIGhhbGYgb2YgdGhlIGV4cGVjdGVkIHRhcmdldCB3aWR0aC4KICAgICBmb3IgYWNfdHlwZSBpbiB1aW50JFtdMl90ICd1bnNpZ25lZCBpbnQnICd1bnNpZ25lZCBsb25nIGludCcgXAoJICd1bnNpZ25lZCBsb25nIGxvbmcgaW50JyAndW5zaWduZWQgc2hvcnQgaW50JyAndW5zaWduZWQgY2hhcic7IGRvCiAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKCSBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgIFtBQ19JTkNMVURFU19ERUZBVUxUXSwKCSAgICBbKCgkYWNfdHlwZSkgLTEgPj4gKCRbXTIgLyAyIC0gMSkpID4+ICgkW10yIC8gMiAtIDEpID09IDNdKV0sCgkgW0FTX0NBU0UoWyRhY190eXBlXSwgW3VpbnQkW10yX3RdLAoJICAgIFtBU19WQVJfU0VUKFskW10zXSwgW3llc10pXSwKCSAgICBbQVNfVkFSX1NFVChbJFtdM10sIFskYWNfdHlwZV0pXSldKQogICAgICAgQVNfVkFSX0lGKFskW10zXSwgW25vXSwgW10sIFticmVha10pCiAgICAgZG9uZV0pCiAgQVNfTElORU5PX1BPUAoKVDEyLDQ1NwpfQUNfREVGSU5FX1FtNF9wdXNoZGVmKFtBQ19uYW1lXSwgbTRfZm9ybWF0KFtbWyUuKnNdXV0sIG00X2luZGV4KFskMihdLCBbKF0pLCBbJDJdKSlBQ19ERUZJTkVfVFJBQ0UoQUNfbmFtZSltNF9jb25kKFttNF9pbmRleChbJDNdLCBbCl0pXSwgWy0xXSwgW10sCglbbTRfYnJlZ2V4cChbWyQzXV0sIFtbXlxcXQpdLCBbLV0pXSwgW10sIFtdLAoJW200X3dhcm4oW3N5bnRheF0sIFtBQ19ERUZJTkVdbTRfaWYoWyQxXSwgW19BQ19ERUZJTkVdLCBbXSwKICBbW19VTlFVT1RFRF1dKVs6IGAkMycgaXMgbm90IGEgdmFsaWQgcHJlcHJvY2Vzc29yIGRlZmluZSB2YWx1ZV0pXSltNF9pZnZhbChbJDRdLCBbQUhfVEVNUExBVEUoQUNfbmFtZSwgWyQ0XSkKXSlfbTRfcG9wZGVmKFtBQ19uYW1lXSkkMShtNF9leHBhbmQoW1tAJTpAZGVmaW5lXSAkMiBdbTRfaWYoWyQjXSwgMiwgMSwKICBbJDNdLCBbXSwgWy8qKi9dLCBbWyQzXV0pKSkKClQxMSwxNjAKQUNfVU5JU1REX0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVU5JU1REX0gnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw1MzkKQUNfQ0hFQ0tfREVDTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19kZWNsXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2RlY2xdLAogICAgW0xJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTXSwKICAgIFtUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZQogICAgIFZBUiBhY2NvcmRpbmdseS5dKV0sCiAgW18kMF9CT0RZXSlBU19WQVJfUFVTSERFRihbYWNfU3ltYm9sXSwgW2FjX2N2X2hhdmVfZGVjbF8kMV0pYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV9jaGVja19kZWNsICIkTElORU5PIiAiJDEiICJhY19TeW1ib2wiICJBU19FU0NBUEUoW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQ0XSldLCBbIiJdKSIKQVNfVkFSX0lGKFthY19TeW1ib2xdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfU3ltYm9sXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw1NAptNF9pZmJsYW5rbTRfaWYobTRfdHJhbnNsaXQoW1skMV1dLCAgWyBdWwldWwpdKSwgW10sIFskMl0sIFskM10pClQxNCwxNjYKbTRfY2xlYXJkaXZlcnRtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbX200X2RpdmVydF9yYXcoWy0xXSltNF91bmRpdmVydCgkQClfbTRfZGl2ZXJ0X3JhdygKCSBfbTRfZGl2ZXJ0KF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pLCBbLV0pKV0pClQxOCwyMDYKX200X3RleHRfd3JhcF93b3JkbTRfZGVmaW5lKFttNF9DdXJzb3JdLCBtNF9ldmFsKG00X0N1cnNvciArIG00X3FsZW4oWyQxXSkgKyAxKSltNF9pZihtNF9ldmFsKG00X0N1cnNvciA+IChbJDNdKSksCiAgICAgIFsxXSwgW200X2RlZmluZShbbTRfQ3Vyc29yXSwgbTRfZXZhbChtNF9JbmRlbnQgKyBtNF9xbGVuKFskMV0pICsgMSkpClskMl1dLAogICAgICBbbTRfU2VwYXJhdG9yW11dKVskMV0KVDEzLDE3OQpBQ19QQVRIX1BST0dTX200X2RlZnVuX3BybyhbJDBdKWZvciBhY19wcm9nIGluICQyCmRvCiAgQUNfUEFUSF9QUk9HKFskMV0sIFskYWNfcHJvZ10sICwgWyQ0XSkKICB0ZXN0IC1uICIkJDEiICYmIGJyZWFrCmRvbmUKbTRfaWZ2YWxuKFskM10sIFt0ZXN0IC1uICIkJDEiIHx8ICQxPSIkMyJdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDE2MDEKX0FTX1NIRUxMX1NBTklUSVpFX200X2RlZnVuX3BybyhbJDBdKW00X3B1c2hkZWYoW0FTX0VYSVRdLCBbZXhpdCBtNF9kZWZhdWx0KF1tNF9kcXVvdGUoWyRdWzFdKVssIDEpXSltNF90ZXh0X2JveChbTTRzaCBJbml0aWFsaXphdGlvbi5dKQoKQVNfQk9VUk5FX0NPTVBBVElCTEUKX0FTX0VDSE9fUFJFUEFSRQpfQVNfUEFUSF9TRVBBUkFUT1JfUFJFUEFSRQoKIyBJRlMKIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCiMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAojIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCklGUz0iICIiCSRhc19ubCIKCiMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCmFzX215c2VsZj0KY2FzZSAkWzBdIGluIEAlOkAoKAogICpbW1xcL11dKiApIGFzX215c2VsZj0kWzBdIDs7CiAgKikgX0FTX1BBVEhfV0FMSyhbXSwKCQkgICBbdGVzdCAtciAiJGFzX2Rpci8kWzBdIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kWzBdICYmIGJyZWFrXSkKICAgICA7Owplc2FjCiMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCmlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KICBhc19teXNlbGY9JFswXQpmaQppZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCiAgQVNfRUNITyhbIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIl0pID4mMgogIEFTX0VYSVQKZmkKCiMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgojIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCiMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCmZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKZG9uZQpQUzE9JyQgJwpQUzI9Jz4gJwpQUzQ9JysgJwoKIyBOTFMgbnVpc2FuY2VzLgpMQ19BTEw9QwpleHBvcnQgTENfQUxMCkxBTkdVQUdFPUMKZXhwb3J0IExBTkdVQUdFCgojIENEUEFUSC4KKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSApfbTRfcG9wZGVmKFtBU19FWElUXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDEyNApBQ19SVU5fTE9HX200X2RlZnVuX3BybyhbJDBdKV9BQ19SVU5fTE9HKFskMV0sCgkgICAgIFtBU19FQ0hPKFsiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBBU19FU0NBUEUoWyQxXSkiXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMjIyNQpBQ19GQ19MSU5FX0xFTkdUSF9tNF9kZWZ1bl9vbmNlKFtBQ19GQ19MSU5FX0xFTkdUSF0sIFtBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKWRubAptNF9jYXNlKG00X2RlZmF1bHQoWyQxXSwgWzEzMl0pLAogIFt1bmxpbWl0ZWRdLCBbYWNfZmNfbGluZV9sZW5fc3RyaW5nPXVubGltaXRlZAoJICAgICAgICAgICAgICAgYWNfZmNfbGluZV9sZW49MAogICAgICAgICAgICAgICAgICAgICAgIGFjX2ZjX2xpbmVfbGVuZ3RoX3Rlc3Q9JwogICAgICBzdWJyb3V0aW5lIGxvbmdlcl90aGFuXzEzMihhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgsJ1wKJ2FyZzksYXJnMTAsYXJnMTEsYXJnMTIsYXJnMTMsYXJnMTQsYXJnMTUsYXJnMTYsYXJnMTcsYXJnMTgsYXJnMTkpJ10sCiAgWzEzMl0sICAgICAgICAgICAgW2FjX2ZjX2xpbmVfbGVuPTEzMgoJCSAgICAgICBhY19mY19saW5lX2xlbmd0aF90ZXN0PScKICAgICAgc3Vicm91dGluZSBsb25nZXJfdGhhbl84MChhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgsYXJnOSwnXAonYXJnMTApJ10sCiAgWzgwXSwgICAgICAgICAgICAgW2FjX2ZjX2xpbmVfbGVuPTgwCgkJICAgICAgIGFjX2ZjX2xpbmVfbGVuZ3RoX3Rlc3Q9JwogICAgICBzdWJyb3V0aW5lIGxvbmdlcl90aGFuXzcyKGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCxhcmc5KSddLAogIFttNF93YXJuaW5nKFtJbnZhbGlkIGxlbmd0aCBhcmd1bWVudCBgJDEnXSldKQo6ICR7YWNfZmNfbGluZV9sZW5fc3RyaW5nPSRhY19mY19saW5lX2xlbn0KQUNfQ0FDSEVfQ0hFQ0soCltmb3IgRm9ydHJhbiBmbGFnIG5lZWRlZCB0byBhY2NlcHQgJGFjX2ZjX2xpbmVfbGVuX3N0cmluZyBjb2x1bW4gc291cmNlIGxpbmVzXSwKCSAgICAgICBbYWNfY3ZfZmNfbGluZV9sZW5ndGhdLApbYWNfY3ZfZmNfbGluZV9sZW5ndGg9dW5rbm93bgphY19mY19saW5lX2xlbmd0aF9GQ0ZMQUdTX3NhdmU9JEZDRkxBR1MKZm9yIGFjX2ZsYWcgaW4gbm9uZSBcCgkgICAgICAgLWZmcmVlLWxpbmUtbGVuZ3RoLW5vbmUgLWZmaXhlZC1saW5lLWxlbmd0aC1ub25lIFwKCSAgICAgICAtZmZyZWUtbGluZS1sZW5ndGgtaHVnZSBcCgkgICAgICAgLWZmcmVlLWxpbmUtbGVuZ3RoLSRhY19mY19saW5lX2xlbiBcCgkgICAgICAgLWZmaXhlZC1saW5lLWxlbmd0aC0kYWNfZmNfbGluZV9sZW4gXAoJICAgICAgIC1xZml4ZWQ9JGFjX2ZjX2xpbmVfbGVuIC1NZXh0ZW5kIFwKCSAgICAgICAtJGFjX2ZjX2xpbmVfbGVuIC1leHRlbmRfc291cmNlIFwKCSAgICAgICAtVyRhY19mY19saW5lX2xlbiAtVyArZXh0ZW5kX3NvdXJjZSArZXMgLXdpZGUgLS13aWRlIC13IC1lIFwKICAgICAgICAgICAgICAgLWYgLVdmLC1mIC14bGluZQpkbwogIHRlc3QgIngkYWNfZmxhZyIgIT0geG5vbmUgJiYgRkNGTEFHUz0iJGFjX2ZjX2xpbmVfbGVuZ3RoX0ZDRkxBR1Nfc2F2ZSAkYWNfZmxhZyIKICBBQ19DT01QSUxFX0lGRUxTRShbWyRhY19mY19saW5lX2xlbmd0aF90ZXN0CiAgICAgIGVuZCBzdWJyb3V0aW5lXV0sCgkJICAgIFthY19jdl9mY19saW5lX2xlbmd0aD0kYWNfZmxhZzsgYnJlYWtdKQpkb25lCnJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKRkNGTEFHUz0kYWNfZmNfbGluZV9sZW5ndGhfRkNGTEFHU19zYXZlCl0pCmlmIHRlc3QgIngkYWNfY3ZfZmNfbGluZV9sZW5ndGgiID0geHVua25vd247IHRoZW4KICBtNF9kZWZhdWx0KFskM10sCgkgICAgIFtBQ19NU0dfRVJST1IoW0ZvcnRyYW4gZG9lcyBub3QgYWNjZXB0IGxvbmcgc291cmNlIGxpbmVzXSwgNzcpXSkKZWxzZQogIGlmIHRlc3QgIngkYWNfY3ZfZmNfbGluZV9sZW5ndGgiICE9IHhub25lOyB0aGVuCiAgICBGQ0ZMQUdTPSIkRkNGTEFHUyAkYWNfY3ZfZmNfbGluZV9sZW5ndGgiCiAgZmkKICAkMgpmaQpBQ19MQU5HX1BPUChbRm9ydHJhbl0pZG5sCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19GQ19MSU5FX0xFTkdUSF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0ZDX0xJTkVfTEVOR1RIXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0ZDX0xJTkVfTEVOR1RIXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfRkNfTElORV9MRU5HVEhdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQ3LDQ4Cm00X3FsZW5tNF9pZmRlZihbJDAtJDFdLCBbX200X2RlZm4oWyQwLV1dLCBbXyQwKF0pWyQxXSkKVDYsMTkwCm00X21heG00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFt0b28gZmV3IGFyZ3VtZW50cyB0byAkMF0pXSwKICAgICAgIFskI10sIFsxXSwgW200X2V2YWwoWyQxXSldLAogICAgICAgWyQjJDFdLCBbMiQyXSwgW200X2V2YWwoWyQxXSldLAogICAgICAgWyQjXSwgWzJdLCBbXyQwKCRAKV0sCiAgICAgICBbX200X21pbm1heChbXyQwXSwgJEApXSkKVDM0LDMzCm00X2xvY2F0aW9uKEFDX1RJTUVfV0lUSF9TWVNfVElNRSkuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6ODEKRjExLDgKbTRfZXJycHJpbnRlcnJwcmludApGOCw4CmVycnByaW50ZXJycHJpbnQKRjQsNApkZWNyZGVjcgpUMTEsNDcxCl9BQ19GQ19GVU5DX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCmNhc2UgJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcgaW4KICB1cHBlciopIGFjX3ZhbD0ibTRfdG91cHBlcihbJDFdKSIgOzsKICBsb3dlciopIGFjX3ZhbD0ibTRfdG9sb3dlcihbJDFdKSIgOzsKICAqKSAgICAgIGFjX3ZhbD0idW5rbm93biIgOzsKZXNhYwpjYXNlICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nIGluICosIiB1bmRlcnNjb3JlIiopIGFjX3ZhbD0iJGFjX3ZhbCJfIDs7IGVzYWMKbTRfaWYobTRfaW5kZXgoWyQxXSxbX10pLC0xLFtdLApbY2FzZSAkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZyBpbiAqLCIgZXh0cmEgdW5kZXJzY29yZSIqKSBhY192YWw9IiRhY192YWwiXyA7OyBlc2FjCl0pCm00X2RlZmF1bHQoWyQyXSxbJDFdKT0iJGFjX3ZhbCIKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSw0MjIKQUNfRVJMQU5HX1NVQlNUX0lOU1RBTExfTElCX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBFcmxhbmcvT1RQIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGJhc2UgZGlyZWN0b3J5XSkKQUNfQVJHX1ZBUihbRVJMQU5HX0lOU1RBTExfTElCX0RJUl0sCiAgICBbRXJsYW5nL09UUCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBiYXNlIGRpcmVjdG9yeSBbTElCRElSL2VybGFuZy9saWJdXSkKaWYgdGVzdCAtbiAiJEVSTEFOR19JTlNUQUxMX0xJQl9ESVIiOyB0aGVuCiAgICBBQ19NU0dfUkVTVUxUKFskRVJMQU5HX0lOU1RBTExfTElCX0RJUl0pCmVsc2UKICAgIEFDX1NVQlNUKFtFUkxBTkdfSU5TVEFMTF9MSUJfRElSXSwgWycke2xpYmRpcn0vZXJsYW5nL2xpYiddKQogICAgQUNfTVNHX1JFU1VMVChbJGxpYmRpci9lcmxhbmcvbGliXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxMzcKX200X2RpdmVydG00X2lmZGVmKFtfbTRfZGl2ZXJ0KCQxKV0sCgkgIFttNF9pbmRpcihbX200X2RpdmVydCgkMSldKV0sCgkgIFttNF9pZihbJDJdLCBbXSwgW200X3dhcm4oW3N5bnRheF0sCgkgICAgIFtwcmVmZXIgbmFtZWQgZGl2ZXJzaW9uc10pXSkkMV0pClQxNCwxOTMKQUNfTE9OR19ET1VCTEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTE9OR19ET1VCTEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ19MT05HX0RPVUJMRV0sIFtBQ19DX0xPTkdfRE9VQkxFKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSw3NgpBQ19MQU5HX0NPTkZURVNUKEMpY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAovKiBlbmQgY29uZmRlZnMuaC4gICovCiQxCl9BQ0VPRgpUMTAsMTgxMwpBQ19DX0NPTlNUX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3RdLCBhY19jdl9jX2NvbnN0LApbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwKW1sKI2lmbmRlZiBfX2NwbHVzcGx1cwogIC8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLiAgKi8KICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOwogIGNvbnN0IGNoYXJzZXQgY3MgPSB7IDAsIDAgfTsKICAvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwogIGNoYXIgY29uc3QgKmNvbnN0ICpwY3BjYzsKICBjaGFyICoqcHBjOwogIC8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCiAgc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9OwogIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwogIC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KICAgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbgogICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKICAgICBleHByZXNzaW9uICovCiAgY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwogIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOwogIC8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCiAgKytwY3BjYzsKICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKICBwY3BjYyA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwcGM7CiAgeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzIHNvcnQgb2YgdGhpbmcuICAqLwogICAgY2hhciB0eDsKICAgIGNoYXIgKnQgPSAmdHg7CiAgICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwoKICAgICp0KysgPSAwOwogICAgaWYgKHMpIHJldHVybiAwOwogIH0KICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwogICAgaW50IHhbXSA9IHsyNSwgMTd9OwogICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKICAgICsrZm9vOwogIH0KICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KICAgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwogICAgaXB0ciBwID0gMDsKICAgICsrcDsKICB9CiAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZywgc2F5aW5nCiAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCiAgICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9IGJ4OwogICAgc3RydWN0IHMgKmIgPSAmYng7IGItPmogPSA1OwogIH0KICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwogICAgY29uc3QgaW50IGZvbyA9IDEwOwogICAgaWYgKCFmb28pIHJldHVybiAwOwogIH0KICByZXR1cm4gIWNzWzBdICYmICF6ZXJvLng7CiNlbmRpZgpdXSldLAoJCSAgIFthY19jdl9jX2NvbnN0PXllc10sCgkJICAgW2FjX2N2X2NfY29uc3Q9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgogIEFDX0RFRklORShjb25zdCwsCgkgICAgW0RlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMjYKbTRfY3JfTEVUVEVSU0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaClQxOSwxMTgKQUNfRkNfSU1QTElDSVRfTk9ORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKWRubApfQUNfRkNfSU1QTElDSVRfTk9ORSgkQCkKQUNfTEFOR19QT1AoW0ZvcnRyYW5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDMzCm00X2xvY2F0aW9uKEFDX1BSRVJFUSkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDozMDUKVDI4LDM1Cm00X2xvY2F0aW9uKEFDX0ZVTkNfRk5NQVRDSCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU0NgpUMTAsMTc3CkFNX01JTkdXMzJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fTUlOR1czMicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19NSU5HVzMyXSwgW0FDX01JTkdXMzIoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDM1Cm00X2xvY2F0aW9uKEFDX0ZVTkNfR0VUTE9BREFWRykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjcxNQpUMTEsMTUwCkFDX1NDT19JTlRMX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NDT19JTlRMJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19GVU5DX1NUUkZUSU1FW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywzMwptNF9sb2NhdGlvbihhY19jdl9wcm9nX2c3NykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoyNjgKVDIzLDM2Cm00X2xvY2F0aW9uKEFDX1ZQUklOVEYpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxOTY2ClQyMSwzNgptNF9sb2NhdGlvbihBQ19WRk9SSykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE5NDgKVDIxLDMzCm00X2xvY2F0aW9uKEFDX1BJRF9UKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2OQpUMTUsMjcyCl9BU19ESVJOQU1FX1NFRF9tNF9kZWZ1bl9wcm8oWyQwXSlBU19FQ0hPKFtYW10kMV0pIHwKICAgIHNlZCBbJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewoJICAgIHMvL1wxLwoJICAgIHEKCSAgfQoJICAvXlhcKFwvXC9cKVteL10uKi97CgkgICAgcy8vXDEvCgkgICAgcQoJICB9CgkgIC9eWFwoXC9cL1wpJC97CgkgICAgcy8vXDEvCgkgICAgcQoJICB9CgkgIC9eWFwoXC9cKS4qL3sKCSAgICBzLy9cMS8KCSAgICBxCgkgIH0KCSAgcy8uKi8uLzsgcSddW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwzMwptNF9sb2NhdGlvbihBQ19TVF9CTE9DS1MpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc3ClQzMywzMwptNF9sb2NhdGlvbihBQ19IRUFERVJfVElPQ0dXSU5TWikuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo4MTkKVDE3LDk0Cl9tNF9zdGFja19yZXZlcnNlbTRfaWZkZWYoWyQxXSwgW200X3B1c2hkZWYoWyQyXSwKICBfbTRfZGVmbihbJDFdKSkkM1tdX200X3BvcGRlZihbJDFdKSQwKFskMV0sIFskMl0sIFskNCQzXSldKQpUMTYsMTAzCkFTX0lERU5USUZJRVJfSUZtNF9pZihfJDAobTRfaWYobTRfaW5kZXgoWyQxXSwgW0BdKSwgWy0xXSwKICBbWyQxXV0sIFttNF9icGF0c3Vic3QoW1skMV1dLCBbQCZ0QF0pXSkpLCBbLV0sIFskMl0sIFskM10pCkYxMSw3Cm00X21ha2V0ZW1wbWtzdGVtcApUMzAsMzQKbTRfbG9jYXRpb24oX0FDX1JVTl9MT0dfTElNSVQpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjMzMgpUMzAsMzMKbTRfbG9jYXRpb24oQUNfRjc3X0RVTU1ZX01BSU4pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6ODMzClQxNywxMjkKX0FTX0RFVEVDVF9FWFBBTkQkMT0ibTRfYnBhdHN1YnN0KG00X2RxdW90ZShBU19FU0NBUEUoX200X2V4cGFuZChtNF9zZXRfY29udGVudHMoWyQyXSwgWwpdKSkpKSwgW1xcXCRMSU5FTk9cKC4qXCkkXSwgWyI7JDE9JCQxJExJTkVOTzskMT0kJDEiXDFdKSIKVDE1LDE5MgpBTV9GVU5DX0ZOTUFUQ0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fRlVOQ19GTk1BVENIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfRk5NQVRDSF0sIFtBQ19GVU5DX0ZOTUFUQ0goJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM3LDMwCm00X2xvY2F0aW9uKEFDX0xBTkdfQ09NUElMRVJfUkVRVUlSRSkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDozMjkKVDI3LDMzCm00X2xvY2F0aW9uKEFDX0hFQURFUl9TVERDKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjY3NwpUNiwzNwpfQUNfQ0NfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApClQxNiw2NQpBQ19UWVBFX1VJTlQ2NF9UX200X2RlZnVuX3BybyhbJDBdKV9BQ19UWVBFX1VOU0lHTkVEX0lOVCg2NClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDM4CkFDX0xBTkdfQ0FMTChGb3J0cmFuKUFDX0xBTkdfUFJPR1JBTShbJDFdLApbICAgICAgY2FsbCAkMl0pClQxMiwxMzUKQUNfQVJHX0FSUkFZX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0FSR19BUlJBWScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ0LDM3Cm00X25tNF9pZihbJDFdLAogICAgICAgW10sIFtdLAoJICAgWyQxCl0pClQyNiwyOQptNF9sb2NhdGlvbihBU19MSU5FTk9fUE9QKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6OTA0ClQyNywyNwptNF9sb2NhdGlvbihBQ19QUk9HX09CSkNQUCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo4MjIKVDgsMjIKQVNfVFJfU0hfJDAobTRfZXhwYW5kKFskMV0pKVtdClQ4LDEyNApBU19UUl9TSF9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfJDBfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDE1NAptNF9wcm92aWRlbTRfaWZkZWYoW200X3Byb3ZpZGUoJDEpXSwgW10sClttNF9zZXRfYWRkKFtfbTRfcHJvdmlkZV0sIFskMV0sIFttNF9kZWZpbmUoW200X3Byb3ZpZGUoJDEpXSwKICBtNF9pZmRlZihbX200X2RpdmVydGluZ10sIFtfbTRfZGVmbihbX200X2RpdmVydGluZ10pXSkpXSldKQpUMjYsMjgKbTRfbG9jYXRpb24oQUNfQ19WT0xBVElMRSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxNzg3ClQxOCwyMDkKQUNfTE9OR19GSUxFX05BTUVTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xPTkdfRklMRV9OQU1FUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19TWVNfTE9OR19GSUxFX05BTUVTXSwgW0FDX1NZU19MT05HX0ZJTEVfTkFNRVMoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDY5CkFDX0RFRklORV9UUkFDRUFTX0xJVEVSQUxfV09SRF9JRihbJDFdLCBbQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoX200X2V4cGFuZChbJDFdKSldKQpUMTEsMTc2CkFDX0NZR1dJTjMyX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NZR1dJTjMyJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NZR1dJTl0sIFtBQ19DWUdXSU4oJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDMwCm00X2xvY2F0aW9uKEFDX0hBVkVfTElCUkFSWSkuLi8uLi9saWIvYXV0b2NvbmYvbGlicy5tNDoxMzcKVDEzLDEwMApBU19MSU5FTk9fUE9QX200X2RlZnVuX3BybyhbJDBdKWV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVub1tdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsNjUKbTRfc2V0X3NpemVtNF9pZmRlZihbX200X3NldF9zaXplKCQxKV0sIFttNF9pbmRpcihbX200X3NldF9zaXplKCQxKV0pXSwgWzBdKQpUOSwwCm00X2lnbm9yZQpUMjgsMzMKbTRfbG9jYXRpb24oQUNfU1REQ19IRUFERVJTKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo3NQpUMjksMzUKbTRfbG9jYXRpb24oQUNfVFJZX0xJTktfRlVOQykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE0OQpUMjAsMTg0Cl9BQ19GQ19OQU1FX01BTkdMSU5HX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0ZDX0xJQlJBUllfTERGTEFHU10pZG5sCkFDX1JFUVVJUkUoW0FDX0ZDX0RVTU1ZX01BSU5dKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX19BQ19GQ19OQU1FX01BTkdMSU5HCkFDX0xBTkdfUE9QKEZvcnRyYW4pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsNTAKX0FDX0FSR19WQVJfUFJFQ0lPVVNtNF9hcHBlbmRfdW5pcShbX0FDX1BSRUNJT1VTX1ZBUlNdLCBbJDFdLCBbCl0pZG5sCgpUMTMsNzIKQUNfU1VCU1RfRklMRW00X3BhdHRlcm5fYWxsb3coW14kMSRdKWRubAptNF9hcHBlbmRfdW5pcShbX0FDX1NVQlNUX0ZJTEVTXSwgWyQxXSwgWwpdKQpUMTUsNjgKQUNfQ09ORklHX0ZJTEVTX200X2RlZnVuX3BybyhbJDBdKV9BQ19DT05GSUdfRk9PUyhbRklMRVNdLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDE4MApBTV9DWUdXSU4zMl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9DWUdXSU4zMicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DWUdXSU4zMl0sIFtBQ19DWUdXSU4zMigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNTgzCkFDX1BST0dfQ0NfU1REQ19tNF9kZWZ1bl9wcm8oWyQwXSkgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCiAgQVNfQ0FTRShbJGFjX2N2X3Byb2dfY2Nfc3RkY10sCiAgICBbbm9dLCBbYWNfY3ZfcHJvZ19jY19jOTk9bm87IGFjX2N2X3Byb2dfY2NfYzg5PW5vXSwKCSAgW19BQ19QUk9HX0NDX0M5OShbYWNfY3ZfcHJvZ19jY19zdGRjPSRhY19jdl9wcm9nX2NjX2M5OV0sCgkgICAgIFtfQUNfUFJPR19DQ19DODkoW2FjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfY3ZfcHJvZ19jY19jODldLAoJCQkgICAgICBbYWNfY3ZfcHJvZ19jY19zdGRjPW5vXSldKV0pCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIFN0YW5kYXJkIENdKQogIEFDX0NBQ0hFX1ZBTChbYWNfY3ZfcHJvZ19jY19zdGRjXSwgW10pCiAgQVNfQ0FTRShbJGFjX2N2X3Byb2dfY2Nfc3RkY10sCiAgICBbbm9dLCBbQUNfTVNHX1JFU1VMVChbdW5zdXBwb3J0ZWRdKV0sCiAgICBbJyddLCBbQUNfTVNHX1JFU1VMVChbbm9uZSBuZWVkZWRdKV0sCgkgIFtBQ19NU0dfUkVTVUxUKFskYWNfY3ZfcHJvZ19jY19zdGRjXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDg0MgpBQ19GVU5DX0NIT1dOX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1RZUEVfVUlEX1RdKWRubApBQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQpBQ19DQUNIRV9DSEVDSyhbZm9yIHdvcmtpbmcgY2hvd25dLCBhY19jdl9mdW5jX2Nob3duX3dvcmtzLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUCiNpbmNsdWRlIDxmY250bC5oPgpdLApbWyAgY2hhciAqZiA9ICJjb25mdGVzdC5jaG93biI7CiAgc3RydWN0IHN0YXQgYmVmb3JlLCBhZnRlcjsKCiAgaWYgKGNyZWF0IChmLCAwNjAwKSA8IDApCiAgICByZXR1cm4gMTsKICBpZiAoc3RhdCAoZiwgJmJlZm9yZSkgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKGNob3duIChmLCAodWlkX3QpIC0xLCAoZ2lkX3QpIC0xKSA9PSAtMSkKICAgIHJldHVybiAxOwogIGlmIChzdGF0IChmLCAmYWZ0ZXIpIDwgMCkKICAgIHJldHVybiAxOwogIHJldHVybiAhIChiZWZvcmUuc3RfdWlkID09IGFmdGVyLnN0X3VpZCAmJiBiZWZvcmUuc3RfZ2lkID09IGFmdGVyLnN0X2dpZCk7Cl1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfY2hvd25fd29ya3M9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY19jaG93bl93b3Jrcz1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfY2hvd25fd29ya3M9bm9dKQpybSAtZiBjb25mdGVzdC5jaG93bgpdKQppZiB0ZXN0ICRhY19jdl9mdW5jX2Nob3duX3dvcmtzID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfQ0hPV04sIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgc3lzdGVtIGhhcyBhIHdvcmtpbmcgYGNob3duJyBmdW5jdGlvbi5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDM0Cm00X2xvY2F0aW9uKEFDX0NBTk9OSUNBTF9IT1NUKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE4MTUKVDksMjgKX200X3F1b3RlbTRfaWYoWyQjXSwgWzBdLCBbXSwgW1skKl1dKQpUOSwwCkFVX0RFRklORQpUMjgsMzQKbTRfbG9jYXRpb24oQUNfRUdSRVBfSEVBREVSKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI1NTYKVDgsMTc5CkFDX0VSUk9SX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0VSUk9SJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX01TR19FUlJPUl0sIFtBQ19NU0dfRVJST1IoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX1RSWV9DT01NQU5EKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI0NjEKVDksMTg0CkFDX1NJWkVfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TSVpFX1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9TSVpFX1RdLCBbQUNfVFlQRV9TSVpFX1QoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDIxNApBQ19TRVRWQlVGX1JFVkVSU0VEX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NFVFZCVUZfUkVWRVJTRUQnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19TRVRWQlVGX1JFVkVSU0VEXSwgW0FDX0ZVTkNfU0VUVkJVRl9SRVZFUlNFRCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjksNjA5CkFDX0xBTkdfSU5UX1NBVkUoT2JqZWN0aXZlIEMpQUNfTEFOR19QUk9HUkFNKFskMQpzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQpzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KQCU6QGluY2x1ZGUgPHN0ZGlvLmg+CkAlOkBpbmNsdWRlIDxzdGRsaWIuaD5dLApbCiAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKICBpZiAoISBmKQogICAgcmV0dXJuIDE7CiAgaWYgKCgkMikgPCAwKQogICAgewogICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKICAgICAgaWYgKGkgIT0gKCQyKSkKCXJldHVybiAxOwogICAgICBmcHJpbnRmIChmLCAiJWxkIiwgaSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CiAgICAgIGlmIChpICE9ICgkMikpCglyZXR1cm4gMTsKICAgICAgZnByaW50ZiAoZiwgIiVsdSIsIGkpOwogICAgfQogIC8qIERvIG5vdCBvdXRwdXQgYSB0cmFpbGluZyBuZXdsaW5lLCBhcyB0aGlzIGNhdXNlcyBcclxuIGNvbmZ1c2lvbgogICAgIG9uIHNvbWUgcGxhdGZvcm1zLiAgKi8KICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Cl0pClQyMSwzMAptNF9sb2NhdGlvbihBU19UUl9TSCkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjE4MjYKVDI3LDI3Cm00X2xvY2F0aW9uKEFDX1BST0dfQ1hYQ1BQKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjYzNgpUMzIsMzIKbTRfbG9jYXRpb24oQUNfRVJMQU5HX0NIRUNLX0xJQikuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjE3NQpUMTksMTUzCl9BQ19DT05GSUdfUkVHSVNURVJtNF9pZihbJDFdLCBbQ09NTUFORFNdLAogICAgICAgW10sCiAgICAgICBbX0FDX0NPTkZJR19ERVBFTkRFTkNZKFskMV0sIFskMl0pXSlfQUNfQ09ORklHX1JFR0lTVEVSX0RFU1QoWyQxXSwgWyQyXSwKICBfQUNfQ09ORklHX0NPTVBVVEVfREVTVChbJDJdKSwgWyQzXSkKVDIxLDI0NgpfQUNfQ0hFQ0tfSEVBREVSX09OQ0VfQUhfQ0hFQ0tfSEVBREVSKFskMV0pQUNfREVGVU4oW19BQ19IZWFkZXJfXW00X3RyYW5zbGl0KFtbJDFdXSwKICAgIFsuLy1dLCBbX19fXSksCiAgW200X2RpdmVydF90ZXh0KFtJTklUX1BSRVBBUkVdLCBbQVNfVkFSX0FQUEVORChbYWNfaGVhZGVyX2xpc3RdLCBbIiAkMSJdKV0pCl9BQ19IRUFERVJTX0VYUEFOU0lPTl0pQUNfUkVRVUlSRShbX0FDX0hlYWRlcl9dbTRfdHJhbnNsaXQoW1skMV1dLAogICAgWy4vLV0sIFtfX19dKSkKVDgsMTgxCkFDX1dBSVQzX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1dBSVQzJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfV0FJVDNdLCBbQUNfRlVOQ19XQUlUMygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMjUyCkFDX0xBTkcoQylhY19leHQ9YwphY19jcHA9JyRDUFAgJENQUEZMQUdTJwphY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiZBU19NRVNTQUdFX0xPR19GRCcKYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoKVDEwLDE0MApBQ19GQ19NQUlOX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0ZDX0xJQlJBUllfTERGTEFHU10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuKWRubApfQUNfRkNfTUFJTgpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM0LDMwCm00X2xvY2F0aW9uKF9BQ19MQU5HX05VTExfUFJPR1JBTSkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoyNTYKVDI0LDMzCm00X2xvY2F0aW9uKEFDX0NZR1dJTjMyKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo4NgpUOSwzNQptNF9zaGlmdG5tNF9hc3NlcnQoMCA8ICQxICYmICQxIDwgJCMpXyQwKCRAKQpUMjQsMjcKbTRfbG9jYXRpb24oQUNfUFJPR19DUFApLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6Mzg4ClQyMywyNwptNF9sb2NhdGlvbihBQ19QUk9HX0NDKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjQ0OApUNyw3NQptNF93YXJuX200X3dhcm4oWyQxXSwgWyQyXSwKbTRfaWZkZWYoW19tNF9leHBhbnNpb25fc3RhY2tdLCBbbTRfZXhwYW5zaW9uX3N0YWNrXSkpClQxNywxNTMKX0FDX1JFUExBQ0VfRlVOQ1NBU19MSVRFUkFMX0lGKFskMV0sClttNF9tYXBfYXJnc193KFskMV0sIFtfQUNfUkVQTEFDRV9GVU5DKF0sIFspCl0pXSwKW0FDX0NIRUNLX0ZVTkNTKFskMV0sCiAgW19BSF9DSEVDS19GVU5DKFskYWNfZnVuY10pXSwKICBbX0FDX0xJQk9CSihbJGFjX2Z1bmNdKV0pXSkKVDE5LDU5NwpfQUNfQ09NUElMRVJfT0JKRVhUQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzXSwgYWNfY3Zfb2JqZXh0LApbQUNfTEFOR19DT05GVEVTVChbX0FDX0xBTkdfTlVMTF9QUk9HUkFNXSkKcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKQVNfSUYoW19BQ19ET19WQVIoYWNfY29tcGlsZSldLApbZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7CiAgY2FzZSAkYWNfZmlsZSBpbgogICAgX0FDX0NPTVBJTEVSX09CSkVYVF9SRUpFQ1QgKSA7OwogICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCiAgICAgICBicmVhazs7CiAgZXNhYwpkb25lXSwKICAgICAgW19BQ19NU0dfTE9HX0NPTkZURVNUCkFDX01TR19GQUlMVVJFKFtjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZV0pXSkKcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0XSkKQUNfU1VCU1QoW09CSkVYVF0sIFskYWNfY3Zfb2JqZXh0XSlkbmwKYWNfb2JqZXh0PSRPQkpFWFQKClQxNCw0Cl9BQ19DQyhFcmxhbmcpRVJMQwpUMTMsNDM5CkFDX0NIRUNLX0ZVTkNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRV9TSEVMTF9GTihbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfY2hlY2tfZnVuY10sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19mdW5jXSwKICAgIFtMSU5FTk8gRlVOQyBWQVJdLAogICAgW1Rlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseV0pXSwKICBbXyQwX0JPRFldKUFTX1ZBUl9QVVNIREVGKFthY192YXJdLCBbYWNfY3ZfZnVuY18kMV0pYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV9jaGVja19mdW5jICIkTElORU5PIiAiJDEiICJhY192YXIiCkFTX1ZBUl9JRihbYWNfdmFyXSwgW3llc10sIFskMl0sIFskM10pCkFTX1ZBUl9QT1BERUYoW2FjX3Zhcl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxODAKX0FDX0xJTktFUl9PUFRJT05fbTRfZGVmdW5fcHJvKFskMF0paWYgdGVzdCAiJGFjX2NvbXBpbGVyX2dudSIgPSB5ZXM7IHRoZW4KICBmb3IgYWNfbGlua19vcHQgaW4gJDE7IGRvCiAgICAkMj0iWyRdJDIgLVhsaW5rZXIgJGFjX2xpbmtfb3B0IgogIGRvbmUKZWxzZQogICQyPSJbJF0kMiAkMSIKZmlbXWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDExMApBQ19DSEVDS19NRU1CRVJTX200X2RlZnVuX3BybyhbJDBdKW00X21hcF9hcmdzX3NlcChbQUNfQ0hFQ0tfTUVNQkVSKF8kMChdLCBbKVsKJDJdLCBbJDNdLCBbJDRdKV0sIFtdLCAkMSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfTUJTVEFURV9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo1NjcKVDMxLDMzCm00X2xvY2F0aW9uKEFDX09VVFBVVF9DT01NQU5EUykuLi8uLi9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjEwMjYKVDE2LDI0NQptNF9jcl9ub3RfZGlnaXRzAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/y0KVDI1LDY0CkFDX0xBTkdfQ09NUElMRVIoRm9ydHJhbilfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19GQ10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCwyMjcKQUNfRlVOQ19TRVRWQlVGX1JFVkVSU0VEX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCltUaGUgbWFjcm8gYCQwJyBpcyBvYnNvbGV0ZS4gIFJlbW92ZSBpdCBhbmQgYWxsIHJlZmVyZW5jZXMgdG8gU0VUVkJVRl9SRVZFUlNFRC5dKWRubApBQ19DQUNIRV9WQUwoW2FjX2N2X2Z1bmNfc2V0dmJ1Zl9yZXZlcnNlZF0sIFthY19jdl9mdW5jX3NldHZidWZfcmV2ZXJzZWQ9bm9dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDI1Cm00X3NldF9saXN0Y200X3NldF9tYXBfc2VwKFskMV0sIFssXSkKVDI3LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RSVE9EKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTU0NQpUMjEsMzMKbTRfbG9jYXRpb24oQUNfRVJST1IpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjM0ClQxOSw1ODQKX0FDX0lOSVRfQ09ORklHX0xPR200X2RpdmVydF90ZXh0KFtJTklUX1BSRVBBUkVdLApbbTRfZGVmaW5lKFtBU19NRVNTQUdFX0xPR19GRF0sIDUpZG5sCmNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgpUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQpydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgoKSXQgd2FzIGNyZWF0ZWQgYnkgbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSlkbmwKJGFzX21lW11tNF9pZnNldChbQUNfUEFDS0FHRV9WRVJTSU9OXSwgWyBBQ19QQUNLQUdFX1ZFUlNJT05dKSwgd2hpY2ggd2FzCmdlbmVyYXRlZCBieSBtNF9QQUNLQUdFX1NUUklORy4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwoKICAkICRbMF0gJFtAXQoKX0FDRU9GCmV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKQVNfVU5BTUUgPiZBU19NRVNTQUdFX0xPR19GRAoKY2F0ID4mQVNfTUVTU0FHRV9MT0dfRkQgPDxfQUNFT0YKCgptNF90ZXh0X2JveChbQ29yZSB0ZXN0cy5dKQoKX0FDRU9GCl0pCkY5LDYKbTRfZGl2bnVtZGl2bnVtClQxMyw2NDAKX0FDX0ZVTkNfU1RBVEFDX1JFUVVJUkUoW0FDX0ZVTkNfTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTktdKWRubApBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkMSBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZ10sCgkgICAgICAgW2FjX2N2X2Z1bmNfJDFfZW1wdHlfc3RyaW5nX2J1Z10sCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLApbW3N0cnVjdCBzdGF0IHNidWY7CiAgcmV0dXJuICQxICgiIiwgJnNidWYpID09IDA7XV0pXSwKCSAgICBbYWNfY3ZfZnVuY18kMV9lbXB0eV9zdHJpbmdfYnVnPW5vXSwKCSAgICBbYWNfY3ZfZnVuY18kMV9lbXB0eV9zdHJpbmdfYnVnPXllc10sCgkgICAgW2FjX2N2X2Z1bmNfJDFfZW1wdHlfc3RyaW5nX2J1Zz15ZXNdKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfJDFfZW1wdHlfc3RyaW5nX2J1ZyA9IHllczsgdGhlbgogIEFDX0xJQk9CSihbJDFdKQogIEFDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoW0hBVkVfJDFfRU1QVFlfU1RSSU5HX0JVR10pLCAxLAoJCSAgICAgW0RlZmluZSB0byAxIGlmIGAkMScgaGFzIHRoZSBidWcgdGhhdCBpdCBzdWNjZWVkcyB3aGVuCgkJICAgICAgZ2l2ZW4gdGhlIHplcm8tbGVuZ3RoIGZpbGUgbmFtZSBhcmd1bWVudC5dKQpmaQoKVDMwLDMwCm00X2xvY2F0aW9uKEFTX0lOSVRfR0VORVJBVEVEKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MjEyMQpUMjEsMjEwCkFNX0ZVTkNfRVJST1JfQVRfTElORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9GVU5DX0VSUk9SX0FUX0xJTkUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19FUlJPUl9BVF9MSU5FXSwgW0FDX0ZVTkNfRVJST1JfQVRfTElORSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzQsMzUKbTRfbG9jYXRpb24oQUNfRlVOQ19DTE9TRURJUl9WT0lEKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6NDYwClQyMSw3NgpfbTRfc2V0X2FkZF9hbGxfY2hlY2ttNF9pZihbJCNdLCBbMl0sIFtdLAogICAgICAgW200X3NldF9hZGQoWyQxXSwgWyQzXSkkMChbJDFdLCBtNF9zaGlmdDIoJEApKV0pClQyNCw3Njc3Cl9BQ19PVVRQVVRfQ09ORklHX1NUQVRVU0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfU1RBVFVTXSkKZG5sIEFTX01FU1NBR0VfTE9HX0ZEIGlzIG5vdCBhdmFpbGFibGUgeWV0OgptNF9wdXNoZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pQVNfSU5JVF9HRU5FUkFURUQoWyRDT05GSUdfU1RBVFVTXSwKWyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgojIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCiMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KCmRlYnVnPWZhbHNlCmFjX2NzX3JlY2hlY2s9ZmFsc2UKYWNfY3Nfc2lsZW50PWZhbHNlCl0pIHx8IGFjX3dyaXRlX2ZhaWw9MQoKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQpbI10gU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCiMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgojIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgphY19sb2c9IgpUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IG00X2lmc2V0KFtBQ19QQUNLQUdFX05BTUVdLCBbQUNfUEFDS0FHRV9OQU1FIF0pZG5sCiRhc19tZVtdbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSksIHdoaWNoIHdhcwpnZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkcuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKCiAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwogIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwogIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCiAgJCAkWzBdICRbQF0KCm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAoiCgpfQUNFT0YKCmRubCByZW1vdmUgYW55IG5ld2xpbmVzIGZyb20gdGhlc2UgdmFyaWFibGVzLgptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEZJTEVTKV0sCltjYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKIiopIHNldCB4ICRhY19jb25maWdfZmlsZXM7IHNoaWZ0OyBhY19jb25maWdfZmlsZXM9JFsqXTs7CmVzYWMKXSkKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhIRUFERVJTKV0sCltjYXNlICRhY19jb25maWdfaGVhZGVycyBpbiAqIgoiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JFsqXTs7CmVzYWMKXSkKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQojIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoRklMRVMpXSwKW2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKXSlkbmwKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhIRUFERVJTKV0sCltjb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKExJTktTKV0sCltjb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MiCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoQ09NTUFORFMpXSwKW2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKXSlkbmwKCl9BQ0VPRgoKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQphY19jc191c2FnZT0iXApcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCmFuZCBhY3Rpb25zIGFyZSBzcGVjaWZpZWQgYXMgVEFHcywgYWxsIGFyZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KClVzYWdlOiAkWzBdIFtbT1BUSU9OXV0uLi4gW1tUQUddXS4uLgoKICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CiAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CiAgICAgIC0tY29uZmlnICAgICBwcmludCBjb25maWd1cmF0aW9uLCB0aGVuIGV4aXQKICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKW10gICAgICAgICAgICAgICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCiAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCiAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucwptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEZJTEVTKV0sCiAgW0FTX0hFTFBfU1RSSU5HKFtbICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV1dXSwKICAgIFtpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEVdLCBbICAgICAgICAgICAgICAgICAgIF0pCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLAogIFtBU19IRUxQX1NUUklORyhbWyAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV1dXSwKICAgIFtpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRV0sIFsgICAgICAgICAgICAgICAgICAgXSkKXSlkbmwKCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoRklMRVMpXSwKW0NvbmZpZ3VyYXRpb24gZmlsZXM6CiRjb25maWdfZmlsZXMKCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLApbQ29uZmlndXJhdGlvbiBoZWFkZXJzOgokY29uZmlnX2hlYWRlcnMKCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoTElOS1MpXSwKW0NvbmZpZ3VyYXRpb24gbGlua3M6CiRjb25maWdfbGlua3MKCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoQ09NTUFORFMpXSwKW0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiRjb25maWdfY29tbWFuZHMKCl0pZG5sClJlcG9ydCBidWdzIHRvIG00X2lmc2V0KFtBQ19QQUNLQUdFX0JVR1JFUE9SVF0sIFs8QUNfUEFDS0FHRV9CVUdSRVBPUlQ+XSwKICBbdGhlIHBhY2thZ2UgcHJvdmlkZXJdKS5kbmwKbTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIFttNF9pZnNldChbQUNfUEFDS0FHRV9VUkxdLCBbCkFDX1BBQ0tBR0VfTkFNRSBob21lIHBhZ2U6IDxBQ19QQUNLQUdFX1VSTD4uXSlkbmwKbTRfaWYobTRfaW5kZXgobTRfZGVmbihbQUNfUEFDS0FHRV9OQU1FXSksIFtHTlUgXSksIFswXSwgWwpHZW5lcmFsIGhlbHAgdXNpbmcgR05VIHNvZnR3YXJlOiA8aHR0cDovL3d3dy5nbnUub3JnL2dldGhlbHAvPi5dKV0pIgoKX0FDRU9GCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQphY19jc19jb25maWc9ImBBU19FQ0hPKFsiJGFjX2NvbmZpZ3VyZV9hcmdzIl0pIHwgc2VkICdzL14gLy87IHMvW1tcXCIiXGBcJF1dL1xcXFwmL2cnYCIKYWNfY3NfdmVyc2lvbj0iXFwKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcuc3RhdHVzW11kbmwKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKY29uZmlndXJlZCBieSAkWzBdLCBnZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkcsCiAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCgpDb3B5cmlnaHQgKEMpIG00X1BBQ0tBR0VfWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCmdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCgphY19wd2Q9JyRhY19wd2QnCnNyY2Rpcj0nJHNyY2RpcicKQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfSU5TVEFMTF0sCltJTlNUQUxMPSckSU5TVEFMTCcKXSlkbmwKQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfTUtESVJfUF0sCltNS0RJUl9QPSckTUtESVJfUCcKXSlkbmwKQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQVdLXSwKW0FXSz0nJEFXSycKXSlkbmwKdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKX0FDRU9GCgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KYWNfbmVlZF9kZWZhdWx0cz06CndoaWxlIHRlc3QgJFsjXSAhPSAwCmRvCiAgY2FzZSAkWzFdIGluCiAgLS0qPT8qKQogICAgYWNfb3B0aW9uPWBleHByICJYJFsxXSIgOiAnWFwoW1tePV1dKlwpPSdgCiAgICBhY19vcHRhcmc9YGV4cHIgIlgkWzFdIiA6ICdYW1tePV1dKj1cKC4qXCknYAogICAgYWNfc2hpZnQ9OgogICAgOzsKICAtLSo9KQogICAgYWNfb3B0aW9uPWBleHByICJYJFsxXSIgOiAnWFwoW1tePV1dKlwpPSdgCiAgICBhY19vcHRhcmc9CiAgICBhY19zaGlmdD06CiAgICA7OwogICopCiAgICBhY19vcHRpb249JFsxXQogICAgYWNfb3B0YXJnPSRbMl0KICAgIGFjX3NoaWZ0PXNoaWZ0CiAgICA7OwogIGVzYWMKCiAgY2FzZSAkYWNfb3B0aW9uIGluCiAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKICAgIGFjX2NzX3JlY2hlY2s9OiA7OwogIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKICAgIEFTX0VDSE8oWyIkYWNfY3NfdmVyc2lvbiJdKTsgZXhpdCA7OwogIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCiAgICBBU19FQ0hPKFsiJGFjX2NzX2NvbmZpZyJdKTsgZXhpdCA7OwogIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCiAgICBkZWJ1Zz06IDs7Cm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoRklMRVMpXSwgW2RubAogIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCiAgICAkYWNfc2hpZnQKICAgIGNhc2UgJGFjX29wdGFyZyBpbgogICAgKlwnKikgYWNfb3B0YXJnPWBBU19FQ0hPKFsiJGFjX29wdGFyZyJdKSB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwogICAgJycpIEFDX01TR19FUlJPUihbbWlzc2luZyBmaWxlIGFyZ3VtZW50XSkgOzsKICAgIGVzYWMKICAgIEFTX1ZBUl9BUFBFTkQoW0NPTkZJR19GSUxFU10sIFsiICckYWNfb3B0YXJnJyJdKQogICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Cl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLCBbZG5sCiAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQogICAgJGFjX3NoaWZ0CiAgICBjYXNlICRhY19vcHRhcmcgaW4KICAgICpcJyopIGFjX29wdGFyZz1gQVNfRUNITyhbIiRhY19vcHRhcmciXSkgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKICAgIGVzYWMKICAgIEFTX1ZBUl9BUFBFTkQoW0NPTkZJR19IRUFERVJTXSwgWyIgJyRhY19vcHRhcmcnIl0pCiAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKICAtLWhlIHwgLS1oKQogICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKICAgIEFDX01TR19FUlJPUihbYW1iaWd1b3VzIG9wdGlvbjogYCRbMV0nClRyeSBgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pOzsKXSwgWyAgLS1oZSB8IC0taCB8XSlkbmwKICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKICAgIEFTX0VDSE8oWyIkYWNfY3NfdXNhZ2UiXSk7IGV4aXQgOzsKICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAogIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKICAgIGFjX2NzX3NpbGVudD06IDs7CgogICMgVGhpcyBpcyBhbiBlcnJvci4KICAtKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgb3B0aW9uOiBgJFsxXScKVHJ5IGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKCiAgKikgQVNfVkFSX0FQUEVORChbYWNfY29uZmlnX3RhcmdldHNdLCBbIiAkWzFdIl0pCiAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwoKICBlc2FjCiAgc2hpZnQKZG9uZQoKYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CgppZiAkYWNfY3Nfc2lsZW50OyB0aGVuCiAgZXhlYyBBU19NRVNTQUdFX0ZEPi9kZXYvbnVsbAogIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCmZpCgpfQUNFT0YKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCmRubCBDaGVjayB0aGlzIGJlZm9yZSBvcGVuaW5nIHRoZSBsb2csIHRvIGF2b2lkIGEgYnVnIG9uIE1pbkdXLApkbmwgd2hpY2ggcHJvaGliaXRzIHRoZSByZWN1cnNpdmUgaW5zdGFuY2UgZnJvbSB0cnVuY2F0aW5nIGFuIG9wZW4gbG9nLgppZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KICBzZXQgWCAkU0hFTEwgJyRbMF0nICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCiAgc2hpZnQKICBcQVNfRUNITyhbInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJFsqXSJdKSA+JkFTX01FU1NBR0VfRkQKICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKICBleHBvcnQgQ09ORklHX1NIRUxMCiAgZXhlYyAiXCRbQF0iCmZpCgpfQUNFT0YKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQpkbmwgT3BlbiB0aGUgbG9nOgptNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlkbmwKZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZwp7CiAgZWNobwogIEFTX0JPWChbUnVubmluZyAkYXNfbWUuXSkKICBBU19FQ0hPKFsiJGFjX2xvZyJdKQp9ID4mQVNfTUVTU0FHRV9MT0dfRkQKCl9BQ0VPRgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKbTRfaWZkZWYoW19BQ19PVVRQVVRfQ09NTUFORFNfSU5JVF0sClsjCiMgSU5JVC1DT01NQU5EUwojCl9BQ19PVVRQVVRfQ09NTUFORFNfSU5JVApdKWRubApfQUNFT0YKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKCiMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgpmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKZG8KICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCm00X2lmZGVmKFtfQUNfTElTVF9UQUdTXSwgW19BQ19MSVNUX1RBR1NdKQogICopIEFDX01TR19FUlJPUihbaW52YWxpZCBhcmd1bWVudDogYCRhY19jb25maWdfdGFyZ2V0J10pOzsKICBlc2FjCmRvbmUKCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoQU5ZKV0sIFtfQUNfT1VUUFVUX01BSU5fTE9PUF0pW11kbmwKCkFTX0VYSVQoMCkKX0FDRU9GCgpUMTAsMTUwCkFDX0ZDX0ZVTkNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbX0FDX0ZDX05BTUVfTUFOR0xJTkddKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX0FDX0ZDX0ZVTkMoWyQxXSxbJDJdKQpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDY1NgpBQ19UWVBFX1VJTlRQVFJfVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DSEVDS19UWVBFKFt1aW50cHRyX3RdLAogICAgW0FDX0RFRklORShbSEFWRV9VSU5UUFRSX1RdLCAxLAogICAgICAgW0RlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1aW50cHRyX3QnLl0pXSwKICAgIFtmb3IgYWNfdHlwZSBpbiAndW5zaWduZWQgaW50JyAndW5zaWduZWQgbG9uZyBpbnQnIFwKCSd1bnNpZ25lZCBsb25nIGxvbmcgaW50JzsgZG8KICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAoJIFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoCgkgICAgW0FDX0lOQ0xVREVTX0RFRkFVTFRdLAoJICAgIFtbc2l6ZW9mICh2b2lkICopIDw9IHNpemVvZiAoJGFjX3R5cGUpXV0pXSwKCSBbQUNfREVGSU5FX1VOUVVPVEVEKFt1aW50cHRyX3RdLCBbJGFjX3R5cGVdLAoJICAgIFtEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIHdpZGUgZW5vdWdoIHRvCgkgICAgIGhvbGQgYSBwb2ludGVyLCBpZiBzdWNoIGEgdHlwZSBleGlzdHMsIGFuZCBpZiB0aGUgc3lzdGVtCgkgICAgIGRvZXMgbm90IGRlZmluZSBpdC5dKQoJICBhY190eXBlPV0pCiAgICAgICB0ZXN0IC16ICIkYWNfdHlwZSIgJiYgYnJlYWsKICAgICBkb25lXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwzNAptNF9sb2NhdGlvbihBQ19DQUNIRV9WQUwpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMQpUMzEsNDQzCl9BQ19TWVNfTEFSR0VGSUxFX1RFU1RfSU5DTFVERVNAJTpAaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KQCU6QGRlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCiAgaW50IG9mZl90X2lzX2xhcmdlW1soTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQoJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKCQkgICAgICA/IDEgOiAtMV1dO1tdZG5sCgpUMjQsOTYKX0FDX1BBVEhfUFJPR19GTEFWT1JfR05VIyBDaGVjayBmb3IgR05VICQxCmNhc2UgYCIkMSIgLS12ZXJzaW9uIDI+JjFgIGluCipHTlUqKQogICQyOzsKbTRfaWZ2YWwoWyQzXSwKWyopCiAgJDM7OwpdKWVzYWMKClQyMiwyCkFDX0xBTkdfU09VUkNFKEVybGFuZykkMQpUMjYsOTYKQUNfRElTQUJMRV9PUFRJT05fQ0hFQ0tJTkdfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGl2ZXJ0X29uY2UoW0RFRkFVTFRTXSwgW2VuYWJsZV9vcHRpb25fY2hlY2tpbmc9bm9dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDM0Cm00X2xvY2F0aW9uKF9BQ19ET19WQVIpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjM5NQpUMzQsMAptNF9pbmNsdWRlKGF1dG9jb25mL2F1dG9oZWFkZXIubTQpClQyNCwxCl9tNF9kaXZlcnQoTTRTSC1JTklULUZOKTUKVDEwLDkxCkFTX1ZBUl9TRVRBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwKCSAgICAgICBbJDE9JDJdLAoJICAgICAgIFtldmFsICIkMT1fQVNfRVNDQVBFKFskMl0sIFtgXSwgW1wiJF0pIl0pClQxMCwzCm00X25ld2xpbmUKJDEKVDI4LDMwCm00X2xvY2F0aW9uKEFDX0xBTkdfUFJPR1JBTSkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoyNDEKVDE1LDc3Cl9BQ19MQU5HX1BSRUZJWF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNywxMjUKQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKE9iamVjdGl2ZSBDKUFDX0xBTkdfUFJPR1JBTShbJDFdLCBbc3RhdGljIGludCB0ZXN0X2FycmF5IEA8OkAxIC0gMiAqICEoJDIpQDo+QDsKdGVzdF9hcnJheSBAPDpAMEA6PkAgPSAwOwpyZXR1cm4gdGVzdF9hcnJheSBAPDpAMEA6PkA7Cl0pClQyMSwzODMKQUNfQ0hFQ0tfVEFSR0VUX1RPT0xTX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9UQVJHRVRdKWRubApmb3IgYWNfcHJvZyBpbiAkMgpkbwogIEFDX0NIRUNLX1BST0coWyQxXSwKCQlbJHRhcmdldF9hbGlhcy0kYWNfcHJvZ10sIFskdGFyZ2V0X2FsaWFzLSRhY19wcm9nXSwsCgkJWyQ0XSkKICB0ZXN0IC1uICIkJDEiICYmIGJyZWFrCmRvbmUKaWYgdGVzdCAteiAiJCQxIjsgdGhlbgogIGlmIHRlc3QgIiRidWlsZCIgPSAiJHRhcmdldCI7IHRoZW4KICAgIGFjX2N0XyQxPSQkMQogICAgQUNfQ0hFQ0tfUFJPR1MoW2FjX2N0XyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSkKICAgICQxPSRhY19jdF8kMQogIGVsc2UKICAgICQxPSIkMyIKICBmaQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDI5MwptNF9kZWZ1bl9vbmNlbTRfZGVmaW5lKFttNF9sb2NhdGlvbigkMSldLCBtNF9sb2NhdGlvbiltNF9kZWZpbmUoWyQxXSwgW19tNF9kZWZ1bl9vbmNlKFskMV0sIFskMl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFskMV0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoWyQxXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoWyQxXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbJDFdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpXSkKVDEzLDQ3NApfbTRfdGV4dF93cmFwbTRfcHVzaGRlZihbbTRfSW5kZW50XSwgbTRfcWxlbihbJDJdKSltNF9wdXNoZGVmKFttNF9DdXJzb3JdLCBtNF9xbGVuKFskM10pKW00X3B1c2hkZWYoW200X1NlcGFyYXRvcl0sIFttNF9kZWZpbmUoW200X1NlcGFyYXRvcl0sIFsgXSldKVskM11tNF9jb25kKFttNF9DdXJzb3JdLCBtNF9JbmRlbnQsIFtdLAoJICAgICAgW200X2V2YWwobTRfQ3Vyc29yID4gbTRfSW5kZW50KV0sIFsxXSwgWwpbJDJdbTRfZGVmaW5lKFttNF9DdXJzb3JdLCBtNF9JbmRlbnQpXSwKCSAgICAgIFttNF9mb3JtYXQoWyUqc10sIG00X21heChbMF0sCiAgbTRfZXZhbChtNF9JbmRlbnQgLSBtNF9DdXJzb3IpKSwgW10pbTRfZGVmaW5lKFttNF9DdXJzb3JdLCBtNF9JbmRlbnQpXSltNF9tYXBfYXJnc193KFskMV0sIFskMF93b3JkKF0sIFssIFskMl0sIFskNF0pXSlfbTRfcG9wZGVmKFttNF9TZXBhcmF0b3JdLCBbbTRfQ3Vyc29yXSwgW200X0luZGVudF0pClQyMCw0NTM4Cl9BQ19PVVRQVVRfTUFJTl9MT09QX200X2RlZnVuX3BybyhbJDBdKQojIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCiMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgojIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CiMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCmlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoRklMRVMpXSwKWyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKXSlkbmwKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhIRUFERVJTKV0sClsgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoTElOS1MpXSwKWyAgdGVzdCAiJHtDT05GSUdfTElOS1Mrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0xJTktTPSRjb25maWdfbGlua3MKXSlkbmwKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhDT01NQU5EUyldLApbICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwpdKWRubApmaQoKIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCiMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgojIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCiMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCmRubCBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBBU19UTVBESVIgbXVzdCBjb250aW51ZSB0byBwbGFjZSB0aGUgcmVzdWx0cwpkbmwgaW4gJHRtcDsgYnV0IHdlIHN3YXAgdG8gdGhlIG5hbWVzcGFjZS1jbGVhbiAkYWNfdG1wIHRvIGF2b2lkIGlzc3Vlcwpkbmwgd2l0aCBhbnkgQ09ORklHX0NPTU1BTkRTIHBsYXlpbmcgd2l0aCB0aGUgY29tbW9uIHZhcmlhYmxlIG5hbWUgJHRtcC4KJGRlYnVnIHx8CnsKICB0bXA9IGFjX3RtcD0KICB0cmFwICdleGl0X3N0YXR1cz0kPwogIDogIiR7YWNfdG1wOj0kdG1wfSIKICB7IHRlc3QgISAtZCAiJGFjX3RtcCIgfHwgcm0gLWZyICIkYWNfdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cwonIDAKICB0cmFwICdBU19FWElUKFsxXSknIDEgMiAxMyAxNQp9CmRubCBUaGUgY29tbWVudCBhYm92ZSBBU19UTVBESVIgc2F5cyBhdCBtb3N0IDQgY2hhcnMgYXJlIGFsbG93ZWQuCkFTX1RNUERJUihbY29uZl0sIFsuXSkKYWNfdG1wPSR0bXAKCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoRklMRVMpXSwgW19BQ19PVVRQVVRfRklMRVNfUFJFUEFSRV0pW11kbmwKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhIRUFERVJTKV0sIFtfQUNfT1VUUFVUX0hFQURFUlNfUFJFUEFSRV0pW11kbmwKCmV2YWwgc2V0IFggImRubAogIG00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoRklMRVMpXSwgICAgWzpGICRDT05GSUdfRklMRVNdKVtdZG5sCiAgbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhIRUFERVJTKV0sICBbOkggJENPTkZJR19IRUFERVJTXSlbXWRubAogIG00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoTElOS1MpXSwgICAgWzpMICRDT05GSUdfTElOS1NdKVtdZG5sCiAgbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhDT01NQU5EUyldLCBbOkMgJENPTkZJR19DT01NQU5EU10pW11kbmwKIgpzaGlmdApmb3IgYWNfdGFnCmRvCiAgY2FzZSAkYWNfdGFnIGluCiAgOltbRkhMQ11dKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKICBlc2FjCiAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KICA6W1tGSExdXSo6Kik7OwogIDpMKiB8IDpDKjoqKSBBQ19NU0dfRVJST1IoW2ludmFsaWQgdGFnIGAkYWNfdGFnJ10pOzsKICA6W1tGSF1dLSkgYWNfdGFnPS06LTs7CiAgOltbRkhdXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OwogIGVzYWMKICBhY19zYXZlX0lGUz0kSUZTCiAgSUZTPToKICBzZXQgeCAkYWNfdGFnCiAgSUZTPSRhY19zYXZlX0lGUwogIHNoaWZ0CiAgYWNfZmlsZT0kWzFdCiAgc2hpZnQKCiAgY2FzZSAkYWNfbW9kZSBpbgogIDpMKSBhY19zb3VyY2U9JFsxXTs7CiAgOltbRkhdXSkKICAgIGFjX2ZpbGVfaW5wdXRzPQogICAgZm9yIGFjX2YKICAgIGRvCiAgICAgIGNhc2UgJGFjX2YgaW4KICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OwogICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQoJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAoJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCgkgdGVzdCAtZiAiJGFjX2YiIHx8CgkgICBjYXNlICRhY19mIGluCgkgICBbW1xcLyRdXSopIGZhbHNlOzsKCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKCSAgIGVzYWMgfHwKCSAgIEFDX01TR19FUlJPUihbY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogYCRhY19mJ10sIFsxXSk7OwogICAgICBlc2FjCiAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gQVNfRUNITyhbIiRhY19mIl0pIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYwogICAgICBBU19WQVJfQVBQRU5EKFthY19maWxlX2lucHV0c10sIFsiICckYWNfZiciXSkKICAgIGRvbmUKCiAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAogICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgogICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKCSAgQVNfRUNITyhbIiRbKl0iXSkgfCBzZWQgWydzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZyddCglgJyBieSBjb25maWd1cmUuJwogICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgogICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKICAgICAgQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJGFjX2ZpbGVdKQogICAgZmkKICAgICMgTmV1dHJhbGl6ZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW50ZXJwcmV0ZWQgYnkgc2VkIGluIHJlcGxhY2VtZW50IHN0cmluZ3MuCiAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKICAgICpcJiogfCAqXHwqIHwgKlxcKiApCiAgICAgICBhY19zZWRfY29uZl9pbnB1dD1gQVNfRUNITyhbIiRjb25maWd1cmVfaW5wdXQiXSkgfAogICAgICAgc2VkICdzL1tbXFxcXCZ8XV0vXFxcXCYvZydgOzsgIygKICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OwogICAgZXNhYwoKICAgIGNhc2UgJGFjX3RhZyBpbgogICAgKjotOiogfCAqOi0pIGNhdCA+IiRhY190bXAvc3RkaW4iIFwKICAgICAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkgOzsKICAgIGVzYWMKICAgIDs7CiAgZXNhYwoKICBhY19kaXI9YEFTX0RJUk5BTUUoWyIkYWNfZmlsZSJdKWAKICBBU19NS0RJUl9QKFsiJGFjX2RpciJdKQogIF9BQ19TUkNESVJTKFsiJGFjX2RpciJdKQoKICBjYXNlICRhY19tb2RlIGluCiAgbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhGSUxFUyldLCAgICBbOkYpX0FDX09VVFBVVF9GSUxFIDs7XSkKICBtNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwgIFs6SClfQUNfT1VUUFVUX0hFQURFUiA7O10pCiAgbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhMSU5LUyldLCAgICBbOkwpX0FDX09VVFBVVF9MSU5LIDs7XSkKICBtNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKENPTU1BTkRTKV0sIFs6QylfQUNfT1VUUFVUX0NPTU1BTkQgOztdKQogIGVzYWMKCmRubCBTb21lIHNoZWxscyBkb24ndCBsaWtlIGVtcHR5IGNhc2UvZXNhYwptNF9pZmRlZihbX0FDX0xJU1RfVEFHX0NPTU1BTkRTXSwgWwogIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgpfQUNfTElTVF9UQUdfQ09NTUFORFMKICBlc2FjCl0pZG5sCmRvbmUgIyBmb3IgYWNfdGFnCgpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDM0MgpfQVNfQk9VUk5FX0NPTVBBVElCTEVBU19JRihbdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxXSwKIFtlbXVsYXRlIHNoCiAgTlVMTENNRD06CiAgWyNdIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJFtAXSJ9LCB3aGljaAogICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCiAgYWxpYXMgLWcgJyR7MSsiJFtAXSJ9Jz0nIiRbQF0iJwogIHNldG9wdCBOT19HTE9CX1NVQlNUXSwKIFtBU19DQVNFKFtgKHNldCAtbykgMj4vZGV2L251bGxgXSwgWypwb3NpeCpdLCBbc2V0IC1vIHBvc2l4XSldKQoKVDEzLDE3NwpfQUNfVE9PTF9XQVJOX200X2RlZnVuX3BybyhbJDBdKWNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KeWVzOikKQUNfTVNHX1dBUk4oW3VzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldF0pCmFjX3Rvb2xfd2FybmVkPXllcyA7Owplc2FjW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw1MzI0Cl9BQ19JTklUX0hFTFBtNF9kaXZlcnRfcHVzaChbSEVMUF9CRUdJTl0pZG5sCgojCiMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KIwppZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgogICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgogICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KICBjYXQgPDxfQUNFT0YKXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgbTRfaWZzZXQoW0FDX1BBQ0tBR0VfU1RSSU5HXSwKCQkJW0FDX1BBQ0tBR0VfU1RSSU5HXSwKCQkJW3RoaXMgcGFja2FnZV0pIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KClVzYWdlOiAkWzBdIFtbT1BUSU9OXV0uLi4gW1tWQVI9VkFMVUVdXS4uLgoKW1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KCkRlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgoKQ29uZmlndXJhdGlvbjoKICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAogICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCiAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQogIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCiAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KCkluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKXUFTX0hFTFBfU1RSSU5HKFstLXByZWZpeD1QUkVGSVhdLAogIFtpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVggWyRhY19kZWZhdWx0X3ByZWZpeF1dKQpBU19IRUxQX1NUUklORyhbLS1leGVjLXByZWZpeD1FUFJFRklYXSwKICBbaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVggW1BSRUZJWF1dKVsKCkJ5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgpcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQphbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLApmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgoKRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCgpGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgogIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQogIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQogIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQogIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQogIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQogIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQogIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQpdQVNfSEVMUF9TVFJJTkcoWy0tZG9jZGlyPURJUl0sCiAgW2RvY3VtZW50YXRpb24gcm9vdCBdQDw6QERBVEFST09URElSL2RvYy9tNF9pZnNldChbQUNfUEFDS0FHRV9UQVJOQU1FXSwKICAgIFtBQ19QQUNLQUdFX1RBUk5BTUVdLCBbUEFDS0FHRV0pQDo+QClbCiAgLS1odG1sZGlyPURJUiAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCiAgLS1kdmlkaXI9RElSICAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQogIC0tcHNkaXI9RElSICAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KX0FDRU9GCgogIGNhdCA8PFxfQUNFT0ZdCm00X2RpdmVydF9wb3AoW0hFTFBfQkVHSU5dKWRubApkbmwgVGhlIG9yZGVyIG9mIHRoZSBkaXZlcnNpb25zIGhlcmUgaXMKZG5sIC0gSEVMUF9CRUdJTgpkbmwgICB3aGljaCBtYXkgYmUgZXh0ZW5kZWQgYnkgZXh0cmEgZ2VuZXJpYyBvcHRpb25zIHN1Y2ggYXMgd2l0aCBYIG9yCmRubCAgIEFDX0FSR19QUk9HUkFNLiAgRGlzcGxheWVkIG9ubHkgaW4gbG9uZyAtLWhlbHAuCmRubApkbmwgLSBIRUxQX0NBTk9OCmRubCAgIFN1cHBvcnQgZm9yIGNyb3NzIGNvbXBpbGF0aW9uICgtLWJ1aWxkLCAtLWhvc3QgYW5kIC0tdGFyZ2V0KS4KZG5sICAgRGlzcGxheSBvbmx5IGluIGxvbmcgLS1oZWxwLgpkbmwKZG5sIC0gSEVMUF9FTkFCTEUKZG5sICAgd2hpY2ggc3RhcnRzIHdpdGggdGhlIHRyYWlsZXIgb2YgdGhlIEhFTFBfQkVHSU4sIEhFTFBfQ0FOT04gc2VjdGlvbiwKZG5sICAgdGhlbiBpbXBsZW1lbnRzIHRoZSBoZWFkZXIgb2YgdGhlIG5vbiBnZW5lcmljIG9wdGlvbnMuCmRubApkbmwgLSBIRUxQX1dJVEgKZG5sCmRubCAtIEhFTFBfVkFSCmRubApkbmwgLSBIRUxQX1ZBUl9FTkQKZG5sCmRubCAtIEhFTFBfRU5ECmRubCAgIGluaXRpYWxpemVkIGJlbG93LCBpbiB3aGljaCB3ZSBkdW1wIHRoZSB0cmFpbGVyIChoYW5kbGluZyBvZiB0aGUKZG5sICAgcmVjdXJzaW9uIGZvciBpbnN0YW5jZSkuCm00X2RpdmVydF9wdXNoKFtIRUxQX0VOQUJMRV0pZG5sCl9BQ0VPRgpmaQoKaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KbTRfaWZzZXQoW0FDX1BBQ0tBR0VfU1RSSU5HXSwKWyAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCiAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIEFDX1BBQ0tBR0VfU1RSSU5HOiI7OwogICBlc2FjXSkKICBjYXQgPDxcX0FDRU9GCm00X2RpdmVydF9wb3AoW0hFTFBfRU5BQkxFXSlkbmwKbTRfZGl2ZXJ0X3B1c2goW0hFTFBfRU5EXSlkbmwKClJlcG9ydCBidWdzIHRvIG00X2lmc2V0KFtBQ19QQUNLQUdFX0JVR1JFUE9SVF0sIFs8QUNfUEFDS0FHRV9CVUdSRVBPUlQ+XSwKICBbdGhlIHBhY2thZ2UgcHJvdmlkZXJdKS5kbmwKbTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIFttNF9pZnNldChbQUNfUEFDS0FHRV9VUkxdLCBbCkFDX1BBQ0tBR0VfTkFNRSBob21lIHBhZ2U6IDxBQ19QQUNLQUdFX1VSTD4uXSlkbmwKbTRfaWYobTRfaW5kZXgobTRfZGVmbihbQUNfUEFDS0FHRV9OQU1FXSksIFtHTlUgXSksIFswXSwgWwpHZW5lcmFsIGhlbHAgdXNpbmcgR05VIHNvZnR3YXJlOiA8aHR0cDovL3d3dy5nbnUub3JnL2dldGhlbHAvPi5dKV0pCl9BQ0VPRgphY19zdGF0dXM9JD8KZmkKCmlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgogIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCiAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAogICAgICB7IGNkICIkc3JjZGlyIiAmJiBhY19wd2Q9YHB3ZGAgJiYgc3JjZGlyPS4gJiYgdGVzdCAtZCAiJGFjX2RpciI7IH0gfHwKICAgICAgY29udGludWUKICAgIF9BQ19TUkNESVJTKFsiJGFjX2RpciJdKQogICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQogICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCiAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCiAgICAgIGVjaG8gJiYKICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCiAgICAgIGVjaG8gJiYKICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQogICAgZWxzZQogICAgICBBQ19NU0dfV0FSTihbbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyXSkKICAgIGZpIHx8IGFjX3N0YXR1cz0kPwogICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQogIGRvbmUKZmkKCnRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwptNF9kaXZlcnRfcG9wKFtIRUxQX0VORF0pZG5sCgpUMjgsMzIKbTRfbG9jYXRpb24oQUNfQ09ORklHX0ZJTEVTKS4uLy4uL2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6Mjg4ClQxNSw5OQpfQVNfTElURVJBTF9JRl9tNF9pZihtNF90cmFuc2xpdChbJDFdLCBbK10pLCBbXSwgWyQwWUVTXSwKICAgICAgIG00X3RyYW5zbGl0KFskMV0sIFskXSksIFtdLCBbbTRfZGVmYXVsdF0sIFskME5PXSkKVDIzLDIzCl9BQ19MQU5HX05VTExfUFJPR1JBTSgpQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDM0LDI4MgpfQUNfSEVBREVSX1RJT0NHV0lOU1pfSU5fVEVSTUlPU19IQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGVybWlvcy5oIGRlZmluZXMgVElPQ0dXSU5TWl0sCgkJYWNfY3Zfc3lzX3Rpb2Nnd2luc3pfaW5fdGVybWlvc19oLApbQUNfRUdSRVBfQ1BQKFt5ZXNdLAoJICAgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2lmZGVmIFRJT0NHV0lOU1oKICB5ZXMKI2VuZGlmCl0sCgkJYWNfY3Zfc3lzX3Rpb2Nnd2luc3pfaW5fdGVybWlvc19oPXllcywKCQlhY19jdl9zeXNfdGlvY2d3aW5zel9pbl90ZXJtaW9zX2g9bm8pXSkKClQxMyw2NgpBQ19UWVBFX1BJRF9UX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1RZUEUocGlkX3QsICBpbnQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwwCkFDX1NVQlNUX1RSQUNFClQyNiwzMQptNF9sb2NhdGlvbihBQ19UWVBFX1BJRF9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MDgKRjksNgptNF9mb3JtYXRmb3JtYXQKVDE5LDMzMQpBQ19QQVRIX1RBUkdFVF9UT09MX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9UQVJHRVRdKWRubApBQ19QQVRIX1BST0coWyQxXSwgWyR0YXJnZXRfYWxpYXMtJDJdLCAsIFskNF0pCmlmIHRlc3QgLXogIiRhY19jdl9wYXRoXyQxIjsgdGhlbgogIGlmIHRlc3QgIiRidWlsZCIgPSAiJHRhcmdldCI7IHRoZW4KICAgIGFjX3B0XyQxPSQkMQogICAgX0FDX1BBVEhfUFJPRyhbYWNfcHRfJDFdLCBbJDJdLCBbJDNdLCBbJDRdKQogICAgJDE9JGFjX3B0XyQxCiAgZWxzZQogICAgJDE9IiQzIgogIGZpCmVsc2UKICAkMT0iJGFjX2N2X3BhdGhfJDEiCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksNDAKQUNfQ09ORklHX01BQ1JPX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjEwLDcKbTRfbWtzdGVtcG1rc3RlbXAKVDMxLDM1Cm00X2xvY2F0aW9uKF9BQ19MSUJPQkpfRk5NQVRDSCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU1NwpUMzIsMAptNF9pbmNsdWRlKGF1dG9jb25mL3NwZWNpZmljLm00KQpUMTYsNzMKQUhfQ0hFQ0tfSEVBREVSU200X2ZvcmVhY2hfdyhbQUNfSGVhZGVyXSwgWyQxXSwgW19BSF9DSEVDS19IRUFERVIobTRfZGVmbihbQUNfSGVhZGVyXSkpXSkKVDI3LDEwNgpBQ19MQU5HX1BST0dSQU0oRm9ydHJhbiA3NyltNF9pZnZhbChbJDFdLAogICAgICAgW200X3dhcm4oW3N5bnRheF0sIFskMDogaWdub3JpbmcgUFJPTE9HVUU6ICQxXSldKWRubAogICAgICBwcm9ncmFtIG1haW4KJDIKICAgICAgZW5kClQxOSw2MDkKQUNfTEFOR19JTlRfU0FWRShDKUFDX0xBTkdfUFJPR1JBTShbJDEKc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0Kc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CkAlOkBpbmNsdWRlIDxzdGRpby5oPgpAJTpAaW5jbHVkZSA8c3RkbGliLmg+XSwKWwogIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgaWYgKCEgZikKICAgIHJldHVybiAxOwogIGlmICgoJDIpIDwgMCkKICAgIHsKICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CiAgICAgIGlmIChpICE9ICgkMikpCglyZXR1cm4gMTsKICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwogICAgICBpZiAoaSAhPSAoJDIpKQoJcmV0dXJuIDE7CiAgICAgIGZwcmludGYgKGYsICIlbHUiLCBpKTsKICAgIH0KICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KICAgICBvbiBzb21lIHBsYXRmb3Jtcy4gICovCiAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpUMjYsMzQKbTRfbG9jYXRpb24oX0FDX1BBVEhfUFJPRykuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MTIwClQyOSwyOAptNF9sb2NhdGlvbihBQ19DX0JBQ0tTTEFTSF9BKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjEzOTYKVDE5LDIKX0FDX0xBTkdfUFJFRklYKEdvKUdPClQ5LDE4NApBQ19NT0RFX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTU9ERV9UJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1RZUEVfTU9ERV9UXSwgW0FDX1RZUEVfTU9ERV9UKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw0MTYKQUNfQ19TVFJJTkdJWkVfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciBwcmVwcm9jZXNzb3Igc3RyaW5naXppbmcgb3BlcmF0b3JdLAoJCVthY19jdl9jX3N0cmluZ2l6ZV0sCltBQ19FR1JFUF9DUFAoW0AlOkB0ZXN0c3RyaW5nXSwKCSAgICAgIFtAJTpAZGVmaW5lIHgoeSkgI3kKCmNoYXIgKnMgPSB4KHRlc3RzdHJpbmcpO10sCgkgICAgICBbYWNfY3ZfY19zdHJpbmdpemU9bm9dLAoJICAgICAgW2FjX2N2X2Nfc3RyaW5naXplPXllc10pXSkKaWYgdGVzdCAkYWNfY3ZfY19zdHJpbmdpemUgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TVFJJTkdJWkUsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIGNwcCBzdXBwb3J0cyB0aGUgQU5TSSBAJTpAIHN0cmluZ2l6aW5nIG9wZXJhdG9yLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMjA2CkFDX0NIRUNLX0FMSUdOT0ZfbTRfZGVmdW5fcHJvKFskMF0pbTRfaWYobTRfaW5kZXgobTRfdHJhbnNsaXQoW1skMV1dLCBbYFwiXSwgWyRdKSwgWyRdKSwgWy0xXSwgW10sCiAgICAgICBbbTRfZmF0YWwoWyQwOiByZXF1aXJlcyBsaXRlcmFsIGFyZ3VtZW50c10pXSlfJDAoWyQxXSwgWyQyXSwgbTRfdHJhbnNsaXQoW1skMV1dLCBbezt9XSwgW19fX10pKVtdX200X2RlZnVuX2VwaShbJDBdKQpGMTEsMTEKX19wcm9ncmFtX19fX3Byb2dyYW1fXwpUNiwyNgpBU19CT1hfJDAobTRfZXhwYW5kKFskMV0pLCBbJDJdKQpUMjgsMzYKbTRfbG9jYXRpb24oQUNfRlVOQ19SRUFMTE9DKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTQxNwpUNywxNTYKbTRfZGVmbm00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF9kZWZuKFskMV0pXSwKCQkJICAgIFttNF9mYXRhbChbJDA6IHVuZGVmaW5lZCBtYWNybzogJDFdKV0pXSwKICAgICAgIFttNF9tYXBfYXJncyhbJDBdLCAkQCldKQpUMTUsMTkyCmZwX0ZVTkNfRk5NQVRDSF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBmcF9GVU5DX0ZOTUFUQ0gnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19GTk1BVENIXSwgW0FDX0ZVTkNfRk5NQVRDSCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMjgKbTRfbG9jYXRpb24oX0FDX1BST0dfQ0NfQzg5KS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjExMDEKVDI4LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfT0JTVEFDSykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjEzNjIKVDExLDU0NApfQVNfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9wdXNoZGVmKFtBU19SRVFVSVJFXSltNF9wdXNoZGVmKFtBU19SRVFVSVJFX1NIRUxMX0ZOXSwgX200X2RlZm4oW19BU19SRVFVSVJFX1NIRUxMX0ZOXSkKKW00X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSwgWy0xXSlfQVNfRVJST1JfUFJFUEFSRQpfbTRfcG9wZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pX0FTX0VYSVRfUFJFUEFSRQpfQVNfVU5TRVRfUFJFUEFSRQpfQVNfVkFSX0FQUEVORF9QUkVQQVJFCl9BU19WQVJfQVJJVEhfUFJFUEFSRQoKX0FTX0VYUFJfUFJFUEFSRQpfQVNfQkFTRU5BTUVfUFJFUEFSRQpfQVNfRElSTkFNRV9QUkVQQVJFCl9BU19NRV9QUkVQQVJFCl9BU19DUl9QUkVQQVJFCl9BU19FQ0hPX05fUFJFUEFSRQpfQVNfTE5fU19QUkVQQVJFCl9BU19NS0RJUl9QX1BSRVBBUkUKX0FTX1RFU1RfUFJFUEFSRQpfQVNfVFJfQ1BQX1BSRVBBUkUKX0FTX1RSX1NIX1BSRVBBUkUKX200X3BvcGRlZihbQVNfUkVRVUlSRV0sIFtBU19SRVFVSVJFX1NIRUxMX0ZOXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDc4MwpBQ19DSEVDS19NRU1CRVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRV9TSEVMTF9GTihbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfY2hlY2tfbWVtYmVyXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX21lbWJlcl0sCiAgICBbTElORU5PIEFHR1IgTUVNQkVSIFZBUiBJTkNMVURFU10sCiAgICBbVHJpZXMgdG8gZmluZCBpZiB0aGUgZmllbGQgTUVNQkVSIGV4aXN0cyBpbiB0eXBlIEFHR1IsIGFmdGVyIGluY2x1ZGluZwogICAgIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS5dKV0sCiAgICBbXyQwX0JPRFldKUFTX0xJVEVSQUxfSUYoWyQxXSwgW10sIFttNF9mYXRhbChbJDA6IHJlcXVpcmVzIGxpdGVyYWwgYXJndW1lbnRzXSldKW00X2lmKG00X2luZGV4KFskMV0sIFsuXSksIFstMV0sCiAgW200X2ZhdGFsKFskMDogRGlkIG5vdCBzZWUgYW55IGRvdCBpbiBgJDEnXSldKUFTX1ZBUl9QVVNIREVGKFthY19NZW1iZXJdLCBbYWNfY3ZfbWVtYmVyXyQxXSlhY19mbl9bXV9BQ19MQU5HX0FCQlJFVltdX2NoZWNrX21lbWJlciAiJExJTkVOTyIgbTRfYnBhdHN1YnN0KFskMV0sIFteXChbXi5dKlwpXC5cKC4qXCldLCBbIlwxIiAiXDIiXSkgImFjX01lbWJlciIgIkFTX0VTQ0FQRShbQUNfSU5DTFVERVNfREVGQVVMVChbJDRdKV0sIFsiIl0pIgpBU19WQVJfSUYoW2FjX01lbWJlcl0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY19NZW1iZXJdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDU0Cm00X2FwcGVuZF91bmlxX3dtNF9tYXBfYXJnc193KFskMl0sIFtfbTRfYXBwZW5kX3VuaXEoWyQxXSxdLCBbLCBbIF0pXSkKVDEzLDIwNwptNF9tYXBfYXJnc193XyQwKF9tNF9zcGxpdChbIF1tNF9mbGF0dGVuKFskMV0pWyBdLCBbWwkgXStdLAoJICAgICAgIG00X2lmKG00X2luZGV4KFskMiQzJDRdLCBbXF0pLCBbLTFdLCBbWyQzW10kNFtdJDJdXSwKCQkgICAgIFttNF9icGF0c3Vic3QoW1skM1tdJDRbXSQyXV0sIFtcXF0sIFtcXFxcXSldKSksCiAgICAgbTRfbGVuKFtbXSQzW10kNF0pLCBtNF9sZW4oWyQ0W10kMltdXSkpClQxOSwxNjUKX0FDX0FSR19WQVJfTERGTEFHU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19BUkdfVkFSKFtMREZMQUdTXSwKCSAgICBbbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCgkgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjMsMzMKbTRfbG9jYXRpb24oQUNfU1RfUkRFVikuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NzgKVDMzLDMzCm00X2xvY2F0aW9uKEFDX0Y3N19OQU1FX01BTkdMSU5HKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00Ojk5OQpUMjcsMjgKbTRfbG9jYXRpb24oQUNfQ19TVFJJTkdJWkUpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MTgwOApUMjQsMzQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tJTkcpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjI2NgpUNiw0Cm00X2NhclskMV0KVDIxLDE5NgpBQ19USU1FX1dJVEhfU1lTX1RJTUVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVElNRV9XSVRIX1NZU19USU1FJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0hFQURFUl9USU1FXSwgW0FDX0hFQURFUl9USU1FKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiw3NwpBQ19MQU5HX0lOVF9TQVZFX200X2RlZnVuX3BybyhbJDBdKV9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsMgptNF9jb3VudCQjClQxNCw0MgpfbTRfZGVmdW5fb25jZW00X3B1c2hkZWYoWyQxXSkkM1skMltdbTRfcHJvdmlkZShbJDFdKV0kNApUMTcsOTIyCl9BQ19QUk9HX09CSkNYWF9HYWNfdGVzdF9PQkpDWFhGTEFHUz0ke09CSkNYWEZMQUdTK3NldH0KYWNfc2F2ZV9PQkpDWFhGTEFHUz0kT0JKQ1hYRkxBR1MKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkT0JKQ1hYIGFjY2VwdHMgLWcsIGFjX2N2X3Byb2dfb2JqY3h4X2csCiAgW2FjX3NhdmVfb2JqY3h4X3dlcnJvcl9mbGFnPSRhY19vYmpjeHhfd2Vycm9yX2ZsYWcKICAgYWNfb2JqY3h4X3dlcnJvcl9mbGFnPXllcwogICBhY19jdl9wcm9nX29iamN4eF9nPW5vCiAgIE9CSkNYWEZMQUdTPSItZyIKICAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCiAgICAgW2FjX2N2X3Byb2dfb2JqY3h4X2c9eWVzXSwKICAgICBbT0JKQ1hYRkxBR1M9IiIKICAgICAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCglbXSwKCVthY19vYmpjeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfb2JqY3h4X3dlcnJvcl9mbGFnCgkgT0JKQ1hYRkxBR1M9Ii1nIgoJIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJICAgW2FjX2N2X3Byb2dfb2JqY3h4X2c9eWVzXSldKV0pCiAgIGFjX29iamN4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9vYmpjeF93ZXJyb3JfZmxhZ10pCmlmIHRlc3QgIiRhY190ZXN0X09CSkNYWEZMQUdTIiA9IHNldDsgdGhlbgogIE9CSkNYWEZMQUdTPSRhY19zYXZlX09CSkNYWEZMQUdTCmVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19vYmpjeHhfZyA9IHllczsgdGhlbgogIGlmIHRlc3QgIiRHT0JKQ1hYIiA9IHllczsgdGhlbgogICAgT0JKQ1hYRkxBR1M9Ii1nIC1PMiIKICBlbHNlCiAgICBPQkpDWFhGTEFHUz0iLWciCiAgZmkKZWxzZQogIGlmIHRlc3QgIiRHT0JKQ1hYIiA9IHllczsgdGhlbgogICAgT0JKQ1hYRkxBR1M9Ii1PMiIKICBlbHNlCiAgICBPQkpDWFhGTEFHUz0KICBmaQpmaVtdZG5sCgpUMTYsMTM0NgpfQVNfRUNIT19QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKVthc19ubD0nCicKZXhwb3J0IGFzX25sCiMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCmFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCmFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwphc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwojIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KaWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAogICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgogIGFzX2VjaG89J3ByaW50IC1yIC0tJwogIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJwplbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCiAgYXNfZWNobz0ncHJpbnRmICVzXG4nCiAgYXNfZWNob19uPSdwcmludGYgJXMnCmVsc2UKICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkXVsxJGFzX25sIicKICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKICBlbHNlCiAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCRdWzEiIDogIlhcXCguKlxcKSInCiAgICBhc19lY2hvX25fYm9keT0nZXZhbAogICAgICBhcmc9JF1bMTsKICAgICAgY2FzZSAkYXJnIGluIEAlOkAoCiAgICAgICoiJGFzX25sIiopCglleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CiAgICAgIGVzYWM7CiAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKICAgICcKICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQogICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKICBmaQogIGV4cG9ydCBhc19lY2hvX2JvZHkKICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCmZpCl1bXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDE4NgpBQ19GVU5DX0NIRUNLX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0ZVTkNfQ0hFQ0snIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ0hFQ0tfRlVOQ10sIFtBQ19DSEVDS19GVU5DKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxNjQKX0FTX1VOU0VUX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX3Vuc2V0XSwgW1ZBUl0sIFtQb3J0YWJseSB1bnNldCBWQVIuXSkKYXNfZm5fdW5zZXQgKCkKewogIEFTX1VOU0VUKFskWzFdXSkKfQphc191bnNldD1hc19mbl91bnNldFtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMjc3Cl9BQ19JTklUX1ZFUlNJT05tNF9kaXZlcnRfdGV4dChbVkVSU0lPTl9CRUdJTl0sCltpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCiAgY2F0IDw8XF9BQ0VPRgptNF9pZnNldChbQUNfUEFDS0FHRV9OQU1FXSwgW0FDX1BBQ0tBR0VfTkFNRSBdKWNvbmZpZ3VyZVtdZG5sCm00X2lmc2V0KFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbIEFDX1BBQ0tBR0VfVkVSU0lPTl0pCmdlbmVyYXRlZCBieSBtNF9QQUNLQUdFX1NUUklOR10pCm00X2RpdmVydF90ZXh0KFtWRVJTSU9OX0VORF0sCltfQUNFT0YKICBleGl0CmZpXSlkbmwKClQxNCw2MgptNF9zZXRfZm9yZWFjaG00X3B1c2hkZWYoWyQyXSltNF9zZXRfbWFwX3NlcChbJDFdLCBbbTRfZGVmaW5lKFskMl0sXSwgWykkM10pClQzMCwzMwptNF9sb2NhdGlvbihfQUNfRkNfRFVNTVlfTUFJTikuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo3NzkKVDExLDE5MApBQ19TRVRfTUFLRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TRVRfTUFLRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QUk9HX01BS0VfU0VUXSwgW0FDX1BST0dfTUFLRV9TRVQoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDc2CkFDX0xBTkdfQ09ORlRFU1QoT2JqZWN0aXZlIEMpY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAovKiBlbmQgY29uZmRlZnMuaC4gICovCiQxCl9BQ0VPRgpUMTIsMTcxCkFDX0lTQ19QT1NJWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19JU0NfUE9TSVgnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX1NFQVJDSF9MSUJTKFtzdHJlcnJvcl0sIFtjcG9zaXhdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMTAxCm00X3N0YWNrX2ZvcmVhY2hfbTRfc3RhY2tfcmV2ZXJzZShbJDFdLCBbbTRfdG1wLSQxXSlfbTRfc3RhY2tfcmV2ZXJzZShbbTRfdG1wLSQxXSwgWyQxXSwgWyQyKF9tNF9kZWZuKFttNF90bXAtJDFdKSldKQpUMjYsMzQKbTRfbG9jYXRpb24oQUNfUEFUSF9QUk9HUykuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MTY0ClQxMiw3NwptNF9jaG9tcF9hbGxtNF9mb3JtYXQoW1slLipzXV0sIG00X2JyZWdleHAobTRfdHJhbnNsaXQoW1skMV1dLCBbCi9dLCBbLyBdKSwgWy8qJF0pLCBbJDFdKQpUNywxNzgKQUNfTE5fU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MTl9TJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1BST0dfTE5fU10sIFtBQ19QUk9HX0xOX1MoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDMzCm00X2xvY2F0aW9uKEFDX1VTRykuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo4NDAKVDYsNDYKbTRfY21wbTRfZXZhbCgoKFskMV0pID4gKFskMl0pKSAtICgoWyQxXSkgPCAoWyQyXSkpKQpUOSwzNzMKQVNfVE1QRElSIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCm00X2lmKFskMl0sIFtdLCBbOiAiJHtUTVBESVI6PS90bXB9Il0pCnsKICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICJtNF9kZWZhdWx0KFskMl0sCiAgICBbJFRNUERJUl0pLyQxWFhYWFhYIikgMj4vZGV2L251bGxgICYmCiAgdGVzdCAtZCAiJHRtcCIKfSAgfHwKewogIHRtcD1tNF9kZWZhdWx0KFskMl0sIFskVE1QRElSXSkvJDEkJC0kUkFORE9NCiAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCn0gfHwgQVNfRVJST1IoW2Nhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIG00X2RlZmF1bHQoWyQyXSwKCSAgICAgIFskVE1QRElSXSldKQpUMTUsNTg5CkFDX0ZVTkNfTUJSVE9XQ19tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBtYnJ0b3djIGFuZCBtYnN0YXRlX3QgYXJlIHByb3Blcmx5IGRlY2xhcmVkXSwKICAgIGFjX2N2X2Z1bmNfbWJydG93YywKICAgIFtBQ19MSU5LX0lGRUxTRSgKICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCgkgICAgW1tAJTpAaW5jbHVkZSA8d2NoYXIuaD5dXSwKCSAgICBbW3djaGFyX3Qgd2M7CgkgICAgICBjaGFyIGNvbnN0IHNbXSA9ICIiOwoJICAgICAgc2l6ZV90IG4gPSAxOwoJICAgICAgbWJzdGF0ZV90IHN0YXRlOwoJICAgICAgcmV0dXJuICEgKHNpemVvZiBzdGF0ZSAmJiAobWJydG93YykgKCZ3YywgcywgbiwgJnN0YXRlKSk7XV0pXSwKICAgICAgIGFjX2N2X2Z1bmNfbWJydG93Yz15ZXMsCiAgICAgICBhY19jdl9mdW5jX21icnRvd2M9bm8pXSkKICBpZiB0ZXN0ICRhY19jdl9mdW5jX21icnRvd2MgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShbSEFWRV9NQlJUT1dDXSwgMSwKICAgICAgW0RlZmluZSB0byAxIGlmIG1icnRvd2MgYW5kIG1ic3RhdGVfdCBhcmUgcHJvcGVybHkgZGVjbGFyZWQuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDMzCm00X2xvY2F0aW9uKEFDX1dPUkRTX0JJR0VORElBTikuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6ODMKVDI4LDM0Cm00X2xvY2F0aW9uKEFDX1BST0dfTUtESVJfUCkuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6NjYyClQyNiwzNgptNF9sb2NhdGlvbihBQ19GVU5DX1dBSVQzKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTk3NQpUMTcsNTEKX0FTX0VDSE9fVU5RVU9URURBU19FQ0hPKFsiJDEiXSkgPiZtNF9kZWZhdWx0KFskMl0sIFtBU19NRVNTQUdFX0ZEXSkKVDE5LDEyMApfQUNfRlVOQ1NfRVhQQU5TSU9OCiAgbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwgW2FjX2Z1bmNfbGlzdD1dKQogIEFDX0NIRUNLX0ZVTkNTKFskYWNfZnVuY19saXN0XSkKICBtNF9kZWZpbmUoW19BQ19GVU5DU19FWFBBTlNJT05dLCBbXSkKClQxOSwzNAptNF9sb2NhdGlvbihfQUNfRE8pLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjM3NwpUMzAsMzMKbTRfbG9jYXRpb24oQUNfWVlURVhUX1BPSU5URVIpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojg0ClQzNywzMAptNF9sb2NhdGlvbihBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkpLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6Mjg5ClQyMCw5NgpfQVNfREVURUNUX1NVR0dFU1RFRF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9zZXRfYWRkKFtfQVNfREVURUNUX1NVR0dFU1RFRF9CT0RZXSwgWyQxIHx8IEFTX0VYSVRdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsNTcKQVNfTElORU5PX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbXyQwXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDE0MzIKQUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sClskMDogQUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTIGlzIHVzZWZ1bCBvbmx5IHdoZW4gc3VwcG9ydGluZyB2ZXJ5Cm9sZCBzeXN0ZW1zIHRoYXQgbGFjayBgc2lnYWN0aW9uJyBhbmQgYFNBX1JFU1RBUlQnLiAgRG9uJ3QgYm90aGVyIHdpdGgKdGhpcyBtYWNybyB1bmxlc3MgeW91IG5lZWQgdG8gc3VwcG9ydCB2ZXJ5IG9sZCBzeXN0ZW1zIGxpa2UgNC4yQlNEIGFuZApTVlIzLl0pZG5sCkFDX1JFUVVJUkUoW0FDX0hFQURFUl9TWVNfV0FJVF0pZG5sCkFDX0NBQ0hFX0NIRUNLKGZvciByZXN0YXJ0YWJsZSBzeXN0ZW0gY2FsbHMsIGFjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscywKW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKApbLyogRXhpdCAwICh0cnVlKSBpZiB3YWl0IHJldHVybnMgc29tZXRoaW5nIG90aGVyIHRoYW4gLTEsCiAgIGkuZS4gdGhlIHBpZCBvZiB0aGUgY2hpbGQsIHdoaWNoIG1lYW5zIHRoYXQgd2FpdCB3YXMgcmVzdGFydGVkCiAgIGFmdGVyIGdldHRpbmcgdGhlIHNpZ25hbC4gICovCgpBQ19JTkNMVURFU19ERUZBVUxUCiNpbmNsdWRlIDxzaWduYWwuaD4KI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAojIGluY2x1ZGUgPHN5cy93YWl0Lmg+CiNlbmRpZgoKLyogU29tZSBwbGF0Zm9ybXMgZXhwbGljaXRseSByZXF1aXJlIGFuIGV4dGVybiAiQyIgc2lnbmFsIGhhbmRsZXIKICAgd2hlbiB1c2luZyBDKysuICovCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHZvaWQgdWNhdGNoIChpbnQgZHVtbXkpIHsgfQojZWxzZQp2b2lkIHVjYXRjaCAoZHVtbXkpIGludCBkdW1teTsgeyB9CiNlbmRpZgoKaW50Cm1haW4gKCkKewogIGludCBpID0gZm9yayAoKSwgc3RhdHVzOwoKICBpZiAoaSA9PSAwKQogICAgewogICAgICBzbGVlcCAoMyk7CiAgICAgIGtpbGwgKGdldHBwaWQgKCksIFNJR0lOVCk7CiAgICAgIHNsZWVwICgzKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogIHNpZ25hbCAoU0lHSU5ULCB1Y2F0Y2gpOwoKICBzdGF0dXMgPSB3YWl0ICgmaSk7CiAgaWYgKHN0YXR1cyA9PSAtMSkKICAgIHdhaXQgKCZpKTsKCiAgcmV0dXJuIHN0YXR1cyA9PSAtMTsKfV0pXSwKCSAgICAgICBbYWNfY3Zfc3lzX3Jlc3RhcnRhYmxlX3N5c2NhbGxzPXllc10sCgkgICAgICAgW2FjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz1ub10pXSkKaWYgdGVzdCAkYWNfY3Zfc3lzX3Jlc3RhcnRhYmxlX3N5c2NhbGxzID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfUkVTVEFSVEFCTEVfU1lTQ0FMTFMsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHN5c3RlbSBjYWxscyBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgYWZ0ZXIKCSAgICAgaW50ZXJydXB0aW9uIGJ5IGEgc2lnbmFsLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpGNSw2Cm00X2lmaWZlbHNlClQxNSwxMTU5Cl9BQ19JTklUX1NSQ0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtfQUNfSU5JVF9ESVJDSEVDS10pZG5sCm00X2RpdmVydF9wdXNoKFtQQVJTRV9BUkdTXSlkbmwKCiMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwogICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KICBhY19jb25mZGlyPWBBU19ESVJOQU1FKFsiJGFzX215c2VsZiJdKWAKICBzcmNkaXI9JGFjX2NvbmZkaXIKICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgogICAgc3JjZGlyPS4uCiAgZmkKZWxzZQogIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KZmkKaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2Rpcl0pCmZpCmFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKYWNfYWJzX2NvbmZkaXI9YCgKCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgQUNfTVNHX0VSUk9SKFskYWNfbXNnXSkKCXB3ZClgCiMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCmlmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KICBzcmNkaXI9LgpmaQojIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgojIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCmNhc2UgJHNyY2RpciBpbgoqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbW14vXV1cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7Owplc2FjCm00X2RpdmVydF9wb3AoW1BBUlNFX0FSR1NdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDksMzYKbTRfcmVuYW1lbTRfY29weShbJDFdLCBbJDJdKW00X3VuZGVmaW5lKFskMV0pClQyMywyOAptNF9sb2NhdGlvbihBQ19DX0NST1NTKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjE0MjAKVDIwLDc3MQpfQUNfTElOS19JRkVMU0VfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CiAgQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKCSB0ZXN0IC16ICIkYWNfW11fQUNfTEFOR19BQkJSRVZbXV93ZXJyb3JfZmxhZyIgfHwKCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCiAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAoJIEFTX1RFU1RfWChbY29uZnRlc3QkYWNfZXhlZXh0XSkKICAgICAgIH1dLAogICAgICBbYWNfcmV0dmFsPTBdLAogICAgICBbX0FDX01TR19MT0dfQ09ORlRFU1QKCWFjX3JldHZhbD0xXSkKICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCiAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAogICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCiAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgogIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KICBBU19MSU5FTk9fUE9QCiAgQVNfU0VUX1NUQVRVUyhbJGFjX3JldHZhbF0pCgpUMTIsMjI0CkFDX1BST0dfR1JFUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lXSwgYWNfY3ZfcGF0aF9HUkVQLAogICBbXyQwKEdSRVAsIFtncmVwIGdncmVwXSwgWy1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nXSldKQogR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKIEFDX1NVQlNUKFtHUkVQXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwyMjkKQUNfQ0hFQ0tfSEVBREVSU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUhfQ0hFQ0tfSEVBREVSKF0sIFspXSlBU19GT1IoW0FDX2hlYWRlcl0sIFthY19oZWFkZXJdLCBbJDFdLApbQUNfQ0hFQ0tfSEVBREVSKEFDX2hlYWRlciwKCQkgW0FDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoW0hBVkVfXUFDX2hlYWRlcikpICQyXSwKCQkgWyQzXSwgWyQ0XSlkbmxdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDMzCm00X2xvY2F0aW9uKEFDX1BSRUZJWF9ERUZBVUxUKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjQ1MApGOCw1Cm00X2luZGlyaW5kaXIKVDEyLDEKX200X2RpdmVydCgpMApUMTcsMTEwNApBQ19OT19FWEVDVVRBQkxFU19tNF9kZWZ1bl9vbmNlKFtBQ19OT19FWEVDVVRBQkxFU10sIFttNF9kaXZlcnRfcHVzaChbS0lMTF0pCm00X2RpdmVydF90ZXh0KFtERUZBVUxUU10sIFthY19ub19saW5rPW5vXSkKCkFDX0JFRk9SRShbJDBdLCBbX0FDX0NPTVBJTEVSX0VYRUVYVF0pCkFDX0JFRk9SRShbJDBdLCBbQUNfTElOS19JRkVMU0VdKQoKbTRfZGVmaW5lKFtfQUNfQ09NUElMRVJfRVhFRVhUXSwKW0FDX0xBTkdfQ09ORlRFU1QoW19BQ19MQU5HX05VTExfUFJPR1JBTV0pCmlmIF9BQ19ET19WQVIoYWNfbGluayk7IHRoZW4KICBhY19ub19saW5rPW5vCiAgXW00X2RlZm4oW19BQ19DT01QSUxFUl9FWEVFWFRdKVsKZWxzZQogIHJtIC1mIC1yIGEub3V0IGEuZXhlIGIub3V0IGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuZFNZTQogIGFjX25vX2xpbms9eWVzCiAgIyBTZXR0aW5nIGNyb3NzX2NvbXBpbGUgd2lsbCBkaXNhYmxlIHJ1biB0ZXN0czsgaXQgd2lsbAogICMgYWxzbyBkaXNhYmxlIEFDX0NIRUNLX0ZJTEUgYnV0IHRoYXQncyBnZW5lcmFsbHkKICAjIGNvcnJlY3QgaWYgd2UgY2FuJ3QgbGluay4KICBjcm9zc19jb21waWxpbmc9eWVzCiAgRVhFRVhUPQogIF9BQ19DT01QSUxFUl9FWEVFWFRfQ1JPU1MKZmkKXSkKCm00X2RlZmluZShbQUNfTElOS19JRkVMU0VdLApbaWYgdGVzdCB4JGFjX25vX2xpbmsgPSB4eWVzOyB0aGVuCiAgQUNfTVNHX0VSUk9SKFtsaW5rIHRlc3RzIGFyZSBub3QgYWxsb3dlZCBhZnRlciBBQ0AmdEBfTk9fRVhFQ1VUQUJMRVNdKQpmaQpdbTRfZGVmbihbQUNfTElOS19JRkVMU0VdKSkKCm00X2RpdmVydF9wb3AoKWRubApdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfTk9fRVhFQ1VUQUJMRVNdKW00X3VucXVvdGUoXSwgWylfbTRfZGVmdW5fZXBpKFtBQ19OT19FWEVDVVRBQkxFU10pXV0sCm00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFtBQ19OT19FWEVDVVRBQkxFU10pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX05PX0VYRUNVVEFCTEVTXSxdLCBbLCBfbTRfZGl2ZXJ0X2R1bXApXV0pKQpUMzEsMzAKbTRfbG9jYXRpb24oX0FTX1RSX0NQUF9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTg0NQpGMTIsOQptNF9jaGFuZ2Vjb21jaGFuZ2Vjb20KRjYsNgppZmVsc2VpZmVsc2UKVDIwLDQwCl9BU19WQVJfQVBQRU5EX1dPUktTYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4JGFzX3ZhciA9IHgxMgpUMjQsMTA2CkFDX0xBTkdfUFJPR1JBTShGb3J0cmFuKW00X2lmdmFsKFskMV0sCiAgICAgICBbbTRfd2Fybihbc3ludGF4XSwgWyQwOiBpZ25vcmluZyBQUk9MT0dVRTogJDFdKV0pZG5sCiAgICAgIHByb2dyYW0gbWFpbgokMgogICAgICBlbmQKVDEwLDYyCm00X25vcXVvdGVtNF9jaGFuZ2VxdW90ZShbLT08eyhdLFspfT49LV0pJDEtPTx7KCl9Pj0tbTRfY2hhbmdlcXVvdGUoWyxdKQpUMjcsMzQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfRlVOQ1MpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4NgpUMTMsNDIKQVNfVkFSX1NFVF9JRkFTX0lGKFtBU19WQVJfVEVTVF9TRVQoWyQxXSldLCBbJDJdLCBbJDNdKQpGOCw1Cm00X2luZGV4aW5kZXgKVDE0LDU4Cl9tNF9tYXBfYXJnc193bTRfc3Vic3RyKFskMV0sIFskMl0sIG00X2V2YWwobTRfbGVuKFskMV0pIC0gWyQyXSAtIFskM10pKQpUNyw5OApfQVNfUlVObTRfaWZ2YWwoWyQyXSwgW3sgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIkMSB8IGFzX3J1bj1hICQyOyB9XSwKCQlbKGV2YWwgJDEpXSkgMj4vZGV2L251bGwKVDM2LDMzCm00X2xvY2F0aW9uKEFDX1NZU19TSUdMSVNUX0RFQ0xBUkVEKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo3OQpUMjcsMzAKbTRfbG9jYXRpb24oQUNfTEFOR19TT1VSQ0UpLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MjI0ClQxOSwyNjAKX0FDX0ZDX0RJQUxFQ1RfWUVBUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9jYXNlKG00X2JwYXRzdWJzdHMobTRfdG9sb3dlcihbJDFdKSwgW2ZvcnRyYW5dLFtdLCBbICpdLFtdKSwKCSBbNzddLFsxOTc3XSwgWzE5NzddLFsxOTc3XSwKCSBbOTBdLFsxOTkwXSwgWzE5OTBdLFsxOTkwXSwKCSBbOTVdLFsxOTk1XSwgWzE5OTVdLFsxOTk1XSwKCSBbMjAwMF0sWzIwMDBdLAoJIFtdLFtdLAoJIFttNF9mYXRhbChbdW5rbm93biBGb3J0cmFuIGRpYWxlY3RdKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiw3NjkKQUNfUFJPR19NQUtFX1NFVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSldKQpzZXQgeCAke01BS0UtbWFrZX0KYWNfbWFrZT1gQVNfRUNITyhbIiRbMl0iXSkgfCBzZWQgJ3MvKy9wL2c7IHMvW1teYS16QS1aMC05X11dL18vZydgCkFDX0NBQ0hFX1ZBTChhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQsCltjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GClNIRUxMID0gL2Jpbi9zaAphbGw6CglAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwpfQUNFT0YKIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgpjYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KICAqQEBAJSUlPT8qPUBAQCUlJSopCiAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwogICopCiAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7CmVzYWMKcm0gLWYgY29uZnRlc3QubWFrZV0pZG5sCmlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgogIEFDX01TR19SRVNVTFQoW3llc10pCiAgU0VUX01BS0U9CmVsc2UKICBBQ19NU0dfUkVTVUxUKFtub10pCiAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgpmaQpBQ19TVUJTVChbU0VUX01BS0VdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDEwNwptNF9zZXRfbWFwX3NlcG00X2lmZGVmKFtfbTRfc2V0X2NsZWFudXAoJDEpXSwgW19tNF9zZXRfY29udGVudHNfMWNdLAoJICBbX200X3NldF9jb250ZW50c18xXSkoWyQxXSlfbTRfc2V0X2NvbnRlbnRzXzIoJEApClQ5LDE3NAptNF9leHBhbmRtNF9wdXNoZGVmKFttNF9kaXZlcnRdLCBfbTRfZGVmbihbX200X2RpdmVydF91bnNhZmVdKSltNF9wdXNoZGVmKFttNF9kaXZlcnRfcHVzaF0sIF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X3Vuc2FmZV0pKW00X2Nob21wKF8kMChbJDEKXSkpX200X3BvcGRlZihbbTRfZGl2ZXJ0XSwgW200X2RpdmVydF9wdXNoXSkKVDEzLDY4OApfQUNfQ19TVERfVFJZX200X2RlZnVuX3BybyhbJDBdKUFDX01TR19DSEVDS0lORyhbZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBdbTRfdHJhbnNsaXQoJDEsIFtjXSwgW0NdKSkKQUNfQ0FDSEVfVkFMKGFjX2N2X3Byb2dfY2NfJDEsClthY19jdl9wcm9nX2NjXyQxPW5vCmFjX3NhdmVfQ0M9JENDCkFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbJDJdLCBbJDNdKV0pCmZvciBhY19hcmcgaW4gJycgJDQKZG8KICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKICBfQUNfQ09NUElMRV9JRkVMU0UoW10sIFthY19jdl9wcm9nX2NjXyQxPSRhY19hcmddKQogIHRlc3QgIngkYWNfY3ZfcHJvZ19jY18kMSIgIT0gInhubyIgJiYgYnJlYWsKZG9uZQpybSAtZiBjb25mdGVzdC4kYWNfZXh0CkNDPSRhY19zYXZlX0NDCl0pIyBBQ19DQUNIRV9WQUwKY2FzZSAieCRhY19jdl9wcm9nX2NjXyQxIiBpbgogIHgpCiAgICBBQ19NU0dfUkVTVUxUKFtub25lIG5lZWRlZF0pIDs7CiAgeG5vKQogICAgQUNfTVNHX1JFU1VMVChbdW5zdXBwb3J0ZWRdKSA7OwogICopCiAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjXyQxIgogICAgQUNfTVNHX1JFU1VMVChbJGFjX2N2X3Byb2dfY2NfJDFdKSA7Owplc2FjCkFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfJDEiICE9IHhub10sIFskNV0sIFskNl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsNjU0CkFDX0xJTktfRklMRVNfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTElOS19GSUxFUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDIsICwKICAgICAgIFttNF9mYXRhbChbJDA6IGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzXSldKWRubAptNF9kZWZpbmVfZGVmYXVsdChbX0FDX0xJTktfRklMRVNfQ05UXSwgMClkbmwKbTRfZGVmaW5lKFtfQUNfTElOS19GSUxFU19DTlRdLCBtNF9pbmNyKF9BQ19MSU5LX0ZJTEVTX0NOVCkpZG5sCmFjX3NvdXJjZXM9IiQxIgphY19kZXN0cz0iJDIiCndoaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSRbMV07IHNoaWZ0OyBhY19kZXN0cz0kWypdCiAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JFsxXTsgc2hpZnQ7IGFjX3NvdXJjZXM9JFsqXQogIFthY19jb25maWdfbGlua3NfXV9BQ19MSU5LX0ZJTEVTX0NOVD0iJFthY19jb25maWdfbGlua3NfXV9BQ19MSU5LX0ZJTEVTX0NOVCAkYWNfZGVzdDokYWNfc291cmNlIgpkb25lCkFDX0NPTkZJR19MSU5LUygkW2FjX2NvbmZpZ19saW5rc19dX0FDX0xJTktfRklMRVNfQ05UKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDksMTgyCkFDX0ZEX01TR19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GRF9NU0cnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQVNfTUVTU0FHRV9GRF0sIFtBU19NRVNTQUdFX0ZEKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMywyMzE5CkFDX0NIRUNLX0hFQURFUl9TVERCT09MX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtmb3Igc3RkYm9vbC5oIHRoYXQgY29uZm9ybXMgdG8gQzk5XSwKICAgICBbYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaF0sCiAgICAgW0FDX0NPTVBJTEVfSUZFTFNFKAogICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCiAgICAgICAgICAgW1sKICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRib29sLmg+CiAgICAgICAgICAgICAjaWZuZGVmIGJvb2wKICAgICAgICAgICAgICAiZXJyb3I6IGJvb2wgaXMgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICNpZm5kZWYgZmFsc2UKICAgICAgICAgICAgICAiZXJyb3I6IGZhbHNlIGlzIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAjaWYgZmFsc2UKICAgICAgICAgICAgICAiZXJyb3I6IGZhbHNlIGlzIG5vdCAwIgogICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAjaWZuZGVmIHRydWUKICAgICAgICAgICAgICAiZXJyb3I6IHRydWUgaXMgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICNpZiB0cnVlICE9IDEKICAgICAgICAgICAgICAiZXJyb3I6IHRydWUgaXMgbm90IDEiCiAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICNpZm5kZWYgX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQKICAgICAgICAgICAgICAiZXJyb3I6IF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkIGlzIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAgc3RydWN0IHMgeyBfQm9vbCBzOiAxOyBfQm9vbCB0OyB9IHM7CgogICAgICAgICAgICAgY2hhciBhW3RydWUgPT0gMSA/IDEgOiAtMV07CiAgICAgICAgICAgICBjaGFyIGJbZmFsc2UgPT0gMCA/IDEgOiAtMV07CiAgICAgICAgICAgICBjaGFyIGNbX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQgPT0gMSA/IDEgOiAtMV07CiAgICAgICAgICAgICBjaGFyIGRbKGJvb2wpIDAuNSA9PSB0cnVlID8gMSA6IC0xXTsKICAgICAgICAgICAgIC8qIFNlZSBib2R5IG9mIG1haW4gcHJvZ3JhbSBmb3IgJ2UnLiAgKi8KICAgICAgICAgICAgIGNoYXIgZlsoX0Jvb2wpIDAuMCA9PSBmYWxzZSA/IDEgOiAtMV07CiAgICAgICAgICAgICBjaGFyIGdbdHJ1ZV07CiAgICAgICAgICAgICBjaGFyIGhbc2l6ZW9mIChfQm9vbCldOwogICAgICAgICAgICAgY2hhciBpW3NpemVvZiBzLnRdOwogICAgICAgICAgICAgZW51bSB7IGogPSBmYWxzZSwgayA9IHRydWUsIGwgPSBmYWxzZSAqIHRydWUsIG0gPSB0cnVlICogMjU2IH07CiAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGZhaWxzIGZvcgogICAgICAgICAgICAgICAgSFAgYUMrKy9BTlNJIEMgQjM5MTBCIEEuMDUuNTUgW0RlYyAwNCAyMDAzXS4gKi8KICAgICAgICAgICAgIF9Cb29sIG5bbV07CiAgICAgICAgICAgICBjaGFyIG9bc2l6ZW9mIG4gPT0gbSAqIHNpemVvZiBuWzBdID8gMSA6IC0xXTsKICAgICAgICAgICAgIGNoYXIgcFstMSAtIChfQm9vbCkgMCA8IDAgJiYgLTEgLSAoYm9vbCkgMCA8IDAgPyAxIDogLTFdOwogICAgICAgICAgICAgLyogQ2F0Y2ggYSBidWcgaW4gYW4gSFAtVVggQyBjb21waWxlci4gIFNlZQogICAgICAgICAgICAgICAgaHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDMtMTIvbXNnMDIzMDMuaHRtbAogICAgICAgICAgICAgICAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1Zy1jb3JldXRpbHMvMjAwNS0xMS9tc2cwMDE2MS5odG1sCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIF9Cb29sIHEgPSB0cnVlOwogICAgICAgICAgICAgX0Jvb2wgKnBxID0gJnE7CiAgICAgICAgICAgXV0sCiAgICAgICAgICAgW1sKICAgICAgICAgICAgIGJvb2wgZSA9ICZzOwogICAgICAgICAgICAgKnBxIHw9IHE7CiAgICAgICAgICAgICAqcHEgfD0gISBxOwogICAgICAgICAgICAgLyogUmVmZXIgdG8gZXZlcnkgZGVjbGFyZWQgdmFsdWUsIHRvIGF2b2lkIGNvbXBpbGVyIG9wdGltaXphdGlvbnMuICAqLwogICAgICAgICAgICAgcmV0dXJuICghYSArICFiICsgIWMgKyAhZCArICFlICsgIWYgKyAhZyArICFoICsgIWkgKyAhIWogKyAhayArICEhbAogICAgICAgICAgICAgICAgICAgICArICFtICsgIW4gKyAhbyArICFwICsgIXEgKyAhcHEpOwogICAgICAgICAgIF1dKV0sCiAgICAgICAgW2FjX2N2X2hlYWRlcl9zdGRib29sX2g9eWVzXSwKICAgICAgICBbYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaD1ub10pXSkKICAgQUNfQ0hFQ0tfVFlQRVMoW19Cb29sXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwzMwptNF9sb2NhdGlvbihBQ19IRUFERVJfU1REQk9PTCkuLi8uLi9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo2NjcKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX0ZDX1dSQVBQRVJTKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjEwODEKVDE4LDk4Cl9BQ19MQU5HX09QRU5NUChDKQojaWZuZGVmIF9PUEVOTVAKIGNob2tlIG1lCiNlbmRpZgojaW5jbHVkZSA8b21wLmg+CmludCBtYWluICgpIHsgcmV0dXJuIG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7IH0KClQxOSwzMzYKX0FTX01LRElSX1BfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFX1NIRUxMX0ZOKFthc19mbl9ta2Rpcl9wXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX21rZGlyX3BdLCBbXSwKICAgIFtDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuXSldLApbCiAgX0FTX01LRElSX1AKXSlpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCiAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwplbHNlCiAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKICBhc19ta2Rpcl9wPWZhbHNlCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzYsMzMKbTRfbG9jYXRpb24oQUNfUkVTVEFSVEFCTEVfU1lTQ0FMTFMpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjcwClQxNywyMjkKbTRfY3Jfbm90X0xFVFRFUlMBAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyolJicoKSQrLC4vMDEyMzQ1Njc4OTo7PD0+P0BbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tClQxOCw1MzcKX0FDX0ZVTkNfTUFMTE9DX0lGX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCkKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBHTlUgbGliYyBjb21wYXRpYmxlIG1hbGxvY10sIGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCwKW0FDX1JVTl9JRkVMU0UoCltBQ19MQU5HX1BST0dSQU0oCltbI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAojIGluY2x1ZGUgPHN0ZGxpYi5oPgojZWxzZQpjaGFyICptYWxsb2MgKCk7CiNlbmRpZgpdXSwKCQkgW3JldHVybiAhIG1hbGxvYyAoMCk7XSldLAoJICAgICAgIFthY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPW5vXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPW5vXSldKQpBU19JRihbdGVzdCAkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsID0geWVzXSwgWyQxXSwgWyQyXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNyw5MApBQ19QUkVGSVhfREVGQVVMVF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfdGV4dChbREVGQVVMVFNdLCBbYWNfZGVmYXVsdF9wcmVmaXg9JDFdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMjU2Cl9tNF9zZXRfZHVtcF9jaGVja200X2lmZGVmKFtfbTRfc2V0KFskMV0pXSwKCSAgW200X3NldF9jb250YWlucyhbJDFdLCBfbTRfZGVmbihbX200X3NldChbJDFdKV0pLAoJCQkgICBbWyQyXV9tNF9kZWZuKFtfbTRfc2V0KFskMV0pXSldKV9tNF9wb3BkZWYoCiAgICBbX200X3NldChbJDFdLF1fbTRfZGVmbihbX200X3NldChbJDFdKV0pWyldLAogICAgW19tNF9zZXQoWyQxXSldKSQwKFskMV0sIFskMiQzXSldLAoJICBbX200X3BvcGRlZihbX200X3NldF9jbGVhbnVwKCQxKV0pXSkKVDEwLDcyOApBU19QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKW00X2RpdmVydF9wdXNoKFtLSUxMXSkKbTRfYXBwZW5kX3VuaXEoW19BU19DTEVBTlVQXSwKICBbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVC1GTl0sIFtfQVNfRVJST1JfUFJFUEFSRVtdXSldKQpBU19SRVFVSVJFKFtfQVNfRVhQUl9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX0JBU0VOQU1FX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfRElSTkFNRV9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX01FX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfQ1JfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19MSU5FTk9fUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19FQ0hPX05fUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19FWElUX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfTE5fU19QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX01LRElSX1BfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19URVNUX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfVFJfQ1BQX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfVFJfU0hfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19VTlNFVF9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX1ZBUl9BUFBFTkRfUFJFUEFSRV0sIFtdLCBbTTRTSC1JTklULUZOXSkKQVNfUkVRVUlSRShbX0FTX1ZBUl9BUklUSF9QUkVQQVJFXSwgW10sIFtNNFNILUlOSVQtRk5dKQptNF9kaXZlcnRfcG9wW11bXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDc3CkFDX0NIRUNLX1BST0dfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0NIRUNLX1BST0coJEApCkFDX1NVQlNUKFskMV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMTcKbTRfbG9jYXRpb25fX2ZpbGVfXzpfX2xpbmVfXwpUMjksMTM5OApfQUNfQ0hFQ0tfSEVBREVSX01PTkdSRUxfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIEFTX1ZBUl9TRVRfSUYoWyRbXTNdLAoJCVtBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTJdLCBbJFtdM10sIFtdKV0sCgkJWyMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwpBQ19NU0dfQ0hFQ0tJTkcoWyRbXTIgdXNhYmlsaXR5XSkKQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFskW100CkAlOkBpbmNsdWRlIDwkW10yPl0pXSwKCQkgIFthY19oZWFkZXJfY29tcGlsZXI9eWVzXSwKCQkgIFthY19oZWFkZXJfY29tcGlsZXI9bm9dKQpBQ19NU0dfUkVTVUxUKFskYWNfaGVhZGVyX2NvbXBpbGVyXSkKCiMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwpBQ19NU0dfQ0hFQ0tJTkcoWyRbXTIgcHJlc2VuY2VdKQpBQ19QUkVQUk9DX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW0AlOkBpbmNsdWRlIDwkW10yPl0pXSwKCQkgIFthY19oZWFkZXJfcHJlcHJvYz15ZXNdLAoJCSAgW2FjX2hlYWRlcl9wcmVwcm9jPW5vXSkKQUNfTVNHX1JFU1VMVChbJGFjX2hlYWRlcl9wcmVwcm9jXSkKCiMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwpjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAogIHllczpubzogKQogICAgQUNfTVNHX1dBUk4oWyRbXTI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciFdKQogICAgQUNfTVNHX1dBUk4oWyRbXTI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHRdKQogICAgOzsKICBubzp5ZXM6KiApCiAgICBBQ19NU0dfV0FSTihbJFtdMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkXSkKICAgIEFDX01TR19XQVJOKFskW10yOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/XSkKICAgIEFDX01TR19XQVJOKFskW10yOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb25dKQogICAgQUNfTVNHX1dBUk4oWyRbXTI6ICAgICBzZWN0aW9uICJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWQiXSkKICAgIEFDX01TR19XQVJOKFskW10yOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0XSkKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwKW200X24oWyggQVNfQk9YKFtSZXBvcnQgdGhpcyB0byBdQUNfUEFDS0FHRV9CVUdSRVBPUlQpCiAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMl0pXSlkbmwKICAgIDs7CmVzYWMKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTJdLCBbJFtdM10sCgkJIFtBU19WQVJfU0VUKFskW10zXSwgWyRhY19oZWFkZXJfY29tcGlsZXJdKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUMjQsMjkKbTRfbG9jYXRpb24oQVNfQkFTRU5BTUUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo5NDIKVDIzLDIKQUNfTEFOR19TT1VSQ0UoRm9ydHJhbikkMQpUMTIsNDcwMApBQ19GVU5DX01NQVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfSEVBREVSU19PTkNFKFtzdGRsaWIuaCB1bmlzdGQuaCBzeXMvcGFyYW0uaF0pCkFDX0NIRUNLX0ZVTkNTKFtnZXRwYWdlc2l6ZV0pCkFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBtbWFwXSwgW2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWRdLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW0FDX0lOQ0xVREVTX0RFRkFVTFRdCltbLyogbWFsbG9jIG1pZ2h0IGhhdmUgYmVlbiByZW5hbWVkIGFzIHJwbF9tYWxsb2MuICovCiN1bmRlZiBtYWxsb2MKCi8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgogICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCgltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCgltbWFwIHNoYXJlZCBub3QgZml4ZWQKCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAogICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQogICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CiAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQogICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCiAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBidWZmZXIgY2FjaGUKICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKICAgcHJvcGFnYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCgogICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCiAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CiAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQogICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CgojaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmICFkZWZpbmVkIEhBVkVfU1RETElCX0gKY2hhciAqbWFsbG9jICgpOwojZW5kaWYKCi8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCiMgaWZkZWYgX1NDX1BBR0VTSVpFCiMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQojIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCiMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgojICAgaWZkZWYgRVhFQ19QQUdFU0laRQojICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwojICAgIGlmZGVmIE5CUEcKIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQojICAgICBpZm5kZWYgQ0xTSVpFCiMgICAgICBkZWZpbmUgQ0xTSVpFIDEKIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCiMgICAgZWxzZSAvKiBubyBOQlBHICovCiMgICAgIGlmZGVmIE5CUEMKIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKIyAgICAgZWxzZSAvKiBubyBOQlBDICovCiMgICAgICBpZmRlZiBQQUdFU0laRQojICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCiMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwojICAgICBlbmRpZiAvKiBubyBOQlBDICovCiMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwojICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwojICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCiMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KCiNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCgppbnQKbWFpbiAoKQp7CiAgY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CiAgY29uc3QgY2hhciAqY2RhdGEyOwogIGludCBpLCBwYWdlc2l6ZTsKICBpbnQgZmQsIGZkMjsKCiAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKCiAgLyogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LiAqLwogIGRhdGEgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKICBpZiAoIWRhdGEpCiAgICByZXR1cm4gMTsKICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgICooZGF0YSArIGkpID0gcmFuZCAoKTsKICB1bWFzayAoMCk7CiAgZmQgPSBjcmVhdCAoImNvbmZ0ZXN0Lm1tYXAiLCAwNjAwKTsKICBpZiAoZmQgPCAwKQogICAgcmV0dXJuIDI7CiAgaWYgKHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQogICAgcmV0dXJuIDM7CiAgY2xvc2UgKGZkKTsKCiAgLyogTmV4dCwgY2hlY2sgdGhhdCB0aGUgdGFpbCBvZiBhIHBhZ2UgaXMgemVyby1maWxsZWQuICBGaWxlIG11c3QgaGF2ZQogICAgIG5vbi16ZXJvIGxlbmd0aCwgb3RoZXJ3aXNlIHdlIHJpc2sgU0lHQlVTIGZvciBlbnRpcmUgcGFnZS4gICovCiAgZmQyID0gb3BlbiAoImNvbmZ0ZXN0LnR4dCIsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjAwKTsKICBpZiAoZmQyIDwgMCkKICAgIHJldHVybiA0OwogIGNkYXRhMiA9ICIiOwogIGlmICh3cml0ZSAoZmQyLCBjZGF0YTIsIDEpICE9IDEpCiAgICByZXR1cm4gNTsKICBkYXRhMiA9IChjaGFyICopIG1tYXAgKDAsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZDIsIDBMKTsKICBpZiAoZGF0YTIgPT0gTUFQX0ZBSUxFRCkKICAgIHJldHVybiA2OwogIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQogICAgaWYgKCooZGF0YTIgKyBpKSkKICAgICAgcmV0dXJuIDc7CiAgY2xvc2UgKGZkMik7CiAgaWYgKG11bm1hcCAoZGF0YTIsIHBhZ2VzaXplKSkKICAgIHJldHVybiA4OwoKICAvKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2ggYWxyZWFkeSBoYXMKICAgICBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sIGFsc28gbWFrZSBzdXJlIHRoYXQKICAgICB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4gICovCiAgZmQgPSBvcGVuICgiY29uZnRlc3QubW1hcCIsIE9fUkRXUik7CiAgaWYgKGZkIDwgMCkKICAgIHJldHVybiA5OwogIGlmIChkYXRhMiAhPSBtbWFwIChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCgkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKICAgIHJldHVybiAxMDsKICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgIGlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCiAgICAgIHJldHVybiAxMTsKCiAgLyogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEgZG8gbm90CiAgICAgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuICAoVGhpcyBpcyBhIGJ1ZyBvbgogICAgIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKSAgKi8KICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgICooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CiAgZGF0YTMgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKICBpZiAoIWRhdGEzKQogICAgcmV0dXJuIDEyOwogIGlmIChyZWFkIChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKICAgIHJldHVybiAxMzsKICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgIGlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCiAgICAgIHJldHVybiAxNDsKICBjbG9zZSAoZmQpOwogIHJldHVybiAwOwp9XV0pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXNdLAoJICAgICAgIFthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ub10pXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgogIEFDX0RFRklORShbSEFWRV9NTUFQXSwgWzFdLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLl0pCmZpCnJtIC1mIGNvbmZ0ZXN0Lm1tYXAgY29uZnRlc3QudHh0CltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxNjYKQUNfTElCT0JKX200X2RlZnVuX3BybyhbJDBdKV9BQ19MSUJPQkooWyQxXSlBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwgW0FDX0xJQlNPVVJDRShbJDEuY10pXSwKICBbQUNfRElBR05PU0UoW3N5bnRheF0sIFskMCgkMSk6IHlvdSBzaG91bGQgdXNlIGxpdGVyYWxzXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMTQ1CkFDX0xBTkdfQ0FMTF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZnZhbChbJDJdLCBbXSwgW200X3dhcm4oW3N5bnRheF0sIFskMDogbm8gZnVuY3Rpb24gZ2l2ZW5dKV0pZG5sCl9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM2LDI5Cm00X2xvY2F0aW9uKF9BU19ERVRFQ1RfQkVUVEVSX1NIRUxMKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTk0ClQzMiwzMwptNF9sb2NhdGlvbihBQ19JTkNMVURFU19ERUZBVUxUKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjM1MwpUMTEsNTQKbTRfaWZuYmxhbmttNF9pZihtNF90cmFuc2xpdChbWyQxXV0sICBbIF1bCV1bCl0pLCBbXSwgWyQzXSwgWyQyXSkKVDE2LDE0NjEKQUNfU1lTX0xBUkdFRklMRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19BUkdfRU5BQkxFKGxhcmdlZmlsZSwKCSAgICAgICBbICAtLWRpc2FibGUtbGFyZ2VmaWxlICAgICBvbWl0IHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzXSkKaWYgdGVzdCAiJGVuYWJsZV9sYXJnZWZpbGUiICE9IG5vOyB0aGVuCgogIEFDX0NBQ0hFX0NIRUNLKFtmb3Igc3BlY2lhbCBDIGNvbXBpbGVyIG9wdGlvbnMgbmVlZGVkIGZvciBsYXJnZSBmaWxlc10sCiAgICBhY19jdl9zeXNfbGFyZ2VmaWxlX0NDLAogICAgW2FjX2N2X3N5c19sYXJnZWZpbGVfQ0M9bm8KICAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KICAgICAgIGFjX3NhdmVfQ0M9JENDCiAgICAgICB3aGlsZSA6OyBkbwoJICMgSVJJWCA2LjIgYW5kIGxhdGVyIGRvIG5vdCBzdXBwb3J0IGxhcmdlIGZpbGVzIGJ5IGRlZmF1bHQsCgkgIyBzbyB1c2UgdGhlIEMgY29tcGlsZXIncyAtbjMyIG9wdGlvbiBpZiB0aGF0IGhlbHBzLgoJIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbX0FDX1NZU19MQVJHRUZJTEVfVEVTVF9JTkNMVURFU10pXSkKCSBBQ19DT01QSUxFX0lGRUxTRShbXSwgW2JyZWFrXSkKCSBDQz0iJENDIC1uMzIiCgkgQUNfQ09NUElMRV9JRkVMU0UoW10sIFthY19jdl9zeXNfbGFyZ2VmaWxlX0NDPScgLW4zMic7IGJyZWFrXSkKCSBicmVhawogICAgICAgZG9uZQogICAgICAgQ0M9JGFjX3NhdmVfQ0MKICAgICAgIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKICAgIGZpXSkKICBpZiB0ZXN0ICIkYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQyIgIT0gbm87IHRoZW4KICAgIENDPSRDQyRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDCiAgZmkKCiAgX0FDX1NZU19MQVJHRUZJTEVfTUFDUk9fVkFMVUUoX0ZJTEVfT0ZGU0VUX0JJVFMsIDY0LAogICAgYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHMsCiAgICBbTnVtYmVyIG9mIGJpdHMgaW4gYSBmaWxlIG9mZnNldCwgb24gaG9zdHMgd2hlcmUgdGhpcyBpcyBzZXR0YWJsZS5dLAogICAgW19BQ19TWVNfTEFSR0VGSUxFX1RFU1RfSU5DTFVERVNdKQogIGlmIHRlc3QgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzID0gdW5rbm93bjsgdGhlbgogICAgX0FDX1NZU19MQVJHRUZJTEVfTUFDUk9fVkFMVUUoX0xBUkdFX0ZJTEVTLCAxLAogICAgICBhY19jdl9zeXNfbGFyZ2VfZmlsZXMsCiAgICAgIFtEZWZpbmUgZm9yIGxhcmdlIGZpbGVzLCBvbiBBSVgtc3R5bGUgaG9zdHMuXSwKICAgICAgW19BQ19TWVNfTEFSR0VGSUxFX1RFU1RfSU5DTFVERVNdKQogIGZpCgogIEFIX1ZFUkJBVElNKFtfREFSV0lOX1VTRV82NF9CSVRfSU5PREVdLApbLyogRW5hYmxlIGxhcmdlIGlub2RlIG51bWJlcnMgb24gTWFjIE9TIFggMTAuNS4gICovCiNpZm5kZWYgX0RBUldJTl9VU0VfNjRfQklUX0lOT0RFCiMgZGVmaW5lIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAxCiNlbmRpZl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTI3NQpBQ19QUk9HX0NDX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfUFVTSChDKWRubApBQ19BUkdfVkFSKFtDQ10sICAgICBbQyBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3NdKWRubApfQUNfQVJHX1ZBUl9MREZMQUdTKClkbmwKX0FDX0FSR19WQVJfTElCUygpZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKbTRfaWZ2YWwoWyQxXSwKICAgICAgW0FDX0NIRUNLX1RPT0xTKENDLCBbJDFdKV0sCltBQ19DSEVDS19UT09MKENDLCBnY2MpCmlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICBkbmwgSGVyZSB3ZSB3YW50OgogIGRubAlBQ19DSEVDS19UT09MKENDLCBjYykKICBkbmwgYnV0IHdpdGhvdXQgdGhlIGNoZWNrIGZvciBhIHRvb2wgd2l0aG91dCB0aGUgcHJlZml4LgogIGRubCBVbnRpbCB0aGUgY2hlY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZXJlLCBjb3B5IHRoZSBjb2RlOgogIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICAgIEFDX0NIRUNLX1BST0coQ0MsIFske2FjX3Rvb2xfcHJlZml4fWNjXSwgWyR7YWNfdG9vbF9wcmVmaXh9Y2NdKQogIGZpCmZpCmlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICBBQ19DSEVDS19QUk9HKENDLCBjYywgY2MsICwgLCAvdXNyL3VjYi9jYykKZmkKaWYgdGVzdCAteiAiJENDIjsgdGhlbgogIEFDX0NIRUNLX1RPT0xTKENDLCBjbC5leGUpCmZpCl0pCgp0ZXN0IC16ICIkQ0MiICYmIEFDX01TR19GQUlMVVJFKFtubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRIXSkKCiMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KX0FTX0VDSE9fTE9HKFtjaGVja2luZyBmb3IgX0FDX0xBTkcgY29tcGlsZXIgdmVyc2lvbl0pCnNldCBYICRhY19jb21waWxlCmFjX2NvbXBpbGVyPSRbMl0KZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwogIF9BQ19ET19MSU1JVChbJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiZBU19NRVNTQUdFX0xPR19GRF0pCmRvbmUKCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfRVhFRVhUXSlbXWRubAptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX09CSkVYVF0pW11kbmwKX0FDX0xBTkdfQ09NUElMRVJfR05VCmlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgogIEdDQz15ZXMKZWxzZQogIEdDQz0KZmkKX0FDX1BST0dfQ0NfRwpfQUNfUFJPR19DQ19DODkKQUNfTEFOR19QT1AoQylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ3LDEyMjkKQUNfSU5JVCMgRm9yYmlkZGVuIHRva2VucyBhbmQgZXhjZXB0aW9ucy4KbTRfcGF0dGVybl9mb3JiaWQoW15fP0FbQ0hVTV1fXSkKbTRfcGF0dGVybl9mb3JiaWQoW19BQ19dKQptNF9wYXR0ZXJuX2ZvcmJpZChbXkxJQk9CSlMkXSwKCQkgIFtkbyBub3QgdXNlIExJQk9CSlMgZGlyZWN0bHksIHVzZSBBQ19MSUJPQkogKHNlZSBzZWN0aW9uIGBBQ19MSUJPQkogdnMgTElCT0JKUyddKQojIEFjdHVhbGx5IHJlc2VydmVkIGJ5IE00c2guCm00X3BhdHRlcm5fYWxsb3coW15BU19GTEFHUyRdKQojIFNvIHRoYXQgdGhlIGF1dG9jb25mLWdlbmVyYXRlZCBzY3JpcHRzIHdpbGwgYWx3YXlzIHJlLWV4ZWN1dGUKIyB0aGVtc2VsdmVzIHdpdGggJENPTkZJR19TSEVMTCwgaWYgdGhhdCdzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQuCm00X2RlZmluZShbX0FTX0ZPUkNFX1JFRVhFQ19XSVRIX0NPTkZJR19TSEVMTF0sIFt5ZXNdKQpBU19JTklUW11kbmwKQVNfUFJFUEFSRVtdZG5sCm00X2RpdmVydF9wdXNoKFtLSUxMXSkKbTRfaWZ2YWwoWyQyXSwgW19BQ19JTklUX1BBQ0tBR0UoJEApXSkKX0FDX0lOSVRfREVGQVVMVFMKX0FDX0lOSVRfUEFSU0VfQVJHUwpfQUNfSU5JVF9ESVJDSEVDSwpfQUNfSU5JVF9TUkNESVIKX0FDX0lOSVRfSEVMUApfQUNfSU5JVF9WRVJTSU9OCl9BQ19JTklUX0NPTkZJR19MT0cKX0FDX0lOSVRfUFJFUEFSRQpfQUNfSU5JVF9OT1RJQ0UKX0FDX0lOSVRfQ09QWVJJR0hUCm00X2RpdmVydF90ZXh0KFtTSEVMTF9GTl0sIFsKbTRfdGV4dF9ib3goW0F1dG9jb25mIGluaXRpYWxpemF0aW9uLl0pXSkKbTRfZGl2ZXJ0X3BvcAptNF9pZnZhbChbJDJdLCAsIFttNF9pZnZhbChbJDFdLCBbQUNfQ09ORklHX1NSQ0RJUihbJDFdKV0pXSlkbmwKZG5sCmRubCBTdWJzdGl0dXRlIGZvciBwcmVkZWZpbmVkIHZhcmlhYmxlcy4KQUNfU1VCU1QoW0RFRlNdKWRubApBQ19TVUJTVChbRUNIT19DXSlkbmwKQUNfU1VCU1QoW0VDSE9fTl0pZG5sCkFDX1NVQlNUKFtFQ0hPX1RdKWRubApBQ19TVUJTVChbTElCU10pZG5sCl9BQ19BUkdfVkFSX1BSRUNJT1VTKFtidWlsZF9hbGlhc10pQUNfU1VCU1QoW2J1aWxkX2FsaWFzXSlkbmwKX0FDX0FSR19WQVJfUFJFQ0lPVVMoW2hvc3RfYWxpYXNdKUFDX1NVQlNUKFtob3N0X2FsaWFzXSlkbmwKX0FDX0FSR19WQVJfUFJFQ0lPVVMoW3RhcmdldF9hbGlhc10pQUNfU1VCU1QoW3RhcmdldF9hbGlhc10pZG5sCmRubApBQ19MQU5HX1BVU0goQykKClQyMSw3NApfQUNfQ09ORklHX0RFUEVOREVOQ1lfQUNfRklMRV9ERVBFTkRFTkNZX1RSQUNFX0NPTE9OKFskMl1fQUNfQ09ORklHX0RFUEVOREVOQ1lfREVGQVVMVCgkQCkpZG5sCgpUOCwxODEKQUNfT0ZGX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfT0ZGX1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9PRkZfVF0sIFtBQ19UWVBFX09GRl9UKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywzNzYKQUNfQ0hFQ0tfVE9PTF9tNF9kZWZ1bl9wcm8oWyQwXSlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgQUNfQ0hFQ0tfUFJPRyhbJDFdLCBbJHthY190b29sX3ByZWZpeH0kMl0sIFske2FjX3Rvb2xfcHJlZml4fSQyXSwgLCBbJDRdKQpmaQppZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ18kMSI7IHRoZW4KICBhY19jdF8kMT0kJDEKICBfQUNfQ0hFQ0tfUFJPRyhbYWNfY3RfJDFdLCBbJDJdLCBbJDJdLCBbXSwgWyQ0XSkKICBpZiB0ZXN0ICJ4JGFjX2N0XyQxIiA9IHg7IHRoZW4KICAgICQxPSIkMyIKICBlbHNlCiAgICBfQUNfVE9PTF9XQVJOCiAgICAkMT0kYWNfY3RfJDEKICBmaQplbHNlCiAgJDE9IiRhY19jdl9wcm9nXyQxIgpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDEzNApfbTRfZGVmdW5fZXBpX200X3BvcGRlZihbX200X2V4cGFuZGluZygkMSldLCBbX200X2V4cGFuc2lvbl9zdGFja10pbTRfaWZkZWYoW19tNF9leHBhbnNpb25fc3RhY2tdLCBbXSwgW19tNF9kZWZ1bl9lcGlfb3V0ZXIoWyQxXSldKW00X3Byb3ZpZGUoWyQxXSkKVDEwLDQwCm00X3dhcm5pbmdtNF9lcnJwcmludG4obTRfbG9jYXRpb25bOiB3YXJuaW5nOiAkMV0pClQxMiw1NzYKX0FDX1RZUEVfSU5UX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX2NfZmluZF9pbnRYX3RdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYWNfZm5fY19maW5kX2ludFhfdF0sIFtMSU5FTk8gQklUUyBWQVJdLAogICAgW0ZpbmRzIGEgc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHdpZHRoIEJJVFMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCiAgICAgYWNjb3JkaW5nbHkuXSldLAogICAgWyQwX0JPRFldKWFjX2ZuX2NfZmluZF9pbnRYX3QgIiRMSU5FTk8iICIkMSIgImFjX2N2X2NfaW50JDFfdCIKY2FzZSAkYWNfY3ZfY19pbnQkMV90IGluICMoCiAgbm98eWVzKSA7OyAjKAogICopCiAgICBBQ19ERUZJTkVfVU5RVU9URUQoW2ludCQxX3RdLCBbJGFjX2N2X2NfaW50JDFfdF0sCiAgICAgIFtEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgJDEgYml0cwogICAgICAgaWYgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC5dKTs7CmVzYWMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ0NCwzMgptNF9sb2NhdGlvbihBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfRElSKS4uLy4uL2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6MjY4ClQxOSwxNjYKX0FDX0NIRUNLX0ZVTkNfT05DRV9BSF9DSEVDS19GVU5DKFskMV0pQUNfREVGVU4oW19BQ19GdW5jXyQxXSwKICBbbTRfZGl2ZXJ0X3RleHQoW0lOSVRfUFJFUEFSRV0sIFtBU19WQVJfQVBQRU5EKFthY19mdW5jX2xpc3RdLCBbIiAkMSJdKV0pCl9BQ19GVU5DU19FWFBBTlNJT05dKUFDX1JFUVVJUkUoW19BQ19GdW5jXyQxXSkKVDksMTc0CkFNX0VYRUVYVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9FWEVFWFQnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRVhFRVhUXSwgW0FDX0VYRUVYVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzQsMzEKbTRfbG9jYXRpb24oX0FDX1RZUEVfVU5TSUdORURfSU5UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo3MTgKVDI4LDI4Cm00X2xvY2F0aW9uKF9BQ19MQU5HX09QRU5NUCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxOTQxClQzNSwzNAptNF9sb2NhdGlvbihBQ19TWVNfTE9OR19GSUxFX05BTUVTKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDoxOTMKVDM1LDM0Cm00X2xvY2F0aW9uKEFDX0ZDX01PRFVMRV9FWFRFTlNJT04pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTY5NgpUMTcsMTQzMgpBQ19UWVBFX0dFVEdST1VQU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19UWVBFX1VJRF9UXSlkbmwKQUNfQ0FDSEVfQ0hFQ0sodHlwZSBvZiBhcnJheSBhcmd1bWVudCB0byBnZXRncm91cHMsIGFjX2N2X3R5cGVfZ2V0Z3JvdXBzLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoCltbLyogVGhhbmtzIHRvIE1pa2UgUmVuZGVsbCBmb3IgdGhpcyB0ZXN0LiAgKi8KXUFDX0lOQ0xVREVTX0RFRkFVTFRbCiNkZWZpbmUgTkdJRCAyNTYKI3VuZGVmIE1BWAojZGVmaW5lIE1BWCh4LCB5KSAoKHgpID4gKHkpID8gKHgpIDogKHkpKQoKaW50Cm1haW4gKCkKewogIGdpZF90IGdpZHNldFtOR0lEXTsKICBpbnQgaSwgbjsKICB1bmlvbiB7IGdpZF90IGd2YWw7IGxvbmcgaW50IGx2YWw7IH0gIHZhbDsKCiAgdmFsLmx2YWwgPSAtMTsKICBmb3IgKGkgPSAwOyBpIDwgTkdJRDsgaSsrKQogICAgZ2lkc2V0W2ldID0gdmFsLmd2YWw7CiAgbiA9IGdldGdyb3VwcyAoc2l6ZW9mIChnaWRzZXQpIC8gTUFYIChzaXplb2YgKGludCksIHNpemVvZiAoZ2lkX3QpKSAtIDEsCgkJIGdpZHNldCk7CiAgLyogRXhpdCBub24temVybyBpZiBnZXRncm91cHMgc2VlbXMgdG8gcmVxdWlyZSBhbiBhcnJheSBvZiBpbnRzLiAgVGhpcwogICAgIGhhcHBlbnMgd2hlbiBnaWRfdCBpcyBzaG9ydCBpbnQgYnV0IGdldGdyb3VwcyBtb2RpZmllcyBhbiBhcnJheQogICAgIG9mIGludHMuICAqLwogIHJldHVybiBuID4gMCAmJiBnaWRzZXRbbl0gIT0gdmFsLmd2YWw7Cn1dXSldLAoJICAgICAgIFthY19jdl90eXBlX2dldGdyb3Vwcz1naWRfdF0sCgkgICAgICAgW2FjX2N2X3R5cGVfZ2V0Z3JvdXBzPWludF0sCgkgICAgICAgW2FjX2N2X3R5cGVfZ2V0Z3JvdXBzPWNyb3NzXSkKaWYgdGVzdCAkYWNfY3ZfdHlwZV9nZXRncm91cHMgPSBjcm9zczsgdGhlbgogIGRubCBXaGVuIHdlIGNhbid0IHJ1biB0aGUgdGVzdCBwcm9ncmFtICh3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nKSwgcHJlc3VtZQogIGRubCB0aGF0IDx1bmlzdGQuaD4gaGFzIGVpdGhlciBhbiBhY2N1cmF0ZSBwcm90b3R5cGUgZm9yIGdldGdyb3VwcyBvciBub25lLgogIGRubCBPbGQgc3lzdGVtcyB3aXRob3V0IHByb3RvdHlwZXMgcHJvYmFibHkgdXNlIGludC4KICBBQ19FR1JFUF9IRUFERVIoW2dldGdyb3Vwcy4qaW50LipnaWRfdF0sIHVuaXN0ZC5oLAoJCSAgYWNfY3ZfdHlwZV9nZXRncm91cHM9Z2lkX3QsIGFjX2N2X3R5cGVfZ2V0Z3JvdXBzPWludCkKZmldKQpBQ19ERUZJTkVfVU5RVU9URUQoR0VUR1JPVVBTX1QsICRhY19jdl90eXBlX2dldGdyb3VwcywKCQkgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSBzZXQgYnkKCQkgICAgYGdldGdyb3VwcycuIFVzdWFsbHkgdGhpcyBpcyBlaXRoZXIgYGludCcgb3IgYGdpZF90Jy5dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDU5CkFDX0xBTkdfRlVOQ19MSU5LX1RSWShHbylBQ19MQU5HX1BST0dSQU0oCltmdW5jICQxKCkgaW50CnZhciBmID0gJDEKXSwgW3JldHVybiBmKCldKQpUOSwxMjEwCkFDX1BBVEhfWF9tNF9kZWZ1bl9wcm8oWyQwXSlkbmwgRG9jdW1lbnQgdGhlIFggYWJub3JtYWwgb3B0aW9ucyBpbmhlcml0ZWQgZnJvbSBoaXN0b3J5LgptNF9kaXZlcnRfb25jZShbSEVMUF9CRUdJTl0sIFsKWCBmZWF0dXJlczoKICAtLXgtaW5jbHVkZXM9RElSICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCiAgLS14LWxpYnJhcmllcz1ESVIgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUl0pZG5sCkFDX01TR19DSEVDS0lORyhbZm9yIFhdKQoKQUNfQVJHX1dJVEgoeCwgWyAgLS13aXRoLXggICAgICAgICAgICAgICAgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW1dKQojICRoYXZlX3ggaXMgYHllcycsIGBubycsIGBkaXNhYmxlZCcsIG9yIGVtcHR5IHdoZW4gd2UgZG8gbm90IHlldCBrbm93LgppZiB0ZXN0ICJ4JHdpdGhfeCIgPSB4bm87IHRoZW4KICAjIFRoZSB1c2VyIGV4cGxpY2l0bHkgZGlzYWJsZWQgWC4KICBoYXZlX3g9ZGlzYWJsZWQKZWxzZQogIGNhc2UgJHhfaW5jbHVkZXMsJHhfbGlicmFyaWVzIGluICMoCiAgICAqXCcqKSBBQ19NU0dfRVJST1IoW2Nhbm5vdCB1c2UgWCBkaXJlY3RvcnkgbmFtZXMgY29udGFpbmluZyAnXSk7OyAjKAogICAgKixOT05FIHwgTk9ORSwqKSBfQUNfUEFUSF9YOzsgIygKICAgICopIGhhdmVfeD15ZXM7OwogIGVzYWMKICBldmFsICIkYWNfY3ZfaGF2ZV94IgpmaSAjICR3aXRoX3ggIT0gbm8KCmlmIHRlc3QgIiRoYXZlX3giICE9IHllczsgdGhlbgogIEFDX01TR19SRVNVTFQoWyRoYXZlX3hdKQogIG5vX3g9eWVzCmVsc2UKICAjIElmIGVhY2ggb2YgdGhlIHZhbHVlcyB3YXMgb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgb3ZlcnJpZGVzIGVhY2ggZ3Vlc3MuCiAgdGVzdCAieCR4X2luY2x1ZGVzIiA9IHhOT05FICYmIHhfaW5jbHVkZXM9JGFjX3hfaW5jbHVkZXMKICB0ZXN0ICJ4JHhfbGlicmFyaWVzIiA9IHhOT05FICYmIHhfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcwogICMgVXBkYXRlIHRoZSBjYWNoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBjb21tYW5kIGxpbmUgdmFsdWVzLgogIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllc1wKCWFjX3hfaW5jbHVkZXM9JyR4X2luY2x1ZGVzJ1wKCWFjX3hfbGlicmFyaWVzPSckeF9saWJyYXJpZXMnIgogIEFDX01TR19SRVNVTFQoW2xpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXNdKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDM0Cm00X2xvY2F0aW9uKF9BQ19ET19TVERFUlIpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjM4NQpUMjUsMjcKbTRfbG9jYXRpb24oQUNfTEFOR19PQkpDKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjI3NApUMzgsMzQKbTRfbG9jYXRpb24oQUNfQ09ORklHX0FVWF9ESVJfREVGQVVMVCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNjc4CkY3LDQKbTRfZXZhbGV2YWwKVDI2LDIKQUNfTEFOR19TT1VSQ0UoRm9ydHJhbiA3NykkMQpUMTQsMTA3MwpBQ19BUkdfUFJPR1JBTV9tNF9kZWZ1bl9vbmNlKFtBQ19BUkdfUFJPR1JBTV0sIFtkbmwgRG9jdW1lbnQgdGhlIG9wdGlvbnMuCm00X2RpdmVydF9wdXNoKFtIRUxQX0JFR0lOXSlkbmwKClByb2dyYW0gbmFtZXM6CiAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggICAgICAgICAgICBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwogIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwogIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCm00X2RpdmVydF9wb3AoW0hFTFBfQkVHSU5dKWRubAp0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCnRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgogIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKIyBEb3VibGUgYW55IFwgb3IgJC4KIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KW2FjX3NjcmlwdD0ncy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLyddCnByb2dyYW1fdHJhbnNmb3JtX25hbWU9YEFTX0VDSE8oWyIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSJdKSB8IHNlZCAiJGFjX3NjcmlwdCJgCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19BUkdfUFJPR1JBTV0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0FSR19QUk9HUkFNXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0FSR19QUk9HUkFNXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfQVJHX1BST0dSQU1dLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQ0NywzMgptNF9sb2NhdGlvbihBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKS4uLy4uL2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6MjgzClQyNCwzCl9tNF9kaXZlcnQoVkVSU0lPTl9VU0VSKTIwMgpUMTUsMTg2CkFDX1BST0dSQU1fUEFUSF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19QUk9HUkFNX1BBVEgnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUEFUSF9QUk9HXSwgW0FDX1BBVEhfUFJPRygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTAxCkFDX01TR19GQUlMVVJFeyBBU19NRVNTQUdFKFtlcnJvcjogaW4gYCRhY19wd2QnOl0sIDIpCkFDX01TR19FUlJPUihbJDEKU2VlIGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzXSwgWyQyXSk7IH0KVDE1LDUKX200X2RpdmVydF9ncm93MTAwMDAKVDE3LDUwNApBQ19UWVBFX1VJTlRNQVhfVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19SRVFVSVJFKFtBQ19UWVBFX1VOU0lHTkVEX0xPTkdfTE9OR19JTlRdKQogIEFDX0NIRUNLX1RZUEUoW3VpbnRtYXhfdF0sCiAgICBbQUNfREVGSU5FKFtIQVZFX1VJTlRNQVhfVF0sIDEsCiAgICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVpbnRtYXhfdCcuXSldLAogICAgW3Rlc3QgJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nX2ludCA9IHllcyBcCiAgICAgICAmJiBhY190eXBlPSd1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBcCiAgICAgICB8fCBhY190eXBlPSd1bnNpZ25lZCBsb25nIGludCcKICAgICBBQ19ERUZJTkVfVU5RVU9URUQoW3VpbnRtYXhfdF0sIFskYWNfdHlwZV0sCiAgICAgICBbRGVmaW5lIHRvIHRoZSB3aWRlc3QgdW5zaWduZWQgaW50ZWdlciB0eXBlCglpZiA8c3RkaW50Lmg+IGFuZCA8aW50dHlwZXMuaD4gZG8gbm90IGRlZmluZS5dKV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMTk1CkFDX1RSWV9MSU5LX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9MSU5LJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbJDFdXSwgW1skMl1dKV0sIFskM10sIFskNF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMywzMAptNF9sb2NhdGlvbihfQUNfUEFUSF9YKS4uLy4uL2xpYi9hdXRvY29uZi9saWJzLm00OjI5NwpUMzUsMzMKbTRfbG9jYXRpb24oX0FDX0ZDX0xJQlJBUllfTERGTEFHUykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo2MzQKVDE1LDIzCkFTX0VYRUNVVEFCTEVfUGFzX2ZuX2V4ZWN1dGFibGVfcCAkMVtdClQxNSwxMjkKQVNfRVhFQ1VUQUJMRV9QX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19URVNUX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxODkKQUNfUFJPR1JBTV9DSEVDS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19QUk9HUkFNX0NIRUNLJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NIRUNLX1BST0ddLCBbQUNfQ0hFQ0tfUFJPRygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsOTg1CkFDX0ZVTkNfTUVNQ01QX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBtZW1jbXBdLCBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwgW1sKICAvKiBTb21lIHZlcnNpb25zIG9mIG1lbWNtcCBhcmUgbm90IDgtYml0IGNsZWFuLiAgKi8KICBjaGFyIGMwID0gJ1wxMDAnLCBjMSA9ICdcMjAwJywgYzIgPSAnXDIwMSc7CiAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCiAgICByZXR1cm4gMTsKCiAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCiAgICAgb3IgbW9yZSBhbmQgd2l0aCBhdCBsZWFzdCBvbmUgYnVmZmVyIG5vdCBzdGFydGluZyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KICAgICBXaWxsaWFtIExld2lzIHByb3ZpZGVkIHRoaXMgdGVzdCBwcm9ncmFtLiAgICovCiAgewogICAgY2hhciBmb29bMjFdOwogICAgY2hhciBiYXJbMjFdOwogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICB7CgljaGFyICphID0gZm9vICsgaTsKCWNoYXIgKmIgPSBiYXIgKyBpOwoJc3RyY3B5IChhLCAiLS0tLS0tLS0wMTExMTExMSIpOwoJc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOwoJaWYgKG1lbWNtcCAoYSwgYiwgMTYpID49IDApCgkgIHJldHVybiAxOwogICAgICB9CiAgICByZXR1cm4gMDsKICB9Cl1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm9dKV0pCnRlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBBQ19MSUJPQkooW21lbWNtcF0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMzEKbTRfbG9jYXRpb24oX0FDX0NIRUNLX1RZUEVfTkVXKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDoxNDgKVDI3LDI3Cm00X2xvY2F0aW9uKEFDX1BST0dfQ0NfQ19PKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjU2NwpUMTMsNTAKQUNfTVNHX1JFU1VMVHsgX0FTX0VDSE9fTE9HKFtyZXN1bHQ6ICQxXSkKX0FTX0VDSE8oWyQxXSk7IH1kbmwKClQyNSw2NwpBQ19MQU5HX0NPTkZURVNUKEZvcnRyYW4pY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpBQ19MQU5HX0RFRklORVNfUFJPVklERURbXSQxCl9BQ0VPRgpUMzIsMzQKbTRfbG9jYXRpb24oX0FDX0NBQ0hFX0NIRUNLX0lOVCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDY0ClQ2LDU5OAptNF9mb3JtNF9wdXNoZGVmKFskMV0sIG00X2V2YWwoWyQyXSkpbTRfY29uZChbbTRfZXZhbCgoWyQzXSkgPiAoWyQyXSkpXSwgMSwKCSAgIFttNF9wdXNoZGVmKFtfbTRfc3RlcF0sIG00X2V2YWwobTRfZGVmYXVsdF9xdW90ZWQoWyQ0XSwKCSAgICAgIDEpKSltNF9hc3NlcnQoX200X3N0ZXAgPiAwKV8kMChfbTRfZGVmbihbJDFdKSwKICBtNF9ldmFsKCgoWyQzXSkgLSAoWyQyXSkpIC8gX200X3N0ZXAgKiBfbTRfc3RlcCArIChbJDJdKSksIF9tNF9zdGVwLF0sCgkgW200X2V2YWwoKFskM10pIDwgKFskMl0pKV0sIDEsCgkgICBbbTRfcHVzaGRlZihbX200X3N0ZXBdLCBtNF9ldmFsKG00X2RlZmF1bHRfcXVvdGVkKFskNF0sCgkgICAgICAtMSkpKW00X2Fzc2VydChfbTRfc3RlcCA8IDApXyQwKF9tNF9kZWZuKFskMV0pLAogIG00X2V2YWwoKChbJDJdKSAtIChbJDNdKSkgLyAtKF9tNF9zdGVwKSAqIF9tNF9zdGVwICsgKFskMl0pKSwgX200X3N0ZXAsXSwKCSBbbTRfcHVzaGRlZihbX200X3N0ZXBdKV8kMChfbTRfZGVmbihbJDFdKSwgX200X2RlZm4oWyQxXSksIDAsXSlbbTRfZGVmaW5lKFskMV0sXSwgWykkNV0pbTRfcG9wZGVmKFtfbTRfc3RlcF0sIFskMV0pClQ4LDQyCl9BU19FQ0hPX0FTX0VDSE9fVU5RVU9URUQoW19BU19RVU9URShbJDFdKV0sIFskMl0pClQxNiwxNDM4Cl9BQ19QQVRIX1hfWE1LTUZBQ19BUkdfVkFSKFhNS01GLCBbUGF0aCB0byB4bWttZiwgTWFrZWZpbGUgZ2VuZXJhdG9yIGZvciBYIFdpbmRvdyBTeXN0ZW1dKWRubApybSAtZiAtciBjb25mdGVzdC5kaXIKaWYgbWtkaXIgY29uZnRlc3QuZGlyOyB0aGVuCiAgY2QgY29uZnRlc3QuZGlyCiAgY2F0ID5JbWFrZWZpbGUgPDwnX0FDRU9GJwppbmNyb290OgoJQGVjaG8gaW5jcm9vdD0nJHtJTkNST09UfScKdXNybGliZGlyOgoJQGVjaG8gdXNybGliZGlyPScke1VTUkxJQkRJUn0nCmxpYmRpcjoKCUBlY2hvIGxpYmRpcj0nJHtMSUJESVJ9JwpfQUNFT0YKICBpZiAoZXhwb3J0IENDOyAke1hNS01GLXhta21mfSkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJiB0ZXN0IC1mIE1ha2VmaWxlOyB0aGVuCiAgICAjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCiAgICBmb3IgYWNfdmFyIGluIGluY3Jvb3QgdXNybGliZGlyIGxpYmRpcjsgZG8KICAgICAgZXZhbCAiYWNfaW1fJGFjX3Zhcj1cYFwke01BS0UtbWFrZX0gJGFjX3ZhciAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy9eJGFjX3Zhcj0vL3AnXGAiCiAgICBkb25lCiAgICAjIE9wZW4gV2luZG93cyB4bWttZiByZXBvcnRlZGx5IHNldHMgTElCRElSIGluc3RlYWQgb2YgVVNSTElCRElSLgogICAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsIGR5bGliIGxhIGRsbDsgZG8KICAgICAgaWYgdGVzdCAhIC1mICIkYWNfaW1fdXNybGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIiAmJgoJIHRlc3QgLWYgIiRhY19pbV9saWJkaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCglhY19pbV91c3JsaWJkaXI9JGFjX2ltX2xpYmRpcjsgYnJlYWsKICAgICAgZmkKICAgIGRvbmUKICAgICMgU2NyZWVuIG91dCBib2d1cyB2YWx1ZXMgZnJvbSB0aGUgaW1ha2UgY29uZmlndXJhdGlvbi4gIFRoZXkgYXJlCiAgICAjIGJvZ3VzIGJvdGggYmVjYXVzZSB0aGV5IGFyZSB0aGUgZGVmYXVsdCBhbnl3YXksIGFuZCBiZWNhdXNlCiAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCiAgICBjYXNlICRhY19pbV9pbmNyb290IGluCgkvdXNyL2luY2x1ZGUpIGFjX3hfaW5jbHVkZXM9IDs7CgkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9JGFjX2ltX2luY3Jvb3Q7OwogICAgZXNhYwogICAgY2FzZSAkYWNfaW1fdXNybGliZGlyIGluCgkvdXNyL2xpYiB8IC91c3IvbGliNjQgfCAvbGliIHwgL2xpYjY0KSA7OwoJKikgdGVzdCAtZCAiJGFjX2ltX3VzcmxpYmRpciIgJiYgYWNfeF9saWJyYXJpZXM9JGFjX2ltX3VzcmxpYmRpciA7OwogICAgZXNhYwogIGZpCiAgY2QgLi4KICBybSAtZiAtciBjb25mdGVzdC5kaXIKZmkKClQxMCw3OTIKQUNfUFJPR19HT19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goR28pZG5sCkFDX0FSR19WQVIoW0dPQ10sICAgW0dvIGNvbXBpbGVyIGNvbW1hbmRdKWRubApBQ19BUkdfVkFSKFtHT0ZMQUdTXSwgW0dvIGNvbXBpbGVyIGZsYWdzXSlkbmwKX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCm00X2lmdmFsKFskMV0sCiAgICAgIFtBQ19DSEVDS19UT09MUyhHT0MsIFskMV0pXSwKW0FDX0NIRUNLX1RPT0woR09DLCBnY2NnbykKaWYgdGVzdCAteiAiJEdPQyI7IHRoZW4KICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgICBBQ19DSEVDS19QUk9HKEdPQywgWyR7YWNfdG9vbF9wcmVmaXh9Z2NjZ29dLCBbJGFjX3Rvb2xfcHJlZml4fWdjY2dvXSkKICBmaQpmaQppZiB0ZXN0IC16ICIkR09DIjsgdGhlbgogIEFDX0NIRUNLX1BST0coR09DLCBnY2NnbywgZ2NjZ28sICwgLCBmYWxzZSkKZmkKXSkKCiMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KX0FTX0VDSE9fTE9HKFtjaGVja2luZyBmb3IgX0FDX0xBTkcgY29tcGlsZXIgdmVyc2lvbl0pCnNldCBYICRhY19jb21waWxlCmFjX2NvbXBpbGVyPSRbMl0KX0FDX0RPX0xJTUlUKFskYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mQVNfTUVTU0FHRV9MT0dfRkRdKQptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW11kbmwKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9PQkpFWFRdKVtdZG5sCkdPRkxBR1M9Ii1nIC1PMiIKQUNfTEFOR19QT1AoR28pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxNTIKQUNfUFJFUkVRbTRfaWYobTRfdmVyc2lvbl9jb21wYXJlKFsyLjY5XSwgWyQxXSksCglbLTFdLAoJW200X2RlZmF1bHQoWyQzXSwKCQkgICAgW200X2ZhdGFsKFtBdXRvY29uZiB2ZXJzaW9uICQxIG9yIGhpZ2hlciBpcyByZXF1aXJlZF0sCgkJCSAgICAgIFs2M10pXSldLAoJWyQyXSkKVDI1LDI5Cm00X2xvY2F0aW9uKF9BU19FQ0hPX0xPRykuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00Ojc5MApUMTQsMTU3NApfQUNfQ0hFQ0tfUFJPR19tNF9kZWZ1bl9wcm8oWyQwXSkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4Kc2V0IGR1bW15ICQyOyBhY193b3JkPSRbMl0KQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQpBQ19DQUNIRV9WQUwoYWNfY3ZfcHJvZ18kMSwKW2lmIHRlc3QgLW4gIiQkMSI7IHRoZW4KICBhY19jdl9wcm9nXyQxPSIkJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgplbHNlCm00X2lmdmFsbihbJDZdLApbICBhY19wcm9nX3JlamVjdGVkPW5vXSlkbmwKX0FTX1BBVEhfV0FMSyhbJDVdLApbZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgaWYgQVNfRVhFQ1VUQUJMRV9QKFsiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCJdKTsgdGhlbgptNF9pZnZhbG4oWyQ2XSwKWyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIkNiI7IHRoZW4KICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCiAgICAgICBjb250aW51ZQogICAgIGZpXSlkbmwKICAgIGFjX2N2X3Byb2dfJDE9IiQzIgogICAgX0FTX0VDSE9fTE9HKFtmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0XSkKICAgIGJyZWFrIDIKICBmaQpkb25lXSkKbTRfaWZ2YWxuKFskNl0sCltpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCiAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgogIHNldCBkdW1teSAkYWNfY3ZfcHJvZ18kMQogIHNoaWZ0CiAgaWYgdGVzdCAkW0AlOkBdICE9IDA7IHRoZW4KICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgogICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgogICAgIyBmaXJzdCBpZiB3ZSBzZXQgJDEgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCiAgICBzaGlmdAogICAgYWNfY3ZfcHJvZ18kMT0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JFtAXSIKbTRfaWYoWyQyXSwgWyQ0XSwKWyAgZWxzZQogICAgIyBEZWZhdWx0IGlzIGEgbG9zZXIuCiAgICBBQ19NU0dfRVJST1IoWyQxPSQ2IHVuYWNjZXB0YWJsZSwgYnV0IG5vIG90aGVyICQ0IGZvdW5kIGluIGRubAptNF9kZWZhdWx0KFskNV0sIFtcJFBBVEhdKV0pCl0pZG5sCiAgZmkKZmldKWRubApkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LApkbmwgc28gQUNfQ0hFQ0tfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCm00X2lmdmFsbihbJDRdLApbICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ18kMSIgJiYgYWNfY3ZfcHJvZ18kMT0iJDQiXSlkbmwKZmldKWRubAokMT0kYWNfY3ZfcHJvZ18kMQppZiB0ZXN0IC1uICIkJDEiOyB0aGVuCiAgQUNfTVNHX1JFU1VMVChbJCQxXSkKZWxzZQogIEFDX01TR19SRVNVTFQoW25vXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwzNgptNF9sb2NhdGlvbihBQ19GVU5DX1ZQUklOVEYpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxOTU1ClQzMywwCm00X2luY2x1ZGUoYXV0b2NvbmYvZnVuY3Rpb25zLm00KQpUMTcsMTg1Cl9BU19UUl9TSF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19DUl9QUkVQQVJFXSkjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVtbXl8kYXNfY3JfYWxudW1dXSVfJWcnIgpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDExMApfQVNfQ0xFQU5fRElSaWYgdGVzdCAtZCAkMTsgdGhlbgogIGZpbmQgJDEgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDsKICBybSAtZnIgJDEvKiAkMS8uW1shLl1dICQxLy4/PyoKZmkKVDIwLDE4MQpBU19GVU5DVElPTl9ERVNDUklCRUAlOkAgJDFbXW00X2lmdmFsKFskMl0sIFsgJDJdKQpAJTpAIG00X3RyYW5zbGl0KG00X2Zvcm1hdChbJSpzXSwKCSAgIG00X2RlY3IobTRfcWxlbihfbTRfZXhwYW5kKFskMVtdbTRfaWZ2YWwoWyQyXSwgWyAkMl0pCl0pKSksIFtdKSwgWyBdLCBbLV0pCm00X3RleHRfd3JhcChbJDNdLCBbQCU6QCBdLCBbXSwgWyQ0XSkKVDM0LDEwMjAKQUNfTEFOR19GVU5DX0xJTktfVFJZKE9iamVjdGl2ZSBDKUFDX0xBTkdfUFJPR1JBTSgKWy8qIERlZmluZSAkMSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQxLgogICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KI2RlZmluZSAkMSBpbm5vY3VvdXNfJDEKCi8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDEgKCk7IGJlbG93LgogICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KCiNpZmRlZiBfX1NURENfXwojIGluY2x1ZGUgPGxpbWl0cy5oPgojZWxzZQojIGluY2x1ZGUgPGFzc2VydC5oPgojZW5kaWYKCiN1bmRlZiAkMQoKLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMSAoKTsKLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwojaWYgZGVmaW5lZCBfX3N0dWJfJDEgfHwgZGVmaW5lZCBfX3N0dWJfX18kMQpjaG9rZSBtZQojZW5kaWYKXSwgW3JldHVybiAkMSAoKTtdKQpUMTMsMTU4NQpBQ19DQUNIRV9TQVZFY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCiMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQojIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAojIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KIwojIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAojIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KIwojIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQojIGZvbGxvd2luZyB2YWx1ZXMuCgpfQUNFT0YKCl9BQ19DQUNIRV9EVU1QKCkgfAogIHNlZCBbJwogICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAogICAgIHQgY2xlYXIKICAgICA6Y2xlYXIKICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCiAgICAgdCBlbmQKICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KICAgICA6ZW5kJ10gPj5jb25mY2FjaGUKaWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQogIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgogICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KICAgICAgQUNfTVNHX05PVElDRShbdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGVdKQogICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKICAgICAgZWxzZQpkbmwgVHJ5IHRvIHVwZGF0ZSB0aGUgY2FjaGUgZmlsZSBhdG9taWNhbGx5IGV2ZW4gb24gZGlmZmVyZW50IG1vdW50IHBvaW50czsKZG5sIGF0IHRoZSBzYW1lIHRpbWUsIGF2b2lkIGZpbGVuYW1lIGxpbWl0YXRpb24gaXNzdWVzIGluIHRoZSBjb21tb24gY2FzZS4KICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCiAgICAgICAgKi8qIHwgPzoqKQoJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCgkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCiAgICAgICAgKikKCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKCWVzYWMKICAgICAgZmkKICAgIGZpCiAgZWxzZQogICAgQUNfTVNHX05PVElDRShbbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGVdKQogIGZpCmZpCnJtIC1mIGNvbmZjYWNoZVtdZG5sCgpUMTYsMjk4Cm00X21hcF9hcmdzX3BhaXJtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkI10pXSwKICAgICAgIFskI10sIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKICAgICAgIFskI10sIFsyXSwgW10sCiAgICAgICBbJCNdLCBbM10sIFttNF9kZWZhdWx0KFskMl0sIFskMV0pKFskM10pW11dLAogICAgICAgWyQjXSwgWzRdLCBbJDEoWyQzXSwgWyQ0XSlbXV0sCiAgICAgICBbJDEoWyQzXSwgWyQ0XSlbXSQwKFskMV0sIFskMl0sIG00X3NoaWZ0KG00X3NoaWZ0MygkQCkpKV0pClQyNSwzNAptNF9sb2NhdGlvbihBQ19NU0dfRVJST1IpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjI0OQpUMTgsMQpfbTRfZGl2ZXJ0KE5PVElDRSk2ClQxMiwxODMKQUNfRklORF9YVFJBX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0ZJTkRfWFRSQScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QQVRIX1hUUkFdLCBbQUNfUEFUSF9YVFJBKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw5NApBQ19DSEVDS19ERUNMU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc19zZXAoW18kMChdLCBbLCBbJDJdLCBbJDNdLCBbJDRdKV0sIFtdLCAkMSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDI2Cm00X2xvY2F0aW9uKEFDX0xBTkdfQykuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo3MgpUMjcsMQpfbTRfZGl2ZXJ0KEhFQURFUi1SRVZJU0lPTikxClQxNywzNDAKQUNfU1RSVUNUX1NUX1JERVZfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RSVUNUX1NUX1JERVYnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X3JkZXZdLAoJCSBbQUNfREVGSU5FKEhBVkVfU1RfUkRFViwgMSwKCQkJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIGBzdHJ1Y3Qgc3RhdCcgaGFzIGBzdF9yZGV2Jy4KCQkJICAgICBEZXByZWNhdGVkLCB1c2UgYEhBVkVfU1RSVUNUX1NUQVRfU1RfUkRFVicKCQkJICAgICBpbnN0ZWFkLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwxMDM3CkFDX0NBTk9OSUNBTF9UQVJHRVRfbTRfZGVmdW5fb25jZShbQUNfQ0FOT05JQ0FMX1RBUkdFVF0sIFtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCkFDX0JFRk9SRShbJDBdLCBbQUNfQVJHX1BST0dSQU1dKWRubAptNF9kaXZlcnRfb25jZShbSEVMUF9DQU5PTl0sCltbICAtLXRhcmdldD1UQVJHRVQgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIGNvbXBpbGVycyBmb3IgVEFSR0VUIFtIT1NUXV1dKWRubApBQ19DQUNIRV9DSEVDSyhbdGFyZ2V0IHN5c3RlbSB0eXBlXSwgW2FjX2N2X3RhcmdldF0sCltpZiB0ZXN0ICJ4JHRhcmdldF9hbGlhcyIgPSB4OyB0aGVuCiAgYWNfY3ZfdGFyZ2V0PSRhY19jdl9ob3N0CmVsc2UKICBhY19jdl90YXJnZXQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJHRhcmdldF9hbGlhc2AgfHwKICAgIEFDX01TR19FUlJPUihbJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJHRhcmdldF9hbGlhcyBmYWlsZWRdKQpmaQpdKQpfQUNfQ0FOT05JQ0FMX1NQTElUKFt0YXJnZXRdKQoKIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgojIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCnRlc3QgLW4gIiR0YXJnZXRfYWxpYXMiICYmCiAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAogICAgTk9ORU5PTkVzLHgseCwgJiYKICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tW11kbmwKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0NBTk9OSUNBTF9UQVJHRVRdKW00X3VucXVvdGUoXSwgWylfbTRfZGVmdW5fZXBpKFtBQ19DQU5PTklDQUxfVEFSR0VUXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0NBTk9OSUNBTF9UQVJHRVRdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19DQU5PTklDQUxfVEFSR0VUXSxdLCBbLCBfbTRfZGl2ZXJ0X2R1bXApXV0pKQpUMzEsMzUKbTRfbG9jYXRpb24oX0FDX0ZVTkNfTUFMTE9DX0lGKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6ODg3ClQxMywxOTYKQUNfR0VUTE9BREFWR19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19HRVRMT0FEQVZHJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfR0VUTE9BREFWR10sIFtBQ19GVU5DX0dFVExPQURBVkcoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDIKQUNfTEFOR19TT1VSQ0UoQysrKSQxClQyOCwzMQptNF9sb2NhdGlvbihBQ19UWVBFX0lOVDY0X1QpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjYyNwpUMTQsMTUwNwpBQ19IRUFERVJfU1REQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhmb3IgQU5TSSBDIGhlYWRlciBmaWxlcywgYWNfY3ZfaGVhZGVyX3N0ZGMsCltBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGZsb2F0Lmg+Cl1dKV0sCgkJICAgIFthY19jdl9oZWFkZXJfc3RkYz15ZXNdLAoJCSAgICBbYWNfY3ZfaGVhZGVyX3N0ZGM9bm9dKQoKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCiAgQUNfRUdSRVBfSEVBREVSKG1lbWNociwgc3RyaW5nLmgsICwgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8pCmZpCgppZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KICBBQ19FR1JFUF9IRUFERVIoZnJlZSwgc3RkbGliLmgsICwgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8pCmZpCgppZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRSgKW1sjaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCiMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQojZWxzZQojIGRlZmluZSBJU0xPV0VSKGMpIFwKCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAoJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAoJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCiMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCiNlbmRpZgoKI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKaW50Cm1haW4gKCkKewogIGludCBpOwogIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQogICAgICByZXR1cm4gMjsKICByZXR1cm4gMDsKfV1dKV0sICwgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8sIDopCmZpXSkKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU1REQ19IRUFERVJTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDE0MwpBQ19GQ19XUkFQUEVSU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtfQUNfRkNfTkFNRV9NQU5HTElOR10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuKWRubApfQUNfRkNfV1JBUFBFUlMKQUNfTEFOR19QT1AoRm9ydHJhbilkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxMjQKQVNfTUVTU0FHRW00X2lmdmFsKEFTX01FU1NBR0VfTE9HX0ZELAoJICBbeyBfQVNfRUNIT19MT0coWyQxXSkKX0FTX0VDSE8oWyRhc19tZTogJDFdLCBbJDJdKTt9XSwKCSAgW19BU19FQ0hPKFskYXNfbWU6ICQxXSwgWyQyXSldKVtdW10KVDEwLDEyNwpBU19NRVNTQUdFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19NRV9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNTYKQUNfVFlQRV9JTlQxNl9UX200X2RlZnVuX3BybyhbJDBdKV9BQ19UWVBFX0lOVCgxNilbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDE3OApBQ19URVNUX0NQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19URVNUX0NQUCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19UUllfQ1BQXSwgW0FDX1RSWV9DUFAoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDI4Cm00X2xvY2F0aW9uKEFDX0NfVFlQRU9GKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjE5MDMKVDE2LDI2NQpBQ19MQU5HKEZvcnRyYW4pYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9CmFjX2NvbXBpbGU9JyRGQyAtYyAkRkNGTEFHUyAkYWNfZmNmbGFnc19zcmNleHQgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19saW5rPSckRkMgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGQ0ZMQUdTICRMREZMQUdTICRhY19mY2ZsYWdzX3NyY2V4dCBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZmNfY29tcGlsZXJfZ251CgpUMzIsMjcKbTRfbG9jYXRpb24oX0FDX0FSR19WQVJfTERGTEFHUykuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDozMTgKVDM0LDMzCm00X2xvY2F0aW9uKEFDX1NUQVRfTUFDUk9TX0JST0tFTikuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NzQKVDI0LDM0Cm00X2xvY2F0aW9uKEFDX1BST0dfU0VEKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo4NjcKVDI1LDI3Cm00X2xvY2F0aW9uKEFDX1BST0dfT0JKQykuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo4NzEKVDI1LDM0Cm00X2xvY2F0aW9uKEFDX0lTQ19QT1NJWCkuLi8uLi9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6NDQ2ClQxNiwyNwpfQVNfQ0FTRV9ERUZBVUxUIFtAJTpAKF0KICAqWyldIDoKICAgICQxIDs7ClQ3LDMwCkFTX1dBUk5BU19NRVNTQUdFKFtXQVJOSU5HOiAkMV0sIFsyXSkKVDI4LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfVUlOVDhfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjI4ClQzMCwzMgptNF9sb2NhdGlvbihBQ19DT05GSUdfSEVBREVSUykuLi8uLi9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjcxMwpUMTgsMTI3Cl9BQ19DSEVDS19UWVBFX09MRF9BQ19DSEVDS19UWVBFX05FVyhbJDFdLCwKICAgW0FDX0RFRklORV9VTlFVT1RFRChbJDFdLCBbJDJdLAoJCSAgICAgICBbRGVmaW5lIHRvIGAkMicgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuXSldKWRubAoKVDE2LDY1CkFDX1RZUEVfVUlOVDMyX1RfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1RZUEVfVU5TSUdORURfSU5UKDMyKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsNjEKQUNfUkVQTEFDRV9GVU5DU19tNF9kZWZ1bl9wcm8oWyQwXSlfJDAobTRfZmxhdHRlbihbJDFdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDExMgpfQUNfQ0FDSEVfQ0hFQ0tfSU5UX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCiAgIFtBQ19DT01QVVRFX0lOVChbJDJdLCBbJDNdLCBbJDRdLCBbJDVdKV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNjQKQUNfVFlQRV9VSU5UOF9UX200X2RlZnVuX3BybyhbJDBdKV9BQ19UWVBFX1VOU0lHTkVEX0lOVCg4KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMjkKbTRfbG9jYXRpb24oX0FTX0JBU0VOQU1FX0VYUFIpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo5MjEKVDE3LDQ5MApfQVNfVFJfU0hfTElURVJBTG00X3RyYW5zbGl0KFtbJDFdXSwKICBbKitbXV1bAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzo7PD0+P0BbXF1eYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tXSwKICBbcHBbXV1bX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXSkKVDEwLDY2Cl9BU19FQ0hPX05BU19FQ0hPX04oWyJfQVNfUVVPVEUoWyQxXSkiXSkgPiZtNF9kZWZhdWx0KFskMl0sIFtBU19NRVNTQUdFX0ZEXSkKVDcsMzYKbTRfc2lnbm00X2V2YWwoKChbJDFdKSA+IDApIC0gKChbJDFdKSA8IDApKQpUMjAsMwpfbTRfZGl2ZXJ0KEhFTFBfVkFSKTEwNApUMTUsODY0Cl9BQ19PVVRQVVRfTElOSwogICMKICAjIENPTkZJR19MSU5LCiAgIwoKICBpZiB0ZXN0ICIkYWNfc291cmNlIiA9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJHNyY2RpciIgPSAnLic7IHRoZW4KICAgIDoKICBlbHNlCiAgICAjIFByZWZlciB0aGUgZmlsZSBmcm9tIHRoZSBzb3VyY2UgdHJlZSBpZiBuYW1lcyBhcmUgaWRlbnRpY2FsLgogICAgaWYgdGVzdCAiJGFjX3NvdXJjZSIgPSAiJGFjX2ZpbGUiIHx8IHRlc3QgISAtciAiJGFjX3NvdXJjZSI7IHRoZW4KICAgICAgYWNfc291cmNlPSRzcmNkaXIvJGFjX3NvdXJjZQogICAgZmkKCiAgICBBQ19NU0dfTk9USUNFKFtsaW5raW5nICRhY19zb3VyY2UgdG8gJGFjX2ZpbGVdKQoKICAgIGlmIHRlc3QgISAtciAiJGFjX3NvdXJjZSI7IHRoZW4KICAgICAgQUNfTVNHX0VSUk9SKFskYWNfc291cmNlOiBmaWxlIG5vdCBmb3VuZF0pCiAgICBmaQogICAgcm0gLWYgIiRhY19maWxlIgoKICAgICMgVHJ5IGEgcmVsYXRpdmUgc3ltbGluaywgdGhlbiBhIGhhcmQgbGluaywgdGhlbiBhIGNvcHkuCiAgICBjYXNlICRhY19zb3VyY2UgaW4KICAgIFtbXFwvJF1dKiB8ID86W1tcXC9dXSogKSBhY19yZWxfc291cmNlPSRhY19zb3VyY2UgOzsKCSopIGFjX3JlbF9zb3VyY2U9JGFjX3RvcF9idWlsZF9wcmVmaXgkYWNfc291cmNlIDs7CiAgICBlc2FjCiAgICBsbiAtcyAiJGFjX3JlbF9zb3VyY2UiICIkYWNfZmlsZSIgMj4vZGV2L251bGwgfHwKICAgICAgbG4gIiRhY19zb3VyY2UiICIkYWNfZmlsZSIgMj4vZGV2L251bGwgfHwKICAgICAgY3AgLXAgIiRhY19zb3VyY2UiICIkYWNfZmlsZSIgfHwKICAgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgbGluayBvciBjb3B5ICRhY19zb3VyY2UgdG8gJGFjX2ZpbGVdKQogIGZpCgpUMTYsMTg3CkFDX1BST0dSQU1fRUdSRVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUFJPR1JBTV9FR1JFUCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19FR1JFUF9DUFBdLCBbQUNfRUdSRVBfQ1BQKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxMTcKQUNfTEFOR19DT01QSUxFUkFDX0JFRk9SRShbQUNfTEFOR19DT01QSUxFUihdX0FDX0xBTkdbKV0sCgkgICBbQUNfTEFOR19QUkVQUk9DKF1fQUNfTEFOR1spXSlkbmwKX0FDX0xBTkdfRElTUEFUQ0goWyQwXSwgX0FDX0xBTkcsICRAKQpUMjIsMzMKbTRfbG9jYXRpb24oQUNfRkRfTVNHKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjM4NApUMzMsMzQKbTRfbG9jYXRpb24oQUNfRjc3X0lNUExJQ0lUX05PTkUpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTY3NQpUMjUsNTMKX200X2V4cGFuc2lvbl9zdGFja19lbnRyeV9tNF9kZWZuKFttNF9sb2NhdGlvbigkMSldKVs6ICQxIGlzIGV4cGFuZGVkIGZyb20uLi5dClQxOSwxOTEKX0FTX0RJUk5BTUVfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfRVhQUl9QUkVQQVJFXSlpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBhc19kaXJuYW1lPWRpcm5hbWUKZWxzZQogIGFzX2Rpcm5hbWU9ZmFsc2UKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywzNjkKX0FDX0lOSVRfRElSQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGl2ZXJ0X3B1c2goW1BBUlNFX0FSR1NdKWRubAoKYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCmFjX2xzX2RpPWBscyAtZGkgLmAgJiYKYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CiAgQUNfTVNHX0VSUk9SKFt3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZF0pCnRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAogIEFDX01TR19FUlJPUihbcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5XSkKCm00X2RpdmVydF9wb3AoW1BBUlNFX0FSR1NdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDIyNApBQ19SRVNUQVJUQUJMRV9TWVNDQUxMU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19SRVNUQVJUQUJMRV9TWVNDQUxMUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19TWVNfUkVTVEFSVEFCTEVfU1lTQ0FMTFNdLCBbQUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywxNTgwCkFDX0ZVTkNfV0FJVDNfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwKWyQwOiBgd2FpdDMnIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBQT1NJWC4KUmVtb3ZlIHRoaXMgYEFDX0ZVTkNfV0FJVDMnIGFuZCBhZGp1c3QgeW91ciBjb2RlIHRvIHVzZSBgd2FpdHBpZCcgaW5zdGVhZC5dKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIHdhaXQzIHRoYXQgZmlsbHMgaW4gcnVzYWdlXSwKCSAgICAgICBbYWNfY3ZfZnVuY193YWl0M19ydXNhZ2VdLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoCltBQ19JTkNMVURFU19ERUZBVUxUWwojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KLyogSFAtVVggaGFzIHdhaXQzIGJ1dCBkb2VzIG5vdCBmaWxsIGluIHJ1c2FnZSBhdCBhbGwuICAqLwppbnQKbWFpbiAoKQp7CiAgc3RydWN0IHJ1c2FnZSByOwogIGludCBpOwogIC8qIFVzZSBhIGZpZWxkIHRoYXQgd2UgY2FuIGZvcmNlIG5vbnplcm8gLS0KICAgICB2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcy4KICAgICBGb3Igc3lzdGVtcyBsaWtlIE5lWFQgYW5kIE9TRi8xIHRoYXQgZG9uJ3Qgc2V0IGl0LAogICAgIGFsc28gdXNlIHRoZSBzeXN0ZW0gQ1BVIHRpbWUuICBBbmQgcGFnZSBmYXVsdHMgKEkvTykgZm9yIExpbnV4LiAgKi8KICByLnJ1X252Y3N3ID0gMDsKICByLnJ1X3N0aW1lLnR2X3NlYyA9IDA7CiAgci5ydV9zdGltZS50dl91c2VjID0gMDsKICByLnJ1X21hamZsdCA9IHIucnVfbWluZmx0ID0gMDsKICBzd2l0Y2ggKGZvcmsgKCkpCiAgICB7CiAgICBjYXNlIDA6IC8qIENoaWxkLiAgKi8KICAgICAgc2xlZXAoMSk7IC8qIEdpdmUgdXAgdGhlIENQVS4gICovCiAgICAgIF9leGl0KDApOwogICAgICBicmVhazsKICAgIGNhc2UgLTE6IC8qIFdoYXQgY2FuIHdlIGRvPyAgKi8KICAgICAgX2V4aXQoMCk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDogLyogUGFyZW50LiAgKi8KICAgICAgd2FpdDMoJmksIDAsICZyKTsKICAgICAgLyogQXZvaWQgInRleHQgZmlsZSBidXN5IiBmcm9tIHJtIG9uIGZhc3QgSFAtVVggbWFjaGluZXMuICAqLwogICAgICBzbGVlcCgyKTsKICAgICAgcmV0dXJuIChyLnJ1X252Y3N3ID09IDAgJiYgci5ydV9tYWpmbHQgPT0gMCAmJiByLnJ1X21pbmZsdCA9PSAwCgkgICAgICAmJiByLnJ1X3N0aW1lLnR2X3NlYyA9PSAwICYmIHIucnVfc3RpbWUudHZfdXNlYyA9PSAwKTsKICAgIH0KfV1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfd2FpdDNfcnVzYWdlPXllc10sCgkgICAgICAgW2FjX2N2X2Z1bmNfd2FpdDNfcnVzYWdlPW5vXSwKCSAgICAgICBbYWNfY3ZfZnVuY193YWl0M19ydXNhZ2U9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfd2FpdDNfcnVzYWdlID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfV0FJVDMsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdDMnIHN5c3RlbSBjYWxsLgoJICAgICBEZXByZWNhdGVkLCB5b3Ugc2hvdWxkIG5vIGxvbmdlciBkZXBlbmQgdXBvbiBgd2FpdDMnLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzIsMzQKbTRfbG9jYXRpb24oQUNfQ09ORklHX01BQ1JPX0RJUikuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNzMxClQxNSwyOTEKX0FDX0NIRUNLX0RFQ0xTQUNfQ0hFQ0tfREVDTChbJDFdLCBbYWNfaGF2ZV9kZWNsPTFdLCBbYWNfaGF2ZV9kZWNsPTBdLCBbJDRdKUFDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAobTRfYnBhdHN1YnN0KEhBVkVfREVDTF9bJDFdLFsgKiguKl0pKSwKICBbJGFjX2hhdmVfZGVjbF0sCiAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgJDEnLAogICBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuXSltNF9pZnZhbG4oWyQyJDNdLCBbQVNfSUYoW3Rlc3QgJGFjX2hhdmVfZGVjbCA9IDFdLCBbJDJdLCBbJDNdKV0pClQxNiw1MTQKQUNfSEVBREVSX0RJUkVOVF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJncyhbX0FIX0NIRUNLX0hFQURFUl9ESVJFTlRdLCBbZGlyZW50LmhdLCBbc3lzL25kaXIuaF0sCgkgICAgIFtzeXMvZGlyLmhdLCBbbmRpci5oXSlhY19oZWFkZXJfZGlyZW50PW5vCmZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oOyBkbwogIF9BQ19DSEVDS19IRUFERVJfRElSRU5UKCRhY19oZHIsCgkJCSAgW0FDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoSEFWRV8kYWNfaGRyKSwgMSkKYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVha10pCmRvbmUKIyBUd28gdmVyc2lvbnMgb2Ygb3BlbmRpciBldCBhbC4gYXJlIGluIC1sZGlyIGFuZCAtbHggb24gU0NPIFhlbml4LgppZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KICBBQ19TRUFSQ0hfTElCUyhvcGVuZGlyLCBkaXIpCmVsc2UKICBBQ19TRUFSQ0hfTElCUyhvcGVuZGlyLCB4KQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDIKX0FTX0xJVEVSQUxfSEVSRURPQ19JRl9ZRVMkMQpUMzYsMjMKX0FDX0xBTkdfTlVMTF9QUk9HUkFNKE9iamVjdGl2ZSBDKyspQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDI5LDMwCl9BQ19MQU5HX05VTExfUFJPR1JBTShFcmxhbmcpQUNfTEFOR19QUk9HUkFNKFtdLCBbaGFsdCgwKV0pClQxMiw0NDgKQUNfRUdSRVBfQ1BQX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfUFJFUFJPQ19SRVFVSVJFKClkbmwKQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCkFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfU09VUkNFKFtbJDJdXSldKQpBU19JRihbZG5sIGV2YWwgaXMgbmVjZXNzYXJ5IHRvIGV4cGFuZCBhY19jcHAuCmRubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCihldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiZBU19NRVNTQUdFX0xPR19GRCB8CmRubCBRdW90ZSAkMSB0byBwcmV2ZW50IG00IGZyb20gZWF0aW5nIGNoYXJhY3RlciBjbGFzc2VzCiAgJEVHUkVQICJbJDFdIiA+L2Rldi9udWxsIDI+JjFdLAogIFskM10sCiAgWyQ0XSkKcm0gLWYgY29uZnRlc3QqCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNjIxCkFDX0NIRUNLX0xJQl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZnZhbChbJDNdLCAsIFtBSF9DSEVDS19MSUIoWyQxXSldKWRubApBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwKCSAgICAgIFtBU19WQVJfUFVTSERFRihbYWNfTGliXSwgW2FjX2N2X2xpYl8kMV8kMl0pXSwKCSAgICAgIFtBU19WQVJfUFVTSERFRihbYWNfTGliXSwgW2FjX2N2X2xpYl8kMScnXyQyXSldKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yICQyIGluIC1sJDFdLCBbYWNfTGliXSwKW2FjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKTElCUz0iLWwkMSAkNSAkTElCUyIKQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfQ0FMTChbXSwgWyQyXSldLAoJICAgICAgIFtBU19WQVJfU0VUKFthY19MaWJdLCBbeWVzXSldLAoJICAgICAgIFtBU19WQVJfU0VUKFthY19MaWJdLCBbbm9dKV0pCkxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlNdKQpBU19WQVJfSUYoW2FjX0xpYl0sIFt5ZXNdLAogICAgICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FX1VOUVVPVEVEKEFTX1RSX0NQUChIQVZFX0xJQiQxKSkKICBMSUJTPSItbCQxICRMSUJTIgpdKV0sCiAgICAgIFskNF0pCkFTX1ZBUl9QT1BERUYoW2FjX0xpYl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMzAKbTRfbG9jYXRpb24oQUNfTEFOR19TQVZFKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEyNQpUMTQsMTU5CmFjX2N2X3Byb2dfZzc3X200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYGFjX2N2X3Byb2dfZzc3JyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAphY19jdl9mNzdfY29tcGlsZXJfZ251W11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw4MzQKX0FDX1BST0dfQ1hYX0dhY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQphY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUwpBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggYWNjZXB0cyAtZywgYWNfY3ZfcHJvZ19jeHhfZywKICBbYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWc9JGFjX2N4eF93ZXJyb3JfZmxhZwogICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCiAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KICAgQ1hYRkxBR1M9Ii1nIgogICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKICAgICBbYWNfY3ZfcHJvZ19jeHhfZz15ZXNdLAogICAgIFtDWFhGTEFHUz0iIgogICAgICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKCVtdLAoJW2FjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKCSBDWFhGTEFHUz0iLWciCgkgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCgkgICBbYWNfY3ZfcHJvZ19jeHhfZz15ZXNdKV0pXSkKICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZ10pCmlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgogIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCmVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgogIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCiAgICBDWFhGTEFHUz0iLWcgLU8yIgogIGVsc2UKICAgIENYWEZMQUdTPSItZyIKICBmaQplbHNlCiAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KICAgIENYWEZMQUdTPSItTzIiCiAgZWxzZQogICAgQ1hYRkxBR1M9CiAgZmkKZmlbXWRubAoKVDIxLDE1OQpfQUNfSEVBREVSU19FWFBBTlNJT04KICBtNF9kaXZlcnRfdGV4dChbREVGQVVMVFNdLCBbYWNfaGVhZGVyX2xpc3Q9XSkKICBBQ19DSEVDS19IRUFERVJTKFskYWNfaGVhZGVyX2xpc3RdLCBbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSkKICBtNF9kZWZpbmUoW19BQ19IRUFERVJTX0VYUEFOU0lPTl0sIFtdKQoKVDI0LDcyCl9BQ19DT05GSUdfQ09NTUFORFNfSU5JVG00X2lmdmFsKFskMV0sCgkgIFttNF9hcHBlbmQoW19BQ19PVVRQVVRfQ09NTUFORFNfSU5JVF0sCgkJICAgICBbJDEKXSldKQpUMTQsMTMzCkFDX1BST0dfRkNfQ19PX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfRkNdKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX0FDX1BST0dfRkNfQ19PCkFDX0xBTkdfUE9QKEZvcnRyYW4pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9JTlRQVFJfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzQ0ClQyNiwzMwptNF9sb2NhdGlvbihBQ19ESVJfSEVBREVSKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00Ojg4MwpUMTQsNzgKQUNfVFJZX0NPTU1BTkRfbTRfZGVmdW5fcHJvKFskMF0peyBhY190cnk9JyQxJwogIF9BQ19FVkFMKFskYWNfdHJ5XSk7IH1bXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDMyMApfQUNfTElTVF9NRU1CRVJfSUZfbTRfZGVmdW5fcHJvKFskMF0pbTRfaWYoWyQxXSwgLCBbbTRfZmF0YWwoWyQwOiBtaXNzaW5nIGFyZ3VtZW50IDFdKV0sCiAgICAgIFskMl0sICwgW200X2ZhdGFsKFskMDogbWlzc2luZyBhcmd1bWVudCAyXSldKSAgYWNfZXhpc3RzPWZhbHNlCiAgZm9yIGFjX2kgaW4gJDI7IGRvCiAgICBpZiB0ZXN0IHgiJDEiID0geCIkYWNfaSI7IHRoZW4KICAgICAgYWNfZXhpc3RzPXRydWUKICAgICAgYnJlYWsKICAgIGZpCiAgZG9uZQoKICBBU19JRihbdGVzdCB4IiRhY19leGlzdHMiID0geHRydWVdLCBbJDNdLCBbJDRdKVtdZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsNjE5CkFDX1RZUEVfSU5UUFRSX1RfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0hFQ0tfVFlQRShbaW50cHRyX3RdLAogICAgW0FDX0RFRklORShbSEFWRV9JTlRQVFJfVF0sIDEsCiAgICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGludHB0cl90Jy5dKV0sCiAgICBbZm9yIGFjX3R5cGUgaW4gJ2ludCcgJ2xvbmcgaW50JyAnbG9uZyBsb25nIGludCc7IGRvCiAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKCSBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgIFtBQ19JTkNMVURFU19ERUZBVUxUXSwKCSAgICBbW3NpemVvZiAodm9pZCAqKSA8PSBzaXplb2YgKCRhY190eXBlKV1dKV0sCgkgW0FDX0RFRklORV9VTlFVT1RFRChbaW50cHRyX3RdLCBbJGFjX3R5cGVdLAoJICAgIFtEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIHdpZGUgZW5vdWdoIHRvCgkgICAgIGhvbGQgYSBwb2ludGVyLCBpZiBzdWNoIGEgdHlwZSBleGlzdHMsIGFuZCBpZiB0aGUgc3lzdGVtCgkgICAgIGRvZXMgbm90IGRlZmluZSBpdC5dKQoJICBhY190eXBlPV0pCiAgICAgICB0ZXN0IC16ICIkYWNfdHlwZSIgJiYgYnJlYWsKICAgICBkb25lXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwzNAptNF9sb2NhdGlvbihBQ19GQ19TUkNFWFQpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTE1NApUMjgsMzQKbTRfbG9jYXRpb24oQUNfRkNfRklYRURGT1JNKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjE0MjAKVDM2LDMzCm00X2xvY2F0aW9uKEFDX0NIRUNLX0hFQURFUl9TVERCT09MKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjYwMApUOSwxMjcKX200X3NwbGl0bTRfY2hhbmdlcXVvdGUoWy09PHsoXSxbKX0+PS1dKVttNF9icGF0c3Vic3QoLT08eygtPTx7KCQxKX0+PS0pfT49LSwgLT08eygkMil9Pj0tLAoJICAgICAgIC09PHsoXSQzWyl9Pj0tKV1tNF9jaGFuZ2VxdW90ZShbLCBdKQpUMTUsMTcxOApfQUNfRkNfV1JBUFBFUlNfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZPUlRSQU5fQVNTRVJUKClkbmwKQUhfVEVNUExBVEUoX0FDX0ZDW19GVU5DXSwKICAgIFtEZWZpbmUgdG8gYSBtYWNybyBtYW5nbGluZyB0aGUgZ2l2ZW4gQyBpZGVudGlmaWVyIChpbiBsb3dlciBhbmQgdXBwZXIKICAgICBjYXNlKSwgd2hpY2ggbXVzdCBub3QgY29udGFpbiB1bmRlcnNjb3JlcywgZm9yIGxpbmtpbmcgd2l0aCBGb3J0cmFuLl0pZG5sCkFIX1RFTVBMQVRFKF9BQ19GQ1tfRlVOQ19dLAogICAgW0FzIF1fQUNfRkNbX0ZVTkMsIGJ1dCBmb3IgQyBpZGVudGlmaWVycyBjb250YWluaW5nIHVuZGVyc2NvcmVzLl0pZG5sCmNhc2UgJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcgaW4KICAibG93ZXIgY2FzZSwgbm8gdW5kZXJzY29yZSwgbm8gZXh0cmEgdW5kZXJzY29yZSIpCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkMobmFtZSxOQU1FKV0sICBbbmFtZV0pCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkNfKG5hbWUsTkFNRSldLCBbbmFtZV0pIDs7CiAgImxvd2VyIGNhc2UsIG5vIHVuZGVyc2NvcmUsIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW25hbWVdKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DXyhuYW1lLE5BTUUpXSwgW25hbWUgWyMjXSBfXSkgOzsKICAibG93ZXIgY2FzZSwgdW5kZXJzY29yZSwgbm8gZXh0cmEgdW5kZXJzY29yZSIpCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkMobmFtZSxOQU1FKV0sICBbbmFtZSBbIyNdIF9dKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DXyhuYW1lLE5BTUUpXSwgW25hbWUgWyMjXSBfXSkgOzsKICAibG93ZXIgY2FzZSwgdW5kZXJzY29yZSwgZXh0cmEgdW5kZXJzY29yZSIpCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkMobmFtZSxOQU1FKV0sICBbbmFtZSBbIyNdIF9dKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DXyhuYW1lLE5BTUUpXSwgW25hbWUgWyMjXSBfX10pIDs7CiAgInVwcGVyIGNhc2UsIG5vIHVuZGVyc2NvcmUsIG5vIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW05BTUVdKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DXyhuYW1lLE5BTUUpXSwgW05BTUVdKSA7OwogICJ1cHBlciBjYXNlLCBubyB1bmRlcnNjb3JlLCBleHRyYSB1bmRlcnNjb3JlIikKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQyhuYW1lLE5BTUUpXSwgIFtOQU1FXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtOQU1FIFsjI10gX10pIDs7CiAgInVwcGVyIGNhc2UsIHVuZGVyc2NvcmUsIG5vIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW05BTUUgWyMjXSBfXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtOQU1FIFsjI10gX10pIDs7CiAgInVwcGVyIGNhc2UsIHVuZGVyc2NvcmUsIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW05BTUUgWyMjXSBfXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtOQU1FIFsjI10gX19dKSA7OwogICopCgkgIEFDX01TR19XQVJOKFt1bmtub3duIEZvcnRyYW4gbmFtZS1tYW5nbGluZyBzY2hlbWVdKQoJICA7Owplc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjEsNjIwCkFDX0ZVTkNfQ0xPU0VESVJfVk9JRF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19IRUFERVJfRElSRU5UXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgY2xvc2VkaXIgcmV0dXJucyB2b2lkXSwKCSAgICAgICBbYWNfY3ZfZnVuY19jbG9zZWRpcl92b2lkXSwKW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVAojaW5jbHVkZSA8JGFjX2hlYWRlcl9kaXJlbnQ+CiNpZm5kZWYgX19jcGx1c3BsdXMKaW50IGNsb3NlZGlyICgpOwojZW5kaWYKXSwKCQkJCVtbcmV0dXJuIGNsb3NlZGlyIChvcGVuZGlyICgiLiIpKSAhPSAwO11dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfY2xvc2VkaXJfdm9pZD1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfY2xvc2VkaXJfdm9pZD15ZXNdLAoJICAgICAgIFthY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQ9eWVzXSldKQppZiB0ZXN0ICRhY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoQ0xPU0VESVJfVk9JRCwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIGBjbG9zZWRpcicgZnVuY3Rpb24gcmV0dXJucyB2b2lkIGluc3RlYWQKCSAgICAgb2YgYGludCcuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxMzU1CkFDX0ZDX1BQX1NSQ0VYVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBGb3J0cmFuIGZsYWcgdG8gY29tcGlsZSBwcmVwcm9jZXNzZWQgLiQxIGZpbGVzXSwKCQlhY19jdl9mY19wcF9zcmNleHRfJDEsClthY19leHQ9JDEKYWNfZmNmbGFnc19wcF9zcmNleHRfc2F2ZT0kYWNfZmNmbGFnc19zcmNleHQKYWNfZmNmbGFnc19zcmNleHQ9CmFjX2N2X2ZjX3BwX3NyY2V4dF8kMT11bmtub3duCmNhc2UgJGFjX2V4dCBpbiAjKAogIFtbZkZdXTc3KSBhY190cnk9Zjc3LWNwcC1pbnB1dDs7ICMoCiAgKikgYWNfdHJ5PWY5NS1jcHAtaW5wdXQ7Owplc2FjCmZvciBhY19mbGFnIGluIG5vbmUgLWZ0cHAgLWZwcCAtVGYgIi1mcHAgLVRmIiAteHBwPWZwcCAtTXByZXByb2Nlc3MgIi1lIFoiIFwKICAgICAgICAgICAgICAgLWNwcCAteHBwPWNwcCAtcXN1ZmZpeD1jcHA9JDEgIi14ICRhY190cnkiICtjcHAgLUNwcDsgZG8KICB0ZXN0ICJ4JGFjX2ZsYWciICE9IHhub25lICYmIGFjX2ZjZmxhZ3Nfc3JjZXh0PSIkYWNfZmxhZyIKICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbWwojaWYgMAojaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KICAgICAgY2hva2UgbWUKI2VuZGlmXV0pXSwKICAgIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbWwojaWYgMQojaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KICAgICAgY2hva2UgbWUKI2VuZGlmXV0pXSwKICAgICAgIFtdLAogICAgICAgW2FjX2N2X2ZjX3BwX3NyY2V4dF8kMT0kYWNfZmxhZzsgYnJlYWtdKV0pCmRvbmUKcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kMQphY19mY2ZsYWdzX3NyY2V4dD0kYWNfZmNmbGFnc19wcF9zcmNleHRfc2F2ZQpdKQppZiB0ZXN0ICJ4JGFjX2N2X2ZjX3BwX3NyY2V4dF8kMSIgPSB4dW5rbm93bjsgdGhlbgogIG00X2RlZmF1bHQoWyQzXSwKICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW0ZvcnRyYW4gY291bGQgbm90IGNvbXBpbGUgcHJlcHJvY2Vzc2VkIC4kMSBmaWxlc10pXSkKZWxzZQogIGFjX2ZjX3NyY2V4dD0kMQogIGlmIHRlc3QgIngkYWNfY3ZfZmNfcHBfc3JjZXh0XyQxIiA9IHhub25lOyB0aGVuCiAgICBhY19mY2ZsYWdzX3NyY2V4dD0iIgogICAgRkNGTEFHU19bXSQxW109IiIKICBlbHNlCiAgICBhY19mY2ZsYWdzX3NyY2V4dD0kYWNfY3ZfZmNfcHBfc3JjZXh0XyQxCiAgICBGQ0ZMQUdTX1tdJDFbXT0kYWNfY3ZfZmNfcHBfc3JjZXh0XyQxCiAgZmkKICBBQ19TVUJTVChGQ0ZMQUdTX1tdJDEpCiAgJDIKZmkKQUNfTEFOR19QT1AoRm9ydHJhbilkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNSwzNAptNF9sb2NhdGlvbihBQ19QUkVTRVJWRV9IRUxQX09SREVSKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0MzMKVDI2LDM1Cm00X2xvY2F0aW9uKEFDX0dFVExPQURBVkcpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4MDgKVDI0LDM0Cm00X2xvY2F0aW9uKEFDX0Y3N19GVU5DKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjExMTEKVDM2LDMyCm00X2xvY2F0aW9uKEFDX0xBTkdfUFJFUFJPQyhFcmxhbmcpKS4uLy4uL2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6MTYwClQ4LDg1Cl9tNF9qb2lubTRfaWYoWyQjJDJdLCBbMl0sIFtdLAogICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMSQyXV0pJDAoWyQxXSwgbTRfc2hpZnQyKCRAKSldKQpUMjIsNjc3Cl9BQ19JTklUX1BBUlNFX0VOQUJMRTItJDEtKiB8IC0tJDEtKikKICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSokMS1cKG00X2lmKFskMV0sIFskMl0sIFtbW149XV1dLCBbLl0pKlwpJ2AKICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiWy4qW14tKy5fJGFzX2NyX2FsbnVtXV0iID4vZGV2L251bGwgJiYKICAgICAgQUNfTVNHX0VSUk9SKAoJW2ludmFsaWQgXW00X2lmKFskMl0sIFt3aXRoXSwgW3BhY2thZ2VdLCBbZmVhdHVyZV0pWyBuYW1lOiAkYWNfdXNlcm9wdF0pCiAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKICAgIGFjX3VzZXJvcHQ9YEFTX0VDSE8oWyIkYWNfdXNlcm9wdCJdKSB8IHNlZCAncy9bWy0rLl1dL18vZydgCiAgICBjYXNlICRhY191c2VyX29wdHMgaW4KICAgICAgKiIKIiQyXyRhY191c2Vyb3B0IgoiKikgOzsKICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS0kMS0kYWNfdXNlcm9wdF9vcmlnIgoJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CiAgICBlc2FjCiAgICBldmFsICQyXyRhY191c2Vyb3B0PW00X2lmKFskMV0sIFskMl0sIFtcJGFjX29wdGFyZ10sIFtub10pIDs7ZG5sCgpUOSwxNzgKQUNfSU5MSU5FX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0lOTElORScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DX0lOTElORV0sIFtBQ19DX0lOTElORSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMzQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfREVDTCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyODQ0ClQxMCwyNApBTl9QUk9HUkFNQU5fT1VUUFVUKFtwcm9ncmFtXSwgJEApClQzNiwzMAptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDozNzIKVDM0LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfTE9OR19MT05HX0lOVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NTAzClQxNiw0Cl9tNF9kaXZlcnQoQk9EWSkxMDAwClQxOCwxMjY4Cl9BU19MSU5FTk9fUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfQ1JfUFJFUEFSRV0pQVNfUkVRVUlSRShbX0FTX01FX1BSRVBBUkVdKV9BU19ERVRFQ1RfU1VHR0VTVEVEKFtfQVNfTElORU5PX1dPUktTXSltNF9wdXNoZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pbTRfcHVzaGRlZihbQVNfRVJST1JdLAogIFt7IEFTX01FU1NBR0UoXW00X2RxdW90ZShbZXJyb3I6ICRdWzFdKVssIFsyXSk7IEFTX0VYSVQoWzFdKTsgfV0pX0FTX0xJTkVOT19XT1JLUyB8fCB7ClsgICMgQmxhbWUgTGVlIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQogIHNlZCAtbiAnCiAgICBwCiAgICAvWyRdTElORU5PLz0KICAnIDwkYXNfbXlzZWxmIHwKICAgIHNlZCAnCiAgICAgIHMvWyRdTElORU5PLiovJi0vCiAgICAgIHQgbGluZW5vCiAgICAgIGIKICAgICAgOmxpbmVubwogICAgICBOCiAgICAgIDpsb29wCiAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwogICAgICB0IGxvb3AKICAgICAgcy8tXG4uKi8vCiAgICAnID4kYXNfbWUubGluZW5vICYmCiAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iXSB8fAogICAgQVNfRVJST1IoW2Nhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsXSkKCiAgIyBJZiB3ZSBoYWQgdG8gcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwsIHdlJ3JlIGVuc3VyZWQgdG8gaGF2ZQogICMgYWxyZWFkeSBkb25lIHRoYXQsIHNvIGVuc3VyZSB3ZSBkb24ndCB0cnkgdG8gZG8gc28gYWdhaW4gYW5kIGZhbGwKICAjIGluIGFuIGluZmluaXRlIGxvb3AuICBUaGlzIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGluIHByYWN0aWNlLgogIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWMKICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwogICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQogICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCiAgLiAiLi8kYXNfbWUubGluZW5vIgogICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgogIGV4aXQKfQpfbTRfcG9wZGVmKFtBU19NRVNTQUdFX0xPR19GRF0sIFtBU19FUlJPUl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxOTIKQUNfSEVBREVSX0NIRUNLX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFQURFUl9DSEVDSycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DSEVDS19IRUFERVJdLCBbQUNfQ0hFQ0tfSEVBREVSKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywyNzYKbTRfc2V0X2RlbGV0ZW00X2lmZGVmKFtfbTRfc2V0KFskMV0pXSwKCSAgW19tNF9wb3BkZWYoW19tNF9zZXQoWyQxXSxdX200X2RlZm4oW19tNF9zZXQoWyQxXSldKVspXSwKCQkgICAgICBbX200X3NldChbJDFdKV0pJDAoWyQxXSldLAoJICBbbTRfaWZkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldLAoJCSAgICBbX200X3BvcGRlZihbX200X3NldF9jbGVhbnVwKCQxKV0pXSltNF9pZmRlZigKCQkgICAgW19tNF9zZXRfc2l6ZSgkMSldLAoJCSAgICBbX200X3BvcGRlZihbX200X3NldF9zaXplKCQxKV0pXSldKQpUMjksMzQKbTRfbG9jYXRpb24oQUNfU1lTX0xBUkdFRklMRSkuLi8uLi9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6MTM0ClQzNSwzMQptNF9sb2NhdGlvbihBQ19TVFJVQ1RfRElSRU5UX0RfSU5PKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo5NjQKVDExLDk2NwpBQ19DX1RZUEVPRl9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yIHR5cGVvZiBzeW50YXggYW5kIGtleXdvcmQgc3BlbGxpbmddLCBhY19jdl9jX3R5cGVvZiwKICAgIFthY19jdl9jX3R5cGVvZj1ubwogICAgIGZvciBhY19rdyBpbiB0eXBlb2YgX190eXBlb2ZfXyBubzsgZG8KICAgICAgIHRlc3QgJGFjX2t3ID0gbm8gJiYgYnJlYWsKICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sCgkgW1sKCSAgIGludCB2YWx1ZTsKCSAgIHR5cGVkZWYgc3RydWN0IHsKCQkgICBjaGFyIGEgWzEKCQkJICAgKyAhICgoJGFjX2t3ICh2YWx1ZSkpCgkJCQkoKCRhY19rdyAodmFsdWUpKSAwIDwgKCRhY19rdyAodmFsdWUpKSAtMQoJCQkJID8gKCRhY19rdyAodmFsdWUpKSAtIDEKCQkJCSA6IH4gKH4gKCRhY19rdyAodmFsdWUpKSAwCgkJCQkgICAgICA8PCBzaXplb2YgKCRhY19rdyAodmFsdWUpKSkpKV07IH0KCSAgICAgIGFjX190eXBlb2ZfdHlwZV87CgkgICByZXR1cm4KCSAgICAgKCEgKCh2b2lkKSAoKGFjX190eXBlb2ZfdHlwZV8gKikgMCksIDApKTsKCSBdXSldLAoJIFthY19jdl9jX3R5cGVvZj0kYWNfa3ddKQogICAgICAgdGVzdCAkYWNfY3ZfY190eXBlb2YgIT0gbm8gJiYgYnJlYWsKICAgICBkb25lXSkKICBpZiB0ZXN0ICRhY19jdl9jX3R5cGVvZiAhPSBubzsgdGhlbgogICAgQUNfREVGSU5FKFtIQVZFX1RZUEVPRl0sIDEsCiAgICAgIFtEZWZpbmUgdG8gMSBpZiB0eXBlb2Ygd29ya3Mgd2l0aCB5b3VyIGNvbXBpbGVyLl0pCiAgICBpZiB0ZXN0ICRhY19jdl9jX3R5cGVvZiAhPSB0eXBlb2Y7IHRoZW4KICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFt0eXBlb2ZdLCBbJGFjX2N2X2NfdHlwZW9mXSwKCVtEZWZpbmUgdG8gX190eXBlb2ZfXyBpZiB5b3VyIGNvbXBpbGVyIHNwZWxscyBpdCB0aGF0IHdheS5dKQogICAgZmkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM0LDI5Cm00X2xvY2F0aW9uKF9BU19SRUVYRUNfV0lUSF9TSEVMTCkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjI3OQpUMjgsMzMKbTRfbG9jYXRpb24oQUNfUFJPR1JBTV9QQVRIKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo0MwpUMzIsMzEKbTRfbG9jYXRpb24oQUNfRVJMQU5HX05FRURfRVJMQykuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjYzClQyMCwxNzcKX0FDX0NIRUNLX0hFQURFUl9PTERfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgJDAnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHVzZSBBQ19DSEVDS19IRUFERVIgd2l0aCBhIGZvdXJ0aCBhcmd1bWVudC5dKV9BQ19DSEVDS19IRUFERVJfUFJFUFJPQygkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDM5NwpBQ19DX1BST1RPVFlQRVNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCkFDX01TR19DSEVDS0lORyhbZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXNdKQppZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19jODkiICE9IG5vOyB0aGVuCiAgQUNfTVNHX1JFU1VMVChbeWVzXSkKICBBQ19ERUZJTkUoUFJPVE9UWVBFUywgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcy5dKQogIEFDX0RFRklORShfX1BST1RPVFlQRVMsIDEsCgkgICAgW0RlZmluZSBsaWtlIFBST1RPVFlQRVM7IHRoaXMgY2FuIGJlIHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMuXSkKZWxzZQogIEFDX01TR19SRVNVTFQoW25vXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywzMAptNF9sb2NhdGlvbihBQ19SRVFVSVJFX0NQUCkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDozODEKVDI0LDM0Cm00X2xvY2F0aW9uKEFDX1BST0dfTEVYKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo3MDkKVDEyLDEwCm00X2NyX2RpZ2l0czAxMjM0NTY3ODkKVDMxLDMzCm00X2xvY2F0aW9uKF9BQ19GT1JUUkFOX0FTU0VSVCkuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxNTgKVDMzLDI3Cm00X2xvY2F0aW9uKF9BQ19BUkdfVkFSX0NQUEZMQUdTKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjMwOApUMTcsMTcKbTRfUEFDS0FHRV9TVFJJTkdHTlUgQXV0b2NvbmYgMi42OQpUMzAsNgpfQUNfTEFOR19QUkVGSVgoT2JqZWN0aXZlIEMrKylPQkpDWFgKVDI0LDM1OApfQUNfQ09ORklHX1JFR0lTVEVSX0RFU1RfQUNfQ09ORklHX1VOSVFVRShbJDFdLCBbJDNdKW00X2lmKFskMSAkM10sIFtMSU5LUyAuXSwKICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBkZXN0aW5hdGlvbiBvZiBhIGNvbmZpZyBsaW5rOiBgLiddKV0sCiAgICAgICBbJDFdLCBbSEVBREVSU10sCiAgICAgICBbbTRfZGVmaW5lX2RlZmF1bHQoW0FIX0hFQURFUl0sIFskM10pXSltNF9hcHBlbmQoW19BQ19MSVNUX1RBR1NdLApbICAgICIkMyIpIENPTkZJR18kMT0iJENPTkZJR18kMSAkMiIgOzsKXSltNF9pZnZhbChbJDRdLApbbTRfYXBwZW5kKFtfQUNfTElTVF9UQUdfQ09NTUFORFNdLApbICAgICIkMyI6XW00X2Zvcm1hdChbWyUuMXNdXSwgWyQxXSlbKSAkNCA7OwpdKV0pClQ5LDE0CkFTX1RFU1RfWHRlc3QgLXggJDFbXVtdClQ5LDEyOQpBU19URVNUX1hfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX1RFU1RfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDE0NQpBQ19MQU5HX0ZVTkNfTElOS19UUllfbTRfZGVmdW5fcHJvKFskMF0pbTRfaWZ2YWwoWyQxXSwgW10sIFttNF93YXJuKFtzeW50YXhdLCBbJDA6IG5vIGZ1bmN0aW9uIGdpdmVuXSldKWRubApfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywzNQptNF9sb2NhdGlvbihBQ19GVU5DX01LVElNRSkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00Ojk4NwpUMzIsMzQKbTRfbG9jYXRpb24oQUNfRkNfSU1QTElDSVRfTk9ORSkuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxNjg0ClQyNSwzMwptNF9sb2NhdGlvbihBQ19BUkdfQVJSQVkpLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjgyClQyOCwzMwptNF9sb2NhdGlvbihBQ19IRUFERVJfRUdSRVApLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjM3ClQxNSw4NjMKX0FDX1BST0dfRkNfQ19PX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRbXV9BQ19GQ1tdIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlcl0sCgkgICAgICAgW2FjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9jX29dLApbQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFtdKV0pCiMgV2UgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcKIyBgLm8nIGZpbGUgd2l0aCBgLW8nLCBhbHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KYWNfdHJ5PSckW11fQUNfRkNbXSAkW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiZBU19NRVNTQUdFX0xPR19GRCcKcm0gLWYgY29uZnRlc3QyLioKaWYgX0FDX0RPX1ZBUihhY190cnkpICYmCiAgICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJgogICAgIF9BQ19ET19WQVIoYWNfdHJ5KTsgdGhlbgogIGFjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9jX289eWVzCmVsc2UKICBhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fY19vPW5vCmZpCnJtIC1mIGNvbmZ0ZXN0Kl0pCmlmIHRlc3QgJGFjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9jX28gPSBubzsgdGhlbgogIEFDX0RFRklORShbXV9BQ19GQ1tdX05PX01JTlVTX0NfTUlOVVNfTywgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBGb3J0cmFuIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0CgkgICAgIC1jIGFuZCAtbyB0b2dldGhlci5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDM0Cm00X2xvY2F0aW9uKEFDX1RSWV9SVU4pLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6Mjc2NApUMzEsMzIKbTRfbG9jYXRpb24oQUNfU1RSVUNUX1RJTUVaT05FKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDoxMDUwCkYxMCw2Cl9tNF9wb3BkZWZwb3BkZWYKVDksNjgKX0FTX1RSX1NIX0FTX0xJVEVSQUxfSUYoWyQxXSwgWypdWwkgXVsKXSkoW10sIFskMF9JTkRJUl0sIFskMF9MSVRFUkFMXSkoWyQxXSkKVDIxLDMzCm00X2xvY2F0aW9uKEFDX0NPTlNUKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo1NQpUNywxNjg4Cm00X2luaXQjIEFsbCB0aGUgTTRzdWdhciBtYWNyb3Mgc3RhcnQgd2l0aCBgbTRfJywgZXhjZXB0IGBkbmwnIGtlcHQgYXMgaXMKIyBmb3Igc2FrZSBvZiBzaW1wbGljaXR5LgptNF9wYXR0ZXJuX2ZvcmJpZChbXl8/bTRfXSkKbTRfcGF0dGVybl9mb3JiaWQoW15kbmwkXSkKCiMgSWYgX19tNF92ZXJzaW9uX18gaXMgZGVmaW5lZCwgd2UgYXNzdW1lIHRoYXQgd2UgYXJlIGJlaW5nIHJ1biBieSBNNAojIDEuNiBvciBuZXdlciwgdGh1cyAkQCByZWN1cnNpb24gaXMgbGluZWFyLCBhbmQgZGVidWdtb2RlKCtkbykKIyBpcyBhdmFpbGFibGUgZm9yIGZhc3RlciBjaGVja3Mgb2YgZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgbWFjcm9zCiMgYW5kIGZvcmNpbmcgZHVtcGRlZiB0byBwcmludCB0byBzdGRlcnIgcmVnYXJkbGVzcyBvZiBkZWJ1Z2ZpbGUuCiMgQnV0IGlmIGl0IGlzIG1pc3NpbmcsIHdlIGFzc3VtZSB3ZSBhcmUgYmVpbmcgcnVuIGJ5IE00IDEuNC54LCB0aGF0CiMgJEAgcmVjdXJzaW9uIGlzIHF1YWRyYXRpYywgYW5kIHRoYXQgd2UgbmVlZCBmb3JlYWNoLWJhc2VkCiMgcmVwbGFjZW1lbnQgbWFjcm9zLiAgQWxzbywgbTQgcHJpb3IgdG8gMS40LjggbG9zZXMgdHJhY2sgb2YgbG9jYXRpb24KIyBkdXJpbmcgbTR3cmFwIHRleHQ7IF9fbGluZV9fIHNob3VsZCBuZXZlciBiZSAwLgojCiMgVXNlIHRoZSByYXcgYnVpbHRpbiB0byBhdm9pZCB0cmlwcGluZyB1cCBpbmNsdWRlIHRyYWNpbmcuCiMgTWVhbndoaWxlLCBhdm9pZCBtNF9jb3B5LCBzaW5jZSBpdCB0ZW1wb3JhcmlseSB1bmRlZmluZXMgbTRfZGVmbi4KbTRfaWZkZWYoW19fbTRfdmVyc2lvbl9fXSwKW200X2RlYnVnbW9kZShbK2RvXSkKbTRfZGVmaW5lKFttNF9kZWZuXSwgX200X2RlZm4oW19tNF9kZWZuXSkpCm00X2RlZmluZShbbTRfZHVtcGRlZl0sIF9tNF9kZWZuKFtfbTRfZHVtcGRlZl0pKQptNF9kZWZpbmUoW200X3BvcGRlZl0sIF9tNF9kZWZuKFtfbTRfcG9wZGVmXSkpCm00X2RlZmluZShbbTRfdW5kZWZpbmVdLCBfbTRfZGVmbihbX200X3VuZGVmaW5lXSkpXSwKW200X2J1aWx0aW4oW2luY2x1ZGVdLCBbbTRzdWdhci9mb3JlYWNoLm00XSkKbTRfd3JhcF9saWZvKFttNF9pZihfX2xpbmVfXywgWzBdLCBbbTRfcHVzaGRlZihbbTRfbG9jYXRpb25dLApdXW00X2RxdW90ZShtNF9kcXVvdGUobTRfZHF1b3RlKF9fZmlsZV9fOl9fbGluZV9fKSkpW1spXSldKV0pCgojIFJld3JpdGUgdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBkaXZlcnNpb24gc3RhY2suCm00X2RpdmVydChbS0lMTF0pCgojIENoZWNrIHRoZSBkaXZlcnQgcHVzaC9wb3AgcGVyZmVjdCBiYWxhbmNlLgojIFNvbWUgdXNlcnMgYXJlIHByb25lIHRvIGFsc28gdXNlIG00X3dyYXAgdG8gcmVnaXN0ZXIgbGFzdC1taW51dGUKIyBtNF9kaXZlcnRfdGV4dDsgc28gYWZ0ZXIgb3VyIGRpdmVyc2lvbiBjbGVhbnVwcywgd2UgcmVzdG9yZQojIEtJTEwgYXMgdGhlIGJvdHRvbSBvZiB0aGUgZGl2ZXJzaW9uIHN0YWNrLgptNF93cmFwKFttNF9wb3BkZWYoW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSltNF9pZmRlZigKICBbX200X2RpdmVydF9kaXZlcnNpb25dLCBbbTRfZmF0YWwoWyQwOiB1bmJhbGFuY2VkIG00X2RpdmVydF9wdXNoOgpdbTRfZGl2ZXJ0X3N0YWNrKV0pX200X3BvcGRlZihbX200X2RpdmVydF9zdGFja10pbTRfZGl2ZXJ0X3B1c2goW0tJTExdKV0pCgpUMjEsMjkKbTRfbG9jYXRpb24oQVNfRVJST1IpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo4ODMKVDI0LDIKX0FDX0xBTkdfUFJFRklYKEZvcnRyYW4pRkMKVDE1LDM3NgpBQ19GVU5DX1JFQUxMT0NfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZVTkNfUkVBTExPQ19JRigKICBbQUNfREVGSU5FKFtIQVZFX1JFQUxMT0NdLCAxLAoJICAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgcmVhbGxvYycKCSAgICAgIGZ1bmN0aW9uLCBhbmQgdG8gMCBvdGhlcndpc2UuXSldLAogIFtBQ19ERUZJTkUoW0hBVkVfUkVBTExPQ10sIDApCiAgIEFDX0xJQk9CSihbcmVhbGxvY10pCiAgIEFDX0RFRklORShbcmVhbGxvY10sIFtycGxfcmVhbGxvY10sCiAgICAgIFtEZWZpbmUgdG8gcnBsX3JlYWxsb2MgaWYgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCwxNTM4CkFDX0ZDX01PRFVMRV9PVVRQVVRfRkxBR19tNF9kZWZ1bl9wcm8oWyQwXSkKQUNfQ0FDSEVfQ0hFQ0soW0ZvcnRyYW4gOTAgbW9kdWxlIG91dHB1dCBmbGFnXSwgW2FjX2N2X2ZjX21vZHVsZV9vdXRwdXRfZmxhZ10sCltBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKQpta2RpciBjb25mdGVzdC5kaXIgY29uZnRlc3QuZGlyL3N1YgpjZCBjb25mdGVzdC5kaXIKYWNfY3ZfZmNfbW9kdWxlX291dHB1dF9mbGFnPXVua25vd24KYWNfZmNfbW9kdWxlX291dHB1dF9mbGFnX0ZDRkxBR1Nfc2F2ZT0kRkNGTEFHUwojIEZsYWcgb3JkZXJpbmcgaXMgc2lnbmlmaWNhbnQ6IHB1dCBmbGFncyBsYXRlIHdoaWNoIHNvbWUgY29tcGlsZXJzIHVzZQojIGZvciB0aGUgc2VhcmNoIHBhdGguCmZvciBhY19mbGFnIGluIC1KICctSiAnIC1mbW9kPSAtbW9kZGlyPSArbW9kZGlyPSAtcW1vZGRpcj0gJy1tb2QgJyBcCgkgICAgICAnLW1vZHVsZSAnIC1NICctQW0gLU0nICctZSBtIC1KICc7IGRvCiAgRkNGTEFHUz0iJGFjX2ZjX21vZHVsZV9vdXRwdXRfZmxhZ19GQ0ZMQUdTX3NhdmUgJHthY19mbGFnfXN1YiIKICBBQ19DT01QSUxFX0lGRUxTRShbWwogICAgICBtb2R1bGUgY29uZnRlc3RfbW9kdWxlCiAgICAgIGNvbnRhaW5zCiAgICAgIHN1YnJvdXRpbmUgY29uZnRlc3Rfcm91dGluZQogICAgICB3cml0ZSgqLCcoYSknKSAnZ290Y2hhIScKICAgICAgZW5kIHN1YnJvdXRpbmUKICAgICAgZW5kIG1vZHVsZV1dLAogICAgW2NkIHN1YgogICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtbCiAgICAgIHByb2dyYW0gbWFpbgogICAgICB1c2UgY29uZnRlc3RfbW9kdWxlCiAgICAgIGNhbGwgY29uZnRlc3Rfcm91dGluZQogICAgICBlbmQgcHJvZ3JhbV1dLAogICAgICAgW2FjX2N2X2ZjX21vZHVsZV9vdXRwdXRfZmxhZz0iJGFjX2ZsYWciXSkKICAgICBjZCAuLgogICAgIGlmIHRlc3QgIiRhY19jdl9mY19tb2R1bGVfb3V0cHV0X2ZsYWciICE9IHVua25vd247IHRoZW4KICAgICAgIGJyZWFrCiAgICAgZmldKQpkb25lCkZDRkxBR1M9JGFjX2ZjX21vZHVsZV9vdXRwdXRfZmxhZ19GQ0ZMQUdTX3NhdmUKY2QgLi4Kcm0gLXJmIGNvbmZ0ZXN0LmRpcgpBQ19MQU5HX1BPUChbRm9ydHJhbl0pCl0pCmlmIHRlc3QgIiRhY19jdl9mY19tb2R1bGVfb3V0cHV0X2ZsYWciICE9IHVua25vd247IHRoZW4KICBGQ19NT0RPVVQ9JGFjX2N2X2ZjX21vZHVsZV9vdXRwdXRfZmxhZwogICQxCmVsc2UKICBGQ19NT0RPVVQ9CiAgbTRfZGVmYXVsdChbJDJdLAogICAgW0FDX01TR19FUlJPUihbdW5hYmxlIHRvIGZpbmQgY29tcGlsZXIgZmxhZyB0byB3cml0ZSBtb2R1bGUgaW5mb3JtYXRpb24gdG9dKV0pCmZpCkFDX1NVQlNUKFtGQ19NT0RPVVRdKQojIEVuc3VyZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBpbiBhIE1ha2VmaWxlLgpBQ19TVUJTVChbYWNfZW1wdHldLCBbIiJdKQpBQ19DT05GSUdfQ09NTUFORFNfUFJFKFtjYXNlICRGQ19NT0RPVVQgaW4gIygKICAqXCApIEZDX01PRE9VVD0kRkNfTU9ET1VUJyR7YWNfZW1wdHl9JyA7Owplc2FjXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwzMwptNF9sb2NhdGlvbihfQUNfRkNfRElBTEVDVF9ZRUFSKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjI3OApUMjgsMzQKbTRfbG9jYXRpb24oX0FDX0xJTktfSUZFTFNFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NjEKVDI5LDMzCm00X2xvY2F0aW9uKEFDX1BST0dSQU1fRUdSRVApLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQyClQxMSwxNjIKbTRfZHVtcGRlZnNtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbJCNdLCBbMV0sIFttNF9zdGFja19mb3JlYWNoX2xpZm8oWyQxXSwgW200X2R1bXBkZWYoWyQxXSltNF9pZ25vcmVdKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDEzLDg2MgpfQUNfUEFUSF9QUk9HX200X2RlZnVuX3BybyhbJDBdKSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpzZXQgZHVtbXkgJDI7IGFjX3dvcmQ9JFsyXQpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCkFDX0NBQ0hFX1ZBTChbYWNfY3ZfcGF0aF8kMV0sCltjYXNlICQkMSBpbgogIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKICBhY19jdl9wYXRoXyQxPSIkJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgogIDs7CiAgKikKICBfQVNfUEFUSF9XQUxLKFskNF0sCltmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICBpZiBBU19FWEVDVVRBQkxFX1AoWyIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Il0pOyB0aGVuCiAgICBhY19jdl9wYXRoXyQxPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgX0FTX0VDSE9fTE9HKFtmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0XSkKICAgIGJyZWFrIDIKICBmaQpkb25lXSkKZG5sIElmIG5vIDNyZCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCm00X2lmdmFsbihbJDNdLApbICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDMiXSlkbmwKICA7Owplc2FjXSlkbmwKJDE9JGFjX2N2X3BhdGhfJDEKaWYgdGVzdCAtbiAiJCQxIjsgdGhlbgogIEFDX01TR19SRVNVTFQoWyQkMV0pCmVsc2UKICBBQ19NU0dfUkVTVUxUKFtub10pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsNTQzCl9BQ19DT01QSUxFUl9FWEVFWFRfQ1JPU1MjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgojIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nXSkKaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCiAgX0FDX0RPX1ZBUihhY19saW5rKQogIGlmIF9BQ19ET19UT0tFTlMoWy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0XSk7IHRoZW4KICAgIGNyb3NzX2NvbXBpbGluZz1ubwogIGVsc2UKICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KCWNyb3NzX2NvbXBpbGluZz15ZXMKICAgIGVsc2UKCUFDX01TR19GQUlMVVJFKFtjYW5ub3QgcnVuIF9BQ19MQU5HIGNvbXBpbGVkIHByb2dyYW1zLgpJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIGAtLWhvc3QnLl0pCiAgICBmaQogIGZpCmZpCkFDX01TR19SRVNVTFQoWyRjcm9zc19jb21waWxpbmddKQoKVDEyLDE2Cm00X3dyYXBfbGlmb19tNF93cmFwKFskMVtdXSkKVDIyLDM0Cm00X2xvY2F0aW9uKEFDX0VOQUJMRSkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDc1ClQxMCwxMDMKbTRfZmxhdHRlbm00X2lmKG00X2luZGV4KFskMV0sIFsKXSksIFstMV0sIFtbJDFdXSwKICAgICAgIFttNF90cmFuc2xpdChtNF9icGF0c3Vic3QoW1tbJDFdXV0sIFtcXApdKSwgWwpdLCBbIF0pXSkKVDIwLDM2Cl9tNF9zZXRfaW50ZXJzZWN0aW9ubTRfc2V0X2NvbnRhaW5zKFskMV0sIFskMl0sIFssWyQyXV0pClQyMywzCl9tNF9kaXZlcnQoSEVMUF9FTkFCTEUpMTAyClQyMCwzMwpfQVNfUkVRVUlSRV9TSEVMTF9GTgptNF9uKFskMl0pJDEgKCkKewokMwp9IEAlOkAgJDFbXQpUMTgsNDA0CkFDX09VVFBVVF9DT01NQU5EU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19PVVRQVVRfQ09NTUFORFMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2RlZmluZV9kZWZhdWx0KFtfQUNfT1VUUFVUX0NPTU1BTkRTX0NOVF0sIDApZG5sCm00X2RlZmluZShbX0FDX09VVFBVVF9DT01NQU5EU19DTlRdLCBtNF9pbmNyKF9BQ19PVVRQVVRfQ09NTUFORFNfQ05UKSlkbmwKZG5sIERvdWJsZSBxdW90ZWQgc2luY2UgdGhhdCB3YXMgdGhlIGNhc2UgaW4gdGhlIG9yaWdpbmFsIG1hY3JvLgpBQ19DT05GSUdfQ09NTUFORFMoW2RlZmF1bHQtXV9BQ19PVVRQVVRfQ09NTUFORFNfQ05ULCBbWyQxXV0sIFtbJDJdXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwyNwptNF9sb2NhdGlvbihBQ19MQU5HX0NQTFVTUExVUykuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoyNTIKVDMyLDM0Cm00X2xvY2F0aW9uKEFDX0NBTk9OSUNBTF9TWVNURU0pLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTg1NwpUMjcsMTE3Cl9BQ19MQU5HX09QRU5NUChGb3J0cmFuIDc3KQogICAgICBwcm9ncmFtIG1haW4KICAgICAgaW1wbGljaXQgbm9uZQohJCAgICBpbnRlZ2VyIHRpZAogICAgICB0aWQgPSA0MgogICAgICBjYWxsIG9tcF9zZXRfbnVtX3RocmVhZHMoMikKICAgICAgZW5kCgpUMzEsNjgKQUNfTEFOR19DT01QSUxFUihPYmplY3RpdmUgQysrKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX09CSkNYWF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMiwzMAptNF9sb2NhdGlvbihBU19UUl9DUFApLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxODU5ClQzNCwzNAptNF9sb2NhdGlvbihBQ19DSEVDS19UQVJHRVRfVE9PTFMpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjMxNApUOCwyOApfQVNfQ0FTRSBbQCU6QChdCiAgJDFbKV0gOgogICAgJDIgOzsKVDI5LDQ0OApfQUNfU1lTX0xBUkdFRklMRV9NQUNST19WQUxVRUFDX0NBQ0hFX0NIRUNLKFtmb3IgJDEgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlc10sIFskM10sClt3aGlsZSA6OyBkbwogIG00X2lmdmFsKFskNl0sIFtBQ19MSU5LX0lGRUxTRV0sIFtBQ19DT01QSUxFX0lGRUxTRV0pKAogICAgW0FDX0xBTkdfUFJPR1JBTShbJDVdLCBbJDZdKV0sCiAgICBbJDM9bm87IGJyZWFrXSkKICBtNF9pZnZhbChbJDZdLCBbQUNfTElOS19JRkVMU0VdLCBbQUNfQ09NUElMRV9JRkVMU0VdKSgKICAgIFtBQ19MQU5HX1BST0dSQU0oW0AlOkBkZWZpbmUgJDEgJDIKJDVdLCBbJDZdKV0sCiAgICBbJDM9JDI7IGJyZWFrXSkKICAkMz11bmtub3duCiAgYnJlYWsKZG9uZV0pCmNhc2UgJCQzIGluICMoCiAgbm8gfCB1bmtub3duKSA7OwogICopIEFDX0RFRklORV9VTlFVT1RFRChbJDFdLCBbJCQzXSwgWyQ0XSk7Owplc2FjCnJtIC1yZiBjb25mdGVzdCpbXWRubAoKVDE3LDE2OQpfQUNfQ09ORklHX1VOSVFVRW00X2lmZGVmKFtfQUNfU0VFTl9UQUcoJDIpXSwKICAgW200X2ZhdGFsKFtgJDInIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIEFDX0NPTkZJR19dbTRfZGVmbigKICAgICBbX0FDX1NFRU5fVEFHKCQyKV0pLildLAogICBbbTRfZGVmaW5lKFtfQUNfU0VFTl9UQUcoJDIpXSwgWyQxXSldKWRubAoKVDIwLDE0MwpBQ19DSEVDS19UT09MX1BSRUZJWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DSEVDS19UT09MX1BSRUZJWCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwzNQptNF9sb2NhdGlvbihBQ19IQVZFX0ZVTkNTKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTYwClQxMywyMDAKQUNfU1RfQkxLU0laRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TVF9CTEtTSVpFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1NUUlVDVF9TVF9CTEtTSVpFXSwgW0FDX1NUUlVDVF9TVF9CTEtTSVpFKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwyOQptNF9sb2NhdGlvbihBU19GT1IpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2MDcKVDI5LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RSRlRJTUUpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNjY1ClQ5LDE1NgptNF9lc2NhcGVtNF9pZihtNF9pbmRleChtNF90cmFuc2xpdChbJDFdLAogICBbW10jLCgpXVthYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXzAxMjM0NTY3ODldLCBbJCQkXSksIFskXSksCiAgWy0xXSwgW200X2VjaG9dLCBbXyQwXSkoWyQxXSkKVDE3LDQ3OApBU19JTklUX0dFTkVSQVRFRF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9yZXF1aXJlKFtBU19QUkVQQVJFXSltNF9wdXNoZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pYXNfd3JpdGVfZmFpbD0wCmNhdCA+JDEgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCiMhICRTSEVMTAojIEdlbmVyYXRlZCBieSAkYXNfbWUuCiQyClNIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CmV4cG9ydCBTSEVMTApfQVNFT0YKY2F0ID4+JDEgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQpfQVNfU0hFTExfU0FOSVRJWkUKX0FTX1BSRVBBUkUKbTRfaWYoQVNfTUVTU0FHRV9GRCwgWzFdLCBbXSwgW2V4ZWMgQVNfTUVTU0FHRV9GRD4mMQpdKW00X3RleHRfYm94KFtNYWluIGJvZHkgb2YgJDEgc2NyaXB0Ll0pCl9BU0VPRgp0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkMVtdZG5sCl9tNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDMzCm00X2xvY2F0aW9uKEFDX0dFVEdST1VQU19UKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2MApUMTUsMTkyCkFDX0hFQURFUl9FR1JFUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUFERVJfRUdSRVAnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRUdSRVBfSEVBREVSXSwgW0FDX0VHUkVQX0hFQURFUigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMTQ1NgpBQ19GQ19NT0RVTEVfRkxBR19tNF9kZWZ1bl9wcm8oWyQwXSkKQUNfQ0FDSEVfQ0hFQ0soW0ZvcnRyYW4gOTAgbW9kdWxlIGluY2x1c2lvbiBmbGFnXSwgW2FjX2N2X2ZjX21vZHVsZV9mbGFnXSwKW0FDX0xBTkdfUFVTSChbRm9ydHJhbl0pCmFjX2N2X2ZjX21vZHVsZV9mbGFnPXVua25vd24KbWtkaXIgY29uZnRlc3QuZGlyCmNkIGNvbmZ0ZXN0LmRpcgpBQ19DT01QSUxFX0lGRUxTRShbWwogICAgICBtb2R1bGUgY29uZnRlc3RfbW9kdWxlCiAgICAgIGNvbnRhaW5zCiAgICAgIHN1YnJvdXRpbmUgY29uZnRlc3Rfcm91dGluZQogICAgICB3cml0ZSgqLCcoYSknKSAnZ290Y2hhIScKICAgICAgZW5kIHN1YnJvdXRpbmUKICAgICAgZW5kIG1vZHVsZV1dLAogIFtjZCAuLgogICBhY19mY19tb2R1bGVfZmxhZ19GQ0ZMQUdTX3NhdmU9JEZDRkxBR1MKICAgIyBGbGFnIG9yZGVyaW5nIGlzIHNpZ25pZmljYW50IGZvciBnZm9ydHJhbiBhbmQgU3VuLgogICBmb3IgYWNfZmxhZyBpbiAtTSAtSSAnLUkgJyAnLU0gJyAtcCAnLW1vZCAnICctbW9kdWxlICcgJy1BbSAtSSc7IGRvCiAgICAgIyBBZGQgdGhlIGZsYWcgdHdpY2UgdG8gcHJldmVudCBtYXRjaGluZyBhbiBvdXRwdXQgZmxhZy4KICAgICBGQ0ZMQUdTPSIkYWNfZmNfbW9kdWxlX2ZsYWdfRkNGTEFHU19zYXZlICR7YWNfZmxhZ31jb25mdGVzdC5kaXIgJHthY19mbGFnfWNvbmZ0ZXN0LmRpciIKICAgICBBQ19DT01QSUxFX0lGRUxTRShbWwogICAgICBwcm9ncmFtIG1haW4KICAgICAgdXNlIGNvbmZ0ZXN0X21vZHVsZQogICAgICBjYWxsIGNvbmZ0ZXN0X3JvdXRpbmUKICAgICAgZW5kIHByb2dyYW1dXSwKICAgICAgIFthY19jdl9mY19tb2R1bGVfZmxhZz0iJGFjX2ZsYWciXSkKICAgICBpZiB0ZXN0ICIkYWNfY3ZfZmNfbW9kdWxlX2ZsYWciICE9IHVua25vd247IHRoZW4KICAgICAgIGJyZWFrCiAgICAgZmkKICAgZG9uZQogICBGQ0ZMQUdTPSRhY19mY19tb2R1bGVfZmxhZ19GQ0ZMQUdTX3NhdmUKXSkKcm0gLXJmIGNvbmZ0ZXN0LmRpcgpBQ19MQU5HX1BPUChbRm9ydHJhbl0pCl0pCmlmIHRlc3QgIiRhY19jdl9mY19tb2R1bGVfZmxhZyIgIT0gdW5rbm93bjsgdGhlbgogIEZDX01PRElOQz0kYWNfY3ZfZmNfbW9kdWxlX2ZsYWcKICAkMQplbHNlCiAgRkNfTU9ESU5DPQogIG00X2RlZmF1bHQoWyQyXSwKICAgIFtBQ19NU0dfRVJST1IoW3VuYWJsZSB0byBmaW5kIGNvbXBpbGVyIGZsYWcgZm9yIG1vZHVsZSBzZWFyY2ggcGF0aF0pXSkKZmkKQUNfU1VCU1QoW0ZDX01PRElOQ10pCiMgRW5zdXJlIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGluIGEgTWFrZWZpbGUuCkFDX1NVQlNUKFthY19lbXB0eV0sIFsiIl0pCkFDX0NPTkZJR19DT01NQU5EU19QUkUoW2Nhc2UgJEZDX01PRElOQyBpbiAjKAogICpcICkgRkNfTU9ESU5DPSRGQ19NT0RJTkMnJHthY19lbXB0eX0nIDs7CmVzYWNdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDQ3NApBQ19DSEVDS19GSUxFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtjcm9zc10sCgkgICAgIFtjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nXSlkbmwKQVNfVkFSX1BVU0hERUYoW2FjX0ZpbGVdLCBbYWNfY3ZfZmlsZV8kMV0pZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgJDFdLCBbYWNfRmlsZV0sClt0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyAmJgogIEFDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSB3aGVuIGNyb3NzIGNvbXBpbGluZ10pCmlmIHRlc3QgLXIgIiQxIjsgdGhlbgogIEFTX1ZBUl9TRVQoW2FjX0ZpbGVdLCBbeWVzXSkKZWxzZQogIEFTX1ZBUl9TRVQoW2FjX0ZpbGVdLCBbbm9dKQpmaV0pCkFTX1ZBUl9JRihbYWNfRmlsZV0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY19GaWxlXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNywzNAptNF9sb2NhdGlvbihBQ19GQ19NT0RVTEVfT1VUUFVUX0ZMQUcpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTgxMgpUMjQsMzQKbTRfbG9jYXRpb24oQUNfQVJHX1dJVEgpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ4MQpUMTEsMzIyCkFDX0xBTkdfUE9QX200X2RlZnVuX3BybyhbJDBdKW00X2lmdmFsKFskMV0sCiBbbTRfaWYoWyQxXSwgbTRfZGVmbihbX0FDX0xBTkddKSwgW10sCiAgW200X2ZhdGFsKFskMCgkMSk6IHVuZXhwZWN0ZWQgY3VycmVudCBsYW5ndWFnZTogXW00X2RlZm4oW19BQ19MQU5HXSkpXSldKWRubAptNF9wdXNoZGVmKFskMCBPTERdLCBtNF9kZWZuKFtfQUNfTEFOR10pKWRubAptNF9wb3BkZWYoW19BQ19MQU5HXSlkbmwKX0FDX0xBTkdfU0VUKG00X2RlZm4oWyQwIE9MRF0pLCBtNF9kZWZuKFtfQUNfTEFOR10pKWRubAptNF9wb3BkZWYoWyQwIE9MRF0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsNTM3CkFDX0NfQ0hBUl9VTlNJR05FRF9tNF9kZWZ1bl9wcm8oWyQwXSlBSF9WRVJCQVRJTShbX19DSEFSX1VOU0lHTkVEX19dLApbLyogRGVmaW5lIHRvIDEgaWYgdHlwZSBgY2hhcicgaXMgdW5zaWduZWQgYW5kIHlvdSBhcmUgbm90IHVzaW5nIGdjYy4gICovCiNpZm5kZWYgX19DSEFSX1VOU0lHTkVEX18KIyB1bmRlZiBfX0NIQVJfVU5TSUdORURfXwojZW5kaWZdKWRubApBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIGNoYXIgaXMgdW5zaWduZWQsIGFjX2N2X2NfY2hhcl91bnNpZ25lZCwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoW0FDX0lOQ0xVREVTX0RFRkFVTFQoW10pXSwKCQkJCQkgICAgIFsoKGNoYXIpIC0xKSA8IDBdKV0sCgkJICAgYWNfY3ZfY19jaGFyX3Vuc2lnbmVkPW5vLCBhY19jdl9jX2NoYXJfdW5zaWduZWQ9eWVzKV0pCmlmIHRlc3QgJGFjX2N2X2NfY2hhcl91bnNpZ25lZCA9IHllcyAmJiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoX19DSEFSX1VOU0lHTkVEX18pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMjkKbTRfbG9jYXRpb24oX0FTX0RJUk5BTUVfRVhQUikuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00Ojk3NQpUMjgsMjgKbTRfbG9jYXRpb24oX0FDX1BST0dfQ0NfQzk5KS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjEyMDUKVDIwLDExMgpfQUNfTVNHX0xPR19DT05GVEVTVEFTX0VDSE8oWyIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiXSkgPiZBU19NRVNTQUdFX0xPR19GRApzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiZBU19NRVNTQUdFX0xPR19GRAoKVDIxLDY5NQpfQUNfQ09NUElMRVJfRVhFRVhUX09BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXNdKQpBU19JRihbX0FDX0RPX1ZBUihhY19saW5rKV0sClsjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCiMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCiMgYHJtJy4KZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCiAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCiAgY2FzZSAkYWNfZmlsZSBpbgogICAgX0FDX0NPTVBJTEVSX0VYRUVYVF9SRUpFQ1QgKSA7OwogICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiBbJ1teLl0qXChcLi4qXCknXWAKCSAgYnJlYWs7OwogICAgKiApIGJyZWFrOzsKICBlc2FjCmRvbmVdLAoJICAgICAgW0FDX01TR19GQUlMVVJFKFtjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rXSldKQpybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKQUNfTVNHX1JFU1VMVChbJGFjX2N2X2V4ZWV4dF0pCgpUMTMsMzUzCkFDX0NIRUNLX1RZUEVfbTRfZGVmdW5fcHJvKFskMF0pbTRfY29uZChbJCNdLCBbM10sCiAgW19BQ19DSEVDS19UWVBFX05FV10sCgkgWyQjXSwgWzRdLAogIFtfQUNfQ0hFQ0tfVFlQRV9ORVddLAoJIFtfQUNfQ0hFQ0tfVFlQRV9SRVBMQUNFTUVOVF9UWVBFX1AoWyQyXSldLCBbMV0sCiAgW19BQ19DSEVDS19UWVBFX09MRF0sCgkgW19BQ19DSEVDS19UWVBFX01BWUJFX1RZUEVfUChbJDJdKV0sIFsxXSwKICBbQUNfRElBR05PU0UoW3N5bnRheF0sCgkgICAgICAgWyQwOiBhc3N1bWluZyBgJDInIGlzIG5vdCBhIHR5cGVdKV9BQ19DSEVDS19UWVBFX05FV10sCiAgW19BQ19DSEVDS19UWVBFX05FV10pKCRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMjQKbTRfcmVuYW1lX200bTRfcmVuYW1lKFskMV0sIFttNF8kMV0pClQzMCwyOQptNF9sb2NhdGlvbihfQVNfVU5TRVRfUFJFUEFSRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjY1NwpUMjAsMTExCm00X3N0YWNrX2ZvcmVhY2hfc2VwX200X3N0YWNrX3JldmVyc2UoWyQxXSwgW200X3RtcC0kMV0pX200X3N0YWNrX3JldmVyc2UoW200X3RtcC0kMV0sIFskMV0sIFskMltdX200X2RlZm4oW200X3RtcC0kMV0pJDNdLCBbJDRbXV0pClQyMCwzMAptNF9sb2NhdGlvbihBU19FQ0hPKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTAyNgpUMjAsMjk0Cl9BQ19DT01QVVRFX0lOVF9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KICAgIF9BQ19DT01QVVRFX0lOVF9DT01QSUxFKFskW10yXSwgWyRbXTNdLCBbJFtdNF0sCgkJCSAgICBbYWNfcmV0dmFsPTBdLCBbYWNfcmV0dmFsPTFdKQogIGVsc2UKICAgIF9BQ19DT01QVVRFX0lOVF9SVU4oWyRbXTJdLCBbJFtdM10sIFskW100XSwKCQkJW2FjX3JldHZhbD0wXSwgW2FjX3JldHZhbD0xXSkKICBmaQogIEFTX0xJTkVOT19QT1AKICBBU19TRVRfU1RBVFVTKFskYWNfcmV0dmFsXSkKClQyMSwxOTYKQUNfU1RBVF9NQUNST1NfQlJPS0VOX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NUQVRfTUFDUk9TX0JST0tFTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19IRUFERVJfU1RBVF0sIFtBQ19IRUFERVJfU1RBVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMTU5CkFDX0xBTkdfRk9SVFJBTjc3X200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfRk9SVFJBTjc3JyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19MQU5HKEZvcnRyYW4gNzcpW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwzNAptNF9sb2NhdGlvbihBQ19DSEVDS19ERUNMU19PTkNFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI4OTQKVDYsOTEKX0FDX0RPX200X2RlZnVuX3BybyhbJDBdKV9BQ19SVU5fTE9HKFtldmFsICIkMSJdLAoJICAgICBbX0FDX0RPX0VDSE8oWyQxXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNzQ5CkFDX0hFQURFUl9NQUpPUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldiwKCQlhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiwKW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tAJTpAaW5jbHVkZSA8c3lzL3R5cGVzLmg+XV0sCgkJCQkgW1tyZXR1cm4gbWFrZWRldigwLCAwKTtdXSldLAoJCVthY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldj15ZXNdLAoJCVthY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldj1ub10pCl0pCgppZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiA9IG5vOyB0aGVuCkFDX0NIRUNLX0hFQURFUihzeXMvbWtkZXYuaCwKCQlbQUNfREVGSU5FKE1BSk9SX0lOX01LREVWLCAxLAoJCQkgICBbRGVmaW5lIHRvIDEgaWYgYG1ham9yJywgYG1pbm9yJywgYW5kIGBtYWtlZGV2JyBhcmUKCQkJICAgIGRlY2xhcmVkIGluIDxta2Rldi5oPi5dKV0pCgogIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCA9IG5vOyB0aGVuCiAgICBBQ19DSEVDS19IRUFERVIoc3lzL3N5c21hY3Jvcy5oLAoJCSAgICBbQUNfREVGSU5FKE1BSk9SX0lOX1NZU01BQ1JPUywgMSwKCQkJICAgICAgIFtEZWZpbmUgdG8gMSBpZiBgbWFqb3InLCBgbWlub3InLCBhbmQgYG1ha2VkZXYnCgkJCQlhcmUgZGVjbGFyZWQgaW4gPHN5c21hY3Jvcy5oPi5dKV0pCiAgZmkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCw3MQpBQ19DT05GSUdfQ09NTUFORFNfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0NPTkZJR19GT09TKFtDT01NQU5EU10sICRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzUsMzAKbTRfbG9jYXRpb24oX0FTX1ZBUl9BUFBFTkRfUFJFUEFSRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjE5MDYKVDE1LDM5MwpBQ19IQVZFX0xJQlJBUllfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEFWRV9MSUJSQVJZJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9wdXNoZGVmKFtBQ19MaWJfTmFtZV0sCgkgICAgbTRfYnBhdHN1YnN0KG00X2JwYXRzdWJzdChbWyQxXV0sCgkJCQkgICAgW2xpYlwoW15cLl0qXClcLmFdLCBbXDFdKSwKCQkJWy1sXSwgW10pKWRubApBQ19DSEVDS19MSUIoQUNfTGliX05hbWUsIG1haW4sIFskMl0sIFskM10sIFskNF0pZG5sCmFjX2N2X2xpYl9bXUFDX0xpYl9OYW1lKCk9YWNfY3ZfbGliX1tdQUNfTGliX05hbWUoKV9tYWluCm00X3BvcGRlZihbQUNfTGliX05hbWVdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDk4CkFDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ09ORklHX0FVWF9ESVJTKCIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMzYKbTRfbG9jYXRpb24oQUNfRlVOQ19TRVRQR1JQKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTQ3NwpUMTksMTU2Cl9tNF9kZWZ1bl9wcm9fb3V0ZXJtNF9zZXRfZGVsZXRlKFtfbTRfcHJvdmlkZV0pbTRfcHVzaGRlZihbX200X2RpdmVydGluZyhbJDFdKV0pbTRfcHVzaGRlZihbX200X2RpdmVydGluZ10sIFskMV0pbTRfcHVzaGRlZihbX200X2RpdmVydF9kdW1wXSwgbTRfZGl2bnVtKW00X2RpdmVydF9wdXNoKFtHUk9XXSkKVDE4LDQ5CkFTX0xJVEVSQUxfV09SRF9JRl9BU19MSVRFUkFMX0lGKG00X2V4cGFuZChbJDFdKSkoWyQ0XSwgWyQzXSwgWyQyXSkKVDE3LDYzCm00X3NldF9kaWZmZXJlbmNlbTRfaWYoWyQxXSwgWyQyXSwgW10sIFttNF9zZXRfbWFwX3NlcChbJDFdLCBbXyQwKFskMl0sXSwgWyldKV0pClQyNCwzMwptNF9sb2NhdGlvbihBTV9DWUdXSU4zMikuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6ODUKVDE3LDI5MgpfbTRfcmVxdWlyZV9jaGVja200X2lmKF9tNF9kZWZuKFtfbTRfZGl2ZXJ0aW5nXSksIFskMl0sIFttNF9pZ25vcmVdLAogICAgICAgbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoWyQyXSldLCBbLV0pLCBbLV0sIFttNF93YXJuKFtzeW50YXhdLAogICBbJDM6IGAkMScgd2FzIGV4cGFuZGVkIGJlZm9yZSBpdCB3YXMgcmVxdWlyZWQKaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mL21hbnVhbC9hdXRvY29uZi5odG1sI0V4cGFuZGVkLUJlZm9yZS1SZXF1aXJlZF0pX200X3JlcXVpcmVfY2FsbF0sCiAgICAgICBbbTRfaWdub3JlXSkKVDE5LDE2NgptNF9zZXRfaW50ZXJzZWN0aW9ubTRfaWYoWyQxXSwgWyQyXSwgW200X3NldF9saXN0YyhbJDFdKV0sCiAgICAgICBtNF9ldmFsKG00X3NldF9zaXplKFskMl0pIDwgbTRfc2V0X3NpemUoWyQxXSkpLCBbMV0sIFskMChbJDJdLCBbJDFdKV0sCiAgICAgICBbbTRfc2V0X21hcF9zZXAoWyQxXSwgW18kMChbJDJdLF0sIFspXSldKQpUMjcsMjgKbTRfbG9jYXRpb24oQUNfUFJPR19DQ19DODkpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MTM2MgpUMjcsMzAKbTRfbG9jYXRpb24oQUNfTEFOR19XRVJST1IpLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6NzE5ClQyOSwzMwptNF9sb2NhdGlvbihBQ19GQ19EVU1NWV9NQUlOKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00Ojg0MwpUMTksMTQ3CkFTX1JFUVVJUkVfU0hFTExfRk5tNF9wcm92aWRlX2lmKFtBU19TSEVMTF9GTl8kMV0sIFtdLApbQVNfUkVRVUlSRShbQVNfU0hFTExfRk5fJDFdLApbbTRfcHJvdmlkZShbQVNfU0hFTExfRk5fJDFdKV8kMCgkQCldLAptNF9kZWZhdWx0X3F1b3RlZChbJDRdLCBbTTRTSC1JTklULUZOXSkpXSkKVDEzLDQ3CkFTX0xJVEVSQUxfSUZfJDAobTRfZXhwYW5kKFskMV0pLCBbCSBdWwpdKShbJDRdLCBbJDNdLCBbJDJdKQpUMjAsMTQzCkFDX0Y3N19OQU1FX01BTkdMSU5HX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0Y3N19OQU1FX01BTkdMSU5HJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjYsNgpzeXN2YWxzeXN2YWwKVDI3LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfSU5UOF9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MjQKVDEyLDc0Cl9BQ19MQU5HX1NFVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfTEFOR19ESVNQQVRDSChbQUNfTEFOR10sIFskMl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwzCl9BQ19BV0tfTElURVJBTF9MSU1JVDE0OApUNiw4NgpBSF9UT1BtNF9kZWZpbmUoW19BSF9DT1VOVEVSXSwgbTRfaW5jcihfQUhfQ09VTlRFUikpZG5sCkFIX1ZFUkJBVElNKFswMDAwXV9BSF9DT1VOVEVSLCBbJDFdKQpUMjEsMTAxCm00X3N0YWNrX2ZvcmVhY2hfbGlmb19tNF9zdGFja19yZXZlcnNlKFskMV0sIFttNF90bXAtJDFdLCBbJDIoX200X2RlZm4oW200X3RtcC0kMV0pKV0pX200X3N0YWNrX3JldmVyc2UoW200X3RtcC0kMV0sIFskMV0pClQxMSwzMwptNF9zZXRfbGlzdG00X3NldF9tYXBfc2VwKFskMV0sIFtdLCBbXSwgWyxdKQpUMzAsMzUKbTRfbG9jYXRpb24oQUNfRlVOQ19HRVRNTlRFTlQpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4MTQKVDI3LDE1NQpfQUNfTEFOR19JT19QUk9HUkFNKEVybGFuZylBQ19MQU5HX1BST0dSQU0oW10sIFtkbmwKICAgUmV0dXJuVmFsdWUgPSBjYXNlIGZpbGU6d3JpdGVfZmlsZSgiY29uZnRlc3Qub3V0IiwgIiIpIG9mCiAgICAgICB7ZXJyb3IsIF99IC0+IDE7CiAgICAgICBvayAtPiAwCiAgIGVuZCwKICAgaGFsdChSZXR1cm5WYWx1ZSldKQpUMTgsNTM3Cl9BQ19DSEVDS19UWVBFX05FV19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja190eXBlXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX3R5cGVdLAogICAgW0xJTkVOTyBUWVBFIFZBUiBJTkNMVURFU10sCiAgICBbVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcKICAgICBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuXSldLAogICAgWyQwX0JPRFldKUFTX1ZBUl9QVVNIREVGKFthY19UeXBlXSwgW2FjX2N2X3R5cGVfJDFdKWFjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY2hlY2tfdHlwZSAiJExJTkVOTyIgIiQxIiAiYWNfVHlwZSIgIkFTX0VTQ0FQRShbQUNfSU5DTFVERVNfREVGQVVMVChbJDRdKV0sIFsiIl0pIgpBU19WQVJfSUYoW2FjX1R5cGVdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfVHlwZV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMzY4CkFDX1BST0dfTEVYX200X2RlZnVuX29uY2UoW0FDX1BST0dfTEVYXSwgW0FDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsIDopCmlmIHRlc3QgIngkTEVYIiAhPSAieDoiOyB0aGVuCiAgX0FDX1BST0dfTEVYX1lZVEVYVF9ERUNMCmZpXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX1BST0dfTEVYXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfUFJPR19MRVhdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfUFJPR19MRVhdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19QUk9HX0xFWF0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDIxLDY1CkFDX0xBTkdfQ09NUElMRVIoQysrKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwyOQptNF9sb2NhdGlvbihfQVNfREVURUNUX1JFUVVJUkVEKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTU2ClQyMywyOQptNF9sb2NhdGlvbihBU19QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MzUzClQzMSwxNTQKQUNfVkFMSURBVEVfQ0FDSEVEX1NZU1RFTV9UVVBMRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19WQUxJREFURV9DQUNIRURfU1lTVEVNX1RVUExFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDYxNQpBQ19ESVJfSEVBREVSX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0RJUl9IRUFERVInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0hFQURFUl9ESVJFTlQKQUNfRlVOQ19DTE9TRURJUl9WT0lECnRlc3QgYWNfY3ZfaGVhZGVyX2RpcmVudF9kaXJlbnRfaCAmJgogIEFDX0RFRklORShbRElSRU5UXSwgMSwgW1NhbWUgYXMgYEhBVkVfRElSRU5UX0gnLCBkb24ndCBkZXBlbmQgb24gbWUuXSkKdGVzdCBhY19jdl9oZWFkZXJfZGlyZW50X3N5c19uZGlyX2ggJiYKICBBQ19ERUZJTkUoW1NZU05ESVJdLCAxLCBbU2FtZSBhcyBgSEFWRV9TWVNfTkRJUl9IJywgZG9uJ3QgZGVwZW5kIG9uIG1lLl0pCnRlc3QgYWNfY3ZfaGVhZGVyX2RpcmVudF9zeXNfZGlyX2ggJiYKICBBQ19ERUZJTkUoW1NZU0RJUl0sIDEsIFtTYW1lIGFzIGBIQVZFX1NZU19ESVJfSCcsIGRvbid0IGRlcGVuZCBvbiBtZS5dKQp0ZXN0IGFjX2N2X2hlYWRlcl9kaXJlbnRfbmRpcl9oICYmCiAgQUNfREVGSU5FKFtORElSXSwgMSwgW1NhbWUgYXMgYEhBVkVfTkRJUl9IJywgZG9uJ3QgZGVwZW5kIG9uIG1lLl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwzMAptNF9sb2NhdGlvbihfQVNfVEVTVF9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTM4NApGOCw4Cl9fbGluZV9fX19saW5lX18KVDIzLDM1MApfQUNfQ0hFQ0tfVFlQRV9ORVdfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJFtdMl0sIFskW10zXSwKICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pCiAgQUNfQ09NUElMRV9JRkVMU0UoCiAgICBbQUNfTEFOR19QUk9HUkFNKFskW100XSwKICAgICAgIFtpZiAoc2l6ZW9mICgkW10yKSkKCSByZXR1cm4gMDtdKV0sCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKFskW100XSwKCSAgW2lmIChzaXplb2YgKCgkW10yKSkpCgkgICAgcmV0dXJuIDA7XSldLAogICAgICAgW10sCiAgICAgICBbQVNfVkFSX1NFVChbJFtdM10sIFt5ZXNdKV0pXSldKQogIEFTX0xJTkVOT19QT1AKClQzNCwzNQptNF9sb2NhdGlvbihBQ19GVU5DX0VSUk9SX0FUX0xJTkUpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo0ODYKVDEzLDQxCl9tNF9zZXRfdW5pb25tNF9pZmRlZihbX200X3NldChbJDFdLCQyKV0sIFtdLCBbLFskMl1dKQpUMTUsODgKQUNfRUdSRVBfSEVBREVSX200X2RlZnVuX3BybyhbJDBdKUFDX0VHUkVQX0NQUChbJDFdLApbI2luY2x1ZGUgPCQyPgpdLCBbJDNdLCBbJDRdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMzMKbTRfbG9jYXRpb24oQUNfTEFOR19GT1JUUkFONzcpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTUyClQxNywxCl9tNF9kaXZlcnQoQklOU0gpMApUMTksNjcKX0FDX0NPUFlSSUdIVF9ZRUFSUwpDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgMTk5OC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKVDI3LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfU0lHTkFMKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo3NDYKVDI4LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RSVE9MRCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE1ODkKVDEwLDU1Cl9tNF9zaGlmdDJtNF9pZihbJCNdLCBbMl0sIFtdLAogICAgICAgWywgbTRfc2hpZnQobTRfc2hpZnQoJEApKV0pClQxNCwxNDQKQUNfTEFOR19XRVJST1JfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwgW2FjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9XSkKYWNfW11fQUNfTEFOR19BQkJSRVZbXV93ZXJyb3JfZmxhZz15ZXNbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDExNwpBQ19ERUZJTkVfVFJBQ0VfTElURVJBTG00X3BhdHRlcm5fYWxsb3coW14kMSRdKWRubApBU19JREVOVElGSUVSX0lGKFskMV0sIFtdLAogIFttNF93YXJuKFtzeW50YXhdLCBbQUNfREVGSU5FOiBub3QgYW4gaWRlbnRpZmllcjogJDFdKV0pZG5sCgpUMTQsMTg4CkFDX0NIRUNLX1BST0dTX200X2RlZnVuX3BybyhbJDBdKWZvciBhY19wcm9nIGluICQyCmRvCiAgQUNfQ0hFQ0tfUFJPRyhbJDFdLCBbJGFjX3Byb2ddLCBbJGFjX3Byb2ddLCAsIFskNF0pCiAgdGVzdCAtbiAiJCQxIiAmJiBicmVhawpkb25lCm00X2lmdmFsbihbJDNdLCBbdGVzdCAtbiAiJCQxIiB8fCAkMT0iJDMiXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDQKbTRfUEFDS0FHRV9WRVJTSU9OMi42OQpUMTAsNjUKX200X3NoaWZ0M200X2lmKFskI10sIFszXSwgW10sCiAgICAgICBbLCBtNF9zaGlmdChtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pClQxNiwyMjIKX0FTX0JBU0VOQU1FX1NFRF9tNF9kZWZ1bl9wcm8oWyQwXSlBU19FQ0hPKFtYL1tdJDFdKSB8CiAgICBzZWQgWycvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CgkgICAgcy8vXDEvCgkgICAgcQoJICB9CgkgIC9eWFwvXChcL1wvXCkkL3sKCSAgICBzLy9cMS8KCSAgICBxCgkgIH0KCSAgL15YXC9cKFwvXCkuKi97CgkgICAgcy8vXDEvCgkgICAgcQoJICB9CgkgIHMvLiovLi87IHEnXVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMTk2Cl9BQ19BUkdfVkFSX0NQUEZMQUdTX200X2RlZnVuX3BybyhbJDBdKUFDX0FSR19WQVIoW0NQUEZMQUdTXSwKCSAgICBbKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPgoJICAgICBpZiB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOCwxNzkKQUNfVkZPUktfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVkZPUksnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19GT1JLXSwgW0FDX0ZVTkNfRk9SSygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOCwxODEKQUNfUElEX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUElEX1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9QSURfVF0sIFtBQ19UWVBFX1BJRF9UKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMywzCl9tNF9kaXZlcnQoVkVSU0lPTl9FTkQpMjAzClQ0MywyNwptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0MoT2JqZWN0aXZlIEMrKykpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6OTU0ClQxMywzODMKX0FTX1BBVEhfV0FMS2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKbTRfaWZ2YWxuKFskM10sIFthc19mb3VuZD1mYWxzZV0pZG5sCm00X2JtYXRjaChbJDFdLCBbWzo7XV0sClthc19kdW1teT0iJDEiCmZvciBhc19kaXIgaW4gJGFzX2R1bW15XSwKW2ZvciBhc19kaXIgaW4gbTRfZGVmYXVsdChbJDFdLCBbJFBBVEhdKV0pCmRvCiAgSUZTPSRhc19zYXZlX0lGUwogIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgbTRfaWZ2YWxuKFskM10sIFthc19mb3VuZD06XSlkbmwKICAkMgogIG00X2lmdmFsbihbJDNdLCBbYXNfZm91bmQ9ZmFsc2VdKWRubApkb25lCm00X2lmdmFsbihbJDNdLCBbJGFzX2ZvdW5kIHx8IHsgJDM7IH1dKWRubApJRlM9JGFzX3NhdmVfSUZTCltdClQxMywxMzkKX0FTX1BBVEhfV0FMS19tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfUEFUSF9TRVBBUkFUT1JfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDQ3NgpfQUNfQ0hFQ0tfREVDTF9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgW2FzX2RlY2xfbmFtZT1gZWNobyAkXVsyfHNlZCAncy8gKiguKi8vJ2BdCiAgW2FzX2RlY2xfdXNlPWBlY2hvICRdWzJ8c2VkIC1lICdzLygvKCgvJyAtZSAncy8pLykgMCYvJyAtZSAncy8sLykgMCYgKC9nJ2BdCiAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZF0sIFskW10zXSwKICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbJFtdNF0sCltAJTpAaWZuZGVmICRbXWFzX2RlY2xfbmFtZQpAJTpAaWZkZWYgX19jcGx1c3BsdXMKICAodm9pZCkgJFtdYXNfZGVjbF91c2U7CkAlOkBlbHNlCiAgKHZvaWQpICRbXWFzX2RlY2xfbmFtZTsKQCU6QGVuZGlmCkAlOkBlbmRpZgpdKV0sCgkJICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbeWVzXSldLAoJCSAgIFtBU19WQVJfU0VUKFskW10zXSwgW25vXSldKV0pCiAgQVNfTElORU5PX1BPUAoKVDM2LDI3Cm00X2xvY2F0aW9uKEFDX1BST0dfR0NDX1RSQURJVElPTkFMKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjU0MwpUMjgsMQpfbTRfZGl2ZXJ0KEhFQURFUi1DT1BZUklHSFQpMwpUMjksMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9JTlRNQVhfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzEwClQxMSw1OApfQVNfQ0xFQU5VUG00X2RpdmVydF90ZXh0KFtNNFNILVNBTklUSVpFXSwgW19BU19ERVRFQ1RfQkVUVEVSX1NIRUxMXSkKVDIxLDE1MTIKX0FDX0xJQk9CSl9HRVRMT0FEQVZHQUNfTElCT0JKKGdldGxvYWRhdmcpCkFDX0RFRklORShDX0dFVExPQURBVkcsIDEsIFtEZWZpbmUgdG8gMSBpZiB1c2luZyBgZ2V0bG9hZGF2Zy5jJy5dKQojIEZpZ3VyZSBvdXQgd2hhdCBvdXIgZ2V0bG9hZGF2Zy5jIG5lZWRzLgphY19oYXZlX2Z1bmM9bm8KQUNfQ0hFQ0tfSEVBREVSKHN5cy9kZ19zeXNfaW5mby5oLApbYWNfaGF2ZV9mdW5jPXllcwogQUNfREVGSU5FKERHVVgsIDEsIFtEZWZpbmUgdG8gMSBmb3IgREdVWCB3aXRoIDxzeXMvZGdfc3lzX2luZm8uaD4uXSkKIEFDX0NIRUNLX0xJQihkZ2MsIGRnX3N5c19pbmZvKV0pCgpBQ19DSEVDS19IRUFERVIobG9jYWxlLmgpCkFDX0NIRUNLX0ZVTkNTKHNldGxvY2FsZSkKCiMgV2UgY2Fubm90IGNoZWNrIGZvciA8ZHdhcmYuaD4sIGJlY2F1c2UgU29sYXJpcyAyIGRvZXMgbm90IHVzZSBkd2FyZiAoaXQKIyB1c2VzIHN0YWJzKSwgYnV0IGl0IGlzIHN0aWxsIFNWUjQuICBXZSBjYW5ub3QgY2hlY2sgZm9yIDxlbGYuaD4gYmVjYXVzZQojIElyaXggNC4wLjVGIGhhcyB0aGUgaGVhZGVyIGJ1dCBub3QgdGhlIGxpYnJhcnkuCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vICYmIHRlc3QgIiRhY19jdl9saWJfZWxmX2VsZl9iZWdpbiIgPSB5ZXMgXAogICAgJiYgdGVzdCAiJGFjX2N2X2xpYl9rdm1fa3ZtX29wZW4iID0geWVzOyB0aGVuCiAgYWNfaGF2ZV9mdW5jPXllcwogIEFDX0RFRklORShTVlI0LCAxLCBbRGVmaW5lIHRvIDEgb24gU3lzdGVtIFYgUmVsZWFzZSA0Ll0pCmZpCgppZiB0ZXN0ICRhY19oYXZlX2Z1bmMgPSBubzsgdGhlbgogIEFDX0NIRUNLX0hFQURFUihpbnFfc3RhdHMvY3B1c3RhdHMuaCwKICBbYWNfaGF2ZV9mdW5jPXllcwogICBBQ19ERUZJTkUoVU1BWCwgMSwgW0RlZmluZSB0byAxIGZvciBFbmNvcmUgVU1BWC5dKQogICBBQ19ERUZJTkUoVU1BWDRfMywgMSwKCSAgICAgW0RlZmluZSB0byAxIGZvciBFbmNvcmUgVU1BWCA0LjMgdGhhdCBoYXMgPGlucV9zdGF0dXMvY3B1c3RhdHMuaD4KCSAgICAgIGluc3RlYWQgb2YgPHN5cy9jcHVzdGF0cy5oPi5dKV0pCmZpCgppZiB0ZXN0ICRhY19oYXZlX2Z1bmMgPSBubzsgdGhlbgogIEFDX0NIRUNLX0hFQURFUihzeXMvY3B1c3RhdHMuaCwKICBbYWNfaGF2ZV9mdW5jPXllczsgQUNfREVGSU5FKFVNQVgpXSkKZmkKCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfSEVBREVSUyhtYWNoL21hY2guaCkKZmkKCkFDX0NIRUNLX0hFQURFUlMobmxpc3QuaCwKW0FDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBubGlzdC5uX3VuLm5fbmFtZV0sCgkJICBbQUNfREVGSU5FKE5MSVNUX05BTUVfVU5JT04sIDEsCgkJCSAgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgYHN0cnVjdCBubGlzdCcgaGFzIGFuCgkJCSAgICAgIGBuX3VuJyBtZW1iZXIuICBPYnNvbGV0ZSwgZGVwZW5kIG9uCgkJCSAgICAgIGBIQVZFX1NUUlVDVF9OTElTVF9OX1VOX05fTkFNRV0pXSwgW10sCgkJICBbQCU6QGluY2x1ZGUgPG5saXN0Lmg+XSkKXSlkbmwKClQyMCwzMTYKQUNfTEFOR19QUk9HUkFNKEMrKykkMQptNF9pZmRlZihbX0FDX0xBTkdfUFJPR1JBTV9DX0Y3N19IT09LU10sIFtfQUNfTEFOR19QUk9HUkFNX0NfRjc3X0hPT0tTXSlbXWRubAptNF9pZmRlZihbX0FDX0xBTkdfUFJPR1JBTV9DX0ZDX0hPT0tTXSwgW19BQ19MQU5HX1BST0dSQU1fQ19GQ19IT09LU10pW11kbmwKaW50Cm1haW4gKCkKewpkbmwgRG8gKm5vdCogaW5kZW50IHRoZSBmb2xsb3dpbmcgbGluZTogdGhlcmUgbWF5IGJlIENQUCBkaXJlY3RpdmVzLgpkbmwgRG9uJ3QgbW92ZSB0aGUgYDsnIHJpZ2h0IGFmdGVyIGZvciB0aGUgc2FtZSByZWFzb24uCiQyCiAgOwogIHJldHVybiAwOwp9ClQyOCw5MApBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoR28pQUNfTEFOR19QUk9HUkFNKFskMV0sIFt2YXIgdGVzdF9hcnJheSBAPDpAMSAtIDIgKiAhKCQyKUA6PkBpbnQKdGVzdF9hcnJheSBAPDpAMEA6PkAgPSAwCl0pClQyMSwzMgpBU19MSVRFUkFMX0hFUkVET0NfSUZfJDAobTRfZXhwYW5kKFskMV0pKShbJDJdLCBbJDNdKQpUOCwxNTAKQUNfREVGVU5tNF9kZWZpbmUoW200X2xvY2F0aW9uKCQxKV0sIG00X2xvY2F0aW9uKW00X2RlZmF1bHQoWyQzXSwgW200X2RlZmluZV0pKFskMV0sCiAgW19tNF9kZWZ1bl9wcm8oXW00X2RxdW90ZSgkWzBdKVspJDJbXV9tNF9kZWZ1bl9lcGkoXW00X2RxdW90ZSgkWzBdKVspXSkKVDEwLDg0Cl9tNF9taW5tYXhtNF9pZihbJCNdLCBbM10sIFskMShbJDJdLCBbJDNdKV0sCiAgICAgICBbJDAoWyQxXSwgJDEoWyQyXSwgWyQzXSksIG00X3NoaWZ0MygkQCkpXSkKVDEzLDk4Cl9BQ19ET19TVERFUlJfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1JVTl9MT0dfU1RERVJSKFtldmFsICIkMSJdLAoJCSAgICBbX0FDX0RPX0VDSE8oWyQxXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsNTcKQVNfTUVfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfJDBdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMjM4Cm00X3RleHRfYm94bTRfcHVzaGRlZihbbTRfQm9yZGVyXSwKCSAgICBtNF90cmFuc2xpdChtNF9mb3JtYXQoW1tbJSpzXV1dLCBtNF9kZWNyKG00X3FsZW4oX200X2V4cGFuZChbJDEKXSkpKSwgW10pLCBbIF0sIG00X2RlZmF1bHRfcXVvdGVkKFskMl0sIFstXSkpKVsjI10gX200X2RlZm4oW200X0JvcmRlcl0pIFsjI10KWyMjXSAkMSBbIyNdClsjI10gX200X2RlZm4oW200X0JvcmRlcl0pIFsjI11fbTRfcG9wZGVmKFttNF9Cb3JkZXJdKQpUMzYsMzYKbTRfbG9jYXRpb24oQUNfRlVOQ19TRUxFQ1RfQVJHVFlQRVMpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNDM0ClQyMywzNzgKX0FDX0NIRUNLX0hFQURFUl9ESVJFTlRBU19WQVJfUFVTSERFRihbYWNfSGVhZGVyXSwgW2FjX2N2X2hlYWRlcl9kaXJlbnRfJDFdKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yICQxIHRoYXQgZGVmaW5lcyBESVJdLCBbYWNfSGVhZGVyXSwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPCQxPgpdLAoJCQkJICAgIFtpZiAoKERJUiAqKSAwKQpyZXR1cm4gMDtdKV0sCgkJICAgW0FTX1ZBUl9TRVQoW2FjX0hlYWRlcl0sIFt5ZXNdKV0sCgkJICAgW0FTX1ZBUl9TRVQoW2FjX0hlYWRlcl0sIFtub10pXSldKQpBU19WQVJfSUYoW2FjX0hlYWRlcl0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY19IZWFkZXJdKWRubAoKVDE2LDUxNgpBQ19DX0JBQ0tTTEFTSF9BX200X2RlZnVuX3BybyhbJDBdKQogIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGJhY2tzbGFzaC1hIHdvcmtzIGluIHN0cmluZ3NdLCBhY19jdl9jX2JhY2tzbGFzaF9hLAogICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwKICAgICBbWwojaWYgJ1xhJyA9PSAnYScKICAgICAgc3ludGF4IGVycm9yOwojZW5kaWYKICAgICAgY2hhciBidWZbJ1xhJyA9PSAnYScgPyAtMSA6IDFdOwogICAgICBidWZbMF0gPSAnXGEnOwogICAgICByZXR1cm4gYnVmWzBdICE9ICJcYSJbMF07CiAgICAgXV0pXSwKICAgICBbYWNfY3ZfY19iYWNrc2xhc2hfYT15ZXNdLAogICAgIFthY19jdl9jX2JhY2tzbGFzaF9hPW5vXSldKQogIGlmIHRlc3QgJGFjX2N2X2NfYmFja3NsYXNoX2EgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX0NfQkFDS1NMQVNIX0EsIDEsCiAgICAgIFtEZWZpbmUgaWYgYmFja3NsYXNoLWEgd29ya3MgaW4gQyBzdHJpbmdzLl0pCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiwxMTUKQUNfTVNHX0VSUk9SYXNfZm5fZXJyb3IgbTRfZGVmYXVsdChbJDJdLCBbJD9dKSAiX0FTX1FVT1RFKFskMV0pIm00X2lmdmFsKEFTX01FU1NBR0VfTE9HX0ZELAogIFsgIiRMSU5FTk8iIEFTX01FU1NBR0VfTE9HX0ZEXSlbXQpUMTIsMTg3CkFDX01TR19FUlJPUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9hcHBlbmRfdW5pcShbX0FTX0NMRUFOVVBdLAogIFttNF9kaXZlcnRfdGV4dChbTTRTSC1JTklULUZOXSwgW19BU19FUlJPUl9QUkVQQVJFW11dKV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDU5CkFDX0ZVTkNfU1RBVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRlVOQ19TVEFUKHN0YXQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxODAKbTRfc2V0X2NvbnRhaW5zbTRfaWZkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldLAoJICBbbTRfaWYobTRfaWZkZWYoW19tNF9zZXQoWyQxXSwkMildLAoJCSAgICBbbTRfaW5kaXIoW19tNF9zZXQoWyQxXSwkMildKV0sIFswXSksIFsxXSwgWyQzXSwgWyQ0XSldLAoJICBbbTRfaWZkZWYoW19tNF9zZXQoWyQxXSwkMildLCBbJDNdLCBbJDRdKV0pCkYxMCw3Cm00X2VzeXNjbWRlc3lzY21kClQzMiwzNgptNF9sb2NhdGlvbihfQUNfRlVOQ19SRUFMTE9DX0lGKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTM5MgpUMjcsMzEKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfVFlQRVMpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjE3OApUMzEsMAptNF9pbmNsdWRlKGF1dG9jb25mL2ZvcnRyYW4ubTQpClQzNCwyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oT2JqZWN0aXZlIEMpQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDksMjIKQVNfVFJfQ1BQXyQwKG00X2V4cGFuZChbJDFdKSlbXQpUOSwxMjQKQVNfVFJfQ1BQX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsNzUKQUNfVFlQRV9TSVpFX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfVFlQRShzaXplX3QsIHVuc2lnbmVkIGludClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDMyCm00X3NldF9tYXBtNF9zZXRfbWFwX3NlcChbJDFdLCBbJDIoXSwgWyldKQpUMjMsMzYKbTRfbG9jYXRpb24oQUNfU1RSQ09MTCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE3NDQKVDM0LDI3Cm00X2xvY2F0aW9uKEFDX0xBTkdfQ09NUElMRVIoQysrKSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo2NjcKVDMwLDMzCm00X2xvY2F0aW9uKEFDX0NPTkZJR19TVUJESVJTKS4uLy4uL2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTA5NwpUMTQsNTMKbTRfY3Jfc3ltYm9sczFhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXwpUMTQsMTgxCl9BU19MSVRFUkFMX0lGbTRfaWYobTRfaW5kZXgoWyQxXSwgW0BTfEBdKSwgWy0xXSwgWyQwXyhtNF90cmFuc2xpdChbJDFdLAogIFstOj0lL0B7fVtdIygpLC4kMl1dW1thYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXzAxMjM0NTY3ODldXVssCiAgWysrKysrKyQkYGBgYGBdKSldLCBbJDBfTk9dKQpUMjAsMTc3Cl9BQ19DSEVDS19IRUFERVJfTkVXX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYCQwJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCB1c2UgQUNfQ0hFQ0tfSEVBREVSIHdpdGggYSBmb3VydGggYXJndW1lbnQuXSlfQUNfQ0hFQ0tfSEVBREVSX0NPTVBJTEUoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwwCm00X2luY2x1ZGUoYXV0b2NvbmYvZXJsYW5nLm00KQpUMTQsNjMKbTRfY3Jfc3ltYm9sczJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXzAxMjM0NTY3ODkKVDEzLDExNgpfQVNfQk9YX0lORElSc2VkICdoO3MvLi9tNF9kZWZhdWx0KFskMl0sIFstXSkvZztzL14uLi4vQCU6QEAlOkAgLztzLy4uLiQvIEAlOkBAJTpALztwO3g7cDt4JyA8PF9BU0JPWApAJTpAQCU6QCAkMSBAJTpAQCU6QApfQVNCT1gKVDE4LDI0MwpBQ19FUkxBTkdfUEFUSF9FUkxfbTRfZGVmdW5fcHJvKFskMF0pQUNfQVJHX1ZBUihbRVJMXSwgW0VybGFuZy9PVFAgaW50ZXJwcmV0ZXIgY29tbWFuZCBbYXV0b2RldGVjdGVkXV0pZG5sCmlmIHRlc3QgLW4gIiRFUkwiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlcmxdKQogICAgQUNfTVNHX1JFU1VMVChbJEVSTF0pCmVsc2UKICAgIEFDX1BBVEhfVE9PTChFUkwsIGVybCwgWyQxXSwgWyQyXSlbXWRubApmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDE4Cm00X2VycnByaW50bm00X2VycnByaW50KFskMQpdKQpUMTMsMzA2Cm00X2JwYXRzdWJzdHNtNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCiAgICAgICBbJCNdLCAxLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCM6ICQxXSldLAogICAgICAgWyQjXSwgMiwgW200X3VucXVvdGUobTRfYnVpbHRpbihbcGF0c3Vic3RdLCBbWyQxXV0sIFskMl0pKV0sCiAgICAgICBbJCNdLCAzLCBbbTRfdW5xdW90ZShtNF9idWlsdGluKFtwYXRzdWJzdF0sIFtbJDFdXSwgWyQyXSwgWyQzXSkpXSwKICAgICAgIFtfJDAoJEBtNF9pZihtNF9ldmFsKCQjICYgMSksIDAsIFssXSkpXSkKVDEzLDMwOApBQ19QUk9HX0VHUkVQX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgZWdyZXBdLCBhY19jdl9wYXRoX0VHUkVQLAogICBbaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKICAgZWxzZQogICAgIF9BQ19QUk9HX0dSRVAoRUdSRVAsIGVncmVwLCBbJ0VHUkVQJCddKQogICBmaV0pCiBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCiBBQ19TVUJTVChbRUdSRVBdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDI5Cm00X2xvY2F0aW9uKEFTX01FU1NBR0UpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo4MzQKRjcsNAptNF9kZWNyZGVjcgpUMTQsMzIKX0FVX0FMSUFTX0JPRFlbbTRfaWYoJDEjLCAwLCBbJDJdLCBbJDIoJDFAKV0pXQpUMzMsMjMKX0FDX0xBTkdfTlVMTF9QUk9HUkFNKEZvcnRyYW4gNzcpQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDEyLDkzCm00X3RleHRfd3JhcF8kMChtNF9lc2NhcGUoWyQxXSksIFskMl0sIG00X2RlZmF1bHRfcXVvdGVkKFskM10sIFskMl0pLAogICAgIG00X2RlZmF1bHRfcXVvdGVkKFskNF0sIFs3OV0pKQpUMTIsOTMKbTRfc2V0X2VtcHR5bTRfaWZkZWYoW19tNF9zZXRfc2l6ZSgkMSldLAoJICBbbTRfaWYobTRfaW5kaXIoW19tNF9zZXRfc2l6ZSgkMSldKSwgWzBdLCBbJDJdLCBbJDNdKV0sIFskMl0pClQyMywyMzkKX0FDX0xBTkdfSU9fUFJPR1JBTShHbylBQ19MQU5HX1BST0dSQU0oW2ltcG9ydCAoICJmbXQiOyAib3MiICldLApbZiwgZXJyIDo9IG9zLk9wZW4oImNvbmZ0ZXN0Lm91dCIsIG9zLk9fQ1JFQVRFfG9zLk9fV1JPTkxZLCAwNzc3KQogaWYgZXJyICE9IG5pbCB7CglmbXQuUHJpbnRsbihlcnIpCglvcy5FeGl0KDEpCiB9CiBpZiBlcnIgPSBmLkNsb3NlKCk7IGVyciAhPSBuaWwgewoJZm10LlByaW50bG4oZXJyKQoJb3MuRXhpdCgxKQogfQogb3MuRXhpdCgwKQpdKQpUMTIsNDg5CkFDX1NUUlVDVF9UTV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmhdLAogIGFjX2N2X3N0cnVjdF90bSwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHRpbWUuaD4KXSwKCQkJCSAgICBbc3RydWN0IHRtIHRtOwoJCQkJICAgICBpbnQgKnAgPSAmdG0udG1fc2VjOwoJCQkJICAgICByZXR1cm4gIXA7XSldLAoJCSAgIFthY19jdl9zdHJ1Y3RfdG09dGltZS5oXSwKCQkgICBbYWNfY3Zfc3RydWN0X3RtPXN5cy90aW1lLmhdKV0pCmlmIHRlc3QgJGFjX2N2X3N0cnVjdF90bSA9IHN5cy90aW1lLmg7IHRoZW4KICBBQ19ERUZJTkUoVE1fSU5fU1lTX1RJTUUsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgPHN5cy90aW1lLmg+IGRlY2xhcmVzIGBzdHJ1Y3QgdG0nLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMzYKbTRfc2V0X2NvbnRlbnRzbTRfc2V0X21hcF9zZXAoWyQxXSwgW10sIFtdLCBbWyQyXV0pClQzMiwzMAptNF9sb2NhdGlvbihfQVNfRElSTkFNRV9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTAxMQpUMTUsNTUKX0FTX1RSX1NIX0lORElSYEFTX0VDSE8oWyJfQVNfRVNDQVBFKFtbJDFdXSwgW2BdLCBbXF0pIl0pIHwgJGFzX3RyX3NoYApUMTgsMzE2CkFDX0xBTkdfUFJPR1JBTShDKSQxCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRjc3X0hPT0tTXSwgW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdKVtdZG5sCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0ZDX0hPT0tTXSlbXWRubAppbnQKbWFpbiAoKQp7CmRubCBEbyAqbm90KiBpbmRlbnQgdGhlIGZvbGxvd2luZyBsaW5lOiB0aGVyZSBtYXkgYmUgQ1BQIGRpcmVjdGl2ZXMuCmRubCBEb24ndCBtb3ZlIHRoZSBgOycgcmlnaHQgYWZ0ZXIgZm9yIHRoZSBzYW1lIHJlYXNvbi4KJDIKICA7CiAgcmV0dXJuIDA7Cn0KVDIwLDI5Cm00X2xvY2F0aW9uKEFTX0NBU0UpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo1NTAKVDI4LDMzCm00X2xvY2F0aW9uKEFDX1RFU1RfUFJPR1JBTSkuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NDYKVDI3LDMzCm00X2xvY2F0aW9uKEFDX1NJWkVPRl9UWVBFKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo0NApUMjIsMjgKbTRfbG9jYXRpb24oQUNfT1BFTk1QKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjE5ODYKVDEwLDE2OAptNF9jb21iaW5lbTRfaWYoWyQyXSwgW10sIFtdLCBtNF9ldmFsKFskIyA+IDNdKSwgWzFdLApbbTRfbWFwX2FyZ3Nfc2VwKFttNF9tYXBfYXJnc19zZXAobTRfZHF1b3RlKF0sIFspW1skM11dLCBbXSwgW1skMV1dLF1dbTRfZHF1b3RlKG00X2RxdW90ZShtNF9zaGlmdDMoJEApKSlbWyldLCBbWyQxXV0sICQyKV0pClQ5LDMzOQpBU19WQVJfSUZBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwKICBbQVNfSUYobTRfaWZ2YWwoWyQyXSwgW1t0ZXN0ICJ4JCQxIiA9IHhbXSQyXV0sIFtbJHskMTorZmFsc2V9IDpdXSldLAogIFtBU19WQVJfQ09QWShbYXNfdmFsXSwgWyQxXSkKICAgQVNfSUYobTRfaWZ2YWwoWyQyXSwgW1t0ZXN0ICJ4JGFzX3ZhbCIgPSB4W10kMl1dLCBbWyR7YXNfdmFsOitmYWxzZX0gOl1dKV0sCiAgW0FTX0lGKG00X2lmdmFsKFskMl0sCiAgICBbW2V2YWwgdGVzdCBcInhcJCIkMSJcIiA9IHgiX0FTX0VTQ0FQRShbJDJdLCBbYF0sIFtcIiRdKSJdXSwKICAgIFtbZXZhbCBcJHskMTorZmFsc2V9IDpdXSldKSwKWyQzXSwgWyQ0XSkKVDE0LDE4OQpBTV9GVU5DX1NUUlRPRF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9GVU5DX1NUUlRPRCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX1NUUlRPRF0sIFtBQ19GVU5DX1NUUlRPRCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTgzCkFDX1ZFUkJPU0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVkVSQk9TRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19NU0dfUkVTVUxUXSwgW0FDX01TR19SRVNVTFQoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDczMQpBQ19GVU5DX0ZTRUVLT19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfU1lTX0xBUkdFRklMRV9NQUNST19WQUxVRShfTEFSR0VGSUxFX1NPVVJDRSwgMSwKICAgW2FjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlXSwKICAgW0RlZmluZSB0byAxIHRvIG1ha2UgZnNlZWtvIHZpc2libGUgb24gc29tZSBob3N0cyAoZS5nLiBnbGliYyAyLjIpLl0sCiAgIFtbI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KICAgICAjaW5jbHVkZSA8c3RkaW8uaD5dXSwKICAgW1tpbnQgKCpmcCkgKEZJTEUgKiwgb2ZmX3QsIGludCkgPSBmc2Vla287CiAgICAgcmV0dXJuIGZzZWVrbyAoc3RkaW4sIDAsIDApICYmIGZwIChzdGRpbiwgMCwgMCk7XV0pCgojIFdlIHVzZWQgdG8gdHJ5IGRlZmluaW5nIF9YT1BFTl9TT1VSQ0U9NTAwIHRvbywgdG8gd29yayBhcm91bmQgYSBidWcKIyBpbiBnbGliYyAyLjEuMywgYnV0IHRoYXQgYnJlYWtzIHRvbyBtYW55IG90aGVyIHRoaW5ncy4KIyBJZiB5b3Ugd2FudCBmc2Vla28gYW5kIGZ0ZWxsbyB3aXRoIGdsaWJjLCB1cGdyYWRlIHRvIGEgZml4ZWQgZ2xpYmMuCmlmIHRlc3QgJGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlICE9IHVua25vd247IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9GU0VFS08sIDEsCiAgICBbRGVmaW5lIHRvIDEgaWYgZnNlZWtvIChhbmQgcHJlc3VtYWJseSBmdGVsbG8pIGV4aXN0cyBhbmQgaXMgZGVjbGFyZWQuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwyMDIKbTRfY3Jfbm90X3N5bWJvbHMxAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzAxMjM0NTY3ODk6Ozw9Pj9AW1xdXmB7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTEsNzgxCkFDX1BST0dfQ1BQX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubApBQ19BUkdfVkFSKFtDUFBdLCAgICAgIFtDIHByZXByb2Nlc3Nvcl0pZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKQUNfTEFOR19QVVNIKEMpZG5sCkFDX01TR19DSEVDS0lORyhbaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3JdKQojIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgppZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogIENQUD0KZmkKaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KICBBQ19DQUNIRV9WQUwoW2FjX2N2X3Byb2dfQ1BQXSwKICBbZG5sCiAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCiAgICBkbwogICAgICBfQUNfUFJPR19QUkVQUk9DX1dPUktTX0lGRUxTRShbYnJlYWtdKQogICAgZG9uZQogICAgYWNfY3ZfcHJvZ19DUFA9JENQUAogIF0pZG5sCiAgQ1BQPSRhY19jdl9wcm9nX0NQUAplbHNlCiAgYWNfY3ZfcHJvZ19DUFA9JENQUApmaQpBQ19NU0dfUkVTVUxUKFskQ1BQXSkKX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0UoW10sCgkJW0FDX01TR19GQUlMVVJFKFtDIHByZXByb2Nlc3NvciAiJENQUCIgZmFpbHMgc2FuaXR5IGNoZWNrXSldKQpBQ19TVUJTVChDUFApZG5sCkFDX0xBTkdfUE9QKEMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTM5CkFDX0lOQ0xVREVTX0RFRkFVTFRfbTRfZGVmdW5fcHJvKFskMF0pbTRfaWZ2YWwoWyQxXSwgWyQxCl0sCgkgIFtBQ19SRVFVSVJFKFtfQUNfSU5DTFVERVNfREVGQVVMVF9SRVFVSVJFTUVOVFNdKWRubAokYWNfaW5jbHVkZXNfZGVmYXVsdF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxOTIKbTRfY3Jfbm90X3N5bWJvbHMyAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzo7PD0+P0BbXF1eYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tClQxOCw0NwpfQUNfT1VUUFVUX0NPTU1BTkQgIEFDX01TR19OT1RJQ0UoW2V4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kc10pCgpUMTUsMTkyCkFNX1BST0dfSU5TVEFMTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9QUk9HX0lOU1RBTEwnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUFJPR19JTlNUQUxMXSwgW0FDX1BST0dfSU5TVEFMTCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsNDYyCkFDX1RZUEVfSU5UTUFYX1RfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfUkVRVUlSRShbQUNfVFlQRV9MT05HX0xPTkdfSU5UXSkKICBBQ19DSEVDS19UWVBFKFtpbnRtYXhfdF0sCiAgICBbQUNfREVGSU5FKFtIQVZFX0lOVE1BWF9UXSwgMSwKICAgICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgaW50bWF4X3QnLl0pXSwKICAgIFt0ZXN0ICRhY19jdl90eXBlX2xvbmdfbG9uZ19pbnQgPSB5ZXMgXAogICAgICAgJiYgYWNfdHlwZT0nbG9uZyBsb25nIGludCcgXAogICAgICAgfHwgYWNfdHlwZT0nbG9uZyBpbnQnCiAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtpbnRtYXhfdF0sIFskYWNfdHlwZV0sCiAgICAgICBbRGVmaW5lIHRvIHRoZSB3aWRlc3Qgc2lnbmVkIGludGVnZXIgdHlwZQoJaWYgPHN0ZGludC5oPiBhbmQgPGludHR5cGVzLmg+IGRvIG5vdCBkZWZpbmUuXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDM2MgpBQ19QUkVGSVhfUFJPR1JBTV9tNF9kZWZ1bl9wcm8oWyQwXSlpZiB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORTsgdGhlbgpkbmwgV2UgcmVpbXBsZW1lbnQgQUNfTVNHX0NIRUNLSU5HIChtb3N0bHkpIHRvIGF2b2lkIHRoZSAuLi4gaW4gdGhlIG1pZGRsZS4KICBfQVNfRUNIT19OKFtjaGVja2luZyBmb3IgcHJlZml4IGJ5IF0pCiAgQUNfUEFUSF9QUk9HKGFjX3ByZWZpeF9wcm9ncmFtLCBbJDFdKQogIGlmIHRlc3QgLW4gIiRhY19wcmVmaXhfcHJvZ3JhbSI7IHRoZW4KICAgIHByZWZpeD1gQVNfRElSTkFNRShbIiRhY19wcmVmaXhfcHJvZ3JhbSJdKWAKICAgIHByZWZpeD1gQVNfRElSTkFNRShbIiRwcmVmaXgiXSlgCiAgZmkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE1NQpBQ19NSU5JWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19NSU5JWCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwyOTcKQUNfTEFOR19DQUxMKE9iamVjdGl2ZSBDKUFDX0xBTkdfUFJPR1JBTShbJDEKbTRfaWYoWyQyXSwgW21haW5dLCAsClsvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCiAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiCiNlbmRpZgpjaGFyICQyICgpO10pXSwgW3JldHVybiAkMiAoKTtdKQpUMjMsMzAKbTRfbG9jYXRpb24oQVNfRElSTkFNRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjEwMDIKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX1RSWV9DT01QSUxFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQKVDMzLDM0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1RBUkdFVF9UT09MKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoyOTEKVDI2LDM0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1BST0cpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjEwMApGMTIsOAptNF9icGF0c3Vic3RwYXRzdWJzdApUMzAsMzYKQUNfTEFOR19GVU5DX0xJTktfVFJZKEZvcnRyYW4pQUNfTEFOR19QUk9HUkFNKFtdLApbICAgICAgY2FsbCAkMV0pClQzMSwyOQptNF9sb2NhdGlvbihfQVNfU0hFTExfU0FOSVRJWkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo0NTEKVDI4LDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfU1NJWkVfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjA1ClQ3LDIKbTRfZWNobyRAClQyMCwxCkFTX09SSUdJTkFMX1NURElOX0ZENwpUMzEsMzMKbTRfbG9jYXRpb24oQUNfTE9OR19GSUxFX05BTUVTKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2NApUMzIsMzQKbTRfbG9jYXRpb24oQUNfQ0FOT05JQ0FMX1RBUkdFVCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxODMzClQxMyw3NgpfQUNfRE9fVE9LRU5TX200X2RlZnVuX3BybyhbJDBdKXsgYWNfdHJ5PSckMScKICBfQUNfRE8oWyRhY190cnldKTsgfVtdX200X2RlZnVuX2VwaShbJDBdKQpUNywxNDEKQUNfTEFOR19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfTEFOR19TRVQobTRfaWZkZWYoW19BQ19MQU5HXSwgW200X2RlZm4oW19BQ19MQU5HXSldKSwKCSAgICAgIFskMV0pZG5sCm00X2RlZmluZShbX0FDX0xBTkddLCBbJDFdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzcsMzYKbTRfbG9jYXRpb24oQUNfRlVOQ19TRVRWQlVGX1JFVkVSU0VEKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTcxMApUMjgsODYKX0FDX0xBTkdfSU9fUFJPR1JBTShGb3J0cmFuKUFDX0xBTkdfUFJPR1JBTShbXSwKW2RubAogICAgICBvcGVuKHVuaXQ9OSxmaWxlPSdjb25mdGVzdC5vdXQnKQogICAgICBjbG9zZSh1bml0PTkpCl0pClQyNSwxMTEKbTRfc3RhY2tfZm9yZWFjaF9zZXBfbGlmb19tNF9zdGFja19yZXZlcnNlKFskMV0sIFttNF90bXAtJDFdLCBbJDJbXV9tNF9kZWZuKFttNF90bXAtJDFdKSQzXSwgWyQ0W11dKV9tNF9zdGFja19yZXZlcnNlKFttNF90bXAtJDFdLCBbJDFdKQpUMTQsMTAyCl9BU19NRV9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19CQVNFTkFNRV9QUkVQQVJFXSlhc19tZT1gQVNfQkFTRU5BTUUoIiRbMF0iKWAKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxODgKQUNfVFJZX0NQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ1BQJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19QUkVQUk9DX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1skMV1dKV0sIFskMl0sIFskM10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwzMAptNF9sb2NhdGlvbihfQVNfUEFUSF9XQUxLKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTMzOQpUMzcsMzMKbTRfbG9jYXRpb24oX0FDX0NIRUNLX0hFQURFUl9QUkVQUk9DKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjE5MwpUMjQsMzMKbTRfbG9jYXRpb24oQUNfTUVNT1JZX0gpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6ODY4ClQzMCwzNQptNF9sb2NhdGlvbihBQ19GVU5DX0dFVEdST1VQUykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjYyNQpUNyw5MQptNF9hcmdubTRfYXNzZXJ0KFswIDwgJDFdKW00X3B1c2hkZWYoW18kMF0sIFtfbTRfcG9wZGVmKFtfJDBdKV1tNF9kcXVvdGUoWyRdbTRfaW5jcihbJDFdKSkpXyQwKCRAKQpGNyw3CmVzeXNjbWRlc3lzY21kClQxNSwxMjIxCkFDX0ZDX0ZJWEVERk9STV9tNF9kZWZ1bl9vbmNlKFtBQ19GQ19GSVhFREZPUk1dLCBbQUNfTEFOR19QVVNIKFtGb3J0cmFuXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBGb3J0cmFuIGZsYWcgbmVlZGVkIHRvIGFjY2VwdCBmaXhlZC1mb3JtIHNvdXJjZV0sCgkgICAgICAgW2FjX2N2X2ZjX2ZpeGVkZm9ybV0sClthY19jdl9mY19maXhlZGZvcm09dW5rbm93bgphY19mY19maXhlZGZvcm1fRkNGTEFHU19zYXZlPSRGQ0ZMQUdTCmZvciBhY19mbGFnIGluIG5vbmUgLWZmaXhlZC1mb3JtIC1maXhlZCAtcWZpeGVkIC1NZml4ZWQgLWZpeGVkZm9ybSAiLWYgZml4ZWQiIFwKCSAgICAgICArc291cmNlPWZpeGVkIC1maXggLS1maXggLUZpeGVkCmRvCiAgdGVzdCAieCRhY19mbGFnIiAhPSB4bm9uZSAmJiBGQ0ZMQUdTPSIkYWNfZmNfZml4ZWRmb3JtX0ZDRkxBR1Nfc2F2ZSAkYWNfZmxhZyIKICBBQ19DT01QSUxFX0lGRUxTRShbWwpDICAgICBUaGlzIGNvbW1lbnQgc2hvdWxkIGNvbmZ1c2UgZnJlZS1mb3JtIGNvbXBpbGVycy4KICAgICAgcHJvZ3JhbSBtYWluCiAgICAgIGVuZF1dLAoJCSAgICBbYWNfY3ZfZmNfZml4ZWRmb3JtPSRhY19mbGFnOyBicmVha10pCmRvbmUKcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dApGQ0ZMQUdTPSRhY19mY19maXhlZGZvcm1fRkNGTEFHU19zYXZlCl0pCmlmIHRlc3QgIngkYWNfY3ZfZmNfZml4ZWRmb3JtIiA9IHh1bmtub3duOyB0aGVuCiAgbTRfZGVmYXVsdChbJDJdLAoJICAgICBbQUNfTVNHX0VSUk9SKFtGb3J0cmFuIGRvZXMgbm90IGFjY2VwdCBmaXhlZC1mb3JtIHNvdXJjZV0sIDc3KV0pCmVsc2UKICBpZiB0ZXN0ICJ4JGFjX2N2X2ZjX2ZpeGVkZm9ybSIgIT0geG5vbmU7IHRoZW4KICAgIEZDRkxBR1M9IiRGQ0ZMQUdTICRhY19jdl9mY19maXhlZGZvcm0iCiAgZmkKICAkMQpmaQpBQ19MQU5HX1BPUChbRm9ydHJhbl0pZG5sCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19GQ19GSVhFREZPUk1dKW00X3VucXVvdGUoXSwgWylfbTRfZGVmdW5fZXBpKFtBQ19GQ19GSVhFREZPUk1dKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfRkNfRklYRURGT1JNXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfRkNfRklYRURGT1JNXSxdLCBbLCBfbTRfZGl2ZXJ0X2R1bXApXV0pKQpUMTUsMTUwCkFDX0Y3N19XUkFQUEVSU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtfQUNfRjc3X05BTUVfTUFOR0xJTkddKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbiA3NylkbmwKX0FDX0ZDX1dSQVBQRVJTCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMjcKbTRfbG9jYXRpb24oYWNfY3ZfcHJvZ19nY2MpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6NDM2ClQyOSwzMAptNF9sb2NhdGlvbihfQVNfRUNIT19QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTA0NApUOCwyNwptNF9pZnZhbG00X2lmKFskMV0sIFtdLCBbJDNdLCBbJDJdKQpUNywxOTcKbTRfY29weW00X2lmZGVmKFskMl0sIFttNF9mYXRhbChbJDA6IHdvbid0IG92ZXJ3cml0ZSBkZWZpbmVkIG1hY3JvOiAkMl0pXSwKCSAgW200X3N0YWNrX2ZvcmVhY2hfc2VwKFskMV0sIFttNF9wdXNoZGVmKFskMl0sXSwgWyldKV0pbTRfaWZkZWYoW200X2xvY2F0aW9uKCQxKV0sIFttNF9kZWZpbmUoW200X2xvY2F0aW9uKCQyKV0sIG00X2xvY2F0aW9uKV0pClQyNCw2NTEKQUNfRVJMQU5HX1NVQlNUX0VSVFNfVkVSX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0VSTEFOR19ORUVEX0VSTENdKVtdZG5sCkFDX1JFUVVJUkUoW0FDX0VSTEFOR19ORUVEX0VSTF0pW11kbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBFcmxhbmcvT1RQIEVSVFMgdmVyc2lvbl0sCiAgICBbYWNfY3ZfZXJsYW5nX2VydHNfdmVyXSwKICAgIFtBQ19MQU5HX1BVU0goW0VybGFuZ10pW11kbmwKICAgICBBQ19SVU5fSUZFTFNFKAoJW0FDX0xBTkdfUFJPR1JBTShbXSwgW2RubAoJICAgIFZlcnNpb24gPSBlcmxhbmc6c3lzdGVtX2luZm8odmVyc2lvbiksCgkgICAgZmlsZTp3cml0ZV9maWxlKCJjb25mdGVzdC5vdXQiLCBWZXJzaW9uKSwKCSAgICBSZXR1cm5WYWx1ZSA9IDAsCgkgICAgaGFsdChSZXR1cm5WYWx1ZSldKV0sCglbYWNfY3ZfZXJsYW5nX2VydHNfdmVyPWBjYXQgY29uZnRlc3Qub3V0YAoJIHJtIC1mIGNvbmZ0ZXN0Lm91dF0sCglbcm0gLWYgY29uZnRlc3Qub3V0CgkgQUNfTVNHX0ZBSUxVUkUoW3Rlc3QgRXJsYW5nIHByb2dyYW0gZXhlY3V0aW9uIGZhaWxlZF0pXSkKICAgICBBQ19MQU5HX1BPUChbRXJsYW5nXSlbXWRubAogICAgXSkKQUNfU1VCU1QoW0VSTEFOR19FUlRTX1ZFUl0sIFskYWNfY3ZfZXJsYW5nX2VydHNfdmVyXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwzMQptNF9sb2NhdGlvbihBQ19UWVBFX1VJTlQzMl9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MzAKVDQwLDM0Cm00X2xvY2F0aW9uKEFDX1NZU19SRVNUQVJUQUJMRV9TWVNDQUxMUykuLi8uLi9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6MjMyClQxNiw2MwpBQ19DT05GSUdfSEVBREVSX200X2RlZnVuX3BybyhbJDBdKUFDX0NPTkZJR19IRUFERVJTKFskMV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwzNAptNF9sb2NhdGlvbihBQ19HTlVfU09VUkNFKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDozMTQKVDExLDMxCl9BU19JRl9FTFNFbTRfaWZuYmxhbmsoWyQxXSwKW2Vsc2UKICAkMQpdKQpUMTMsMTk2CkFDX1VUSU1FX05VTExfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVVRJTUVfTlVMTCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX1VUSU1FX05VTExdLCBbQUNfRlVOQ19VVElNRV9OVUxMKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSw1NQpBQ19UUllfRVZBTF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRVZBTChbJCQxXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDMxCm00X2xvY2F0aW9uKEFDX1NUUlVDVF9TVF9CTE9DS1MpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00Ojk5OQpUMzAsMzMKbTRfbG9jYXRpb24oQUNfUFJPR1JBTVNfQ0hFQ0spLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjM5ClQxNCwxNTcKYWNfY3ZfcHJvZ19nY2NfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgYWNfY3ZfcHJvZ19nY2MnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCmFjX2N2X2NfY29tcGlsZXJfZ251W11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwyOTIKX0FTX1BBVEhfU0VQQVJBVE9SX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCmlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCiAgUEFUSF9TRVBBUkFUT1I9OgogIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CiAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JwogIH0KZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywyOTcKQUNfTEFOR19DQUxMKE9iamVjdGl2ZSBDKyspQUNfTEFOR19QUk9HUkFNKFskMQptNF9pZihbJDJdLCBbbWFpbl0sICwKWy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgogICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKI2VuZGlmCmNoYXIgJDIgKCk7XSldLCBbcmV0dXJuICQyICgpO10pClQyOCwzMwptNF9sb2NhdGlvbihBQ19QUk9HX0Y3N19DX08pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6NDY1ClQxNSw4NjUKX0FDX1BST0dfT0JKQ19HYWNfdGVzdF9PQkpDRkxBR1M9JHtPQkpDRkxBR1Mrc2V0fQphY19zYXZlX09CSkNGTEFHUz0kT0JKQ0ZMQUdTCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJE9CSkMgYWNjZXB0cyAtZywgYWNfY3ZfcHJvZ19vYmpjX2csCiAgW2FjX3NhdmVfb2JqY193ZXJyb3JfZmxhZz0kYWNfb2JqY193ZXJyb3JfZmxhZwogICBhY19vYmpjX3dlcnJvcl9mbGFnPXllcwogICBhY19jdl9wcm9nX29iamNfZz1ubwogICBPQkpDRkxBR1M9Ii1nIgogICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKICAgICBbYWNfY3ZfcHJvZ19vYmpjX2c9eWVzXSwKICAgICBbT0JKQ0ZMQUdTPSIiCiAgICAgIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJW10sCglbYWNfb2JqY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9vYmpjX3dlcnJvcl9mbGFnCgkgT0JKQ0ZMQUdTPSItZyIKCSBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKCSAgIFthY19jdl9wcm9nX29iamNfZz15ZXNdKV0pXSkKICAgYWNfb2JqY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9vYmpjX3dlcnJvcl9mbGFnXSkKaWYgdGVzdCAiJGFjX3Rlc3RfT0JKQ0ZMQUdTIiA9IHNldDsgdGhlbgogIE9CSkNGTEFHUz0kYWNfc2F2ZV9PQkpDRkxBR1MKZWxpZiB0ZXN0ICRhY19jdl9wcm9nX29iamNfZyA9IHllczsgdGhlbgogIGlmIHRlc3QgIiRHT0JKQyIgPSB5ZXM7IHRoZW4KICAgIE9CSkNGTEFHUz0iLWcgLU8yIgogIGVsc2UKICAgIE9CSkNGTEFHUz0iLWciCiAgZmkKZWxzZQogIGlmIHRlc3QgIiRHT0JKQyIgPSB5ZXM7IHRoZW4KICAgIE9CSkNGTEFHUz0iLU8yIgogIGVsc2UKICAgIE9CSkNGTEFHUz0KICBmaQpmaVtdZG5sCgpUMTQsMTEzCm00X2V4cGFuZF9vbmNlbTRfcHJvdmlkZV9pZihtNF9kZWZhdWx0X3F1b3RlZChbJDJdLCBbJDFdKSwKCSAgICAgICBbXSwKCSAgICAgICBbbTRfcHJvdmlkZShtNF9kZWZhdWx0X3F1b3RlZChbJDJdLCBbJDFdKSlbXSQxXSkKVDE0LDk2Cl9tNF9icGF0c3Vic3RzbTRfaWYoWyQjXSwgMiwgWyQxXSwKICAgICAgIFskMChtNF9idWlsdGluKFtwYXRzdWJzdF0sIFtbJDFdXSwgWyQyXSwgWyQzXSksCgkgICBtNF9zaGlmdDMoJEApKV0pClQxNCw2NgpBQ19UWVBFX01PREVfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19UWVBFKG1vZGVfdCwgaW50KVtdX200X2RlZnVuX2VwaShbJDBdKQpUNiwxMjkKQUNfUlNIX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1JTSCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSw5MjcKQUNfUFJPR19DWFhfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QVVNIKEMrKylkbmwKQUNfQVJHX1ZBUihbQ1hYXSwgICAgICBbQysrIGNvbXBpbGVyIGNvbW1hbmRdKWRubApBQ19BUkdfVkFSKFtDWFhGTEFHU10sIFtDKysgY29tcGlsZXIgZmxhZ3NdKWRubApfQUNfQVJHX1ZBUl9MREZMQUdTKClkbmwKX0FDX0FSR19WQVJfTElCUygpZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKX0FDX0FSR19WQVJfUFJFQ0lPVVMoW0NDQ10pZG5sCmlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCiAgaWYgdGVzdCAtbiAiJENDQyI7IHRoZW4KICAgIENYWD0kQ0NDCiAgZWxzZQogICAgQUNfQ0hFQ0tfVE9PTFMoQ1hYLAoJCSAgIFttNF9kZWZhdWx0KFskMV0sCgkJCSAgICAgICBbZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bENdKV0sCgkJICAgZysrKQogIGZpCmZpCiMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KX0FTX0VDSE9fTE9HKFtjaGVja2luZyBmb3IgX0FDX0xBTkcgY29tcGlsZXIgdmVyc2lvbl0pCnNldCBYICRhY19jb21waWxlCmFjX2NvbXBpbGVyPSRbMl0KZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwogIF9BQ19ET19MSU1JVChbJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiZBU19NRVNTQUdFX0xPR19GRF0pCmRvbmUKCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfRVhFRVhUXSlbXWRubAptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX09CSkVYVF0pW11kbmwKX0FDX0xBTkdfQ09NUElMRVJfR05VCmlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgogIEdYWD15ZXMKZWxzZQogIEdYWD0KZmkKX0FDX1BST0dfQ1hYX0cKQUNfTEFOR19QT1AoQysrKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDQxCm00X3Byb3ZpZGVfaWZtNF9pZmRlZihbbTRfcHJvdmlkZSgkMSldLAoJICBbJDJdLCBbJDNdKQpUMzMsMzQKbTRfbG9jYXRpb24oX0FDX0ZDX05BTUVfTUFOR0xJTkcpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTAxNQpUMTYsODM4Cl9BU19MTl9TX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCiAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQplbHNlCiAgcm0gLWYgY29uZiQkLmRpcgogIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKZmkKaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgogIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgogICAgYXNfbG5fcz0nbG4gLXMnCiAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgogICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgogICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCiAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CiAgICAgIGFzX2xuX3M9J2NwIC1wUicKICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgogICAgYXNfbG5fcz1sbgogIGVsc2UKICAgIGFzX2xuX3M9J2NwIC1wUicKICBmaQplbHNlCiAgYXNfbG5fcz0nY3AgLXBSJwpmaQpybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCnJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCw1ODEKX0FDX1BBVEhfUFJPR1NfRkVBVFVSRV9DSEVDS2lmIHRlc3QgLXogIiQkMSI7IHRoZW4KICBhY19wYXRoXyQxX2ZvdW5kPWZhbHNlCiAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKICBfQVNfUEFUSF9XQUxLKFskNV0sCiAgW2ZvciBhY19wcm9nIGluICQyOyBkbwogICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgICAgIGFjX3BhdGhfJDE9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCiAgICAgIEFTX0VYRUNVVEFCTEVfUChbIiRhY19wYXRoXyQxIl0pIHx8IGNvbnRpbnVlCiQzCiAgICAgICRhY19wYXRoXyQxX2ZvdW5kICYmIGJyZWFrIDMKICAgIGRvbmUKICBkb25lXSlkbmwKICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF8kMSI7IHRoZW4KICAgIG00X2RlZmF1bHQoWyQ0XSwKICAgICAgW0FDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBtNF9icGF0c3Vic3QoWyQyXSwgWyAuKl0pIGNvdWxkIGJlIGRubApmb3VuZCBpbiBtNF9kZWZhdWx0KFskNV0sIFtcJFBBVEhdKV0pXSkKICBmaQplbHNlCiAgYWNfY3ZfcGF0aF8kMT0kJDEKZmkKClQ4LDEwNzUKQVNfVU5BTUV7CmNhdCA8PF9BU1VOQU1FCm00X3RleHRfYm94KFtQbGF0Zm9ybS5dKQoKaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCnVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAp1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCgovdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCgovYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAovdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAovYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCgpfQVNVTkFNRQoKX0FTX1BBVEhfV0FMSyhbJFBBVEhdLCBbQVNfRUNITyhbIlBBVEg6ICRhc19kaXIiXSldKQp9ClQ0NiwzMwptNF9sb2NhdGlvbihfQUNfSU5DTFVERVNfREVGQVVMVF9SRVFVSVJFTUVOVFMpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6Mjk3ClQzMCwyNwptNF9sb2NhdGlvbihBQ19QUk9HX09CSkNYWENQUCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo5NjEKVDI0LDM0Cm00X2xvY2F0aW9uKEFDX0lSSVhfU1VOKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo0NzQKVDI5LDMzCm00X2xvY2F0aW9uKEFDX0NIQVJfVU5TSUdORUQpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjU0ClQ3LDE2CkFTX0xOX1MkYXNfbG5fcyAkMSAkMltdClQ3LDEyOQpBU19MTl9TX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19MTl9TX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxNTQKQUNfUFJPVklERW00X2lmZGVmKFttNF9wcm92aWRlKCQxKV0sIFtdLApbbTRfc2V0X2FkZChbX200X3Byb3ZpZGVdLCBbJDFdLCBbbTRfZGVmaW5lKFttNF9wcm92aWRlKCQxKV0sCiAgbTRfaWZkZWYoW19tNF9kaXZlcnRpbmddLCBbX200X2RlZm4oW19tNF9kaXZlcnRpbmddKV0pKV0pXSkKVDE4LDIwNwpfQVNfVFJfQ1BQX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX0NSX1BSRVBBUkVdKSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVtbXl8kYXNfY3JfYWxudW1dXSVfJWcnIgpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDksNzUKQVNfRVNDQVBFXyQwKFskMV0sIG00X2lmKFskMl0sIFtdLCBbW2BdLCBbXCIkXV0sIFttNF9zdWJzdHIoWyQyXSwgWzBdLCBbMV0pLCBbJDJdXSkpClQyMiwzMwptNF9sb2NhdGlvbihBQ19TSVpFX1QpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjczClQyMCw0Cl9tNF9kaXZlcnRfZGl2ZXJzaW9uS0lMTApUMjQsMjkKbTRfbG9jYXRpb24oX0FTX1BSRVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDozMjIKVDIyLDMwCm00X2xvY2F0aW9uKEFTX0VDSE9fTikuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjEwMzQKVDIxLDMzCm00X2xvY2F0aW9uKEFDX09GRl9UKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2OApUMzAsMzAKbTRfbG9jYXRpb24oX0FTX1RSX1NIX1BSRVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxODA1ClQyMywzMAptNF9sb2NhdGlvbihBU19NS0RJUl9QKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTI4OQpUMjYsMAptNF9pbmNsdWRlKGF1dG9jb25mL2dvLm00KQpGMTIsOApfbTRfdW5kaXZlcnR1bmRpdmVydApUMTksNApBQ19BVVRPQ09ORl9WRVJTSU9OMi42OQpUMjMsMTA1CkFDX0xBTkdfUFJFUFJPQ19SRVFVSVJFX200X2RlZnVuX3BybyhbJDBdKW00X3JlcXVpcmUoW0FDX0xBTkdfUFJFUFJPQyhdX0FDX0xBTkdbKV0sCgkgICAgW0FDX0xBTkdfUFJFUFJPQ10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwyMDYKQUNfRlVOQ19WUFJJTlRGX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX0ZVTkNTKHZwcmludGYsIFtdCltBQ19DSEVDS19GVU5DKF9kb3BybnQsCgkgICAgICAgW0FDX0RFRklORShIQVZFX0RPUFJOVCwgMSwKCQkJICBbRGVmaW5lIHRvIDEgaWYgeW91IGRvbid0IGhhdmUgYHZwcmludGYnIGJ1dCBkbyBoYXZlCgkJCSAgYF9kb3BybnQuJ10pXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDcsNTQKX200X2Nkcm00X2lmKFskI10sIDEsIFtdLAogICAgICAgWywgbTRfZHF1b3RlKG00X3NoaWZ0KCRAKSldKQpUMTMsODcxCl9BQ19QUk9HX0ZDX0dfQUNfRk9SVFJBTl9BU1NFUlQoKWRubAphY190ZXN0X1tdX0FDX0xBTkdfUFJFRklYW11GTEFHUz0ke1tdX0FDX0xBTkdfUFJFRklYW11GTEFHUytzZXR9CmFjX3NhdmVfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRbXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKX0FDX0xBTkdfUFJFRklYW11GTEFHUz0KQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkW11fQUNfRkNbXSBhY2NlcHRzIC1nLCBhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fZywKW19BQ19MQU5HX1BSRUZJWFtdRkxBR1M9LWcKX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sClthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fZz15ZXNdLApbYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX2c9bm9dKQpdKQppZiB0ZXN0ICIkYWNfdGVzdF9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MiID0gc2V0OyB0aGVuCiAgX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kYWNfc2F2ZV9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKZWxpZiB0ZXN0ICRhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fZyA9IHllczsgdGhlbgogIGlmIHRlc3QgIngkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9jb21waWxlcl9nbnUiID0geHllczsgdGhlbgogICAgX0FDX0xBTkdfUFJFRklYW11GTEFHUz0iLWcgLU8yIgogIGVsc2UKICAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9Ii1nIgogIGZpCmVsc2UKICBpZiB0ZXN0ICJ4JGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KICAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9Ii1PMiIKICBlbHNlCiAgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPQogIGZpCmZpW11kbmwKClQxMCw4NgptNF90b3VwcGVybTRfdHJhbnNsaXQoW1skMV1dLCBbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpdLAoJCSAgICAgW0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXSkKVDI1LDMwCm00X2xvY2F0aW9uKEFDX0xBTkdfQ0FMTCkuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoyNzIKVDgsMTkKbTRfY3VycnkkMShtNF9zaGlmdCgkQCwpXyQwCkY0LDQKaW5jcmluY3IKVDI3LDc3Cl9BQ19DSEVDS19UWVBFX01BWUJFX1RZUEVfUG00X2JtYXRjaChbJDFdLCBbXltfYS16QS1aMC05IF0rXChbX2EtekEtWjAtOSgpICpdXHxcW1x8XF1cKSokXSwKCSAgMSwgMClkbmwKClQxNCwxODkKQUNfSEVMUF9TVFJJTkdfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQVNfSEVMUF9TVFJJTkddLCBbQVNfSEVMUF9TVFJJTkcoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMzLDMxCm00X2xvY2F0aW9uKEFDX1NUUlVDVF9TVF9CTEtTSVpFKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo5NzMKVDE2LDU2Cl9BU19UUl9DUFBfSU5ESVJgQVNfRUNITyhbIl9BU19FU0NBUEUoW1skMV1dLCBbYF0sIFtcXSkiXSkgfCAkYXNfdHJfY3BwYApUMjMsODMKQUNfQ09ORklHX0NPTU1BTkRTX1BPU1RfbTRfZGVmdW5fcHJvKFskMF0pbTRfYXBwZW5kKFtBQ19PVVRQVVRfQ09NTUFORFNfUE9TVF0sIFskMQpdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMzAKbTRfbG9jYXRpb24oQUNfTEFOR19SRVNUT1JFKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEzNApUMzEsMzMKbTRfbG9jYXRpb24oQUNfQ09ORklHX0NPTU1BTkRTKS4uLy4uL2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTAwOQpUMjMsNjA0CkFDX1BST0dfR0NDX1RSQURJVElPTkFMX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAppZiB0ZXN0ICRhY19jdl9jX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgogICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ0MgbmVlZHMgLXRyYWRpdGlvbmFsLAogICAgICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCwKWyAgYWNfcGF0dGVybj0iQXV0b2NvbmYuKid4JyIKICBBQ19FR1JFUF9DUFAoJGFjX3BhdHRlcm4sIFsjaW5jbHVkZSA8c2d0dHkuaD4KQXV0b2NvbmYgVElPQ0dFVFBdLAogIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPXllcywgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9bm8pCgogIGlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsID0gbm87IHRoZW4KICAgIEFDX0VHUkVQX0NQUCgkYWNfcGF0dGVybiwgWyNpbmNsdWRlIDx0ZXJtaW8uaD4KQXV0b2NvbmYgVENHRVRBXSwKICAgIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPXllcykKICBmaV0pCiAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSB5ZXM7IHRoZW4KICAgIENDPSIkQ0MgLXRyYWRpdGlvbmFsIgogIGZpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMTA3MgpBQ19DT05GSUdfQVVYX0RJUlNfbTRfZGVmdW5fcHJvKFskMF0pYWNfYXV4X2Rpcj0KZm9yIGFjX2RpciBpbiAkMTsgZG8KICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCiAgICBhY19hdXhfZGlyPSRhY19kaXIKICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCiAgICBicmVhawogIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgogICAgYWNfYXV4X2Rpcj0kYWNfZGlyCiAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgogICAgYnJlYWsKICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgogICAgYWNfYXV4X2Rpcj0kYWNfZGlyCiAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKICAgIGJyZWFrCiAgZmkKZG9uZQppZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiAkMV0pCmZpCgojIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgojIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgphY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCmFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgphY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCgpBQ19QUk9WSURFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwzNAptNF9sb2NhdGlvbihBQ19DQU5PTklDQUxfQlVJTEQpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTc4OApUMzAsMzEKbTRfbG9jYXRpb24oX0FDX1NUUlVDVF9ESVJFTlQpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjkzOQpUMTcsMjgKbTRfZGVmYXVsdF9uYmxhbmttNF9pZmJsYW5rKFskMV0sIFskMl0sIFskMV0pClQxMSwzCl9BQ19DQyhDKyspQ1hYClQxNSw2NwpBQ19UWVBFX1NTSVpFX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfVFlQRShzc2l6ZV90LCBpbnQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxMTMKQUNfQ0hFQ0tfVFlQRVNfbTRfZGVmdW5fcHJvKFskMF0pbTRfbWFwX2FyZ3Nfc2VwKFtfQUNfQ0hFQ0tfVFlQRV9ORVcoXyQwKF0sIFspWwokMl0sIFskM10sIFskNF0pXSwgW10sICQxKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMjkKbTRfbG9jYXRpb24oX0FTX0RJUk5BTUVfU0VEKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6OTgyClQxOCw1NDAKX0FTX1RSX0NQUF9MSVRFUkFMbTRfdHJhbnNsaXQoW1skMV1dLAogIFsqW11dW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzo7PD0+P0BbXF1eYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tXSwKICBbUFtdXVtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX10pClQxNywxNzk3Cl9BQ19GQ19EVU1NWV9NQUlOX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCm00X2RlZmluZShfQUNfTEFOR19QUk9HUkFNX0NfW11fQUNfRkNbXV9IT09LUywKWyNpZmRlZiBdX0FDX0ZDW19EVU1NWV9NQUlOCl1BQ19MQU5HX0NBU0UoW0ZvcnRyYW5dLCBbI2lmbmRlZiBGQ19EVU1NWV9NQUlOX0VRX0Y3N10pClsjICBpZmRlZiBfX2NwbHVzcGx1cwogICAgIGV4dGVybiAiQyIKIyAgZW5kaWYKICAgaW50IF1fQUNfRkNbX0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Cl1BQ19MQU5HX0NBU0UoW0ZvcnRyYW5dLCBbI2VuZGlmXSkKWyNlbmRpZgpdKQpBQ19DQUNIRV9DSEVDSyhbZm9yIGR1bW15IG1haW4gdG8gbGluayB3aXRoIF9BQ19MQU5HIGxpYnJhcmllc10sCgkgICAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9kdW1teV9tYWluLApbYWNfW11fQUNfTEFOR19BQkJSRVZbXV9kbV9zYXZlX0xJQlM9JExJQlMKIExJQlM9IiRMSUJTICRbXV9BQ19MQU5HX1BSRUZJWFtdTElCUyIKIGFjX2ZvcnRyYW5fZG1fdmFyPVtdX0FDX0ZDW11fRFVNTVlfTUFJTgogQUNfTEFOR19QVVNIKEMpZG5sCgogIyBGaXJzdCwgdHJ5IGxpbmtpbmcgd2l0aG91dCBhIGR1bW15IG1haW46CiBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbXSldLAoJCVthY19jdl9mb3J0cmFuX2R1bW15X21haW49bm9uZV0sCgkJW2FjX2N2X2ZvcnRyYW5fZHVtbXlfbWFpbj11bmtub3duXSkKCiBpZiB0ZXN0ICRhY19jdl9mb3J0cmFuX2R1bW15X21haW4gPSB1bmtub3duOyB0aGVuCiAgIGZvciBhY19mdW5jIGluIE1BSU5fXyBNQUlOXyBfX21haW4gTUFJTiBfTUFJTiBfX01BSU4gbWFpbl8gbWFpbl9fIF9tYWluOyBkbwogICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tAJTpAZGVmaW5lICRhY19mb3J0cmFuX2RtX3ZhciAkYWNfZnVuY11dKV0sCgkJICAgIFthY19jdl9mb3J0cmFuX2R1bW15X21haW49JGFjX2Z1bmM7IGJyZWFrXSkKICAgZG9uZQogZmkKIEFDX0xBTkdfUE9QKEMpZG5sCiBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2R1bW15X21haW49JGFjX2N2X2ZvcnRyYW5fZHVtbXlfbWFpbgogcm0gLXJmIGNvbmZ0ZXN0KgogTElCUz0kYWNfW11fQUNfTEFOR19BQkJSRVZbXV9kbV9zYXZlX0xJQlMKXSkKW11fQUNfRkNbXV9EVU1NWV9NQUlOPSRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2R1bW15X21haW4KQVNfSUYoW3Rlc3QgIiRbXV9BQ19GQ1tdX0RVTU1ZX01BSU4iICE9IHVua25vd25dLAogICAgICBbbTRfZGVmYXVsdChbJDFdLApbaWYgdGVzdCAkW11fQUNfRkNbXV9EVU1NWV9NQUlOICE9IG5vbmU7IHRoZW4KICBBQ19ERUZJTkVfVU5RVU9URUQoW11fQUNfRkNbXV9EVU1NWV9NQUlOLCAkW11fQUNfRkNbXV9EVU1NWV9NQUlOLAoJCSAgICAgW0RlZmluZSB0byBkdW1teSBgbWFpbicgZnVuY3Rpb24gKGlmIGFueSkgcmVxdWlyZWQgdG8KCQkgICAgICBsaW5rIHRvIHRoZSBGb3J0cmFuIGxpYnJhcmllcy5dKQogIGlmIHRlc3QgIngkYWNfY3ZfZmNfZHVtbXlfbWFpbiIgPSAieCRhY19jdl9mNzdfZHVtbXlfbWFpbiI7IHRoZW4KCUFDX0RFRklORShbRkNfRFVNTVlfTUFJTl9FUV9GNzddLCAxLAoJCSAgW0RlZmluZSBpZiBGNzcgYW5kIEZDIGR1bW15IGBtYWluJyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbC5dKQogIGZpCmZpXSldLAogICAgICBbbTRfZGVmYXVsdChbJDJdLAoJICAgIFtBQ19NU0dfRkFJTFVSRShbbGlua2luZyB0byBGb3J0cmFuIGxpYnJhcmllcyBmcm9tIEMgZmFpbHNdKV0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCw1MzEKQUNfRVJMQU5HX1NVQlNUX0lOU1RBTExfTElCX1NVQkRJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfRElSXSlbXWRubApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBFcmxhbmcvT1RQICckMScgbGlicmFyeSBpbnN0YWxsYXRpb24gc3ViZGlyZWN0b3J5XSkKQUNfQVJHX1ZBUihbRVJMQU5HX0lOU1RBTExfTElCX0RJUl8kMV0sCiAgICBbRXJsYW5nL09UUCAnJDEnIGxpYnJhcnkgaW5zdGFsbGF0aW9uIHN1YmRpcmVjdG9yeQogICAgICAgW0VSTEFOR19JTlNUQUxMX0xJQl9ESVIvJDEtJDJdXSkKaWYgdGVzdCAtbiAiJEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfJDEiOyB0aGVuCiAgICBBQ19NU0dfUkVTVUxUKFskRVJMQU5HX0lOU1RBTExfTElCX0RJUl8kMV0pCmVsc2UKICAgIEFDX1NVQlNUKFtFUkxBTkdfSU5TVEFMTF9MSUJfRElSXyQxXSwgWycke0VSTEFOR19JTlNUQUxMX0xJQl9ESVJ9LyQxLSQyJ10pCiAgICBBQ19NU0dfUkVTVUxUKFskRVJMQU5HX0lOU1RBTExfTElCX0RJUi8kMS0kMl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNDgKbTRfcmVfZXNjYXBlbTRfYnBhdHN1YnN0KFskMV0sCgkgICAgICBbW11bKisuP1xeJF1dLCBbXFxcJl0pClQzMSwyNwptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0MoQykpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MzM2ClQyNSwzNgptNF9sb2NhdGlvbihBQ19GVU5DX0ZPUkspLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNzg2ClQxMiwyNgptNF9ub3JtYWxpemVtNF9zdHJpcChtNF9mbGF0dGVuKFskMV0pKQpUNiwxMzIKZGl2ZXJ0bTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X3N0YWNrXSltNF9kZWZpbmUoW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSwgWyQxXSltNF9kaXZlcnRfc3RhY2tfcHVzaChbJDBdLCBbJDFdKV9tNF9kaXZlcnRfcmF3KF9tNF9kaXZlcnQoWyQxXSkpClQxOCw0MApfbTRfc2V0X2RpZmZlcmVuY2VtNF9zZXRfY29udGFpbnMoWyQxXSwgWyQyXSwgW10sIFssWyQyXV0pClQyMCw2NwpBQ19MQU5HX0NPTkZURVNUKEdvKWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEW10kMQpfQUNFT0YKVDE2LDg5CkFDX0NPTkZJR19TUkNESVJfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwgW2FjX3VuaXF1ZV9maWxlPSIkMSJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjMsMzQKbTRfbG9jYXRpb24oQUNfUlVOX0xPRykuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDY4CkYzLDMKZG5sZG5sClQyNywzNAptNF9sb2NhdGlvbihBQ19DSEVDS19ERUNMUykuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyODgwClQxNiw4MDcKX0FDX0lOSVRfUEFDS0FHRV9BQ19JTklUX0xJVEVSQUwoWyQxXSkKX0FDX0lOSVRfTElURVJBTChbJDJdKQpfQUNfSU5JVF9MSVRFUkFMKFskM10pCm00X2lmbmRlZihbQUNfUEFDS0FHRV9OQU1FXSwKCSAgW200X2RlZmluZShbQUNfUEFDS0FHRV9OQU1FXSwgICAgIFskMV0pXSkKbTRfaWZuZGVmKFtBQ19QQUNLQUdFX1RBUk5BTUVdLAoJICBbbTRfZGVmaW5lKFtBQ19QQUNLQUdFX1RBUk5BTUVdLAoJCSAgICAgbTRfZGVmYXVsdChbJDRdLAoJCQkJW200X2JwYXRzdWJzdChtNF90b2xvd2VyKG00X2JwYXRzdWJzdChbWyQxXV0sCgkJCQkJCQkJICAgICBbR05VIF0pKSwKCQkJCSBbW15fYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XV0sCgkJCQkgWy1dKV0pKV0pCm00X2lmbmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwKCSAgW200X2RlZmluZShbQUNfUEFDS0FHRV9WRVJTSU9OXSwgICBbJDJdKV0pCm00X2lmbmRlZihbQUNfUEFDS0FHRV9TVFJJTkddLAoJICBbbTRfZGVmaW5lKFtBQ19QQUNLQUdFX1NUUklOR10sICAgIFskMSAkMl0pXSkKbTRfaWZuZGVmKFtBQ19QQUNLQUdFX0JVR1JFUE9SVF0sCgkgIFttNF9kZWZpbmUoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgWyQzXSldKQptNF9pZm5kZWYoW0FDX1BBQ0tBR0VfVVJMXSwKCSAgW200X2RlZmluZShbQUNfUEFDS0FHRV9VUkxdLAogIG00X2lmKFskNV0sIFtdLCBbbTRfaWYobTRfaW5kZXgoWyQxXSwgW0dOVSBdKSwgWzBdLAoJICBbW2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9dbTRfZGVmbihbQUNfUEFDS0FHRV9UQVJOQU1FXSlbL11dKV0sCglbWyQ1XV0pKV0pCgpUMzEsMzMKbTRfbG9jYXRpb24oQUNfSEVBREVSX1NZU19XQUlUKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjczNApUMjUsMwpfbTRfZGl2ZXJ0KFZFUlNJT05fQkVHSU4pMjAwClQyNywyMDUyCl9BU19WRVJTSU9OX0NPTVBBUkVfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlbYXNfYXdrX3N0cnZlcnNjbXA9JwogICMgVXNlIG9ubHkgYXdrIGZlYXR1cmVzIHRoYXQgd29yayB3aXRoIDd0aCBlZGl0aW9uIFVuaXggYXdrICgxOTc4KS4KICAjIE15LCB3aGF0IGFuIG9sZCBhd2sgeW91IGhhdmUsIE1yLiBTb2xhcmlzIQogIEVORCB7CiAgICB3aGlsZSAobGVuZ3RoKHYxKSAmJiBsZW5ndGgodjIpKSB7CiAgICAgICMgU2V0IGQxIHRvIGJlIHRoZSBuZXh0IHRoaW5nIHRvIGNvbXBhcmUgZnJvbSB2MSwgYW5kIGxpa2V3aXNlIGZvciBkMi4KICAgICAgIyBOb3JtYWxseSB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciwgYnV0IGlmIHYxIGFuZCB2MiBjb250YWluIGRpZ2l0cywKICAgICAgIyBjb21wYXJlIHRoZW0gYXMgaW50ZWdlcnMgYW5kIGZyYWN0aW9ucyBhcyBzdHJ2ZXJzY21wIGRvZXMuCiAgICAgIGlmICh2MSB+IC9eWzAtOV0vICYmIHYyIH4gL15bMC05XS8pIHsKCSMgU3BsaXQgdjEgYW5kIHYyIGludG8gdGhlaXIgbGVhZGluZyBkaWdpdCBzdHJpbmcgY29tcG9uZW50cyBkMSBhbmQgZDIsCgkjIGFuZCBhZHZhbmNlIHYxIGFuZCB2MiBwYXN0IHRoZSBsZWFkaW5nIGRpZ2l0IHN0cmluZ3MuCglmb3IgKGxlbjEgPSAxOyBzdWJzdHIodjEsIGxlbjEgKyAxKSB+IC9eWzAtOV0vOyBsZW4xKyspIGNvbnRpbnVlCglmb3IgKGxlbjIgPSAxOyBzdWJzdHIodjIsIGxlbjIgKyAxKSB+IC9eWzAtOV0vOyBsZW4yKyspIGNvbnRpbnVlCglkMSA9IHN1YnN0cih2MSwgMSwgbGVuMSk7IHYxID0gc3Vic3RyKHYxLCBsZW4xICsgMSkKCWQyID0gc3Vic3RyKHYyLCAxLCBsZW4yKTsgdjIgPSBzdWJzdHIodjIsIGxlbjIgKyAxKQoJaWYgKGQxIH4gL14wLykgewoJICBpZiAoZDIgfiAvXjAvKSB7CgkgICAgIyBDb21wYXJlIHR3byBmcmFjdGlvbnMuCgkgICAgd2hpbGUgKGQxIH4gL14wLyAmJiBkMiB+IC9eMC8pIHsKCSAgICAgIGQxID0gc3Vic3RyKGQxLCAyKTsgbGVuMS0tCgkgICAgICBkMiA9IHN1YnN0cihkMiwgMik7IGxlbjItLQoJICAgIH0KCSAgICBpZiAobGVuMSAhPSBsZW4yICYmICEgKGxlbjEgJiYgbGVuMiAmJiBzdWJzdHIoZDEsIDEsIDEpID09IHN1YnN0cihkMiwgMSwgMSkpKSB7CgkgICAgICAjIFRoZSB0d28gY29tcG9uZW50cyBkaWZmZXIgaW4gbGVuZ3RoLCBhbmQgdGhlIGNvbW1vbiBwcmVmaXgKCSAgICAgICMgY29udGFpbnMgb25seSBsZWFkaW5nIHplcm9zLiAgQ29uc2lkZXIgdGhlIGxvbmdlciB0byBiZSBsZXNzLgoJICAgICAgZDEgPSAtbGVuMQoJICAgICAgZDIgPSAtbGVuMgoJICAgIH0gZWxzZSB7CgkgICAgICAjIE90aGVyd2lzZSwgY29tcGFyZSBhcyBzdHJpbmdzLgoJICAgICAgZDEgPSAieCIgZDEKCSAgICAgIGQyID0gIngiIGQyCgkgICAgfQoJICB9IGVsc2UgewoJICAgICMgQSBmcmFjdGlvbiBpcyBsZXNzIHRoYW4gYW4gaW50ZWdlci4KCSAgICBleGl0IDEKCSAgfQoJfSBlbHNlIHsKCSAgaWYgKGQyIH4gL14wLykgewoJICAgICMgQW4gaW50ZWdlciBpcyBncmVhdGVyIHRoYW4gYSBmcmFjdGlvbi4KCSAgICBleGl0IDIKCSAgfSBlbHNlIHsKCSAgICAjIENvbXBhcmUgdHdvIGludGVnZXJzLgoJICAgIGQxICs9IDAKCSAgICBkMiArPSAwCgkgIH0KCX0KICAgICAgfSBlbHNlIHsKCSMgVGhlIG5vcm1hbCBjYXNlLCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGRpZ2l0cy4KCWQxID0gc3Vic3RyKHYxLCAxLCAxKTsgdjEgPSBzdWJzdHIodjEsIDIpCglkMiA9IHN1YnN0cih2MiwgMSwgMSk7IHYyID0gc3Vic3RyKHYyLCAyKQogICAgICB9CiAgICAgIGlmIChkMSA8IGQyKSBleGl0IDEKICAgICAgaWYgKGQxID4gZDIpIGV4aXQgMgogICAgfQogICAgIyBCZXdhcmUgU29sYXJpcyAvdXNyL3hncDQvYmluL2F3ayAoYXQgbGVhc3QgdGhyb3VnaCBTb2xhcmlzIDEwKSwKICAgICMgd2hpY2ggbWlzaGFuZGxlcyBzb21lIGNvbXBhcmlzb25zIG9mIGVtcHR5IHN0cmluZ3MgdG8gaW50ZWdlcnMuCiAgICBpZiAobGVuZ3RoKHYyKSkgZXhpdCAxCiAgICBpZiAobGVuZ3RoKHYxKSkgZXhpdCAyCiAgfQonXVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjEsMzg2CkFDX0ZVTkNfRVJST1JfQVRfTElORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MSUJTT1VSQ0VTKFtlcnJvci5oLCBlcnJvci5jXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBlcnJvcl9hdF9saW5lXSwgYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmUsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8ZXJyb3IuaD5dLAoJCQkJIFtlcnJvcl9hdF9saW5lICgwLCAwLCAiIiwgMCwgImFuIGVycm9yIG9jY3VycmVkIik7XSldLAoJCVthY19jdl9saWJfZXJyb3JfYXRfbGluZT15ZXNdLAoJCVthY19jdl9saWJfZXJyb3JfYXRfbGluZT1ub10pXSkKaWYgdGVzdCAkYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmUgPSBubzsgdGhlbgogIEFDX0xJQk9CSihlcnJvcikKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwzMwptNF9sb2NhdGlvbihBQ19TWVNfSU5URVJQUkVURVIpLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjU5ClQyMiwzMwptNF9sb2NhdGlvbihBQ19NT0RFX1QpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjY3ClQxNCwxMTYKQVNfTElORU5PX1BVU0hfbTRfZGVmdW5fcHJvKFskMF0pYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFja1tdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsMzgKQUNfTEFOR19DQUxMKEZvcnRyYW4gNzcpQUNfTEFOR19QUk9HUkFNKFskMV0sClsgICAgICBjYWxsICQyXSkKRjEyLDgKX200X3VuZGVmaW5ldW5kZWZpbmUKVDE4LDk1CkFDX1BST0dfQ1BQX1dFUlJPUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NQUF0pZG5sCmFjX2NfcHJlcHJvY193YXJuX2ZsYWc9eWVzW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwzMAptNF9sb2NhdGlvbihBQ19MQU5HX0NPTkZURVNUKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE5MwpUMTAsNzkKX200X3NoaWZ0bm00X2lmKFskMV0sIDEsIFttNF9zaGlmdChdLAogICAgICAgWyQwKG00X2RlY3IoWyQxXSldKSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSkKVDEzLDgxNApfQUNfUFJPR19GQ19WX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0NBQ0hFX0NIRUNLKFtob3cgdG8gZ2V0IHZlcmJvc2UgbGlua2luZyBvdXRwdXQgZnJvbSAkW11fQUNfRkNbXV0sCgkJW2FjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV92XSwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sClthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fdj0KIyBUcnkgc29tZSBvcHRpb25zIGZyZXF1ZW50bHkgdXNlZCB2ZXJib3NlIG91dHB1dApmb3IgYWNfdmVyYiBpbiAtdiAtdmVyYm9zZSAtLXZlcmJvc2UgLVYgLVwjXCNcIzsgZG8KICBfQUNfUFJPR19GQ19WX09VVFBVVCgkYWNfdmVyYikKICAjIGxvb2sgZm9yIC1sKiBhbmQgKi5hIGNvbnN0cnVjdHMgaW4gdGhlIG91dHB1dAogIGZvciBhY19hcmcgaW4gJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fdl9vdXRwdXQ7IGRvCiAgICAgY2FzZSAkYWNfYXJnIGluCglbW1xcL11dKi5hIHwgPzpbW1xcL11dKi5hIHwgLVtbbExSdV1dKikKCSAgYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX3Y9JGFjX3ZlcmIKCSAgYnJlYWsgMiA7OwogICAgIGVzYWMKICBkb25lCmRvbmUKaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV92IjsgdGhlbgogICBBQ19NU0dfV0FSTihbY2Fubm90IGRldGVybWluZSBob3cgdG8gb2J0YWluIGxpbmtpbmcgaW5mb3JtYXRpb24gZnJvbSAkW11fQUNfRkNbXV0pCmZpXSwKCQkgIFtBQ19NU0dfV0FSTihbY29tcGlsYXRpb24gZmFpbGVkXSldKQpdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsODQ2Cl9BQ19PVVRQVVRfSEVBREVSCiAgIwogICMgQ09ORklHX0hFQURFUgogICMKICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCiAgICB7CiAgICAgIEFTX0VDSE8oWyIvKiAkY29uZmlndXJlX2lucHV0ICAqLyJdKSBcCiAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgogICAgfSA+IiRhY190bXAvY29uZmlnLmgiIFwKICAgICAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkKICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIEFDX01TR19OT1RJQ0UoWyRhY19maWxlIGlzIHVuY2hhbmdlZF0pCiAgICBlbHNlCiAgICAgIHJtIC1mICIkYWNfZmlsZSIKICAgICAgbXYgIiRhY190bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAoJfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkKICAgIGZpCiAgZWxzZQogICAgQVNfRUNITyhbIi8qICRjb25maWd1cmVfaW5wdXQgICovIl0pIFwKICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKICAgICAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlIC1dKQogIGZpCmRubCBJZiBydW5uaW5nIGZvciBBdXRvbWFrZSwgYmUgcmVhZHkgdG8gcGVyZm9ybSBhZGRpdGlvbmFsCmRubCBjb21tYW5kcyB0byBzZXQgdXAgdGhlIHRpbWVzdGFtcCBmaWxlcy4KbTRfaWZkZWYoW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAoJIFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LKFsiJGFjX2ZpbGUiXSkKXSlkbmwKClQxNywxOTIKQUNfWVlURVhUX1BPSU5URVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfWVlURVhUX1BPSU5URVInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfREVDTF9ZWVRFWFRdLCBbQUNfREVDTF9ZWVRFWFQoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDI0OApBQ19DT01QSUxFX0NIRUNLX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NPTVBJTEVfQ0hFQ0snIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmdmFsbihbJDFdLCBbQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDFdKV0pZG5sCkFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1skMl1dLCBbWyQzXV0pXSwgWyQ0XSwgWyQ1XSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDE3MApfbTRfdmVyc2lvbl91bmxldHRlcm00X2JwYXRzdWJzdChtNF9icGF0c3Vic3QobTRfdHJhbnNsaXQoW1tbWzAsJDFdXV1dLCBbLi1dLCBbLCxdKSxbW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpdXVsrXSwKCSAgICAgIFsrMSwtMSxbMHIzNjpcJl1dKSwgWywwXSwgWyxbMHIxMDowXV0pClQ3LDY3NgpBU19JTklUIyBXcmFwIG91ciBjbGVhbnVwIHByaW9yIHRvIG00c3VnYXIncyBjbGVhbnVwLgptNF93cmFwKFtfQVNfQ0xFQU5VUF0pCm00X2luaXQKbTRfcHJvdmlkZShbQVNfSU5JVF0pCgojIEZvcmJpZGRlbiB0b2tlbnMgYW5kIGV4Y2VwdGlvbnMuCm00X3BhdHRlcm5fZm9yYmlkKFteXz9BU19dKQoKIyBCYW5nc2hlIGFuZCBtaW5pbWFsIGluaXRpYWxpemF0aW9uLgptNF9kaXZlcnRfdGV4dChbQklOU0hdLCBbQCU6QCEgL2Jpbi9zaF0pCm00X2RpdmVydF90ZXh0KFtIRUFERVItQ09NTUVOVF0sCgkgICAgICAgW0AlOkAgR2VuZXJhdGVkIGZyb20gX19maWxlX18gYnkgbTRfUEFDS0FHRV9TVFJJTkcuXSkKbTRfZGl2ZXJ0X3RleHQoW000U0gtU0FOSVRJWkVdLCBbX0FTX1NIRUxMX1NBTklUSVpFXSkKbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVC1GTl0sIFttNF90ZXh0X2JveChbTTRzaCBTaGVsbCBGdW5jdGlvbnMuXSldKQoKIyBMZXQncyBnbyEKbTRfZGl2ZXJ0KFtCT0RZXSlkbmwKbTRfdGV4dF9ib3goW01haW4gYm9keSBvZiBzY3JpcHQuXSkKX0FTX0RFVEVDVF9SRVFVSVJFRChbX0FTX1NIRUxMX0ZOX1dPUktdKWRubApfQVNfREVURUNUX1JFUVVJUkVEKFtfQVNfVEVTVF9YX1dPUktTXSlkbmwKQVNfUkVRVUlSRShbX0FTX1VOU0VUX1BSRVBBUkVdLCBbXSwgW000U0gtSU5JVC1GTl0pZG5sCgpUMjEsNgpfQUNfQ0MoT2JqZWN0aXZlIEMrKylPQkpDWFgKVDI0LDEwNwpBQ19MQU5HX0NPTVBJTEVSX1JFUVVJUkVfbTRfZGVmdW5fcHJvKFskMF0pbTRfcmVxdWlyZShbQUNfTEFOR19DT01QSUxFUihdX0FDX0xBTkdbKV0sCgkgICAgW0FDX0xBTkdfQ09NUElMRVJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMTk5CkFDX0NIQVJfVU5TSUdORURfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ0hBUl9VTlNJR05FRCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DX0NIQVJfVU5TSUdORURdLCBbQUNfQ19DSEFSX1VOU0lHTkVEKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxMDMKQUNfTEFOR19TT1VSQ0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEW11fQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDEzNgp1bmRpdmVydG00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFskMDogbWlzc2luZyBhcmd1bWVudF0pXSwKICAgICAgIFskI10sIFsxXSwgW19tNF91bmRpdmVydChfbTRfZGl2ZXJ0KFskMV0pKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDExLDEzNgptNF91bmRpdmVydG00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFskMDogbWlzc2luZyBhcmd1bWVudF0pXSwKICAgICAgIFskI10sIFsxXSwgW19tNF91bmRpdmVydChfbTRfZGl2ZXJ0KFskMV0pKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDE1LDc2Cl9BU19CT1hfTElURVJBTEFTX0VDSE8oWyJfQVNfRVNDQVBFKG00X2RxdW90ZShtNF9leHBhbmQoW200X3RleHRfYm94KCRAKV0pKSwgW2BdLCBbXCIkXSkiXSkKVDI4LDMxNgpBQ19MQU5HX1BST0dSQU0oT2JqZWN0aXZlIEMpJDEKbTRfaWZkZWYoW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0Y3N19IT09LU10pW11kbmwKbTRfaWZkZWYoW19BQ19MQU5HX1BST0dSQU1fQ19GQ19IT09LU10sIFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdKVtdZG5sCmludAptYWluICgpCnsKZG5sIERvICpub3QqIGluZGVudCB0aGUgZm9sbG93aW5nIGxpbmU6IHRoZXJlIG1heSBiZSBDUFAgZGlyZWN0aXZlcy4KZG5sIERvbid0IG1vdmUgdGhlIGA7JyByaWdodCBhZnRlciBmb3IgdGhlIHNhbWUgcmVhc29uLgokMgogIDsKICByZXR1cm4gMDsKfQpUMjgsMAptNF9pbmNsdWRlKGF1dG9jb25mL2xpYnMubTQpClQxNSwxMDMKX0FDX0NIRUNLX1RZUEVTWyQxXSwgW0FDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoW0hBVkVfJDFdKSwgWzFdLAogIFtEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgJDEnLl0pXQpUMTYsNDE0CkFDX0hFQURFUl9SRVNPTFZfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdHlwZXMuaCBuZXRpbmV0L2luLmggYXJwYS9uYW1lc2VyLmggbmV0ZGIuaCByZXNvbHYuaCwKCQkgIFtdLCBbXSwKW1sjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAojICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAgLyogaW5ldF8gZnVuY3Rpb25zIC8gc3RydWN0cyAqLwojZW5kaWYKI2lmZGVmIEhBVkVfQVJQQV9OQU1FU0VSX0gKIyAgaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+IC8qIEROUyBIRUFERVIgc3RydWN0ICovCiNlbmRpZgojaWZkZWYgSEFWRV9ORVREQl9ICiMgIGluY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZl1dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDAKQUNfRklMRV9ERVBFTkRFTkNZX1RSQUNFClQyOCw0Cl9BQ19MQU5HX1BSRUZJWChPYmplY3RpdmUgQylPQkpDClQxMCw0MTIKbTRfcmVxdWlyZW00X2lmZGVmKFtfbTRfZXhwYW5kaW5nKCQxKV0sCiAgW200X2ZhdGFsKFskMDogY2lyY3VsYXIgZGVwZW5kZW5jeSBvZiAkMV0pXSltNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFttNF9mYXRhbChbJDAoJDEpOiBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGFuIF1kbmwKbTRfaWYoWyQwXSwgW200X3JlcXVpcmVdLCBbW200X2RlZnVuXV0sIFtbQUNfREVGVU5dXSlbJ2QgbWFjcm9dKV0pbTRfcHJvdmlkZV9pZihbJDFdLCBbbTRfc2V0X2NvbnRhaW5zKFtfbTRfcHJvdmlkZV0sIFskMV0sCiAgICBbX200X3JlcXVpcmVfY2hlY2soWyQxXSwgX200X2RlZm4oW200X3Byb3ZpZGUoJDEpXSksIFskMF0pXSwgW200X2lnbm9yZV0pXSwKICBbX200X3JlcXVpcmVfY2FsbF0pKFskMV0sIFskMl0sIF9tNF9kaXZlcnRfZHVtcCkKVDI4LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RSTkxFTikuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE2NzcKVDcsMTE5Cm00X2Nhc2VtNF9pZihbJCNdLCAwLCBbXSwKICAgICAgIFskI10sIDEsIFtdLAogICAgICAgWyQjXSwgMiwgWyQyXSwKICAgICAgIFskMV0sIFskMl0sIFskM10sCiAgICAgICBbJDAoWyQxXSwgbTRfc2hpZnQzKCRAKSldKQpUMTIsOTU4CkFDX1NJVEVfTE9BRCMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCmFjX3NpdGVfZmlsZTE9Tk9ORQphY19zaXRlX2ZpbGUyPU5PTkUKaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgogICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCiAgY2FzZSAkQ09ORklHX1NJVEUgaW4gQCU6QCgoCiAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OwogICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CiAgICAqKSAgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OwogIGVzYWMKZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KICBhY19zaXRlX2ZpbGUxPSRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCmVsc2UKICBhY19zaXRlX2ZpbGUxPSRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQogIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQpmaQpmb3IgYWNfc2l0ZV9maWxlIGluICIkYWNfc2l0ZV9maWxlMSIgIiRhY19zaXRlX2ZpbGUyIgpkbwogIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCiAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRhY19zaXRlX2ZpbGUiICYmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCiAgICBBQ19NU0dfTk9USUNFKFtsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGVdKQogICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiZBU19NRVNTQUdFX0xPR19GRAogICAgLiAiJGFjX3NpdGVfZmlsZSIgXAogICAgICB8fCBBQ19NU0dfRkFJTFVSRShbZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZV0pCiAgZmkKZG9uZQoKVDgsNTUKc2luY2x1ZGVtNF9pbmNsdWRlX3VuaXF1ZShbJDFdKWRubAptNF9idWlsdGluKFtzaW5jbHVkZV0sIFskMV0pClQxMSw1NQptNF9zaW5jbHVkZW00X2luY2x1ZGVfdW5pcXVlKFskMV0pZG5sCm00X2J1aWx0aW4oW3NpbmNsdWRlXSwgWyQxXSkKVDMyLDM0Cm00X2xvY2F0aW9uKEFDX1BBVEhfVEFSR0VUX1RPT0wpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjI3MQpUNDEsMzMKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihGb3J0cmFuIDc3KSkuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoyNTQKVDIzLDMzCm00X2xvY2F0aW9uKEFDX0ZDX01BSU4pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6OTAxCkY2LDYKZGVmaW5lZGVmaW5lClQyNSwyCl9BU19MSVRFUkFMX0hFUkVET0NfSUZfTk8kMgpUMTAsMTkwCkFDX1RSWV9SVU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX1JVTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1skMV1dKV0sIFskMl0sIFskM10sIFskNF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxOTEKQUNfU0laRU9GX1RZUEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU0laRU9GX1RZUEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ0hFQ0tfU0laRU9GXSwgW0FDX0NIRUNLX1NJWkVPRigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMzA5CkFDX1BST0dfRkdSRVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19HUkVQXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBmZ3JlcF0sIGFjX2N2X3BhdGhfRkdSRVAsCiAgIFtpZiBlY2hvICdhYipjJyB8ICRHUkVQIC1GICdhYipjJyA+L2Rldi9udWxsIDI+JjEKICAgdGhlbiBhY19jdl9wYXRoX0ZHUkVQPSIkR1JFUCAtRiIKICAgZWxzZQogICAgIF9BQ19QUk9HX0dSRVAoRkdSRVAsIGZncmVwLCBbRkdSRVBdKQogICBmaV0pCiBGR1JFUD0iJGFjX2N2X3BhdGhfRkdSRVAiCiBBQ19TVUJTVChbRkdSRVBdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDgyCkFDX0NPTkZJR19DT01NQU5EU19QUkVfbTRfZGVmdW5fcHJvKFskMF0pbTRfYXBwZW5kKFtBQ19PVVRQVVRfQ09NTUFORFNfUFJFXSwgWyQxCl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwyOTcKQUNfTEFOR19DQUxMKEMpQUNfTEFOR19QUk9HUkFNKFskMQptNF9pZihbJDJdLCBbbWFpbl0sICwKWy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgogICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKI2VuZGlmCmNoYXIgJDIgKCk7XSldLCBbcmV0dXJuICQyICgpO10pClQyNywzNAptNF9sb2NhdGlvbihBQ19DSEVDS19UT09MUykuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MjQ1ClQxMiwxOTcKQUNfU1RfQkxPQ0tTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NUX0JMT0NLUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19TVFJVQ1RfU1RfQkxPQ0tTXSwgW0FDX1NUUlVDVF9TVF9CTE9DS1MoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDI5MwpBQ19ERUZVTl9PTkNFbTRfZGVmaW5lKFttNF9sb2NhdGlvbigkMSldLCBtNF9sb2NhdGlvbiltNF9kZWZpbmUoWyQxXSwgW19tNF9kZWZ1bl9vbmNlKFskMV0sIFskMl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFskMV0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoWyQxXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoWyQxXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbJDFdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpXSkKVDksMjU1Cm00X2NyX2FsbAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjKiUmJygpJCssLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTgsMTkzCkFDX1dPUkRTX0JJR0VORElBTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19XT1JEU19CSUdFTkRJQU4nIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ19CSUdFTkRJQU5dLCBbQUNfQ19CSUdFTkRJQU4oJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDM1OQpBQ19DSEVDS19UQVJHRVRfVE9PTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfVEFSR0VUXSlkbmwKQUNfQ0hFQ0tfUFJPRyhbJDFdLCBbJHRhcmdldF9hbGlhcy0kMl0sIFskdGFyZ2V0X2FsaWFzLSQyXSwgLCBbJDRdKQppZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ18kMSI7IHRoZW4KICBpZiB0ZXN0ICIkYnVpbGQiID0gIiR0YXJnZXQiOyB0aGVuCiAgICBhY19jdF8kMT0kJDEKICAgIF9BQ19DSEVDS19QUk9HKFthY19jdF8kMV0sIFskMl0sIFskMl0sIFskM10sIFskNF0pCiAgICAkMT0kYWNfY3RfJDEKICBlbHNlCiAgICAkMT0iJDMiCiAgZmkKZWxzZQogICQxPSIkYWNfY3ZfcHJvZ18kMSIKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwyNwptNF9sb2NhdGlvbihBQ19QUk9HX0NQUF9XRVJST1IpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6NDIyClQxOSw2MgptNF92ZXJzaW9uX3VubGV0dGVybTRfc3Vic3RyKG00X21hcF9hcmdzKFsubTRfZXZhbF0sIG00X3VucXVvdGUoXyQwKFskMV0pKSksIFszXSkKVDIzLDM0Cm00X2xvY2F0aW9uKEFDX01JTkdXMzIpLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjM0OQpUMjYsMzEKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfVFlQRSkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MjMyClQyNiwyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oQysrKUFDX0xBTkdfUFJPR1JBTShbXSwgW10pClQxNSwzMTgKQUNfTE9OR182NF9CSVRTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xPTkdfNjRfQklUUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0hFQ0tfU0laRU9GKFtsb25nIGludF0pCnRlc3QgJGFjX2N2X3NpemVvZl9sb25nX2ludCA9IDggJiYKICBBQ19ERUZJTkUoTE9OR182NF9CSVRTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiBgc2l6ZW9mIChsb25nIGludCknID0gOC4gIE9ic29sZXRlLCB1c2UKCSAgICAgYFNJWkVPRl9MT05HX0lOVCcuXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwzMQptNF9sb2NhdGlvbihBQ19UWVBFX09GRl9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MTEKVDEzLDMzMwpBQ19ESVZFUlRfUE9QbTRfaWYoWyQxXSwgW10sIFtdLAogICAgICAgWyQxXSwgX200X2RlZm4oW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSksIFtdLAogICAgICAgW200X2ZhdGFsKFskMCgkMSk6IGRpdmVyc2lvbiBtaXNtYXRjaDoKXW00X2RpdmVydF9zdGFjayldKV9tNF9wb3BkZWYoW19tNF9kaXZlcnRfc3RhY2tdLCBbX200X2RpdmVydF9kaXZlcnNpb25dKW00X2lmZGVmKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0sIFtdLAoJICAgW200X2ZhdGFsKFt0b28gbWFueSBtNF9kaXZlcnRfcG9wXSldKV9tNF9kaXZlcnRfcmF3KF9tNF9kaXZlcnQoX200X2RlZm4oW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSksIFstXSkpClQyNCwzMwptNF9sb2NhdGlvbihBQ19QUk9HX0Y3NykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDozNTgKVDE3LDMyCm00X2RlZmluZV9kZWZhdWx0bTRfaWZuZGVmKFskMV0sIFttNF9kZWZpbmUoJEApXSkKVDIxLDY5NgpfQVNfUkVFWEVDX1dJVEhfU0hFTExfbTRfZGVmdW5fcHJvKFskMF0pZG5sCiMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCiMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCiMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCiMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KQkFTSF9FTlY9L2Rldi9udWxsCkVOVj0vZGV2L251bGwKKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCmNhc2UgJC0gaW4gQCU6QCAoKCgoCiAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CiAgKnYqICkgYXNfb3B0cz0tdiA7OwogICp4KiApIGFzX29wdHM9LXggOzsKICAqICkgYXNfb3B0cz0gOzsKZXNhYwpleGVjICQxICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRbQF0ifQojIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgpBU19FQ0hPKFsiJFtdMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkMSJdKSA+JjIKQVNfRVhJVChbMjU1XSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDE5MgpBTV9GVU5DX09CU1RBQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fRlVOQ19PQlNUQUNLJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfT0JTVEFDS10sIFtBQ19GVU5DX09CU1RBQ0soJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDExNApBQ19SRVFVSVJFX1NIRUxMX0ZOX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkVfU0hFTExfRk4oWyQxXSwgWyQyXSwgWyQzXSwgbTRfZGVmYXVsdF9xdW90ZWQoWyQ0XSwgW1NIRUxMX0ZOXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE2MAp1bmRlZmluZW00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF91bmRlZmluZShbJDFdKV0sCgkJCSAgICBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDExLDE2MAptNF91bmRlZmluZW00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF91bmRlZmluZShbJDFdKV0sCgkJCSAgICBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDIzLDMzCm00X2xvY2F0aW9uKEFNX01JTkdXMzIpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjkxClQxNSwxMgptNF9QQUNLQUdFX05BTUVHTlUgQXV0b2NvbmYKVDM2LDMxCm00X2xvY2F0aW9uKEFDX1NUUlVDVF9ESVJFTlRfRF9UWVBFKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo5NjgKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX0xJTktfSUZFTFNFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NzgKVDI5LDMzCm00X2xvY2F0aW9uKEFDX0NPTkZJR19TUkNESVIpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6NDgxCkYxMCw3Cm00X2J1aWx0aW5idWlsdGluClQxOSwyCl9BQ19MQU5HX0FCQlJFVihHbylnbwpUMjYsNDAKX0FDX0NPTVBJTEVSX0VYRUVYVF9SRUpFQ1RfQUNfQ09NUElMRVJfT0JKRVhUX1JFSkVDVCB8ICoubyB8ICoub2JqClQyNCw2MzUKX0FDX0NIRUNLX0hFQURFUl9NT05HUkVMX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2hlYWRlcl9tb25ncmVsXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2hlYWRlcl9tb25ncmVsXSwKICAgIFtMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFU10sCiAgICBbVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZAogICAgIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluIElOQ0xVREVTIGFuZCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIKICAgICBhY2NvcmRpbmdseS5dKV0sCiAgWyQwX0JPRFldKUFTX1ZBUl9QVVNIREVGKFthY19IZWFkZXJdLCBbYWNfY3ZfaGVhZGVyXyQxXSlhY19mbl9bXV9BQ19MQU5HX0FCQlJFVltdX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJDEiICJhY19IZWFkZXIiICJBU19FU0NBUEUoW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQ0XSldLCBbIiJdKSIKQVNfVkFSX0lGKFthY19IZWFkZXJdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfSGVhZGVyXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDM0Cm00X2xvY2F0aW9uKEFDX1BST0dfRkdSRVApLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjM3MApUNDEsMjcKbTRfbG9jYXRpb24oQUNfTEFOR19QUkVQUk9DKE9iamVjdGl2ZSBDKSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo4MTUKVDM0LDAKbTRfaW5jbHVkZShhdXRvY29uZi9hdXRvdXBkYXRlLm00KQpUMzEsMzMKbTRfbG9jYXRpb24oQUNfTUlOVVNfQ19NSU5VU19PKS4uLy4uL2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2NgpUMjYsMzUKbTRfbG9jYXRpb24oQUNfRlVOQ19DSE9XTikuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjQyNApUMzUsMzMKbTRfbG9jYXRpb24oQUNfRjc3X0xJQlJBUllfTERGTEFHUykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo3MjcKVDEwLDI2NgpBU19SRVFVSVJFX200X2RlZnVuX3BybyhbJDBdKW00X2RlZmluZShbX200X2RpdmVydF9kZXNpcmVkXSwgW200X2RlZmF1bHRfcXVvdGVkKFskM10sIFtNNFNILUlOSVRdKV0pbTRfaWYobTRfZXZhbChfbTRfZGl2ZXJ0X2R1bXAgLSAwIDw9IF9tNF9kaXZlcnQoX200X2RpdmVydF9kZXNpcmVkLCBbLV0pKSwKICAgICAgIDEsIFttNF9yZXF1aXJlKF0sCgkgIFttNF9kaXZlcnRfcmVxdWlyZShfbTRfZGl2ZXJ0X2Rlc2lyZWQsXSkgWyQxXSwgWyQyXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM0LDM0Cm00X2xvY2F0aW9uKF9BQ19GNzdfTkFNRV9NQU5HTElORykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMDA0ClQxNCw0NAptNF9kaXZlcnRfb25jZW00X2V4cGFuZF9vbmNlKFttNF9kaXZlcnRfdGV4dChbJDFdLCBbJDJdKV0pClQxMSwxNDYKX200X2V4cGFuZF9tNF9pZihbJDRdLCBbfT49LV0sCiAgICAgICBbbTRfY2hhbmdlcXVvdGUoWy09PHskMl0sIFspfT49LV0pJDNtNF9jaGFuZ2VxdW90ZShbLCBdKV0sCiAgICAgICBbJDAoWyQxXSwgWygkMl0sIC09PHsoJDIkMSl9Pj0tLCBbfT49LV0pbTRfaWdub3JlJDJdKQpUMTIsODQ2CkFDX1BST0dfT0JKQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goT2JqZWN0aXZlIEMpZG5sCkFDX0FSR19WQVIoW09CSkNdLCAgICAgIFtPYmplY3RpdmUgQyBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbT0JKQ0ZMQUdTXSwgW09iamVjdGl2ZSBDIGNvbXBpbGVyIGZsYWdzXSlkbmwKX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCl9BQ19BUkdfVkFSX0xJQlMoKWRubApfQUNfQVJHX1ZBUl9DUFBGTEFHUygpZG5sCl9BQ19BUkdfVkFSX1BSRUNJT1VTKFtPQkpDXSlkbmwKQUNfQ0hFQ0tfVE9PTFMoT0JKQywKCSAgICAgICBbbTRfZGVmYXVsdChbJDFdLCBbZ2NjIG9iamNjIG9iamMgY2MgQ0NdKV0sCgkgICAgICAgZ2NjKQojIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCl9BU19FQ0hPX0xPRyhbY2hlY2tpbmcgZm9yIF9BQ19MQU5HIGNvbXBpbGVyIHZlcnNpb25dKQpzZXQgWCAkYWNfY29tcGlsZQphY19jb21waWxlcj0kWzJdCmZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KICBfQUNfRE9fTElNSVQoWyRhY19jb21waWxlciAkYWNfb3B0aW9uID4mQVNfTUVTU0FHRV9MT0dfRkRdKQpkb25lCgptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW11kbmwKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9PQkpFWFRdKVtdZG5sCl9BQ19MQU5HX0NPTVBJTEVSX0dOVQppZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KICBHT0JKQz15ZXMKZWxzZQogIEdPQkpDPQpmaQpfQUNfUFJPR19PQkpDX0cKQUNfTEFOR19QT1AoT2JqZWN0aXZlIEMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMjkKbTRfbG9jYXRpb24oX0FTX0JBU0VOQU1FX1NFRCkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjkyNgpUMjcsMzMKbTRfbG9jYXRpb24oX0FDX0NIRUNLX1BST0cpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjQwClQyNywyOQptNF9sb2NhdGlvbihBQ19TRUFSQ0hfTElCUykuLi8uLi9saWIvYXV0b2NvbmYvbGlicy5tNDo0NwpUMjAsMzc0CkFDX0NPTkZJR19MSUJPQkpfRElSX200X2RlZnVuX29uY2UoW0FDX0NPTkZJR19MSUJPQkpfRElSXSwgW200X2RpdmVydF90ZXh0KFtERUZBVUxUU10sIFthY19jb25maWdfbGlib2JqX2Rpcj0kMV0pXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0NPTkZJR19MSUJPQkpfRElSXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfQ09ORklHX0xJQk9CSl9ESVJdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfQ09ORklHX0xJQk9CSl9ESVJdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19DT05GSUdfTElCT0JKX0RJUl0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDE0LDIyMQpBQ19DSEVDS19GVU5DU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUhfQ0hFQ0tfRlVOQyhdLCBbKV0pQVNfRk9SKFtBQ19mdW5jXSwgW2FjX2Z1bmNdLCBbJDFdLApbQUNfQ0hFQ0tfRlVOQyhBQ19mdW5jLAoJICAgICAgIFtBQ19ERUZJTkVfVU5RVU9URUQoQVNfVFJfQ1BQKFtIQVZFX11BQ19mdW5jKSkgJDJdLAoJICAgICAgIFskM10pZG5sXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwzMwptNF9sb2NhdGlvbihfQUNfRkMpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTY3ClQxMSwxODMKQUNfSVJJWF9TVU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSVJJWF9TVU4nIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0ZVTkNfR0VUTU5URU5UCkFDX0NIRUNLX0xJQihbc3VuXSwgW2dldHB3bmFtXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDgxMApBQ19IRUFERVJfU1RBVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuLAogIGFjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbiwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CgojaWYgZGVmaW5lZCBTX0lTQkxLICYmIGRlZmluZWQgU19JRkRJUgpleHRlcm4gY2hhciBjMVtTX0lTQkxLIChTX0lGRElSKSA/IC0xIDogMV07CiNlbmRpZgoKI2lmIGRlZmluZWQgU19JU0JMSyAmJiBkZWZpbmVkIFNfSUZDSFIKZXh0ZXJuIGNoYXIgYzJbU19JU0JMSyAoU19JRkNIUikgPyAtMSA6IDFdOwojZW5kaWYKCiNpZiBkZWZpbmVkIFNfSVNMTksgJiYgZGVmaW5lZCBTX0lGUkVHCmV4dGVybiBjaGFyIGMzW1NfSVNMTksgKFNfSUZSRUcpID8gLTEgOiAxXTsKI2VuZGlmCgojaWYgZGVmaW5lZCBTX0lTU09DSyAmJiBkZWZpbmVkIFNfSUZSRUcKZXh0ZXJuIGNoYXIgYzRbU19JU1NPQ0sgKFNfSUZSRUcpID8gLTEgOiAxXTsKI2VuZGlmCl1dKV0sIGFjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbj1ubywgYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuPXllcyldKQppZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4gPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU1RBVF9NQUNST1NfQlJPS0VOLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgYFNfSVMqJyBtYWNyb3MgaW4gPHN5cy9zdGF0Lmg+IGRvIG5vdAoJICAgICB3b3JrIHByb3Blcmx5Ll0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMjIxCkFDX0ZVTkNfRk5NQVRDSF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRlVOQ19GTk1BVENIX0lGKFtQT1NJWF0sIFthY19jdl9mdW5jX2ZubWF0Y2hfd29ya3NdLAoJCSAgICAgW0FDX0RFRklORShbSEFWRV9GTk1BVENIXSwgMSwKCQkgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSB3b3JraW5nIFBPU0lYIGBmbm1hdGNoJwoJCSAgICAgIGZ1bmN0aW9uLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwwCm00X2luY2x1ZGUoYXV0b2NvbmYvb2xkbmFtZXMubTQpCkY2LDYKcmVnZXhwcmVnZXhwClQyNywyOAptNF9sb2NhdGlvbihBQ19QUk9HX0NDX0M5OSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxMzcwClQxNyw2NApfbTRfZGl2ZXJ0X3Vuc2FmZW00X2ZhdGFsKFskMDogY2Fubm90IGNoYW5nZSBkaXZlcnNpb24gdG8gYCQxJyBpbnNpZGUgbTRfZXhwYW5kXSkKVDgsOTkKX200X2NvbmRtNF9pZigoJDEpLCBbKCQyKV0sIFskM10sCiAgICAgICBbJCNdLCBbM10sIFtdLAogICAgICAgWyQjXSwgWzRdLCBbJDRdLAogICAgICAgWyQwKG00X3NoaWZ0MygkQCkpXSkKVDM4LDMyCm00X2xvY2F0aW9uKF9BQ19IQVZFX1RPUF9CVUlMRF9QUkVGSVgpLi4vLi4vbGliL2F1dG9jb25mL3N0YXR1cy5tNDoxMjIKVDI5LDMzCm00X2xvY2F0aW9uKEFDX1BST0dSQU1TX1BBVEgpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQwClQxNCwxNTYzCkFDX1BST0dfQ0NfQ19PX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAppZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlcl0pCmVsc2UKICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyXSkKZmkKc2V0IGR1bW15ICRDQzsgYWNfY2M9YEFTX0VDSE8oWyIkWzJdIl0pIHwKCQkgICAgICBzZWQgJ3MvW1teYS16QS1aMC05X11dL18vZztzL15bWzAtOV1dL18vJ2AKQUNfQ0FDSEVfVkFMKGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vLApbQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFtdKV0pCiMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgojIFdlIGRvIHRoZSB0ZXN0IHR3aWNlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbgojIGV4aXN0aW5nIC5vIGZpbGUgd2l0aCAtbywgdGhvdWdoIHRoZXkgd2lsbCBjcmVhdGUgb25lLgphY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCnJtIC1mIGNvbmZ0ZXN0Mi4qCmlmIF9BQ19ET19WQVIoYWNfdHJ5KSAmJgogICB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIF9BQ19ET19WQVIoYWNfdHJ5KTsKdGhlbgogIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289eWVzCiAgaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCiAgICAjIFRlc3QgZmlyc3QgdGhhdCBjYyBleGlzdHMgYXQgYWxsLgogICAgaWYgX0FDX0RPX1RPS0VOUyhjYyAtYyBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQpOyB0aGVuCiAgICAgIGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwogICAgICBybSAtZiBjb25mdGVzdDIuKgogICAgICBpZiBfQUNfRE9fVkFSKGFjX3RyeSkgJiYKCSB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIF9BQ19ET19WQVIoYWNfdHJ5KTsKICAgICAgdGhlbgoJIyBjYyB3b3JrcyB0b28uCgk6CiAgICAgIGVsc2UKCSMgY2MgZXhpc3RzIGJ1dCBkb2Vzbid0IGxpa2UgLW8uCglldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCiAgICAgIGZpCiAgICBmaQogIGZpCmVsc2UKICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCmZpCnJtIC1mIGNvcmUgY29uZnRlc3QqCl0pZG5sCmlmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vID0geWVzOyB0aGVuCiAgQUNfTVNHX1JFU1VMVChbeWVzXSkKZWxzZQogIEFDX01TR19SRVNVTFQoW25vXSkKICBBQ19ERUZJTkUoTk9fTUlOVVNfQ19NSU5VU19PLCAxLAoJICAgW0RlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwwCm00X3BhdHRlcm5fYWxsb3cKVDE3LDI1MwptNF9kaXZlcnRfcmVxdWlyZW00X2lmZGVmKFtfbTRfZXhwYW5kaW5nKCQyKV0sCiAgW200X2ZhdGFsKFskMDogY2lyY3VsYXIgZGVwZW5kZW5jeSBvZiAkMl0pXSltNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFttNF9mYXRhbChbJDAoJDIpOiBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGFuIG00X2RlZnVuJ2QgbWFjcm9dKV0pbTRfcHJvdmlkZV9pZihbJDJdLCBbXSwKICBbX200X3JlcXVpcmVfY2FsbChbJDJdLCBbJDNdLCBfbTRfZGl2ZXJ0KFskMV0sIFstXSkpXSkKVDEwLDE0NApBQ19MQU5HX0dPX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfR08nIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkcoR28pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw2MwpBQ19SRVFVSVJFX0NQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BSRVBST0NfUkVRVUlSRVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsNDkyCkFDX0NfVk9MQVRJTEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIHZvbGF0aWxlXSwgYWNfY3ZfY192b2xhdGlsZSwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sIFsKdm9sYXRpbGUgaW50IHg7CmludCAqIHZvbGF0aWxlIHkgPSAoaW50ICopIDA7CnJldHVybiAheCAmJiAheTtdKV0sCgkJICAgW2FjX2N2X2Nfdm9sYXRpbGU9eWVzXSwKCQkgICBbYWNfY3ZfY192b2xhdGlsZT1ub10pXSkKaWYgdGVzdCAkYWNfY3ZfY192b2xhdGlsZSA9IG5vOyB0aGVuCiAgQUNfREVGSU5FKHZvbGF0aWxlLCwKCSAgICBbRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGB2b2xhdGlsZScgZG9lcyBub3Qgd29yay4KCSAgICAgV2FybmluZzogdmFsaWQgY29kZSB1c2luZyBgdm9sYXRpbGUnIGNhbiBiZWNvbWUgaW5jb3JyZWN0CgkgICAgIHdpdGhvdXQuICBEaXNhYmxlIHdpdGggY2FyZS5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjksNgptNF9zeXN2YWxzeXN2YWwKVDI4LDMzCm00X2xvY2F0aW9uKEFDX01BSk9SX0hFQURFUikuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjUKVDIzLDM0Cm00X2xvY2F0aW9uKEFDX0FSR19WQVIpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTUxMQpUMTMsOTEKQVNfU0VUX1NUQVRVU19tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfRVhJVF9QUkVQQVJFXSlbXWFzX2ZuX3NldF9zdGF0dXMgJDFbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDEyNwpBQ19MQU5HX0FTU0VSVF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZihfQUNfTEFORywgJDEsIFtdLAogICAgICAgW200X2ZhdGFsKFskMDogY3VycmVudCBsYW5ndWFnZSBpcyBub3QgJDE6IF0gX0FDX0xBTkcpXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDI2OApBQ19MQU5HKE9iamVjdGl2ZSBDKWFjX2V4dD1tCmFjX2NwcD0nJE9CSkNQUCAkQ1BQRkxBR1MnCmFjX2NvbXBpbGU9JyRPQkpDIC1jICRPQkpDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiZBU19NRVNTQUdFX0xPR19GRCcKYWNfbGluaz0nJE9CSkMgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRPQkpDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiZBU19NRVNTQUdFX0xPR19GRCcKYWNfY29tcGlsZXJfZ251PSRhY19jdl9vYmpjX2NvbXBpbGVyX2dudQoKVDI1LDMxCm00X2xvY2F0aW9uKF9BQ19UWVBFX0lOVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjcxClQzMCwzMQptNF9sb2NhdGlvbihBQ19UWVBFX1VJTlRQVFJfVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzY2ClQzMSwzNAptNF9sb2NhdGlvbihBQ19DT05GSUdfQVVYX0RJUlMpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTY4OApUMjIsNTI3Cl9BU19WQVJfQVBQRU5EX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX2FwcGVuZF0sIFtWQVIgVkFMVUVdLApbQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluClZBUi4gIFRha2UgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkCmxpbmVhciBncm93dGggb3ZlciByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYwpncm93dGggcHJlc2VudCBpbiBuYWl2ZSBpbXBsZW1lbnRhdGlvbnMuXSkKQVNfSUYoW19BU19SVU4oWyJBU19FU0NBUEUobTRfcXVvdGUoX0FTX1ZBUl9BUFBFTkRfV09SS1MpKSJdKV0sCltldmFsICdhc19mbl9hcHBlbmQgKCkKICB7CiAgICBldmFsICRbXTErPVwkW10yCiAgfSddLApbYXNfZm5fYXBwZW5kICgpCiAgewogICAgZXZhbCAkW10xPVwkJFtdMVwkW10yCiAgfV0pICMgYXNfZm5fYXBwZW5kCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTMxCl9BQ19FVkFMX1NUREVSUl9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfUlVOX0xPR19TVERFUlIoW2V2YWwgJDFdLAoJCSAgICBbZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkMVwiIl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwyNTMKQUNfTEFOR19DT05GVEVTVF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9wdXNoZGVmKFtfQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEXSwKICBbbTRfd2Fybihbc3ludGF4XSwgWyQwOiBubyBBQ19MQU5HX1NPVVJDRSBjYWxsIGRldGVjdGVkIGluIGJvZHldKV0pX0FDX0xBTkdfRElTUEFUQ0goWyQwXSwgX0FDX0xBTkcsICRAKVtdX0FDX0xBTkdfREVGSU5FU19QUk9WSURFRFtdbTRfcG9wZGVmKFtfQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDE4NApBQ19GVU5DX1ZGT1JLX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0ZVTkNfVkZPUksnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19GT1JLXSwgW0FDX0ZVTkNfRk9SSygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMzQKbTRfbG9jYXRpb24oX0FDX1RPT0xfV0FSTikuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MTg4ClQxOCwzNzEKQUNfU1lTX0lOVEVSUFJFVEVSX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgQCU6QCEgd29ya3MgaW4gc2hlbGwgc2NyaXB0cywgYWNfY3Zfc3lzX2ludGVycHJldGVyLApbZWNobyAnIyEgL2Jpbi9jYXQKZXhpdCA2OQonID5jb25mdGVzdApjaG1vZCB1K3ggY29uZnRlc3QKKFNIRUxMPS9iaW4vc2g7IGV4cG9ydCBTSEVMTDsgLi9jb25mdGVzdCA+L2Rldi9udWxsIDI+JjEpCmlmIHRlc3QgJD8gLW5lIDY5OyB0aGVuCiAgIGFjX2N2X3N5c19pbnRlcnByZXRlcj15ZXMKZWxzZQogICBhY19jdl9zeXNfaW50ZXJwcmV0ZXI9bm8KZmkKcm0gLWYgY29uZnRlc3RdKQppbnRlcnB2YWw9JGFjX2N2X3N5c19pbnRlcnByZXRlcgpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDYzCkFDX0xBTkdfQ0FMTChHbylBQ19MQU5HX1BST0dSQU0oWyQxCm00X2lmKFskMl0sIFttYWluXSwgLApbZnVuYyAkMigpXSldLFskMigpXSkKVDM1LDM0Cm00X2xvY2F0aW9uKEFDX01TR19SRVNVTFRfVU5RVU9URUQpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjI3MwpUMTUsNzcKX0FDX0xBTkdfQUJCUkVWX200X2RlZnVuX3BybyhbJDBdKV9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDU1MApBQ19GVU5DX1NUUkNPTExfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soZm9yIHdvcmtpbmcgc3RyY29sbCwgYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwKICBbW3JldHVybiAoc3RyY29sbCAoImFiYyIsICJkZWYiKSA+PSAwIHx8Cgkgc3RyY29sbCAoIkFCQyIsICJERUYiKSA+PSAwIHx8Cgkgc3RyY29sbCAoIjEyMyIsICI0NTYiKSA+PSAwKV1dKV0sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzPXllcywKCSAgICAgICBhY19jdl9mdW5jX3N0cmNvbGxfd29ya3M9bm8sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzPW5vKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfc3RyY29sbF93b3JrcyA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NUUkNPTEwsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY29sbCcgZnVuY3Rpb24gYW5kIGl0IGlzIHByb3Blcmx5CgkgICAgIGRlZmluZWQuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMywzNAptNF9sb2NhdGlvbihfQUNfRkNfSU1QTElDSVRfTk9ORSkuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxNjM4ClQyNCwyOAptNF9sb2NhdGlvbihBQ19DX0lOTElORSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxNjIxClQyOSwxMTMwCl9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKWFjX3ByZXByb2Nfb2s9ZmFsc2UKZm9yIGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCmRvCiAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwogICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgogICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgogICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCiAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCiAgX0FDX1BSRVBST0NfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbW0AlOkBpZmRlZiBfX1NURENfXwpAJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgpAJTpAZWxzZQpAJTpAIGluY2x1ZGUgPGFzc2VydC5oPgpAJTpAZW5kaWYKCQkgICAgIFN5bnRheCBlcnJvcl1dKV0sCgkJICAgICBbXSwKCQkgICAgIFsjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCmNvbnRpbnVlXSkKCiAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgogIF9BQ19QUkVQUk9DX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1tAJTpAaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD5dXSldLAoJCSAgICAgWyMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCmNvbnRpbnVlXSwKCQkgICAgIFsjIFBhc3NlcyBib3RoIHRlc3RzLgphY19wcmVwcm9jX29rPToKYnJlYWtdKQoKZG9uZQojIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4Kcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dApBU19JRihbJGFjX3ByZXByb2Nfb2tdLCBbJDFdLCBbJDJdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDE5NTAKX19BQ19GQ19OQU1FX01BTkdMSU5HX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgX0FDX0xBTkcgbmFtZS1tYW5nbGluZyBzY2hlbWVdLAoJICAgICAgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcsCltBQ19DT01QSUxFX0lGRUxTRSgKW1sgICAgICBzdWJyb3V0aW5lIGZvb2JhcigpCiAgICAgIHJldHVybgogICAgICBlbmQKICAgICAgc3Vicm91dGluZSBmb29fYmFyKCkKICAgICAgcmV0dXJuCiAgICAgIGVuZF1dLApbbXYgY29uZnRlc3QuJGFjX29iamV4dCBjZm9ydHJhbl90ZXN0LiRhY19vYmpleHQKCiAgYWNfc2F2ZV9MSUJTPSRMSUJTCiAgTElCUz0iY2ZvcnRyYW5fdGVzdC4kYWNfb2JqZXh0ICRMSUJTICRbXV9BQ19MQU5HX1BSRUZJWFtdTElCUyIKCiAgQUNfTEFOR19QVVNIKEMpZG5sCiAgYWNfc3VjY2Vzcz1ubwogIGZvciBhY19mb29iYXIgaW4gZm9vYmFyIEZPT0JBUjsgZG8KICAgIGZvciBhY191bmRlcnNjb3JlIGluICIiICJfIjsgZG8KICAgICAgYWNfZnVuYz0iJGFjX2Zvb2JhciRhY191bmRlcnNjb3JlIgogICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19DQUxMKFtdLCBbJGFjX2Z1bmNdKV0sCgkJICAgICBbYWNfc3VjY2Vzcz15ZXM7IGJyZWFrIDJdKQogICAgZG9uZQogIGRvbmUKICBBQ19MQU5HX1BPUChDKWRubAoKICBpZiB0ZXN0ICIkYWNfc3VjY2VzcyIgPSAieWVzIjsgdGhlbgogICAgIGNhc2UgJGFjX2Zvb2JhciBpbgoJZm9vYmFyKQoJICAgYWNfY2FzZT1sb3dlcgoJICAgYWNfZm9vX2Jhcj1mb29fYmFyCgkgICA7OwoJRk9PQkFSKQoJICAgYWNfY2FzZT11cHBlcgoJICAgYWNfZm9vX2Jhcj1GT09fQkFSCgkgICA7OwogICAgIGVzYWMKCiAgICAgQUNfTEFOR19QVVNIKEMpZG5sCiAgICAgYWNfc3VjY2Vzc19leHRyYT1ubwogICAgIGZvciBhY19leHRyYSBpbiAiIiAiXyI7IGRvCglhY19mdW5jPSIkYWNfZm9vX2JhciRhY191bmRlcnNjb3JlJGFjX2V4dHJhIgoJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfQ0FMTChbXSwgWyRhY19mdW5jXSldLAoJCSAgICAgICBbYWNfc3VjY2Vzc19leHRyYT15ZXM7IGJyZWFrXSkKICAgICBkb25lCiAgICAgQUNfTEFOR19QT1AoQylkbmwKCiAgICAgaWYgdGVzdCAiJGFjX3N1Y2Nlc3NfZXh0cmEiID0gInllcyI7IHRoZW4KCWFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmc9IiRhY19jYXNlIGNhc2UiCglpZiB0ZXN0IC16ICIkYWNfdW5kZXJzY29yZSI7IHRoZW4KCSAgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmc9IiRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nLCBubyB1bmRlcnNjb3JlIgoJZWxzZQoJICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcsIHVuZGVyc2NvcmUiCglmaQoJaWYgdGVzdCAteiAiJGFjX2V4dHJhIjsgdGhlbgoJICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcsIG5vIGV4dHJhIHVuZGVyc2NvcmUiCgllbHNlCgkgICBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZywgZXh0cmEgdW5kZXJzY29yZSIKCWZpCiAgICAgIGVsc2UKCWFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmc9InVua25vd24iCiAgICAgIGZpCiAgZWxzZQogICAgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmc9InVua25vd24iCiAgZmkKCiAgTElCUz0kYWNfc2F2ZV9MSUJTCiAgcm0gLXJmIGNvbmZ0ZXN0KgogIHJtIC1mIGNmb3J0cmFuX3Rlc3QqXSwKICBbQUNfTVNHX0ZBSUxVUkUoW2Nhbm5vdCBjb21waWxlIGEgc2ltcGxlIEZvcnRyYW4gcHJvZ3JhbV0pXSkKXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCw2Cl9BQ19MQU5HX0FCQlJFVihPYmplY3RpdmUgQysrKW9iamN4eApUMjMsMTIzNQpfQUNfQ09NUFVURV9JTlRfQ09NUElMRSMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCl9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKFskM10sIFsoJDEpID49IDBdKV0sCiBbYWNfbG89MCBhY19taWQ9MAogIHdoaWxlIDo7IGRvCiAgICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfQk9PTF9DT01QSUxFX1RSWShbJDNdLCBbKCQxKSA8PSAkYWNfbWlkXSldLAoJCSAgICAgICBbYWNfaGk9JGFjX21pZDsgYnJlYWtdLAoJCSAgICAgICBbQVNfVkFSX0FSSVRIKFthY19sb10sIFskYWNfbWlkICsgMV0pCgkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCgkJCSAgYWNfbG89IGFjX2hpPQoJCQkgIGJyZWFrCgkJCWZpCgkJCUFTX1ZBUl9BUklUSChbYWNfbWlkXSwgWzIgJyonICRhY19taWQgKyAxXSldKQogIGRvbmVdLApbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfQk9PTF9DT01QSUxFX1RSWShbJDNdLCBbKCQxKSA8IDBdKV0sCiBbYWNfaGk9LTEgYWNfbWlkPS0xCiAgd2hpbGUgOjsgZG8KICAgIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKFskM10sIFsoJDEpID49ICRhY19taWRdKV0sCgkJICAgICAgIFthY19sbz0kYWNfbWlkOyBicmVha10sCgkJICAgICAgIFtBU19WQVJfQVJJVEgoW2FjX2hpXSwgWycoJyAkYWNfbWlkICcpJyAtIDFdKQoJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgoJCQkgIGFjX2xvPSBhY19oaT0KCQkJICBicmVhawoJCQlmaQoJCQlBU19WQVJfQVJJVEgoW2FjX21pZF0sIFsyICcqJyAkYWNfbWlkXSldKQogIGRvbmVdLAogW2FjX2xvPSBhY19oaT1dKV0pCiMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCndoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICBBU19WQVJfQVJJVEgoW2FjX21pZF0sIFsnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9dKQogIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKFskM10sIFsoJDEpIDw9ICRhY19taWRdKV0sCgkJICAgICBbYWNfaGk9JGFjX21pZF0sCgkJICAgICBbQVNfVkFSX0FSSVRIKFthY19sb10sIFsnKCcgJGFjX21pZCAnKScgKyAxXSldKQpkb25lCmNhc2UgJGFjX2xvIGluIEAlOkAoKAo/KikgQVNfVkFSX1NFVChbJDJdLCBbJGFjX2xvXSk7ICQ0IDs7CicnKSAkNSA7Owplc2FjW11kbmwKCkY3LDcKYnVpbHRpbmJ1aWx0aW4KVDExLDExCkFDX0RJQUdOT1NFbTRfd2FybigkQCkKVDE3LDAKbTRfcGF0dGVybl9mb3JiaWQKVDI0LDM0Cm00X2xvY2F0aW9uKF9BQ19SVU5fTE9HKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIyOTgKVDMwLDMzCm00X2xvY2F0aW9uKF9BQ19JTklUX0RJUkNIRUNLKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjQ5MQpUMzMsMzQKbTRfbG9jYXRpb24oQUNfU1lTX1BPU0lYX1RFUk1JT1MpLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjI5MgpUMjcsMzQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfUFJPR1MpLi4vLi4vbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjEwOQpUOSw2OQptNF9hc3NlcnRtNF9pZihtNF9ldmFsKFskMV0pLCAwLAogICAgICAgW200X2ZhdGFsKFthc3NlcnQgZmFpbGVkOiAkMV0sIFskMl0pXSkKVDI2LDExNTIKX0FDX1RZUEVfTE9OR19MT05HX1NOSVBQRVRfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfTEFOR19QUk9HUkFNKAogICAgW1svKiBGb3Igbm93LCBkbyBub3QgdGVzdCB0aGUgcHJlcHJvY2Vzc29yOyBhcyBvZiAyMDA3IHRoZXJlIGFyZSB0b28gbWFueQoJIGltcGxlbWVudGF0aW9ucyB3aXRoIGJyb2tlbiBwcmVwcm9jZXNzb3JzLiAgUGVyaGFwcyB0aGlzIGNhbgoJIGJlIHJldmlzaXRlZCBpbiAyMDEyLiAgSW4gdGhlIG1lYW50aW1lLCBjb2RlIHNob3VsZCBub3QgZXhwZWN0CgkgI2lmIHRvIHdvcmsgd2l0aCBsaXRlcmFscyB3aWRlciB0aGFuIDMyIGJpdHMuICAqLwogICAgICAvKiBUZXN0IGxpdGVyYWxzLiAgKi8KICAgICAgbG9uZyBsb25nIGludCBsbCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdsbDsKICAgICAgbG9uZyBsb25nIGludCBubGwgPSAtOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwogICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVsbCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMOwogICAgICAvKiBUZXN0IGNvbnN0YW50IGV4cHJlc3Npb25zLiAgICovCiAgICAgIHR5cGVkZWYgaW50IGFbKCgtOTIyMzM3MjAzNjg1NDc3NTgwN0xMIDwgMCAmJiAwIDwgOTIyMzM3MjAzNjg1NDc3NTgwN2xsKQoJCSAgICAgPyAxIDogLTEpXTsKICAgICAgdHlwZWRlZiBpbnQgYlsoMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwgPD0gKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIC0xCgkJICAgICA/IDEgOiAtMSldOwogICAgICBpbnQgaSA9IDYzO11dLAogICAgW1svKiBUZXN0IGF2YWlsYWJpbGl0eSBvZiBydW50aW1lIHJvdXRpbmVzIGZvciBzaGlmdCBhbmQgZGl2aXNpb24uICAqLwogICAgICBsb25nIGxvbmcgaW50IGxsbWF4ID0gOTIyMzM3MjAzNjg1NDc3NTgwN2xsOwogICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVsbG1heCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1dWxsOwogICAgICByZXR1cm4gKChsbCA8PCA2MykgfCAobGwgPj4gNjMpIHwgKGxsIDwgaSkgfCAobGwgPiBpKQoJICAgICAgfCAobGxtYXggLyBsbCkgfCAobGxtYXggJSBsbCkKCSAgICAgIHwgKHVsbCA8PCA2MykgfCAodWxsID4+IDYzKSB8ICh1bGwgPDwgaSkgfCAodWxsID4+IGkpCgkgICAgICB8ICh1bGxtYXggLyB1bGwpIHwgKHVsbG1heCAlIHVsbCkpO11dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDQxNApBQ19DX0xPTkdfRE9VQkxFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NfTE9OR19ET1VCTEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCgogICAgQUNfVFlQRV9MT05HX0RPVUJMRV9XSURFUgogICAgYWNfY3ZfY19sb25nX2RvdWJsZT0kYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV93aWRlcgogICAgaWYgdGVzdCAkYWNfY3ZfY19sb25nX2RvdWJsZSA9IHllczsgdGhlbgogICAgICBBQ19ERUZJTkUoW0hBVkVfTE9OR19ET1VCTEVdLCAxLAoJW0RlZmluZSB0byAxIGlmIHRoZSB0eXBlIGBsb25nIGRvdWJsZScgd29ya3MgYW5kIGhhcyBtb3JlIHJhbmdlIG9yCgkgcHJlY2lzaW9uIHRoYW4gYGRvdWJsZScuXSkKICAgIGZpCiAgW11fbTRfZGVmdW5fZXBpKFskMF0pCkYxMCw3Cm00X3B1c2hkZWZwdXNoZGVmClQyNywzMgptNF9sb2NhdGlvbihBQ19MQU5HX0VSTEFORykuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjExMgpUMjIsMzQKbTRfbG9jYXRpb24oQUNfRU1YT1MyKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDozMzUKVDIxLDE0MApBQ19GQ19MSUJSQVJZX0xERkxBR1NfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19GQ10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuKWRubApfQUNfRkNfTElCUkFSWV9MREZMQUdTCkFDX0xBTkdfUE9QKEZvcnRyYW4pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMTEyMApBQ19DQU5PTklDQUxfQlVJTERfbTRfZGVmdW5fb25jZShbQUNfQ0FOT05JQ0FMX0JVSUxEXSwgW0FDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKWRubApBQ19SRVFVSVJFX0FVWF9GSUxFKFtjb25maWcuc3ViXSlkbmwKQUNfUkVRVUlSRV9BVVhfRklMRShbY29uZmlnLmd1ZXNzXSlkbmwKbTRfZGl2ZXJ0X29uY2UoW0hFTFBfQ0FOT05dLApbWwpTeXN0ZW0gdHlwZXM6CiAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF1dXSlkbmwKIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgokU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CiAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViXSkKCkFDX0NBQ0hFX0NIRUNLKFtidWlsZCBzeXN0ZW0gdHlwZV0sIFthY19jdl9idWlsZF0sClthY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCiAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCiAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmVdKQphY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8CiAgQUNfTVNHX0VSUk9SKFskU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkXSkKXSkKX0FDX0NBTk9OSUNBTF9TUExJVChidWlsZCkKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0NBTk9OSUNBTF9CVUlMRF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0NBTk9OSUNBTF9CVUlMRF0pXV0sCm00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFtBQ19DQU5PTklDQUxfQlVJTERdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19DQU5PTklDQUxfQlVJTERdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQzOSwzMQptNF9sb2NhdGlvbihfQUNfVFlQRV9MT05HX0xPTkdfU05JUFBFVCkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NDc0ClQyOCwzMwptNF9sb2NhdGlvbihBQ19IRUFERVJfTUFKT1IpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6NTA5ClQxNywzOTUKX0FDX1NUUlVDVF9ESVJFTlRfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfUkVRVUlSRShbQUNfSEVBREVSX0RJUkVOVF0pCiAgQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IGRpcmVudC4kMV0sIFtdLCBbXSwKICAgIFtbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfRElSRU5UX0gKIyBpbmNsdWRlIDxkaXJlbnQuaD4KI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGlmZGVmIEhBVkVfU1lTX05ESVJfSAojICBpbmNsdWRlIDxzeXMvbmRpci5oPgojIGVuZGlmCiMgaWZkZWYgSEFWRV9TWVNfRElSX0gKIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgojIGVuZGlmCiMgaWZkZWYgSEFWRV9ORElSX0gKIyAgaW5jbHVkZSA8bmRpci5oPgojIGVuZGlmCiNlbmRpZgogICAgXV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMTI0CkFDX01TR19OT1RJQ0VtNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKCSAgW3sgX0FTX0VDSE9fTE9HKFskMV0pCl9BU19FQ0hPKFskYXNfbWU6ICQxXSwgWyQyXSk7fV0sCgkgIFtfQVNfRUNITyhbJGFzX21lOiAkMV0sIFskMl0pXSlbXVtdClQxMywxMjcKQUNfTVNHX05PVElDRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfTUVfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDM0Cm00X2xvY2F0aW9uKEFDX1BBVEhfUFJPRykuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MTU1ClQyMCw1MwptNF9kaXZlcnRfc3RhY2tfcHVzaG00X3B1c2hkZWYoW19tNF9kaXZlcnRfc3RhY2tdLCBtNF9sb2NhdGlvbls6ICQxOiAkMl0pClQxNywxMDUKX200X2RlZmluZV9jcl9ub3RtNF9kZWZpbmUoW200X2NyX25vdF8kMV0sCgkgICBtNF90cmFuc2xpdChtNF9kcXVvdGUobTRfZGVmbihbbTRfY3JfYWxsXSkpLAoJCSAgICAgICBtNF9kZWZuKFttNF9jcl8kMV0pKSkKVDE5LDIxCl9BU19WQVJfQVJJVEhfV09SS1N0ZXN0ICQoKCAxICsgMSApKSA9IDIKVDcsMTc4CkFDX01NQVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTU1BUCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX01NQVBdLCBbQUNfRlVOQ19NTUFQKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDc1CkFDX0JFRk9SRW00X3Byb3ZpZGVfaWYoWyQyXSwKCSAgICAgICBbbTRfd2Fybihbc3ludGF4XSwgWyQyIHdhcyBjYWxsZWQgYmVmb3JlICQxXSldKQpUMzcsMzQKbTRfbG9jYXRpb24oQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDozNjgKVDE1LDY3CkFDX0xBTkdfUFJFUFJPQ0FDX0xBTkdfQ09NUElMRVJfUkVRVUlSRSgpZG5sCl9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQCkKVDI4LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RSQ09MTCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE3MjUKVDIzLDM5Cm00X2V4cGFuc2lvbl9zdGFja19wdXNobTRfcHVzaGRlZihbX200X2V4cGFuc2lvbl9zdGFja10sIFskMV0pClQyMiwzCl9tNF9kaXZlcnQoSEVMUF9CRUdJTikxMDAKVDE0LDE5OQpBU19TRVRfQ0FURklMRWNhc2UgJDIgaW4gQCU6QCgoCi4pIEFTX1ZBUl9TRVQoWyQxXSwgWyQzXSk7OwoqKQogIGNhc2UgJDMgaW4gQCU6QCgoKAogIC4pIEFTX1ZBUl9TRVQoWyQxXSwgWyQyXSk7OwogIFtbXFwvXV0qIHwgPzpbW1xcL11dKiApIEFTX1ZBUl9TRVQoWyQxXSwgWyQzXSk7OwogICopIEFTX1ZBUl9TRVQoWyQxXSwgWyQyLyQzXSk7OwogIGVzYWM7Owplc2FjW10KVDEyLDE0MgpBQ19MQU5HX1BVU0hfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0xBTkdfU0VUKG00X2lmZGVmKFtfQUNfTEFOR10sIFttNF9kZWZuKFtfQUNfTEFOR10pXSksCgkgICAgICBbJDFdKWRubAptNF9wdXNoZGVmKFtfQUNfTEFOR10sIFskMV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw1MjcKQUNfQ09NUFVURV9JTlRfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19DT01QSUxFUl9SRVFVSVJFKClBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jb21wdXRlX2ludF0sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jb21wdXRlX2ludF0sCiAgICBbTElORU5PIEVYUFIgVkFSIElOQ0xVREVTXSwKICAgIFtUcmllcyB0byBmaW5kIHRoZSBjb21waWxlLXRpbWUgdmFsdWUgb2YgRVhQUiBpbiBhIHByb2dyYW0gdGhhdCBpbmNsdWRlcwogICAgIElOQ0xVREVTLCBzZXR0aW5nIFZBUiBhY2NvcmRpbmdseS4gIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgY291bGQKICAgICBiZSBjb21wdXRlZF0pXSwKICAgIFtfJDBfQk9EWV0pQVNfSUYoW2FjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIkMiIgIiQxIiBdZG5sCiAgICAgICBbIkFTX0VTQ0FQRShbJDNdLCBbIiJdKSJdLAogICAgICAgW10sIFskNF0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMTU1CkFDX0xBTkdfT0JKQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX09CSkMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkcoT2JqZWN0aXZlIEMpW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCwzMAptNF9sb2NhdGlvbihfQVNfVkFSX0FSSVRIX1BSRVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxOTQ4ClQxMSwzMApBQ19NU0dfV0FSTkFTX01FU1NBR0UoW1dBUk5JTkc6ICQxXSwgWzJdKQpUMTMsMjYKbTRfY3JfbGV0dGVyc2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6ClQxMywzMzMKX0FDX0ZVTkNfRk9SS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhmb3Igd29ya2luZyBmb3JrLCBhY19jdl9mdW5jX2Zvcmtfd29ya3MsCiAgICBbQUNfUlVOX0lGRUxTRSgKICAgICAgW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCglbCgkgIC8qIEJ5IFJ1ZWRpZ2VyIEt1aGxtYW5uLiAqLwoJICByZXR1cm4gZm9yayAoKSA8IDA7CgldKV0sCiAgICAgIFthY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzXSwKICAgICAgW2FjX2N2X2Z1bmNfZm9ya193b3Jrcz1ub10sCiAgICAgIFthY19jdl9mdW5jX2Zvcmtfd29ya3M9Y3Jvc3NdKV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMjIwCkFDX0NBQ0hFX0NIRUNLX200X2RlZnVuX3BybyhbJDBdKUFDX01TR19DSEVDS0lORyhbJDFdKQpBQ19DQUNIRV9WQUwoWyQyXSwgWyQzXSlkbmwKQVNfTElURVJBTF9XT1JEX0lGKFskMl0sCgkgICAgICBbQUNfTVNHX1JFU1VMVChbJCQyXSldLAoJICAgICAgW0FTX1ZBUl9DT1BZKFthY19yZXNdLCBbJDJdKQoJICAgICAgIEFDX01TR19SRVNVTFQoWyRhY19yZXNdKV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMzYKbTRfbG9jYXRpb24oQUNfTU1BUCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjEzNTQKVDI2LDM0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX0ZVTkMpLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1OQpUMzAsNzEKQUNfTEFOR19QUkVQUk9DKE9iamVjdGl2ZSBDKyspX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfT0JKQ1hYQ1BQXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDM0Cm00X2xvY2F0aW9uKEFDX1NDT19JTlRMKS4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo0ODEKVDcsMTMKQVNfRUNITyRhc19lY2hvICQxW10KVDcsMTI0CkFTX0VDSE9fbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbXyQwX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwzNgpfbTRfZXhwYW5kJDBfKFskMV0sIFsoXSwgLT08eygkMSl9Pj0tLCBbfT49LV0pClQyNiwxMDQKX0FTX0RFVEVDVF9TVUdHRVNURURfUFJVTkVtNF9zZXRfY29udGFpbnMoW19BU19ERVRFQ1RfUkVRVUlSRURfQk9EWV0sIFskMV0sCgkJIFttNF9zZXRfcmVtb3ZlKFtfQVNfREVURUNUX1NVR0dFU1RFRF9CT0RZXSwgWyQxXSldKQpUMTAsMjcKQUNfV0FSTklOR0FDX0RJQUdOT1NFKFtzeW50YXhdLCBbJDFdKQpUMTYsOTIKQUNfVFJZX0xJTktfRlVOQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19DQUxMKFtdLCBbJDFdKV0sIFskMl0sIFskM10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwzNQptNF9sb2NhdGlvbihBQ19GVU5DX0NIRUNLKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTU1ClQxMSwxNDkKbTRfbWFwX2FyZ3NtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkI10pXSwKICAgICAgIFskI10sIFsxXSwgW10sCiAgICAgICBbJCNdLCBbMl0sIFskMShbJDJdKVtdXSwKICAgICAgIFtfbTRfZm9yZWFjaChbJDEoXSwgWyldLCAkQCldKQpUMjYsMjgKbTRfbG9jYXRpb24oX0FDX0NfU1REX1RSWSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxMTY3ClQxOSwyODgKX200X3NldF9jb250ZW50c18xY200X2lmZGVmKFtfbTRfc2V0KFskMV0pXSwKCSAgW200X3NldF9jb250YWlucyhbJDFdLCBfbTRfZGVmbihbX200X3NldChbJDFdKV0pLAoJCSAgIFttNF9wdXNoZGVmKFtfbTRfc2V0XygkMSldLCBfbTRfZGVmbihbX200X3NldChbJDFdKV0pKV0sCgkJICAgW19tNF9wb3BkZWYoW19tNF9zZXQoWyQxXSxdX200X2RlZm4oCiAgICAgIFtfbTRfc2V0KFskMV0pXSlbKV0pXSlfbTRfcG9wZGVmKFtfbTRfc2V0KFskMV0pXSkkMChbJDFdKV0sCgkgIFtfbTRfcG9wZGVmKFtfbTRfc2V0X2NsZWFudXAoJDEpXSldKQpUNyw2NQpfbTRfbWlubTRfZXZhbCgoKFskMV0pIDwgKFskMl0pKSAqIChbJDFdKSArICgoWyQxXSkgPj0gKFskMl0pKSAqIChbJDJdKSkKVDE1LDIKX0FDX0NDKEZvcnRyYW4pRkMKVDE0LDE4MApBU19IRUxQX1NUUklOR200X3RleHRfd3JhcChbJDJdLCBtNF9jb25kKFtbJDNdXSwgW10sIFsgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCgkJCSAgICBbbTRfZXZhbChbJDNdKzApXSwgWzBdLCBbWyQzXV0sCgkJCSAgICBbbTRfZm9ybWF0KFtbJSpzXV0sIFskM10sIFtdKV0pLAoJICAgICAgbTRfZXhwYW5kKFsgICQxIF0pLCBbJDRdKQpUMTUsNTYKQUNfVFlQRV9JTlQ2NF9UX200X2RlZnVuX3BybyhbJDBdKV9BQ19UWVBFX0lOVCg2NClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjgsNQptNF9zaGlmdHNoaWZ0ClQyOCwzMwptNF9sb2NhdGlvbihfQUNfUFJPR19GQ19DX08pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6NDM4ClQzNywzMwptNF9sb2NhdGlvbihfQUNfQ0hFQ0tfSEVBREVSX01PTkdSRUwpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6MTI5ClQyNywyOAptNF9sb2NhdGlvbihBQ19QUk9HX09CSkNYWCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxMDEwClQzOCwzMwptNF9sb2NhdGlvbihBQ19MQU5HX0NPTVBJTEVSKEZvcnRyYW4pKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjI2MQpUMTYsNDUyCl9tNF9yZXF1aXJlX2NhbGxtNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0X2dyb3ddLCBtNF9kZWNyKF9tNF9kaXZlcnRfZ3JvdykpbTRfcHVzaGRlZihbX200X2RpdmVydGluZyhbJDFdKV0pbTRfcHVzaGRlZihbX200X2RpdmVydGluZ10sIFskMV0pbTRfZGl2ZXJ0X3B1c2goX200X2RpdmVydF9ncm93LCBbLV0pbTRfaWYoWyQyXSwgW10sIFskMV0sIFskMl0pCm00X3Byb3ZpZGVfaWYoWyQxXSwgW200X3NldF9yZW1vdmUoW19tNF9wcm92aWRlXSwgWyQxXSldLAogIFttNF93YXJuKFtzeW50YXhdLCBbJDEgaXMgbTRfcmVxdWlyZSdkIGJ1dCBub3QgbTRfZGVmdW4nZF0pXSlfbTRfZGl2ZXJ0X3JhdygkMylfbTRfdW5kaXZlcnQoX200X2RpdmVydF9ncm93KW00X2RpdmVydF9wb3AoX200X2RpdmVydF9ncm93KV9tNF9wb3BkZWYoW19tNF9kaXZlcnRfZ3Jvd10sCltfbTRfZGl2ZXJ0aW5nKFskMV0pXSwgW19tNF9kaXZlcnRpbmddKQpUMTEsNzAKX200X2ZvcmVhY2htNF9pZihbJCNdLCBbM10sIFtdLAogICAgICAgWyQxWyQ0XSQyW10kMChbJDFdLCBbJDJdLCBtNF9zaGlmdDMoJEApKV0pClQxNCwyODgzCl9BQ19GVU5DX1ZGT1JLX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKGZvciB3b3JraW5nIHZmb3JrLCBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1svKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCl1BQ19JTkNMVURFU19ERUZBVUxUWwojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2lmZGVmIEhBVkVfVkZPUktfSAojIGluY2x1ZGUgPHZmb3JrLmg+CiNlbmRpZgovKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwogICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LiAgVGhlIGNvbXBpbGVyCiAgIGlzIHRvbGQgYWJvdXQgdGhpcyB3aXRoICNpbmNsdWRlIDx2Zm9yay5oPiwgYnV0IHNvbWUgY29tcGlsZXJzCiAgIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZvcmsuaD4uICBUZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGEKICAgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzCiAgIGNsb2JiZXJlZCBieSB0aGUgdmZvcmsuICAqLwpzdGF0aWMgdm9pZAojaWZkZWYgX19jcGx1c3BsdXMKc3BhcmNfYWRkcmVzc190ZXN0IChpbnQgYXJnKQojIGVsc2UKc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7CiNlbmRpZgp7CiAgc3RhdGljIHBpZF90IGNoaWxkOwogIGlmICghY2hpbGQpIHsKICAgIGNoaWxkID0gdmZvcmsgKCk7CiAgICBpZiAoY2hpbGQgPCAwKSB7CiAgICAgIHBlcnJvciAoInZmb3JrIik7CiAgICAgIF9leGl0KDIpOwogICAgfQogICAgaWYgKCFjaGlsZCkgewogICAgICBhcmcgPSBnZXRwaWQoKTsKICAgICAgd3JpdGUoLTEsICIiLCAwKTsKICAgICAgX2V4aXQgKGFyZyk7CiAgICB9CiAgfQp9CgppbnQKbWFpbiAoKQp7CiAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOwogIHBpZF90IGNoaWxkOwoKICBzcGFyY19hZGRyZXNzX3Rlc3QgKDApOwoKICBjaGlsZCA9IHZmb3JrICgpOwoKICBpZiAoY2hpbGQgPT0gMCkgewogICAgLyogSGVyZSBpcyBhbm90aGVyIHRlc3QgZm9yIHNwYXJjIHZmb3JrIHJlZ2lzdGVyIHByb2JsZW1zLiAgVGhpcwogICAgICAgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdCBhcyBtYW55IGxvY2FsCiAgICAgICB2YXJpYWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhciBpbmNsdWRpbmcgY29tcGlsZXIKICAgICAgIHRlbXBvcmFyaWVzLiAgNCBsb2NhbHMgYXJlIGVub3VnaCBmb3IgZ2NjIDEuNDAuMyBvbiBhIFNvbGFyaXMKICAgICAgIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4gIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkCiAgICAgICByZXVzZSB0aGUgcmVnaXN0ZXIgb2YgcGFyZW50IGZvciBvbmUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywKICAgICAgIHNpbmNlIGl0IHdpbGwgdGhpbmsgdGhhdCBwYXJlbnQgY2FuJ3QgcG9zc2libHkgYmUgdXNlZCBhbnkgbW9yZQogICAgICAgaW4gdGhpcyByb3V0aW5lLiAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMKICAgICAgIG11bmdlIHBhcmVudCBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICAqLwogICAgcGlkX3QKICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAogICAgICBwNCA9IGdldHBpZCgpLCBwNSA9IGdldHBpZCgpLCBwNiA9IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOwogICAgLyogQ29udmluY2UgdGhlIGNvbXBpbGVyIHRoYXQgcC4ucDcgYXJlIGxpdmU7IG90aGVyd2lzZSwgaXQgbWlnaHQKICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KICAgIGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8fCBwICE9IHA0Cgl8fCBwICE9IHA1IHx8IHAgIT0gcDYgfHwgcCAhPSBwNykKICAgICAgX2V4aXQoMSk7CgogICAgLyogT24gc29tZSBzeXN0ZW1zIChlLmcuIElSSVggMy4zKSwgdmZvcmsgZG9lc24ndCBzZXBhcmF0ZSBwYXJlbnQKICAgICAgIGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4gIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yCiAgICAgICBiZWZvcmUgaXQgZXhlY3Mgb3IgZXhpdHMsIHRoaXMgbXVuZ2VzIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yCiAgICAgICBhcyB3ZWxsLiAgVGVzdCBmb3IgdGhpcyBieSBjbG9zaW5nIHN0ZG91dCBpbiB0aGUgY2hpbGQuICAqLwogICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwogIH0gZWxzZSB7CiAgICBpbnQgc3RhdHVzOwogICAgc3RydWN0IHN0YXQgc3Q7CgogICAgd2hpbGUgKHdhaXQoJnN0YXR1cykgIT0gY2hpbGQpCiAgICAgIDsKICAgIHJldHVybiAoCgkgLyogV2FzIHRoZXJlIHNvbWUgcHJvYmxlbSB3aXRoIHZmb3JraW5nPyAgKi8KCSBjaGlsZCA8IDAKCgkgLyogRGlkIHRoZSBjaGlsZCBmYWlsPyAgKFRoaXMgc2hvdWxkbid0IGhhcHBlbi4pICAqLwoJIHx8IHN0YXR1cwoKCSAvKiBEaWQgdGhlIHZmb3JrL2NvbXBpbGVyIGJ1ZyBvY2N1cj8gICovCgkgfHwgcGFyZW50ICE9IGdldHBpZCgpCgoJIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCgkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAoJICk7CiAgfQp9XV0pXSwKCSAgICBbYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXNdLAoJICAgIFthY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vXSwKCSAgICBbYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1jcm9zc10pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw0OTEKQUNfSEVBREVSX1RJTUVfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkXSwKICBhY19jdl9oZWFkZXJfdGltZSwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDx0aW1lLmg+Cl0sCltpZiAoKHN0cnVjdCB0bSAqKSAwKQpyZXR1cm4gMDtdKV0sCgkJICAgW2FjX2N2X2hlYWRlcl90aW1lPXllc10sCgkJICAgW2FjX2N2X2hlYWRlcl90aW1lPW5vXSldKQppZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgogIEFDX0RFRklORShUSU1FX1dJVEhfU1lTX1RJTUUsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4KCSAgICAgYW5kIDx0aW1lLmg+Ll0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwyMwpBQ19ERUZJTkVfQUNfREVGSU5FX1EoW18kMF0sICRAKQpUMjQsMzMKbTRfbG9jYXRpb24oX0FDX0ZDX01BSU4pLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6ODU5ClQyMywyNwptNF9sb2NhdGlvbihBQ19MQU5HX0dPKS4uLy4uL2xpYi9hdXRvY29uZi9nby5tNDo0NApUMTMsMTYwCkFDX0dOVV9TT1VSQ0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfR05VX1NPVVJDRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwzNAptNF9sb2NhdGlvbihBQ19NSU5JWCkuLi8uLi9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6NDQxClQxMCw3MwpfQUNfRjk1X0ZDZ2ZvcnRyYW4gZzk1IHhsZjk1IGY5NSBmb3J0IGlmb3J0IGlmYyBlZmMgcGdmb3J0cmFuIHBnZjk1IGxmOTUgZnRuIG5hZ2ZvcgpUOSwxODAKQUNfRU5BQkxFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0VOQUJMRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQVJHX0VOQUJMRShbJDFdLCBbICAtLWVuYWJsZS0kMV0sIFskMl0sIFskM10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiw2NjgKQUNfQ0FDSEVfVkFMX200X2RlZnVuX3BybyhbJDBdKUFTX0xJVEVSQUxfV09SRF9JRihbJDFdLCBbbTRfaWYobTRfaW5kZXgobTRfcXVvdGUoJDEpLCBbX2N2X10pLCBbLTFdLAoJCQkgICAgW0FDX0RJQUdOT1NFKFtzeW50YXhdLApbJDAoJDEsIC4uLik6IHN1c3BpY2lvdXMgY2FjaGUtaWQsIG11c3QgY29udGFpbiBfY3ZfIHRvIGJlIGNhY2hlZF0pXSldKWRubAptNF9pZihtNF9pbmRleChbJDJdLCBbQUNfREVGSU5FXSksIFstMV0sIFtdLAogICAgICBbQUNfRElBR05PU0UoW3N5bnRheF0sClskMCgkMSwgLi4uKTogc3VzcGljaW91cyBwcmVzZW5jZSBvZiBhbiBBQ19ERUZJTkUgaW4gdGhlIHNlY29uZCBhcmd1bWVudCwgXWRubApbd2hlcmUgbm8gYWN0aW9ucyBzaG91bGQgYmUgdGFrZW5dKV0pZG5sCm00X2lmKG00X2luZGV4KFskMl0sIFtBQ19TVUJTVF0pLCBbLTFdLCBbXSwKICAgICAgW0FDX0RJQUdOT1NFKFtzeW50YXhdLApbJDAoJDEsIC4uLik6IHN1c3BpY2lvdXMgcHJlc2VuY2Ugb2YgYW4gQUNfU1VCU1QgaW4gdGhlIHNlY29uZCBhcmd1bWVudCwgXWRubApbd2hlcmUgbm8gYWN0aW9ucyBzaG91bGQgYmUgdGFrZW5dKV0pZG5sCkFTX1ZBUl9TRVRfSUYoWyQxXSwKCSAgICAgIFtfQVNfRUNIT19OKFsoY2FjaGVkKSBdKV0sCgkgICAgICBbJDJdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDMzCm00X2xvY2F0aW9uKEFDX0lOTElORSkuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjEKVDcsNjUKX200X21heG00X2V2YWwoKChbJDFdKSA+IChbJDJdKSkgKiAoWyQxXSkgKyAoKFskMV0pIDw9IChbJDJdKSkgKiAoWyQyXSkpClQyOCwzNAptNF9sb2NhdGlvbihBQ19GNzdfV1JBUFBFUlMpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTA3MQpGOCw4Cl9fZmlsZV9fX19maWxlX18KVDE4LDIKX0FTX0xJVEVSQUxfSUZfWUVTJDMKVDEwLDEyMQpfQUNfTElCT0JKY2FzZSAiICRMSUJAJnRAT0JKUyAiIGluCiAgKiIgJDEuJGFjX29iamV4dCAiKiApIDs7CiAgKikgQUNfU1VCU1QoW0xJQkAmdEBPQkpTXSwgWyIkTElCQCZ0QE9CSlMgJDEuJGFjX29iamV4dCJdKSA7Owplc2FjCgpUMjQsNzcKQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZX200X2RlZnVuX3BybyhbJDBdKV9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjEwLDYKbTRfYnJlZ2V4cHJlZ2V4cApGNyw3CnB1c2hkZWZwdXNoZGVmClQzMiwzNQptNF9sb2NhdGlvbihBQ19GVU5DX0ZOTUFUQ0hfR05VKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6NTgyClQzNiwzMgptNF9sb2NhdGlvbihBQ19FUkxBTkdfU1VCU1RfTElCX0RJUikuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjI0MQpUMTUsMzQ1Cl9BQ19DT01QVVRFX0lOVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DT01QVVRFX0lOVChbJDJdLCBbJDFdLCBbJDNdLCBbJDRdKQpBQ19ESUFHTk9TRShbb2Jzb2xldGVdLApbVGhlIG1hY3JvIGBfQUNfQ09NUFVURV9JTlQnIGlzIG9ic29sZXRlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgaW4gYQpmdXR1cmUgdmVyc2lvbiBvciBBdXRvY29uZi4gIEhlbmNlLCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgdXNlCmluc3RlYWQgdGhlIHB1YmxpYyBBQ19DT01QVVRFX0lOVCBtYWNyby4gIE5vdGUgdGhhdCB0aGUgYXJndW1lbnRzIGFyZQpzbGlnaHRseSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgdHdvLl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNzYKQUNfUEFUSF9QUk9HX200X2RlZnVuX3BybyhbJDBdKV9BQ19QQVRIX1BST0coJEApCkFDX1NVQlNUKFskMV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMzE2CkFDX0xBTkdfUFJPR1JBTShPYmplY3RpdmUgQysrKSQxCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRjc3X0hPT0tTXSwgW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdKVtdZG5sCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0ZDX0hPT0tTXSlbXWRubAppbnQKbWFpbiAoKQp7CmRubCBEbyAqbm90KiBpbmRlbnQgdGhlIGZvbGxvd2luZyBsaW5lOiB0aGVyZSBtYXkgYmUgQ1BQIGRpcmVjdGl2ZXMuCmRubCBEb24ndCBtb3ZlIHRoZSBgOycgcmlnaHQgYWZ0ZXIgZm9yIHRoZSBzYW1lIHJlYXNvbi4KJDIKICA7CiAgcmV0dXJuIDA7Cn0KVDE0LDEzODAKQUNfRlVOQ19BTExPQ0FfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCiMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCkFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBhbGxvY2EuaF0sIGFjX2N2X3dvcmtpbmdfYWxsb2NhX2gsCltBQ19MSU5LX0lGRUxTRSgKICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW1tAJTpAaW5jbHVkZSA8YWxsb2NhLmg+XV0sCgkJCVtbY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMiAqIHNpemVvZiAoaW50KSk7CgkJCSAgaWYgKHApIHJldHVybiAwO11dKV0sCgkJW2FjX2N2X3dvcmtpbmdfYWxsb2NhX2g9eWVzXSwKCQlbYWNfY3Zfd29ya2luZ19hbGxvY2FfaD1ub10pXSkKaWYgdGVzdCAkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX0FMTE9DQV9ILCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZAoJICAgICAobm90IG9uIFVsdHJpeCkuXSkKZmkKCkFDX0NBQ0hFX0NIRUNLKFtmb3IgYWxsb2NhXSwgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKApbWyNpZmRlZiBfX0dOVUNfXwojIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQojZWxzZQojIGlmZGVmIF9NU0NfVkVSCiMgIGluY2x1ZGUgPG1hbGxvYy5oPgojICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKIyBlbHNlCiMgIGlmZGVmIEhBVkVfQUxMT0NBX0gKIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgojICBlbHNlCiMgICBpZmRlZiBfQUlYCiAjcHJhZ21hIGFsbG9jYQojICAgZWxzZQojICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCnZvaWQgKmFsbG9jYSAoc2l6ZV90KTsKIyAgICBlbmRpZgojICAgZW5kaWYKIyAgZW5kaWYKIyBlbmRpZgojZW5kaWYKXV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMSk7CgkJCQkgICAgaWYgKHApIHJldHVybiAwO11dKV0sCgkJW2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllc10sCgkJW2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vXSldKQoKaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9BTExPQ0EsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIGBhbGxvY2EnLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLl0pCmVsc2UKICBfQUNfTElCT0JKX0FMTE9DQQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDY4CkFDX0NPTkZJR19MSU5LU19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfQ09ORklHX0ZPT1MoW0xJTktTXSwgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwzNgptNF9sb2NhdGlvbihBQ19XQUlUMykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjIwMzAKVDIzLDIwOApBQ19TWVNfU0lHTElTVF9ERUNMQVJFRF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TWVNfU0lHTElTVF9ERUNMQVJFRCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19ERUNMX1NZU19TSUdMSVNUXSwgW0FDX0RFQ0xfU1lTX1NJR0xJU1QoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDEyODEKQUNfRVJMQU5HX0NIRUNLX0xJQl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19FUkxBTkdfUEFUSF9FUkxDXSlbXWRubApBQ19SRVFVSVJFKFtBQ19FUkxBTkdfUEFUSF9FUkxdKVtdZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgRXJsYW5nL09UUCAnJDEnIGxpYnJhcnkgc3ViZGlyZWN0b3J5XSwKICAgIFthY19jdl9lcmxhbmdfbGliX2Rpcl8kMV0sCiAgICBbQUNfTEFOR19QVVNIKEVybGFuZylbXWRubAogICAgIEFDX1JVTl9JRkVMU0UoCglbQUNfTEFOR19QUk9HUkFNKFtdLCBbZG5sCgkgICAgUmV0dXJuVmFsdWUgPSBjYXNlIGNvZGU6bGliX2RpcigiWyQxXSIpIG9mCgkgICAge2Vycm9yLCBiYWRfbmFtZX0gLT4KCQlmaWxlOndyaXRlX2ZpbGUoImNvbmZ0ZXN0Lm91dCIsICJub3QgZm91bmRcbiIpLAoJCTE7CgkgICAgTGliRGlyIC0+CgkJZmlsZTp3cml0ZV9maWxlKCJjb25mdGVzdC5vdXQiLCBMaWJEaXIpLAoJCTAKCSAgICBlbmQsCgkgICAgaGFsdChSZXR1cm5WYWx1ZSldKV0sCglbYWNfY3ZfZXJsYW5nX2xpYl9kaXJfJDE9YGNhdCBjb25mdGVzdC5vdXRgCgkgcm0gLWYgY29uZnRlc3Qub3V0XSwKCVtpZiB0ZXN0ICEgLWYgY29uZnRlc3Qub3V0OyB0aGVuCgkgICAgIEFDX01TR19GQUlMVVJFKFt0ZXN0IEVybGFuZyBwcm9ncmFtIGV4ZWN1dGlvbiBmYWlsZWRdKQoJIGVsc2UKCSAgICAgYWNfY3ZfZXJsYW5nX2xpYl9kaXJfJDE9Im5vdCBmb3VuZCIKCSAgICAgcm0gLWYgY29uZnRlc3Qub3V0CgkgZmldKQogICAgIEFDX0xBTkdfUE9QKEVybGFuZylbXWRubAogICAgXSkKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBFcmxhbmcvT1RQICckMScgbGlicmFyeSB2ZXJzaW9uXSwKICAgIFthY19jdl9lcmxhbmdfbGliX3Zlcl8kMV0sCiAgICBbQVNfSUYoW3Rlc3QgIiRhY19jdl9lcmxhbmdfbGliX2Rpcl8kMSIgPSAibm90IGZvdW5kIl0sCglbYWNfY3ZfZXJsYW5nX2xpYl92ZXJfJDE9Im5vdCBmb3VuZCJdLAoJW2FjX2N2X2VybGFuZ19saWJfdmVyXyQxPWBBU19FQ0hPKFsiJGFjX2N2X2VybGFuZ19saWJfZGlyXyQxIl0pIHwgc2VkIC1uIC1lICdzLF4uKi1cKFtbXi8tXV0qXCkkLFwxLHAnYF0pW11kbmwKICAgIF0pCkFDX1NVQlNUKFtFUkxBTkdfTElCX0RJUl8kMV0sIFskYWNfY3ZfZXJsYW5nX2xpYl9kaXJfJDFdKQpBQ19TVUJTVChbRVJMQU5HX0xJQl9WRVJfJDFdLCBbJGFjX2N2X2VybGFuZ19saWJfdmVyXyQxXSkKQVNfSUYoW3Rlc3QgIiRhY19jdl9lcmxhbmdfbGliX2Rpcl8kMSIgPSAibm90IGZvdW5kIl0sIFskM10sIFskMl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzIsMzMKbTRfbG9jYXRpb24oQUNfREVDTF9TWVNfU0lHTElTVCkuLi8uLi9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6MzkKVDE0LDEwMwpfQVNfVFJfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfVFJfU0hfUFJFUEFSRV0pQVNfUkVRVUlSRShbX0FTX1RSX0NQUF9QUkVQQVJFXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDgxCl9BSF9DSEVDS19GVU5DQUhfVEVNUExBVEUoQVNfVFJfQ1BQKFtIQVZFXyQxXSksCiAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgJDEnIGZ1bmN0aW9uLl0pClQxOCw4MzAKQUNfU1RSVUNUX1RJTUVaT05FX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1NUUlVDVF9UTV0pZG5sCkFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCB0bS50bV96b25lXSwsLFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDwkYWNfY3Zfc3RydWN0X3RtPgpdKQppZiB0ZXN0ICIkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1RNX1pPTkUsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgYHN0cnVjdCB0bScgaGFzIGB0bV96b25lJy4gRGVwcmVjYXRlZCwgdXNlCgkgICAgIGBIQVZFX1NUUlVDVF9UTV9UTV9aT05FJyBpbnN0ZWFkLl0pCmVsc2UKICBBQ19DSEVDS19ERUNMUyhbdHpuYW1lXSwgLCAsIFsjaW5jbHVkZSA8dGltZS5oPl0pCiAgQUNfQ0FDSEVfQ0hFQ0soZm9yIHR6bmFtZSwgYWNfY3ZfdmFyX3R6bmFtZSwKW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCltbI2luY2x1ZGUgPHRpbWUuaD4KI2lmICFIQVZFX0RFQ0xfVFpOQU1FCmV4dGVybiBjaGFyICp0em5hbWVbXTsKI2VuZGlmCl1dLApbW3JldHVybiB0em5hbWVbMF1bMF07XV0pXSwKCQlbYWNfY3ZfdmFyX3R6bmFtZT15ZXNdLAoJCVthY19jdl92YXJfdHpuYW1lPW5vXSldKQogIGlmIHRlc3QgJGFjX2N2X3Zhcl90em5hbWUgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1RaTkFNRSwgMSwKCSAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgZG9uJ3QgaGF2ZSBgdG1fem9uZScgYnV0IGRvIGhhdmUgdGhlIGV4dGVybmFsCgkgICAgICAgYXJyYXkgYHR6bmFtZScuXSkKICBmaQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDI4Cm00X2xvY2F0aW9uKEFDX0NfQ0hBUl9VTlNJR05FRCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxNDI1ClQyNCwzCl9tNF9kaXZlcnQoSEVMUF9WQVJfRU5EKTEwNQpUMTAsMjQKQU5fTElCUkFSWUFOX09VVFBVVChbbGlicmFyeV0sICRAKQpUMTEsMjUKQU5fRlVOQ1RJT05BTl9PVVRQVVQoW2Z1bmN0aW9uXSwgJEApClQzOSwzNAptNF9sb2NhdGlvbihBQ19ESVNBQkxFX09QVElPTl9DSEVDS0lORykuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNDk3ClQxMiw0NwpBU19WQVJfQVJJVEhhc19mbl9hcml0aCAkMiAmJiBBU19WQVJfU0VUKFskMV0sIFskYXNfdmFsXSlbXQpUMTIsMTk3CkFTX1ZBUl9BUklUSF9tNF9kZWZ1bl9wcm8oWyQwXSlfQVNfREVURUNUX1NVR0dFU1RFRChbX0FTX1ZBUl9BUklUSF9XT1JLU10pQVNfUkVRVUlSRShbX0FTX1ZBUl9BUklUSF9QUkVQQVJFXSwgW10sIFtNNFNILUlOSVQtRk5dKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw4MgpBU19ESVJOQU1FJGFzX2Rpcm5hbWUgLS0gJDEgfHwKX0FTX0RJUk5BTUVfRVhQUihbJDFdKSAyPi9kZXYvbnVsbCB8fApfQVNfRElSTkFNRV9TRUQoWyQxXSlbXQpUMTAsMTI0CkFTX0RJUk5BTUVfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbXyQwX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwzMDQKQUNfRVJMQU5HX1BBVEhfRVJMQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19BUkdfVkFSKFtFUkxDXSwgW0VybGFuZy9PVFAgY29tcGlsZXIgY29tbWFuZCBbYXV0b2RldGVjdGVkXV0pZG5sCmlmIHRlc3QgLW4gIiRFUkxDIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZXJsY10pCiAgICBBQ19NU0dfUkVTVUxUKFskRVJMQ10pCmVsc2UKICAgIEFDX1BBVEhfVE9PTChFUkxDLCBlcmxjLCBbJDFdLCBbJDJdKQpmaQpBQ19BUkdfVkFSKFtFUkxDRkxBR1NdLCBbRXJsYW5nL09UUCBjb21waWxlciBmbGFncyBbbm9uZV1dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDM2Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RBVCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE1MjUKVDEyLDM0NQpBQ19QQVRIX1RPT0xfbTRfZGVmdW5fcHJvKFskMF0paWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgogIEFDX1BBVEhfUFJPRyhbJDFdLCBbJHthY190b29sX3ByZWZpeH0kMl0sICwgWyQ0XSkKZmkKaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfJDEiOyB0aGVuCiAgYWNfcHRfJDE9JCQxCiAgX0FDX1BBVEhfUFJPRyhbYWNfcHRfJDFdLCBbJDJdLCBbXSwgWyQ0XSkKICBpZiB0ZXN0ICJ4JGFjX3B0XyQxIiA9IHg7IHRoZW4KICAgICQxPSIkMyIKICBlbHNlCiAgICBfQUNfVE9PTF9XQVJOCiAgICAkMT0kYWNfcHRfJDEKICBmaQplbHNlCiAgJDE9IiRhY19jdl9wYXRoXyQxIgpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDQ5OQpBQ19DQUNIRV9MT0FEaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCiAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKICAjIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4gIERKR1BQIGVtdWxhdGVzIGl0IGFzIGEgcmVndWxhciBmaWxlLgogIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCiAgICBBQ19NU0dfTk9USUNFKFtsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlXSkKICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KICAgICAgW1tcXC9dXSogfCA/OltbXFwvXV0qICkgLiAiJGNhY2hlX2ZpbGUiOzsKICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OwogICAgZXNhYwogIGZpCmVsc2UKICBBQ19NU0dfTk9USUNFKFtjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZV0pCiAgPiRjYWNoZV9maWxlCmZpCgpUMjQsMjcKbTRfbG9jYXRpb24oQUNfUFJPR19DWFgpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6Njk0ClQxMCw1MjAKX0FDX1BBVEhfWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9WQUwoYWNfY3ZfaGF2ZV94LApbIyBPbmUgb3IgYm90aCBvZiB0aGUgdmFycyBhcmUgbm90IHNldCwgYW5kIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZS4KYWNfeF9pbmNsdWRlcz1ubyBhY194X2xpYnJhcmllcz1ubwpfQUNfUEFUSF9YX1hNS01GCl9BQ19QQVRIX1hfRElSRUNUCmNhc2UgJGFjX3hfaW5jbHVkZXMsJGFjX3hfbGlicmFyaWVzIGluICMoCiAgbm8sKiB8ICosbm8gfCAqXCcqKQogICAgIyBEaWRuJ3QgZmluZCBYLCBvciBhIGRpcmVjdG9yeSBoYXMgIiciIGluIGl0cyBuYW1lLgogICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9bm8iOzsgIygKICAqKQogICAgIyBSZWNvcmQgd2hlcmUgd2UgZm91bmQgWCBmb3IgdGhlIGNhY2hlLgogICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAoJYWNfeF9pbmNsdWRlcz0nJGFjX3hfaW5jbHVkZXMnXAoJYWNfeF9saWJyYXJpZXM9JyRhY194X2xpYnJhcmllcyciCmVzYWNdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDI3MgpfQUNfRE9fRUNIT19tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZihbJDFdLCBbJGFjX3RyeV0sIFtdLCBbYWNfdHJ5PSIkMSIKXSlbY2FzZSAiKCgkYWNfdHJ5IiBpbgogICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwogICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owplc2FjCmV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiXQpBU19FQ0hPKFsiJGFjX3RyeV9lY2hvIl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE4OQpBQ19GRF9DQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GRF9DQycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBU19NRVNTQUdFX0xPR19GRF0sIFtBU19NRVNTQUdFX0xPR19GRCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsOTgyCkFDX0ZDX1NSQ0VYVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBGb3J0cmFuIGZsYWcgdG8gY29tcGlsZSAuJDEgZmlsZXNdLAoJCWFjX2N2X2ZjX3NyY2V4dF8kMSwKW2FjX2V4dD0kMQphY19mY2ZsYWdzX3NyY2V4dF9zYXZlPSRhY19mY2ZsYWdzX3NyY2V4dAphY19mY2ZsYWdzX3NyY2V4dD0KYWNfY3ZfZmNfc3JjZXh0XyQxPXVua25vd24KY2FzZSAkYWNfZXh0IGluICMoCiAgW1tmRl1dNzcpIGFjX3RyeT1mNzc7OyAjKAogICopIGFjX3RyeT1mOTU7Owplc2FjCmZvciBhY19mbGFnIGluIG5vbmUgLXFzdWZmaXg9Zj0kMSAtVGYgIi14ICRhY190cnkiOyBkbwogIHRlc3QgIngkYWNfZmxhZyIgIT0geG5vbmUgJiYgYWNfZmNmbGFnc19zcmNleHQ9IiRhY19mbGFnIgogIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sIFthY19jdl9mY19zcmNleHRfJDE9JGFjX2ZsYWc7IGJyZWFrXSkKZG9uZQpybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiQxCmFjX2ZjZmxhZ3Nfc3JjZXh0PSRhY19mY2ZsYWdzX3NyY2V4dF9zYXZlCl0pCmlmIHRlc3QgIngkYWNfY3ZfZmNfc3JjZXh0XyQxIiA9IHh1bmtub3duOyB0aGVuCiAgbTRfZGVmYXVsdChbJDNdLFtBQ19NU0dfRVJST1IoW0ZvcnRyYW4gY291bGQgbm90IGNvbXBpbGUgLiQxIGZpbGVzXSldKQplbHNlCiAgYWNfZmNfc3JjZXh0PSQxCiAgaWYgdGVzdCAieCRhY19jdl9mY19zcmNleHRfJDEiID0geG5vbmU7IHRoZW4KICAgIGFjX2ZjZmxhZ3Nfc3JjZXh0PSIiCiAgICBGQ0ZMQUdTX1tdJDFbXT0iIgogIGVsc2UKICAgIGFjX2ZjZmxhZ3Nfc3JjZXh0PSRhY19jdl9mY19zcmNleHRfJDEKICAgIEZDRkxBR1NfW10kMVtdPSRhY19jdl9mY19zcmNleHRfJDEKICBmaQogIEFDX1NVQlNUKEZDRkxBR1NfW10kMSkKICAkMgpmaQpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMzLDI5Cm00X2xvY2F0aW9uKF9BU19CQVNFTkFNRV9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6OTU0ClQyNSwzNAptNF9sb2NhdGlvbihfQUNfRE9fTElNSVQpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjQxMgpUMjcsMzMKbTRfbG9jYXRpb24oQUNfTE9OR19ET1VCTEUpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjYzClQzOSwyOAptNF9sb2NhdGlvbihBQ19DX0ZMRVhJQkxFX0FSUkFZX01FTUJFUikuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoxODQ2ClQyMywxMDYKX0FIX0NIRUNLX0hFQURFUl9ESVJFTlRBSF9URU1QTEFURShBU19UUl9DUFAoW0hBVkVfJDFdKSwKICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDwkMT4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLl0pClQxOCw2NwpBQ19MQU5HX0NPTkZURVNUKCljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkFDX0xBTkdfREVGSU5FU19QUk9WSURFRFtdJDEKX0FDRU9GClQxOSwxODgKQUNfRVJMQU5HX05FRURfRVJMQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19FUkxBTkdfUEFUSF9FUkxDKFtub3QgZm91bmRdLCBbJDFdKQppZiB0ZXN0ICIkRVJMQyIgPSAibm90IGZvdW5kIjsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtFcmxhbmcvT1RQIGNvbXBpbGVyIChlcmxjKSBub3QgZm91bmQgYnV0IHJlcXVpcmVkXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMywyOAptNF9sb2NhdGlvbihBQ19MQU5HX0NPTVBJTEVSKEdvKSkuLi8uLi9saWIvYXV0b2NvbmYvZ28ubTQ6MTQzClQyMCwzCl9BQ19MQU5HX0FCQlJFVihDKyspY3h4ClQyNiwzNAptNF9sb2NhdGlvbihBQ19BUkdfRU5BQkxFKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0NjIKVDM0LDEyMgpfQUNfTEFOR19JT19QUk9HUkFNKE9iamVjdGl2ZSBDKyspQUNfTEFOR19QUk9HUkFNKFtAJTpAaW5jbHVkZSA8c3RkaW8uaD5dLApbRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKXSkKVDE0LDQwOApBQ19DSEVDS19UT09MU19tNF9kZWZ1bl9wcm8oWyQwXSlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgZm9yIGFjX3Byb2cgaW4gJDIKICBkbwogICAgQUNfQ0hFQ0tfUFJPRyhbJDFdLAoJCSAgWyRhY190b29sX3ByZWZpeCRhY19wcm9nXSwgWyRhY190b29sX3ByZWZpeCRhY19wcm9nXSwsCgkJICBbJDRdKQogICAgdGVzdCAtbiAiJCQxIiAmJiBicmVhawogIGRvbmUKZmkKaWYgdGVzdCAteiAiJCQxIjsgdGhlbgogIGFjX2N0XyQxPSQkMQogIEFDX0NIRUNLX1BST0dTKFthY19jdF8kMV0sIFskMl0sIFtdLCBbJDRdKQogIGlmIHRlc3QgIngkYWNfY3RfJDEiID0geDsgdGhlbgogICAgJDE9IiQzIgogIGVsc2UKICAgIF9BQ19UT09MX1dBUk4KICAgICQxPSRhY19jdF8kMQogIGZpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsNDIKbTRfbWFwYWxsX3NlcG00X2lmKFskM10sIFtdLCBbXSwgW18kMChbJDFdLCBbJDJdLCAkMyldKQpUMjUsMjkKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfTElCKS4uLy4uL2xpYi9hdXRvY29uZi9saWJzLm00Ojk5ClQyMSwzNAptNF9sb2NhdGlvbihfQUNfRVZBTCkuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDIyCkYxMSwxMQpjaGFuZ2VxdW90ZWNoYW5nZXF1b3RlClQxNiwxMTgKX0FDX1JFUExBQ0VfRlVOQ0FDX0NIRUNLX0ZVTkMoWyQxXSwKICBbX0FIX0NIRUNLX0ZVTkMoWyQxXSlBQ19ERUZJTkUoQVNfVFJfQ1BQKFtIQVZFXyQxXSkpXSwKICBbX0FDX0xJQk9CSihbJDFdKUFDX0xJQlNPVVJDRShbJDEuY10pXSkKVDEwLDE5MQpBQ19TVF9SREVWX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NUX1JERVYnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfU1RSVUNUX1NUX1JERVZdLCBbQUNfU1RSVUNUX1NUX1JERVYoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDM0Cm00X2xvY2F0aW9uKEFDX1BST0dfTE5fUykuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6Nzk5ClQ5LDI2Cm00X2lmbmRlZm00X2lmZGVmKFskMV0sIFskM10sIFskMl0pClQxOCwxNDQKQVNfVkVSU0lPTl9DT01QQVJFYXNfYXJnX3YxPSQxCmFzX2FyZ192Mj0kMgphd2sgIiRhc19hd2tfc3RydmVyc2NtcCIgdjE9IiRhc19hcmdfdjEiIHYyPSIkYXNfYXJnX3YyIiAvZGV2L251bGwKQVNfQ0FTRShbJD9dLAoJWzFdLCBbJDNdLAoJWzBdLCBbJDRdLAoJWzJdLCBbJDVdKVtdClQxOCwxMjQKQVNfVkVSU0lPTl9DT01QQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsMzAKbTRfbG9jYXRpb24oQUNfT0JKRVhUKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjQ5MQpUMjYsMzYKbTRfbG9jYXRpb24oQUNfRlVOQ19WRk9SSykuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE5NDQKVDEzLDQ3Cm00X2NvcHlfZm9yY2VtNF9pZmRlZihbJDJdLCBbX200X3VuZGVmaW5lKFskMl0pXSltNF9jb3B5KCRAKQpUMzIsMTIyCl9BQ19MQU5HX0lPX1BST0dSQU0oT2JqZWN0aXZlIEMpQUNfTEFOR19QUk9HUkFNKFtAJTpAaW5jbHVkZSA8c3RkaW8uaD5dLApbRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKXSkKVDI3LDM2Cm00X2xvY2F0aW9uKEFNX0ZVTkNfU1RSVE9EKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTYxOQpUMjcsMzUKbTRfbG9jYXRpb24oQUNfRlVOQ19GU0VFS08pLi4vLi4vbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo2MDEKVDI0LDQ5NQpfQUNfQ0hFQ0tfSEVBREVSX1BSRVBST0NfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRV9TSEVMTF9GTihbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfY2hlY2tfaGVhZGVyX3ByZXByb2NdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfY2hlY2tfaGVhZGVyX3ByZXByb2NdLAogICAgW0xJTkVOTyBIRUFERVIgVkFSXSwKICAgIFtUZXN0cyB3aGV0aGVyIEhFQURFUiBpcyBwcmVzZW50LCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuXSldLAogIFskMF9CT0RZXSlBU19WQVJfUFVTSERFRihbYWNfSGVhZGVyXSwgW2FjX2N2X2hlYWRlcl8kMV0pYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV9jaGVja19oZWFkZXJfcHJlcHJvYyAiJExJTkVOTyIgIiQxIiAiYWNfSGVhZGVyIgpBU19WQVJfSUYoW2FjX0hlYWRlcl0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY19IZWFkZXJdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDY2CkFDX0xBTkdfQ09NUElMRVIoT2JqZWN0aXZlIEMpX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfT0JKQ10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDEyCkFDX0ZBVEFMbTRfZmF0YWwoJEApClQyMiwzMwptNF9sb2NhdGlvbihBQ19GSU5EX1gpLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjU3ClQyMiwzNAptNF9sb2NhdGlvbihBQ19DWUdXSU4pLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjMyMQpUNywxMDgKbTRfam9pbm00X2lmKFskI10sIFsxXSwgW10sCiAgICAgICBbJCNdLCBbMl0sIFtbJDJdXSwKICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDJdX10pJDAoWyQxXSwgbTRfc2hpZnQyKCRAKSldKQpUMjMsMzE3MwpfQVNfREVURUNUX0JFVFRFUl9TSEVMTF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZihfQVNfRk9SQ0VfUkVFWEVDX1dJVEhfQ09ORklHX1NIRUxMLCBbeWVzXSwKICBbIyBVc2UgYSBwcm9wZXIgaW50ZXJuYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZW5zdXJlIHdlIGRvbid0IGZhbGwKICAjIGludG8gYW4gaW5maW5pdGUgbG9vcCwgY29udGludW91c2x5IHJlLWV4ZWN1dGluZyBvdXJzZWx2ZXMuCiAgaWYgdGVzdCB4IiR7X2FzX2Nhbl9yZWV4ZWN9IiAhPSB4bm8gJiYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4KICAgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWM7CiAgICBfQVNfUkVFWEVDX1dJVEhfU0hFTEwoWyRDT05GSUdfU0hFTExdKQogIGZpCiAgIyBXZSBkb24ndCB3YW50IHRoaXMgdG8gcHJvcGFnYXRlIHRvIG90aGVyIHN1YnByb2Nlc3Nlcy4KICBkbmwgVGhpcyBtaWdodCBiZSBlc3BlY2lhbGx5IGltcG9ydGFudCBpbiBjYXNlIGFuIG00c2gtZ2VuZXJhdGVkIHNjcmlwdAogIGRubCBpcyB1c2VkIHRvIGxhdGVyIGV4ZWN1dGUgb3RoZXIgbTRzaC1nZW5lcmF0ZWQgc2NyaXB0cy4gIFRoaXMgaGFwcGVucwogIGRubCBmb3IgZXhhbXBsZSBpbiBhdXRvY29uZidzIG93biB0ZXN0c3VpdGUgKGFuZCBoYXBwZW5zICphIGxvdCogdGhlcmUsCiAgZG5sIGluIGZhY3QpLgogIEFTX1VOU0VUKFtfYXNfY2FuX3JlZXhlY10pCl0pbTRfc2V0X21hcChbX0FTX0RFVEVDVF9TVUdHRVNURURfQk9EWV0sIFtfQVNfREVURUNUX1NVR0dFU1RFRF9QUlVORV0pbTRfcHVzaGRlZihbQVNfRVhJVF0sIFtleGl0IG00X2RlZmF1bHQoXW00X2RxdW90ZShbJF1bMV0pWywgMSldKWlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KICBhc19ib3VybmVfY29tcGF0aWJsZT0iQVNfRVNDQVBFKF9tNF9leHBhbmQoW19BU19CT1VSTkVfQ09NUEFUSUJMRV0pKSIKICBfQVNfREVURUNUX0VYUEFORChbYXNfcmVxdWlyZWRdLCBbX0FTX0RFVEVDVF9SRVFVSVJFRF9CT0RZXSkKICBfQVNfREVURUNUX0VYUEFORChbYXNfc3VnZ2VzdGVkXSwgW19BU19ERVRFQ1RfU1VHR0VTVEVEX0JPRFldKQogIEFTX0lGKFtfQVNfUlVOKFsiJGFzX3JlcXVpcmVkIl0pXSwKCVthc19oYXZlX3JlcXVpcmVkPXllc10sCglbYXNfaGF2ZV9yZXF1aXJlZD1ub10pCiAgQVNfSUYoW3Rlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geHllcyAmJiBfQVNfUlVOKFsiJGFzX3N1Z2dlc3RlZCJdKV0sCiAgICBbXSwKICAgIFtfQVNfUEFUSF9XQUxLKFsvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSF0sCiAgICAgIFtjYXNlICRhc19kaXIgaW4gQCU6QCgKCSAvKikKCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgoJICAgICBhc19zaGVsbD0kYXNfZGlyLyRhc19iYXNlCgkgICAgIEFTX0lGKFt7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKCQkgICAgX0FTX1JVTihbIiRhc19yZXF1aXJlZCJdLCBbIiRhc19zaGVsbCJdKV0sCgkJICAgW0NPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKCQkgICBtNF9zZXRfZW1wdHkoW19BU19ERVRFQ1RfU1VHR0VTVEVEX0JPRFldLCBbYnJlYWsgMl0sCgkJICAgICBbQVNfSUYoW19BU19SVU4oWyIkYXNfc3VnZ2VzdGVkIl0sIFsiJGFzX3NoZWxsIl0pXSwKCQkJICAgIFticmVhayAyXSldKV0pCgkgICBkb25lOzsKICAgICAgIGVzYWNdLAogICAgICBbQVNfSUYoW3sgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgoJICAgICAgX0FTX1JVTihbIiRhc19yZXF1aXJlZCJdLCBbIiRTSEVMTCJdKV0sCgkgICAgIFtDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzXSldKQoKICAgICAgQVNfSUYoW3Rlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4XSwKICAgICAgICAgICAgW2V4cG9ydCBDT05GSUdfU0hFTEwKICAgICAgICAgICAgIF9BU19SRUVYRUNfV0lUSF9TSEVMTChbJENPTkZJR19TSEVMTF0pXSkKCmRubCBVbmZvcnR1bmF0ZWx5LCAkYXNfbWUgaXNuJ3QgYXZhaWxhYmxlIGhlcmUuCiAgICBBU19JRihbdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm9dLAogICAgICBbQVNfRUNITyhbIiRbXTA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiXSkKICBBU19FQ0hPKFsiJFtdMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIl0pCiAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KICAgIEFTX0VDSE8oWyIkW10wOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiXSkKICAgIEFTX0VDSE8oWyIkW10wOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIl0pCiAgZWxzZQogICAgQVNfRUNITygibTRfdGV4dF93cmFwKFtQbGVhc2UgdGVsbCBdX200X2RlZm4oW200X1BBQ0tBR0VfQlVHUkVQT1JUXSkKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgW200X2lmKF9tNF9kZWZuKFttNF9QQUNLQUdFX0JVR1JFUE9SVF0pLApfbTRfZGVmbihbQUNfUEFDS0FHRV9CVUdSRVBPUlRdKSwgW10sIFthbmQgX200X2RlZm4oW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSldKV0pClthYm91dCB5b3VyIHN5c3RlbSwgaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4KVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4gdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEKc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLl0sIFskW10wOiBdLCBbXSwgWzYyXSkiKQogIGZpCiAgQVNfRVhJVF0pXSkKZmkKU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KZXhwb3J0IFNIRUxMCiMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgpDTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQp1bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKX200X3BvcGRlZihbQVNfRVhJVF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCw3MzI4Cl9BQ19PVVRQVVRfRklMRVNfUFJFUEFSRSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCmlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCgpkbmwgRm9yIEFDX1NVQlNUX0ZJTEUsIGNoZWNrIGZvciB1c2FibGUgZ2V0bGluZSBzdXBwb3J0IGluIGF3aywKZG5sIGF0IGNvbmZpZy5zdGF0dXMgZXhlY3V0aW9uIHRpbWUuCmRubCBPdGhlcndpc2UsIGRvIHRoZSBpbnRlcnBvbGF0aW9uIGluIHNoLCB3aGljaCBpcyBzbG93ZXIuCmRubCBXaXRob3V0IGFueSBBQ19TVUJTVF9GSUxFLCBvbWl0IGFsbCByZWxhdGVkIGNvZGUuCmRubCBOb3RlIHRoZSBleHBhbnNpb24gaXMgZG91YmxlLXF1b3RlZCBmb3IgcmVhZGFiaWxpdHkuCm00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbW2lmICRBV0sgJ0JFR0lOIHsgZ2V0bGluZSA8Ii9kZXYvbnVsbCIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgogIGFjX2NzX2F3a19nZXRsaW5lPToKICBhY19jc19hd2tfcGlwZV9pbml0PQogIGFjX2NzX2F3a19yZWFkX2ZpbGU9JwogICAgICB3aGlsZSAoKGdldGxpbmUgYWxpbmUgPCAoRltrZXldKSkgPiAwKQoJcHJpbnQoYWxpbmUpCiAgICAgIGNsb3NlKEZba2V5XSknCiAgYWNfY3NfYXdrX3BpcGVfZmluaT0KZWxzZQogIGFjX2NzX2F3a19nZXRsaW5lPWZhbHNlCiAgYWNfY3NfYXdrX3BpcGVfaW5pdD0icHJpbnQgXCJjYXQgPDwnfCNfISFfI3wnICYmXCIiCiAgYWNfY3NfYXdrX3JlYWRfZmlsZT0nCiAgICAgIHByaW50ICJ8I18hIV8jfCIKICAgICAgcHJpbnQgImNhdCAiIEZba2V5XSAiICYmIgogICAgICAnJGFjX2NzX2F3a19waXBlX2luaXQKICAjIFRoZSBmaW5hbCBgOicgZmluaXNoZXMgdGhlIEFORCBsaXN0LgogIGFjX2NzX2F3a19waXBlX2Zpbmk9J0VORCB7IHByaW50ICJ8I18hIV8jfCI7IHByaW50ICI6IiB9JwpmaV1dKQphY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCiMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCiMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCmlmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgogIGV2YWwgYWNfY3I9XCRcJ1xcclwnCmZpCmFjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKaWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KICBhY19jc19hd2tfY3I9J1xccicKZWxzZQogIGFjX2NzX2F3a19jcj0kYWNfY3IKZmkKZG5sCmRubCBEZWZpbmUgdGhlIHBpcGUgdGhhdCBkb2VzIHRoZSBzdWJzdGl0dXRpb24uCm00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbbTRfZGVmaW5lKFtfQUNfU1VCU1RfQ01EU10sIFt8CmlmICRhY19jc19hd2tfZ2V0bGluZTsgdGhlbgogICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siCmVsc2UKICAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIiB8ICRTSEVMTApmaV0pXSwKW200X2RlZmluZShbX0FDX1NVQlNUX0NNRFNdLApbfCAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIl0pXSlkbmwKCmVjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCl9BQ0VPRgoKbTRfaWZkZWYoW19BQ19TVUJTVF9GSUxFU10sClsjIENyZWF0ZSBjb21tYW5kcyB0byBzdWJzdGl0dXRlIGZpbGUgb3V0cHV0IHZhcmlhYmxlcy4KewogIGVjaG8gImNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MSIgJiYKICBlY2hvICdjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmJyAmJgogIGVjaG8gIiRhY19zdWJzdF9maWxlcyIgfCBzZWQgJ3MvLiovRkA8OkAiJiJAOj5APSIkJiIvJyAmJgogIGVjaG8gIl9BQ0FXSyIgJiYKICBlY2hvICJfQUNFT0YiCn0gPmNvbmYkJGZpbGVzLnNoICYmCi4gLi9jb25mJCRmaWxlcy5zaCB8fAogIEFDX01TR19FUlJPUihbY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVNdKQpybSAtZiBjb25mJCRmaWxlcy5zaApdKWRubAoKewogIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCiAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgogIGVjaG8gIl9BQ0VPRiIKfSA+Y29uZiQkc3Vicy5zaCB8fAogIEFDX01TR19FUlJPUihbY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVNdKQphY19kZWxpbV9udW09YGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IGdyZXAgLWMgJ14nYAphY19kZWxpbT0nJSFfISMgJwpmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KICAuIC4vY29uZiQkc3Vicy5zaCB8fAogICAgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVU10pCgpkbmwgRG8gbm90IHVzZSBncmVwIG9uIGNvbmYkJHN1YnMuYXdrLCBzaW5jZSBBSVggZ3JlcCBoYXMgYSBsaW5lIGxlbmd0aCBsaW1pdC4KICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAogIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCiAgICBicmVhawogIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCiAgICBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTXSkKICBlbHNlCiAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgogIGZpCmRvbmUKcm0gLWYgY29uZiQkc3Vicy5zaAoKZG5sIEluaXRpYWxpemUgYW4gYXdrIGFycmF5IG9mIHN1YnN0aXR1dGlvbnMsIGtleWVkIGJ5IHZhcmlhYmxlIG5hbWUuCmRubApkbmwgVGhlIGluaXRpYWwgbGluZSBjb250YWlucyB0aGUgdmFyaWFibGUgbmFtZSBWQVIsIHRoZW4gYSBgIScuCmRubCBDb25zdHJ1Y3QgYFNbIlZBUiJdPScgZnJvbSBpdC4KZG5sIFRoZSByZXN0IG9mIHRoZSBsaW5lLCBhbmQgcG90ZW50aWFsbHkgZnVydGhlciBsaW5lcywgY29udGFpbiB0aGUKZG5sIHN1YnN0aXR1dGVkIHZhbHVlOyB0aGUgbGFzdCBvZiB0aG9zZSBlbmRzIHdpdGggJGFjX2RlbGltLiAgV2Ugc3BsaXQKZG5sIHRoZSBvdXRwdXQgYm90aCBhbG9uZyB0aG9zZSBzdWJzdGl0dXRlZCBuZXdsaW5lcyBhbmQgYXQgaW50ZXJ2YWxzIG9mCmRubCBsZW5ndGggX0FDX0FXS19MSVRFUkFMX0xJTUlULiAgVGhlIGxhdHRlciBpcyBkb25lIHRvIGNvbXBseSB3aXRoIGF3awpkbmwgc3RyaW5nIGxpdGVyYWwgbGltaXRhdGlvbnMsIHRoZSBmb3JtZXIgZm9yIHNpbXBsaWNpdHkgaW4gZG9pbmcgc28uCmRubApkbmwgV2UgZGVhbCB3aXRoIG9uZSBpbnB1dCBsaW5lIGF0IGEgdGltZSB0byBhdm9pZCBzZWQgcGF0dGVybiBzcGFjZQpkbmwgbGltaXRhdGlvbnMuICBXZSBraWxsIHRoZSBkZWxpbWl0ZXIgJGFjX2RlbGltIGJlZm9yZSBzcGxpdHRpbmcgdGhlCmRubCBzdHJpbmcgKG90aGVyd2lzZSB3ZSByaXNrIHNwbGl0dGluZyB0aGUgZGVsaW1pdGVyKS4gIEFuZCB3ZSBkbyB0aGUKZG5sIHNwbGl0dGluZyBiZWZvcmUgdGhlIHF1b3Rpbmcgb2YgYXdrIHNwZWNpYWwgY2hhcmFjdGVycyAob3RoZXJ3aXNlIHdlCmRubCByaXNrIHNwbGl0dGluZyBhbiBlc2NhcGUgc2VxdWVuY2UpLgpkbmwKZG5sIE91dHB1dCBhcyBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMsIGpvaW5lZCB3aXRoIGJhY2tzbGFzaC1uZXdsaW5lLgpkbmwgRWxpbWluYXRlIHRoZSBuZXdsaW5lIGFmdGVyIGA9JyBpbiBhIHNlY29uZCBzY3JpcHQsIGZvciByZWFkYWJpbGl0eS4KZG5sCmRubCBOb3RlcyB0byB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBhd2sgc2NyaXB0OgpkbmwgLSB0aGUgdW51c3VhbCBGUyB2YWx1ZSBoZWxwcyBwcmV2ZW50IHJ1bm5pbmcgaW50byB0aGUgbGltaXQgb2YgOTkgZmllbGRzLApkbmwgLSB3ZSBhdm9pZCBzdWIvZ3N1YiBiZWNhdXNlIG9mIHRoZSBcJiBxdW90aW5nIGlzc3Vlcywgc2VlCmRubCAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nYXdrL21hbnVhbC9odG1sX25vZGUvR29yeS1EZXRhaWxzLmh0bWwKZG5sIC0gV3JpdGluZyBgJCAwJyBwcmV2ZW50cyBleHBhbnNpb24gYnkgYm90aCB0aGUgc2hlbGwgYW5kIG00IGhlcmUuCmRubApkbmwgbTQtZG91YmxlLXF1b3RlIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBmb3IgcmVhZGFiaWxpdHkuCltjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgpfQUNFT0YKc2VkIC1uICcKaApzL14vU1siLzsgcy8hLiovIl09LwpwCmcKcy9eW14hXSohLy8KOnJlcGwKdCByZXBsCnMvJyIkYWNfZGVsaW0iJyQvLwp0IGRlbGltCjpubApoCnMvXCguXHtdX0FDX0FXS19MSVRFUkFMX0xJTUlUW1x9XCkuLiovXDEvCnQgbW9yZTEKcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwpwCm4KYiByZXBsCjptb3JlMQpzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCnAKZwpzLy5ce11fQUNfQVdLX0xJVEVSQUxfTElNSVRbXH0vLwp0IG5sCjpkZWxpbQpoCnMvXCguXHtdX0FDX0FXS19MSVRFUkFMX0xJTUlUW1x9XCkuLiovXDEvCnQgbW9yZTIKcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KcApiCjptb3JlMgpzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCnAKZwpzLy5ce11fQUNfQVdLX0xJVEVSQUxfTElNSVRbXH0vLwp0IGRlbGltCicgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKL15bXiIiXS97CiAgTgogIHMvXG4vLwp9CicgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKcm0gLWYgY29uZiQkc3Vicy5hd2sKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCl9BQ0FXSwpjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgogIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCiAgRlMgPSAiByIKXW00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbICBcJGFjX2NzX2F3a19waXBlX2luaXRdKVsKfQp7CiAgbGluZSA9ICQgMAogIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQogIHN1YnN0ZWQgPSAwCiAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQogIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKICAgIGtleSA9IGZpZWxkW2ldCiAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQogICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKICAgICAgdmFsdWUgPSBTW2tleV0KICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQogICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQogICAgICBzdWJzdGVkID0gMQogICAgfSBlbHNlCiAgICAgIGxlbiArPSAxICsga2V5bGVuCiAgfQpdbTRfaWZkZWYoW19BQ19TVUJTVF9GSUxFU10sCltbICBpZiAobmZpZWxkcyA9PSAzICYmICFzdWJzdGVkKSB7CiAgICBrZXkgPSBmaWVsZFsyXQogICAgaWYgKEZba2V5XSAhPSAiIiAmJiBsaW5lIH4gL15bCSBdKkAuKkBbCSBdKiQvKSB7CiAgICAgIFwkYWNfY3NfYXdrX3JlYWRfZmlsZQogICAgICBuZXh0CiAgICB9CiAgfV1dKVsKICBwcmludCBsaW5lCn0KXWRubCBlbmQgb2YgZG91YmxlLXF1b3RlZCBwYXJ0Cm00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbXCRhY19jc19hd2tfcGlwZV9maW5pXSkKX0FDQVdLCl9BQ0VPRgpkbmwgU2VlIGlmIENSIGlzIHRoZSBFT0wgbWFya2VyLiAgSWYgbm90LCByZW1vdmUgYW55IEVPTC1yZWxhdGVkCmRubCBeTSBieXRlcyBhbmQgZXNjYXBlIGFueSByZW1haW5pbmcgb25lcy4gIElmIHNvLCBqdXN0IHVzZSBtdi4KZG5sIEluIGNhc2UgeW91J3JlIHdvbmRlcmluZyBob3cgXk0gYnl0ZXMgY2FuIG1ha2UgaXQgaW50byBzdWJzMS5hd2ssCmRubCBbZnJvbSBSYWxmIFdpbGRlbmh1ZXNdIG9uZSB3YXkgaXMgaWYgeW91IGhhdmUgZS5nLiwKZG5sIEFDX1NVQlNUKFt2YXJpYWJsZV90aGF0X2NvbnRhaW5zX2NyXSwgWyIKZG5sICJdKQpkbmwgVGhlIG9yaWdpbmFsIGFpbSB3YXMgdGhhdCB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBzdWJzdGl0dXRlIGFueQpkbmwgY2hhcmFjdGVycyB0aGV5IGxpa2UgKGV4Y2VwdCBmb3IgXDApLiAgQW5kIHRoZSBhYm92ZSBpcyBub3Qgc28KZG5sIHVubGlrZWx5IGlmIHRoZSBjb25maWd1cmUgc2NyaXB0IGl0c2VsZiBoYXBwZW5zIHRvIGJlIGNvbnZlcnRlZApkbmwgdG8gdzMyIHRleHQgbW9kZS4KY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQppZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgplbHNlCiAgY2F0CmZpIDwgIiRhY190bXAvc3ViczEuYXdrIiA+ICIkYWNfdG1wL3N1YnMuYXdrIiBcCiAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeV0pCl9BQ0VPRgoKIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGVudHJpZXMgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAojIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQojIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCmlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCiAgYWNfdnBzdWI9WycvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97CmgKcy8vLwpzL14vOi8Kcy9bCSBdKiQvOi8Kcy86XCQoc3JjZGlyKTovOi9nCnMvOlwke3NyY2Rpcn06LzovZwpzLzpAc3JjZGlyQDovOi9nCnMvXjoqLy8Kcy86KiQvLwp4CnMvXCg9WwkgXSpcKS4qL1wxLwpHCnMvXG4vLwpzL15bXj1dKj1bCSBdKiQvLwp9J10KZmkKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgoKClQyNiwzMAptNF9sb2NhdGlvbihBU19NRV9QUkVQQVJFKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTEyMQpGNyw2Cm00X2V4aXRtNGV4aXQKVDI3LDMKX0FDX0xBTkdfQUJCUkVWKEZvcnRyYW4gNzcpZjc3ClQxMSw3NTUKQUNfUFJPR19TRURfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0sIGFjX2N2X3BhdGhfU0VELAogICAgW2RubCBhY19zY3JpcHQgc2hvdWxkIG5vdCBjb250YWluIG1vcmUgdGhhbiA5OSBjb21tYW5kcyAoZm9yIEhQLVVYIHNlZCksCiAgICAgZG5sIGJ1dCBtb3JlIHRoYW4gYWJvdXQgNzAwMCBieXRlcywgdG8gY2F0Y2ggYSBsaW1pdCBpbiBTb2xhcmlzIDggL3Vzci91Y2Ivc2VkLgogICAgIGFjX3NjcmlwdD1zL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYi8KICAgICBmb3IgYWNfaSBpbiAxIDIgMyA0IDUgNiA3OyBkbwogICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFjX3NjcmlwdCIKICAgICBkb25lCiAgICAgZWNobyAiJGFjX3NjcmlwdCIgMj4vZGV2L251bGwgfCBzZWQgOTlxID5jb25mdGVzdC5zZWQKICAgICBBU19VTlNFVChbYWNfc2NyaXB0XSkKICAgICBfQUNfUEFUSF9QUk9HU19GRUFUVVJFX0NIRUNLKFNFRCwgW3NlZCBnc2VkXSwKCVtfQUNfRkVBVFVSRV9DSEVDS19MRU5HVEgoW2FjX3BhdGhfU0VEXSwgW2FjX2N2X3BhdGhfU0VEXSwKCQlbIiRhY19wYXRoX1NFRCIgLWYgY29uZnRlc3Quc2VkXSldKV0pCiBTRUQ9IiRhY19jdl9wYXRoX1NFRCIKIEFDX1NVQlNUKFtTRURdKWRubAogcm0gLWYgY29uZnRlc3Quc2VkCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMzQ0CkFDX1BST0dfRjc3X200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfUFVTSChGb3J0cmFuIDc3KWRubApBQ19BUkdfVkFSKFtGNzddLCAgICBbRm9ydHJhbiA3NyBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbRkZMQUdTXSwgW0ZvcnRyYW4gNzcgY29tcGlsZXIgZmxhZ3NdKWRubApfQUNfQVJHX1ZBUl9MREZMQUdTKClkbmwKX0FDX0FSR19WQVJfTElCUygpZG5sCl9BQ19QUk9HX0ZDKFtGb3J0cmFuIDc3XSwgWyQxXSkKaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCiAgRzc3PXllcwplbHNlCiAgRzc3PQpmaQpBQ19MQU5HX1BPUChGb3J0cmFuIDc3KWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDkxCkFDX1BSRVBST0NfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfUFJFUFJPQ19SRVFVSVJFKClkbmwKX0FDX1BSRVBST0NfSUZFTFNFKCRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMTUwCkFDX0ZDX0RVTU1ZX01BSU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfRkNfTElCUkFSWV9MREZMQUdTXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4pZG5sCl9BQ19GQ19EVU1NWV9NQUlOKCRAKQpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDI3CkFOX0lERU5USUZJRVJBTl9PVVRQVVQoW2lkZW50aWZpZXJdLCAkQCkKVDEyLDgzCm00X3NldF91bmlvbm00X3NldF9saXN0YyhbJDFdKW00X2lmKFskMV0sIFskMl0sIFtdLAogIFttNF9zZXRfbWFwX3NlcChbJDJdLCBbXyQwKFskMV0sXSwgWyldKV0pClQyMCw3MwpBU19CT1VSTkVfQ09NUEFUSUJMRSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQpEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCl8kMAoKVDMwLDMxCm00X2xvY2F0aW9uKEFDX1RZUEVfVUlOVE1BWF9UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDozMjcKVDE2LDIKX200X2RpdmVydChLSUxMKS0xClQxOCwyMTEKQUNfR0NDX1RSQURJVElPTkFMX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0dDQ19UUkFESVRJT05BTCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QUk9HX0dDQ19UUkFESVRJT05BTF0sIFtBQ19QUk9HX0dDQ19UUkFESVRJT05BTCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTAwCm00X2ZvcmVhY2htNF9pZihbJDJdLCBbXSwgW10sCiAgICAgICBbbTRfcHVzaGRlZihbJDFdKV8kMChbbTRfZGVmaW5lKFskMV0sXSwgWykkM10sIFtdLAogICQyKW00X3BvcGRlZihbJDFdKV0pClQyMCwzNAptNF9sb2NhdGlvbihBQ19XSVRIKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0OTIKVDIwLDMzCm00X2xvY2F0aW9uKEFDX1dBUk4pLi4vLi4vbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjMzClQyOCwzNAptNF9sb2NhdGlvbihBQ19GQ19QUF9ERUZJTkUpLi4vLi4vbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTMwMgpUOSwyNjUKX0FTX1FVT1RFbTRfY29uZChbbTRfaW5kZXgoWyQxXSwgW1xdKV0sIFstMV0sIFtfQVNfUVVPVEVfTU9ERVJOXSwKCSBbbTRfZXZhbChtNF9pbmRleChtNF90cmFuc2xpdChbWyQxXV0sIFskXSwgW1xdKSwgW1xcXSkgPj0gMCldLApbMV0sIFtfQVNfUVVPVEVfTU9ERVJOXSwKCSBbbTRfZXZhbChtNF9pbmRleChtNF90cmFuc2xpdChbWyQxXV0sIFsiXSwgW2BdKSwgW1xgXSkgPj0gMCldLGRubCIKWzFdLCBbX0FTX1FVT1RFX09MRF0sCgkgW19BU19RVU9URV9NT0RFUk5dKShbJDFdKQpUMTQsNzUwCkFDX1BST0dfT0JKQ1BQX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfT0JKQ10pZG5sCkFDX0FSR19WQVIoW09CSkNQUF0sICAgW09iamVjdGl2ZSBDIHByZXByb2Nlc3Nvcl0pZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKQUNfTEFOR19QVVNIKE9iamVjdGl2ZSBDKWRubApBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBydW4gdGhlIE9iamVjdGl2ZSBDIHByZXByb2Nlc3Nvcl0pCmlmIHRlc3QgLXogIiRPQkpDUFAiOyB0aGVuCiAgQUNfQ0FDSEVfVkFMKGFjX2N2X3Byb2dfT0JKQ1BQLAogIFtkbmwKICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIE9CSkNQUCBuZWVkcyB0byBiZSBleHBhbmRlZAogICAgZm9yIE9CSkNQUCBpbiAiJE9CSkMgLUUiICIvbGliL2NwcCIKICAgIGRvCiAgICAgIF9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFKFticmVha10pCiAgICBkb25lCiAgICBhY19jdl9wcm9nX09CSkNQUD0kT0JKQ1BQCiAgXSlkbmwKICBPQkpDUFA9JGFjX2N2X3Byb2dfT0JKQ1BQCmVsc2UKICBhY19jdl9wcm9nX09CSkNQUD0kT0JKQ1BQCmZpCkFDX01TR19SRVNVTFQoWyRPQkpDUFBdKQpfQUNfUFJPR19QUkVQUk9DX1dPUktTX0lGRUxTRShbXSwKCSAgW0FDX01TR19GQUlMVVJFKFtPYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgIiRPQkpDUFAiIGZhaWxzIHNhbml0eSBjaGVja10pXSkKQUNfU1VCU1QoT0JKQ1BQKWRubApBQ19MQU5HX1BPUChPYmplY3RpdmUgQylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxNTMKQUNfTEFOR19SRVNUT1JFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfUkVTVE9SRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTEFOR19QT1AoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSw2MDkKQUNfTEFOR19JTlRfU0FWRShPYmplY3RpdmUgQysrKUFDX0xBTkdfUFJPR1JBTShbJDEKc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0Kc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CkAlOkBpbmNsdWRlIDxzdGRpby5oPgpAJTpAaW5jbHVkZSA8c3RkbGliLmg+XSwKWwogIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgaWYgKCEgZikKICAgIHJldHVybiAxOwogIGlmICgoJDIpIDwgMCkKICAgIHsKICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CiAgICAgIGlmIChpICE9ICgkMikpCglyZXR1cm4gMTsKICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwogICAgICBpZiAoaSAhPSAoJDIpKQoJcmV0dXJuIDE7CiAgICAgIGZwcmludGYgKGYsICIlbHUiLCBpKTsKICAgIH0KICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KICAgICBvbiBzb21lIHBsYXRmb3Jtcy4gICovCiAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpGOCw4CnRyYWNlb2ZmdHJhY2VvZmYKRjExLDgKbTRfdHJhY2VvZmZ0cmFjZW9mZgpUOCwzMwptNF9hcHBseW00X2lmKFskMl0sIFtdLCBbJDFdLCBbJDEoJDIpXSlbXQpUMjMsMzMxCl9BQ19QUkVQUk9DX0lGRUxTRV9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgQVNfSUYoW19BQ19ET19TVERFUlIoWyRhY19jcHAgY29uZnRlc3QuJGFjX2V4dF0pID4gY29uZnRlc3QuaSAmJiB7CgkgdGVzdCAteiAiJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fcHJlcHJvY193YXJuX2ZsYWckYWNfW11fQUNfTEFOR19BQkJSRVZbXV93ZXJyb3JfZmxhZyIgfHwKCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCiAgICAgICB9XSwKICAgIFthY19yZXR2YWw9MF0sCiAgICBbX0FDX01TR19MT0dfQ09ORlRFU1QKICAgIGFjX3JldHZhbD0xXSkKICBBU19MSU5FTk9fUE9QCiAgQVNfU0VUX1NUQVRVUyhbJGFjX3JldHZhbF0pCgpUMTgsMTc2CkFDX1JFUExBQ0VfRk5NQVRDSF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRlVOQ19GTk1BVENIX0lGKFtQT1NJWF0sIFthY19jdl9mdW5jX2ZubWF0Y2hfd29ya3NdLAoJCSAgICAgW3JtIC1mICIkYWNfY29uZmlnX2xpYm9ial9kaXIvZm5tYXRjaC5oIl0sCgkJICAgICBbX0FDX0xJQk9CSl9GTk1BVENIXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxOTMKQUNfTUlOVVNfQ19NSU5VU19PX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX01JTlVTX0NfTUlOVVNfTycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QUk9HX0NDX0NfT10sIFtBQ19QUk9HX0NDX0NfTygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMjk3CkFDX0xBTkdfQ0FMTChDKyspQUNfTEFOR19QUk9HUkFNKFskMQptNF9pZihbJDJdLCBbbWFpbl0sICwKWy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgogICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKI2VuZGlmCmNoYXIgJDIgKCk7XSldLCBbcmV0dXJuICQyICgpO10pClQzOSwxMjUKQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKE9iamVjdGl2ZSBDKyspQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDA7CnJldHVybiB0ZXN0X2FycmF5IEA8OkAwQDo+QDsKXSkKVDMwLDAKbTRfaW5jbHVkZShtNHN1Z2FyL3ZlcnNpb24ubTQpClQyOCwzMQptNF9sb2NhdGlvbihBQ19UWVBFX0lOVDMyX1QpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjYyNgpUMzAsMzIKbTRfbG9jYXRpb24oQUNfU1RSVUNUX1NUX1JERVYpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjEwMTEKVDM3LDMyCm00X2xvY2F0aW9uKEFDX0xBTkdfQ09NUElMRVIoRXJsYW5nKSkuLi8uLi9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjE2NwpUMzIsMjcKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihDKSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo0MjkKVDExLDQzCkFDX09CU09MRVRFQUNfRElBR05PU0UoW29ic29sZXRlXSwgWyQxIGlzIG9ic29sZXRlJDJdKQpUMTQsMTgxCkFDX0NST1NTX0NIRUNLX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NST1NTX0NIRUNLJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NfQ1JPU1NdLCBbQUNfQ19DUk9TUygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMzc1CkFDX1RZUEVfVUlEX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soZm9yIHVpZF90IGluIHN5cy90eXBlcy5oLCBhY19jdl90eXBlX3VpZF90LApbQUNfRUdSRVBfSEVBREVSKHVpZF90LCBzeXMvdHlwZXMuaCwKICBhY19jdl90eXBlX3VpZF90PXllcywgYWNfY3ZfdHlwZV91aWRfdD1ubyldKQppZiB0ZXN0ICRhY19jdl90eXBlX3VpZF90ID0gbm87IHRoZW4KICBBQ19ERUZJTkUodWlkX3QsIGludCwgW0RlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLl0pCiAgQUNfREVGSU5FKGdpZF90LCBpbnQsIFtEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMzLDMzCm00X2xvY2F0aW9uKF9BQ19QUk9HX0ZDX1ZfT1VUUFVUKS4uLy4uL2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjQ5NwpUMjMsMzMKbTRfbG9jYXRpb24oQUNfUFJPR19GQykuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDozNzgKVDMzLDI3Cm00X2xvY2F0aW9uKEFDX0xBTkdfUFJFUFJPQyhDKyspKS4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjYyNwpUNDQsMjcKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihPYmplY3RpdmUgQysrKSkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo5OTIKVDI4LDM0Cm00X2xvY2F0aW9uKF9BQ19FVkFMX1NUREVSUikuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDMyClQyNiwzMAptNF9sb2NhdGlvbihBU19WQVJfQVBQRU5EKS4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6MTkzOQpUMjYsMzIKbTRfbG9jYXRpb24oQUNfTElOS19GSUxFUykuLi8uLi9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjkzOApUMTQsNzMKX200X21hcGFsbF9zZXBtNF9hcHBseShbJDFdLCBbJDNdKV9tNF9mb3JlYWNoKFttNF9hcHBseShbJDJbXSQxXSxdLCBbKV0sIG00X3NoaWZ0MigkQCkpClQ5LDEzMgptNF9kaXZlcnRtNF9wb3BkZWYoW19tNF9kaXZlcnRfc3RhY2tdKW00X2RlZmluZShbX200X2RpdmVydF9kaXZlcnNpb25dLCBbJDFdKW00X2RpdmVydF9zdGFja19wdXNoKFskMF0sIFskMV0pX200X2RpdmVydF9yYXcoX200X2RpdmVydChbJDFdKSkKVDEwLDQzCl9BQ19GNzdfRkNnNzcgeGxmIGY3NyBmcnQgcGdmNzcgY2Y3NyBmb3J0NzcgZmwzMiBhZjc3ClQxMCwxMzMKQUNfQ19DUk9TU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DX0NST1NTJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDc1CkFDX0NPTkZJR19BVVhfRElSX200X2RlZnVuX3BybyhbJDBdKUFDX0NPTkZJR19BVVhfRElSUygkMSAiJHNyY2RpciIvJDEpW11fbTRfZGVmdW5fZXBpKFskMF0pCkYxMCw3Cm00X3RyYWNlb250cmFjZW9uClQyNywyNwptNF9sb2NhdGlvbihhY19jdl9wcm9nX2d4eCkuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDo2NzQKVDExLDEwNjEKX0FDX1NSQ0RJUlNhY19idWlsZGRpcj0uCgpjYXNlICQxIGluCi4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwoqKQogIGFjX2Rpcl9zdWZmaXg9L2BBU19FQ0hPKFskMV0pIHwgc2VkICdzfF5cLltbXFwvXV18fCdgCiAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgogIGFjX3RvcF9idWlsZGRpcl9zdWI9YEFTX0VDSE8oWyIkYWNfZGlyX3N1ZmZpeCJdKSB8IHNlZCAnc3wvW1teXFwvXV0qfC8uLnxnO3N8L3x8J2AKICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCiAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwogICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwogIGVzYWMgOzsKZXNhYwphY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAojIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgphY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKCmNhc2UgJHNyY2RpciBpbgogIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KICAgIGFjX3NyY2Rpcj0uCiAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCiAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CiAgW1tcXC9dXSogfCA/OltbXFwvXV0qICkgICMgQWJzb2x1dGUgbmFtZS4KICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CiAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKICAqKSAjIFJlbGF0aXZlIG5hbWUuCiAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCiAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKZXNhYwphY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CgpUMjYsMzQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfVE9PTCkuLi8uLi9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MjIwClQxMyw1MgptNF9jcl9MZXR0ZXJzYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWgpUMTgsNDU3Cl9BQ19MSUJPQkpfRk5NQVRDSF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubApBQ19SRVFVSVJFKFtBQ19UWVBFX01CU1RBVEVfVF0pZG5sCkFDX0NIRUNLX0RFQ0xTKFtnZXRlbnZdKQpBQ19DSEVDS19GVU5DUyhbYnRvd2MgbWJzcnRvd2NzIG1lbXBjcHkgd21lbXBjcHldKQpBQ19DSEVDS19IRUFERVJTKFt3Y2hhci5oIHdjdHlwZS5oXSkKQUNfTElCT0JKKFtmbm1hdGNoXSkKQUNfQ09ORklHX0xJTktTKFskYWNfY29uZmlnX2xpYm9ial9kaXIvZm5tYXRjaC5oOiRhY19jb25maWdfbGlib2JqX2Rpci9mbm1hdGNoXy5oXSkKQUNfREVGSU5FKGZubWF0Y2gsIHJwbF9mbm1hdGNoLAoJICBbRGVmaW5lIHRvIHJwbF9mbm1hdGNoIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC5dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDcsMTQ2CkFTX0NBU0VfbTRfZGVmdW5fcHJvKFskMF0pY2FzZSAkMSBpbltdbTRfbWFwX2FyZ3NfcGFpcihbXyQwXSwgW18kMF9ERUZBVUxUXSwKICAgbTRfc2hpZnQoJEBtNF9pZihtNF9ldmFsKFskIyAmIDFdKSwgWzFdLCBbLF0pKSkKZXNhY1tdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMTU3CkFDX0Y3N19EVU1NWV9NQUlOX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0Y3N19MSUJSQVJZX0xERkxBR1NdKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbiA3NylkbmwKX0FDX0ZDX0RVTU1ZX01BSU4oJEApCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMzEKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfTUVNQkVSKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo4ODgKVDI0LDExNwpfQUNfTEFOR19PUEVOTVAoRm9ydHJhbikKICAgICAgcHJvZ3JhbSBtYWluCiAgICAgIGltcGxpY2l0IG5vbmUKISQgICAgaW50ZWdlciB0aWQKICAgICAgdGlkID0gNDIKICAgICAgY2FsbCBvbXBfc2V0X251bV90aHJlYWRzKDIpCiAgICAgIGVuZAoKVDMyLDMwCm00X2xvY2F0aW9uKF9BQ19MQU5HX0lPX1BST0dSQU0pLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MjY1ClQ5LDc1Cm00X2JlZm9yZW00X3Byb3ZpZGVfaWYoWyQyXSwKCSAgICAgICBbbTRfd2Fybihbc3ludGF4XSwgWyQyIHdhcyBjYWxsZWQgYmVmb3JlICQxXSldKQpUMjMsMApBQ19PVVRQVVRfQ09NTUFORFNfUE9TVApUOSwxNzQKQUNfRklORF9YX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0ZJTkRfWCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QQVRIX1hdLCBbQUNfUEFUSF9YKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDIxNgpBQ19DWUdXSU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ1lHV0lOJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DQU5PTklDQUxfSE9TVApjYXNlICRob3N0X29zIGluCiAgKmN5Z3dpbiogKSBDWUdXSU49eWVzOzsKCSAqICkgQ1lHV0lOPW5vOzsKZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDE0MwptNF9tYXBfc2VwbTRfcHVzaGRlZihbbTRfU2VwXSwgW200X2RlZmluZShbbTRfU2VwXSwgX200X2RlZm4oW200X3VucXVvdGVdKSldKV9tNF9mb3JlYWNoKFtfbTRfYXBwbHkoW200X1NlcChbJDJdKVtdJDFdLF0sIFspXSwgW10sICQzKW00X3BvcGRlZihbbTRfU2VwXSkKVDEyLDU1Cm00X2NvcHlfdW5tNG00X2NvcHkoWyQxXSwgbTRfYnBhdHN1YnN0KFskMV0sIFtebTRfXCguKlwpXSwgW1tcMV1dKSkKVDE0LDg3MwpBQ19QUk9HX09CSkNYWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goT2JqZWN0aXZlIEMrKylkbmwKQUNfQVJHX1ZBUihbT0JKQ1hYXSwgICAgICBbT2JqZWN0aXZlIEMrKyBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbT0JKQ1hYRkxBR1NdLCBbT2JqZWN0aXZlIEMrKyBjb21waWxlciBmbGFnc10pZG5sCl9BQ19BUkdfVkFSX0xERkxBR1MoKWRubApfQUNfQVJHX1ZBUl9MSUJTKClkbmwKX0FDX0FSR19WQVJfQ1BQRkxBR1MoKWRubApfQUNfQVJHX1ZBUl9QUkVDSU9VUyhbT0JKQ1hYXSlkbmwKQUNfQ0hFQ0tfVE9PTFMoT0JKQ1hYLAoJICAgICAgIFttNF9kZWZhdWx0KFskMV0sIFtnKysgb2JqYysrIG9iamN4eCBjKysgQ1hYXSldLAoJICAgICAgIGcrKykKIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgpfQVNfRUNIT19MT0coW2NoZWNraW5nIGZvciBfQUNfTEFORyBjb21waWxlciB2ZXJzaW9uXSkKc2V0IFggJGFjX2NvbXBpbGUKYWNfY29tcGlsZXI9JFsyXQpmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCiAgX0FDX0RPX0xJTUlUKFskYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JkFTX01FU1NBR0VfTE9HX0ZEXSkKZG9uZQoKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9FWEVFWFRdKVtdZG5sCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfT0JKRVhUXSlbXWRubApfQUNfTEFOR19DT01QSUxFUl9HTlUKaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCiAgR09CSkNYWD15ZXMKZWxzZQogIEdPQkpDWFg9CmZpCl9BQ19QUk9HX09CSkNYWF9HCkFDX0xBTkdfUE9QKE9iamVjdGl2ZSBDKyspZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsNDg2MwpBQ19DX0JJR0VORElBTl9tNF9kZWZ1bl9wcm8oWyQwXSlBSF9WRVJCQVRJTShbV09SRFNfQklHRU5ESUFOXSwKWy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAogICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECiMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXwojICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKIyBlbmRpZgojZWxzZQojIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOCiMgZW5kaWYKI2VuZGlmXSlkbmwKIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuXSwgW2FjX2N2X2NfYmlnZW5kaWFuXSwKICAgW2FjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KICAgICMgU2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHVuaXZlcnNhbCBjb21waWxlci4KICAgIEFDX0NPTVBJTEVfSUZFTFNFKAoJIFtBQ19MQU5HX1NPVVJDRSgKCSAgICBbWyNpZm5kZWYgX19BUFBMRV9DQ19fCgkgICAgICAgbm90IGEgdW5pdmVyc2FsIGNhcGFibGUgY29tcGlsZXIKCSAgICAgI2VuZGlmCgkgICAgIHR5cGVkZWYgaW50IGR1bW15OwoJICAgIF1dKV0sCgkgWwoJIyBDaGVjayBmb3IgcG90ZW50aWFsIC1hcmNoIGZsYWdzLiAgSXQgaXMgbm90IHVuaXZlcnNhbCB1bmxlc3MKCSMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byAtYXJjaCBmbGFncyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuCglhY19hcmNoPQoJYWNfcHJldj0KCWZvciBhY193b3JkIGluICRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUzsgZG8KCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KCSAgIGNhc2UgJGFjX3dvcmQgaW4KCSAgICAgaT84NiB8IHg4Nl82NCB8IHBwYyB8IHBwYzY0KQoJICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCgkJIGFjX2FyY2g9JGFjX3dvcmQKCSAgICAgICBlbHNlCgkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAoJCSBicmVhawoJICAgICAgIGZpCgkgICAgICAgOzsKCSAgIGVzYWMKCSAgIGFjX3ByZXY9CgkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KCSAgIGFjX3ByZXY9YXJjaAoJIGZpCiAgICAgICBkb25lXSkKICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgogICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgogICAgICBBQ19DT01QSUxFX0lGRUxTRSgKCVtBQ19MQU5HX1BST0dSQU0oCgkgICBbWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoJICAgXV0sCgkgICBbWyNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAoJCSAgICAgJiYgTElUVExFX0VORElBTikKCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKCSAgICAgI2VuZGlmCgkgICBdXSldLAoJWyMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCgkgQUNfQ09NUElMRV9JRkVMU0UoCgkgICBbQUNfTEFOR19QUk9HUkFNKAoJICAgICAgW1sjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgkJI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoJICAgICAgXV0sCgkgICAgICBbWyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KCQkgbm90IGJpZyBlbmRpYW4KCQkjZW5kaWYKCSAgICAgIF1dKV0sCgkgICBbYWNfY3ZfY19iaWdlbmRpYW49eWVzXSwKCSAgIFthY19jdl9jX2JpZ2VuZGlhbj1ub10pXSkKICAgIGZpCiAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KICAgICAgQUNfQ09NUElMRV9JRkVMU0UoCglbQUNfTEFOR19QUk9HUkFNKAoJICAgW1sjaW5jbHVkZSA8bGltaXRzLmg+CgkgICBdXSwKCSAgIFtbI2lmICEgKGRlZmluZWQgX0xJVFRMRV9FTkRJQU4gfHwgZGVmaW5lZCBfQklHX0VORElBTikKCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKCSAgICAgI2VuZGlmCgkgICBdXSldLAoJWyMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0JJR19FTkRJQU4gb3Igbm90LgoJIEFDX0NPTVBJTEVfSUZFTFNFKAoJICAgW0FDX0xBTkdfUFJPR1JBTSgKCSAgICAgIFtbI2luY2x1ZGUgPGxpbWl0cy5oPgoJICAgICAgXV0sCgkgICAgICBbWyNpZm5kZWYgX0JJR19FTkRJQU4KCQkgbm90IGJpZyBlbmRpYW4KCQkjZW5kaWYKCSAgICAgIF1dKV0sCgkgICBbYWNfY3ZfY19iaWdlbmRpYW49eWVzXSwKCSAgIFthY19jdl9jX2JpZ2VuZGlhbj1ub10pXSkKICAgIGZpCiAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KICAgICAgIyBDb21waWxlIGEgdGVzdCBwcm9ncmFtLgogICAgICBBQ19SVU5fSUZFTFNFKAoJW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCgkgICBbWwoJICAgICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCgkgICAgIHVuaW9uCgkgICAgIHsKCSAgICAgICBsb25nIGludCBsOwoJICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07CgkgICAgIH0gdTsKCSAgICAgdS5sID0gMTsKCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7CgkgICBdXSldLAoJW2FjX2N2X2NfYmlnZW5kaWFuPW5vXSwKCVthY19jdl9jX2JpZ2VuZGlhbj15ZXNdLAoJWyMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgoJIEFDX0NPTVBJTEVfSUZFTFNFKAoJICAgW0FDX0xBTkdfUFJPR1JBTSgKCSAgICAgIFtbc2hvcnQgaW50IGFzY2lpX21tW10gPQoJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CgkJc2hvcnQgaW50IGFzY2lpX2lpW10gPQoJCSAgeyAweDY5NEMsIDB4NTQ1NCwgMHg2NTZDLCAweDZFNDUsIDB4Njk0NCwgMHg2RTYxLCAwIH07CgkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKCQkgIHJldHVybiBhc2NpaV9tbVtpXSArIGFzY2lpX2lpW2ldOwoJCX0KCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQoJCSAgeyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CgkJc2hvcnQgaW50IGViY2RpY19tbVtdID0KCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OwoJCWludCB1c2VfZWJjZGljIChpbnQgaSkgewoJCSAgcmV0dXJuIGViY2RpY19tbVtpXSArIGViY2RpY19paVtpXTsKCQl9CgkJZXh0ZXJuIGludCBmb287CgkgICAgICBdXSwKCSAgICAgIFtbcmV0dXJuIHVzZV9hc2NpaSAoZm9vKSA9PSB1c2VfZWJjZGljIChmb28pO11dKV0sCgkgICBbaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsOyB0aGVuCgkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKCSAgICBmaQoJICAgIGlmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCgkJYWNfY3ZfY19iaWdlbmRpYW49bm8KCSAgICAgIGVsc2UKCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KCQlhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCgkgICAgICBmaQoJICAgIGZpXSldKQogICAgZmldKQogY2FzZSAkYWNfY3ZfY19iaWdlbmRpYW4gaW4gIygKICAgeWVzKQogICAgIG00X2RlZmF1bHQoWyQxXSwKICAgICAgIFtBQ19ERUZJTkUoW1dPUkRTX0JJR0VORElBTl0sIDEpXSk7OyAjKAogICBubykKICAgICAkMiA7OyAjKAogICB1bml2ZXJzYWwpCmRubCBOb3RlIHRoYXQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEIHNvcnRzIGxlc3MgdGhhbiBXT1JEU19CSUdFTkRJQU47CmRubCB0aGlzIGlzIGEgbmVjZXNzaXR5IGZvciBwcm9wZXIgY29uZmlnIGhlYWRlciBvcGVyYXRpb24uICBXYXJuIGlmCmRubCB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkgYSBjb25maWcgaGVhZGVyIGJ1dCBpcyByZWx5aW5nIG9uIHRoZQpkbmwgZGVmYXVsdCBiZWhhdmlvciBmb3IgdW5pdmVyc2FsIGJ1aWxkcy4KICAgICBtNF9kZWZhdWx0KFskNF0sCiAgICAgICBbQUNfQ09ORklHX0NPTU1BTkRTX1BSRShbbTRfaWZzZXQoW0FIX0hFQURFUl0sIFtdLAoJIFtBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAoJICAgW0FDX0NfQklHRU5ESUFOIHNob3VsZCBiZSB1c2VkIHdpdGggQUNfQ09ORklHX0hFQURFUlNdKV0pXSlkbmwKCUFDX0RFRklORShbQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEXSwxLAoJICBbRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKV0pXSkKICAgICA7OyAjKAogICAqKQogICAgIG00X2RlZmF1bHQoWyQzXSwKICAgICAgIFtBQ19NU0dfRVJST1IoW3Vua25vd24gZW5kaWFubmVzcwogcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHBdKV0pIDs7CiBlc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMAptNF9pbmNsdWRlKGF1dG9jb25mL3N0YXR1cy5tNCkKVDEwLDg2Cm00X3RvbG93ZXJtNF90cmFuc2xpdChbWyQxXV0sIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl0sCgkJICAgICBbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpdKQpUMTQsMTg5CkFNX0ZVTkNfTUtUSU1FX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFNX0ZVTkNfTUtUSU1FJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfTUtUSU1FXSwgW0FDX0ZVTkNfTUtUSU1FKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiwyMDkKQUNfUFJPR19MTl9TX200X2RlZnVuX3BybyhbJDBdKUFDX01TR19DSEVDS0lORyhbd2hldGhlciBsbiAtcyB3b3Jrc10pCkFDX1NVQlNUKFtMTl9TXSwgWyRhc19sbl9zXSlkbmwKaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgogIEFDX01TR19SRVNVTFQoW3llc10pCmVsc2UKICBBQ19NU0dfUkVTVUxUKFtubywgdXNpbmcgJExOX1NdKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDY5OApBQ19MQU5HX0RFRklORW00X2RlZmluZShbQUNfTEFORygkMSldLCBbJDZdKQptNF9kZWZpbmUoW19BQ19MQU5HX0FCQlJFVigkMSldLCBbJDJdKQptNF9kZWZpbmUoW19BQ19MQU5HX1BSRUZJWCgkMSldLCBbJDNdKQptNF9kZWZpbmUoW19BQ19DQygkMSldLCBbJDRdKQptNF9jb3B5KFtBQ19MQU5HX0NPTkZURVNUKCQ1KV0sIFtBQ19MQU5HX0NPTkZURVNUKCQxKV0pCm00X2NvcHkoW0FDX0xBTkdfU09VUkNFKCQ1KV0sIFtBQ19MQU5HX1NPVVJDRSgkMSldKQptNF9jb3B5KFtfQUNfTEFOR19OVUxMX1BST0dSQU0oJDUpXSwgW19BQ19MQU5HX05VTExfUFJPR1JBTSgkMSldKQptNF9pZnZhbChbJDVdLApbbTRfY29weShbQUNfTEFOR19QUk9HUkFNKCQ1KV0sIFtBQ19MQU5HX1BST0dSQU0oJDEpXSldClttNF9jb3B5KFtBQ19MQU5HX0NBTEwoJDUpXSwgW0FDX0xBTkdfQ0FMTCgkMSldKV0KW200X2NvcHkoW0FDX0xBTkdfRlVOQ19MSU5LX1RSWSgkNSldLCBbQUNfTEFOR19GVU5DX0xJTktfVFJZKCQxKV0pXQpbbTRfY29weShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKCQ1KV0sIFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoJDEpXSldClttNF9jb3B5KFtBQ19MQU5HX0lOVF9TQVZFKCQ1KV0sIFtBQ19MQU5HX0lOVF9TQVZFKCQxKV0pXQpbbTRfY29weShbX0FDX0xBTkdfSU9fUFJPR1JBTSgkNSldLCBbX0FDX0xBTkdfSU9fUFJPR1JBTSgkMSldKV0pClQxOCwxCl9BQ19MQU5HX1BSRUZJWChDKUMKVDE2LDE5NQpBQ19GVU5DX1NUUkZUSU1FX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX0ZVTkNTKHN0cmZ0aW1lLCBbXSwKWyMgc3RyZnRpbWUgaXMgaW4gLWxpbnRsIG9uIFNDTyBVTklYLgpBQ19DSEVDS19MSUIoaW50bCwgc3RyZnRpbWUsCgkgICAgIFtBQ19ERUZJTkUoSEFWRV9TVFJGVElNRSkKTElCUz0iLWxpbnRsICRMSUJTIl0pXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwzNAptNF9sb2NhdGlvbihfQUNfQ09NUElMRV9JRkVMU0UpLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjU5MApUNDMsMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9VTlNJR05FRF9MT05HX0xPTkdfSU5UKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDo1NDcKVDI4LDM1Cm00X2xvY2F0aW9uKEFDX0ZVTkNfR0VUUEdSUCkuLi8uLi9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjgyOApUNyw5MwpfQVNfQk9YbTRfaWYobTRfaW5kZXgobTRfdHJhbnNsaXQoW1skMV1dLCBbYFwiXSwgWyQkJF0pLCBbJF0pLAogIFstMV0sIFskMF9MSVRFUkFMXSwgWyQwX0lORElSXSkoJEApClQzNSwzMwptNF9sb2NhdGlvbihBQ19DT05GSUdfQ09NTUFORFNfUFJFKS4uLy4uL2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTA1MwpUOCwxODkKX200X3dyYXBtNF9pZmRlZihbJDBfdGV4dF0sCgkgIFttNF9kZWZpbmUoWyQwX3RleHRdLCBbJDFdX200X2RlZm4oWyQwX3RleHRdKVskMl0pXSwKCSAgW200X2J1aWx0aW4oW200d3JhcF0sIFttNF91bnF1b3RlKAogIF9tNF9kZWZuKFskMF90ZXh0XSlfbTRfcG9wZGVmKFskMF90ZXh0XSkpXSltNF9kZWZpbmUoWyQwX3RleHRdLCBbJDEkMl0pXSkKVDI0LDIwNDUKQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TX200X2RlZnVuX29uY2UoW0FDX1VTRV9TWVNURU1fRVhURU5TSU9OU10sIFtBQ19CRUZPUkUoWyQwXSwgW0FDX0NPTVBJTEVfSUZFTFNFXSlkbmwKQUNfQkVGT1JFKFskMF0sIFtBQ19SVU5fSUZFTFNFXSlkbmwKCiAgQUNfQ0hFQ0tfSEVBREVSKFttaW5peC9jb25maWcuaF0sIFtNSU5JWD15ZXNdLCBbTUlOSVg9XSkKICBpZiB0ZXN0ICIkTUlOSVgiID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW19QT1NJWF9TT1VSQ0VdLCBbMV0sCiAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlcgogICAgICAgdGhpbmdzIHRvIHdvcmsuXSkKICAgIEFDX0RFRklORShbX1BPU0lYXzFfU09VUkNFXSwgWzJdLAogICAgICBbRGVmaW5lIHRvIDIgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIFBPU0lYLjEgZmVhdHVyZXMKICAgICAgIGV4Y2VwdCB3aXRoIHRoaXMgZGVmaW5lZC5dKQogICAgQUNfREVGSU5FKFtfTUlOSVhdLCBbMV0sCiAgICAgIFtEZWZpbmUgdG8gMSBpZiBvbiBNSU5JWC5dKQogIGZpCgpkbmwgVXNlIGEgZGlmZmVyZW50IGtleSB0aGFuIF9fRVhURU5TSU9OU19fLCBhcyB0aGF0IG5hbWUgYnJva2UgZXhpc3RpbmcKZG5sIGNvbmZpZ3VyZS5hYyB3aGVuIHVzaW5nIGF1dG9oZWFkZXIgMi42Mi4KICBBSF9WRVJCQVRJTShbVVNFX1NZU1RFTV9FWFRFTlNJT05TXSwKWy8qIEVuYWJsZSBleHRlbnNpb25zIG9uIEFJWCAzLCBJbnRlcml4LiAgKi8KI2lmbmRlZiBfQUxMX1NPVVJDRQojIHVuZGVmIF9BTExfU09VUkNFCiNlbmRpZgovKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCiNpZm5kZWYgX0dOVV9TT1VSQ0UKIyB1bmRlZiBfR05VX1NPVVJDRQojZW5kaWYKLyogRW5hYmxlIHRocmVhZGluZyBleHRlbnNpb25zIG9uIFNvbGFyaXMuICAqLwojaWZuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUwojIHVuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUwojZW5kaWYKLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gSFAgTm9uU3RvcC4gICovCiNpZm5kZWYgX1RBTkRFTV9TT1VSQ0UKIyB1bmRlZiBfVEFOREVNX1NPVVJDRQojZW5kaWYKLyogRW5hYmxlIGdlbmVyYWwgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KI2lmbmRlZiBfX0VYVEVOU0lPTlNfXwojIHVuZGVmIF9fRVhURU5TSU9OU19fCiNlbmRpZgpdKQogIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fXSwKICAgIFthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfX10sCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKFtbCiMgICAgICAgICBkZWZpbmUgX19FWFRFTlNJT05TX18gMQogICAgICAgICAgXUFDX0lOQ0xVREVTX0RFRkFVTFRdKV0sCiAgICAgICBbYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX189eWVzXSwKICAgICAgIFthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXz1ub10pXSkKICB0ZXN0ICRhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXyA9IHllcyAmJgogICAgQUNfREVGSU5FKFtfX0VYVEVOU0lPTlNfX10pCiAgQUNfREVGSU5FKFtfQUxMX1NPVVJDRV0pCiAgQUNfREVGSU5FKFtfR05VX1NPVVJDRV0pCiAgQUNfREVGSU5FKFtfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1NdKQogIEFDX0RFRklORShbX1RBTkRFTV9TT1VSQ0VdKQpdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX1VTRV9TWVNURU1fRVhURU5TSU9OU10pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX1VTRV9TWVNURU1fRVhURU5TSU9OU10sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDE3LDUyOApBQ19UWVBFX01CU1RBVEVfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIG1ic3RhdGVfdF0sIGFjX2N2X3R5cGVfbWJzdGF0ZV90LAogICAgIFtBQ19DT01QSUxFX0lGRUxTRSgKCVtBQ19MQU5HX1BST0dSQU0oCgkgICBbQUNfSU5DTFVERVNfREVGQVVMVAojCSAgICBpbmNsdWRlIDx3Y2hhci5oPl0sCgkgICBbbWJzdGF0ZV90IHg7IHJldHVybiBzaXplb2YgeDtdKV0sCglbYWNfY3ZfdHlwZV9tYnN0YXRlX3Q9eWVzXSwKCVthY19jdl90eXBlX21ic3RhdGVfdD1ub10pXSkKICAgaWYgdGVzdCAkYWNfY3ZfdHlwZV9tYnN0YXRlX3QgPSB5ZXM7IHRoZW4KICAgICBBQ19ERUZJTkUoW0hBVkVfTUJTVEFURV9UXSwgMSwKCSAgICAgICBbRGVmaW5lIHRvIDEgaWYgPHdjaGFyLmg+IGRlY2xhcmVzIG1ic3RhdGVfdC5dKQogICBlbHNlCiAgICAgQUNfREVGSU5FKFttYnN0YXRlX3RdLCBpbnQsCgkgICAgICAgW0RlZmluZSB0byBhIHR5cGUgaWYgPHdjaGFyLmg+IGRvZXMgbm90IGRlZmluZS5dKQogICBmaVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMzAKbTRfbG9jYXRpb24oX0FDX0xBTkdfUFJFRklYKS4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjE0OQpUMjgsNApfQUNfTEFOR19BQkJSRVYoT2JqZWN0aXZlIEMpb2JqYwpUMTQsODcKQUNfUFJPR19DQ19DODlfbTRfZGVmdW5fcHJvKFskMF0pIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAogIF9BQ19QUk9HX0NDX0M4OQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDMzCm00X2xvY2F0aW9uKEFDX09VVFBVVCkuLi8uLi9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjEyMzkKVDE0LDEyNzMKX0FDX0NBQ0hFX0RVTVAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAojIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgojIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgojIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKAogIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gWydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ11gOyBkbwogICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgICBjYXNlICRhY192YWwgaW4gIygKICAgICoke2FzX25sfSopCiAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAogICAgICAqX2N2XyopIEFDX01TR19XQVJOKFtjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZV0pIDs7CiAgICAgIGVzYWMKICAgICAgY2FzZSAkYWNfdmFyIGluICMoCiAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKICAgICAgKikgQVNfVU5TRVQoWyRhY192YXJdKSA7OwogICAgICBlc2FjIDs7CiAgICBlc2FjCiAgZG9uZQoKICAoc2V0KSAyPiYxIHwKICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQogICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgogICAgICBzZWQgLW4gXAoJWyJzLycvJ1xcXFwnJy9nOwoJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiXQogICAgICA7OyAjKAogICAgKikKICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KICAgICAgc2VkIC1uIFsiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiXQogICAgICA7OwogICAgZXNhYyB8CiAgICBzb3J0CilkbmwKClQyMCwzNTYKQUNfU1RSVUNUX1NUX0JMS1NJWkVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RSVUNUX1NUX0JMS1NJWkUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2Jsa3NpemVdLAoJCSBbQUNfREVGSU5FKEhBVkVfU1RfQkxLU0laRSwgMSwKCQkJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIGBzdHJ1Y3Qgc3RhdCcgaGFzCgkJCSAgICAgYHN0X2Jsa3NpemUnLiAgRGVwcmVjYXRlZCwgdXNlCgkJCSAgICAgYEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxLU0laRScgaW5zdGVhZC5dKV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTk4CkFDX0ZVTkNfRk5NQVRDSF9HTlVfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfR05VX1NPVVJDRV0pCl9BQ19GVU5DX0ZOTUFUQ0hfSUYoW0dOVV0sIFthY19jdl9mdW5jX2ZubWF0Y2hfZ251XSwKCQkgICAgW3JtIC1mICIkYWNfY29uZmlnX2xpYm9ial9kaXIvZm5tYXRjaC5oIl0sCgkJICAgIFtfQUNfTElCT0JKX0ZOTUFUQ0hdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDg0NgpBQ19DX0lOTElORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIGlubGluZV0sIGFjX2N2X2NfaW5saW5lLApbYWNfY3ZfY19pbmxpbmU9bm8KZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwogIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRSgKWyNpZm5kZWYgX19jcGx1c3BsdXMKdHlwZWRlZiBpbnQgZm9vX3Q7CnN0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KJGFjX2t3IGZvb190IGZvbyAoKSB7cmV0dXJuIDA7IH0KI2VuZGlmCl0pXSwKCQkgICAgW2FjX2N2X2NfaW5saW5lPSRhY19rd10pCiAgdGVzdCAiJGFjX2N2X2NfaW5saW5lIiAhPSBubyAmJiBicmVhawpkb25lCl0pCkFIX1ZFUkJBVElNKFtpbmxpbmVdLApbLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCiAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLwojaWZuZGVmIF9fY3BsdXNwbHVzCiN1bmRlZiBpbmxpbmUKI2VuZGlmXSkKY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KICBpbmxpbmUgfCB5ZXMpIDs7CiAgKikKICAgIGNhc2UgJGFjX2N2X2NfaW5saW5lIGluCiAgICAgIG5vKSBhY192YWw9OzsKICAgICAgKikgYWNfdmFsPSRhY19jdl9jX2lubGluZTs7CiAgICBlc2FjCiAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiNpZm5kZWYgX19jcGx1c3BsdXMKI2RlZmluZSBpbmxpbmUgJGFjX3ZhbAojZW5kaWYKX0FDRU9GCiAgICA7Owplc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzMsMzMKbTRfbG9jYXRpb24oX0FDX0NIRUNLX0hFQURFUl9PTEQpLi4vLi4vbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6MjE1ClQyMywzMwptNF9sb2NhdGlvbihBQ19GT1JFQUNIKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE5NApUMzgsMzEKbTRfbG9jYXRpb24oQUNfVFlQRV9MT05HX0RPVUJMRV9XSURFUikuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NDE0ClQ1MCwzNQptNF9sb2NhdGlvbihBQ19GVU5DX0xTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6ODQ5CkY5LDYKbTRfZGVmaW5lZGVmaW5lClQyNCwxOTEwCl9BQ19QUk9HX0xFWF9ZWVRFWFRfREVDTGNhdCA+Y29uZnRlc3QubCA8PF9BQ0VPRlsKJSUKYSB7IEVDSE87IH0KYiB7IFJFSkVDVDsgfQpjIHsgeXltb3JlICgpOyB9CmQgeyB5eWxlc3MgKDEpOyB9CmUgeyAvKiBJUklYIDYuNSBmbGV4IDIuNS40IHVuZGVycXVvdGVzIGl0cyB5eWxlc3MgYXJndW1lbnQuICAqLwogICAgeXlsZXNzICgoaW5wdXQgKCkgIT0gMCkpOyB9CmYgeyB1bnB1dCAoeXl0ZXh0WzBdKTsgfQouIHsgQkVHSU4gSU5JVElBTDsgfQolJQojaWZkZWYgWVlURVhUX1BPSU5URVIKZXh0ZXJuIGNoYXIgKnl5dGV4dDsKI2VuZGlmCmludAptYWluICh2b2lkKQp7CiAgcmV0dXJuICEgeXlsZXggKCkgKyAhIHl5d3JhcCAoKTsKfQpdX0FDRU9GCl9BQ19ET19WQVIoTEVYIGNvbmZ0ZXN0LmwpCkFDX0NBQ0hFX0NIRUNLKFtsZXggb3V0cHV0IGZpbGUgcm9vdF0sIFthY19jdl9wcm9nX2xleF9yb290XSwgWwppZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCiAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5CmVsc2UKICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cF0pCmZpXSkKQUNfU1VCU1QoW0xFWF9PVVRQVVRfUk9PVF0sIFskYWNfY3ZfcHJvZ19sZXhfcm9vdF0pZG5sCgppZiB0ZXN0IC16ICIke0xFWExJQitzZXR9IjsgdGhlbgogIEFDX0NBQ0hFX0NIRUNLKFtsZXggbGlicmFyeV0sIFthY19jdl9saWJfbGV4XSwgWwogICAgYWNfc2F2ZV9MSUJTPSRMSUJTCiAgICBhY19jdl9saWJfbGV4PSdub25lIG5lZWRlZCcKICAgIGZvciBhY19saWIgaW4gJycgLWxmbCAtbGw7IGRvCiAgICAgIExJQlM9IiRhY19saWIgJGFjX3NhdmVfTElCUyIKICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfREVGSU5FU19QUk9WSURFRFtgY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2BdXSwKCVthY19jdl9saWJfbGV4PSRhY19saWJdKQogICAgICB0ZXN0ICIkYWNfY3ZfbGliX2xleCIgIT0gJ25vbmUgbmVlZGVkJyAmJiBicmVhawogICAgZG9uZQogICAgTElCUz0kYWNfc2F2ZV9MSUJTCiAgXSkKICB0ZXN0ICIkYWNfY3ZfbGliX2xleCIgIT0gJ25vbmUgbmVlZGVkJyAmJiBMRVhMSUI9JGFjX2N2X2xpYl9sZXgKZmkKQUNfU1VCU1QoTEVYTElCKQoKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyLCBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciwKWyMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQojIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiAgRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KYWNfc2F2ZV9MSUJTPSRMSUJTCkxJQlM9IiRMRVhMSUIgJGFjX3NhdmVfTElCUyIKQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfREVGSU5FU19QUk9WSURFRAogIFsjZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgXV0sCiAgW2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllc10pCkxJQlM9JGFjX3NhdmVfTElCUwpdKQpkbmwKaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoWVlURVhUX1BPSU5URVIsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIGBsZXgnIGRlY2xhcmVzIGB5eXRleHQnIGFzIGEgYGNoYXIgKicgYnkgZGVmYXVsdCwKCSAgICAgbm90IGEgYGNoYXJbXScuXSkKZmkKcm0gLWYgY29uZnRlc3QubCAkTEVYX09VVFBVVF9ST09ULmMKClQxOSwxNDI4MwpfQUNfSU5JVF9QQVJTRV9BUkdTbTRfZGl2ZXJ0X3B1c2goW1BBUlNFX0FSR1NdKWRubAoKIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgphY19pbml0X2hlbHA9CmFjX2luaXRfdmVyc2lvbj1mYWxzZQphY191bnJlY29nbml6ZWRfb3B0cz0KYWNfdW5yZWNvZ25pemVkX3NlcD0KIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgpjYWNoZV9maWxlPS9kZXYvbnVsbApBQ19TVUJTVChleGVjX3ByZWZpeCwgTk9ORSlkbmwKbm9fY3JlYXRlPQpub19yZWN1cnNpb249CkFDX1NVQlNUKHByZWZpeCwgTk9ORSlkbmwKcHJvZ3JhbV9wcmVmaXg9Tk9ORQpwcm9ncmFtX3N1ZmZpeD1OT05FCkFDX1NVQlNUKHByb2dyYW1fdHJhbnNmb3JtX25hbWUsIFtzLHgseCxdKWRubApzaWxlbnQ9CnNpdGU9CnNyY2Rpcj0KdmVyYm9zZT0KeF9pbmNsdWRlcz1OT05FCnhfbGlicmFyaWVzPU5PTkUKCiMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgojIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgojIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgojIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCkFDX1NVQlNUKFtiaW5kaXJdLCAgICAgICAgIFsnJHtleGVjX3ByZWZpeH0vYmluJ10pZG5sCkFDX1NVQlNUKFtzYmluZGlyXSwgICAgICAgIFsnJHtleGVjX3ByZWZpeH0vc2JpbiddKWRubApBQ19TVUJTVChbbGliZXhlY2Rpcl0sICAgICBbJyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnXSlkbmwKQUNfU1VCU1QoW2RhdGFyb290ZGlyXSwgICAgWycke3ByZWZpeH0vc2hhcmUnXSlkbmwKQUNfU1VCU1QoW2RhdGFkaXJdLCAgICAgICAgWycke2RhdGFyb290ZGlyfSddKWRubApBQ19TVUJTVChbc3lzY29uZmRpcl0sICAgICBbJyR7cHJlZml4fS9ldGMnXSlkbmwKQUNfU1VCU1QoW3NoYXJlZHN0YXRlZGlyXSwgWycke3ByZWZpeH0vY29tJ10pZG5sCkFDX1NVQlNUKFtsb2NhbHN0YXRlZGlyXSwgIFsnJHtwcmVmaXh9L3ZhciddKWRubApBQ19TVUJTVChbaW5jbHVkZWRpcl0sICAgICBbJyR7cHJlZml4fS9pbmNsdWRlJ10pZG5sCkFDX1NVQlNUKFtvbGRpbmNsdWRlZGlyXSwgIFsnL3Vzci9pbmNsdWRlJ10pZG5sCkFDX1NVQlNUKFtkb2NkaXJdLCAgICAgICAgIFttNF9pZnNldChbQUNfUEFDS0FHRV9UQVJOQU1FXSwKCQkJCSAgICAgWycke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9J10sCgkJCQkgICAgIFsnJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRX0nXSldKWRubApBQ19TVUJTVChbaW5mb2Rpcl0sICAgICAgICBbJyR7ZGF0YXJvb3RkaXJ9L2luZm8nXSlkbmwKQUNfU1VCU1QoW2h0bWxkaXJdLCAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW2R2aWRpcl0sICAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW3BkZmRpcl0sICAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW3BzZGlyXSwgICAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW2xpYmRpcl0sICAgICAgICAgWycke2V4ZWNfcHJlZml4fS9saWInXSlkbmwKQUNfU1VCU1QoW2xvY2FsZWRpcl0sICAgICAgWycke2RhdGFyb290ZGlyfS9sb2NhbGUnXSlkbmwKQUNfU1VCU1QoW21hbmRpcl0sICAgICAgICAgWycke2RhdGFyb290ZGlyfS9tYW4nXSlkbmwKCmFjX3ByZXY9CmFjX2Rhc2hkYXNoPQpmb3IgYWNfb3B0aW9uCmRvCiAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCiAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCiAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCiAgICBhY19wcmV2PQogICAgY29udGludWUKICBmaQoKICBjYXNlICRhY19vcHRpb24gaW4KICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbW149XV0qPVwoLipcKSdgIDs7CiAgKj0pICAgYWNfb3B0YXJnPSA7OwogICopICAgIGFjX29wdGFyZz15ZXMgOzsKICBlc2FjCgogICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCgogIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgogIC0tKQogICAgYWNfZGFzaGRhc2g9eWVzIDs7CgogIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCiAgICBhY19wcmV2PWJpbmRpciA7OwogIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCiAgICBiaW5kaXI9JGFjX29wdGFyZyA7OwoKICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQogICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OwogIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQogICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OwoKICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCiAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCiAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQogICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CgogIC0tY29uZmlnLWNhY2hlIHwgLUMpCiAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OwoKICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKICAgIGFjX3ByZXY9ZGF0YWRpciA7OwogIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCiAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKCiAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCiAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCiAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CiAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAogIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQogICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OwoKICBfQUNfSU5JVF9QQVJTRV9FTkFCTEUoW2Rpc2FibGVdKQoKICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQogICAgYWNfcHJldj1kb2NkaXIgOzsKICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CgogIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCiAgICBhY19wcmV2PWR2aWRpciA7OwogIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCiAgICBkdmlkaXI9JGFjX29wdGFyZyA7OwoKICBfQUNfSU5JVF9QQVJTRV9FTkFCTEUoW2VuYWJsZV0pCgogIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCiAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCiAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CiAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCiAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKCiAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgogICAgd2l0aF9nYXM9eWVzIDs7CgogIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCiAgICBhY19pbml0X2hlbHA9bG9uZyA7OwogIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCiAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKCiAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCiAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQogICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CgogIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQogICAgYWNfcHJldj1odG1sZGlyIDs7CiAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCiAgfCAtLWh0PSopCiAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKCiAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAogIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCiAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAogIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwoKICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQogICAgYWNfcHJldj1pbmZvZGlyIDs7CiAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OwoKICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQogICAgYWNfcHJldj1saWJkaXIgOzsKICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCiAgICBsaWJkaXI9JGFjX29wdGFyZyA7OwoKICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCiAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCiAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAogIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQogICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CgogIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CiAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7CgogIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQogICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CiAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCiAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCiAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKCiAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKICAgIGFjX3ByZXY9bWFuZGlyIDs7CiAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQogICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKCiAgLW5mcCB8IC0tbmZwIHwgLS1uZikKICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCiAgICB3aXRoX2ZwPW5vIDs7CgogIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCiAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCiAgICBub19jcmVhdGU9eWVzIDs7CgogIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAogIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQogICAgbm9fcmVjdXJzaW9uPXllcyA7OwoKICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCiAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCiAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQogICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CiAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCiAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAogIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCiAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKCiAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKICAgIGFjX3ByZXY9cHJlZml4IDs7CiAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQogICAgcHJlZml4PSRhY19vcHRhcmcgOzsKCiAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCiAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CgogIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCiAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCiAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CiAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCiAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQogICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OwoKICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCiAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAogIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAogIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCiAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAogIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAogIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwogIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCiAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCiAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCiAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCiAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQogICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CgogIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCiAgICBhY19wcmV2PXBkZmRpciA7OwogIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCiAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwoKICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQogICAgYWNfcHJldj1wc2RpciA7OwogIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQogICAgcHNkaXI9JGFjX29wdGFyZyA7OwoKICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAogIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQogICAgc2lsZW50PXllcyA7OwoKICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKICAgIGFjX3ByZXY9c2JpbmRpciA7OwogIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCiAgfCAtLXNiaT0qIHwgLS1zYj0qKQogICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CgogIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAogIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAogIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCiAgfCAtLXNoYSB8IC0tc2gpCiAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CiAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCiAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKICB8IC0tc2hhPSogfCAtLXNoPSopCiAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CgogIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCiAgICBhY19wcmV2PXNpdGUgOzsKICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQogICAgc2l0ZT0kYWNfb3B0YXJnIDs7CgogIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCiAgICBhY19wcmV2PXNyY2RpciA7OwogIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCiAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwoKICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCiAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCiAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAogIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OwoKICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQogICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCiAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwoKICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQogICAgdmVyYm9zZT15ZXMgOzsKCiAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CgogIF9BQ19JTklUX1BBUlNFX0VOQUJMRShbd2l0aF0pCgogIF9BQ19JTklUX1BBUlNFX0VOQUJMRShbd2l0aG91dF0pCgogIC0teCkKICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KICAgIHdpdGhfeD15ZXMgOzsKCiAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAogIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCiAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAogIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OwoKICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAogIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQogICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwogIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKCiAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogYCRhY19vcHRpb24nClRyeSBgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXSkKICAgIDs7CgogICo9KikKICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtbXj1dXSpcKT0nYAogICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgogICAgY2FzZSAkYWNfZW52dmFyIGluICMoCiAgICAgICcnIHwgW1swLTldXSogfCAqW1shXyRhc19jcl9hbG51bV1dKiApCiAgICAgIEFDX01TR19FUlJPUihbaW52YWxpZCB2YXJpYWJsZSBuYW1lOiBgJGFjX2VudnZhciddKSA7OwogICAgZXNhYwogICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCiAgICBleHBvcnQgJGFjX2VudnZhciA7OwoKICAqKQogICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgogICAgQUNfTVNHX1dBUk4oW3lvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXRdKQogICAgZXhwciAieCRhY19vcHRpb24iIDogIlsuKlteLS5fJGFzX2NyX2FsbnVtXV0iID4vZGV2L251bGwgJiYKICAgICAgQUNfTVNHX1dBUk4oW2ludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uXSkKICAgIDogIiR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259IgogICAgOzsKCiAgZXNhYwpkb25lCgppZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCiAgQUNfTVNHX0VSUk9SKFttaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb25dKQpmaQoKaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgogIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KICAgIG5vKSA7OwogICAgZmF0YWwpIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0c10pIDs7CiAgICAqKSAgICAgQUNfTVNHX1dBUk4oIFt1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzXSkgOzsKICBlc2FjCmZpCgojIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCgkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCgkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAoJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCmRvCiAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KICBjYXNlICRhY192YWwgaW4KICAgICovICkKICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbW14vXV1cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKICBlc2FjCiAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgogIGNhc2UgJGFjX3ZhbCBpbgogICAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKiApICBjb250aW51ZTs7CiAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CiAgZXNhYwogIEFDX01TR19FUlJPUihbZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbF0pCmRvbmUKCiMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCiMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KYnVpbGQ9JGJ1aWxkX2FsaWFzCmhvc3Q9JGhvc3RfYWxpYXMKdGFyZ2V0PSR0YXJnZXRfYWxpYXMKCiMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KaWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCiAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCiAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCiAgICBjcm9zc19jb21waWxpbmc9eWVzCiAgZmkKZmkKCmFjX3Rvb2xfcHJlZml4PQp0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCgp0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCgptNF9kaXZlcnRfcG9wKFtQQVJTRV9BUkdTXSlkbmwKClQxMywxODgKQUNfUkVUU0lHVFlQRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19SRVRTSUdUWVBFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1RZUEVfU0lHTkFMXSwgW0FDX1RZUEVfU0lHTkFMKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwwCm00X2luY2x1ZGUoYXV0b2NvbmYvbGFuZy5tNCkKVDIxLDExNApfQUNfSU5JVF9QQVJTRV9FTkFCTEVtNF9ibWF0Y2goWyQxXSwgW153aXRoXSwKCSAgIFtfQUNfSU5JVF9QQVJTRV9FTkFCTEUyKFskMV0sIFt3aXRoXSldLAoJICAgW19BQ19JTklUX1BBUlNFX0VOQUJMRTIoWyQxXSwgW2VuYWJsZV0pXSkKVDE0LDkwMQpBQ19GVU5DX1NUUlRPRF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19TVUJTVChQT1dfTElCKWRubApBQ19DQUNIRV9DSEVDSyhmb3Igd29ya2luZyBzdHJ0b2QsIGFjX2N2X2Z1bmNfc3RydG9kLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKXUFDX0lOQ0xVREVTX0RFRkFVTFRbCiNpZm5kZWYgc3RydG9kCmRvdWJsZSBzdHJ0b2QgKCk7CiNlbmRpZgppbnQKbWFpbigpCnsKICB7CiAgICAvKiBTb21lIHZlcnNpb25zIG9mIExpbnV4IHN0cnRvZCBtaXMtcGFyc2Ugc3RyaW5ncyB3aXRoIGxlYWRpbmcgJysnLiAgKi8KICAgIGNoYXIgKnN0cmluZyA9ICIgKzY5IjsKICAgIGNoYXIgKnRlcm07CiAgICBkb3VibGUgdmFsdWU7CiAgICB2YWx1ZSA9IHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7CiAgICBpZiAodmFsdWUgIT0gNjkgfHwgdGVybSAhPSAoc3RyaW5nICsgNCkpCiAgICAgIHJldHVybiAxOwogIH0KCiAgewogICAgLyogVW5kZXIgU29sYXJpcyAyLjQsIHN0cnRvZCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBmb3IgdGhlCiAgICAgICB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgdW5kZXIgc29tZSBjb25kaXRpb25zLiAgKi8KICAgIGNoYXIgKnN0cmluZyA9ICJOYU4iOwogICAgY2hhciAqdGVybTsKICAgIHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7CiAgICBpZiAodGVybSAhPSBzdHJpbmcgJiYgKih0ZXJtIC0gMSkgPT0gMCkKICAgICAgcmV0dXJuIDE7CiAgfQogIHJldHVybiAwOwp9Cl1dKV0sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJ0b2Q9eWVzLAoJICAgICAgIGFjX2N2X2Z1bmNfc3RydG9kPW5vLAoJICAgICAgIGFjX2N2X2Z1bmNfc3RydG9kPW5vKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfc3RydG9kID0gbm87IHRoZW4KICBfQUNfTElCT0JKX1NUUlRPRApmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDMzCm00X2xvY2F0aW9uKEFNX0VYRUVYVCkuLi8uLi9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6ODcKVDEwLDI3Cm00X2RlZmF1bHRtNF9pZihbJDFdLCBbXSwgWyQyXSwgWyQxXSkKVDksNQpfbTRfY3VycnlbJDFdKQpUMjIsMjIKQUNfT1VUUFVUX0NPTU1BTkRTX1BSRV9BQ19MSUJPQkpTX05PUk1BTElaRQoKVDEzLDEzNjEKQUNfQ19SRVNUUklDVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIEMvQysrIHJlc3RyaWN0IGtleXdvcmRdLCBhY19jdl9jX3Jlc3RyaWN0LAogIFthY19jdl9jX3Jlc3RyaWN0PW5vCiAgICMgVGhlIG9yZGVyIGhlcmUgY2F0ZXJzIHRvIHRoZSBmYWN0IHRoYXQgQysrIGRvZXMgbm90IHJlcXVpcmUgcmVzdHJpY3QuCiAgIGZvciBhY19rdyBpbiBfX3Jlc3RyaWN0IF9fcmVzdHJpY3RfXyBfUmVzdHJpY3QgcmVzdHJpY3Q7IGRvCiAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKICAgICAgW1t0eXBlZGVmIGludCAqIGludF9wdHI7CglpbnQgZm9vIChpbnRfcHRyICRhY19rdyBpcCkgewoJcmV0dXJuIGlwWzBdOwogICAgICAgfV1dLAogICAgICBbW2ludCBzWzFdOwoJaW50ICogJGFjX2t3IHQgPSBzOwoJdFswXSA9IDA7CglyZXR1cm4gZm9vKHQpXV0pXSwKICAgICAgW2FjX2N2X2NfcmVzdHJpY3Q9JGFjX2t3XSkKICAgICB0ZXN0ICIkYWNfY3ZfY19yZXN0cmljdCIgIT0gbm8gJiYgYnJlYWsKICAgZG9uZQogIF0pCiBBSF9WRVJCQVRJTShbcmVzdHJpY3RdLApbLyogRGVmaW5lIHRvIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBDOTkgJ3Jlc3RyaWN0JyBrZXl3b3JkLCBvciB0bwogICBub3RoaW5nIGlmIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gIERvIG5vdCBkZWZpbmUgaWYgcmVzdHJpY3QgaXMKICAgc3VwcG9ydGVkIGRpcmVjdGx5LiAgKi8KI3VuZGVmIHJlc3RyaWN0Ci8qIFdvcmsgYXJvdW5kIGEgYnVnIGluIFN1biBDKys6IGl0IGRvZXMgbm90IHN1cHBvcnQgX1Jlc3RyaWN0IG9yCiAgIF9fcmVzdHJpY3RfXywgZXZlbiB0aG91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgU3VuIEMgY29tcGlsZXIgZW5kcyB1cCB3aXRoCiAgICIjZGVmaW5lIHJlc3RyaWN0IF9SZXN0cmljdCIgb3IgIiNkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdF9fIiBpbiB0aGUKICAgcHJldmlvdXMgbGluZS4gIFBlcmhhcHMgc29tZSBmdXR1cmUgdmVyc2lvbiBvZiBTdW4gQysrIHdpbGwgd29yayB3aXRoCiAgIHJlc3RyaWN0OyBpZiBzbywgaG9wZWZ1bGx5IGl0IGRlZmluZXMgX19SRVNUUklDVCBsaWtlIFN1biBDIGRvZXMuICAqLwojaWYgZGVmaW5lZCBfX1NVTlBST19DQyAmJiAhZGVmaW5lZCBfX1JFU1RSSUNUCiMgZGVmaW5lIF9SZXN0cmljdAojIGRlZmluZSBfX3Jlc3RyaWN0X18KI2VuZGlmXSkKIGNhc2UgJGFjX2N2X2NfcmVzdHJpY3QgaW4KICAgcmVzdHJpY3QpIDs7CiAgIG5vKSBBQ19ERUZJTkUoW3Jlc3RyaWN0XSwgW10pIDs7CiAgICopICBBQ19ERUZJTkVfVU5RVU9URUQoW3Jlc3RyaWN0XSwgWyRhY19jdl9jX3Jlc3RyaWN0XSkgOzsKIGVzYWMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywyMDQxCl9BQ19QQVRIX1hfRElSRUNUIyBTdGFuZGFyZCBzZXQgb2YgY29tbW9uIGRpcmVjdG9yaWVzIGZvciBYIGhlYWRlcnMuCiMgQ2hlY2sgWDExIGJlZm9yZSBYMTFSbiBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgc3ltbGluayB0byB0aGUgY3VycmVudCByZWxlYXNlLgphY194X2hlYWRlcl9kaXJzPScKL3Vzci9YMTEvaW5jbHVkZQovdXNyL1gxMVI3L2luY2x1ZGUKL3Vzci9YMTFSNi9pbmNsdWRlCi91c3IvWDExUjUvaW5jbHVkZQovdXNyL1gxMVI0L2luY2x1ZGUKCi91c3IvaW5jbHVkZS9YMTEKL3Vzci9pbmNsdWRlL1gxMVI3Ci91c3IvaW5jbHVkZS9YMTFSNgovdXNyL2luY2x1ZGUvWDExUjUKL3Vzci9pbmNsdWRlL1gxMVI0CgovdXNyL2xvY2FsL1gxMS9pbmNsdWRlCi91c3IvbG9jYWwvWDExUjcvaW5jbHVkZQovdXNyL2xvY2FsL1gxMVI2L2luY2x1ZGUKL3Vzci9sb2NhbC9YMTFSNS9pbmNsdWRlCi91c3IvbG9jYWwvWDExUjQvaW5jbHVkZQoKL3Vzci9sb2NhbC9pbmNsdWRlL1gxMQovdXNyL2xvY2FsL2luY2x1ZGUvWDExUjcKL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI2Ci91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNQovdXNyL2xvY2FsL2luY2x1ZGUvWDExUjQKCi91c3IvWDM4Ni9pbmNsdWRlCi91c3IveDM4Ni9pbmNsdWRlCi91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMQoKL3Vzci9pbmNsdWRlCi91c3IvbG9jYWwvaW5jbHVkZQovdXNyL3Vuc3VwcG9ydGVkL2luY2x1ZGUKL3Vzci9hdGhlbmEvaW5jbHVkZQovdXNyL2xvY2FsL3gxMXI1L2luY2x1ZGUKL3Vzci9scHAvWGFtcGxlcy9pbmNsdWRlCgovdXNyL29wZW53aW4vaW5jbHVkZQovdXNyL29wZW53aW4vc2hhcmUvaW5jbHVkZScKCmlmIHRlc3QgIiRhY194X2luY2x1ZGVzIiA9IG5vOyB0aGVuCiAgIyBHdWVzcyB3aGVyZSB0byBmaW5kIGluY2x1ZGUgZmlsZXMsIGJ5IGxvb2tpbmcgZm9yIFhsaWIuaC4KICAjIEZpcnN0LCB0cnkgdXNpbmcgdGhhdCBmaWxlIHdpdGggbm8gc3BlY2lhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkLgogIEFDX1BSRVBST0NfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbQCU6QGluY2x1ZGUgPFgxMS9YbGliLmg+XSldLApbIyBXZSBjYW4gY29tcGlsZSB1c2luZyBYIGhlYWRlcnMgd2l0aCBubyBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5LgphY194X2luY2x1ZGVzPV0sCltmb3IgYWNfZGlyIGluICRhY194X2hlYWRlcl9kaXJzOyBkbwogIGlmIHRlc3QgLXIgIiRhY19kaXIvWDExL1hsaWIuaCI7IHRoZW4KICAgIGFjX3hfaW5jbHVkZXM9JGFjX2RpcgogICAgYnJlYWsKICBmaQpkb25lXSkKZmkgIyAkYWNfeF9pbmNsdWRlcyA9IG5vCgppZiB0ZXN0ICIkYWNfeF9saWJyYXJpZXMiID0gbm87IHRoZW4KICAjIENoZWNrIGZvciB0aGUgbGlicmFyaWVzLgogICMgU2VlIGlmIHdlIGZpbmQgdGhlbSB3aXRob3V0IGFueSBzcGVjaWFsIG9wdGlvbnMuCiAgIyBEb24ndCBhZGQgdG8gJExJQlMgcGVybWFuZW50bHkuCiAgYWNfc2F2ZV9MSUJTPSRMSUJTCiAgTElCUz0iLWxYMTEgJExJQlMiCiAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQCU6QGluY2x1ZGUgPFgxMS9YbGliLmg+XSwKCQkJCSAgW1hybUluaXRpYWxpemUgKCldKV0sCgkJIFtMSUJTPSRhY19zYXZlX0xJQlMKIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCmFjX3hfbGlicmFyaWVzPV0sCgkJIFtMSUJTPSRhY19zYXZlX0xJQlMKZm9yIGFjX2RpciBpbiBgQVNfRUNITyhbIiRhY194X2luY2x1ZGVzICRhY194X2hlYWRlcl9kaXJzIl0pIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKZG8KICAjIERvbid0IGV2ZW4gYXR0ZW1wdCB0aGUgaGFpciBvZiB0cnlpbmcgdG8gbGluayBhbiBYIHByb2dyYW0hCiAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsIGR5bGliIGxhIGRsbDsgZG8KICAgIGlmIHRlc3QgLXIgIiRhY19kaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCiAgICAgIGFjX3hfbGlicmFyaWVzPSRhY19kaXIKICAgICAgYnJlYWsgMgogICAgZmkKICBkb25lCmRvbmVdKQpmaSAjICRhY194X2xpYnJhcmllcyA9IG5vCgpUOCwxMDM2CkFVX0RFRlVOIyBUaGlzIGlzIHdoYXQgYXV0b3VwZGF0ZSdzIG00IHJ1biB3aWxsIGV4cGFuZC4gIEl0IGZpcmVzCiMgdGhlIHdhcm5pbmcgKHdpdGggX2F1X3dhcm5fWFhYKSwgb3V0cHV0cyBpdCBpbnRvIHRoZQojIHVwZGF0ZWQgY29uZmlndXJlLmFjICh3aXRoIEFDX0RJQUdOT1NFKSwgYW5kIHRoZW4gb3V0cHV0cwojIHRoZSByZXBsYWNlbWVudCBleHBhbnNpb24uCkFVX0RFRklORShbJDFdLApbbTRfaWZ2YWwoWyQzXSwgW19hdV93YXJuXyQxKFskM10pQUNfRElBR05PU0UoW29ic29sZXRlXSwgWyQzXSlkW11ubApdKWRubAokMl0pCgojIFRoaXMgaXMgYW4gYXV4aWxpYXJ5IG1hY3JvIHRoYXQgaXMgYWxzbyBydW4gd2hlbgojIGF1dG91cGRhdGUgcnVucyBtNC4gIEl0IHNpbXBseSBjYWxscyBtNF93YXJuaW5nLCBidXQKIyB3ZSBuZWVkIGEgd3JhcHBlciBzbyB0aGF0IGVhY2ggd2FybmluZyBpcyBlbWl0dGVkIG9ubHkKIyBvbmNlLiAgV2UgYnJlYWsgdGhlIHF1b3RpbmcgaW4gbTRfd2FybmluZydzIGFyZ3VtZW50IGluCiMgb3JkZXIgdG8gZXhwYW5kIHRoaXMgbWFjcm8ncyBhcmd1bWVudHMsIG5vdCBBVV9ERUZVTidzLgpBVV9ERUZJTkUoW19hdV93YXJuXyQxXSwKW200X3dhcm5pbmcoJF1bQClkbmwKbTRfZGVmaW5lKFtfYXVfd2Fybl8kMV0sIFtdKV0pCgojIEZpbmFsbHksIHRoaXMgaXMgdGhlIGV4cGFuc2lvbiB0aGF0IGlzIHBpY2tlZCB1cCBieQojIGF1dG9jb25mLiAgSXQgdGVsbHMgdGhlIHVzZXIgdG8gcnVuIGF1dG91cGRhdGUsIGFuZAojIHRoZW4gb3V0cHV0cyB0aGUgcmVwbGFjZW1lbnQgZXhwYW5zaW9uLiAgV2UgZG8gbm90IGNhcmUKIyBhYm91dCBhdXRvdXBkYXRlJ3Mgd2FybmluZyBiZWNhdXNlIHRoYXQgY29udGFpbnMKIyBpbmZvcm1hdGlvbiBvbiB3aGF0IHRvIGRvICphZnRlciogcnVubmluZyBhdXRvdXBkYXRlLgpBQ19ERUZVTihbJDFdLAoJIFtBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGAkMScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKJDJdKQpGNyw3CnRyYWNlb250cmFjZW9uClQzMiwzMQptNF9sb2NhdGlvbihBQ19FUkxBTkdfUEFUSF9FUkxDKS4uLy4uL2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6NDkKVDIyLDQ5NgpBQ19QUkVTRVJWRV9IRUxQX09SREVSX200X2RlZnVuX3BybyhbJDBdKW00X2RpdmVydF9vbmNlKFtIRUxQX0VOQUJMRV0sIFtbCk9wdGlvbmFsIEZlYXR1cmVzIGFuZCBQYWNrYWdlczoKICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCiAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQogIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pXV0pCm00X2RlZmluZShbX200X2RpdmVydChIRUxQX0VOQUJMRSldLCAgICBfbTRfZGl2ZXJ0KEhFTFBfV0lUSCkpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxOTQ0CkFDX09QRU5NUF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBPUEVOTVBfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTPQogIEFDX0FSR19FTkFCTEUoW29wZW5tcF0sCiAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1vcGVubXBdLCBbZG8gbm90IHVzZSBPcGVuTVBdKV0pCiAgaWYgdGVzdCAiJGVuYWJsZV9vcGVubXAiICE9IG5vOyB0aGVuCiAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXV9BQ19DQ1tdIG9wdGlvbiB0byBzdXBwb3J0IE9wZW5NUF0sCiAgICAgIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wXSwKICAgICAgW0FDX0xJTktfSUZFTFNFKFtfQUNfTEFOR19PUEVOTVBdLAoJIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wPSdub25lIG5lZWRlZCddLAoJIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wPSd1bnN1cHBvcnRlZCcKCSAgZG5sIFRyeSB0aGVzZSBmbGFnczoKCSAgZG5sICAgR0NDID49IDQuMiAgICAgICAgICAgLWZvcGVubXAKCSAgZG5sICAgU3VuUFJPIEMgICAgICAgICAgICAgLXhvcGVubXAKCSAgZG5sICAgSW50ZWwgQyAgICAgICAgICAgICAgLW9wZW5tcAoJICBkbmwgICBTR0kgQywgUEdJIEMgICAgICAgICAtbXAKCSAgZG5sICAgVHJ1NjQgQ29tcGFxIEMgICAgICAgLW9tcAoJICBkbmwgICBJQk0gQyAoQUlYLCBMaW51eCkgICAtcXNtcD1vbXAKICAgICAgICAgIGRubCAgIENyYXkgQ0NFICAgICAgICAgICAgIC1ob21wCiAgICAgICAgICBkbmwgICBORUMgU1ggICAgICAgICAgICAgICAtUG9wZW5tcAogICAgICAgICAgZG5sICAgTGFoZXkgRm9ydHJhbiAoTGludXgpICAtLW9wZW5tcAoJICBkbmwgSWYgaW4gdGhpcyBsb29wIGEgY29tcGlsZXIgaXMgcGFzc2VkIGFuIG9wdGlvbiB0aGF0IGl0IGRvZXNuJ3QKCSAgZG5sIHVuZGVyc3RhbmQgb3IgdGhhdCBpdCBtaXNpbnRlcnByZXRzLCB0aGUgQUNfTElOS19JRkVMU0UgdGVzdAoJICBkbmwgd2lsbCBmYWlsIChzaW5jZSB3ZSBrbm93IHRoYXQgaXQgZmFpbGVkIHdpdGhvdXQgdGhlIG9wdGlvbiksCgkgIGRubCB0aGVyZWZvcmUgdGhlIGxvb3Agd2lsbCBjb250aW51ZSBzZWFyY2hpbmcgZm9yIGFuIG9wdGlvbiwgYW5kCgkgIGRubCBubyBvdXRwdXQgZmlsZSBjYWxsZWQgJ3Blbm1wJyBvciAnbXAnIGlzIGNyZWF0ZWQuCgkgIGZvciBhY19vcHRpb24gaW4gLWZvcGVubXAgLXhvcGVubXAgLW9wZW5tcCAtbXAgLW9tcCAtcXNtcD1vbXAgLWhvbXAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAtUG9wZW5tcCAtLW9wZW5tcDsgZG8KCSAgICBhY19zYXZlX1tdX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTCgkgICAgX0FDX0xBTkdfUFJFRklYW11GTEFHUz0iJFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUyAkYWNfb3B0aW9uIgoJICAgIEFDX0xJTktfSUZFTFNFKFtfQUNfTEFOR19PUEVOTVBdLAoJICAgICAgW2FjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9vcGVubXA9JGFjX29wdGlvbl0pCgkgICAgX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kYWNfc2F2ZV9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKCSAgICBpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX29wZW5tcCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KCSAgICAgIGJyZWFrCgkgICAgZmkKCSAgZG9uZV0pXSkKICAgIGNhc2UgJGFjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9vcGVubXAgaW4gIygKICAgICAgIm5vbmUgbmVlZGVkIiB8IHVuc3VwcG9ydGVkKQoJOzsgIygKICAgICAgKikKCU9QRU5NUF9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9JGFjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9vcGVubXAgOzsKICAgIGVzYWMKICBmaQogIEFDX1NVQlNUKFtPUEVOTVBfXV9BQ19MQU5HX1BSRUZJWFtGTEFHU10pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsNzYKQUNfTEFOR19DT05GVEVTVChPYmplY3RpdmUgQysrKWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLyogZW5kIGNvbmZkZWZzLmguICAqLwokMQpfQUNFT0YKVDE1LDQ0NwpBQ19GVU5DX0dFVFBHUlBfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciBnZXRwZ3JwIHJlcXVpcmVzIHplcm8gYXJndW1lbnRzLAogYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQsClsjIFVzZSBpdCB3aXRoIGEgc2luZ2xlIGFyZy4KQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sIFtnZXRwZ3JwICgwKTtdKV0sCgkJICBbYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQ9bm9dLAoJCSAgW2FjX2N2X2Z1bmNfZ2V0cGdycF92b2lkPXllc10pCl0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0cGdycF92b2lkID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEdFVFBHUlBfVk9JRCwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIGBnZXRwZ3JwJyBmdW5jdGlvbiByZXF1aXJlcyB6ZXJvIGFyZ3VtZW50cy5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsMTc1CkFDX0NPTlNUX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NPTlNUJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NfQ09OU1RdLCBbQUNfQ19DT05TVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTk1CkFDX0dFVEdST1VQU19UX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0dFVEdST1VQU19UJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1RZUEVfR0VUR1JPVVBTXSwgW0FDX1RZUEVfR0VUR1JPVVBTKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwzNAptNF9sb2NhdGlvbihBQ19EWU5JWF9TRVEpLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQ2OQpUMTksMzU1Cl9BQ19SVU5fSUZFTFNFX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBU19JRihbX0FDX0RPX1ZBUihhY19saW5rKSAmJiBfQUNfRE9fVE9LRU5TKC4vY29uZnRlc3QkYWNfZXhlZXh0KV0sCiAgICAgIFthY19yZXR2YWw9MF0sCiAgICAgIFtBU19FQ0hPKFsiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIl0pID4mQVNfTUVTU0FHRV9MT0dfRkQKICAgICAgIF9BQ19NU0dfTE9HX0NPTkZURVNUCiAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1c10pCiAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwogIEFTX0xJTkVOT19QT1AKICBBU19TRVRfU1RBVFVTKFskYWNfcmV0dmFsXSkKClQxMywyMApBU19WQVJfQVBQRU5EYXNfZm5fYXBwZW5kICQxICQyW10KVDEzLDE1NQpBU19WQVJfQVBQRU5EX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19WQVJfQVBQRU5EX1BSRVBBUkVdLCBbXSwgW000U0gtSU5JVC1GTl0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDEyNApBQ19GNzdfSU1QTElDSVRfTk9ORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goW0ZvcnRyYW4gNzddKWRubApfQUNfRkNfSU1QTElDSVRfTk9ORSgkQCkKQUNfTEFOR19QT1AoW0ZvcnRyYW4gNzddKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDMwCm00X2xvY2F0aW9uKF9BU19FWFBSX1BSRVBBUkUpLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDoxMTA4ClQ4LDE5OApfbTRfcWxlbm00X2RlZmluZShbbTRfcWxlbi0kMV0sCm00X2lmKG00X2luZGV4KFskMV0sIFtAXSksIFstMV0sIFttNF9sZW4oWyQxXSldLAogICAgICBbbTRfbGVuKG00X2JwYXRzdWJzdChbWyQxXV0sCgkJCSAgIFtAXChcKDw6XHw6Plx8U3xcfCU6XHxcezpcfDpcfVwpXChAXClcfCZ0QFwpXSwKCQkJICAgW1wzXSkpXSkpX200X2RlZm4oW200X3FsZW4tJDFdKQpUMTIsMzQ0CkFDX1hFTklYX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19YRU5JWF9ESVInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX01TR19DSEVDS0lORyhbZm9yIFhlbml4XSkKQUNfRUdSRVBfQ1BQKFt5ZXNdLApbI2lmIGRlZmluZWQgTV9YRU5JWCAmJiAhIGRlZmluZWQgTV9VTklYCiAgeWVzCkAlOkBlbmRpZl0sCgkgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKTsgWEVOSVg9eWVzXSwKCSAgICAgW0FDX01TR19SRVNVTFQoW25vXSk7IFhFTklYPV0pCgpBQ19IRUFERVJfRElSRU5UW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw3MgptNF9yZXZlcnNlbTRfaWYoWyQjXSwgWzBdLCBbXSwgWyQjXSwgWzFdLCBbWyQxXV0sCiAgICAgICBbJDAobTRfc2hpZnQoJEApKSwgWyQxXV0pClQyOSwzNAptNF9sb2NhdGlvbihBQ19QUk9HX01BS0VfU0VUKS4uLy4uL2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo4MTgKVDI5LDMxCm00X2xvY2F0aW9uKEFDX0NIRUNLX01FTUJFUlMpLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00OjkyMQpUMzEsNTMKX0FDX0ZJTEVfREVQRU5ERU5DWV9UUkFDRV9DT0xPTkFDX0ZJTEVfREVQRU5ERU5DWV9UUkFDRShtNF90cmFuc2xpdChbJDFdLCBbOl0sIFssXSkpClQxMywxCkFTX01FU1NBR0VfRkQ2ClQxNCwyMDEKQUNfVFJZX0NPTVBJTEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX0NPTVBJTEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1skMV1dLCBbWyQyXV0pXSwgWyQzXSwgWyQ0XSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDE1MgpBQ19MQU5HX0NQTFVTUExVU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX0NQTFVTUExVUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTEFORyhDKyspW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwzODYwCl9BQ19PVVRQVVRfSEVBREVSU19QUkVQQVJFIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19IRUFERVJTIHNlY3Rpb24uCiMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfSEVBREVSUy4KIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCmlmIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyI7IHRoZW4KZG5sIFRoaXMgYHx8JyBsaXN0IGlzIGZpbmlzaGVkIGF0IHRoZSBlbmQgb2YgX0FDX09VVFBVVF9IRUFERVJTX1BSRVBBUkUuCmNhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fApCRUdJTiB7Cl9BQ0VPRgoKIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGFuIGF3ayBzY3JpcHQgYGRlZmluZXMuYXdrJywgZW1iZWRkZWQgYXMKIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwojIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCgojIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCiMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KYWNfZGVsaW09JyUhXyEjICcKZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCiAgYWNfdHQ9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAogIGlmIHRlc3QgLXogIiRhY190dCI7IHRoZW4KICAgIGJyZWFrCiAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KICAgIEFDX01TR19FUlJPUihbY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTXSkKICBlbHNlCiAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgogIGZpCmRvbmUKCiMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAojIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKIyBuZXdsaW5lIHNlcXVlbmNlcy4KZG5sCmRubCBTdHJ1Y3R1cmUgb2YgdGhlIHNlZCBzY3JpcHQgdGhhdCByZWFkcyBjb25mZGVmcy5oOgpkbmwgcnNldDogIG1haW4gbG9vcCwgc2VhcmNoZXMgZm9yIGAjZGVmaW5lJyBsaW5lcwpkbmwgZGVmOiAgIGRlYWwgd2l0aCBhIGAjZGVmaW5lJyBsaW5lCmRubCBic25sOiAgZGVhbCB3aXRoIGEgYCNkZWZpbmUnIGxpbmUgdGhhdCBlbmRzIHdpdGggYmFja3NsYXNoLW5ld2xpbmUKZG5sIGNvbnQ6ICBoYW5kbGUgYSBjb250aW51YXRpb24gbGluZQpkbmwgYnNubGM6IGhhbmRsZSBhIGNvbnRpbnVhdGlvbiBsaW5lIHRoYXQgZW5kcyB3aXRoIGJhY2tzbGFzaC1uZXdsaW5lCmRubApkbmwgRWFjaCBzdWIgcGFydCBlc2NhcGVzIHRoZSBhd2sgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBvdXRwdXRzIGEgc3RhdGVtZW50CmRubCBpbnNlcnRpbmcgdGhlIG1hY3JvIHZhbHVlIGludG8gdGhlIGFycmF5IEQsIGtleWVkIGJ5IG5hbWUuICBJZiB0aGUgbWFjcm8KZG5sIHVzZXMgcGFyYW1ldGVycywgdGhleSBhcmUgYWRkZWQgaW4gdGhlIGFycmF5IFAsIGtleWVkIGJ5IG5hbWUuCmRubApkbmwgTG9uZyB2YWx1ZXMgYXJlIHNwbGl0IGludG8gc2V2ZXJhbCBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBoZWxwIG9mIGFjX2RlbGltLgpkbmwgQXNzdW1lIG5vYm9keSB1c2VzIG1hY3JvIG5hbWVzIG9mIG5lYXJseSAxNTAgYnl0ZXMgbGVuZ3RoLgpkbmwKZG5sIFRoZSBpbml0aWFsIHJlcGxhY2UgZm9yIGAjZGVmaW5lJyBsaW5lcyBpbnNlcnRzIGEgbGVhZGluZyBzcGFjZQpkbmwgaW4gb3JkZXIgdG8gZWFzZSBsYXRlciBtYXRjaGluZzsgb3RoZXJ3aXNlLCBvdXRwdXQgbGluZXMgbWF5IGJlCmRubCByZXBlYXRlZGx5IG1hdGNoZWQuCmRubApkbmwgbTQtZG91YmxlLXF1b3RlIG1vc3Qgb2YgdGhpcyBmb3IgWywgXSwgZGVmaW5lLCBhbmQgc3Vic3RyOgpbCmFjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCnNlZCAtbiAnCnMvLlx7XV9BQ19BV0tfTElURVJBTF9MSU1JVFtcfS8mJyIkYWNfZGVsaW0iJy9nCnQgcnNldAo6cnNldApzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwp0IGRlZgpkCjpkZWYKcy9cXCQvLwp0IGJzbmwKcy9bIlxcXS9cXCYvZwpzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKRFsiXDEiXT0iIFwzIi9wCnMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCmQKOmJzbmwKcy9bIlxcXS9cXCYvZwpzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCnQgY29udApzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAp0IGNvbnQKZAo6Y29udApuCnMvLlx7XV9BQ19BV0tfTElURVJBTF9MSU1JVFtcfS8mJyIkYWNfZGVsaW0iJy9nCnQgY2xlYXIKOmNsZWFyCnMvXFwkLy8KdCBic25sYwpzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKZAo6YnNubGMKcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCmIgY29udAonIDxjb25mZGVmcy5oIHwgc2VkICcKcy8nIiRhY19kZWxpbSInLyJcXFwKIi9nJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQoKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiAgZm9yIChrZXkgaW4gRCkgRF9pc19zZXRba2V5XSA9IDEKICBGUyA9ICIHIgp9Ci9eW1x0IF0qI1tcdCBdKihkZWZpbmV8dW5kZWYpW1x0IF0rJGFjX3dvcmRfcmUoW1x0IChdfFwkKS8gewogIGxpbmUgPSBcJCAwCiAgc3BsaXQobGluZSwgYXJnLCAiICIpCiAgaWYgKGFyZ1sxXSA9PSAiIyIpIHsKICAgIGRlZnVuZGVmID0gYXJnWzJdCiAgICBtYWMxID0gYXJnWzNdCiAgfSBlbHNlIHsKICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKICAgIG1hYzEgPSBhcmdbMl0KICB9CiAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQogIG1hY3JvID0gbWFjMlsxXQogIHByZWZpeCA9IHN1YnN0cihsaW5lLCAxLCBpbmRleChsaW5lLCBkZWZ1bmRlZikgLSAxKQogIGlmIChEX2lzX3NldFttYWNyb10pIHsKICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCiAgICBwcmludCBwcmVmaXggImRlZmluZSIsIG1hY3JvIFBbbWFjcm9dIERbbWFjcm9dCiAgICBuZXh0CiAgfSBlbHNlIHsKICAgICMgUmVwbGFjZSAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSwKICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgogICAgaWYgKGRlZnVuZGVmID09ICJ1bmRlZiIpIHsKICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgogICAgICBuZXh0CiAgICB9CiAgfQp9CnsgcHJpbnQgfQpdZG5sIEVuZCBvZiBkb3VibGUtcXVvdGVkIHNlY3Rpb24KX0FDQVdLCl9BQ0VPRgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCmRubCBmaW5pc2ggYHx8JyBsaXN0IGluZGljYXRpbmcgd3JpdGUgZXJyb3I6CiAgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5XSkKZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCgoKVDE3LDIwNDMKX0FDX0xJQk9CSl9BTExPQ0EjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwojIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCiMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgpBQ19MSUJTT1VSQ0VTKGFsbG9jYS5jKQpBQ19TVUJTVChbQUxMT0NBXSwgW1wke0xJQk9CSkRJUn1hbGxvY2EuJGFjX29iamV4dF0pZG5sCkFDX0RFRklORShDX0FMTE9DQSwgMSwgW0RlZmluZSB0byAxIGlmIHVzaW5nIGBhbGxvY2EuYycuXSkKCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzLCBhY19jdl9vc19jcmF5LApbQUNfRUdSRVBfQ1BQKHdlYmVjcmF5LApbI2lmIGRlZmluZWQgQ1JBWSAmJiAhIGRlZmluZWQgQ1JBWTIKd2ViZWNyYXkKI2Vsc2UKd2Vub3RiZWNyYXkKI2VuZGlmCl0sIGFjX2N2X29zX2NyYXk9eWVzLCBhY19jdl9vc19jcmF5PW5vKV0pCmlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KICBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCiAgICBBQ19DSEVDS19GVU5DKCRhY19mdW5jLAoJCSAgW0FDX0RFRklORV9VTlFVT1RFRChDUkFZX1NUQUNLU0VHX0VORCwgJGFjX2Z1bmMsCgkJCQkgICAgICBbRGVmaW5lIHRvIG9uZSBvZiBgX2dldGI2NycsIGBHRVRCNjcnLAoJCQkJICAgICAgIGBnZXRiNjcnIGZvciBDcmF5LTIgYW5kIENyYXktWU1QCgkJCQkgICAgICAgc3lzdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IKCQkJCSAgICAgICBgYWxsb2NhLmMnIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy5dKQogICAgYnJlYWtdKQogIGRvbmUKZmkKCkFDX0NBQ0hFX0NIRUNLKFtzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhXSwKCSAgICAgICBbYWNfY3ZfY19zdGFja19kaXJlY3Rpb25dLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoCltBQ19JTkNMVURFU19ERUZBVUxUCmludApmaW5kX3N0YWNrX2RpcmVjdGlvbiAoaW50ICphZGRyLCBpbnQgZGVwdGgpCnsKICBpbnQgZGlyLCBkdW1teSA9IDA7CiAgaWYgKCEgYWRkcikKICAgIGFkZHIgPSAmZHVtbXk7CiAgKmFkZHIgPSBhZGRyIDwgJmR1bW15ID8gMSA6IGFkZHIgPT0gJmR1bW15ID8gMCA6IC0xOwogIGRpciA9IGRlcHRoID8gZmluZF9zdGFja19kaXJlY3Rpb24gKGFkZHIsIGRlcHRoIC0gMSkgOiAwOwogIHJldHVybiBkaXIgKyBkdW1teTsKfQoKaW50Cm1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKewogIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoMCwgYXJnYyArICFhcmd2ICsgMjApIDwgMDsKfV0pXSwKCSAgICAgICBbYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MV0sCgkgICAgICAgW2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xXSwKCSAgICAgICBbYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MF0pXSkKQUhfVkVSQkFUSU0oW1NUQUNLX0RJUkVDVElPTl0sClsvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCiAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW50aW1lLgoJU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwoJU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCglTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAqLwpAJTpAdW5kZWYgU1RBQ0tfRElSRUNUSU9OXSlkbmwKQUNfREVGSU5FX1VOUVVPVEVEKFNUQUNLX0RJUkVDVElPTiwgJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uKQoKVDIwLDY4CkFDX0xBTkdfUFJFUFJPQyhDKyspX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYQ1BQXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDQwLDMwCm00X2xvY2F0aW9uKF9BU19WRVJTSU9OX0NPTVBBUkVfUFJFUEFSRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjE2OTcKVDI3LDM0Cm00X2xvY2F0aW9uKEFDX0NBQ0hFX0NIRUNLKS4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTIKVDE5LDM0CkFDX0xBTkdfUFJPR1JBTShHbylwYWNrYWdlIG1haW4KJDEKZnVuYyBtYWluKCkgewokMgp9ClQzMCwzMAptNF9sb2NhdGlvbihBU19MSU5FTk9fUFJFUEFSRSkuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjExNjYKVDEwLDI5NApfbTRfZXNjYXBlbTRfY2hhbmdlcXVvdGUoWy09PHsoXSxbKX0+PS1dKW00X2JwYXRzdWJzdChtNF9icGF0c3Vic3QobTRfYnBhdHN1YnN0KG00X2JwYXRzdWJzdCgKCSAgLT08eygtPTx7KC09PHsoLT08eygtPTx7KCQxKX0+PS0pfT49LSl9Pj0tKX0+PS0pfT49LSwKCS09PHsoIyl9Pj0tLCAtPTx7KEAlOkApfT49LSksCiAgICAgIC09PHsoXFspfT49LSwgLT08eyhAPDpAKX0+PS0pLAogICAgLT08eyhcXSl9Pj0tLCAtPTx7KEA6PkApfT49LSksCiAgLT08eyhcJCl9Pj0tLCAtPTx7KEBTfEApfT49LSltNF9jaGFuZ2VxdW90ZShbLF0pClQxNiw1NQpfbTRfZGl2ZXJ0X3N0YWNrLi4vLi4vbGliL200c3VnYXIvbTRzdWdhci5tNDozMjU5OiBtNF9kaXZlcnRfcHVzaDogS0lMTApUMTUsMTg4NQpfQUNfUFJPR19DQ19DODlfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0NfU1REX1RSWShbYzg5XSwKW1sjaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgpzdHJ1Y3Qgc3RhdDsKLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwpzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CkZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CnN0YXRpYyBjaGFyICplIChwLCBpKQogICAgIGNoYXIgKipwOwogICAgIGludCBpOwp7CiAgcmV0dXJuIHBbaV07Cn0Kc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQp7CiAgY2hhciAqczsKICB2YV9saXN0IHY7CiAgdmFfc3RhcnQgKHYscCk7CiAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKICB2YV9lbmQgKHYpOwogIHJldHVybiBzOwp9CgovKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcwogICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCiAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAogICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CiAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCiAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKCi8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycwogICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCiNkZWZpbmUgRk9PKHgpICd4JwppbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKCmludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwpzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CmludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwppbnQgYXJnYzsKY2hhciAqKmFyZ3Y7XV0sCltbcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdO11dLApkbmwgRG9uJ3QgdHJ5IGdjYyAtYW5zaTsgdGhhdCB0dXJucyBvZmYgdXNlZnVsIGV4dGVuc2lvbnMgYW5kCmRubCBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCmRubCBBSVggY2lyY2EgMjAwMwktcWxhbmdsdmw9ZXh0Yzg5CmRubCBvbGQgQUlYCQktcWxhbmdsdmw9YW5zaQpkbmwgVWx0cml4LCBPU0YvMSwgVHJ1NjQJLXN0ZApkbmwgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQpkbmwgSFAtVVggb2xkZXIgdmVyc2lvbnMJLUFhIC1EX0hQVVhfU09VUkNFCmRubCBTVlI0CQkJLVhjIC1EX19FWFRFTlNJT05TX18KWy1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCgktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIl0sIFskMV0sIFskMl0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSw1NApBU19WQVJfQ09QWUFTX0xJVEVSQUxfV09SRF9JRihbJDFbXSQyXSwgWyQxPSQkMl0sIFtldmFsICQxPVwkJDJdKQpUMjksMzEKbTRfbG9jYXRpb24oQUNfQ19MT05HX0RPVUJMRSkuLi8uLi9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NDUyCkYzLDMKbGVubGVuClQyOSwzMwptNF9sb2NhdGlvbihBQ19IRUFERVJfUkVTT0xWKS4uLy4uL2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjU0MwpUMTcsMjI5Cm00X2NyX25vdF9sZXR0ZXJzAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2B7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTUsMTcyOQpBQ19QUk9HX01LRElSX1BfbTRfZGVmdW5fb25jZShbQUNfUFJPR19NS0RJUl9QXSwgW0FDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKWRubApBQ19SRVFVSVJFX0FVWF9GSUxFKFtpbnN0YWxsLXNoXSlkbmwKQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcF0pCmlmIHRlc3QgLXogIiRNS0RJUl9QIjsgdGhlbgogIEFDX0NBQ0hFX1ZBTChbYWNfY3ZfcGF0aF9ta2Rpcl0sCiAgICBbX0FTX1BBVEhfV0FMSyhbJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW5dLAogICAgICBbZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbwoJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwoJICAgQVNfRVhFQ1VUQUJMRV9QKFsiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCJdKSB8fCBjb250aW51ZQoJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAoJICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAoJICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCgkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKCSAgICAgICBicmVhayAzOzsKCSAgIGVzYWMKCSBkb25lCiAgICAgICBkb25lXSldKQogIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgogIGVsc2UKICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCiAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCiAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKICBmaQpmaQpkbmwgc3RhdHVzLm00IGRvZXMgc3BlY2lhbCBtYWdpYyBmb3IgTUtESVJfUCBpbnN0ZWFkIG9mIEFDX1NVQlNULApkbmwgdG8gZ2V0IHJlbGF0aXZlIG5hbWVzIHJpZ2h0LiAgSG93ZXZlciwgYWxzbyBBQ19TVUJTVCBoZXJlIHNvCmRubCB0aGF0IEF1dG9tYWtlIHZlcnNpb25zIGJlZm9yZSAxLjEwIHdpbGwgcGljayBpdCB1cCAodGhleSBkbyBub3QKZG5sIHRyYWNlIEFDX1NVQlNUX1RSQUNFKS4KZG5sIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgQXV0b21ha2UgPCAxLjEwLgpBQ19TVUJTVChbTUtESVJfUF0pZG5sCkFDX01TR19SRVNVTFQoWyRNS0RJUl9QXSkKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX1BST0dfTUtESVJfUF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX1BST0dfTUtESVJfUF0pXV0sCm00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFtBQ19QUk9HX01LRElSX1BdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19QUk9HX01LRElSX1BdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQxMiwxNTIKQUNfRFlOSVhfU0VRX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0RZTklYX1NFUScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfRlVOQ19HRVRNTlRFTlRbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDM0Cm00X2xvY2F0aW9uKEFDX0ZDX1BQX1NSQ0VYVCkuLi8uLi9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMjQwClQ2LDE1OApwb3BkZWZtNF9pZihbJCNdLCBbMF0sIFtbJDBdXSwKICAgICAgIFskI10sIFsxXSwgW200X2lmZGVmKFskMV0sIFtfbTRfcG9wZGVmKFskMV0pXSwKCQkJICAgIFttNF9mYXRhbChbJDA6IHVuZGVmaW5lZCBtYWNybzogJDFdKV0pXSwKICAgICAgIFttNF9tYXBfYXJncyhbJDBdLCAkQCldKQpUMjIsMzUKbTRfbG9jYXRpb24oQUNfQUxMT0NBKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6NDE3ClQxOSwzNAptNF9sb2NhdGlvbihBQ19BSVgpLi4vLi4vbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQzNgpUNDIsMjcKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihPYmplY3RpdmUgQykpLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6ODUzClQxNywxMTcKbTRfaW5jbHVkZV91bmlxdWVtNF9pZmRlZihbbTRfaW5jbHVkZSgkMSldLAoJICBbbTRfd2Fybihbc3ludGF4XSwgW2ZpbGUgYCQxJyBpbmNsdWRlZCBzZXZlcmFsIHRpbWVzXSldKWRubAptNF9kZWZpbmUoW200X2luY2x1ZGUoJDEpXSkKVDIxLDMKX200X2RpdmVydChIRUxQX1dJVEgpMTAzClQxOSw4NQpfQUNfQ0hFQ0tfREVDTF9PTkNFQUNfREVGVU4oW19BQ19DaGVja19EZWNsXyQxXSwgW19BQ19DSEVDS19ERUNMUyhbJDFdKV0pQUNfUkVRVUlSRShbX0FDX0NoZWNrX0RlY2xfJDFdKQpUMjksMgpBQ19MQU5HX1NPVVJDRShPYmplY3RpdmUgQysrKSQxClQxMSwzNDUKQUNfQVJHX1dJVEhfbTRfZGVmdW5fcHJvKFskMF0pQUNfUFJPVklERV9JRkVMU0UoW0FDX1BSRVNFUlZFX0hFTFBfT1JERVJdLApbXSwKW200X2RpdmVydF9vbmNlKFtIRUxQX1dJVEhdLCBbWwpPcHRpb25hbCBQYWNrYWdlczoKICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pXV0pXSkKbTRfZGl2ZXJ0X29uY2UoW0hFTFBfV0lUSF0sIFskMl0pZG5sCl9BQ19FTkFCTEVfSUYoW3dpdGhdLCBbJDFdLCBbJDNdLCBbJDRdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsNzcKbTRfc3RyaXBtNF9icGF0c3Vic3RzKFskMSBdLAoJICAgICAgIFtbCSBdK10sIFsgXSwKCSAgICAgICBbXi4gP1woLipcKSAuJF0sIFtbW1wxXV1dKQpUOSw0Cm00X2RxdW90ZVskQF0KVDExLDg3CkFDX1JFVklTSU9ObTRfZGl2ZXJ0X3RleHQoW0hFQURFUi1SRVZJU0lPTl0sCgkJW0AlOkAgRnJvbSBfX2ZpbGVfXyBtNF90cmFuc2xpdChbJDFdLCBbJCIiXSkuXSlkbmwKClQyNCwxNgpBQ19MQU5HX0RFRklORVNfUFJPVklERURtNF9kZWZpbmUoW18kMF0pClQyMyw2MzgKQUNfRVJMQU5HX1NVQlNUX0xJQl9ESVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfRVJMQU5HX05FRURfRVJMQ10pW11kbmwKQUNfUkVRVUlSRShbQUNfRVJMQU5HX05FRURfRVJMXSlbXWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIEVybGFuZy9PVFAgbGlicmFyeSBiYXNlIGRpcmVjdG9yeV0sCiAgICBbYWNfY3ZfZXJsYW5nX2xpYl9kaXJdLAogICAgW0FDX0xBTkdfUFVTSChFcmxhbmcpW11kbmwKICAgICBBQ19SVU5fSUZFTFNFKAoJW0FDX0xBTkdfUFJPR1JBTShbXSwgW2RubAoJICAgIExpYkRpciA9IGNvZGU6bGliX2RpcigpLAoJICAgIGZpbGU6d3JpdGVfZmlsZSgiY29uZnRlc3Qub3V0IiwgTGliRGlyKSwKCSAgICBSZXR1cm5WYWx1ZSA9IDAsCgkgICAgaGFsdChSZXR1cm5WYWx1ZSldKV0sCglbYWNfY3ZfZXJsYW5nX2xpYl9kaXI9YGNhdCBjb25mdGVzdC5vdXRgCgkgcm0gLWYgY29uZnRlc3Qub3V0XSwKCVtybSAtZiBjb25mdGVzdC5vdXQKCSBBQ19NU0dfRkFJTFVSRShbdGVzdCBFcmxhbmcgcHJvZ3JhbSBleGVjdXRpb24gZmFpbGVkXSldKQogICAgIEFDX0xBTkdfUE9QKEVybGFuZylbXWRubAogICAgXSkKQUNfU1VCU1QoW0VSTEFOR19MSUJfRElSXSwgWyRhY19jdl9lcmxhbmdfbGliX2Rpcl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxMDIKbTRfcmVnZXhwbTRfZXhwYW5kX29uY2UoW200X3dhcm4oW3N5bnRheF0sCgkJIFtkbyBub3QgdXNlIG00X3JlZ2V4cDogdXNlIHJlZ2V4cCBvciBtNF9icmVnZXhwXSldKWRubApyZWdleHAoJEApClQyMywxMjM0CkFDX0ZVTkNfU0VMRUNUX0FSR1RZUEVTX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX0hFQURFUlMoc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCkKQUNfQ0FDSEVfQ0hFQ0soW3R5cGVzIG9mIGFyZ3VtZW50cyBmb3Igc2VsZWN0XSwKW2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3NdLApbZm9yIGFjX2FyZzIzNCBpbiAnZmRfc2V0IConICdpbnQgKicgJ3ZvaWQgKic7IGRvCiBmb3IgYWNfYXJnMSBpbiAnaW50JyAnc2l6ZV90JyAndW5zaWduZWQgbG9uZyBpbnQnICd1bnNpZ25lZCBpbnQnOyBkbwogIGZvciBhY19hcmc1IGluICdzdHJ1Y3QgdGltZXZhbCAqJyAnY29uc3Qgc3RydWN0IHRpbWV2YWwgKic7IGRvCiAgIEFDX0NPTVBJTEVfSUZFTFNFKAogICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKW0FDX0lOQ0xVREVTX0RFRkFVTFQKI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICiMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKXSwKCQkJW2V4dGVybiBpbnQgc2VsZWN0ICgkYWNfYXJnMSwKCQkJCQkgICAgJGFjX2FyZzIzNCwgJGFjX2FyZzIzNCwgJGFjX2FyZzIzNCwKCQkJCQkgICAgJGFjX2FyZzUpO10pXSwKCSAgICAgIFthY19jdl9mdW5jX3NlbGVjdF9hcmdzPSIkYWNfYXJnMSwkYWNfYXJnMjM0LCRhY19hcmc1IjsgYnJlYWsgM10pCiAgZG9uZQogZG9uZQpkb25lCiMgUHJvdmlkZSBhIHNhZmUgZGVmYXVsdCB2YWx1ZS4KOiAiJHthY19jdl9mdW5jX3NlbGVjdF9hcmdzPWludCxpbnQgKixzdHJ1Y3QgdGltZXZhbCAqfSIKXSkKYWNfc2F2ZV9JRlM9JElGUzsgSUZTPScsJwpzZXQgZHVtbXkgYGVjaG8gIiRhY19jdl9mdW5jX3NlbGVjdF9hcmdzIiB8IHNlZCAncy9cKi9cKi9nJ2AKSUZTPSRhY19zYXZlX0lGUwpzaGlmdApBQ19ERUZJTkVfVU5RVU9URUQoU0VMRUNUX1RZUEVfQVJHMSwgJFsxXSwKCQkgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZyAxIGZvciBgc2VsZWN0Jy5dKQpBQ19ERUZJTkVfVU5RVU9URUQoU0VMRUNUX1RZUEVfQVJHMjM0LCAoJFsyXSksCgkJICAgW0RlZmluZSB0byB0aGUgdHlwZSBvZiBhcmdzIDIsIDMgYW5kIDQgZm9yIGBzZWxlY3QnLl0pCkFDX0RFRklORV9VTlFVT1RFRChTRUxFQ1RfVFlQRV9BUkc1LCAoJFszXSksCgkJICAgW0RlZmluZSB0byB0aGUgdHlwZSBvZiBhcmcgNSBmb3IgYHNlbGVjdCcuXSkKcm0gLWYgY29uZnRlc3QqCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMzIKbTRfbG9jYXRpb24oQUNfU1RSVUNUX1RNKS4uLy4uL2xpYi9hdXRvY29uZi90eXBlcy5tNDoxMDI2ClQyOSwzNQptNF9sb2NhdGlvbihBQ19SRVBMQUNFX0ZVTkNTKS4uLy4uL2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTMyClQxOCwxODgKQUNfRVJMQU5HX05FRURfRVJMX200X2RlZnVuX3BybyhbJDBdKUFDX0VSTEFOR19QQVRIX0VSTChbbm90IGZvdW5kXSwgWyQxXSkKaWYgdGVzdCAiJEVSTCIgPSAibm90IGZvdW5kIjsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtFcmxhbmcvT1RQIGludGVycHJldGVyIChlcmwpIG5vdCBmb3VuZCBidXQgcmVxdWlyZWRdKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRC0xLDAKCiMgRW5kIG9mIGZyb3plbiBzdGF0ZSBmaWxlCg==