ZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBjMjk1MzE1Li45MzkyY2YyIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0xNDYsNiArMTQ2LDcgQEAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMklbXSA9ICJ5dXY0MjJpLXl1eXYiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwUFtdICA9ICJ5dXY0MjBwIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQjU2NVtdID0gInJnYjU2NSI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0JBODg4OFtdID0gInJnYmE4ODg4IjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX0pQRUdbXSA9ICJqcGVnIjsKIAogLy8gVmFsdWVzIGZvciBmb2N1cyBtb2RlIHNldHRpbmdzLgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMTI2MmZhLi5jYTc3MTg1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtNjYsNiArNjYsNyBAQAogc3RhdGljIGxvbmcgZ01heE51bUZyYW1lczsgIC8vIDAgbWVhbnMgZGVjb2RlIGFsbCBhdmFpbGFibGUuCiBzdGF0aWMgbG9uZyBnUmVwcm9kdWNlQnVnOyAgLy8gaWYgbm90IC0xLgogc3RhdGljIGJvb2wgZ1ByZWZlclNvZnR3YXJlQ29kZWM7CitzdGF0aWMgYm9vbCBnRm9yY2VUb1VzZUhhcmR3YXJlQ29kZWM7CiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOwpAQCAtMTQ0LDEwICsxNDUsMTggQEAKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCBtaW1lKSkgewogICAgICAgICByYXdTb3VyY2UgPSBzb3VyY2U7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKGdQcmVmZXJTb2Z0d2FyZUNvZGVjKSB7CisgICAgICAgICAgICBmbGFncyB8PSBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOworICAgICAgICB9CisgICAgICAgIGlmIChnRm9yY2VUb1VzZUhhcmR3YXJlQ29kZWMpIHsKKyAgICAgICAgICAgIENIRUNLKCFnUHJlZmVyU29mdHdhcmVDb2RlYyk7CisgICAgICAgICAgICBmbGFncyB8PSBPTVhDb2RlYzo6a0hhcmR3YXJlQ29kZWNzT25seTsKKyAgICAgICAgfQogICAgICAgICByYXdTb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAogICAgICAgICAgICAgY2xpZW50LT5pbnRlcmZhY2UoKSwgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywgc291cmNlLAogICAgICAgICAgICAgTlVMTCAvKiBtYXRjaENvbXBvbmVudE5hbWUgKi8sCi0gICAgICAgICAgICBnUHJlZmVyU29mdHdhcmVDb2RlYyA/IE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwLAorICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICBnU3VyZmFjZSk7CiAKICAgICAgICAgaWYgKHJhd1NvdXJjZSA9PSBOVUxMKSB7CkBAIC01NDUsNiArNTU0LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcChyb2ZpbGVzKSBkdW1wIGRlY29kZXIgcHJvZmlsZXMgc3VwcG9ydGVkXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdChodW1ibmFpbCkgZXh0cmFjdCB2aWRlbyB0aHVtYm5haWwgb3IgYWxidW0gYXJ0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdyhyaXRlKSBmaWxlbmFtZSAod3JpdGUgdG8gLm1wNCBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWsgc2VlayB0ZXN0XG4iKTsKQEAgLTU2Niw2ICs1NzYsNyBAQAogICAgIGdNYXhOdW1GcmFtZXMgPSAwOwogICAgIGdSZXByb2R1Y2VCdWcgPSAtMTsKICAgICBnUHJlZmVyU29mdHdhcmVDb2RlYyA9IGZhbHNlOworICAgIGdGb3JjZVRvVXNlSGFyZHdhcmVDb2RlYyA9IGZhbHNlOwogICAgIGdQbGF5YmFja0F1ZGlvID0gZmFsc2U7CiAgICAgZ1dyaXRlTVA0ID0gZmFsc2U7CiAgICAgZ0Rpc3BsYXlIaXN0b2dyYW0gPSBmYWxzZTsKQEAgLTU3NSw3ICs1ODYsNyBAQAogICAgIHNwPExpdmVTZXNzaW9uPiBsaXZlU2Vzc2lvbjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c293Omt4UyIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c3JvdzpreFMiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC02MzYsNiArNjQ3LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdGb3JjZVRvVXNlSGFyZHdhcmVDb2RlYyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGdQbGF5YmFja0F1ZGlvID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IGQ0MzBmNzIuLjA3YjNiNDcgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtNTMsMTEgKzUzLDExIEBACiB9CiAKIEZ3ZExvY2tFbmdpbmU6OkZ3ZExvY2tFbmdpbmUoKSB7Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZSBDb25zdHJ1Y3Rpb24iKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lIENvbnN0cnVjdGlvbiIpOwogfQogCiBGd2RMb2NrRW5naW5lOjp+RndkTG9ja0VuZ2luZSgpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lIERlc3RydWN0aW9uIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZSBEZXN0cnVjdGlvbiIpOwogCiAgICAgY29udmVydFNlc3Npb25NYXAuZGVzdHJveU1hcCgpOwogICAgIGRlY29kZVNlc3Npb25NYXAuZGVzdHJveU1hcCgpOwpAQCAtOTEsNyArOTEsNyBAQAogRHJtQ29uc3RyYWludHMqIEZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKSB7CiAgICAgRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzID0gTlVMTDsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzIik7CiAKICAgICBpZiAoTlVMTCAhPSBwYXRoICYmCiAgICAgICAgIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCA9PSBvbkNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCAqcGF0aCwgYWN0aW9uKSkpIHsKQEAgLTEwNSw3ICsxMDUsNyBAQAogRHJtTWV0YWRhdGEqIEZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CiAgICAgRHJtTWV0YWRhdGEqIGRybU1ldGFkYXRhID0gTlVMTDsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhIik7CiAKICAgICBpZiAoTlVMTCAhPSBwYXRoKSB7CiAgICAgICAgIC8vIFJldHVybnMgZW1wdHkgbWV0YWRhdGEgdG8gc2hvdyBubyBlcnJvciBjb25kaXRpb24uCkBAIC0xMTYsMTEgKzExNiwxMSBAQAogfQogCiBhbmRyb2lkOjpzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIik7CiAKIAogICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7Ci0gICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBzdWNjZWVkZWQiKTsKKyAgICAgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIC0tIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uIHN1Y2NlZWRlZCIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBmYWlsZWQ6IgogICAgICAgICAgICAgICJlcnJubyA9ICVkIiwgZXJybm8pOwpAQCAtMTMyLDEzICsxMzIsMTMgQEAKIGFuZHJvaWQ6OnN0YXR1c190CiBGd2RMb2NrRW5naW5lOjpvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcikgewogICAgIC8vIE5vdCB1c2VkCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lciIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0T25JbmZvTGlzdGVuZXIiKTsKIAogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIGFuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlKGludCB1bmlxdWVJZCkgewotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUiKTsKIAogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKIERybVN1cHBvcnRJbmZvKiBGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCkgewogICAgIERybVN1cHBvcnRJbmZvKiBwU3VwcG9ydEluZm8gPSBuZXcgRHJtU3VwcG9ydEluZm8oKTsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0U3VwcG9ydEluZm8iKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvIik7CiAKICAgICAvLyBmaWxsIGFsbCBGb3J3YXJkIExvY2sgbWltZXR5cGVzIGFuZCBleHRlbnNpb25zCiAgICAgaWYgKE5VTEwgIT0gcFN1cHBvcnRJbmZvKSB7CkBAIC0xODIsNyArMTgyLDcgQEAKIAogICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cygoaW50KURybUluZm9TdGF0dXM6OlNUQVRVU19PSywgMCwgTlVMTCwgU3RyaW5nOCgiIikpOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Qcm9jZXNzRHJtSW5mbyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uUHJvY2Vzc0RybUluZm8iKTsKIAogICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOwogfQpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKICAgICAvLyBObyByaWdodHMgdG8gc2F2ZS4gUmV0dXJuCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TYXZlUmlnaHRzIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25TYXZlUmlnaHRzIik7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOwogfQogCkBAIC0yMDEsNyArMjAxLDcgQEAKICAgICBEcm1JbmZvKiBkcm1JbmZvID0gTlVMTDsKIAogICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgRm9yd2FyZCBMb2NrIGZpbGUKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkFjcXVpcmVEcm1JbmZvIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25BY3F1aXJlRHJtSW5mbyIpOwogCiAgICAgcmV0dXJuIGRybUluZm87CiB9CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pIHsKICAgICBpbnQgcmVzdWx0ID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkNoZWNrUmlnaHRzU3RhdHVzIik7CiAKICAgICAvLyBPbmx5IFRyYW5zZmVyIGFjdGlvbiBpcyBub3QgYWxsb3dlZCBmb3IgZm9yd2FyZCBMb2NrIGZpbGVzLgogICAgIGlmIChvbkNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCkpIHsKQEAgLTI0MSw3ICsyNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKSB7CiAgICAgLy8gTm8gcmlnaHRzIGNvbnN1bXB0aW9uCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzIik7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIApAQCAtMjQ5LDE0ICsyNDksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25WYWxpZGF0ZUFjdGlvbiIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uVmFsaWRhdGVBY3Rpb24iKTsKIAogICAgIC8vIEZvciB0aGUgZm9yd2FyZGxvY2sgZW5naW5lIGNoZWNrUmlnaHRzIGFuZCBWYWxpZGF0ZUFjdGlvbiBhcmUgdGhlIHNhbWUuCiAgICAgcmV0dXJuIChvbkNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pID09IFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEKTsKIH0KIAogU3RyaW5nOCBGd2RMb2NrRW5naW5lOjpvbkdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXRPcmlnaW5hbE1pbWVUeXBlIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25HZXRPcmlnaW5hbE1pbWVUeXBlIik7CiAgICAgU3RyaW5nOCBtaW1lU3RyaW5nID0gU3RyaW5nOCgiIik7CiAgICAgaW50IGZpbGVEZXNjID0gRndkTG9ja0ZpbGVfb3BlbihwYXRoLnN0cmluZygpKTsKIApAQCAtMjgwLDcgKzI4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgU3RyaW5nOCBtaW1lU3RyID0gU3RyaW5nOChtaW1lVHlwZSk7CiAKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUiKTsKIAogICAgIG1pbWVTdHIudG9Mb3dlcigpOwogCkBAIC0zMDEsMTMgKzMwMSwxMyBAQAogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKICAgICAvLyBObyBSaWdodHMgdG8gcmVtb3ZlCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVSaWdodHMiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyIpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgewogICAgIC8vIE5vIHJpZ2h0cyB0byByZW1vdmUKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZUFsbFJpZ2h0cyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlQWxsUmlnaHRzIik7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIApAQCAtMzE5LDE0ICszMTksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKICNlbmRpZgogICAgIC8vIE5vdCB1c2VkCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb252ZXJ0SWQpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5Db252ZXJ0U2Vzc2lvbiIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIik7CiAgICAgaWYgKCFjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgewogICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqbmV3U2Vzc2lvbiA9IG5ldyBDb252ZXJ0U2Vzc2lvbigpOwogICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09CkBAIC0zODMsNyArMzgzLDcgQEAKICAgICBEcm1CdWZmZXIgKmNvbnZSZXN1bHQgPSBuZXcgRHJtQnVmZmVyKE5VTEwsIDApOwogICAgIGludCBvZmZzZXQgPSAtMTsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbiIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbiIpOwogCiAgICAgaWYgKGNvbnZlcnRTZXNzaW9uTWFwLmlzQ3JlYXRlZChjb252ZXJ0SWQpKSB7CiAgICAgICAgIENvbnZlcnRTZXNzaW9uICpjb252U2Vzc2lvbiA9IGNvbnZlcnRTZXNzaW9uTWFwLmdldFZhbHVlKGNvbnZlcnRJZCk7CkBAIC00MjQsNyArNDI0LDcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBpbnQgZmlsZURlc2MgPSAtMTsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24iKTsKIAogICAgIGlmICgoLTEgPCBmZCkgJiYKICAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKQEAgLTQ1NSwxMiArNDU1LDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBJbnRlZ3JpdHkgQ2hlY2sgZmFpbGVkIGZvciB0aGUgZmQiKTsKICAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChmaWxlRGVzYyk7Ci0gICAgICAgICAgICA6OmNsb3NlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNvZGVTZXNzaW9uOwogICAgICAgICB9CiAgICAgfQogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gRXhpdC4gcmVzdWx0ID0gJWQiLCByZXN1bHQpOworICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0ICYmIC0xIDwgZmlsZURlc2MpIHsKKyAgICAgICAgOjpjbG9zZShmaWxlRGVzYyk7CisgICAgfQorCisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gRXhpdC4gcmVzdWx0ID0gJWQiLCByZXN1bHQpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ5Nyw3ICs1MDAsNyBAQAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CiAKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKQEAgLTUwOSw3ICs1MTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIEV4aXQiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTUxNywxMyArNTIwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOwogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKQEAgLTUzMiwxNCArNTM1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyKSB7Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0Iik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0Iik7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOwogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCBkYzVmYzg0Li44M2Q0ZjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAvLyBkaXJlY3Rpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSByb3RhdGlvbiBvciBtaXJyb3Jpbmcgb2YKICAgICAvLyBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OLiBDb29yZGluYXRlcyByYW5nZSBmcm9tIC0xMDAwIHRvIDEwMDAuCiAgICAgLy8gKC0xMDAwLC0xMDAwKSBpcyB0aGUgdXBwZXIgbGVmdCBwb2ludC4gKDEwMDAsIDEwMDApIGlzIHRoZSBsb3dlciByaWdodAotICAgIC8vIHBvaW50LiBUaGUgbGVuZ3RoIGFuZCB3aWR0aCBvZiBmb2N1cyBhcmVhcyBjYW5ub3QgYmUgMCBvciBuZWdhdGl2ZS4KKyAgICAvLyBwb2ludC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgZm9jdXMgYXJlYXMgY2Fubm90IGJlIDAgb3IgbmVnYXRpdmUuCiAgICAgLy8KICAgICAvLyBUaGUgZmlmdGggZWxlbWVudCBpcyB0aGUgd2VpZ2h0LiBWYWx1ZXMgZm9yIHdlaWdodCBtdXN0IHJhbmdlIGZyb20gMSB0bwogICAgIC8vIDEwMDAuICBUaGUgd2VpZ2h0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHBlci1waXhlbCB3ZWlnaHQgLSBhbGwKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgIC8vIGRpcmVjdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHJvdGF0aW9uIG9yIG1pcnJvcmluZyBvZgogICAgIC8vIENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04uIENvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUgcmFuZ2UKICAgICAvLyBmcm9tIC0xMDAwIHRvIDEwMDAuICgtMTAwMCwgLTEwMDApIGlzIHRoZSB1cHBlciBsZWZ0IHBvaW50LiAoMTAwMCwgMTAwMCkKLSAgICAvLyBpcyB0aGUgbG93ZXIgcmlnaHQgcG9pbnQuIFRoZSBsZW5ndGggYW5kIHdpZHRoIG9mIG1ldGVyaW5nIGFyZWFzIGNhbm5vdAorICAgIC8vIGlzIHRoZSBsb3dlciByaWdodCBwb2ludC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgbWV0ZXJpbmcgYXJlYXMgY2Fubm90CiAgICAgLy8gYmUgMCBvciBuZWdhdGl2ZS4KICAgICAvLwogICAgIC8vIFRoZSBmaWZ0aCBlbGVtZW50IGlzIHRoZSB3ZWlnaHQuIFZhbHVlcyBmb3Igd2VpZ2h0IG11c3QgcmFuZ2UgZnJvbSAxIHRvCkBAIC01NTAsNiArNTUwLDcgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfWVVWNDIySVtdOyAvLyBZVVkyCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMFBbXTsgLy8gWVYxMgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9SR0I1NjVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfUkdCQTg4ODhbXTsKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfSlBFR1tdOwogCiAgICAgLy8gVmFsdWVzIGZvciBmb2N1cyBtb2RlIHNldHRpbmdzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IGJhYWIyZTguLjYwNTY4MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAqIHNhbXBsZVJhdGU6ICAgICAgICAgVHJhY2sgc2FtcGxpbmcgcmF0ZSBpbiBIei4KICAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdCAoZS5nIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGZvciBzaWduZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIDE2IGJpdHMgcGVyIHNhbXBsZSkuCi0gICAgICogY2hhbm5lbHM6ICAgICAgICAgICBDaGFubmVsIG1hc2s6IHNlZSBhdWRpb19jaGFubmVsc190LgorICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrOiBzZWUgYXVkaW9fY2hhbm5lbHNfdC4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIFRvdGFsIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kgb2YgdGhlIHRyYWNrLgogICAgICAqIGZsYWdzOiAgICAgICAgICAgICAgQSBiaXRtYXNrIG9mIGFjb3VzdGljIHZhbHVlcyBmcm9tIGVudW0gcmVjb3JkX2ZsYWdzLiAgSXQgZW5hYmxlcwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IDAsCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChpbnQgaW5wdXRTb3VyY2UgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IDAsCkBAIC0zNDgsOCArMzQ4LDggQEAKIAogICAgICAgICAgICAgYm9vbCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8Q2xpZW50UmVjb3JkVGhyZWFkPiYgdGhyZWFkKTsKICAgICAgICAgICAgIHN0YXR1c190IG9wZW5SZWNvcmRfbCh1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKQEAgLTM2NCwxMCArMzY0LDEwIEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtRm9ybWF0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2U7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgbVJlc2VydmVkOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1SZXNlcnZlZFsyXTsKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OwogCkBAIC0zODIsNyArMzgyLDcgQEAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTmV3UG9zaXRpb247CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVVwZGF0ZVBlcmlvZDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRmxhZ3M7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzazsKICAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggNjhjZDE4OC4uODkyMTNiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAogLyogWFhYOiBTaG91bGQgYmUgaW5jbHVkZSBieSBhbGwgdGhlIHVzZXJzIGluc3RlYWQgKi8KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCBkZTkyOGRhLi5kZjMwZThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNjksOCArNjksOCBAQAogICAgICAgICAgICAgTVVURSAgICA9IDB4MDAwMDAwMDEKICAgICAgICAgfTsKICAgICAgICAgdWludDMyX3QgICAgZmxhZ3M7Ci0gICAgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudDsKICAgICAgICAgaW50ICAgICAgICAgZm9ybWF0OworICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQ7IC8vIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBkbyBub3QgdXNlCiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7CiAgICAgICAgIHNpemVfdCAgICAgIHNpemU7CiAgICAgICAgIHVuaW9uIHsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAqIHNhbXBsZVJhdGU6ICAgICAgICAgVHJhY2sgc2FtcGxpbmcgcmF0ZSBpbiBIei4KICAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdCAoZS5nIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGZvciBzaWduZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIDE2IGJpdHMgcGVyIHNhbXBsZSkuCi0gICAgICogY2hhbm5lbHM6ICAgICAgICAgICBDaGFubmVsIG1hc2s6IHNlZSBhdWRpb19jaGFubmVsc190LgorICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrOiBzZWUgYXVkaW9fY2hhbm5lbHNfdC4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIFRvdGFsIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kgb2YgdGhlIHRyYWNrLgogICAgICAqIGZsYWdzOiAgICAgICAgICAgICAgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSAwLApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsTWFzayAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSAwLApAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IHN0cmVhbVR5cGUgICAgICA9LTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IDAsCkBAIC00MzgsOCArNDM4LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpOwogICAgICAgICAgICAgc3RhdHVzX3QgY3JlYXRlVHJhY2tfbChpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC00NTksMTEgKzQ1OSwxMiBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtRm9ybWF0OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbU11dGVkOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggZDhmZGMyNy4uNDAzN2M0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTQ4LDggKzQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtNjEsOCArNjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTczLDcgKzczLDcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoaW50IG91dHB1dCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCAwOWIyYmZlLi4wZmM4ZGJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggZjA0MDFjYy4uMThlOGE1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMTY4LDYgKzE2OCwxMCBAQAogICAgICAgICBpZiAobU5vdGlmeSkgbU5vdGlmeShtQ29va2llLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA1MGEzNzhmLi5lYTVhOWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCkBAIC0xMDAsNiArMTAwLDkgQEAKICAgICBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCA9IDcwMSwKICAgICAvLyBNZWRpYVBsYXllciBpcyByZXN1bWluZyBwbGF5YmFjayBhZnRlciBmaWxsaW5nIGJ1ZmZlcnMuCiAgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EID0gNzAyLAorICAgIC8vIEJhbmR3aWR0aCBpbiByZWNlbnQgcGFzdAorICAgIE1FRElBX0lORk9fTkVUV09SS19CQU5EV0lEVEggPSA3MDMsCisKICAgICAvLyA4eHgKICAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAogICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCkBAIC0xMjgsNiArMTMxLDkgQEAKIGVudW0gbWVkaWFfc2V0X3BhcmFtZXRlcl9rZXlzIHsKICAgICBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfVFJBQ0tfSU5ERVggPSAxMDAwLAogICAgIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9BRERfT1VUX09GX0JBTkRfU09VUkNFID0gMTAwMSwKKworICAgIC8vIFN0cmVhbWluZy9idWZmZXJpbmcgcGFyYW1ldGVycworICAgIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMgPSAxMTAwLAogfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIHJlZi1jb3VudGVkIG9iamVjdCBmb3IgY2FsbGJhY2tzCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IDZiNmZjZGYuLjQ4ZDE0NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgICAgIGtXYW50c1ByZWZldGNoaW5nICAgICAgPSAxLAogICAgICAgICBrU3RyZWFtZWRGcm9tTG9jYWxIb3N0ID0gMiwKICAgICAgICAga0lzQ2FjaGluZ0RhdGFTb3VyY2UgICA9IDQsCisgICAgICAgIGtJc0hUVFBCYXNlZFNvdXJjZSAgICAgPSA4LAogICAgIH07CiAKICAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCA0MDQ0YzVkLi5kZWFkZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC01NSw2ICs1NSw3IEBACiAgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKICAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKICAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKICAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaAppbmRleCA3MGRhYWZhLi41ODljZWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCkBAIC0yMDIsNiArMjAyLDEwIEBACiAgICAgYm9vbCBtT25seVN1Ym1pdE9uZUJ1ZmZlckF0T25lVGltZTsKICAgICBib29sIG1FbmFibGVHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQ7CiAKKyAgICAvLyBVc2VkIHRvIHJlY29yZCB0aGUgZGVjb2RpbmcgdGltZSBmb3IgYW4gb3V0cHV0IHBpY3R1cmUgZnJvbQorICAgIC8vIGEgdmlkZW8gZW5jb2Rlci4KKyAgICBMaXN0PGludDY0X3Q+IG1EZWNvZGluZ1RpbWVMaXN0OworCiAgICAgT01YQ29kZWMoY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLCB1aW50MzJfdCBxdWlya3MsCiAgICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCkBAIC0zMTcsNiArMzIxLDggQEAKIAogICAgIHN0YXR1c190IGFwcGx5Um90YXRpb24oKTsKIAorICAgIGludDY0X3QgcmV0cmlldmVEZWNvZGluZ1RpbWVVcyhib29sIGlzQ29kZWNTcGVjaWZpYyk7CisKICAgICBPTVhDb2RlYyhjb25zdCBPTVhDb2RlYyAmKTsKICAgICBPTVhDb2RlYyAmb3BlcmF0b3I9KGNvbnN0IE9NWENvZGVjICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAppbmRleCA0YThiZTdiLi4xMmI0ZjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCkBAIC0xNDksNiArMTQ5LDcgQEAKICAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiwKICAgICBPTVhfQ09MT1JfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAogICAgIE9NWF9DT0xPUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwLAogICAgIE9NWF9DT0xPUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9DT0xPUl9GT1JNQVRUWVBFOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCAxODI3YzNlLi4yMGFiZDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jZGVmaW5lIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQgKEFORFJPSURfUFJJT1JJVFlfQVVESU8pCiAvLyBNYXhpbXVtIGN1bXVsYXRlZCB0aW1lb3V0IG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzdGFydGluZyBhdWRpb2ZsaW5nZXIgdGhyZWFkCiAjZGVmaW5lIE1BWF9TVEFSVFVQX1RJTUVPVVRfTVMgIDMwMDAgICAgLy8gTG9uZ2VyIHRpbWVvdXQgcGVyaW9kIGF0IHN0YXJ0dXAgdG8gY29wZSB3aXRoIEEyRFAgaW5pdCB0aW1lCiAjZGVmaW5lIE1BWF9SVU5fVElNRU9VVF9NUyAgICAgIDEwMDAKQEAgLTgyLDcgKzgxLDcgQEAKICAgICAgICAgICAgICAgICAvLyAxNiBiaXQgYmVjYXVzZSBkYXRhIGlzIGNvbnZlcnRlZCB0byAxNiBiaXQgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiBidWZmZXIKIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCAgICAgcGFkMTsKICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBidWZmZXJUaW1lb3V0TXM7IC8vIE1heGltdW0gY3VtdWxhdGVkIHRpbWVvdXQgYmVmb3JlIHJlc3RhcnRpbmcgYXVkaW9mbGluZ2VyCiAKICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICB3YWl0VGltZU1zOyAgICAgIC8vIEN1bXVsYXRlZCB3YWl0IHRpbWUKQEAgLTkwLDYgKzg5LDcgQEAKICAgICB2b2xhdGlsZSAgICBpbnQzMl90ICAgICBmbGFnczsKIAogICAgICAgICAgICAgICAgIC8vIENhY2hlIGxpbmUgYm91bmRhcnkgKDMyIGJ5dGVzKQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc3RlcFVzZXIodWludDMyX3QgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RlcFNlcnZlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9TaGFyZWRCdWZmZXJTdGFjay5oIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKaW5kZXggNzE3ZjgzNy4uMGRhMDNkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKQEAgLTIwLDM1NSArMjAsMTIgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotCiAjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8dWkvUmVjdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLyoKLSAqIFRoZXNlIGNsYXNzZXMgbWFuYWdlIGEgc3RhY2sgb2YgYnVmZmVycyBpbiBzaGFyZWQgbWVtb3J5LgotICogCi0gKiBTaGFyZWRDbGllbnQ6IHJlcHJlc2VudHMgYSBjbGllbnQgd2l0aCBzZXZlcmFsIHN0YWNrcwotICogU2hhcmVkQnVmZmVyU3RhY2s6IHJlcHJlc2VudHMgYSBzdGFjayBvZiBidWZmZXJzCi0gKiBTaGFyZWRCdWZmZXJDbGllbnQ6IG1hbmlwdWxhdGVzIHRoZSBTaGFyZWRCdWZmZXJTdGFjayBmcm9tIHRoZSBjbGllbnQgc2lkZSAKLSAqIFNoYXJlZEJ1ZmZlclNlcnZlcjogbWFuaXB1bGF0ZXMgdGhlIFNoYXJlZEJ1ZmZlclN0YWNrIGZyb20gdGhlIHNlcnZlciBzaWRlIAotICoKLSAqIEJ1ZmZlcnMgY2FuIGJlIGRlcXVldWVkIHVudGlsIHRoZXJlIGFyZSBub25lIGF2YWlsYWJsZSwgdGhleSBjYW4gYmUgbG9ja2VkCi0gKiB1bmxlc3MgdGhleSBhcmUgaW4gdXNlIGJ5IHRoZSBzZXJ2ZXIsIHdoaWNoIGlzIG9ubHkgdGhlIGNhc2UgZm9yIHRoZSBsYXN0IAotICogZGVxdWV1ZS1hYmxlIGJ1ZmZlci4gV2hlbiB0aGVzZSB2YXJpb3VzIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSBjYWxsZXIKLSAqIHdhaXRzIHVudGlsIHRoZSBjb25kaXRpb24gaXMgbWV0LgotICogCi0gKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZWdpb247Ci1jbGFzcyBTaGFyZWRCdWZmZXJTdGFjazsKLWNsYXNzIFNoYXJlZENsaWVudDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTaGFyZWRCdWZmZXJTdGFjawotewotICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyOwotCi1wdWJsaWM6Ci0gICAgLy8gV2hlbiBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMsIHRoZSBDT01QSUxFX1RJTUVfQVNTRVJUIGF0IHRoZSBlbmQgb2YgdGhpcwotICAgIC8vIGZpbGUgbmVlZCB0byBiZSB1cGRhdGVkLgotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX0xBWUVSU19NQVggID0gMzE7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fQlVGRkVSX01BWCAgPSAzMjsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9CVUZGRVJfTUlOICA9IDI7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fRElTUExBWV9NQVggPSA0OwotCi0gICAgc3RydWN0IFN0YXRpc3RpY3MgeyAvLyA0IGxvbmdzCi0gICAgICAgIHR5cGVkZWYgaW50MzJfdCB1c2Vjc190OwotICAgICAgICB1c2Vjc190ICB0b3RhbFRpbWU7Ci0gICAgICAgIHVzZWNzX3QgIHJlc2VydmVkWzNdOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU21hbGxSZWN0IHsKLSAgICAgICAgdWludDE2X3QgbCwgdCwgciwgYjsKLSAgICB9OwotCi0gICAgc3RydWN0IEZsYXRSZWdpb24geyAvLyA1MiBieXRlcyA9IDQgKiAoMSArIDIqTikKLSAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUkVDVF9NQVggPSA1OwotICAgICAgICB1aW50MzJfdCAgICBjb3VudDsKLSAgICAgICAgU21hbGxSZWN0ICAgcmVjdHNbTlVNX1JFQ1RfTUFYXTsKLSAgICB9OwotICAgIAotICAgIHN0cnVjdCBCdWZmZXJEYXRhIHsKLSAgICAgICAgRmxhdFJlZ2lvbiBkaXJ0eVJlZ2lvbjsKLSAgICAgICAgU21hbGxSZWN0ICBjcm9wOwotICAgICAgICB1aW50OF90IHRyYW5zZm9ybTsKLSAgICAgICAgdWludDhfdCByZXNlcnZlZFszXTsKLSAgICB9OwotICAgIAotICAgIFNoYXJlZEJ1ZmZlclN0YWNrKCk7Ci0gICAgdm9pZCBpbml0KGludDMyX3QgaWRlbnRpdHkpOwotICAgIHN0YXR1c190IHNldERpcnR5UmVnaW9uKGludCBidWZmZXIsIGNvbnN0IFJlZ2lvbiYgcmVnKTsKLSAgICBzdGF0dXNfdCBzZXRDcm9wKGludCBidWZmZXIsIGNvbnN0IFJlY3QmIHJlZyk7Ci0gICAgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCBidWZmZXIsIHVpbnQ4X3QgdHJhbnNmb3JtKTsKLSAgICBSZWdpb24gZ2V0RGlydHlSZWdpb24oaW50IGJ1ZmZlcikgY29uc3Q7Ci0gICAgUmVjdCBnZXRDcm9wKGludCBidWZmZXIpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldFRyYW5zZm9ybShpbnQgYnVmZmVyKSBjb25zdDsKLQotICAgIC8vIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHBhcnQgb2YgdGhlIGNvbmRpdGlvbnMvdXBkYXRlcwotICAgIHZvbGF0aWxlIGludDMyX3QgaGVhZDsgICAgICAvLyBzZXJ2ZXIncyBjdXJyZW50IGZyb250IGJ1ZmZlcgotICAgIHZvbGF0aWxlIGludDMyX3QgYXZhaWxhYmxlOyAvLyBudW1iZXIgb2YgZGVxdWV1ZS1hYmxlIGJ1ZmZlcnMKLSAgICB2b2xhdGlsZSBpbnQzMl90IHF1ZXVlZDsgICAgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgd2FpdGluZyBmb3IgcG9zdAotICAgIHZvbGF0aWxlIGludDMyX3QgcmVzZXJ2ZWQxOwotICAgIHZvbGF0aWxlIHN0YXR1c190IHN0YXR1czsgICAvLyBzdXJmYWNlJ3Mgc3RhdHVzIGNvZGUKLQotICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBjb25kaXRpb25zCi0gICAgdm9sYXRpbGUgaW50MzJfdCByZWFsbG9jTWFzazsKLSAgICB2b2xhdGlsZSBpbnQ4X3QgaW5kZXhbTlVNX0JVRkZFUl9NQVhdOwotCi0gICAgaW50MzJfdCAgICAgaWRlbnRpdHk7ICAgICAgIC8vIHN1cmZhY2UncyBpZGVudGl0eSAoY29uc3QpCi0gICAgaW50MzJfdCAgICAgdG9rZW47ICAgICAgICAgIC8vIHN1cmZhY2UncyB0b2tlbiAoZm9yIGRlYnVnZ2luZykKLSAgICBTdGF0aXN0aWNzICBzdGF0czsKLSAgICBpbnQ4X3QgICAgICBoZWFkQnVmOyAgICAgICAgLy8gbGFzdCByZXRpcmVkIGJ1ZmZlcgotICAgIHVpbnQ4X3QgICAgIHJlc2VydmVkQnl0ZXNbM107Ci0gICAgaW50MzJfdCAgICAgcmVzZXJ2ZWQ7Ci0gICAgQnVmZmVyRGF0YSAgYnVmZmVyc1tOVU1fQlVGRkVSX01BWF07ICAgICAvLyAxMDI0IGJ5dGVzCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIDY0IEtCIG1heAotY2xhc3MgU2hhcmVkQ2xpZW50Ci17Ci1wdWJsaWM6Ci0gICAgU2hhcmVkQ2xpZW50KCk7Ci0gICAgflNoYXJlZENsaWVudCgpOwotICAgIHN0YXR1c190IHZhbGlkYXRlKHNpemVfdCB0b2tlbikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyOwotCi0gICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgbG9jay1sZXNzIHByaW1pdGl2ZQotICAgIE11dGV4IGxvY2s7Ci0gICAgQ29uZGl0aW9uIGN2OwotICAgIFNoYXJlZEJ1ZmZlclN0YWNrIHN1cmZhY2VzWyBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0xBWUVSU19NQVggXTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgU2hhcmVkQnVmZmVyQmFzZQotewotcHVibGljOgotICAgIFNoYXJlZEJ1ZmZlckJhc2UoU2hhcmVkQ2xpZW50KiBzaGFyZWRDbGllbnQsIGludCBzdXJmYWNlLAotICAgICAgICAgICAgaW50MzJfdCBpZGVudGl0eSk7Ci0gICAgflNoYXJlZEJ1ZmZlckJhc2UoKTsKLSAgICBzdGF0dXNfdCBnZXRTdGF0dXMoKSBjb25zdDsKLSAgICBpbnQzMl90IGdldElkZW50aXR5KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBkdW1wKGNoYXIgY29uc3QqIHByZWZpeCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBTaGFyZWRDbGllbnQqIGNvbnN0IG1TaGFyZWRDbGllbnQ7Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2sqIGNvbnN0IG1TaGFyZWRTdGFjazsKLSAgICBjb25zdCBpbnQgbUlkZW50aXR5OwotCi0gICAgZnJpZW5kIHN0cnVjdCBVcGRhdGU7Ci0gICAgZnJpZW5kIHN0cnVjdCBRdWV1ZVVwZGF0ZTsKLQotICAgIHN0cnVjdCBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrOwotICAgICAgICBpbmxpbmUgQ29uZGl0aW9uQmFzZShTaGFyZWRCdWZmZXJCYXNlKiBzYmMpIAotICAgICAgICAgICAgOiBzdGFjaygqc2JjLT5tU2hhcmVkU3RhY2spIHsgfQotICAgICAgICB2aXJ0dWFsIH5Db25kaXRpb25CYXNlKCkgeyB9OwotICAgICAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgPSAwOwotICAgIH07Ci0gICAgc3RhdHVzX3Qgd2FpdEZvckNvbmRpdGlvbihjb25zdCBDb25kaXRpb25CYXNlJiBjb25kaXRpb24pOwotCi0gICAgc3RydWN0IFVwZGF0ZUJhc2UgewotICAgICAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2s7Ci0gICAgICAgIGlubGluZSBVcGRhdGVCYXNlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYikgCi0gICAgICAgICAgICA6IHN0YWNrKCpzYmItPm1TaGFyZWRTdGFjaykgeyB9Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCB1cGRhdGVDb25kaXRpb24oVCB1cGRhdGUpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0dXNfdCBTaGFyZWRCdWZmZXJCYXNlOjp1cGRhdGVDb25kaXRpb24oVCB1cGRhdGUpIHsKLSAgICBTaGFyZWRDbGllbnQmIGNsaWVudCggKm1TaGFyZWRDbGllbnQgKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woY2xpZW50LmxvY2spOwotICAgIHNzaXplX3QgcmVzdWx0ID0gdXBkYXRlKCk7Ci0gICAgY2xpZW50LmN2LmJyb2FkY2FzdCgpOyAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudCA6IHB1YmxpYyBTaGFyZWRCdWZmZXJCYXNlCi17Ci1wdWJsaWM6Ci0gICAgU2hhcmVkQnVmZmVyQ2xpZW50KFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LCBpbnQgc3VyZmFjZSwgaW50IG51bSwKLSAgICAgICAgICAgIGludDMyX3QgaWRlbnRpdHkpOwotCi0gICAgc3NpemVfdCBkZXF1ZXVlKCk7Ci0gICAgc3RhdHVzX3QgdW5kb0RlcXVldWUoaW50IGJ1Zik7Ci0gICAgCi0gICAgc3RhdHVzX3QgbG9jayhpbnQgYnVmKTsKLSAgICBzdGF0dXNfdCBjYW5jZWwoaW50IGJ1Zik7Ci0gICAgc3RhdHVzX3QgcXVldWUoaW50IGJ1Zik7Ci0gICAgYm9vbCBuZWVkTmV3QnVmZmVyKGludCBidWZmZXIpIGNvbnN0OwotICAgIHN0YXR1c190IHNldERpcnR5UmVnaW9uKGludCBidWZmZXIsIGNvbnN0IFJlZ2lvbiYgcmVnKTsKLSAgICBzdGF0dXNfdCBzZXRDcm9wKGludCBidWZmZXIsIGNvbnN0IFJlY3QmIHJlZyk7Ci0gICAgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCBidWZmZXIsIHVpbnQzMl90IHRyYW5zZm9ybSk7Ci0KLSAgICBjbGFzcyBTZXRCdWZmZXJDb3VudENhbGxiYWNrIHsKLSAgICAgICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVyYXRvcigpKGludCBidWZmZXJDb3VudCkgY29uc3QgPSAwOwotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+U2V0QnVmZmVyQ291bnRDYWxsYmFjaygpIHsgfQotICAgIH07Ci0gICAgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50LCBjb25zdCBTZXRCdWZmZXJDb3VudENhbGxiYWNrJiBpcGMpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgQ29uZGl0aW9uOwotICAgIGZyaWVuZCBzdHJ1Y3QgRGVxdWV1ZUNvbmRpdGlvbjsKLSAgICBmcmllbmQgc3RydWN0IExvY2tDb25kaXRpb247Ci0KLSAgICBzdHJ1Y3QgUXVldWVVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7Ci0gICAgICAgIGlubGluZSBRdWV1ZVVwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpOwotICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBEZXF1ZXVlVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgewotICAgICAgICBpbmxpbmUgRGVxdWV1ZVVwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpOwotICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBDYW5jZWxVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7Ci0gICAgICAgIGludCB0YWlsLCBidWY7Ci0gICAgICAgIGlubGluZSBDYW5jZWxVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgdGFpbCwgaW50IGJ1Zik7Ci0gICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKLSAgICB9OwotCi0gICAgLy8gLS0KLQotICAgIHN0cnVjdCBEZXF1ZXVlQ29uZGl0aW9uIDogcHVibGljIENvbmRpdGlvbkJhc2UgewotICAgICAgICBpbmxpbmUgRGVxdWV1ZUNvbmRpdGlvbihTaGFyZWRCdWZmZXJDbGllbnQqIHNiYyk7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiRGVxdWV1ZUNvbmRpdGlvbiI7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IExvY2tDb25kaXRpb24gOiBwdWJsaWMgQ29uZGl0aW9uQmFzZSB7Ci0gICAgICAgIGludCBidWY7Ci0gICAgICAgIGlubGluZSBMb2NrQ29uZGl0aW9uKFNoYXJlZEJ1ZmZlckNsaWVudCogc2JjLCBpbnQgYnVmKTsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0OwotICAgICAgICBpbmxpbmUgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJMb2NrQ29uZGl0aW9uIjsgfQotICAgIH07Ci0KLSAgICBpbnQzMl90IGNvbXB1dGVUYWlsKCkgY29uc3Q7Ci0KLSAgICBtdXRhYmxlIFJXTG9jayBtTG9jazsKLSAgICBpbnQgbU51bUJ1ZmZlcnM7Ci0KLSAgICBpbnQzMl90IHRhaWw7Ci0gICAgaW50MzJfdCBxdWV1ZWRfaGVhZDsKLSAgICAvLyBzdGF0aXN0aWNzLi4uCi0gICAgbnNlY3NfdCBtRGVxdWV1ZVRpbWVbU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9CVUZGRVJfTUFYXTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyCi0gICAgOiBwdWJsaWMgU2hhcmVkQnVmZmVyQmFzZSwKLSAgICAgIHB1YmxpYyBMaWdodFJlZkJhc2U8U2hhcmVkQnVmZmVyU2VydmVyPgotewotcHVibGljOgotICAgIFNoYXJlZEJ1ZmZlclNlcnZlcihTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsIGludCBudW0sCi0gICAgICAgICAgICBpbnQzMl90IGlkZW50aXR5KTsKLQotICAgIHNzaXplX3QgcmV0aXJlQW5kTG9jaygpOwotICAgIHZvaWQgc2V0U3RhdHVzKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgc3RhdHVzX3QgcmVhbGxvY2F0ZUFsbCgpOwotICAgIHN0YXR1c190IHJlYWxsb2NhdGVBbGxFeGNlcHQoaW50IGJ1ZmZlcik7Ci0gICAgaW50MzJfdCBnZXRRdWV1ZWRDb3VudCgpIGNvbnN0OwotICAgIFJlZ2lvbiBnZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyKSBjb25zdDsKLSAgICBSZWN0IGdldENyb3AoaW50IGJ1ZmZlcikgY29uc3Q7Ci0gICAgdWludDMyX3QgZ2V0VHJhbnNmb3JtKGludCBidWZmZXIpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgcmVzaXplKGludCBuZXdOdW1CdWZmZXJzKTsKLSAgICBzdGF0dXNfdCBncm93KGludCBuZXdOdW1CdWZmZXJzKTsKLSAgICBzdGF0dXNfdCBzaHJpbmsoaW50IG5ld051bUJ1ZmZlcnMpOwotCi0gICAgU2hhcmVkQnVmZmVyU3RhY2s6OlN0YXRpc3RpY3MgZ2V0U3RhdHMoKSBjb25zdDsKLSAgICAKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGlnaHRSZWZCYXNlPFNoYXJlZEJ1ZmZlclNlcnZlcj47Ci0gICAgflNoYXJlZEJ1ZmZlclNlcnZlcigpOwotCi0gICAgLyoKLSAgICAgKiBCdWZmZXJMaXN0IGlzIGJhc2ljYWxseSBhIGZpeGVkLWNhcGFjaXR5IHNvcnRlZC12ZWN0b3Igb2YKLSAgICAgKiB1bnNpZ25lZCA1LWJpdHMgaW50cyB1c2luZyBhIDMyLWJpdHMgaW50IGFzIHN0b3JhZ2UuCi0gICAgICogaXQgaGFzIGVmZmljaWVudCBpdGVyYXRvcnMgdG8gZmluZCBpdGVtcyBpbiB0aGUgbGlzdCBhbmQgbm90IGluIHRoZSBsaXN0LgotICAgICAqLwotICAgIGNsYXNzIEJ1ZmZlckxpc3QgewotICAgICAgICBzaXplX3QgbUNhcGFjaXR5OwotICAgICAgICB1aW50MzJfdCBtTGlzdDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEJ1ZmZlckxpc3Qoc2l6ZV90IGMgPSBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0JVRkZFUl9NQVgpCi0gICAgICAgICAgICA6IG1DYXBhY2l0eShjKSwgbUxpc3QoMCkgeyB9Ci0gICAgICAgIHN0YXR1c190IGFkZChpbnQgdmFsdWUpOwotICAgICAgICBzdGF0dXNfdCByZW1vdmUoaW50IHZhbHVlKTsKLSAgICAgICAgdWludDMyX3QgZ2V0TWFzaygpIGNvbnN0IHsgcmV0dXJuIG1MaXN0OyB9Ci0KLSAgICAgICAgY2xhc3MgY29uc3RfaXRlcmF0b3IgewotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEJ1ZmZlckxpc3Q7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBjdXJyOwotICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IodWludDMyX3QgbWFzaykgOgotICAgICAgICAgICAgICAgIG1hc2sobWFzayksIGN1cnIoX19idWlsdGluX2NseihtYXNrKSkgewotICAgICAgICAgICAgfQotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgY29uc3RfaXRlcmF0b3ImIHJocykgY29uc3QgewotICAgICAgICAgICAgICAgIHJldHVybiBtYXNrID09IHJocy5tYXNrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFzayAhPSByaHMubWFzazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlubGluZSBpbnQgb3BlcmF0b3IgKigpIGNvbnN0IHsgcmV0dXJuIGN1cnI7IH0KLSAgICAgICAgICAgIGlubGluZSBjb25zdCBjb25zdF9pdGVyYXRvciYgb3BlcmF0b3IgKysoKSB7Ci0gICAgICAgICAgICAgICAgbWFzayAmPSB+KDE8PCgzMS1jdXJyKSk7Ci0gICAgICAgICAgICAgICAgY3VyciA9IF9fYnVpbHRpbl9jbHoobWFzayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihtTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBmcmVlX2JlZ2luKCkgY29uc3QgewotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9ICgxIDw8ICgzMi1tQ2FwYWNpdHkpKSAtIDE7Ci0gICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoIH4obUxpc3QgfCBtYXNrKSApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIHRoaXMgcHJvdGVjdHMgbU51bUJ1ZmZlcnMgYW5kIG1CdWZmZXJMaXN0Ci0gICAgbXV0YWJsZSBSV0xvY2sgbUxvY2s7Ci0gICAgaW50IG1OdW1CdWZmZXJzOwotICAgIEJ1ZmZlckxpc3QgbUJ1ZmZlckxpc3Q7Ci0KLSAgICBzdHJ1Y3QgQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbiA6IHB1YmxpYyBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgaW50IG1OdW1CdWZmZXJzOwotICAgICAgICBpbmxpbmUgQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbihTaGFyZWRCdWZmZXJTZXJ2ZXIqIHNicywKLSAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycyk7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbiI7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IFJldGlyZVVwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKLSAgICAgICAgY29uc3QgaW50IG51bUJ1ZmZlcnM7Ci0gICAgICAgIGlubGluZSBSZXRpcmVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgbnVtQnVmZmVycyk7Ci0gICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IFN0YXR1c1VwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKLSAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBpbmxpbmUgU3RhdHVzVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgc3RhdHVzX3Qgc3RhdHVzKTsKLSAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwotICAgIH07Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgTlVNX0RJU1BMQVlfTUFYIDQKIAogc3RydWN0IGRpc3BsYXlfY2Jsa190CiB7CkBAIC0zODksMTIgKzQ2LDExIEBACiAgICAgdWludDhfdCAgICAgICAgIGNvbm5lY3RlZDsKICAgICB1aW50OF90ICAgICAgICAgcmVzZXJ2ZWRbM107CiAgICAgdWludDMyX3QgICAgICAgIHBhZFs3XTsKLSAgICBkaXNwbGF5X2NibGtfdCAgZGlzcGxheXNbU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9ESVNQTEFZX01BWF07CisgICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW05VTV9ESVNQTEFZX01BWF07CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ09NUElMRV9USU1FX0FTU0VSVChzaXplb2YoU2hhcmVkQ2xpZW50KSA8PSA2NTUzNikKIENPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QpIDw9IDQwOTYpCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDQ0NmUzZGYuLmE0MWQ3YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApCiB7Ci0gICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKKyAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzZXNzaW9uSWQpOwogfQogCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKIHsKIAotICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVscyAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbHMsIGZyYW1lQ291bnQpOworICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVsTWFzayAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCkBAIC0xNTYsMTQgKzE1NiwxNCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVscykpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaW50IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxzKTsKKyAgICBpbnQgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQoaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KWZsYWdzKTsKICAgICBpZiAoaW5wdXQgPT0gMCkgewogICAgICAgICBMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gb3BlblJlY29yZF9sKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LAorICAgIHN0YXR1cyA9IG9wZW5SZWNvcmRfbChzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGlucHV0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMDksNyArMjA5LDcgQEAKICAgICAvLyBVcGRhdGUgYnVmZmVyIHNpemUgaW4gY2FzZSBpdCBoYXMgYmVlbiBsaW1pdGVkIGJ5IEF1ZGlvRmxpbmdlciBkdXJpbmcgdHJhY2sgY3JlYXRpb24KICAgICBtRnJhbWVDb3VudCA9IG1DYmxrLT5mcmFtZUNvdW50OwogICAgIG1DaGFubmVsQ291bnQgPSAodWludDhfdCljaGFubmVsQ291bnQ7Ci0gICAgbUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgbUFjdGl2ZSA9IDA7CiAgICAgbUNiZiA9IGNiZjsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwpAQCAtMzE1LDkgKzMxNSw5IEBACiAgICAgICAgICAgICBjYmxrLT5idWZmZXJUaW1lb3V0TXMgPSBNQVhfUlVOX1RJTUVPVVRfTVM7CiAgICAgICAgICAgICBjYmxrLT53YWl0VGltZU1zID0gMDsKICAgICAgICAgICAgIGlmICh0ICE9IDApIHsKLSAgICAgICAgICAgICAgIHQtPnJ1bigiQ2xpZW50UmVjb3JkVGhyZWFkIiwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICAgICB0LT5ydW4oIkNsaWVudFJlY29yZFRocmVhZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtQWN0aXZlID0gMDsKQEAgLTQzNyw4ICs0MzcsOCBAQAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6b3BlblJlY29yZF9sKAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQpAQCAtNDUxLDcgKzQ1MSw3IEBACiAKICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IGF1ZGlvRmxpbmdlci0+b3BlblJlY29yZChnZXRwaWQoKSwgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpZmxhZ3MpIDw8IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLApAQCAtNTg5LDcgKzU4OSw3IEBACiB7CiAgICAgbUlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KG1JbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9faW5fYWNvdXN0aWNzX3QpbUZsYWdzKTsKICAgICByZXR1cm4gbUlucHV0OwogfQpAQCAtNzU2LDcgKzc1Niw3IEBACiAgICAgICAgIC8vIGlmIHRoZSBuZXcgSUF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsIG9wZW5SZWNvcmRfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCiAgICAgICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQotICAgICAgICByZXN1bHQgPSBvcGVuUmVjb3JkX2woY2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgcmVzdWx0ID0gb3BlblJlY29yZF9sKGNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUZsYWdzLCBnZXRJbnB1dF9sKCkpOwogICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKaW5kZXggOGExODBkOC4uNmNiMzg0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcApAQCAtMjYsMTMgKzI2LDYgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCi0KLSNpZm5kZWYgSEFWRV9HRVRUSUQKLSMgZGVmaW5lIGdldHRpZCBnZXRwaWQKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAppbmRleCA3NTIwZWQ5Li4zN2ZlMTgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcApAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAogI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQpAQCAtODcsNyArODcsNyBAQAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAsIGZhbHNlLCBzZXNzaW9uSWQpOwogfQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbHMsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCk7CiB9CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtMTgwLDggKzE4MCw4IEBACiAgICAgaWYgKGZvcm1hdCA9PSAwKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBpZiAoY2hhbm5lbHMgPT0gMCkgewotICAgICAgICBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgeworICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCkBAIC0xOTUsMTUgKzE5NSwxNSBAQAogICAgICAgICBmbGFncyB8PSBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUOwogICAgIH0KIAotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbHMpKSB7CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbHMpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdClmbGFncyk7CiAKICAgICBpZiAob3V0cHV0ID09IDApIHsKQEAgLTIyMiw4ICsyMjIsOCBAQAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVUcmFja19sKHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLApAQCAtMjQ1LDggKzI0NSw4IEBACiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUZvcm1hdCA9ICh1aW50MzJfdClmb3JtYXQ7CisgICAgbUNoYW5uZWxNYXNrID0gKHVpbnQzMl90KWNoYW5uZWxNYXNrOwogICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtTXV0ZWQgPSBmYWxzZTsKQEAgLTM0Miw5ICszNDIsOSBAQAogICAgICAgICBjYmxrLT53YWl0VGltZU1zID0gMDsKICAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgICAgIHQtPnJ1bigiQXVkaW9UcmFja1RocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICB0LT5ydW4oIkF1ZGlvVHJhY2tUaHJlYWQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICB9CiAKICAgICAgICAgTE9HVigic3RhcnQgJXAgYmVmb3JlIGxvY2sgY2JsayAlcCIsIHRoaXMsIG1DYmxrKTsKQEAgLTY4MSw3ICs2ODEsNyBAQAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0X2woKQogewogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KW1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVscywgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCltRmxhZ3MpOworICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCltRmxhZ3MpOwogfQogCiBpbnQgQXVkaW9UcmFjazo6Z2V0U2Vzc2lvbklkKCkKQEAgLTcwNSw4ICs3MDUsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbCgKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTc2Nyw2ICs3NjcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGFsaWdubWVudCBtYXRjaGVzIGNoYW5uZWxjb3VudAorICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIGlmICgoKHVpbnQzMl90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGNoYW5uZWxDb3VudCB8IDEpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25lbWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbENvdW50ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIGNoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTc3OSw3ICs3ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZsYWdzKSA8PCAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKQEAgLTExNjQsNyArMTE2NSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRyYWNrX2wobVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+c2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCAxNThkMmY1Li40YTEyOTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcApAQCAtODIsOCArODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1UeXBlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxDb3VudCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWRCdWZmZXItPmFzQmluZGVyKCkpOwpAQCAtMTI5LDggKzEyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLApAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsQ291bnQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBpbnQgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0CisgICAgdmlydHVhbCB1aW50MzJfdCBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZWJlODIxZi4uMDcxNTJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMzAsMjYgKzMwLDYgQEAKIC8vIGZvcmVncm91bmQgdGhyZWFkLgogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKIAotLyogZGVza3RvcCBMaW51eCBuZWVkcyBhIGxpdHRsZSBoZWxwIHdpdGggZ2V0dGlkKCkgKi8KLSNpZiBkZWZpbmVkKEhBVkVfR0VUVElEKSAmJiAhZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0jZGVmaW5lIF9fS0VSTkVMX18KLSMgaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaWZkZWYgX3N5c2NhbGwwCi1fc3lzY2FsbDAocGlkX3QsZ2V0dGlkKQotI2Vsc2UKLXBpZF90IGdldHRpZCgpIHsgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpO30KLSNlbmRpZgotI3VuZGVmIF9fS0VSTkVMX18KLSNlbmRpZgotCi1zdGF0aWMgaW50IG15VGlkKCkgewotI2lmZGVmIEhBVkVfR0VUVElECi0gICAgcmV0dXJuIGdldHRpZCgpOwotI2Vsc2UKLSAgICByZXR1cm4gZ2V0cGlkKCk7Ci0jZW5kaWYKLX0KLQogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC02MCwxOCArNDAsMTggQEAKIHN0YXRpYyB2b2lkIHNlbmRTY2hlZFBvbGljeShQYXJjZWwmIGRhdGEpCiB7CiAgICAgU2NoZWRQb2xpY3kgcG9saWN5OwotICAgIGdldF9zY2hlZF9wb2xpY3kobXlUaWQoKSwgJnBvbGljeSk7CisgICAgZ2V0X3NjaGVkX3BvbGljeShnZXR0aWQoKSwgJnBvbGljeSk7CiAgICAgZGF0YS53cml0ZUludDMyKHBvbGljeSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldFNjaGVkUG9saWN5KGNvbnN0IFBhcmNlbCYgZGF0YSkKIHsKICAgICBTY2hlZFBvbGljeSBwb2xpY3kgPSAoU2NoZWRQb2xpY3kpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgc2V0X3NjaGVkX3BvbGljeShteVRpZCgpLCBwb2xpY3kpOworICAgIHNldF9zY2hlZF9wb2xpY3koZ2V0dGlkKCksIHBvbGljeSk7CiB9CiBzdGF0aWMgdm9pZCByZXN0b3JlU2NoZWRQb2xpY3koKQogewotICAgIHNldF9zY2hlZF9wb2xpY3kobXlUaWQoKSwgU1BfRk9SRUdST1VORCk7CisgICAgc2V0X3NjaGVkX3BvbGljeShnZXR0aWQoKSwgU1BfRk9SRUdST1VORCk7CiB9CiB9OyAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggODgxNTdkMi4uOGI5NTNlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC0yMywxMyArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0pldFBsYXllci5oPgogCiAKLSNpZmRlZiBIQVZFX0dFVFRJRAotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0dGlkKCk7IH0KLSNlbHNlCi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXRwaWQoKTsgfQotI2VuZGlmCi0KLQogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIApAQCAtMTg4LDcgKzE4MSw3IEBACiAgICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVRpZCA9IG15VGlkKCk7CisgICAgICAgIG1UaWQgPSBnZXR0aWQoKTsKICAgICAgICAgTE9HVigiSmV0UGxheWVyOjpyZW5kZXIoKTogcmVuZGVyIHRocmVhZCglZCkgc2lnbmFsIiwgbVRpZCk7CiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjhjODY0Mi4uNDViZGZmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC04OSw3ICs4OSw3IEBACiAgICAgaWYgKHBhdGhSZW1haW5pbmcgPj0gOCAvKiBzdHJsZW4oIi5ub21lZGlhIikgKi8gKSB7CiAgICAgICAgIHN0cmNweShmaWxlU3BvdCwgIi5ub21lZGlhIik7CiAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgRl9PSykgPT0gMCkgewotICAgICAgICAgICAgTE9HRCgiZm91bmQgLm5vbWVkaWEsIHNldHRpbmcgbm9NZWRpYSBmbGFnXG4iKTsKKyAgICAgICAgICAgIExPR1YoImZvdW5kIC5ub21lZGlhLCBzZXR0aW5nIG5vTWVkaWEgZmxhZ1xuIik7CiAgICAgICAgICAgICBub01lZGlhID0gdHJ1ZTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGQ1MWM5NDYuLmE3N2RmZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC02OCwxOCArNjgsNiBAQAogCiAjaW5jbHVkZSA8T01YLmg+CiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQogbmFtZXNwYWNlIHsKIHVzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZXRhZGF0YTsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwpAQCAtMzgwLDYgKzM2OCw5IEBACiAgICAgICAgICAgICBtUGlkLCBtQ29ubklkLCBtU3RhdHVzLCBtTG9vcD8idHJ1ZSI6ICJmYWxzZSIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CisgICAgICAgIG1QbGF5ZXItPmR1bXAoZmQsIGFyZ3MpOworICAgIH0KICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKICAgICAgICAgbUF1ZGlvT3V0cHV0LT5kdW1wKGZkLCBhcmdzKTsKICAgICB9CkBAIC0zODcsMTQgKzM3OCw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0aWMgaW50IG15VGlkKCkgewotI2lmZGVmIEhBVkVfR0VUVElECi0gICAgcmV0dXJuIGdldHRpZCgpOwotI2Vsc2UKLSAgICByZXR1cm4gZ2V0cGlkKCk7Ci0jZW5kaWYKLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTQyNiw3ICs0MDksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBteVRpZCgpKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHRpZCgpKTsKICAgICAgICAgRklMRSAqZiA9IGZvcGVuKGJ1ZmZlciwgInIiKTsKICAgICAgICAgaWYgKGYpIHsKICAgICAgICAgICAgIHdoaWxlICghZmVvZihmKSkgewpAQCAtNDQ2LDEzICs0MjksMTMgQEAKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0KIAotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIG15VGlkKCkpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHRpZCgpKTsKICAgICAgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOwogICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OwogICAgICAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgbXlUaWQoKSwgZW50LT5kX25hbWUpOworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHRpZCgpLCBlbnQtPmRfbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgewpAQCAtMTE2NCw3ICsxMTQ3LDcgQEAKICAgICBtZW0gPSBuZXcgTWVtb3J5QmFzZShjYWNoZS0+Z2V0SGVhcCgpLCAwLCBjYWNoZS0+c2l6ZSgpKTsKICAgICAqcFNhbXBsZVJhdGUgPSBjYWNoZS0+c2FtcGxlUmF0ZSgpOwogICAgICpwTnVtQ2hhbm5lbHMgPSBjYWNoZS0+Y2hhbm5lbENvdW50KCk7Ci0gICAgKnBGb3JtYXQgPSBjYWNoZS0+Zm9ybWF0KCk7CisgICAgKnBGb3JtYXQgPSAoaW50KWNhY2hlLT5mb3JtYXQoKTsKICAgICBMT0dWKCJyZXR1cm4gbWVtb3J5IEAgJXAsIHNhbXBsZVJhdGU9JXUsIGNoYW5uZWxDb3VudCA9ICVkLCBmb3JtYXQgPSAlZCIsIG1lbS0+cG9pbnRlcigpLCAqcFNhbXBsZVJhdGUsICpwTnVtQ2hhbm5lbHMsICpwRm9ybWF0KTsKIAogRXhpdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCmluZGV4IDhmNzc2YjQuLjA2ZmIxMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcApAQCAtNDAsMTggKzQwLDYgQEAKICNpbmNsdWRlICJNZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIgogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKIAotLyogZGVza3RvcCBMaW51eCBuZWVkcyBhIGxpdHRsZSBoZWxwIHdpdGggZ2V0dGlkKCkgKi8KLSNpZiBkZWZpbmVkKEhBVkVfR0VUVElEKSAmJiAhZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0jZGVmaW5lIF9fS0VSTkVMX18KLSMgaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaWZkZWYgX3N5c2NhbGwwCi1fc3lzY2FsbDAocGlkX3QsZ2V0dGlkKQotI2Vsc2UKLXBpZF90IGdldHRpZCgpIHsgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpO30KLSNlbmRpZgotI3VuZGVmIF9fS0VSTkVMX18KLSNlbmRpZgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGV4dGVybiBwbGF5ZXJfdHlwZSBnZXRQbGF5ZXJUeXBlKGNvbnN0IGNoYXIqIHVybCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAppbmRleCA1ODljNjI1Li43ZTA0NTIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKQEAgLTI5LDE3ICsyOSwxMiBAQAogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3JldmVyYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgIk1pZGlGaWxlLmgiCiAKLSNpZmRlZiBIQVZFX0dFVFRJRAotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0dGlkKCk7IH0KLSNlbHNlCi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXRwaWQoKTsgfQotI2VuZGlmCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDU1LDcgKzQ1MCw3IEBACiAgICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVRpZCA9IG15VGlkKCk7CisgICAgICAgIG1UaWQgPSBnZXR0aWQoKTsKICAgICAgICAgTE9HVigicmVuZGVyIHRocmVhZCglZCkgc2lnbmFsIiwgbVRpZCk7CiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggMDJlYzkxMS4uODcwZTI5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC0yMTQsNCArMjE0LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgIHJldHVybiBtUGxheWVyLT5kdW1wKGZkLCBhcmdzKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggZGRkMzdlNC4uODVhNTQ2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTYxLDYgKzYxLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAogICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OworCiBwcml2YXRlOgogICAgIEF3ZXNvbWVQbGF5ZXIgKm1QbGF5ZXI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDY0MmIzYTMuLmQ2MjgzMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtODg4LDggKzg4OCw2IEBACiAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KICAgICBDSEVDSyhmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIKICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRDYllDclkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggM2QyNzBmOC4uYWE3ZWRjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgICBtVXJpSGVhZGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKIAotICAgICAgICAgICAgbUZsYWdzIHw9IElOQ09HTklUTzsKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKElOQ09HTklUTywgU0VUKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjc5LDYgKzI3OSwxMiBAQAogICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgogICAgIC8vIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tRmQgPSAtMTsKKyAgICAgICAgbVN0YXRzLm1VUkkgPSBtVXJpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjk4LDYgKzMwNCwxMiBAQAogCiAgICAgbUZpbGVTb3VyY2UgPSBkYXRhU291cmNlOwogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tRmQgPSBmZDsKKyAgICAgICAgbVN0YXRzLm1VUkkgPSBTdHJpbmc4KCk7CisgICAgfQorCiAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChkYXRhU291cmNlKTsKIH0KIApAQCAtMzM2LDYgKzM0OCwxMCBAQAogCiAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKICAgICAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgIExPR1coInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGJpdHJhdGUiLCBtaW1lKTsKKwogICAgICAgICAgICAgdG90YWxCaXRSYXRlID0gLTE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzQ3LDYgKzM2MywxNCBAQAogCiAgICAgTE9HVigibUJpdHJhdGUgPSAlbGxkIGJpdHMvc2VjIiwgbUJpdHJhdGUpOwogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tQml0cmF0ZSA9IG1CaXRyYXRlOworICAgICAgICBtU3RhdHMubVRyYWNrcy5jbGVhcigpOworICAgICAgICBtU3RhdHMubUF1ZGlvVHJhY2tJbmRleCA9IC0xOworICAgICAgICBtU3RhdHMubVZpZGVvVHJhY2tJbmRleCA9IC0xOworICAgIH0KKwogICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgKytpKSB7CkBAIC0zNzAsMTAgKzM5NCwyNyBAQAogICAgICAgICAgICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gZGlzcGxheUhlaWdodDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMubVZpZGVvVHJhY2tJbmRleCA9IG1TdGF0cy5tVHJhY2tzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMubVRyYWNrcy5wdXNoKCk7CisgICAgICAgICAgICAgICAgVHJhY2tTdGF0ICpzdGF0ID0KKyAgICAgICAgICAgICAgICAgICAgJm1TdGF0cy5tVHJhY2tzLmVkaXRJdGVtQXQobVN0YXRzLm1WaWRlb1RyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIHN0YXQtPm1NSU1FID0gbWltZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIHNldEF1ZGlvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwogICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMubUF1ZGlvVHJhY2tJbmRleCA9IG1TdGF0cy5tVHJhY2tzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMubVRyYWNrcy5wdXNoKCk7CisgICAgICAgICAgICAgICAgVHJhY2tTdGF0ICpzdGF0ID0KKyAgICAgICAgICAgICAgICAgICAgJm1TdGF0cy5tVHJhY2tzLmVkaXRJdGVtQXQobVN0YXRzLm1BdWRpb1RyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIHN0YXQtPm1NSU1FID0gbWltZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgZm9yIHZvcmJpcyBhdWRpbywgbm9uZSBvZiB0aGUgb3RoZXIgYXVkaW8KICAgICAgICAgICAgICAgICAvLyBmb3JtYXRzIGV2ZW4gc3VwcG9ydCB0aGlzIHJpbmd0b25lIHNwZWNpZmljIGhhY2sgYW5kCkBAIC0zODMsNyArNDI0LDcgQEAKICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3A7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkgJiYgbG9vcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVVRPX0xPT1BJTkc7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKEFVVE9fTE9PUElORywgU0VUKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgewpAQCAtNDMxLDcgKzQ3Miw3IEBACiAgICAgfQogCiAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7CisgICAgICAgIG1vZGlmeUZsYWdzKFBSRVBBUkVfQ0FOQ0VMTEVELCBTRVQpOwogICAgICAgICBpZiAobUNvbm5lY3RpbmdEYXRhU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIExPR0koImludGVycnVwdGluZyB0aGUgY29ubmVjdGlvbiBwcm9jZXNzIik7CiAgICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmRpc2Nvbm5lY3QoKTsKQEAgLTQ5NCw3ICs1MzUsNyBAQAogICAgIH0KIAogICAgIG1EdXJhdGlvblVzID0gLTE7Ci0gICAgbUZsYWdzID0gMDsKKyAgICBtb2RpZnlGbGFncygwLCBBU1NJR04pOwogICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7CiAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gMDsKICAgICBtVmlkZW9UaW1lVXMgPSAwOwpAQCAtNTEwLDYgKzU1MSwyMiBAQAogCiAgICAgbUJpdHJhdGUgPSAtMTsKICAgICBtTGFzdFZpZGVvVGltZVVzID0gLTE7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GZCA9IC0xOworICAgICAgICBtU3RhdHMubVVSSSA9IFN0cmluZzgoKTsKKyAgICAgICAgbVN0YXRzLm1CaXRyYXRlID0gLTE7CisgICAgICAgIG1TdGF0cy5tQXVkaW9UcmFja0luZGV4ID0gLTE7CisgICAgICAgIG1TdGF0cy5tVmlkZW9UcmFja0luZGV4ID0gLTE7CisgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEZWNvZGVkID0gMDsKKyAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0Ryb3BwZWQgPSAwOworICAgICAgICBtU3RhdHMubVZpZGVvV2lkdGggPSAtMTsKKyAgICAgICAgbVN0YXRzLm1WaWRlb0hlaWdodCA9IC0xOworICAgICAgICBtU3RhdHMubUZsYWdzID0gMDsKKyAgICAgICAgbVN0YXRzLm1UcmFja3MuY2xlYXIoKTsKKyAgICB9CisKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgewpAQCAtNjMxLDE1ICs2ODgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYWNoZWREYXRhUmVtYWluaW5nIDwga0xvd1dhdGVyTWFya0J5dGVzKSkgewogICAgICAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBpcyBydW5uaW5nIGxvdyAoPCAlZCkgLCBwYXVzaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga0xvd1dhdGVyTWFya0J5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgU0VUKTsKICAgICAgICAgICAgICAgICAgICAgcGF1c2VfbCgpOwogICAgICAgICAgICAgICAgICAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOworICAgICAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX1NUQVJUKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVvcyB8fCBjYWNoZWREYXRhUmVtYWluaW5nID4ga0hpZ2hXYXRlck1hcmtCeXRlcykgewogICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCByZXN1bWluZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcGxheV9sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7CkBAIC02ODksMTUgKzc0NywxNiBAQAogICAgICAgICAgICAgICAgICYmIChjYWNoZWREdXJhdGlvblVzIDwga0xvd1dhdGVyTWFya1VzKSkgewogICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKCUuMmYgc2VjcykgLCBwYXVzaW5nLiIsCiAgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgLyAxRTYpOwotICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIFNFVCk7CiAgICAgICAgICAgICBwYXVzZV9sKCk7CiAgICAgICAgICAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICB9IGVsc2UgaWYgKGVvcyB8fCBjYWNoZWREdXJhdGlvblVzID4gaGlnaFdhdGVyTWFya1VzKSB7CiAgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKICAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBoYXMgZmlsbGVkIHVwICglLjJmIHNlY3MpLCByZXN1bWluZy4iLAogICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogICAgICAgICAgICAgICAgIHBsYXlfbCgpOwogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7CkBAIC03MTEsNiArNzcwLDE4IEBACiAgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpzZW5kQ2FjaGVTdGF0cygpIHsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCAmJiBtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBrYnBzID0gMDsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoCisgICAgICAgICAgICAgICAgTUVESUFfSU5GTywgTUVESUFfSU5GT19ORVRXT1JLX0JBTkRXSURUSCwga2Jwcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQXdlc29tZVBsYXllcjo6b25TdHJlYW1Eb25lKCkgewogICAgIC8vIFBvc3RlZCB3aGVuZXZlciBhbnkgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcuCiAKQEAgLTcyOCw3ICs3OTksNyBAQAogCiAgICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwogCi0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7CisgICAgICAgIG1vZGlmeUZsYWdzKEFUX0VPUywgU0VUKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNzUyLDIwICs4MjMsMjAgQEAKIAogICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKIAotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOworICAgICAgICBtb2RpZnlGbGFncyhBVF9FT1MsIFNFVCk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpwbGF5KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAKICAgICByZXR1cm4gcGxheV9sKCk7CiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnBsYXlfbCgpIHsKLSAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKKyAgICBtb2RpZnlGbGFncyhTRUVLX1BSRVZJRVcsIENMRUFSKTsKIAogICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTc3OSw4ICs4NTAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbUZsYWdzIHw9IFBMQVlJTkc7Ci0gICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOworICAgIG1vZGlmeUZsYWdzKFBMQVlJTkcsIFNFVCk7CisgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIFNFVCk7CiAKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOwpAQCAtODE0LDcgKzg4NSw3IEBACiAgICAgICAgICAgICAgICAgZGVsZXRlIG1BdWRpb1BsYXllcjsKICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncygoUExBWUlORyB8IEZJUlNUX0ZSQU1FKSwgQ0xFQVIpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKApAQCAtODY2LDcgKzkzNyw3IEBACiAgICAgfQogCiAgICAgaWYgKCEobUZsYWdzICYgQVVESU9QTEFZRVJfU1RBUlRFRCkpIHsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7CisgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPUExBWUVSX1NUQVJURUQsIFNFVCk7CiAKICAgICAgICAgYm9vbCB3YXNTZWVraW5nID0gbUF1ZGlvUGxheWVyLT5pc1NlZWtpbmcoKTsKIApAQCAtODkwLDcgKzk2MSw3IEBACiAgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7CiAgICAgfQogCi0gICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7CisgICAgbW9kaWZ5RmxhZ3MoQVVESU9fUlVOTklORywgU0VUKTsKIAogICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKIApAQCAtOTM3LDYgKzEwMDgsMTIgQEAKICAgICAgICAgdXNhYmxlSGVpZ2h0ID0gbURpc3BsYXlIZWlnaHQ7CiAgICAgfQogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCA9IHVzYWJsZVdpZHRoOworICAgICAgICBtU3RhdHMubVZpZGVvSGVpZ2h0ID0gdXNhYmxlSGVpZ2h0OworICAgIH0KKwogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewpAQCAtOTk5LDcgKzEwNzYsNyBAQAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6cGF1c2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKIAogICAgIHJldHVybiBwYXVzZV9sKCk7CiB9CkBAIC0xMDIxLDE1ICsxMDk4LDE1IEBACiAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7CisgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX1JVTk5JTkcsIENMRUFSKTsKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYgVEVYVFBMQVlFUl9TVEFSVEVEKSB7CiAgICAgICAgIG1UZXh0UGxheWVyLT5wYXVzZSgpOwotICAgICAgICBtRmxhZ3MgJj0gflRFWFRfUlVOTklORzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVF9SVU5OSU5HLCBDTEVBUik7CiAgICAgfQogCi0gICAgbUZsYWdzICY9IH5QTEFZSU5HOworICAgIG1vZGlmeUZsYWdzKFBMQVlJTkcsIENMRUFSKTsKIAogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKQEAgLTExMTEsNyArMTE4OCw3IEBACiAgICAgICAgIG1TZWVraW5nID0gU0VFSzsKICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICAgICAgbVNlZWtUaW1lVXMgPSBtTGFzdFZpZGVvVGltZVVzOwotICAgICAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOworICAgICAgICBtb2RpZnlGbGFncygoQVRfRU9TIHwgQVVESU9fQVRfRU9TIHwgVklERU9fQVRfRU9TKSwgQ0xFQVIpOwogICAgIH0KIAogICAgIGlmICh3YXNQbGF5aW5nKSB7CkBAIC0xMTI5LDEwICsxMjA2LDEwIEBACiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRMb29waW5nKGJvb2wgc2hvdWxkTG9vcCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBtRmxhZ3MgPSBtRmxhZ3MgJiB+TE9PUElORzsKKyAgICBtb2RpZnlGbGFncyhMT09QSU5HLCBDTEVBUik7CiAKICAgICBpZiAoc2hvdWxkTG9vcCkgewotICAgICAgICBtRmxhZ3MgfD0gTE9PUElORzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoTE9PUElORywgU0VUKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMTg2LDE1ICsxMjYzLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUZsYWdzIHw9IFRFWFRfUlVOTklORzsKLSAgICAgICAgICAgIG1GbGFncyB8PSBURVhUUExBWUVSX1NUQVJURUQ7CisgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIFNFVCk7CisgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUUExBWUVSX1NUQVJURUQsIFNFVCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0gZWxzZSB7IC8vIHRvIHR1cm4gb2ZmIHRoZSB0ZXh0IHRyYWNrIGRpc3BsYXkKICAgICAgICAgICAgIGlmIChtRmxhZ3MgICYgVEVYVF9SVU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5URVhUX1JVTk5JTkc7CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVF9SVU5OSU5HLCBDTEVBUik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUZsYWdzICAmIFRFWFRQTEFZRVJfU1RBUlRFRCkgewotICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+VEVYVFBMQVlFUl9TVEFSVEVEOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRQTEFZRVJfU1RBUlRFRCwgQ0xFQVIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gbVRleHRQbGF5ZXItPnNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW5kZXgpOwpAQCAtMTIyMSw3ICsxMjk4LDcgQEAKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKLSAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKICAgICAgICAgcGxheV9sKCk7CiAgICAgfQogCkBAIC0xMjM2LDcgKzEzMTMsNyBAQAogICAgIG1TZWVraW5nID0gU0VFSzsKICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKICAgICBtU2Vla1RpbWVVcyA9IHRpbWVVczsKLSAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOworICAgIG1vZGlmeUZsYWdzKChBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpLCBDTEVBUik7CiAKICAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7CiAKQEAgLTEyNTIsNyArMTMyOSw3IEBACiAgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7CiAKICAgICAgICAgaWYgKChtRmxhZ3MgJiBQUkVQQVJFRCkgJiYgbVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBTRUVLX1BSRVZJRVc7CisgICAgICAgICAgICBtb2RpZnlGbGFncyhTRUVLX1BSRVZJRVcsIFNFVCk7CiAgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzMwLDYgKzE0MDcsMTkgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIFRyYWNrU3RhdCAqc3RhdCA9ICZtU3RhdHMubVRyYWNrcy5lZGl0SXRlbUF0KG1TdGF0cy5tQXVkaW9UcmFja0luZGV4KTsKKworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnQ7CisgICAgICAgIGlmICghbUF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgIC0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZjb21wb25lbnQpKSB7CisgICAgICAgICAgICBjb21wb25lbnQgPSAibm9uZSI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0LT5tRGVjb2Rlck5hbWUgPSBjb21wb25lbnQ7CisgICAgfQorCiAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCkBAIC0xNDA5LDYgKzE0OTksMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIFRyYWNrU3RhdCAqc3RhdCA9ICZtU3RhdHMubVRyYWNrcy5lZGl0SXRlbUF0KG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KTsKKworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnQ7CisgICAgICAgIENIRUNLKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkKKyAgICAgICAgICAgICAgICAtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmY29tcG9uZW50KSk7CisKKyAgICAgICAgc3RhdC0+bURlY29kZXJOYW1lID0gY29tcG9uZW50OworICAgIH0KKwogICAgIHJldHVybiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIApAQCAtMTQzOCw3ICsxNTM5LDcgQEAKICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIFNFVCk7CiAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKQEAgLTE0NzcsNyArMTU3OCw3IEBACiAgICAgICAgICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwogCi0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5BVURJT19SVU5OSU5HOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX1JVTk5JTkcsIENMRUFSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+cGF1c2UoKTsKICAgICAgICAgfQpAQCAtMTUyNiw3ICsxNjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhcnRBdWRpb1BsYXllcl9sKCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhWSURFT19BVF9FT1MsIFNFVCk7CiAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTU0Miw2ICsxNjQzLDExIEBACiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICAgICAgKyttU3RhdHMubU51bVZpZGVvRnJhbWVzRGVjb2RlZDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzOwpAQCAtMTU3NCwxMyArMTY4MCwxMyBAQAogCiAgICAgaWYgKChtRmxhZ3MgJiBURVhUUExBWUVSX1NUQVJURUQpICYmICEobUZsYWdzICYgKFRFWFRfUlVOTklORyB8IFNFRUtfUFJFVklFVykpKSB7CiAgICAgICAgIG1UZXh0UGxheWVyLT5yZXN1bWUoKTsKLSAgICAgICAgbUZsYWdzIHw9IFRFWFRfUlVOTklORzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVF9SVU5OSU5HLCBTRVQpOwogICAgIH0KIAogICAgIFRpbWVTb3VyY2UgKnRzID0gKG1GbGFncyAmIEFVRElPX0FUX0VPUykgPyAmbVN5c3RlbVRpbWVTb3VyY2UgOiBtVGltZVNvdXJjZTsKIAogICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewotICAgICAgICBtRmxhZ3MgJj0gfkZJUlNUX0ZSQU1FOworICAgICAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgQ0xFQVIpOwogICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOwogICAgIH0KIApAQCAtMTYzMiw2ICsxNzM4LDExIEBACiAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgICAgICAgICAgKyttU3RhdHMubU51bVZpZGVvRnJhbWVzRHJvcHBlZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNjU4LDcgKzE3NjksNyBAQAogICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CiAKICAgICBpZiAod2FzU2Vla2luZyAhPSBOT19TRUVLICYmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOworICAgICAgICBtb2RpZnlGbGFncyhTRUVLX1BSRVZJRVcsIENMRUFSKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTczMiw4ICsxODQzLDggQEAKICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKICAgICBpZiAobVdhdGNoRm9yQXVkaW9FT1MgJiYgbUF1ZGlvUGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSBmYWxzZTsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOworICAgICAgICBtb2RpZnlGbGFncyhBVURJT19BVF9FT1MsIFNFVCk7CisgICAgICAgIG1vZGlmeUZsYWdzKEZJUlNUX0ZSQU1FLCBTRVQpOwogICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZmluYWxTdGF0dXMpOwogICAgIH0KIH0KQEAgLTE3ODcsNyArMTg5OCw3IEBACiAgICAgICAgIG1RdWV1ZVN0YXJ0ZWQgPSB0cnVlOwogICAgIH0KIAotICAgIG1GbGFncyB8PSBQUkVQQVJJTkc7CisgICAgbW9kaWZ5RmxhZ3MoUFJFUEFSSU5HLCBTRVQpOwogICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IG5ldyBBd2Vzb21lRXZlbnQoCiAgICAgICAgICAgICB0aGlzLCAmQXdlc29tZVBsYXllcjo6b25QcmVwYXJlQXN5bmNFdmVudCk7CiAKQEAgLTE5NzQsNyArMjA4NSw3IEBACiAgICAgfQogCiAgICAgbVByZXBhcmVSZXN1bHQgPSBlcnI7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpOworICAgIG1vZGlmeUZsYWdzKChQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCksIENMRUFSKTsKICAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOwogICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKIH0KQEAgLTIwMjIsNyArMjEzMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HX0NPTk5FQ1RFRDsKKyAgICBtb2RpZnlGbGFncyhQUkVQQVJJTkdfQ09OTkVDVEVELCBTRVQpOwogCiAgICAgaWYgKGlzU3RyZWFtaW5nSFRUUCgpIHx8IG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CiAgICAgICAgIHBvc3RCdWZmZXJpbmdFdmVudF9sKCk7CkBAIC0yMDQzLDggKzIxNTQsOCBAQAogICAgIH0KIAogICAgIG1QcmVwYXJlUmVzdWx0ID0gT0s7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpOwotICAgIG1GbGFncyB8PSBQUkVQQVJFRDsKKyAgICBtb2RpZnlGbGFncygoUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpLCBDTEVBUik7CisgICAgbW9kaWZ5RmxhZ3MoUFJFUEFSRUQsIFNFVCk7CiAgICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gTlVMTDsKICAgICBtUHJlcGFyZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7CiB9CkBAIC0yMDgzLDYgKzIxOTQsMTAgQEAKIAogICAgICAgICAgICAgcmV0dXJuIG1UZXh0UGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKICAgICAgICAgfQorICAgICAgICBjYXNlIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShyZXF1ZXN0KTsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC0yMDkwLDYgKzIyMDUsMTYgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldENhY2hlU3RhdENvbGxlY3RGcmVxKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBmcmVxTXMgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICBMT0dEKCJSZXF1ZXN0IHRvIGtlZXAgY2FjaGUgc3RhdHMgaW4gdGhlIHBhc3QgJWQgbXMiLAorICAgICAgICAgICAgZnJlcU1zKTsKKyAgICAgICAgcmV0dXJuIG1DYWNoZWRTb3VyY2UtPnNldENhY2hlU3RhdENvbGxlY3RGcmVxKGZyZXFNcyk7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKwogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMDk4LDQgKzIyMjMsNzUgQEAKICAgICByZXR1cm4gbUNhY2hlZFNvdXJjZSAhPSBOVUxMIHx8IG1XVk1FeHRyYWN0b3IgIT0gTlVMTDsKIH0KIAorc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisKKyAgICBGSUxFICpvdXQgPSBmZG9wZW4oZHVwKGZkKSwgInciKTsKKworICAgIGZwcmludGYob3V0LCAiIEF3ZXNvbWVQbGF5ZXJcbiIpOworICAgIGlmIChtU3RhdHMubUZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKG91dCwgIiAgVVJJKCVzKSIsIG1TdGF0cy5tVVJJLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKG91dCwgIiAgZmQoJWQpIiwgbVN0YXRzLm1GZCk7CisgICAgfQorCisgICAgZnByaW50ZihvdXQsICIsIGZsYWdzKDB4JTA4eCkiLCBtU3RhdHMubUZsYWdzKTsKKworICAgIGlmIChtU3RhdHMubUJpdHJhdGUgPj0gMCkgeworICAgICAgICBmcHJpbnRmKG91dCwgIiwgYml0cmF0ZSglbGxkIGJwcykiLCBtU3RhdHMubUJpdHJhdGUpOworICAgIH0KKworICAgIGZwcmludGYob3V0LCAiXG4iKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0YXRzLm1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgVHJhY2tTdGF0ICZzdGF0ID0gbVN0YXRzLm1UcmFja3MuaXRlbUF0KGkpOworCisgICAgICAgIGZwcmludGYob3V0LCAiICBUcmFjayAlZFxuIiwgaSArIDEpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAgIE1JTUUoJXMpIiwgc3RhdC5tTUlNRS5zdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKCFzdGF0Lm1EZWNvZGVyTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZwcmludGYob3V0LCAiLCBkZWNvZGVyKCVzKSIsIHN0YXQubURlY29kZXJOYW1lLnN0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZwcmludGYob3V0LCAiXG4iKTsKKworICAgICAgICBpZiAoKHNzaXplX3QpaSA9PSBtU3RhdHMubVZpZGVvVHJhY2tJbmRleCkgeworICAgICAgICAgICAgZnByaW50ZihvdXQsCisgICAgICAgICAgICAgICAgICAgICIgICB2aWRlb0RpbWVuc2lvbnMoJWQgeCAlZCksICIKKyAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRGVjb2RlZCglbGxkKSwgIgorICAgICAgICAgICAgICAgICAgICAibnVtVmlkZW9GcmFtZXNEcm9wcGVkKCVsbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMubVZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEZWNvZGVkLAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMubU51bVZpZGVvRnJhbWVzRHJvcHBlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmY2xvc2Uob3V0KTsKKyAgICBvdXQgPSBOVUxMOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEF3ZXNvbWVQbGF5ZXI6Om1vZGlmeUZsYWdzKHVuc2lnbmVkIHZhbHVlLCBGbGFnTW9kZSBtb2RlKSB7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgU0VUOgorICAgICAgICAgICAgbUZsYWdzIHw9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0xFQVI6CisgICAgICAgICAgICBtRmxhZ3MgJj0gfnZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgbUZsYWdzID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tRmxhZ3MgPSBtRmxhZ3M7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggYTFmMDRkMy4uNjFiYjJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC03MDEsMTIgKzcwMSwxMSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDAgJiYKLSAgICAgICAgdGltZXN0YW1wVXMgLSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPiBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcykgewotICAgICAgICBpZiAobU51bUdsaXRjaGVzICUgMTAgPT0gMCkgeyAgLy8gRG9uJ3Qgc3BhbSB0aGUgbG9nCi0gICAgICAgICAgICBMT0dWKCJMb25nIGRlbGF5IGRldGVjdGVkIGluIHZpZGVvIHJlY29yZGluZyIpOworICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPiAwKSB7CisgICAgICAgIENIRUNLKHRpbWVzdGFtcFVzID4gbUxhc3RGcmFtZVRpbWVzdGFtcFVzKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKKyAgICAgICAgICAgICsrbU51bUdsaXRjaGVzOwogICAgICAgICB9Ci0gICAgICAgICsrbU51bUdsaXRjaGVzOwogICAgIH0KIAogICAgIC8vIE1heSBuZWVkIHRvIHNraXAgZnJhbWUgb3IgbW9kaWZ5IHRpbWVzdGFtcC4gQ3VycmVudGx5IGltcGxlbWVudGVkCkBAIC03MzIsNiArNzMxLDcgQEAKICAgICB9CiAgICAgKyttTnVtRnJhbWVzUmVjZWl2ZWQ7CiAKKyAgICBDSEVDSyhkYXRhICE9IE5VTEwgJiYgZGF0YS0+c2l6ZSgpID4gMCk7CiAgICAgbUZyYW1lc1JlY2VpdmVkLnB1c2hfYmFjayhkYXRhKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKICAgICBtRnJhbWVUaW1lcy5wdXNoX2JhY2sodGltZVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCmluZGV4IDM2ODk1NTcuLmNjMjI1NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtNDg2LDcgKzQ4Niw4IEBACiAgICAgICAgICAgICBpZiAobUZvcmNlUmVhZCkgewogICAgICAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGZvcmNlZCByZWFkIik7CiAgICAgICAgICAgICAgICAgbUZvcmNlUmVhZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKKyAgICAgICAgICAgICAgICAqdGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDU4YjE3YTcuLmMwYWUyOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiAjaWYgQ0hST01JVU1fQVZBSUxBQkxFCkBAIC0yMiwxMSArMjYsMTkgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1IVFRQQmFzZTo6SFRUUEJhc2UoKSB7fQorSFRUUEJhc2U6OkhUVFBCYXNlKCkKKyAgICA6IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMoMCksCisgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKKyAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCisgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCisgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCisgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7Cit9CiAKIC8vIHN0YXRpYwogc3A8SFRUUEJhc2U+IEhUVFBCYXNlOjpDcmVhdGUodWludDMyX3QgZmxhZ3MpIHsKQEAgLTQyLDQgKzU0LDY5IEBACiAgICAgfQogfQogCit2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQmFuZHdpZHRoRW50cnkgZW50cnk7CisgICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOworICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOworICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7CisgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKKworICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7CisgICAgaWYgKCsrbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA+IDEwMCkgeworICAgICAgICBCYW5kd2lkdGhFbnRyeSAqZW50cnkgPSAmKm1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7CisgICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC09IGVudHJ5LT5tRGVsYXlVczsKKyAgICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyAtPSBlbnRyeS0+bU51bUJ5dGVzOworICAgICAgICBtQmFuZHdpZHRoSGlzdG9yeS5lcmFzZShtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpKTsKKyAgICAgICAgLS1tTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOworCisgICAgICAgIGludDY0X3QgdGltZU5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgaWYgKHRpbWVOb3dVcyAtIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyA+PQorICAgICAgICAgICAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zICogMTAwMExMKSB7CisKKyAgICAgICAgICAgIGlmIChtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcyA9CisgICAgICAgICAgICAgICAgICAgIChtVG90YWxUcmFuc2ZlckJ5dGVzICogOEUzIC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzID0gdGltZU5vd1VzOworICAgICAgICB9CisgICAgfQorCit9CisKK2Jvb2wgSFRUUEJhc2U6OmVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPCAyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqYmFuZHdpZHRoX2JwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSFRUUEJhc2U6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmticHMgPSBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIVFRQQmFzZTo6c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChmcmVxTXMgPCBrTWluQmFuZHdpZHRoQ29sbGVjdEZyZXFNcworICAgICAgICAgICAgfHwgZnJlcU1zID4ga01heEJhbmR3aWR0aENvbGxlY3RGcmVxTXMpIHsKKworICAgICAgICBMT0dFKCJmcmVxdWVuY3kgKCVkIG1zKSBpcyBvdXQgb2YgcmFuZ2UgWzEwMDAsIDYwMDAwXSIsIGZyZXFNcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTE9HSSgiZnJlcXVlbmN5IHNldCB0byAlZCBtcyIsIGZyZXFNcyk7CisgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMgPSBmcmVxTXM7CisgICAgcmV0dXJuIE9LOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUFN0cmVhbS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcAppbmRleCAyY2FmMjExLi5hMTU2ZGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcApAQCAtMTM5LDYgKzEzOSw5IEBACiAgICAgICAgIGludCBzLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBib29sIHNlbmREYXRhKSB7CiAgICAgc3NpemVfdCByZXN1bHQgPSAwOwogCisgICAgaWYgKHMgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgd2hpbGUgKHNpemUgPiAwKSB7CiAgICAgICAgIGZkX3NldCBycywgd3MsIGVzOwogICAgICAgICBGRF9aRVJPKCZycyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggZjZhOGIxNy4uMjhhZGQxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMTI4LDE3ICsxMjgsMjggQEAKICAgICBzaXplX3QgICAgICAgIG1OdW1TdHNzVGFibGVFbnRyaWVzOwogICAgIExpc3Q8aW50MzJfdD4gbVN0c3NUYWJsZUVudHJpZXM7CiAKLSAgICBzaXplX3QgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzOwogICAgIHN0cnVjdCBTdHRzVGFibGVFbnRyeSB7CiAKLSAgICAgICAgU3R0c1RhYmxlRW50cnkodWludDMyX3QgY291bnQsIHVpbnQzMl90IGR1cmF0aW9uVXMpCi0gICAgICAgICAgICA6IHNhbXBsZUNvdW50KGNvdW50KSwgc2FtcGxlRHVyYXRpb25VcyhkdXJhdGlvblVzKSB7fQorICAgICAgICBTdHRzVGFibGVFbnRyeSh1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZHVyYXRpb24pCisgICAgICAgICAgICA6IHNhbXBsZUNvdW50KGNvdW50KSwgc2FtcGxlRHVyYXRpb24oZHVyYXRpb24pIHt9CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlQ291bnQ7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZUR1cmF0aW9uOyAgLy8gdGltZSBzY2FsZSBiYXNlZAogICAgIH07CisgICAgc2l6ZV90ICAgICAgICBtTnVtU3R0c1RhYmxlRW50cmllczsKICAgICBMaXN0PFN0dHNUYWJsZUVudHJ5PiBtU3R0c1RhYmxlRW50cmllczsKIAorICAgIHN0cnVjdCBDdHRzVGFibGVFbnRyeSB7CisgICAgICAgIEN0dHNUYWJsZUVudHJ5KHVpbnQzMl90IGNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpCisgICAgICAgICAgICA6IHNhbXBsZUNvdW50KGNvdW50KSwgc2FtcGxlRHVyYXRpb24odGltZXNjYWxlZER1cikge30KKworICAgICAgICB1aW50MzJfdCBzYW1wbGVDb3VudDsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVEdXJhdGlvbjsgIC8vIHRpbWUgc2NhbGUgYmFzZWQKKyAgICB9OworICAgIGJvb2wgICAgICAgICAgbUhhc05lZ2F0aXZlQ3R0c0RlbHRhRHVyYXRpb247CisgICAgc2l6ZV90ICAgICAgICBtTnVtQ3R0c1RhYmxlRW50cmllczsKKyAgICBMaXN0PEN0dHNUYWJsZUVudHJ5PiBtQ3R0c1RhYmxlRW50cmllczsKKwogICAgIC8vIFNlcXVlbmNlIHBhcmFtZXRlciBzZXQgb3IgcGljdHVyZSBwYXJhbWV0ZXIgc2V0CiAgICAgc3RydWN0IEFWQ1BhcmFtU2V0IHsKICAgICAgICAgQVZDUGFyYW1TZXQodWludDE2X3QgbGVuZ3RoLCBjb25zdCB1aW50OF90ICpkYXRhKQpAQCAtMjE2LDcgKzIyNywxMCBAQAogICAgIHZvaWQgdXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKTsKICAgICB2b2lkIGFkZE9uZVN0c2NUYWJsZUVudHJ5KHNpemVfdCBjaHVua0lkLCBzaXplX3Qgc2FtcGxlSWQpOwogICAgIHZvaWQgYWRkT25lU3Rzc1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUlkKTsKLSAgICB2b2lkIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50NjRfdCBkdXJhdGlvblVzKTsKKworICAgIC8vIER1cmF0aW9uIGlzIHRpbWUgc2NhbGUgYmFzZWQKKyAgICB2b2lkIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCB0aW1lc2NhbGVkRHVyKTsKKyAgICB2b2lkIGFkZE9uZUN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCB0aW1lc2NhbGVkRHVyKTsKICAgICB2b2lkIHNlbmRUcmFja1N1bW1hcnkoYm9vbCBoYXNNdWx0aXBsZVRyYWNrcyk7CiAKICAgICAvLyBXcml0ZSB0aGUgYm94ZXMKQEAgLTIyNSw2ICsyMzksNyBAQAogICAgIHZvaWQgd3JpdGVTdHN6Qm94KCk7CiAgICAgdm9pZCB3cml0ZVN0c3NCb3goKTsKICAgICB2b2lkIHdyaXRlU3R0c0JveCgpOworICAgIHZvaWQgd3JpdGVDdHRzQm94KCk7CiAgICAgdm9pZCB3cml0ZUQyNjNCb3goKTsKICAgICB2b2lkIHdyaXRlUGFzcEJveCgpOwogICAgIHZvaWQgd3JpdGVBdmNjQm94KCk7CkBAIC0xMTQ1LDYgKzExNjAsNyBAQAogICAgICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgKz0gbU51bVN0c2NUYWJsZUVudHJpZXMgKiAxMiArICAvLyBzdHNjIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzICogOCArICAgLy8gc3R0cyBib3ggc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUN0dHNUYWJsZUVudHJpZXMgKiA4ICsgICAvLyBjdHRzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNvQm94U2l6ZUJ5dGVzICsgICAgICAgICAgIC8vIHN0Y28gYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3pCb3hTaXplQnl0ZXM7ICAgICAgICAgICAgLy8gc3RzeiBib3ggc2l6ZQogICAgIH0KQEAgLTExNjQsMTMgKzExODAsMjcgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZVN0dHNUYWJsZUVudHJ5KAotICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQsIGludDY0X3QgZHVyYXRpb25VcykgeworICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgZHVyYXRpb24pIHsKIAotICAgIFN0dHNUYWJsZUVudHJ5IHN0dHNFbnRyeShzYW1wbGVDb3VudCwgZHVyYXRpb25Vcyk7CisgICAgU3R0c1RhYmxlRW50cnkgc3R0c0VudHJ5KHNhbXBsZUNvdW50LCBkdXJhdGlvbik7CiAgICAgbVN0dHNUYWJsZUVudHJpZXMucHVzaF9iYWNrKHN0dHNFbnRyeSk7CiAgICAgKyttTnVtU3R0c1RhYmxlRW50cmllczsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZUN0dHNUYWJsZUVudHJ5KAorICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgZHVyYXRpb24pIHsKKworICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkdXJhdGlvbiA8IDAgJiYgIW1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uKSB7CisgICAgICAgIG1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uID0gdHJ1ZTsKKyAgICB9CisgICAgQ3R0c1RhYmxlRW50cnkgY3R0c0VudHJ5KHNhbXBsZUNvdW50LCBkdXJhdGlvbik7CisgICAgbUN0dHNUYWJsZUVudHJpZXMucHVzaF9iYWNrKGN0dHNFbnRyeSk7CisgICAgKyttTnVtQ3R0c1RhYmxlRW50cmllczsKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgKyttTnVtU3Rjb1RhYmxlRW50cmllczsKICAgICBtQ2h1bmtPZmZzZXRzLnB1c2hfYmFjayhvZmZzZXQpOwpAQCAtMTMwOCw2ICsxMzM4LDcgQEAKICAgICBzaXplX3Qgb3V0c3RhbmRpbmdDaHVua3MgPSAwOwogICAgIENodW5rIGNodW5rOwogICAgIHdoaWxlIChmaW5kQ2h1bmtUb1dyaXRlKCZjaHVuaykpIHsKKyAgICAgICAgd3JpdGVDaHVua1RvRmlsZSgmY2h1bmspOwogICAgICAgICArK291dHN0YW5kaW5nQ2h1bmtzOwogICAgIH0KIApAQCAtMTQ4MCw2ICsxNTExLDcgQEAKICAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyA9IDA7CiAgICAgbU51bVN0c2NUYWJsZUVudHJpZXMgPSAwOwogICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzID0gMDsKKyAgICBtTnVtQ3R0c1RhYmxlRW50cmllcyA9IDA7CiAgICAgbU1kYXRTaXplQnl0ZXMgPSAwOwogICAgIG1Jc01lZGlhVGltZUFkanVzdG1lbnRPbiA9IGZhbHNlOwogICAgIG1QcmV2TWVkaWFUaW1lQWRqdXN0VGltZXN0YW1wVXMgPSAwOwpAQCAtMTQ4OCw2ICsxNTIwLDcgQEAKICAgICBtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzID0gMDsKICAgICBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcyA9IDA7CiAgICAgbU1heENodW5rRHVyYXRpb25VcyA9IDA7CisgICAgbUhhc05lZ2F0aXZlQ3R0c0RlbHRhRHVyYXRpb24gPSBmYWxzZTsKIAogICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CiAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOwpAQCAtMTkyOSwyMSArMTk2MiwyNiBAQAogICAgIGludDY0X3QgY2h1bmtUaW1lc3RhbXBVcyA9IDA7CiAgICAgaW50MzJfdCBuQ2h1bmtzID0gMDsKICAgICBpbnQzMl90IG5aZXJvTGVuZ3RoRnJhbWVzID0gMDsKLSAgICBpbnQ2NF90IGxhc3RUaW1lc3RhbXBVcyA9IDA7ICAvLyBQcmV2aW91cyBzYW1wbGUgdGltZSBzdGFtcCBpbiBtcwotICAgIGludDY0X3QgbGFzdER1cmF0aW9uVXMgPSAwOyAgIC8vIEJldHdlZW4gdGhlIHByZXZpb3VzIHR3byBzYW1wbGVzIGluIG1zCi0gICAgaW50NjRfdCBjdXJyRHVyYXRpb25UaWNrcyA9IDA7ICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKLSAgICBpbnQ2NF90IGxhc3REdXJhdGlvblRpY2tzID0gMDsgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcwotICAgIGludDMyX3Qgc2FtcGxlQ291bnQgPSAxOyAgICAgIC8vIFNhbXBsZSBjb3VudCBpbiB0aGUgY3VycmVudCBzdHRzIHRhYmxlIGVudHJ5Ci0gICAgdWludDMyX3QgcHJldmlvdXNTYW1wbGVTaXplID0gMDsgIC8vIFNpemUgb2YgdGhlIHByZXZpb3VzIHNhbXBsZQorICAgIGludDY0X3QgbGFzdFRpbWVzdGFtcFVzID0gMDsgICAgICAvLyBQcmV2aW91cyBzYW1wbGUgdGltZSBzdGFtcAorICAgIGludDY0X3QgbGFzdEN0dHNUaW1lVXMgPSAwOyAgICAgICAvLyBQcmV2aW91cyBzYW1wbGUgdGltZSBzdGFtcAorICAgIGludDY0X3QgbGFzdER1cmF0aW9uVXMgPSAwOyAgICAgICAvLyBCZXR3ZWVuIHRoZSBwcmV2aW91cyB0d28gc2FtcGxlcworICAgIGludDY0X3QgY3VyckR1cmF0aW9uVGlja3MgPSAwOyAgICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKKyAgICBpbnQ2NF90IGxhc3REdXJhdGlvblRpY2tzID0gMDsgICAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCisgICAgaW50MzJfdCBzYW1wbGVDb3VudCA9IDE7ICAgICAgICAgIC8vIFNhbXBsZSBjb3VudCBpbiB0aGUgY3VycmVudCBzdHRzIHRhYmxlIGVudHJ5CisgICAgaW50NjRfdCBjdXJyQ3R0c0R1clRpY2tzID0gMDsgICAgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcworICAgIGludDY0X3QgbGFzdEN0dHNEdXJUaWNrcyA9IDA7ICAgICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKKyAgICBpbnQzMl90IGN0dHNTYW1wbGVDb3VudCA9IDE7ICAgICAgLy8gU2FtcGxlIGNvdW50IGluIHRoZSBjdXJyZW50IGN0dHMgdGFibGUgZW50cnkKKyAgICB1aW50MzJfdCBwcmV2aW91c1NhbXBsZVNpemUgPSAwOyAgICAgIC8vIFNpemUgb2YgdGhlIHByZXZpb3VzIHNhbXBsZQogICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKLSAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIGludDY0X3QgdGltZXN0YW1wVXMgPSAwOworICAgIGludDY0X3QgY3R0c0RlbHRhVGltZVVzID0gMDsKIAogICAgIGlmIChtSXNBdWRpbykgewogICAgICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIkF1ZGlvVHJhY2tFbmNvZGluZyIsIDAsIDAsIDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiVmlkZW9UcmFja0VuY29kaW5nIiwgMCwgMCwgMCk7CiAgICAgfQotICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogCiAgICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YTsKIApAQCAtMjA2MCw3ICsyMDk4LDYgQEAKICAgICAgICAgICoKICAgICAgICAgICovCiAgICAgICAgIENIRUNLKG1ldGFfZGF0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKLSAgICAgICAgTE9HVigiJXMgdGltZXN0YW1wVXM6ICVsbGQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICBpZiAobU51bVNhbXBsZXMgPT0gMCkgewpAQCAtMjA4MSw2ICsyMTE4LDI0IEBACiAKICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwogICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+PSAwKTsKKyAgICAgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbXBvc2l0aW9uIHRpbWU6IHRpbWVzdGFtcFVzCisgICAgICAgICAgICAgKiBEZWNvZGluZyB0aW1lOiBkZWNvZGluZ1RpbWVVcworICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZSBkZWx0YSA9IGNvbXBvc2l0aW9uIHRpbWUgLSBkZWNvZGluZyB0aW1lCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogV2Ugc2F2ZSBwaWN0dXJlIGRlY29kaW5nIHRpbWUgc3RhbXAgZGVsdGEgaW4gc3R0cyB0YWJsZSBlbnRyaWVzLAorICAgICAgICAgICAgICogYW5kIGNvbXBvc2l0aW9uIHRpbWUgZGVsdGEgZHVyYXRpb24gaW4gY3R0cyB0YWJsZSBlbnRyaWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgQ0hFQ0sobWV0YV9kYXRhLT5maW5kSW50NjQoa0tleURlY29kaW5nVGltZSwgJmRlY29kaW5nVGltZVVzKSk7CisgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgY3R0c0RlbHRhVGltZVVzID0gdGltZXN0YW1wVXMgLSBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gZGVjb2RpbmdUaW1lVXM7CisgICAgICAgICAgICBMT0dWKCJkZWNvZGluZyB0aW1lOiAlbGxkIGFuZCBjdHRzIGRlbHRhIHRpbWU6ICVsbGQiLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBjdHRzRGVsdGFUaW1lVXMpOworICAgICAgICB9CiAKICAgICAgICAgLy8gTWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zCiAgICAgICAgIGlmIChtSXNSZWFsVGltZVJlY29yZGluZykgewpAQCAtMjEzMSwxMSArMjE4NiwyMyBAQAogICAgICAgICAgICAgaWYgKG1OdW1TYW1wbGVzID09IDMgfHwgY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpIHsKICAgICAgICAgICAgICAgICBMT0dWKCIlcyBsYXN0RHVyYXRpb25VczogJWxsZCB1cywgY3VyckR1cmF0aW9uVGlja3M6ICVsbGQgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIGxhc3REdXJhdGlvblVzLCBjdXJyRHVyYXRpb25UaWNrcyk7Ci0gICAgICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVGlja3MpOwogICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gMTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICAgICAgICAgIGN1cnJDdHRzRHVyVGlja3MgPQorICAgICAgICAgICAgICAgICAgICAgKChjdHRzRGVsdGFUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KKyAgICAgICAgICAgICAgICAgICAgIChsYXN0Q3R0c1RpbWVVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgICAgIGlmIChjdXJyQ3R0c0R1clRpY2tzICE9IGxhc3RDdHRzRHVyVGlja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoY3R0c1NhbXBsZUNvdW50LCBsYXN0Q3R0c0R1clRpY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgY3R0c1NhbXBsZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7CiAgICAgICAgICAgICBpZiAobU51bVNhbXBsZXMgPj0gMiAmJiBwcmV2aW91c1NhbXBsZVNpemUgIT0gc2FtcGxlU2l6ZSkgewpAQCAtMjE0OSw2ICsyMjE2LDExIEBACiAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CiAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwogCisgICAgICAgIGlmICghbUlzQXVkaW8pIHsKKyAgICAgICAgICAgIGxhc3RDdHRzRHVyVGlja3MgPSBjdXJyQ3R0c0R1clRpY2tzOworICAgICAgICAgICAgbGFzdEN0dHNUaW1lVXMgPSBjdHRzRGVsdGFUaW1lVXM7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoaXNTeW5jICE9IDApIHsKICAgICAgICAgICAgIGFkZE9uZVN0c3NUYWJsZUVudHJ5KG1OdW1TYW1wbGVzKTsKICAgICAgICAgfQpAQCAtMjIxNywxOSArMjI4OSwyMyBAQAogICAgIC8vIGZyYW1lJ3MgZHVyYXRpb24uCiAgICAgaWYgKG1OdW1TYW1wbGVzID09IDEpIHsKICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSAwOyAgLy8gQSBzaW5nbGUgc2FtcGxlJ3MgZHVyYXRpb24KKyAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSAwOworICAgICAgICBsYXN0Q3R0c0R1clRpY2tzID0gMDsKICAgICB9IGVsc2UgewogICAgICAgICArK3NhbXBsZUNvdW50OyAgLy8gQ291bnQgZm9yIHRoZSBsYXN0IHNhbXBsZQorICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKICAgICB9CiAKICAgICBpZiAobU51bVNhbXBsZXMgPD0gMikgewotICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeSgxLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KDEsIGxhc3REdXJhdGlvblRpY2tzKTsKICAgICAgICAgaWYgKHNhbXBsZUNvdW50IC0gMSA+IDApIHsKLSAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50IC0gMSwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQgLSAxLCBsYXN0RHVyYXRpb25UaWNrcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVGlja3MpOwogICAgIH0KIAorICAgIGFkZE9uZUN0dHNUYWJsZUVudHJ5KGN0dHNTYW1wbGVDb3VudCwgbGFzdEN0dHNEdXJUaWNrcyk7CiAgICAgbVRyYWNrRHVyYXRpb25VcyArPSBsYXN0RHVyYXRpb25VczsKICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CiAKQEAgLTI0MjgsNiArMjUwNCw3IEBACiAgICAgfQogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCiAgICAgd3JpdGVTdHRzQm94KCk7CisgICAgd3JpdGVDdHRzQm94KCk7CiAgICAgaWYgKCFtSXNBdWRpbykgewogICAgICAgICB3cml0ZVN0c3NCb3goKTsKICAgICB9CkBAIC0yNzcyLDIzICsyODQ5LDU1IEBACiAgICAgICAgIENIRUNLKG1TdGFydFRpbWVzdGFtcFVzID4gbW9vdlN0YXJ0VGltZVVzKTsKICAgICAgICAgdHJhY2tTdGFydFRpbWVPZmZzZXRVcyA9IG1TdGFydFRpbWVzdGFtcFVzIC0gbW9vdlN0YXJ0VGltZVVzOwogICAgIH0KLSAgICBpbnQ2NF90IHByZXZUaW1lc3RhbXBVcyA9IHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXM7Ci0gICAgZm9yIChMaXN0PFN0dHNUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3R0c1RhYmxlRW50cmllcy5iZWdpbigpOwotICAgICAgICBpdCAhPSBtU3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgIExpc3Q8U3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1TdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgQ0hFQ0soaXQgIT0gbVN0dHNUYWJsZUVudHJpZXMuZW5kKCkgJiYgaXQtPnNhbXBsZUNvdW50ID09IDEpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlQ291bnQpOworICAgIGludDMyX3QgZHVyID0gKHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihkdXIgKyBpdC0+c2FtcGxlRHVyYXRpb24pOworCisgICAgaW50NjRfdCB0b3RhbENvdW50ID0gMTsKKyAgICB3aGlsZSAoKytpdCAhPSBtU3R0c1RhYmxlRW50cmllcy5lbmQoKSkgewogICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgY2FsY3VsYXRpbmcgdGhlIHNhbXBsZSBkdXJhdGlvbiB0aGUgZXhhY3RseQotICAgICAgICAvLyBzYW1lIHdheSBhcyB3ZSBtYWRlIGRlY2lzaW9uIG9uIGhvdyB0byBjcmVhdGUgc3R0cyBlbnRyaWVzLgotICAgICAgICBpbnQ2NF90IGN1cnJUaW1lc3RhbXBVcyA9IHByZXZUaW1lc3RhbXBVcyArIGl0LT5zYW1wbGVEdXJhdGlvblVzOwotICAgICAgICBpbnQzMl90IGR1ciA9ICgoY3VyclRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCi0gICAgICAgICAgICAocHJldlRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7Ci0gICAgICAgIHByZXZUaW1lc3RhbXBVcyArPSAoaXQtPnNhbXBsZUNvdW50ICogaXQtPnNhbXBsZUR1cmF0aW9uVXMpOwotCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihkdXIpOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUR1cmF0aW9uKTsKKyAgICAgICAgdG90YWxDb3VudCArPSBpdC0+c2FtcGxlQ291bnQ7CiAgICAgfQorICAgIENIRUNLKHRvdGFsQ291bnQgPT0gbU51bVNhbXBsZXMpOwogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHRzCiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUN0dHNCb3goKSB7CisgICAgaWYgKG1Jc0F1ZGlvKSB7ICAvLyBjdHRzIGlzIG5vdCBmb3IgYXVkaW8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIERvIG5vdCB3cml0ZSBjdHRzIGJveCB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBpdC4KKyAgICBpZiAoKG1OdW1DdHRzVGFibGVFbnRyaWVzID09IDEgJiYKKyAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMuYmVnaW4oKS0+c2FtcGxlRHVyYXRpb24gPT0gMCkgfHwKKyAgICAgICAgbU51bUN0dHNUYWJsZUVudHJpZXMgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HVigiY3R0cyBib3ggaGFzICVkIGVudHJpZXMiLCBtTnVtQ3R0c1RhYmxlRW50cmllcyk7CisKKyAgICBtT3duZXItPmJlZ2luQm94KCJjdHRzIik7CisgICAgaWYgKG1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uKSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDAwMDEwMDAwKTsgIC8vIHZlcnNpb249MSwgZmxhZ3M9MAorICAgIH0gZWxzZSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIH0KKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bUN0dHNUYWJsZUVudHJpZXMpOworCisgICAgaW50NjRfdCB0b3RhbENvdW50ID0gMDsKKyAgICBmb3IgKExpc3Q8Q3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1DdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtQ3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKKyAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVEdXJhdGlvbik7CisgICAgICAgIHRvdGFsQ291bnQgKz0gaXQtPnNhbXBsZUNvdW50OworICAgIH0KKyAgICBDSEVDSyh0b3RhbENvdW50ID09IG1OdW1TYW1wbGVzKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gY3R0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHNzQm94KCkgewogICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3MiKTsKICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKQEAgLTI4NjIsOCArMjk3MSw4IEBACiAgICAgICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgYW55IHVzZXIgZGF0YSBzdGFydAogICAgICAqIHdpdGggIlwweEE5IiwgbXVzdCBiZSBmb2xsb3dlZCBieSBpdHMgYXNzb2ljYXRlZAogICAgICAqIGxhbmd1YWdlIGNvZGUuCi0gICAgICogMHgwMDEyOiBsb2NhbGUgZW4KLSAgICAgKiAweDE1Yzc6IGxhbmd1YWdlIDU1NzUKKyAgICAgKiAweDAwMTI6IHRleHQgc3RyaW5nIGxlbmd0aAorICAgICAqIDB4MTVjNzogbGFuZyAobG9jYWxlKSBjb2RlOiBlbgogICAgICAqLwogICAgIHdyaXRlSW50MzIoMHgwMDEyMTVjNyk7CiAgICAgd3JpdGVMYXRpdHVkZShtTGF0aXR1ZGV4MTAwMDApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggODFmMmU0Ny4uNzdhNjYwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjAxLDYgKzIwMiwyMiBAQAogICAgIG1DYWNoZSA9IE5VTEw7CiB9CiAKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgSFRUUEJhc2UqIHNvdXJjZSA9IHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1Tb3VyY2UuZ2V0KCkpOworICAgICAgICByZXR1cm4gc291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGticHMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBzb3VyY2UtPnNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShmcmVxTXMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6aW5pdENoZWNrKCkgY29uc3QgewogICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKIH0KQEAgLTIxMCw3ICsyMjcsOSBAQAogfQogCiB1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgewotICAgIHJldHVybiAobVNvdXJjZS0+ZmxhZ3MoKSAmIH5rV2FudHNQcmVmZXRjaGluZykgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZTsKKyAgICAvLyBSZW1vdmUgSFRUUCByZWxhdGVkIGZsYWdzIHNpbmNlIE51Q2FjaGVkU291cmNlMiBpcyBub3QgSFRUUC1iYXNlZC4KKyAgICB1aW50MzJfdCBmbGFncyA9IG1Tb3VyY2UtPmZsYWdzKCkgJiB+KGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlKTsKKyAgICByZXR1cm4gKGZsYWdzIHwga0lzQ2FjaGluZ0RhdGFTb3VyY2UpOwogfQogCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggODIxYmE5Yi4uZGFjMmVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTk3LDkgKzk3LDYgQEAKICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQoZmFsc2UpLAogICAgICAgbUhhc0NodW5rZWRUcmFuc2ZlckVuY29kaW5nKGZhbHNlKSwKICAgICAgIG1DaHVua0RhdGFCeXRlc0xlZnQoMCksCi0gICAgICBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAotICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCi0gICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CkBAIC00MzEsNyArNDI4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLSAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChuLCBkZWxheVVzKTsKKyAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobiwgZGVsYXlVcyk7CiAKICAgICAgICAgbnVtQnl0ZXNSZWFkICs9IChzaXplX3QpbjsKIApAQCAtNDY3LDcgKzQ2NCw3IEBACiB9CiAKIHVpbnQzMl90IE51SFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZzsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNTE3LDM2ICs1MTQsNiBAQAogICAgIH0KIH0KIAotYm9vbCBOdUhUVFBEYXRhU291cmNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbCgKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7Ci0gICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKLSAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOwotCi0gICAgbUJhbmR3aWR0aEhpc3RvcnkucHVzaF9iYWNrKGVudHJ5KTsKLSAgICBpZiAoKyttTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID4gMTAwKSB7Ci0gICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOwotICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7Ci0gICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOwotICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgfQotfQotCiBzcDxEZWNyeXB0SGFuZGxlPiBOdUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewogICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggNjMzOTcxMC4uYzRmY2M3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtNjEsOCArNjEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KIHN0cnVjdCBDb2RlY0luZm8gewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgY29uc3QgY2hhciAqY29kZWM7CkBAIC0yMDAsNiArMTk4LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguU0VDLkFWQy5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguZ29vZ2xlLmF2Yy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiQVZDRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgIk9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIH0sCkBAIC0xMzg4LDggKzEzODcsNiBAQAogICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAgICAgICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgICAgICBzdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiAgICAgICAgIENIRUNLKGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZCkBAIC0xNjQ2LDE3ICsxNjQzLDcgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwotICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0gICAgZGVmLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQorICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGlmIChtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpIHsKICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleElucHV0LCBPTVhfVFJVRSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE2NjUsNiArMTY1MiwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICBkZWYublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgQ09ERUNfTE9HSSgiYWxsb2NhdGluZyAlbHUgYnVmZmVycyBvZiBzaXplICVsdSBvbiAlcyBwb3J0IiwKICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOwpAQCAtMTk4Myw2ICsxOTgxLDIwIEBACiAgICAgcmV0dXJuIGJ1ZkluZm87CiB9CiAKK2ludDY0X3QgT01YQ29kZWM6OnJldHJpZXZlRGVjb2RpbmdUaW1lVXMoYm9vbCBpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICBDSEVDSyhtSXNFbmNvZGVyKTsKKyAgICBDSEVDSyghbURlY29kaW5nVGltZUxpc3QuZW1wdHkoKSk7CisgICAgTGlzdDxpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBtRGVjb2RpbmdUaW1lTGlzdC5iZWdpbigpOworICAgIGludDY0X3QgdGltZVVzID0gKml0OworCisgICAgLy8gSWYgdGhlIG91dHB1dCBidWZmZXIgaXMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiwKKyAgICAvLyBkbyBub3QgcmVtb3ZlIHRoZSBkZWNvZGluZyB0aW1lIGZyb20gdGhlIGxpc3QuCisgICAgaWYgKCFpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICAgICAgbURlY29kaW5nVGltZUxpc3QuZXJhc2UoaXQpOworICAgIH0KKyAgICByZXR1cm4gdGltZVVzOworfQorCiB2b2lkIE9NWENvZGVjOjpvbl9tZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKICAgICBpZiAobVN0YXRlID09IEVSUk9SKSB7CiAgICAgICAgIExPR1coIkRyb3BwaW5nIE9NWCBtZXNzYWdlIC0gd2UncmUgaW4gRVJST1Igc3RhdGUuIik7CkBAIC0yMTMwLDE0ICsyMTQyLDIxIEBACiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgaXNDb2RlY1NwZWNpZmljID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpc0NvZGVjU3BlY2lmaWMgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc0dyYXBoaWNCdWZmZXIgfHwgbVF1aXJrcyAmIGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZSkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzID0gcmV0cmlldmVEZWNvZGluZ1RpbWVVcyhpc0NvZGVjU3BlY2lmaWMpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCBkZWNvZGluZ1RpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0UG9pbnRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5wbGF0Zm9ybV9wcml2YXRlKTsKQEAgLTI5NDAsNiArMjk1OSw5IEBACiAgICAgICAgIGludDY0X3QgbGFzdEJ1ZmZlclRpbWVVczsKICAgICAgICAgQ0hFQ0soc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbGFzdEJ1ZmZlclRpbWVVcykpOwogICAgICAgICBDSEVDSyhsYXN0QnVmZmVyVGltZVVzID49IDApOworICAgICAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICAgICAgbURlY29kaW5nVGltZUxpc3QucHVzaF9iYWNrKGxhc3RCdWZmZXJUaW1lVXMpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGxhc3RCdWZmZXJUaW1lVXM7CkBAIC00MjU2LDkgKzQyNzgsMTEgQEAKICAgICAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC4iLCA0KSkgewogICAgICAgICAgICAgLy8gTm90IGFuIE9wZW5NYXggY29tcG9uZW50IGJ1dCBhIHNvZnR3YXJlIGNvZGVjLgogCisjaWYgSEFWRV9TT0ZUV0FSRV9ERUNPREVSUwogICAgICAgICAgICAgcmVzdWx0cy0+cHVzaCgpOwogICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgKmNhcHMgPSAmcmVzdWx0cy0+ZWRpdEl0ZW1BdChyZXN1bHRzLT5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIGNhcHMtPm1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyNlbmRpZgogCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKaW5kZXggNWE0NTNlOS4uYTA4ZWI3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCkBAIC0yMTAsOCArMjEwLDcgQEAKICAgICB2bS0+QXR0YWNoQ3VycmVudFRocmVhZCgmZW52LCBOVUxMKTsKICNlbmRpZgogCi0gICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBBTkRST0lEX1BSSU9SSVRZX0ZPUkVHUk9VTkQpOwotICAgIHNldF9zY2hlZF9wb2xpY3koYW5kcm9pZEdldFRpZCgpLCBTUF9GT1JFR1JPVU5EKTsKKyAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKIAogICAgIHN0YXRpY19jYXN0PFRpbWVkRXZlbnRRdWV1ZSAqPihtZSktPnRocmVhZEVudHJ5KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwCmluZGV4IDEwOTY3MTcuLjU4OGE3NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcApAQCAtMzQsOSArMzQsNiBAQAogICAgICAgbUN1cnJlbnRPZmZzZXQoMCksCiAgICAgICBtSU9SZXN1bHQoT0spLAogICAgICAgbUNvbnRlbnRTaXplKC0xKSwKLSAgICAgIG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMoMCksCi0gICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKLSAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKICAgICBtRGVsZWdhdGUtPnNldE93bmVyKHRoaXMpOwpAQCAtMTg4LDcgKzE4NSw3IEBACiAKICAgICAgICAgLy8gVGhlIHJlYWQgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBtSU9SZXN1bHQgY29udGFpbnMKICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAgICAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudF9sKG1JT1Jlc3VsdCwgZGVsYXlVcyk7CisgICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7CiAKICAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OwogICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwpAQCAtMjIxLDcgKzIxOCw3IEBACiB9CiAKIHVpbnQzMl90IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZzsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMjQ2LDM2ICsyNDMsNiBAQAogICAgIGNsZWFyRFJNU3RhdGVfbCgpOwogfQogCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2woCi0gICAgICAgIHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgQmFuZHdpZHRoRW50cnkgZW50cnk7Ci0gICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOwotICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOwotICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKLQotICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgaWYgKCsrbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA+IDEwMCkgewotICAgICAgICBCYW5kd2lkdGhFbnRyeSAqZW50cnkgPSAmKm1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7Ci0gICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC09IGVudHJ5LT5tRGVsYXlVczsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyAtPSBlbnRyeS0+bU51bUJ5dGVzOwotICAgICAgICBtQmFuZHdpZHRoSGlzdG9yeS5lcmFzZShtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpKTsKLSAgICAgICAgLS1tTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotICAgIH0KLX0KLQotYm9vbCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIHNwPERlY3J5cHRIYW5kbGU+IENocm9taXVtSFRUUERhdGFTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzYzg3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTI3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwkuL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF92bGMuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMgXAorCS4vc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMgXAorCS4vc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9kcGIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgXAorCS4vc291cmNlL2gyNjRic2RfdnVpLmMgXAorCS4vc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYyBcCisJLi9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgXAorCVNvZnRBVkMuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4vaW5jIFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisKK01ZX0FTTSA6PSBcCisJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TIFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TIFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUworCisKK01ZX09NWERMX0NfU1JDIDo9IFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgXAorCS4vb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgXAorCS4vb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYworCitNWV9PTVhETF9BU01fU1JDIDo9IFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBcCisKKworaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCisgICAgTE9DQUxfQVJNX05FT04gICA6PSB0cnVlCisjICAgIExPQ0FMX0NGTEFHUyAgICAgOj0gLXN0ZD1jOTkgLUQuX05FT04gLUQuX09NWERMCisgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtREgyNjRERUNfTkVPTiAtREgyNjRERUNfT01YREwKKyAgICBMT0NBTF9TUkNfRklMRVMgICs9ICQoTVlfQVNNKSAkKE1ZX09NWERMX0NfU1JDKSAkKE1ZX09NWERMX0FTTV9TUkMpCisgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpLy4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi9hcGkgXAorICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL2FwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpCitlbmRpZgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBcCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdGVzdCB1dGlsaXR5OiBkZWNvZGVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyBUZXN0IGFwcGxpY2F0aW9uCisjIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAuL3NvdXJjZS9EZWNUZXN0QmVuY2guYworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9oMjY0ZGVjCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisKK0xPQ0FMX01PRFVMRSA6PSBkZWNvZGVyCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZDJlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFWQyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRBVkMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0QVZDOjpTb2Z0QVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1IYW5kbGUoTlVMTCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbVBpY3R1cmVTaXplKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiksCisgICAgICBtQ3JvcExlZnQoMCksCisgICAgICBtQ3JvcFRvcCgwKSwKKyAgICAgIG1Dcm9wV2lkdGgobVdpZHRoKSwKKyAgICAgIG1Dcm9wSGVpZ2h0KG1IZWlnaHQpLAorICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKKyAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCisgICAgICBtUGljSWQoMCksCisgICAgICBtSGVhZGVyc0RlY29kZWQoZmFsc2UpLAorICAgICAgbUVPU1N0YXR1cyhJTlBVVF9EQVRBX0FWQUlMQUJMRSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0QVZDOjp+U29mdEFWQygpIHsKKyAgICBIMjY0U3dEZWNSZWxlYXNlKG1IYW5kbGUpOworICAgIG1IYW5kbGUgPSBOVUxMOworCisgICAgd2hpbGUgKG1QaWNUb0hlYWRlck1hcC5zaXplKCkgIT0gMCkgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLmVkaXRWYWx1ZUF0KDApOworICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbXNBdCgwKTsKKyAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyID0gTlVMTDsKKyAgICB9CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBDSEVDSyhvdXRRdWV1ZS5lbXB0eSgpKTsKKyAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOworCisgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKK30KKwordm9pZCBTb2Z0QVZDOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga0lucHV0UG9ydEluZGV4OworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga091dHB1dFBvcnRJbmRleDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoSDI2NFN3RGVjSW5pdCgmbUhhbmRsZSwgMSkgPT0gSDI2NFNXREVDX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga0lucHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmdldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcmVjdFBhcmFtcyA9IChPTVhfQ09ORklHX1JFQ1RUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocmVjdFBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkxlZnQgPSBtQ3JvcExlZnQ7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uVG9wID0gbUNyb3BUb3A7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uV2lkdGggPSBtQ3JvcFdpZHRoOworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkhlaWdodCA9IG1Dcm9wSGVpZ2h0OworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRU9TU3RhdHVzID09IE9VVFBVVF9GUkFNRVNfRkxVU0hFRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCisgICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKKworICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgeworICAgICAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICsrbVBpY0lkOworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbmV3IE9NWF9CVUZGRVJIRUFERVJUWVBFOworICAgICAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIGhlYWRlci0+bkZsYWdzID0gaW5IZWFkZXItPm5GbGFnczsKKyAgICAgICAgbVBpY1RvSGVhZGVyTWFwLmFkZChtUGljSWQsIGhlYWRlcik7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBIMjY0U3dEZWNJbnB1dCBpblBpY3R1cmU7CisgICAgICAgIEgyNjRTd0RlY091dHB1dCBvdXRQaWN0dXJlOworICAgICAgICBtZW1zZXQoJmluUGljdHVyZSwgMCwgc2l6ZW9mKGluUGljdHVyZSkpOworICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBpblBpY3R1cmUucFN0cmVhbSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGluUGljdHVyZS5waWNJZCA9IG1QaWNJZDsKKyAgICAgICAgaW5QaWN0dXJlLmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAxOworICAgICAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY29kZWRQaWN0dXJlOworCisgICAgICAgIHdoaWxlIChpblBpY3R1cmUuZGF0YUxlbiA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShtSGFuZGxlLCAmaW5QaWN0dXJlLCAmb3V0UGljdHVyZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSB8fAorICAgICAgICAgICAgICAgIHJldCA9PSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSkgeworICAgICAgICAgICAgICAgIGluUGljdHVyZS5kYXRhTGVuIC09ICh1MzIpKG91dFBpY3R1cmUucFN0cm1DdXJyUG9zIC0gaW5QaWN0dXJlLnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gb3V0UGljdHVyZS5wU3RybUN1cnJQb3M7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoJmRlY29kZXJJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8uY3JvcHBpbmdGbGFnICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUmVjdEV2ZW50KCZkZWNvZGVySW5mby5jcm9wUGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoaXMgb3V0cHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3N0IGR1cmluZyBkeW5hbWljIHBvcnQgcmVjb25maWd1cmF0aW9uIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5NQVggY2xpZW50IHdpbGwgZGVsZXRlIF9hbGxfIG91dHB1dCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5waWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRGVjb2RlciBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaXJzdFBpY3R1cmUgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGRyYWluT25lT3V0cHV0QnVmZmVyKG1GaXJzdFBpY3R1cmVJZCwgbUZpcnN0UGljdHVyZSk7CisgICAgICAgICAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOworICAgICAgICAgICAgbUZpcnN0UGljdHVyZSA9IE5VTEw7CisgICAgICAgICAgICBtRmlyc3RQaWN0dXJlSWQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIG1IZWFkZXJzRGVjb2RlZCAmJgorICAgICAgICAgICAgICAgIEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPT0gSDI2NFNXREVDX1BJQ19SRFkpIHsKKworICAgICAgICAgICAgaW50MzJfdCBwaWNJZCA9IGRlY29kZWRQaWN0dXJlLnBpY0lkOworICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopIGRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOworICAgICAgICAgICAgZHJhaW5PbmVPdXRwdXRCdWZmZXIocGljSWQsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVyciwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgU29mdEFWQzo6aGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudChjb25zdCBIMjY0U3dEZWNJbmZvICppbmZvKSB7CisgICAgaWYgKG1XaWR0aCAhPSBpbmZvLT5waWNXaWR0aCB8fCBtSGVpZ2h0ICE9IGluZm8tPnBpY0hlaWdodCkgeworICAgICAgICBtV2lkdGggID0gaW5mby0+cGljV2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBpbmZvLT5waWNIZWlnaHQ7CisgICAgICAgIG1QaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgbUNyb3BXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTb2Z0QVZDOjpoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMgKmNyb3ApIHsKKyAgICBpZiAobUNyb3BMZWZ0ICE9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0IHx8CisgICAgICAgIG1Dcm9wVG9wICE9IGNyb3AtPmNyb3BUb3BPZmZzZXQgfHwKKyAgICAgICAgbUNyb3BXaWR0aCAhPSBjcm9wLT5jcm9wT3V0V2lkdGggfHwKKyAgICAgICAgbUNyb3BIZWlnaHQgIT0gY3JvcC0+Y3JvcE91dEhlaWdodCkgeworICAgICAgICBtQ3JvcExlZnQgPSBjcm9wLT5jcm9wTGVmdE9mZnNldDsKKyAgICAgICAgbUNyb3BUb3AgPSBjcm9wLT5jcm9wVG9wT2Zmc2V0OworICAgICAgICBtQ3JvcFdpZHRoID0gY3JvcC0+Y3JvcE91dFdpZHRoOworICAgICAgICBtQ3JvcEhlaWdodCA9IGNyb3AtPmNyb3BPdXRIZWlnaHQ7CisKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsCisgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTb2Z0QVZDOjpzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSkgeworICAgIENIRUNLKG1GaXJzdFBpY3R1cmUgPT0gTlVMTCk7CisgICAgbUZpcnN0UGljdHVyZUlkID0gcGljSWQ7CisKKyAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbbVBpY3R1cmVTaXplXTsKKyAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgbVBpY3R1cmVTaXplKTsKK30KKwordm9pZCBTb2Z0QVZDOjpkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90KiBkYXRhKSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CisgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gaGVhZGVyLT5uVGltZVN0YW1wOworICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOworICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICBkYXRhLCBtUGljdHVyZVNpemUpOworICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKKyAgICBkZWxldGUgaGVhZGVyOworICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworfQorCitib29sIFNvZnRBVkM6OmRyYWluQWxsT3V0cHV0QnVmZmVycygpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIGlmIChtSGVhZGVyc0RlY29kZWQgJiYKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZID09CisgICAgICAgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUobUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCAxIC8qIGZsdXNoICovKSkgeworCisgICAgICAgICAgICBpbnQzMl90IHBpY0lkID0gZGVjb2RlZFBpY3R1cmUucGljSWQ7CisgICAgICAgICAgICBDSEVDSyhtUGljVG9IZWFkZXJNYXAuaW5kZXhPZktleShwaWNJZCkgPj0gMCk7CisKKyAgICAgICAgICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICAgICAgZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgbVBpY3R1cmVTaXplKTsKKworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IGhlYWRlci0+bkZsYWdzOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOworICAgICAgICAgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOworICAgICAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBtRU9TU3RhdHVzID0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEOworICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNvZnRBVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0RBVEFfQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBTb2Z0QVZDOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aAorICAgICAgICAgICAgKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDM5ZWZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9BVkNfSF8KKworI2RlZmluZSBTT0ZUX0FWQ19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRBVkMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBVkMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0lucHV0UG9ydEluZGV4ICAgPSAwLAorICAgICAgICBrT3V0cHV0UG9ydEluZGV4ICA9IDEsCisgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgID0gOCwKKyAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAxNiwKKyAgICB9OworCisgICAgZW51bSBFT1NTdGF0dXMgeworICAgICAgICBJTlBVVF9EQVRBX0FWQUlMQUJMRSwKKyAgICAgICAgSU5QVVRfRU9TX1NFRU4sCisgICAgICAgIE9VVFBVVF9GUkFNRVNfRkxVU0hFRCwKKyAgICB9OworCisgICAgdm9pZCAqbUhhbmRsZTsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHVpbnQzMl90IG1XaWR0aCwgbUhlaWdodCwgbVBpY3R1cmVTaXplOworICAgIHVpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3A7CisgICAgdWludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CisKKyAgICB1aW50OF90ICptRmlyc3RQaWN0dXJlOworICAgIGludDMyX3QgbUZpcnN0UGljdHVyZUlkOworCisgICAgaW50MzJfdCBtUGljSWQ7ICAvLyBXaGljaCBvdXRwdXQgcGljdHVyZSBpcyBmb3Igd2hpY2ggaW5wdXQgYnVmZmVyPworCisgICAgLy8gT01YX0JVRkZFUkhFQURFUlRZUEUgbWF5IGJlIG92ZXJraWxsLCBidXQgaXQgaXMgY29udmVuaWVudAorICAgIC8vIGZvciB0cmFja2luZyB0aGUgZm9sbG93aW5nIGZpZWxkczogbkZsYWdzLCBuVGltZVN0YW1wLCBldGMuCisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbVBpY1RvSGVhZGVyTWFwOworICAgIGJvb2wgbUhlYWRlcnNEZWNvZGVkOworCisgICAgRU9TU3RhdHVzIG1FT1NTdGF0dXM7CisKKyAgICBlbnVtIE91dHB1dFBvcnRTZXR0aW5nQ2hhbmdlIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9OworICAgIE91dHB1dFBvcnRTZXR0aW5nQ2hhbmdlIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICBib29sIGRyYWluQWxsT3V0cHV0QnVmZmVycygpOworICAgIHZvaWQgZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWRJZCwgdWludDhfdCAqZGF0YSk7CisgICAgYm9vbCBoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMqIGNyb3ApOworICAgIGJvb2wgaGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudChjb25zdCBIMjY0U3dEZWNJbmZvICppbmZvKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0FWQ19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTExMmJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBIZWFkZXJzCisKKyAgICAyLiBFbnVtZXJhdGlvbnMgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBvciBhIHBhcmFtZXRlci4KKyAgICAgICAgMi4xLiBBUEkncyByZXR1cm4gdmFsdWUgZW51bWVyYXRpb25zLgorCisgICAgMy4gVXNlciBTdHJ1Y3R1cmVzCisgICAgICAgIDMuMS4gU3RydWN0dXJlcyBmb3IgSDI2NFN3RGVjRGVjb2RlKCkgcGFyYW1ldGVycy4KKyAgICAgICAgMy4yLiBTdHJ1Y3R1cmVzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSB3aXRoCisgICAgICAgICAgICAgREVDIEFQSSBhbmQgdXNlciBhcHBsaWNhdGlvbi4KKworICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDQVBJX0gKKyNkZWZpbmUgSDI2NFNXREVDQVBJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIEhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgdHlwZWRlZiBlbnVtCisgICAgeworICAgICAgICBIMjY0U1dERUNfT0sgPSAwLAorICAgICAgICBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQgPSAxLAorICAgICAgICBIMjY0U1dERUNfUElDX1JEWSwKKyAgICAgICAgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFksCisgICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSwKKyAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiA9IC0xLAorICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgPSAtMiwKKyAgICAgICAgSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCA9IC0zLAorICAgICAgICBIMjY0U1dERUNfTUVNRkFJTCA9IC00LAorICAgICAgICBIMjY0U1dERUNfSU5JVEZBSUwgPSAtNSwKKyAgICAgICAgSDI2NFNXREVDX0hEUlNfTk9UX1JEWSA9IC02LAorICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCA9IC03CisgICAgfSBIMjY0U3dEZWNSZXQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qIHR5cGVkZWYgb2YgdGhlIERlY29kZXIgaW5zdGFuY2UgKi8KKyAgICB0eXBlZGVmIHZvaWQgKkgyNjRTd0RlY0luc3Q7CisKKyAgICAvKiBJbnB1dCBzdHJ1Y3R1cmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTggICpwU3RyZWFtOyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc3RyZWFtIHRvIGJlIGRlY29kZWQgICAgICAgICAgKi8KKyAgICAgICAgdTMyICBkYXRhTGVuOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSBkZWNvZGVkICAgICAgICAgICAgKi8KKyAgICAgICAgdTMyICBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgZm9yIHRoZSBwaWN0dXJlIHRvIGJlIGRlY29kZWQgKi8KKyAgICAgICAgdTMyIGludHJhQ29uY2VhbG1lbnRNZXRob2Q7IC8qIDAgPSBHcmF5IGNvbmNlYWxtZW50IGZvciBpbnRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFJlZmVyZW5jZSBjb25jZWFsbWVudCBmb3IgaW50cmEgKi8KKworICAgIH0gSDI2NFN3RGVjSW5wdXQ7CisKKworICAgIC8qIE91dHB1dCBzdHJ1Y3R1cmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gcG9zaXRpb24gd2hlcmUgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZCB1cCAqLworICAgIH0gSDI2NFN3RGVjT3V0cHV0OworCisgICAgLyogT3V0cHV0IHN0cnVjdHVyZSBmb3IgSDI2NFN3RGVjTmV4dFBpY3R1cmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTMyICpwT3V0cHV0UGljdHVyZTsgICAgLyogUG9pbnRlciB0byB0aGUgcGljdHVyZSwgWVVWIGZvcm1hdCAgICAgICAqLworICAgICAgICB1MzIgcGljSWQ7ICAgICAgICAgICAgICAvKiBJZGVudGlmaWVyIG9mIHRoZSBwaWN0dXJlIHRvIGJlIGRpc3BsYXllZCovCisgICAgICAgIHUzMiBpc0lkclBpY3R1cmU7ICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUgKi8KKyAgICAgICAgdTMyIG5ick9mRXJyTUJzOyAgICAgICAgLyogTnVtYmVyIG9mIGNvbmNlYWxlZCBNQidzIGluIHRoZSBwaWN0dXJlICAqLworICAgIH0gSDI2NFN3RGVjUGljdHVyZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGggREVDIEFQSQorICAgICAgICAgYW5kIHVzZXIgYXBwbGljYXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHUzMiBjcm9wTGVmdE9mZnNldDsKKyAgICAgICAgdTMyIGNyb3BPdXRXaWR0aDsKKyAgICAgICAgdTMyIGNyb3BUb3BPZmZzZXQ7CisgICAgICAgIHUzMiBjcm9wT3V0SGVpZ2h0OworICAgIH0gQ3JvcFBhcmFtczsKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1MzIgcHJvZmlsZTsKKyAgICAgICAgdTMyIHBpY1dpZHRoOworICAgICAgICB1MzIgcGljSGVpZ2h0OworICAgICAgICB1MzIgdmlkZW9SYW5nZTsKKyAgICAgICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKKyAgICAgICAgdTMyIHBhcldpZHRoOworICAgICAgICB1MzIgcGFySGVpZ2h0OworICAgICAgICB1MzIgY3JvcHBpbmdGbGFnOworICAgICAgICBDcm9wUGFyYW1zIGNyb3BQYXJhbXM7CisgICAgfSBIMjY0U3dEZWNJbmZvOworCisgICAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1MzIgbWFqb3I7ICAgIC8qIERlY29kZXIgQVBJIG1ham9yIHZlcnNpb24gKi8KKyAgICAgICAgdTMyIG1pbm9yOyAgICAvKiBEbmNvZGVyIEFQSSBtaW5vciB2ZXJzaW9uICovCisgICAgfSBIMjY0U3dEZWNBcGlWZXJzaW9uOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0RlY29kZShIMjY0U3dEZWNJbnN0ICAgICAgZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0lucHV0ICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjT3V0cHV0ICAgICpwT3V0cHV0KTsKKworICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNJbml0KEgyNjRTd0RlY0luc3QgKmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nKTsKKworICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNOZXh0UGljdHVyZShIMjY0U3dEZWNJbnN0ICAgICBkZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNQaWN0dXJlICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSk7CisKKyAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyAqcERlY0luZm8pOworCisgICAgdm9pZCAgSDI2NFN3RGVjUmVsZWFzZShIMjY0U3dEZWNJbnN0IGRlY0luc3QpOworCisgICAgSDI2NFN3RGVjQXBpVmVyc2lvbiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKHZvaWQpOworCisgICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBBUEkgdHJhY2UgKi8KKyAgICB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKik7CisKKyAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCisgICAgdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGZyZWUgKi8KKyAgICB2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGNvcHkgKi8KKyAgICB2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCk7CisKKyAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbXNldCAqLworICAgIHZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIMjY0U1dERUNBUElfSCAqLworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZDU2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBCQVNFVFlQRV9IX0lOQ0xVREVECisjZGVmaW5lIEJBU0VUWVBFX0hfSU5DTFVERUQKKworCisjaWZkZWYgX19hcm0KKyNkZWZpbmUgVk9MQVRJTEUgdm9sYXRpbGUKKyNlbHNlCisjZGVmaW5lIFZPTEFUSUxFCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdTg7Cit0eXBlZGVmIHNpZ25lZCBjaGFyICAgICBpODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0ICAgIGkxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgIGkzMjsKKworI2lmIGRlZmluZWQoVkMxU1dERUNfMTZCSVQpIHx8IGRlZmluZWQoTVA0RU5DX0FSTTExKQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdTE2eDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0ICAgIGkxNng7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdTE2eDsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgIGkxNng7CisjZW5kaWYKKworCisjaWZuZGVmIE5VTEwKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAwCisjZWxzZQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgIC8qIEJBU0VUWVBFX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNzBjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUCkBAIC0wLDAgKzEsNjMgQEAKK1RoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCitvZiBBUk0gb24gMTktRmViLTIwMDguCisKK0l0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCisKK1RoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0CitpcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KKworSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0CitxdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTM+LgorCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKKy0gT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEKKyAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKKyAgVjYgb3B0aW1pemVkIGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCisgIGludGVybmFsIGFjY2VzcworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1RoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCitiZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgorCitCZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAorbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCitzbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKK2NvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgorQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCit0aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKK2FuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKK3RoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5CithdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQorcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKK2d1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCitkYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgorQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKK3RvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQorZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKK3dpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKK3dpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKK21haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCisKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitJbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKK3R3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCisKK1RoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxMy5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQorbm90ZS4KKworVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQorZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCisKK1RoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCitNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgorCitUaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKKyJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgorCisgICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDEzLlRYVAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjIzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVApAQCAtMCwwICsxLDkxIEBACisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KK2UwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKK2VkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCis0ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAorNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKKzhmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAorNTNmMmFlOGE5ODQ5NWYwNWUyNmE0Y2Y4NjJhN2Y3NTAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCis1MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKzg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAorOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCis2OTQyODFkMTFhZjUyZjg4ZTZmOWQ0Y2IyMjZhYzhhNyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKK2U3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KKzVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLworZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKzRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCis4NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCis3MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworMzg5NDRjNWUwYmJhMDFlMzJmZjM0OWMyYzg3YzcxYjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCiszMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKzkwYjBlNmEwNGU3NjQ5MDJjMGEwOTAzNjQwYzEwYjMyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCisyOGExOWFlNGZlMjI1ODYyODA4MGQ2YTg5YmI1NGI5MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCis5OGUxOTZiOWUxZmZlYmFmOTFmNjJlYTlkMTdmYjk3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworZjMwMWQ1YTk1ZTA3MzU0ZjU5M2VhNTc0N2MwMWNiMGEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKzQ0YzllZjIxZTg0MGExMDAzMDFmN2Q3YTQxODk5NTdjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworYTMzYjAzYmJkMzM1MmQyNGVkNzQ0NzY5ZTEyYmI4N2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKzAwYzIwYmZkYTY3YmI4NjA5NmI2MTVmYzE3Yzk0YjM1ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKzJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKK2MzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKK2U0ZmVjZDY2YmM0N2YwNzUzOWJjMzA4OTM1ZTg0YTFmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworNzg4MTVjOWRmNTBiYTUzMTMxYmIyMmQyYjgyOWUzYzMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKzE5MDlhZTMxMmFjNzlhMDNhNWZhYzFkMWU4YmMwMjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzNkMmM0ODU4MDY1NTkyODA2NWRlNzgzOTg2NmQ5YmM0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworMjNhYTJmZGYxNTVkNGZhNmZmNzQ1ZWFiNmUwMWYzMmIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKzk3ZjIwYTkzYzQ4MWQ3ZjYxNzNkOTE5ZjQxZTQxNWJkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKK2JlY2Q1MTJkYTIwMjQzNjI4NjgxMWI2YWVjMDYxZjQ3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCitkZDI0YTk5YWUzY2Q4NDJkY2FjYWYzMWQ0N2RlODhiMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCiszNjI4ZmJkZjBjZDIxN2MyODdiNmNjYzk0MTM1ZDA2ZSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisxMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCiszNTk5YjEwNzQzMzA5NjVjOGNhMjg1ZDE2NGVmY2NmZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworMzMzOWUwMjZjN2RlNjU1ZDk0MDA5NDllYjVlNTE0NTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLworNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KK2NkZjQxMjkyMGMyMDM3YTcyNWQwNDIwMDAyYjY3NTJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCitkYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKK2I1NTliNzFkNWM5NDYyN2YxMGU2MTZmYjcyYzBjZWZjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKzFlNGMzYmU4YzVlZGRjMDBjOWYwNWU4M2JjZjMxNWVmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKK2FjYjkyYmUxZGJjZGIzZWJlODI0Y2JlOWUyOGQwM2JmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKK2E2YjQxZjAxYjFkZjdkZDY1NmViZGJhMzA4NGJmYTJhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKK2ZmZTZiOTZjNzRkNDg4MWY0ZDNjOGRlOGNjNzM3Nzk3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKK2ZmNTkxNWQxODFiZmQyY2QyZjBiZDU4OGJkMjMwMGRjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCis2Nzc1ZWIwYzU2MWRiYWI5NjVjNjBmODViMDhjOTZmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKK2EwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKzM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLworNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KK2U2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCis3Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKKzEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAorMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKK2E1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLworNTBjY2E2OTU0YzQ0N2IwMTJhYjM5Y2E3ODcyZTVlOGYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCitkMWMzYmNlNzdmYzU3NzRjODk5YjQ0N2QxM2YwMmNkMCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCitmZGFjMWQxYmFkM2ZkMjNjODgwYmViMzliYzJlODlhYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCis2ZDlhZGMyYmU1YmQwMzExNTkxMDMwZDBjNmRmNzcxYyAgQVJNX0RFTElWRVJZXzk3NDEzLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmgKQEAgLTAsMCArMSw3ODUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogICAKKyAqIEZpbGU6IGFybUNPTU0uaAorICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICoKKyAqLworIAorICAKKyNpZm5kZWYgX2FybUNvbW1vbl9IXworI2RlZmluZSBfYXJtQ29tbW9uX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwordHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07CisKKworI2luY2x1ZGUgImFybU9NWC5oIgorCisjZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBBUk1fREVCVUcKKy8qIGRlYnVnIHZlcnNpb24gKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KKyNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQorI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCisjZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKKyNlbHNlIAorLyogcmVsZWFzZSB2ZXJzaW9uICovCisjZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQorI2VuZGlmIC8qIEFSTV9ERUJVRyAqLworCisvKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKKyNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCisjZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQorCisvKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCisKKyNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCisjZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCisjZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCisjZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCisjZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQorCisvKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCisKKyNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKyNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKworI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludCkoUHRyKSkgJSBOKT09MCkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnQpKFB0cikpICUgTikhPTApCisjZWxzZQorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKKworI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQorI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisgCitPTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICAgICAgT01YX0lOVCBtaW4sCisgICAgICAgIE9NWF9JTlQgbWF4LCAKKyAgICAgICAgT01YX1MzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICAgICAgT01YX0YzMiBtaW4sCisgICAgICAgIE9NWF9GMzIgbWF4LCAKKyAgICAgICAgT01YX0YzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAorICAgICAgICBPTVhfRjMyIHYsIAorICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKKyAgICAgICAgT01YX0lOVCBzYXRCaXRzCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOworCisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorICAgICk7ICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TNjQgYXJtU2F0QWRkX1M2NCgKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRGVidWdnaW5nIG1hY3JvcworICoKKyAqLworCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQorICovCisjZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKKworLyoKKyAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KKyAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KKyAqLworI2lmZGVmIERFQlVHX09OCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQorI2Vsc2UgLyogREVCVUdfT04gKi8KKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKKyNlbmRpZiAvKiBERUJVR19PTiAqLworCisKKy8qCisgKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKKyAqCisgKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KKyAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKKyAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgorICovCisKKyNpZmRlZiBERUJVR19ET01BSU5fQUMKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1ZDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSUMKKy8qIFRvIGJlIGZpbGxlZCBpbiAqLworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fU1AKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2CisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JUAorI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KKworCisjZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLworCisvKkVuZCBvZiBGaWxlKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI5OGZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmgKQEAgLTAsMCArMSw2NzAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fQml0RGVjX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIAorOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCis7Ly8KKzsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCis7Ly8KKzsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCis7Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKKzsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKKzsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgorOy8vCis7Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAorOy8vCis7Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKzsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQorOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQorOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKzsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQorOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKzsvLworOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKKzsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCis7Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorOy8vCis7Ly8gVVNBR0U6Cis7Ly8KKzsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgorOy8vCis7Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAorOy8vCis7Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQorOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCis7Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKKzsvLyBjYWxsIE1fQkRfRklOSS4KKzsvLworOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Cis7Ly8KKzsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQorOy8vCis7Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKKzsvLworOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAorOy8vCis7Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KKzsvLworOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCis7Ly8gdmFyaWFibGVzOgorOy8vCisKKyAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQorICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKKyAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKKyAgIAorOy8vICAgICAgICAKKzsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQorOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCis7Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCis7Ly8KKzsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Cis7Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCis7Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Cis7Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKKzsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKKzsvLworOy8vCisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQorICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKKyAgICAgICAgOy8vIHNjaGVkdWxpbmcuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQorICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKKyAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKKworcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCitCaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKK0JpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkIGlucHV0cworICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQorICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCisgICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQorICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KKyAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMworICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAorICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgorICAgICAgICBNRU5EICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cworICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQorICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQorICAgICAgICBJRiAoJE48PTgpCisgICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEVMU0UgICAgICAgIAorICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCisgICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQorICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQorICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gYnVmZmVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KKyAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04CisgICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKKyAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKKyAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQorICAgICAgICAKKyAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0CisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCisgICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKKzAxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCisgICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5CisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKKyAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKKyAgICAgICAgQkNTICAgICAlRlQwMgorICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKKyAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKKyAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1CisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAorICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAorICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5CiswMgorICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQorICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1CisgICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQorICAgICAgICAKKyAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAorICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKKworICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKKyAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKKyAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3CisgICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKKyAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4CisKKyAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKKyAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKKyAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCisgICAgICAgIAorICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCisKKyAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKKyAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4CisgICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNworICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICAKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKKyAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKKyAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKKyAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAorICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCisgICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5YmMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApAQCAtMCwwICsxLDIxMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBjb21tb24gQVBJJ3MvRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1heCBFbmNvZGVycy9EZWNvZGVycy4KKyAqCisgKi8KKworI2lmbmRlZiBfYXJtQ29kZWNfSF8KKyNkZWZpbmUgX2FybUNvZGVjX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1U4ICAgY29kZUxlbjsKKyAgICBPTVhfVTMyCSBjb2RlV29yZDsKK30gQVJNX1ZMQzMyOworCisvKiBUaGUgYWJvdmUgc2hvdWxkIGJlIHJlbmFtZWQgYXMgIkFSTV9WTEMzMiIgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpOworCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICoqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogIkFSTV9OT19DT0RFQk9PS19JTkRFWCA9IDB4RkZGRiIgaWYgc2VhcmNoIGZhaWxzLgorICoqLworCisjZGVmaW5lIEFSTV9OT19DT0RFQk9PS19JTkRFWCAoT01YX1UxNikoMHhGRkZGKQorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBPZmZzZXQJICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCWNvZGVXb3JkCQlDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXQljb2RlTGVuZ3RoCQlMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKTsKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispOworCisjZW5kaWYgICAgICAvKl9hcm1Db2RlY19IXyovCisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGIzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlICAgICAgICAgOiBhcm1DT01NX0lEQ1RUYWJsZS5oCisgKiBEZXNjcmlwdGlvbiAgOiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGFibGVzIGZvciBJRENUIGNhbGN1bGF0aW9uLgorICoKKyAqLworICAKKyNpZm5kZWYgX2FybUNPTU1fSURDVFRhYmxlX0hfCisjZGVmaW5lIF9hcm1DT01NX0lEQ1RUYWJsZV9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF07CisKKyNlbmRpZiAvKiBfYXJtQ09NTV9JRENUVGFibGVfSF8gKi8KKworCisvKiBFbmQgb2YgRmlsZSAqLworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmNzEzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaApAQCAtMCwwICsxLDE0NDUgQEAKKzsvLworOy8vIFRoaXMgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBvbmx5IGFzCis7Ly8gYXV0aG9yaXNlZCBieSBhIGxpY2Vuc2luZyBhZ3JlZW1lbnQgZnJvbSBBUk0gTGltaXRlZAorOy8vICAgKEMpIENPUFlSSUdIVCAyMDA0IEFSTSBMaW1pdGVkCis7Ly8gICAgICAgQUxMIFJJR0hUUyBSRVNFUlZFRAorOy8vIFRoZSBlbnRpcmUgbm90aWNlIGFib3ZlIG11c3QgYmUgcmVwcm9kdWNlZCBvbiBhbGwgYXV0aG9yaXNlZAorOy8vIGNvcGllcyBhbmQgY29waWVzIG1heSBvbmx5IGJlIG1hZGUgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQKKzsvLyBieSBhIGxpY2Vuc2luZyBhZ3JlZW1lbnQgZnJvbSBBUk0gTGltaXRlZC4KKzsvLworOy8vIElEQ1Rfcy5zCis7Ly8KKzsvLyBJbnZlcnNlIERDVCBtb2R1bGUKKzsvLworOy8vIAorOy8vIEFMR09SSVRITSBERVNDUklQVElPTgorOy8vCis7Ly8gVGhlIDh4OCAyRCBJRENUIGlzIHBlcmZvcm1lZCBieSBjYWxjdWxhdGluZyBhIDFEIElEQ1QgZm9yIGVhY2gKKzsvLyBjb2x1bW4gYW5kIHRoZW4gYSAxRCBJRENUIGZvciBlYWNoIHJvdy4KKzsvLworOy8vIFRoZSA4LXBvaW50IDFEIElEQ1QgaXMgZGVmaW5lZCBieQorOy8vICAgZih4KSA9IChDKDApKlQoMCkqYygwLHgpICsgLi4uICsgQyg3KSpUKDcpKmMoNyx4KSkvMgorOy8vCis7Ly8gICBDKHUpID0gMS9zcXJ0KDIpIGlmIHU9MCBvciAxIGlmIHUhPTAKKzsvLyAgIGModSx4KSA9IGNvcyggKDJ4KzEpKnUqcGkvMTYgKQorOy8vCis7Ly8gV2UgY29tcHV0ZSB0aGUgOC1wb2ludCAxRCBJRENUIHVzaW5nIHRoZSByZXZlcnNlIG9mCis7Ly8gdGhlIEFyYWktQWd1aS1OYWthamltYSBmbG93IGdyYXBoIHdoaWNoIHdlIHNwbGl0IGludG8KKzsvLyA1IHN0YWdlcyBuYW1lZCBpbiByZXZlcnNlIG9yZGVyIHRvIGlkZW50aWZ5IHdpdGggdGhlCis7Ly8gZm9yd2FyZCBEQ1QuIERpcmVjdCBpbnZlcnNpb24gb2YgdGhlIGZvcndhcmQgZm9ybXVsYWUKKzsvLyBpbiBmaWxlIEZEQ1Rfcy5zIGdpdmVzOgorOy8vCis7Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KSAgWyBBKHUpPTQqQyh1KSpjKHUsMCkgXQorOy8vICAgICAgICAgICAgIFsgQSgwKSA9IDIqc3FydCgyKQorOy8vICAgICAgICAgICAgICAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApIF0KKzsvLworOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAorOy8vICAgICAgICAgICAgIGkzID0gKGoyK2o2KS8yICAgICAgaTIgPSAoajItajYpLzIKKzsvLyAgICAgICAgICAgICBpNyA9IChqNStqMykvMiAgICAgIGk0ID0gKGo1LWozKS8yCis7Ly8gICAgICAgICAgICAgaTUgPSAoajErajcpLzIgICAgICBpNiA9IChqMS1qNykvMgorOy8vCis7Ly8gSVN0YWdlIDM6ICAgaDAgPSAoaTAraTEpLzIgICAgICBoMSA9IChpMC1pMSkvMgorOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMworOy8vICAgICAgICAgICAgIGg0ID0gIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNgorOy8vICAgICAgICAgICAgIGg2ID0gLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNgorOy8vICAgICAgICAgICAgIFsgVGhlIGFib3ZlIHR3byBsaW5lcyByb3RhdGUgYnkgLShwaS84KSBdCis7Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpL3NxcnQyICBoNyA9IChpNStpNykvMiAKKzsvLyAgICAgICAgICAgICAKKzsvLyBJU3RhZ2UgMjogICBnMCA9IChoMCtoMykvMiAgICAgIGczID0gKGgwLWgzKS8yCis7Ly8gICAgICAgICAgICAgZzEgPSAoaDEraDIpLzIgICAgICBnMiA9IChoMS1oMikvMgorOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Cis7Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKKzsvLworOy8vIElTdGFnZSAxOiAgIGYwID0gKGcwK2c3KS8yICAgICAgZjcgPSAoZzAtZzcpLzIKKzsvLyAgICAgICAgICAgICBmMSA9IChnMStnNikvMiAgICAgIGY2ID0gKGcxLWc2KS8yCis7Ly8gICAgICAgICAgICAgZjIgPSAoZzIrZzUpLzIgICAgICBmNSA9IChnMi1nNSkvMgorOy8vICAgICAgICAgICAgIGYzID0gKGczK2c0KS8yICAgICAgZjQgPSAoZzMtZzQpLzIKKzsvLworOy8vIE5vdGUgdGhhdCBtb3N0IGNvZWZmaWNpZW50cyBhcmUgaGFsdmVkIDMgdGltZXMgZHVyaW5nIHRoZQorOy8vIGFib3ZlIGNhbGN1bGF0aW9uLiBXZSBjYW4gcmVzY2FsZSB0aGUgYWxnb3JpdGhtIGRpdmlkaW5nCis7Ly8gdGhlIGlucHV0IGJ5IDggdG8gcmVtb3ZlIHRoZSBoYWx2aW5ncy4KKzsvLworOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkvOAorOy8vCis7Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Cis7Ly8gICAgICAgICAgICAgaTMgPSBqMiArIGo2ICAgICAgICBpMiA9IGoyIC0gajYKKzsvLyAgICAgICAgICAgICBpNyA9IGo1ICsgajMgICAgICAgIGk0ID0gajUgLSBqMworOy8vICAgICAgICAgICAgIGk1ID0gajEgKyBqNyAgICAgICAgaTYgPSBqMSAtIGo3Cis7Ly8KKzsvLyBJU3RhZ2UgMzogICBoMCA9IGkwICsgaTEgICAgICAgIGgxID0gaTAgLSBpMQorOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMworOy8vICAgICAgICAgICAgIGg0ID0gMiooIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNikKKzsvLyAgICAgICAgICAgICBoNiA9IDIqKC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYpCis7Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpKnNxcnQyICBoNyA9IGk1ICsgaTcgCis7Ly8gICAgICAgICAgICAgCis7Ly8gSVN0YWdlIDI6ICAgZzAgPSBoMCArIGgzICAgICAgICBnMyA9IGgwIC0gaDMKKzsvLyAgICAgICAgICAgICBnMSA9IGgxICsgaDIgICAgICAgIGcyID0gaDEgLSBoMgorOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Cis7Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKKzsvLworOy8vIElTdGFnZSAxOiAgIGYwID0gZzAgKyBnNyAgICAgICAgZjcgPSBnMCAtIGc3Cis7Ly8gICAgICAgICAgICAgZjEgPSBnMSArIGc2ICAgICAgICBmNiA9IGcxIC0gZzYKKzsvLyAgICAgICAgICAgICBmMiA9IGcyICsgZzUgICAgICAgIGY1ID0gZzIgLSBnNQorOy8vICAgICAgICAgICAgIGYzID0gZzMgKyBnNCAgICAgICAgZjQgPSBnMyAtIGc0Cis7Ly8KKzsvLyBOb3RlOgorOy8vIDEuIFRoZSBzY2FsaW5nIGJ5IEEodSkvOCBjYW4gb2Z0ZW4gYmUgY29tYmluZWQgd2l0aCBpbnZlcnNlCis7Ly8gICAgcXVhbnRpemF0aW9uLiBUaGUgY29sdW1uIGFuZCByb3cgc2NhbGluZ3MgY2FuIGJlIGNvbWJpbmVkLgorOy8vIDIuIFRoZSBmbG93Z3JhcGggaW4gdGhlIEFBTiBwYXBlciBoYXMgaDQsZzYgbmVnYXRlZCBjb21wYXJlZAorOy8vICAgIHRvIHRoZSBhYm92ZSBjb2RlIGJ1dCBpcyBvdGhlcndpc2UgaWRlbnRpY2FsLgorOy8vIDMuIFRoZSByb3RhdGlvbiBieSAtcGkvOCBjYW4gYmUgcGVmb3JtZWQgdXNpbmcgdGhyZWUgbXVsdGlwbGllcworOy8vICAgIEVnICBjKmk0K3MqaTYgPSAoaTYtaTQpKnMgKyAoYytzKSppNAorOy8vICAgICAgIC1zKmk0K2MqaTYgPSAoaTYtaTQpKnMgKyAoYy1zKSppNgorOy8vIDQuIElmIHxUKHUpfDw9MSB0aGVuIGZyb20gdGhlIElEQ1QgZGVmaW5pdGlvbiwKKzsvLyAgICB8Zih4KXwgPD0gKCgxL3NxcnQyKSArIHxjKDEseCl8ICsgLi4gKyB8Yyg3LHgpfCkvMgorOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgY29zKHBpLzE2KSArIC4uLiArIGNvcyg3KnBpLzE2KSkvMgorOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgKGNvdChwaS8zMiktMSkvMikvMgorOy8vICAgICAgICAgICAgPSAoMSArIGNvcyhwaS8xNikgKyBjb3MoMnBpLzE2KSArIGNvcygzcGkvMTYpKS9zcXJ0KDIpCis7Ly8gICAgICAgICAgICA9IChhcHByb3gpMi42NAorOy8vICAgIFNvIHRoZSBtYXggZ2FpbiBvZiB0aGUgMkQgSURDVCBpcyB+eDcuMCA9IDMgYml0cy4KKzsvLyAgICBUaGUgdGFibGUgYmVsb3cgc2hvd3MgaW5wdXQgcGF0dGVybnMgZ2VuZXJhdGluZyB0aGUgbWF4aW11bQorOy8vICAgIHZhbHVlIG9mIHxmKHUpfCBmb3IgaW5wdXQgaW4gdGhlIHJhbmdlIHxUKHgpfDw9MS4gTT0tMSwgUD0rMQorOy8vICAgIElucHV0UGF0dGVybiAgICAgIE1heCB8Zih4KXwKKzsvLyAgICAgIFBQUFBQUFBQICAgICAgICB8ZjB8ID0gIDIuNjQKKzsvLyAgICAgIFBQUE1NTU1NICAgICAgICB8ZjF8ID0gIDIuNjQKKzsvLyAgICAgIFBQTU1NUFBQICAgICAgICB8ZjJ8ID0gIDIuNjQKKzsvLyAgICAgIFBQTU1QUE1NICAgICAgICB8ZjN8ID0gIDIuNjQKKzsvLyAgICAgIFBNTVBQTU1QICAgICAgICB8ZjR8ID0gIDIuNjQKKzsvLyAgICAgIFBNTVBNTVBNICAgICAgICB8ZjV8ID0gIDIuNjQKKzsvLyAgICAgIFBNUFBNUE1QICAgICAgICB8ZjZ8ID0gIDIuNjQKKzsvLyAgICAgIFBNUE1QTVBNICAgICAgICB8Zjd8ID0gIDIuNjQKKzsvLyAgIE5vdGUgdGhhdCB0aGlzIGlucHV0IHBhdHRlcm4gaXMgdGhlIHRyYW5zcG9zZSBvZiB0aGUKKzsvLyAgIGNvcnJlc3BvbmRpbmcgbWF4IGlucHV0IHBhdHRlciBmb3IgdGhlIEZEQ1QuCisKKzsvLyBBcmd1bWVudHMKKworcFNyYyAgICBSTiAwICAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKK1N0cmlkZSAgUk4gMSAgICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCitwRGVzdCAgIFJOIDIgICAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCitwU2NhbGUgIFJOIDMgICAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQorCisKKyAgICAgICAgOy8vIERDVCBJbnZlcnNlIE1hY3JvCisgICAgICAgIDsvLyBUaGUgRENUIGNvZGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZCBhY2NvcmRpbmcKKyAgICAgICAgOy8vIHRvIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgorICAgICAgICA7Ly8gJG91dHNpemUgPSAidTgiICA6ICA4LWJpdCB1bnNpZ25lZCBkYXRhIHNhdHVyYXRlZCAoMCB0byArMjU1KQorICAgICAgICA7Ly8gICAgICAgICAgICAiczkiICA6IDE2LWJpdCBzaWduZWQgZGF0YSBzYXR1cmF0ZWQgdG8gOS1iaXQgKC0yNTYgdG8gKzI1NSkKKyAgICAgICAgOy8vICAgICAgICAgICAgInMxNiIgOiAxNi1iaXQgc2lnbmVkIGRhdGEgbm90IHNhdHVyYXRlZCAobWF4IHNpemUgfisvLTE0MjczKQorICAgICAgICA7Ly8gJGluc2NhbGUgPSAiczE2IiA6IHNpZ25lZCAxNi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMTUgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vICAgICAgICAgICAgInMzMiIgOiBzaWduZWQgMzItYml0IGFhbi1zY2FsZSB0YWJsZSwgUTIzIGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXRzOgorICAgICAgICA7Ly8gcFNyYyAgID0gcjAgPSBQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgUmFuZ2UgaXMgLTI1NiB0byArMjU1ICg5LWJpdCkKKyAgICAgICAgOy8vIFN0cmlkZSA9IHIxID0gU3RyaWRlIGJldHdlZW4gaW5wdXQgbGluZXMKKyAgICAgICAgOy8vIHBEZXN0ICA9IHIyID0gUG9pbnRlciB0byBvdXRwdXQgZGF0YQorICAgICAgICA7Ly8gcFNjYWxlID0gcjMgPSBQb2ludGVyIHRvIGFhbi1zY2FsZSB0YWJsZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYnkgJGluc2NhbGUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUICAkb3V0c2l6ZSwgJGluc2NhbGUsICRzdHJpZGUKKyAgICAgICAgTENMQSAgICBTSElGVAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLyBSRUdJU1RFUiBBTExPQ0FUSU9OCis7Ly8gVGhpcyBpcyBoYXJkIHNpbmNlIHdlIGhhdmUgOCB2YWx1ZXMsIDkgZnJlZSByZWdpc3RlcnMgYW5kIGVhY2gKKzsvLyBidXR0ZXJmbHkgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuIFdlIGFsc28gd2FudCB0byAKKzsvLyBtYWludGFpbiByZWdpc3RlciBvcmRlciBzbyB3ZSBjYW4gdXNlIExETS9TVE0uIFRoZSB0YWJsZSBiZWxvdworOy8vIHN1bW1hcmlzZXMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gdGhhdCBtZWV0cyBhbGwgdGhlc2UgY3JpdGVyaWEuCis7Ly8gYT0xc3Rjb2wsIGI9Mm5kY29sLCBmLGcsaCxpIGFyZSBkYXRhZmxvdyBwb2ludHMgZGVzY3JpYmVkIGFib3ZlLgorOy8vCis7Ly8gcjEgIGEwMSAgICAgZzAgIGgwCis7Ly8gcjQgIGIwMSBmMCAgZzEgIGgxICBpMAorOy8vIHI1ICBhMjMgZjEgIGcyICAgICAgaTEKKzsvLyByNiAgYjIzIGYyICBnMyAgaDIgIGkyCis7Ly8gcjcgIGE0NSBmMyAgICAgIGgzICBpMworOy8vIHI4ICBiNDUgZjQgIGc0ICBoNCAgaTQKKzsvLyByOSAgYTY3IGY1ICBnNSAgaDUgIGk1Cis7Ly8gcjEwIGI2NyBmNiAgZzYgIGg2ICBpNgorOy8vIHIxMSAgICAgZjcgIGc3ICBoNyAgaTcKKzsvLworcmEwMSAgICBSTiAxCityYjAxICAgIFJOIDQKK3JhMjMgICAgUk4gNQorcmIyMyAgICBSTiA2CityYTQ1ICAgIFJOIDcKK3JiNDUgICAgUk4gOAorcmE2NyAgICBSTiA5CityYjY3ICAgIFJOIDEwCitydG1wICAgIFJOIDExCitjc1BpQnk4IFJOIDEyICAgOy8vIFsgKFNpbihwaS84KUBRMTUpLCAoQ29zKHBpLzgpQFExNSkgXQorTG9vcFJSMiBSTiAxNCAgIDsvLyBbIExvb3BOdW1iZXI8PDEzICwgKDEvU3FydCgyKSlAUTE1IF0KKzsvLyBUcmFuc3Bvc2UgYWxsb2NhdGlvbgoreGZ0ICAgICBSTiByYTAxCit4ZjAgICAgIFJOIHJiMDEKK3hmMSAgICAgUk4gcmEyMworeGYyICAgICBSTiByYjIzCit4ZjMgICAgIFJOIHJhNDUKK3hmNCAgICAgUk4gcmI0NQoreGY1ICAgICBSTiByYTY3Cit4ZjYgICAgIFJOIHJiNjcKK3hmNyAgICAgUk4gcnRtcAorOy8vIElTdGFnZSAxIGFsbG9jYXRpb24KK3hnMCAgICAgUk4geGZ0Cit4ZzEgICAgIFJOIHhmMAoreGcyICAgICBSTiB4ZjEKK3hnMyAgICAgUk4geGYyCit4Z3QgICAgIFJOIHhmMworeGc0ICAgICBSTiB4ZjQKK3hnNSAgICAgUk4geGY1Cit4ZzYgICAgIFJOIHhmNgoreGc3ICAgICBSTiB4ZjcKKzsvLyBJU3RhZ2UgMiBhbGxvY2F0aW9uCit4aDAgICAgIFJOIHhnMAoreGgxICAgICBSTiB4ZzEKK3hodCAgICAgUk4geGcyCit4aDIgICAgIFJOIHhnMworeGgzICAgICBSTiB4Z3QKK3hoNCAgICAgUk4geGc0Cit4aDUgICAgIFJOIHhnNQoreGg2ICAgICBSTiB4ZzYKK3hoNyAgICAgUk4geGc3Cis7Ly8gSVN0YWdlIDMsNCBhbGxvY2F0aW9uCit4aXQgICAgIFJOIHhoMAoreGkwICAgICBSTiB4aDEKK3hpMSAgICAgUk4geGh0Cit4aTIgICAgIFJOIHhoMgoreGkzICAgICBSTiB4aDMKK3hpNCAgICAgUk4geGg0Cit4aTUgICAgIFJOIHhoNQoreGk2ICAgICBSTiB4aDYKK3hpNyAgICAgUk4geGg3CisgICAgICAgIAorICAgICAgICBNX1NUUiAgIHBEZXN0LCAgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fU1RSICAgU3RyaWRlLCBwU3RyaWRlCisgICAgICAgIEVORElGCisgICAgICAgIE1fQURSICAgcERlc3QsICBwQmxrCisgICAgICAgIExEUiAgICAgY3NQaUJ5OCwgPTB4MzBmYzc2NDIKKyAgICAgICAgTERSICAgICBMb29wUlIyLCA9MHgwMDAwNWE4MgorICAKK3Y2X2lkY3RfY29sJF9GCisgICAgICAgIDsvLyBMb2FkIGV2ZW4gdmFsdWVzCisgICAgICAgIExEUiAgICAgeGk0LCBbcFNyY10sICM0ICA7Ly8gajAKKyAgICAgICAgTERSICAgICB4aTUsIFtwU3JjLCAjNCoxNi00XSAgOy8vIGo0CisgICAgICAgIExEUiAgICAgeGk2LCBbcFNyYywgIzIqMTYtNF0gIDsvLyBqMgorICAgICAgICBMRFIgICAgIHhpNywgW3BTcmMsICM2KjE2LTRdICA7Ly8gajYKKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSBFdmVuIFZhbHVlcworICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiIDsvLyAxNngxNiBtdWwKK1NISUZUICAgICAgIFNFVEEgICAgMTIKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzQKKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjNCoxNi00XSAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzIqMTYtNF0KKyAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCisgICAgICAgICAgICBTTUxBQkIgIHhpMywgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTQsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFCQiAgeGkwLCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNSwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTMsIHhpMywgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMywgeGk0LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNioxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTEsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk2LCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkwLCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgU01MQUJCICB4aTIsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk3LCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMSwgeGkxLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkxLCB4aTYsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCitTSElGVCAgICAgICBTRVRBICAgICgxMis4LTE2KQorICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzgKKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMCozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzQqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNCozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTUsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZSwgIzIqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMiozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzYqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNiozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTcsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIG9kZCB2YWx1ZXMKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNi00XSAgICAgIDsvLyBqMQorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2LTRdICAgICAgOy8vIGo3CisgICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTYtNF0gICAgICA7Ly8gajUKKyAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNi00XSAgICAgIDsvLyBqMworICAgICAgICAKKyAgICAgICAgSUYgIHtUUlVFfQorICAgICAgICAgICAgOy8vIHNob3J0Y3V0IGlmIG9kZCB2YWx1ZXMgMAorICAgICAgICAgICAgVEVRICAgICB4aTAsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMSwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkyLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTMsICMwCisgICAgICAgICAgICBCRVEgICAgIHY2T2RkWmVybyRfRgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIHNjYWxlZCBldmVuIHZhbHVlcworICAgICAgICBTVE1JQSAgIHBEZXN0LCB7eGk0LCB4aTUsIHhpNiwgeGk3fQorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIG9kZCB2YWx1ZXMKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IgorICAgICAgICAgICAgOy8vIFBlcmZvcm0gQUFOIFNjYWxlCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMTYtNF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNyoxNi00XSAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzUqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGk3LCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQUJCICB4aTQsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkxLCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNywgeGk3LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk3LCB4aTAsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpNSwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTIsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTQsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBTTUxBQkIgIHhpNiwgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTMsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk1LCB4aTUsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTUsIHhpMiwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICMxKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNyozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICM3KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMCwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTAsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkxLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMSwgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjNSozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM1KjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjMyozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMiwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTIsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkzLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMywgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0XSAgICAgICAgICAgIDsvLyBqMCwgajQgc2NhbGVkCisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxCisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgU0FERDE2ICB4ZjMsIHhnMywgeGc0CisgICAgICAgIFNTVUIxNiAgeGY0LCB4ZzMsIHhnNAorICAgICAgICBTQUREMTYgIHhmMiwgeGcyLCB4ZzUKKyAgICAgICAgU1NVQjE2ICB4ZjUsIHhnMiwgeGc1CisgICAgICAgIFNBREQxNiAgeGYxLCB4ZzEsIHhnNgorICAgICAgICBTU1VCMTYgIHhmNiwgeGcxLCB4ZzYKKyAgICAgICAgU0FERDE2ICB4ZjAsIHhnMCwgeGc3CisgICAgICAgIFNTVUIxNiAgeGY3LCB4ZzAsIHhnNworICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKKyAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCisgICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgQiAgICAgICB2Nl9pZGN0X3JvdyRfRgorICAgICAgICAKK3Y2T2RkWmVybyRfRgorICAgICAgICBTU1VCMTYgIHhpMiwgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajItajYpCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpNCwgeGk1CisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTQsIHhpNSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIE1PViAgeGYzLCB4ZzMKKyAgICAgICAgTU9WICB4ZjQsIHhnMworICAgICAgICBNT1YgIHhmMiwgeGcyCisgICAgICAgIE1PViAgeGY1LCB4ZzIKKyAgICAgICAgTU9WICB4ZjEsIHhnMQorICAgICAgICBNT1YgIHhmNiwgeGcxCisgICAgICAgIE1PViAgeGYwLCB4ZzAKKyAgICAgICAgTU9WICB4ZjcsIHhnMAorICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZQorICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCisgICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKKyAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgCisgICAgICAgIAordjZfaWRjdF9yb3ckX0YKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3M0dG83IHgxLzQKKyAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNl0gICAgICA7Ly8gajEKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNl0gICAgICA7Ly8gNCpqNworICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2XSAgICAgIDsvLyBqNQorICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2XSAgICAgIDsvLyBqMworICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gMipqNworICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzIqMTZdICAgICAgOy8vIGoyCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzYqMTZdICAgICAgOy8vIDIqajYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKKyAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3CisgICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNgorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo2CisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNCoxNl0gICAgICA7Ly8gajQKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjXSwgIzQgICAgICAgICA7Ly8gajAKKworICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgeGkwLCB4aTAsIHhpdCwgTFNMICMyICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAorICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBTSEFERDE2IHhmMywgeGczLCB4ZzQKKyAgICAgICAgU0hTVUIxNiB4ZjQsIHhnMywgeGc0CisgICAgICAgIFNIQUREMTYgeGYyLCB4ZzIsIHhnNQorICAgICAgICBTSFNVQjE2IHhmNSwgeGcyLCB4ZzUKKyAgICAgICAgU0hBREQxNiB4ZjEsIHhnMSwgeGc2CisgICAgICAgIFNIU1VCMTYgeGY2LCB4ZzEsIHhnNgorICAgICAgICBTSEFERDE2IHhmMCwgeGcwLCB4ZzcKKyAgICAgICAgU0hTVUIxNiB4ZjcsIHhnMCwgeGc3CisgICAgICAgIAorICAgICAgICA7Ly8gU2F0dXJhdGUKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIFVTQVQxNiAgeGYwLCAjOCwgeGYwCisgICAgICAgICAgICBVU0FUMTYgIHhmMSwgIzgsIHhmMQorICAgICAgICAgICAgVVNBVDE2ICB4ZjIsICM4LCB4ZjIKKyAgICAgICAgICAgIFVTQVQxNiAgeGYzLCAjOCwgeGYzCisgICAgICAgICAgICBVU0FUMTYgIHhmNCwgIzgsIHhmNAorICAgICAgICAgICAgVVNBVDE2ICB4ZjUsICM4LCB4ZjUKKyAgICAgICAgICAgIFVTQVQxNiAgeGY2LCAjOCwgeGY2CisgICAgICAgICAgICBVU0FUMTYgIHhmNywgIzgsIHhmNyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCisgICAgICAgICAgICBTU0FUMTYgIHhmMCwgIzksIHhmMAorICAgICAgICAgICAgU1NBVDE2ICB4ZjEsICM5LCB4ZjEKKyAgICAgICAgICAgIFNTQVQxNiAgeGYyLCAjOSwgeGYyCisgICAgICAgICAgICBTU0FUMTYgIHhmMywgIzksIHhmMworICAgICAgICAgICAgU1NBVDE2ICB4ZjQsICM5LCB4ZjQKKyAgICAgICAgICAgIFNTQVQxNiAgeGY1LCAjOSwgeGY1CisgICAgICAgICAgICBTU0FUMTYgIHhmNiwgIzksIHhmNgorICAgICAgICAgICAgU1NBVDE2ICB4ZjcsICM5LCB4ZjcgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0byBSb3csIFBhY2sgYW5kIHN0b3JlCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICBPUlIgICAgIHhmMCwgeGYwLCB4ZjEsIExTTCAjOCA7Ly8gWyBiMSBiMCBhMSBhMCBdCisgICAgICAgICAgICBPUlIgICAgIHhmMiwgeGYyLCB4ZjMsIExTTCAjOCA7Ly8gWyBiMyBiMiBhMyBhMiBdCisgICAgICAgICAgICBPUlIgICAgIHhmNCwgeGY0LCB4ZjUsIExTTCAjOCA7Ly8gWyBiNSBiNCBhNSBhNCBdCisgICAgICAgICAgICBPUlIgICAgIHhmNiwgeGY2LCB4ZjcsIExTTCAjOCA7Ly8gWyBiNyBiNiBhNyBhNiBdCisgICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYyLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMiwgeGYwLCBBU1IgIzE2CisgICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmNCwgeGY2LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmNiwgeGY0LCBBU1IgIzE2CisgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyM30KKyAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9CisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKTpMT1I6KCIkb3V0c2l6ZSI9InMxNiIpICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X3JvdyRfRgorICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKworICAgICAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKK1NyYzAgICAgICAgICAgICBFUVUgIDcgICAgICAgICAgICAgIAorU3JjMSAgICAgICAgICAgIEVRVSAgOCAgICAgICAgICAgICAgCitTcmMyICAgICAgICAgICAgRVFVICA5ICAgICAgICAgICAgICAKK1NyYzMgICAgICAgICAgICBFUVUgIDEwICAgICAgICAgICAgICAKK1NyYzQgICAgICAgICAgICBFUVUgIDExICAgICAgICAgICAgICAKK1NyYzUgICAgICAgICAgICBFUVUgIDEyICAgICAgICAgICAgICAKK1NyYzYgICAgICAgICAgICBFUVUgIDEzCitTcmM3ICAgICAgICAgICAgRVFVICAxNAorVG1wICAgICAgICAgICAgIEVRVSAgMTUKKworcVhqMCAgICAgICAgICAgIFFOIFNyYzAuUzE2IAorcVhqMSAgICAgICAgICAgIFFOIFNyYzEuUzE2CitxWGoyICAgICAgICAgICAgUU4gU3JjMi5TMTYKK3FYajMgICAgICAgICAgICBRTiBTcmMzLlMxNgorcVhqNCAgICAgICAgICAgIFFOIFNyYzQuUzE2CitxWGo1ICAgICAgICAgICAgUU4gU3JjNS5TMTYKK3FYajYgICAgICAgICAgICBRTiBTcmM2LlMxNgorcVhqNyAgICAgICAgICAgIFFOIFNyYzcuUzE2CitxWGp0ICAgICAgICAgICAgUU4gVG1wLlMxNgorCitkWGowbG8gICAgICAgICAgRE4gKFNyYzAqMikuUzE2CitkWGowaGkgICAgICAgICAgRE4gKFNyYzAqMisxKS5TMTYKK2RYajFsbyAgICAgICAgICBETiAoU3JjMSoyKS5TMTYKK2RYajFoaSAgICAgICAgICBETiAoU3JjMSoyKzEpLlMxNgorZFhqMmxvICAgICAgICAgIEROIChTcmMyKjIpLlMxNgorZFhqMmhpICAgICAgICAgIEROIChTcmMyKjIrMSkuUzE2CitkWGozbG8gICAgICAgICAgRE4gKFNyYzMqMikuUzE2CitkWGozaGkgICAgICAgICAgRE4gKFNyYzMqMisxKS5TMTYKK2RYajRsbyAgICAgICAgICBETiAoU3JjNCoyKS5TMTYKK2RYajRoaSAgICAgICAgICBETiAoU3JjNCoyKzEpLlMxNgorZFhqNWxvICAgICAgICAgIEROIChTcmM1KjIpLlMxNgorZFhqNWhpICAgICAgICAgIEROIChTcmM1KjIrMSkuUzE2CitkWGo2bG8gICAgICAgICAgRE4gKFNyYzYqMikuUzE2CitkWGo2aGkgICAgICAgICAgRE4gKFNyYzYqMisxKS5TMTYKK2RYajdsbyAgICAgICAgICBETiAoU3JjNyoyKS5TMTYKK2RYajdoaSAgICAgICAgICBETiAoU3JjNyoyKzEpLlMxNgorZFhqdGxvICAgICAgICAgIEROIChUbXAqMikuUzE2CitkWGp0aGkgICAgICAgICAgRE4gKFRtcCoyKzEpLlMxNgorCitxWGkwICAgICAgICAgICAgUU4gcVhqMAorcVhpMSAgICAgICAgICAgIFFOIHFYajQKK3FYaTIgICAgICAgICAgICBRTiBxWGoyCitxWGkzICAgICAgICAgICAgUU4gcVhqNworcVhpNCAgICAgICAgICAgIFFOIHFYajUKK3FYaTUgICAgICAgICAgICBRTiBxWGp0CitxWGk2ICAgICAgICAgICAgUU4gcVhqMQorcVhpNyAgICAgICAgICAgIFFOIHFYajYKK3FYaXQgICAgICAgICAgICBRTiBxWGozCisKK2RYaTBsbyAgICAgICAgICBETiBkWGowbG8KK2RYaTBoaSAgICAgICAgICBETiBkWGowaGkKK2RYaTFsbyAgICAgICAgICBETiBkWGo0bG8KK2RYaTFoaSAgICAgICAgICBETiBkWGo0aGkKK2RYaTJsbyAgICAgICAgICBETiBkWGoybG8KK2RYaTJoaSAgICAgICAgICBETiBkWGoyaGkKK2RYaTNsbyAgICAgICAgICBETiBkWGo3bG8KK2RYaTNoaSAgICAgICAgICBETiBkWGo3aGkKK2RYaTRsbyAgICAgICAgICBETiBkWGo1bG8KK2RYaTRoaSAgICAgICAgICBETiBkWGo1aGkKK2RYaTVsbyAgICAgICAgICBETiBkWGp0bG8KK2RYaTVoaSAgICAgICAgICBETiBkWGp0aGkKK2RYaTZsbyAgICAgICAgICBETiBkWGoxbG8KK2RYaTZoaSAgICAgICAgICBETiBkWGoxaGkKK2RYaTdsbyAgICAgICAgICBETiBkWGo2bG8KK2RYaTdoaSAgICAgICAgICBETiBkWGo2aGkKK2RYaXRsbyAgICAgICAgICBETiBkWGozbG8KK2RYaXRoaSAgICAgICAgICBETiBkWGozaGkKKworcVhoMCAgICAgICAgICAgIFFOIHFYaXQKK3FYaDEgICAgICAgICAgICBRTiBxWGkwCitxWGgyICAgICAgICAgICAgUU4gcVhpMgorcVhoMyAgICAgICAgICAgIFFOIHFYaTMKK3FYaDQgICAgICAgICAgICBRTiBxWGk3CitxWGg1ICAgICAgICAgICAgUU4gcVhpNQorcVhoNiAgICAgICAgICAgIFFOIHFYaTQKK3FYaDcgICAgICAgICAgICBRTiBxWGkxCitxWGh0ICAgICAgICAgICAgUU4gcVhpNgorCitkWGgwbG8gICAgICAgICAgRE4gZFhpdGxvCitkWGgwaGkgICAgICAgICAgRE4gZFhpdGhpCitkWGgxbG8gICAgICAgICAgRE4gZFhpMGxvCitkWGgxaGkgICAgICAgICAgRE4gZFhpMGhpCitkWGgybG8gICAgICAgICAgRE4gZFhpMmxvCitkWGgyaGkgICAgICAgICAgRE4gZFhpMmhpCitkWGgzbG8gICAgICAgICAgRE4gZFhpM2xvCitkWGgzaGkgICAgICAgICAgRE4gZFhpM2hpCitkWGg0bG8gICAgICAgICAgRE4gZFhpN2xvCitkWGg0aGkgICAgICAgICAgRE4gZFhpN2hpCitkWGg1bG8gICAgICAgICAgRE4gZFhpNWxvCitkWGg1aGkgICAgICAgICAgRE4gZFhpNWhpCitkWGg2bG8gICAgICAgICAgRE4gZFhpNGxvCitkWGg2aGkgICAgICAgICAgRE4gZFhpNGhpCitkWGg3bG8gICAgICAgICAgRE4gZFhpMWxvCitkWGg3aGkgICAgICAgICAgRE4gZFhpMWhpCitkWGh0bG8gICAgICAgICAgRE4gZFhpNmxvCitkWGh0aGkgICAgICAgICAgRE4gZFhpNmhpCisKK3FYZzAgICAgICAgICAgICBRTiBxWGgyCitxWGcxICAgICAgICAgICAgUU4gcVhodAorcVhnMiAgICAgICAgICAgIFFOIHFYaDEKK3FYZzMgICAgICAgICAgICBRTiBxWGgwCitxWGc0ICAgICAgICAgICAgUU4gcVhoNAorcVhnNSAgICAgICAgICAgIFFOIHFYaDUKK3FYZzYgICAgICAgICAgICBRTiBxWGg2CitxWGc3ICAgICAgICAgICAgUU4gcVhoNworcVhndCAgICAgICAgICAgIFFOIHFYaDMKKworcVhmMCAgICAgICAgICAgIFFOIHFYZzYKK3FYZjEgICAgICAgICAgICBRTiBxWGc1CitxWGYyICAgICAgICAgICAgUU4gcVhnNAorcVhmMyAgICAgICAgICAgIFFOIHFYZ3QKK3FYZjQgICAgICAgICAgICBRTiBxWGczCitxWGY1ICAgICAgICAgICAgUU4gcVhnMgorcVhmNiAgICAgICAgICAgIFFOIHFYZzEKK3FYZjcgICAgICAgICAgICBRTiBxWGcwCitxWGZ0ICAgICAgICAgICAgUU4gcVhnNworCisKK3FYdDAgICAgICAgICAgICBRTiAxLlMzMgorcVh0MSAgICAgICAgICAgIFFOIDIuUzMyCitxVDBsbyAgICAgICAgICAgUU4gMS5TMzIgICAgICAgICAKK3FUMGhpICAgICAgICAgICBRTiAyLlMzMiAgICAgICAgIAorcVQxbG8gICAgICAgICAgIFFOIDMuUzMyICAgICAgICAgCitxVDFoaSAgICAgICAgICAgUU4gNC5TMzIgICAgICAgICAKK3FTY2FsZWxvICAgICAgICBRTiA1LlMzMiAgICAgICAgOy8vIHVzZWQgdG8gcmVhZCBwb3N0IHNjYWxlIHZhbHVlcworcVNjYWxlaGkgICAgICAgIFFOIDYuUzMyCitxVGVtcDAgICAgICAgICAgUU4gNS5TMzIgICAgICAgICAKK3FUZW1wMSAgICAgICAgICBRTiA2LlMzMiAgICAKKworCitTY2FsZTEgICAgICAgICAgRVFVIDYKK1NjYWxlMiAgICAgICAgICBFUVUgMTUKK3FTY2FsZTEgICAgICAgICBRTiBTY2FsZTEuUzE2ICAgICAKK3FTY2FsZTIgICAgICAgICBRTiBTY2FsZTIuUzE2ICAgICAKK2RTY2FsZTFsbyAgICAgICBETiAoU2NhbGUxKjIpLlMxNiAgICAgCitkU2NhbGUxaGkgICAgICAgRE4gKFNjYWxlMSoyKzEpLlMxNgorZFNjYWxlMmxvICAgICAgIEROIChTY2FsZTIqMikuUzE2ICAgICAKK2RTY2FsZTJoaSAgICAgICBETiAoU2NhbGUyKjIrMSkuUzE2CisKK2RDb2VmcyAgICAgICAgICBETiAwLlMxNiAgICAgICAgOy8vIFNjYWxlIGNvZWZmaWNpZW50cyBpbiBmb3JtYXQge1swXSBbQ10gW1NdIFtJbnZTcXJ0Ml19CitJbnZTcXJ0MiAgICAgICAgRE4gZENvZWZzWzBdICAgIDsvLyAxL3NxcnQoMikgaW4gUTE1CitTICAgICAgICAgICAgICAgRE4gZENvZWZzWzFdICAgIDsvLyBTaW4oUEkvOCkgaW4gUTE1CitDICAgICAgICAgICAgICAgRE4gZENvZWZzWzJdICAgIDsvLyBDb3MoUEkvOCkgaW4gUTE1CisKK3BUZW1wICAgICAgICAgICBSTiAxMgorCisgICAgICAgICAgICAgICAgCisgICAgICAgIElNUE9SVCAgYXJtQ09NTV9JRENUQ29lZgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge3FYajAscVhqMX0sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGoyLHFYajN9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqNCxxWGo1fSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajYscVhqN30sIFtwU3JjIEA2NF0hCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBQcmVTY2FsZSBhbmQgbXVsdGlwbHkgd2l0aCBTcmMKKyAgICAgICAgOy8vIElTdGFnZSA0CisgICAgICAgIAorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNlgxNiBNdWwKKyAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMlgzMiAsdWwKKyAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIElTdGFnZSAzCisgICAgICAgIFZRUkRNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWUVJETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQorICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKKworICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0CisgICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0CisgICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2CisgICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2CisgICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNworICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKKyAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgorCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgorICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNworICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCisKKyAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKK1hUUjAgICAgICAgICAgICBFUVUgU3JjNQorWFRSMSAgICAgICAgICAgIEVRVSBUbXAKK1hUUjIgICAgICAgICAgICBFUVUgU3JjNgorWFRSMyAgICAgICAgICAgIEVRVSBTcmM3CitYVFI0ICAgICAgICAgICAgRVFVIFNyYzMKK1hUUjUgICAgICAgICAgICBFUVUgU3JjMAorWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCitYVFI3ICAgICAgICAgICAgRVFVIFNyYzIKK1hUUnQgICAgICAgICAgICBFUVUgU3JjNAorICAgICAgICAgICAgICAgIAorcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCitxQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCitxQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCitxQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCitxQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCitxQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCitxQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCitxQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCisKK2RCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKK2RCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKK2RCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKK2RCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKK2RCNCAgICAgICAgICAgICBETiAgWFRSNCoyCitkQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgorZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKK2RCNyAgICAgICAgICAgICBETiAgWFRSNyoyCisKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQorICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCisgICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNworICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgorICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMworICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgorICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0CisgICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1CisgICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2CisgICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3CisgICAgICAgIAorCitxWWowICAgICAgICAgICAgUU4gcVhmMAorcVlqMSAgICAgICAgICAgIFFOIHFYZjEKK3FZajIgICAgICAgICAgICBRTiBxWGYyCitxWWozICAgICAgICAgICAgUU4gcVhmMworcVlqNCAgICAgICAgICAgIFFOIHFYZjQKK3FZajUgICAgICAgICAgICBRTiBxWGY1CitxWWo2ICAgICAgICAgICAgUU4gcVhmNgorcVlqNyAgICAgICAgICAgIFFOIHFYZjcKK3FZanQgICAgICAgICAgICBRTiBxWGZ0CisKK2RZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKK2RZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgorZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgorZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2CitkWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2CitkWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKK2RZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKK2RZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgorZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgorZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2CitkWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2CitkWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKK2RZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKK2RZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgorZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgorZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2CitkWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2CitkWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKKworcVlpMCAgICAgICAgICAgIFFOIHFZajAKK3FZaTEgICAgICAgICAgICBRTiBxWWo0CitxWWkyICAgICAgICAgICAgUU4gcVlqMgorcVlpMyAgICAgICAgICAgIFFOIHFZajcKK3FZaTQgICAgICAgICAgICBRTiBxWWo1CitxWWk1ICAgICAgICAgICAgUU4gcVlqdAorcVlpNiAgICAgICAgICAgIFFOIHFZajEKK3FZaTcgICAgICAgICAgICBRTiBxWWo2CitxWWl0ICAgICAgICAgICAgUU4gcVlqMworCitkWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCitkWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCitkWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCitkWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCitkWWkybG8gICAgICAgICAgRE4gZFlqMmxvCitkWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCitkWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCitkWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCitkWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCitkWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCitkWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCitkWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCitkWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCitkWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCitkWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCitkWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCitkWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCitkWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCisKK3FZaDAgICAgICAgICAgICBRTiBxWWl0CitxWWgxICAgICAgICAgICAgUU4gcVlpMAorcVloMiAgICAgICAgICAgIFFOIHFZaTIKK3FZaDMgICAgICAgICAgICBRTiBxWWkzCitxWWg0ICAgICAgICAgICAgUU4gcVlpNworcVloNSAgICAgICAgICAgIFFOIHFZaTUKK3FZaDYgICAgICAgICAgICBRTiBxWWk0CitxWWg3ICAgICAgICAgICAgUU4gcVlpMQorcVlodCAgICAgICAgICAgIFFOIHFZaTYKKworZFloMGxvICAgICAgICAgIEROIGRZaXRsbworZFloMGhpICAgICAgICAgIEROIGRZaXRoaQorZFloMWxvICAgICAgICAgIEROIGRZaTBsbworZFloMWhpICAgICAgICAgIEROIGRZaTBoaQorZFloMmxvICAgICAgICAgIEROIGRZaTJsbworZFloMmhpICAgICAgICAgIEROIGRZaTJoaQorZFloM2xvICAgICAgICAgIEROIGRZaTNsbworZFloM2hpICAgICAgICAgIEROIGRZaTNoaQorZFloNGxvICAgICAgICAgIEROIGRZaTdsbworZFloNGhpICAgICAgICAgIEROIGRZaTdoaQorZFloNWxvICAgICAgICAgIEROIGRZaTVsbworZFloNWhpICAgICAgICAgIEROIGRZaTVoaQorZFloNmxvICAgICAgICAgIEROIGRZaTRsbworZFloNmhpICAgICAgICAgIEROIGRZaTRoaQorZFloN2xvICAgICAgICAgIEROIGRZaTFsbworZFloN2hpICAgICAgICAgIEROIGRZaTFoaQorZFlodGxvICAgICAgICAgIEROIGRZaTZsbworZFlodGhpICAgICAgICAgIEROIGRZaTZoaQorCitxWWcwICAgICAgICAgICAgUU4gcVloMgorcVlnMSAgICAgICAgICAgIFFOIHFZaHQKK3FZZzIgICAgICAgICAgICBRTiBxWWgxCitxWWczICAgICAgICAgICAgUU4gcVloMAorcVlnNCAgICAgICAgICAgIFFOIHFZaDQKK3FZZzUgICAgICAgICAgICBRTiBxWWg1CitxWWc2ICAgICAgICAgICAgUU4gcVloNgorcVlnNyAgICAgICAgICAgIFFOIHFZaDcKK3FZZ3QgICAgICAgICAgICBRTiBxWWgzCisKK3FZZjAgICAgICAgICAgICBRTiBxWWc2CitxWWYxICAgICAgICAgICAgUU4gcVlnNQorcVlmMiAgICAgICAgICAgIFFOIHFZZzQKK3FZZjMgICAgICAgICAgICBRTiBxWWd0CitxWWY0ICAgICAgICAgICAgUU4gcVlnMworcVlmNSAgICAgICAgICAgIFFOIHFZZzIKK3FZZjYgICAgICAgICAgICBRTiBxWWcxCitxWWY3ICAgICAgICAgICAgUU4gcVlnMAorcVlmdCAgICAgICAgICAgIFFOIHFZZzcKKworICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgorICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQorICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3CisgICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgorICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgorICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKKworICAgICAgICBWUVJETVVMSCAgICAgcVlpMiwgcVlpMiwgSW52U3FydDIgICAgOy8vIGkyL3NxcnQoMikKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwVGVtcCwgIzB4NCAgICAgICAgICAgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKKyAgICAgICAgVkRVUCAgICAgICAgcVNjYWxlMSwgcFRlbXAgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKKyAgICAgICAgVkFERCAgICAgICAgcVlpMCwgcVlpMCwgcVNjYWxlMQorICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVloMCwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWWgxLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwLWkxKS8yCisKKyAgICAgICAgVkhBREQgICAgICAgcVloNywgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICBWU1VCICAgICAgICBxWWg1LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaDIsIHFZaTIsIHFZaTMgICAgICAgIDsvLyBoMiwgaDMKKyAgICAgICAgVlFSRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCisKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAorICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgorICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNworICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2CisgICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgorICAgICAgICAKKworICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgorICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3CisgICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCisKK1lUUjAgICAgICAgICAgICBFUVUgU3JjMAorWVRSMSAgICAgICAgICAgIEVRVSBTcmM0CitZVFIyICAgICAgICAgICAgRVFVIFNyYzEKK1lUUjMgICAgICAgICAgICBFUVUgU3JjMgorWVRSNCAgICAgICAgICAgIEVRVSBTcmM3CitZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKK1lUUjYgICAgICAgICAgICBFUVUgVG1wCitZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKK1lUUnQgICAgICAgICAgICBFUVUgU3JjMworCitxQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQorcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgorcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgorcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgorcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgorcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgorcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgorcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgorCitkRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQorZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQorZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQorZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKK2RENSAgICAgICAgICAgICBETiAgWVRSNSoyCitkRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgorZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQorICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCisgICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNworICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgorICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMworICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgorICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0CisgICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1CisgICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2CisgICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3CisKKyAgICAgICAgCitkWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4CitkWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4CitkWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4CitkWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4CitkWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4CitkWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4CitkWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4CitkWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4CisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgorICAgICAgICA7Ly8KKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMworICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQorICAgICAgICAgICAgCisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORElGCisKKworCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorCisKKworICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93CisgICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAorICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgorICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IEZsYWcKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKKyAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQorICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdworICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93CisgICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCisgICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCisgICAgICAgIElGICIkTGFzdFJvdyI9IjAiCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQorICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgorICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCisgICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKK3FTY2FsZTBsbyAgICAgICBRTiAwLlMzMgorcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCitxU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKK3FTY2FsZTFoaSAgICAgICBRTiAzLlMzMgorcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQorCitxU3JjMGxvICAgICAgICAgUU4gNC5TMzIKK3FTcmMwaGkgICAgICAgICBRTiA1LlMzMgorcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCitxU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKK3FTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCitxU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQorcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKKworcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQorCisgICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAwCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAxICYgNworICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAyICYgNgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCisgICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAorICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCisgICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIDsvLyBSb3cgNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGE5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5CisgKi8KKyAKKworCisjaWZuZGVmIF9BUk1DT01NX01BU0tUQUJMRV9IXworI2RlZmluZSBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisgIAorLyogTWFzayB0YWJsZSAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U1YjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNiIKKworLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCisKKworI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmMWZjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKQEAgLTAsMCArMSwxMTU0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIGNvbW1vbiBoZWFkZXIgZmlsZQorOy8vCisKKzsvLyBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uCisgSUYgOkxOT1Q6OkRFRjpBUk1DT01NX1NfSAorIEdCTEwgQVJNQ09NTV9TX0gKKworICAgICAgICBSRVFVSVJFOCAgICAgICAgICAgIDsvLyBSZXF1aXJlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIFBSRVNFUlZFOCAgICAgICAgICAgOy8vIFByZXNlcnZlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIAorICAgICAgICBHQkxMICAgIEFSTV9FUlJPUkNIRUNLCitBUk1fRVJST1JDSEVDSyAgU0VUTCB7RkFMU0V9CisKKzsvLyBHbG9iYWxzCisKKyAgICAgICAgR0JMUyAgICBfUlJlZ0xpc3QgICA7Ly8gUiBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX0RSZWdMaXN0ICAgOy8vIEQgc2F2ZWQgcmVnaXN0ZXIgbGlzdAorICAgICAgICBHQkxTICAgIF9WYXJpYW50ICAgIDsvLyBTZWxlY3RlZCBwcm9jZXNzb3IgdmFyaWFudAorICAgICAgICBHQkxTICAgIF9DUFUgICAgICAgIDsvLyBDUFUgbmFtZQorICAgICAgICBHQkxTICAgIF9TdHJ1Y3QgICAgIDsvLyBTdHJ1Y3R1cmUgbmFtZQorICAgICAgICAKKyAgICAgICAgR0JMTCAgICBfSW5GdW5jICAgICA7Ly8gSW5zaWRlIGZ1bmN0aW9uIGFzc2VtYmx5IGZsYWcKKyAgICAgICAgR0JMTCAgICBfU3dMb25nICAgICA7Ly8gTG9uZyBzd2l0Y2ggZmxhZworICAgICAgICAKKyAgICAgICAgR0JMQSAgICBfUkJ5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHJlZ2lzdGVyIGJ5dGVzIG9uIHN0YWNrCisgICAgICAgIEdCTEEgICAgX1NCeXRlcyAgICAgOy8vIE51bWJlciBvZiBzY3JhdGNoIGJ5dGVzIG9uIHN0YWNrIAorICAgICAgICBHQkxBICAgIF9BQnl0ZXMgICAgIDsvLyBTdGFjayBvZmZzZXQgb2YgbmV4dCBhcmd1bWVudAorICAgICAgICBHQkxBICAgIF9Xb3Jrc3BhY2UgIDsvLyBTdGFjayBvZmZzZXQgb2Ygc2NyYXRjaCB3b3Jrc3BhY2UKKyAgICAgICAgR0JMQSAgICBfRiAgICAgICAgICA7Ly8gRnVuY3Rpb24gbnVtYmVyCisgICAgICAgIEdCTEEgICAgX1N0T2ZmICAgICAgOy8vIFN0cnVjdCBvZmZzZXQKKyAgICAgICAgR0JMQSAgICBfU3dOdW0gICAgICA7Ly8gU3dpdGNoIG51bWJlcgorICAgICAgICBHQkxTICAgIF8zMiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDMyIGJ5dGUgYWxpZ25tbmV0CisgICAgICAgIEdCTFMgICAgXzE2ICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMTYgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgCitfSW5GdW5jICAgICAgICAgU0VUTCAgICB7RkFMU0V9CitfU0J5dGVzICAgICAgICAgU0VUQSAgICAwCitfRiAgICAgICAgICAgICAgU0VUQSAgICAwCitfU3dOdW0gICAgICAgICAgU0VUQSAgICAwCitfMzIgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04zMiIKK18xNiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjE2IgorCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gT3ZlcnJpZGUgdGhlIHRvb2xzIHNldHRpbmdzIG9mIHRoZSBDUFUgaWYgdGhlICNkZWZpbmUKKzsvLyBVU0VDUFUgaXMgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBDUFUgZGVmaW5lZCBieSB0aGUKKzsvLyBhc3NlbWJsZXIgc2V0dGluZ3MuCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICBJRiA6REVGOiBPVkVSUklERUNQVQorX0NQVSAgICAgICBTRVRTICBPVkVSUklERUNQVQorICAgICAgIEVMU0UKK19DUFUgICAgICAgU0VUUyAgICB7Q1BVfSAgICAgICAKKyAgICAgICBFTkRJRgorCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFdvcmsgb3V0IHdoaWNoIGNvZGUgdG8gYnVpbGQKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBJRiA6REVGOkFSTTExMzZKUzpMT1I6OkRFRjpDb3J0ZXhBODpMT1I6OkRFRjpBUk1fR0VORVJJQworICAgICAgICAgICAgSU5GTyAxLCJQbGVhc2Ugc3dpdGNoIHRvIHVzaW5nIE1fVkFSSUFOVFMiCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIERlZmluZSBhbmQgcmVzZXQgYWxsIG9mZmljaWFsbHkgcmVjb25nbmlzZWQgdmFyaWFudHMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTkyNkVKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTX1UKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQ29ydGV4QTgKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNN1RETUkKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlQgJHZhcgorICAgICAgICBHQkxMICR2YXIKKyAgICAgICAgR0JMTCBfb2skdmFyCiskdmFyICAgIFNFVEwge0ZBTFNFfQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFZhcmlhbnQgZGVjbGFyYXRpb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWZpbmUgYSBsaXN0IG9mIGNvZGUgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgOy8vIHNvdXJjZSBmaWxlLiBUaGlzIG1hY3JvIHRoZW4gY2hvb3NlcyB0aGUgbW9zdAorICAgICAgICA7Ly8gYXBwcm9wcmlhdGUgdmFyaWFudCB0byBidWlsZCBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCisgICAgICAgIDsvLyBjb3JlLgorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX1ZBUklBTlRTICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHRvIFRSVUUgdmFyaWFudHMgdGhhdCBhcmUgc3VwcG9ydGVkCisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBfTV9WQVJJQU5UICR2MAorICAgICAgICBfTV9WQVJJQU5UICR2MQorICAgICAgICBfTV9WQVJJQU5UICR2MgorICAgICAgICBfTV9WQVJJQU5UICR2MworICAgICAgICBfTV9WQVJJQU5UICR2NAorICAgICAgICBfTV9WQVJJQU5UICR2NQorICAgICAgICBfTV9WQVJJQU5UICR2NgorICAgICAgICBfTV9WQVJJQU5UICR2NworICAgICAgICAKKyAgICAgICAgOy8vIExvb2sgZm9yIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IHRvIG1hdGNoIGEgQ1BVCisgICAgICAgIDsvLyBfTV9UUlkgY3B1LCB2YXJpYW50IGZhbGwgYmFjayBsaXN0CitfVmFyaWFudCBTRVRTICIiICAgICAgICAgICAgICAgIAorICAgICAgICBfTV9UUlkgQVJNOTI2RUotUywgICBBUk05MjZFSlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWi1TLCAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTc2SlpGLVMsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNTZUMkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2Si1TLCAgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTEzNkpGLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIE1QQ29yZSwgICAgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk03VERNSQorICAgICAgICAKKyAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50CisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTFNFCiskX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQorICAgICAgICBNQUNSTworICAgICAgICBfTV9WQVJJQU5UICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKKyAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKKyAgICAgICAgRU5ESUYKKyR2YXIgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZworICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCisgICAgICAgIDsvLyBjaG9zZW4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKKyAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBfTV9UUlkxICR2MAorICAgICAgICBfTV9UUlkxICR2MQorICAgICAgICBfTV9UUlkxICR2MgorICAgICAgICBfTV9UUlkxICR2MworICAgICAgICBfTV9UUlkxICR2NAorICAgICAgICBfTV9UUlkxICR2NQorICAgICAgICBfTV9UUlkxICR2NgorICAgICAgICBfTV9UUlkxICR2NworICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkxICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgorX1ZhcmlhbnQgU0VUUyAiJHZhciIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSVUNUICRzbmFtZQorX1N0cnVjdCBTRVRTICIkc25hbWUiCitfU3RPZmYgIFNFVEEgMAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAorICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCisgICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAorICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQorICAgICAgICBNQUNSTworICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKKyAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQorICAgICAgICBFTkRJRgorJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCisgICAgICAgIElGICIkbnVtYmVyIjw+IiIKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgorICAgICAgICBFTFNFCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNUUlVDVAorc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKK19TdHJ1Y3QgU0VUUyAiIgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCisgICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1dJVENIICR2LCAkcworICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKK19Td0xvbmcgU0VUTCB7RkFMU0V9CisgICAgICAgIElGICIkcyI9IkwiCitfU3dMb25nICAgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KKyAgICAgICAgICAgIEVORElGCitfU3dpdGNoJF9Td051bQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCisgICAgICAgICAgICBOT1AKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9DQVNFICAkbGFiZWwKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBCICAgJGxhYmVsCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICBBTElHTiAyCisgICAgICAgIE1FTkQgICAgICAgCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKKyAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCisgICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCisgICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgIiRhbGlnbiI9IiIKKyAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKKyAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgorICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KKyAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KKyAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCisgICAgICAgIEVORElGCiskbmFtZQorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworOy8vCis7Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCis7Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCis7Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgCisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKKyAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgX0luRnVuYworJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKK19BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KKyAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAorICAgICAgICBNQUNSTworICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0CisgICAgICAgIExDTEEgICAgX3NoCisgICAgICAgIExDTEEgICAgX2NzdAorX3NoICAgICBTRVRBICAgIDAKK19jc3QgICAgU0VUQSAgICAkY29uc3QKKyAgICAgICAgSUYgX2NzdD0wCisgICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCitfY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKK19zaCAgICAgICAgIFNFVEEgX3NoKzIKKyAgICAgICAgV0VORAorICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAorICAgICAgICBJRiBfY3N0Pj0yNTYKKyAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgorICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCisgICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAorICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCisgICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAorICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKKyAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKKyAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPbiBFbnRyeToKKyAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQorICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKKyAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgorICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKKyAgICAgICAgICAgIElGICIkYTEiPSIiCisgICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0CitfT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKKyAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAorICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKK19iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQorX29mZnNldCAgICAgU0VUUyAiJGExIgorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAkaSAgJHIsICRhMAorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UgOy8vIEFSTQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCitfYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKK19vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCisgICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCisgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgorICAgICAgICBNQUNSTworICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCisgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKKyAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKKyAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcworICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgorICAgICAgICA7Ly8gICAgCisgICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCisgICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5CisgICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCisgICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCisgICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKKyAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCitfSW5GdW5jIFNFVEwge1RSVUV9CitfUkJ5dGVzIFNFVEEgMAorX1dvcmtzcGFjZSBTRVRBIDAKKworICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCisgICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorICAgICAgICBFWFBPUlQgICRuYW1lCiskbmFtZSAgIEZVTkNUSU9OCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycworICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAorICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCisgICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGIChfU0J5dGVzIT0wKQorICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICAKK19BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKKyAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGICIkcnJlZyI9IiIKK19SUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKK19SUmVnTGlzdCAgIFNFVFMgInI0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKKyAgICAgICAgSUYgIiRkcmVnIj0iIgorX0RSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJGRyZWciPSJkOCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQ5IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDExIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTIiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMyIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTUiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUkVUICRjYworICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKKyAgICAgICAgICAgIEJYJGNjIGxyCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybworICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAorICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FWElUICAkY2MKKyAgICAgICAgQVNTRVJUICBfSW5GdW5jCisgICAgICAgIElGICBfU0J5dGVzIT0wCisgICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAorICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQorICAgICAgICAgICAgX01fUkVUICRjYworICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgICAgICBNQUNSTworICAgICAgICBNX0VORAorICAgICAgICBBU1NFUlQgX0luRnVuYworX0luRnVuYyBTRVRMIHtGQUxTRX0KK19FbmQkX0YKKworICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKKyAgICAgICAgSUYgX1NCeXRlcyE9MAorICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1JFVAorICAgICAgICBFTkRGVU5DCisKKyAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCisgICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKK19TQnl0ZXMgICAgICAgIFNFVEEgMAorX0YgICAgICAgICAgICAgU0VUQSBfRisxCisgICAgICAgIE1FTkQKKworICAgICAgICAgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBEZWJ1ZyBNYWNyb3MKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgR0JMTCAgICBERUJVR19PTgorREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KKyAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KK0RFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KKyAgICAgICAgCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgorICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBFeGFtcGxlczoKKyAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKKyAgICAgICAgOy8vIGZsYWdzLgorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIElGIERFQlVHX09OCisgICAgICAgIAorICAgICAgICBJTVBPUlQgIHByaW50ZgorICAgICAgICBMQ0xBICAgIG5BcmdzCituQXJncwlTRVRBICAgIDAKKyAgICAgICAgCisgICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KKyAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQorICAgICAgICAKKyAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQorICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKKyAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KK25BcmdzICAgICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwwIjw+IiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCisgICAgICAgIEFEUiAgICAgcjAsICVGVDAwCisgICAgICAgIElGIG5BcmdzPTEKKyAgICAgICAgICBMRFIgICByMSwgW3NwXQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0yCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MworICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcworICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKKyAgICAgICAgQkwgICAgICBwcmludGYKKyAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKKyAgICAgICAgQiAgICAgICAlRlQwMQorMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50CisgICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCisgICAgICAgIEFMSUdOCiswMSAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycworICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9CisKKyAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KKyAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQorICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCisgICAgICAgIElGIERFQlVHX1NUQUxMU19PTgorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAorICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCisgICAgICAgICAgICBMQ0xBIF9wbGxlbgorICAgICAgICAgICAgTENMUyBfcGwKKyAgICAgICAgICAgIExDTEwgX3BsbG9nCitfcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCitfcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQorICAgICAgICAgICAgSUYgOkRFRjokX3BsCisgICAgICAgICAgICAgICAgSUYgJF9wbAorICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAorICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQorX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKK19zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0CisgICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCisJCQlNT1Ygc3AsIHNwCitfc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKKyAgICAgICAgICAgICAgICAgICAgV0VORAorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcworOy8vIAorOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcworOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQorOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQorOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZworOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgorOy8vCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKKworCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKKyAgICAgICAgICAgIAorICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjlmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKKyAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKKyAqCisgKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6CisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKKyAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCisgKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKKyAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKKyAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCisgKiAgIGF0IHJ1bnRpbWUuCisgKgorICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKKyAqIAorICovCisKKyAgCisjaWZuZGVmIF9hcm1PTVhfSF8KKyNkZWZpbmUgX2FybU9NWF9IXworCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KKyNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCisjZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCisKKy8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCisjZGVmaW5lIEJBUkVfU1VGRklYIAorCisKKworLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KKyNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCisjZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCisKKworCisKKy8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorCisKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQorCisjZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorCisjZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQorCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorCisKKyNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaApAQCAtMCwwICsxLDI1MiBAQAorLyoqCisgKiBGaWxlOiBvbXh0eXBlcy5oCisgKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKyAgCisjaWZuZGVmIF9PTVhUWVBFU19IXworI2RlZmluZSBfT01YVFlQRVNfSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAKKworI2RlZmluZSBPTVhfSU4KKyNkZWZpbmUgT01YX09VVAorI2RlZmluZSBPTVhfSU5PVVQKKworCit0eXBlZGVmIGVudW0geworICAgIAorICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCisgICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKKyAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKKyAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KKyAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCisgICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLworICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAorICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAorCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KKworICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLworICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KKworICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAorCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KKworICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLworCisgICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLworICAgIAorIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KKworIAorLyogT01YX1U4ICovCisjaWYgVUNIQVJfTUFYID09IDB4ZmYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7CisjZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCisjZWxzZQorI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKKyNlbmRpZiAKKworIAorLyogT01YX1M4ICovCisjaWYgU0NIQVJfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKKyNlbGlmIFNIUlRfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKKyNlbHNlCisjZXJyb3IgT01YX1M4IHVuZGVmaW5lZAorI2VuZGlmCisgCisgCisvKiBPTVhfVTE2ICovCisjaWYgVVNIUlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKKyNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzE2ICovCisjaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7CisjZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VMzIgKi8KKyNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOworI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMzIgKi8KKyNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOworI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTY0ICYgT01YX1M2NCAqLworI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQorICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQorI2Vsc2UKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKKyNlbmRpZgorCisKKy8qIE9NWF9TQzggKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzE2ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMzIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0M2NCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9GMzIgKi8KK3R5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfRjY0ICovCit0eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9JTlQgKi8KK3R5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KKworCisjZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCisjZGVmaW5lIE9NWF9NSU5fVTggIAkJMAorI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQorI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKKyNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgT01YX01JTl9VMzIJCQkwCisKKyNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCisjZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQorI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKKyNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQorI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQorI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQorCit0eXBlZGVmIHZvaWQgT01YVm9pZDsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAorICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCisgICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKKyAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCisJT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLworfU9NWFJlY3Q7CisKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCisgT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCisJCit9IE9NWFBvaW50OworCisKKy8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCisgT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCisJCit9IE9NWFNpemU7CisKKyNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyNGI2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oCkBAIC0wLDAgKzEsNzcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teHR5cGVzX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAKK09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgIEVRVSAgMCAgICA7Ly8gTm8gZXJyb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgCitPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICBFUVUgLTIgICAgOy8vIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgICAgIAorT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgRVFVIC0xODIgIDsvLyBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAgICAgCitPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICBFUVUgLTkgICAgOy8vIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAKK09NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgIEVRVSAtMTU5ICA7Ly8gQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAKK09NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgIEVRVSAtMTY3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAKK09NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgIEVRVSAtMTYzICA7Ly8gQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgRVFVIC0xNjIgIDsvLyBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAgICAgCitPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICBFUVUgLTE2MCAgOy8vIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgCisKKzsvLyBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uCitPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICBFUVUgLTUgICAgOy8vIEJhZCBBcmd1bWVudHMgCisKK09NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgIEVRVSAtMTU3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgCitPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICBFUVUgLTE1NiAgOy8vIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgICAgCitPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICBFUVUgLTE1NSAgOy8vIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgIEVRVSAtMTU0ICA7Ly8gQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICBFUVUgLTE1MyAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICBFUVUgLTE1MiAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgICAKKworT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgRVFVIC0xODMgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgCitPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICBFUVUgLTE4MSAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgRVFVIC0xNyAgIDsvLyBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gCisKK09NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgIEVRVSAtMTgwICA7Ly8gRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lIAorCitPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICBFUVUgMHg3RkZGRkZGRgorCisKKworT01YX01JTl9TOCAgICAgIEVRVSAJICAgCSgtMTI4KQorT01YX01JTl9VOCAgCUVRVSAgICAgCTAKK09NWF9NSU5fUzE2CQlFUVUgICAgICAJKC0zMjc2OCkKK09NWF9NSU5fVTE2CQlFUVUJICAgICAgICAwCisKKworT01YX01JTl9TMzIJCUVRVQkoLTIxNDc0ODM2NDctMSkKK09NWF9NSU5fVTMyCQlFUVUJMAorCitPTVhfTUFYX1M4CQlFUVUJKDEyNykKK09NWF9NQVhfVTgJCUVRVQkoMjU1KQorT01YX01BWF9TMTYJCUVRVQkoMzI3NjcpCitPTVhfTUFYX1UxNgkJRVFVCSgweEZGRkYpCitPTVhfTUFYX1MzMgkJRVFVCSgyMTQ3NDgzNjQ3KQorT01YX01BWF9VMzIJCUVRVQkoMHhGRkZGRkZGRikKKworT01YX1ZDX1VQUEVSICAgIEVRVSAweDEgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCitPTVhfVkNfTEVGVCAgICAgRVFVIDB4MiAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgCitPTVhfVkNfVVBQRVJfUklHSFQgICAgRVFVIDB4NDAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKKworTlVMTCAgICBFUVUgMAorCis7Ly8gU3RydWN0dXJlcworCisgICAgSU5DTFVERSAgICAgYXJtQ09NTV9zLmgKKworICAgIE1fU1RSVUNUICAgIE9NWFBvaW50CisgICAgTV9GSUVMRCAgICAgeCwgNAorICAgIE1fRklFTEQgICAgIHksIDQKKyAgICBNX0VORFNUUlVDVAorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhZTcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKQEAgLTAsMCArMSwxMTEgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyAKKyMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKKyMgT3Blbk1BWCBETDogdjEuMC4yCisjIFJldmlzaW9uOiAgIDk2NDEKKyMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TIC1jJzsKKyRBUyAgICAgICA9ICdhcm1hc20nOworJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TJzsKKyMgJExJQiAgICAgID0gJ2FybWxpbmsnOworIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKKyMgJExJQl9UWVBFID0gJy5vJzsKKyRMSUIgICAgICA9ICdhcm1hcic7CiskTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOworJExJQl9UWVBFID0gJy5hJzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgorQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7CitAZmlsZWxpc3QgPSA8RklMRVM+OworY2xvc2UoRklMRVMpOworCisjIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKK2ZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQoreworICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Cit9CisKKyMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKKworIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQorbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOworbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOworCiskb2JqbGlzdCA9ICcnOworCisjIENvbXBpbGUgZWFjaCBmaWxlCitmb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCit7CisJbXkgJGY7CisJbXkgJGJhc2U7CisJbXkgJGV4dDsKKwlteSAkb2JqZmlsZTsKKworCWNob21wKCRmaWxlKTsKKwkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7CisKKwkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTYyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsNzQgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisuL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisuL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisuL2FwaS9hcm1DT01NX3MuaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL2FwaS9vbXh0eXBlc19zLmgKKy4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKy4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL2FybVZDQ09NTV9zLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvYXBpL29teFZDX3MuaAorLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTcyYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAorICoKKyAqLworCitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisKK09NWF9JTlQgYXJtU2lnbkNoZWNrICgKKyAgICBPTVhfUzE2IHZhcgorKQorCit7CisgICAgT01YX0lOVCBTaWduOworICAgIAorICAgIGlmICh2YXIgPCAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICggdmFyID4gMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaWduID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFNpZ247Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgIE9NWF9JTlQgbWluLAorICAgIE9NWF9JTlQgbWF4LCAKKyAgICBPTVhfUzMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgT01YX0YzMiBtaW4sCisgICAgT01YX0YzMiBtYXgsIAorICAgIE9NWF9GMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKK3sKKyAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOworICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOworICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKKyAgICBPTVhfVTMyIHZJbnQ7CisgICAgT01YX1UzMiB2SW50U2F0OworICAgIAorICAgIGlmKHYgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7CisgICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOworICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKKyAgICB2SW50U2F0ID0gdkludDsKKyAgICBpZih2SW50U2F0ID4gbWF4VikgCisgICAgICAgIHZJbnRTYXQgPSBtYXhWOworICAgIHJldHVybiB2SW50U2F0OworfQorCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oCisgICAgICAgIE9NWF9VOCAqcEJ1ZjEsCisgICAgICAgIE9NWF9VOCAqcEJ1ZjIsCisgICAgICAgIE9NWF9JTlQgZWxlbVNpemUKKyAgICAgICApCit7CisgICAgT01YX0lOVCBpOworICAgIE9NWF9VOCB0ZW1wOworICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKKyAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOworICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCispCit7CisgICAgT01YX1MzMiBhLCBiLCBjOworICAgIAorICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7CisgICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKKyAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKKyAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCispCit7CisgICAgT01YX1U4IGk7ICAgIAorICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCisgICAgeworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKK3sKKyAgICBPTVhfUzY0IFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQorICAgIHsKKyAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOworICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOworCisgICAgcmV0dXJuIFJlc3VsdDsgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKK3sKKyAgICAKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAorCisgICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKKyAgICB9CisgICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKKyAgICB9CisKKyAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOworICAgIAorICAgIHJldHVybiBtYWM7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCit7CisgICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKKworICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OworICAgIH0KKworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICogICAgIAorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTIsbG8xOworICAgIE9NWF9VMTYgbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7CisgICAgT01YX1MzMiByZXN1bHQ7CisgICAgCisgICAgbG8xICA9IGlucHV0MTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSBoaTIgKiBsbzE7CisgICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMSxoaTI7CisgICAgT01YX1UxNiBsbzEsbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7CisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7CisgICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9ICAgaGkxICogaGkyOworICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OworICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQoreworICAgIE9NWF9GNjQgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKKyAgICAKKyAgICBpZiAocmVzdWx0ID49IDApCisgICAgeworICAgICAgICByZXN1bHQgKz0gMC41OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgLT0gMC41OworICAgIH0KKworICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKK30KKworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAKKyAgICBpZihOID09IDApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKK3sKKyAgICBpZigqcE9mZnNldCA+IDApCisgICAgeworICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKKyAgICAgICAgKnBPZmZzZXQgPSAwOworICAgIH0gICAgCit9CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKK3sKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgIAorICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisjaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKykKK3sgICAgCisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICBPTVhfSU5UIEluZGV4OworICAgICAgICAKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAorICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCisgICAgeworICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKKyAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKKyAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBJbmRleDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHBDb2RlQm9vaysrOworICAgIH0KKworICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KKyAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKykKK3sKKyAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAgICAgCisgICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCisgICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7CisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOworICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOworCisgICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCisgICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCisgICAgeworICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKKyAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOworICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7CisgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7CisgICAgfQorCisgICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLworICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7CisgICAgCisgICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKykKK3sKKyAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKK30KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0Njc5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYworICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCisJICAKK19fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KK3sKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKKyAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKKyAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKKyAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKKyAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKK307CisgICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCitjb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQoreworICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCisgICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAorICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAorICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKKyAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKK307CisgICAKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQoreworICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KKyAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCisgICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLworICAgIDB4MDAwMCAgICAKK307CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MWRiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheS4KKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGICAgIAorfTsKKworY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgICAgCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKQEAgLTAsMCArMSwxMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtVmlkZW8uaAorICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCisgKgorICovCisKKworI2lmbmRlZiBfYXJtVmlkZW9fSF8KKyNkZWZpbmUgX2FybVZpZGVvX0hfCisKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgorICovCisgCitzdHJ1Y3QgbTRwMl9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Cit9OworCitzdHJ1Y3QgbTRwMTBfTUVTcGVjCit7CisgICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKK3R5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKKyAqIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKKyAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLAorICAgIE9NWF9TMTYgbXZZLAorICAgIE9NWF9JTlQgY2FuZFNBRCwKKyAgICBPTVhfUzE2IGJlc3RNVlgsCisgICAgT01YX1MxNiBiZXN0TVZZLAorICAgIE9NWF9JTlQgYmVzdFNBRCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCisgICAgIE9NWF9VOCBmbGFnLAorICAgICBPTVhfSU5UICpwU3VtRXJyCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCisgKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX0lOVCAqcHJlZERpciwKKyAgICAgT01YX0lOVCAqcHJlZFFQLAorICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KKyAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIE9NWF9VOCBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCisgICAgIE9NWF9VOCAgc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCisgKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAorICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAorICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCisgKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKKyAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAorICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAorICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKKyAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCisgICAgT01YX1UzMiBzdG9yZVJ1biwKKyAgICBPTVhfUzE2ICogcERzdCwKKyAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCisgICAgT01YX1U4ICBzaWduLAorICAgIE9NWF9VOCAgbGFzdCwKKyAgICBPTVhfVTggICogaW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisJCQkgIE9NWF9TMTYgKiBwRHN0LAorCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisJCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAorCQkJICBPTVhfVTggICogcExhc3QsCisJCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKKyAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKKworT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgIAorICogUmV0dXJuIFZhbHVlOgorICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKKyAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAorICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCisgKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCisgKgorICovCisKK09NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICBPTVhfVTMyIHJ1biwKKyAgICAgT01YX1UzMiBydW5QbHVzLAorICAgICBPTVhfUzE2IGxldmVsLAorICAgICBPTVhfUzE2IGxldmVsUGx1cywKKyAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKKyAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKKyk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCisgKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCisgKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCisgKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAorICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCisgKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKKyAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCisgKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQorICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAorICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCisgKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jaworICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKKyAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCisgICAgIE9NWF9VOCAqIHBUcmFuc3AKKyk7CisKKy8qIAorICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAorICovCisvKiBEZWZpbmVzICovCisjZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQorCisKKy8qIERlcXVhbnQgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKKworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgblRhYmxlLAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucworICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCisJCU9NWF9VMzIgCWlTcmNTdGVwLCAKKwkJT01YX1U4KiAJcERzdCwgCisJCU9NWF9VMzIgCWlEc3RTdGVwLCAKKwkJT01YX1UzMiAJaVdpZHRoLCAKKwkJT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCisJIGNvbnN0IE9NWF9VOCogCXBTcmMsIAorCSBPTVhfVTMyIAlpU3JjU3RlcCwgCisgCSBPTVhfVTgqIAlwRHN0LAorIAkgT01YX1UzMiAJaURzdFN0ZXAsIAorIAkgT01YX1UzMiAJaVdpZHRoLCAKKyAJIE9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKKyAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCisJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwlPTVhfVTMyIAlpU3RlcE9yZywKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAorCU9NWF9VMzIgCWlTdGVwUmVmLAorCU9NWF9TMzIqCXBEc3RTQUQsCisJT01YX1UzMgkJaUhlaWdodCwKKwlPTVhfVTMyCQlpV2lkdGgpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAorICAgICAgICBPTVhfVTggICAgICAqcFNyYywKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgICAgICBPTVhfVTMyICAgICBkeCwKKyAgICAgICAgT01YX1UzMiAgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAorICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKKyAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCisgKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAorICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAorICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKKyAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAorICAgICBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiAqcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX1MxNiogcERDLAorICAgICBpbnQgQUMKKyk7CisKKyNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGE5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKQEAgLTAsMCArMSw3MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCis7Ly8gCis7Ly8gRm9ybXVsYSB1c2VkOgorOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KKworCisKKyAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAorICAgICAKKyAgICAgOy8vLyoKKyAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMworICAgICA7Ly8gKgorICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgICAgIDsvLyAqIAorICAgICA7Ly8gKiBSZW1hcmtzOgorICAgICA7Ly8gKgorICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgorICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKKyAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCisgICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgorICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCisgICAgIDsvLyAqLworICAgICAKKyAgICAgTUFDUk8KKworICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCisgICAgIAorICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCisgICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKKyAgICAgU1VCTFQgJHksICR5LCAkdDsKKworICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQorICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KKworICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKKyAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKKyAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCisKKyAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQorICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAorCisgICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKKyAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKKyAgICAgCisgICAgIE1FTkQKKyAgICBFTkRJRiAgICAgIAorICAgIAorICAgIAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAorCisgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oCkBAIC0wLDAgKzEsMTI5IEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKzsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLworOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KKworO2VudW0geworT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCis7fQorCis7LyoqIGRpcmVjdGlvbiAqLworO2VudW0geworT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKK09NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOworT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKKzt9CisKKzsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCis7ZW51bSB7CitPTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgobBhobEgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1ggIEVRVSAxOwkvKiogY2FzZSChsGKhsSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIKGwY6GxICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgobBkobEgKi8KKzt9CisKKztlbnVtIHsKK09NWF9VUFBFUiAgCQkJCUVRVSAxOwkJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTEVGVCAgIAkJCQlFUVUgMjsJCQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfQ0VOVEVSIAkJCQlFUVUgNDsKK09NWF9SSUdIVAkJCQlFUVUgODsKK09NWF9MT1dFUiAgCQkJCUVRVQkxNjsKK09NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OworT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgorO30KKworO2VudW0geworT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJCQkvKiogQWxwaGEgY29tcG9uZW50ICovCis7fQorCis7ZW51bSB7CitPTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK09NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KK09NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworO30KKworO2VudW0geworT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKzt0eXBlZGVmCXN0cnVjdCB7CQoreAlFUVUJMDsKK3kJRVFVCTQ7Cis7fU9NWENvb3JkaW5hdGU7CisKKzt0eXBlZGVmIHN0cnVjdCB7CitkeAlFUVUJMDsKK2R5CUVRVQkyOworO31PTVhNb3Rpb25WZWN0b3I7CisKKzt0eXBlZGVmIHN0cnVjdCB7Cit4eAkJRVFVCTA7Cit5eQkJRVFVCTQ7Cit3aWR0aAlFUVUJODsKK2hlaWdodAlFUVUJMTI7Cis7fU9NWGlSZWN0OworCis7dHlwZWRlZiBlbnVtIHsKK09NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCis7fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworO2VudW0geworT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKK09NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCitPTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKKzt9OworCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjNhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKQEAgLTAsMCArMSwxNDggQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMTQKK1gwICAgICAgUk4gMgorWDEgICAgICBSTiA0CisKK1JldHVybiAgUk4gMAorICAgICAKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTE2eDE2LHI1CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQiAgIENvdW50LHN0ZXAsIzggICAgICAgICAgICAgICAgIDsvL0NvdW50PXN0ZXAtOAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggICAgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjKzgKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50ICAgICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIHBTcmM9cFNyYytzdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzODczYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKQEAgLTAsMCArMSw3MiBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAKKworCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyYyAgICBSTiAwICAgICAgICAKK3BEc3QgICAgUk4gMSAgICAgICAgCitzdGVwICAgIFJOIDIKKworOy8vTG9jYWwgVmFyaWFibGVzCitDb3VudCAgIFJOIDE0CitYMCAgICAgIFJOIDIKK1gxICAgICAgUk4gNAorUmV0dXJuICBSTiAwCisgICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgscjUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgQ291bnQsc3RlcCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcCAKKyAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyA6IHBTcmM9cFNyYytzdGVwCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjRiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCkBAIC0wLDAgKzEsMTg5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgCisKKworCisgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworCitwU3JjRHN0UGxhbmUgICAgUk4gIDAKK2lGcmFtZVdpZHRoICAgICBSTiAgMQoraUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAoraUV4cGFuZFBlbHMgICAgIFJOICAzCisKKworOy8vT3V0cHV0IFJlZ2lzdGVycworCityZXN1bHQgICAgICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworaVBsYW5lU3RlcCAgICAgIFJOICA0CitwVG9wICAgICAgICAgICAgUk4gIDUKK3BCb3R0b20gICAgICAgICBSTiAgNgorcEJvdHRvbUluZGV4ICAgIFJOICA3Cit4ICAgICAgICAgICAgICAgUk4gIDgKK3kgICAgICAgICAgICAgICBSTiAgOQordGVtcFRvcCAgICAgICAgIFJOICAxMAordGVtcEJvdCAgICAgICAgIFJOICAxMQorQ29sU3RlcCAgICAgICAgIFJOICAxMgorcExlZnQgICAgICAgICAgIFJOICA1CitwUmlnaHQgICAgICAgICAgUk4gIDYKK3BSaWdodEluZGV4ICAgICBSTiAgNwordGVtcExlZnQxICAgICAgIFJOICAxMAordGVtcFJpZ2h0MSAgICAgIFJOICAxMQordGVtcExlZnQyICAgICAgIFJOICAxNAordGVtcFJpZ2h0MiAgICAgIFJOICAyCitpbmRleFkgICAgICAgICAgUk4gIDE0CitSb3dTdGVwICAgICAgICAgUk4gIDEyCitleHBhbmRUbzRieXRlcyAgUk4gIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvcHkgYSBieXRlIHRvIDQgYnl0ZXMgb2YgYSB3b3JkCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBpUGxhbmVTdGVwT25TdGFjaywgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICBpUGxhbmVTdGVwLCBpUGxhbmVTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTVVMICAgICBwVG9wLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAKKyAgICAgICAgTUxBICAgICBwQm90dG9tLGlGcmFtZUhlaWdodCxpUGxhbmVTdGVwLHBTcmNEc3RQbGFuZQorICAgICAgICBTVUIgICAgIHgsaUZyYW1lV2lkdGgsIzQKKyAgICAgICAgTU9WICAgICBpbmRleFkscFRvcAorICAgICAgICBBREQgICAgIENvbFN0ZXAsaW5kZXhZLCM0CisgICAgICAgIFNVQiAgICAgcEJvdHRvbUluZGV4LHBCb3R0b20saVBsYW5lU3RlcAorICAgICAgICBTVUIgICAgIHBUb3AscFNyY0RzdFBsYW5lLHBUb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUb3AscFRvcCx4CisgICAgICAgIEFERCAgICAgcEJvdHRvbSxwQm90dG9tLHgKKworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBmb2xsb3dpbmcgaW1wcm92ZXMgdXBvbiB0aGUgQyBpbXBsbWVudGF0aW9uCisgICAgICAgIDsvLyBUaGUgeCBhbmQgeSBsb29wcyBhcmUgaW50ZXJjaGFuZ2VkOiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmFsdWVzIG9mCisgICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgW3hdIGFuZCBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XSAKKyAgICAgICAgOy8vIHdoaWNoIGRlcGVuZCBvbmx5IG9uIGxvb3AgdmFyaWFibGUgJ3gnIGFyZSBsb2FkZWQgb25jZSBhbmQgdXNlZCBpbiAKKyAgICAgICAgOy8vIG11bHRpcGxlIHN0b3JlcyBpbiB0aGUgJ1knIGxvb3AKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgOy8vIHhsb29wCitFeHBhbmRGcmFtZVRvcEJvdFhsb29wCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHRlbXBUb3AsW3BTcmNEc3RQbGFuZSx4XQorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIGlzIHNpbXBsaWZpZWQgYXM6CisgICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCkgLSBpUGxhbmVTdGVwICsgeCA9PQorICAgICAgICA7Ly8gcEJvdHRvbSAtIGlQbGFuZVN0ZXAgKyB4ID09IHBCb3R0b21JbmRleCBbeF0KKyAgICAgICAgOy8vIFRoZSB2YWx1ZSBvZiBwQm90dG9tSW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSB0aGlzICd4JyBsb29wCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIHRlbXBCb3QsW3BCb3R0b21JbmRleCx4XQorICAgICAgICAKKyAgICAgICAgOy8vIHlsb29wCisgICAgICAgIE1PViAgICAgeSxpRXhwYW5kUGVscworCitFeHBhbmRGcmFtZVRvcEJvdFlsb29wICAgICAgICAKKyAgICAgICAgU1VCUyAgICB5LHksIzEKKyAgICAgICAgTV9TVFIgICB0ZW1wVG9wLFtwVG9wXSxpUGxhbmVTdGVwCisgICAgICAgIE1fU1RSICAgdGVtcEJvdCxbcEJvdHRvbV0saVBsYW5lU3RlcAorICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lVG9wQm90WWxvb3AKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgeCx4LCM0CisgICAgICAgIFNVQiAgICAgcFRvcCxwVG9wLENvbFN0ZXAKKyAgICAgICAgU1VCICAgICBwQm90dG9tLHBCb3R0b20sQ29sU3RlcAorICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lVG9wQm90WGxvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8geSBsb29wCisgICAgICAgIDsvLyBUaGUgcHJvZHVjdCBpcyBhbHJlYWR5IGNhbGN1bGF0ZWQgYWJvdmUgOiBSZXVzZQorICAgICAgICA7Ly9NVUwgICAgIGluZGV4WSxpRXhwYW5kUGVscyxpUGxhbmVTdGVwICAgICAgCisgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjRHN0UGxhbmUscFNyY0RzdFBsYW5lLGluZGV4WQorICAgICAgICBTVUIgICAgIHBMZWZ0LHBTcmNEc3RQbGFuZSxpRXhwYW5kUGVscyAgICAgICAgICAgICAgICAgIDsvLyBwTGVmdC0+cG9pbnRzIHRvIHRoZSB0b3AgbGVmdCBvZiB0aGUgZXhwYW5kZWQgYmxvY2sKKyAgICAgICAgQUREICAgICBwUmlnaHQscFNyY0RzdFBsYW5lLGlGcmFtZVdpZHRoCisgICAgICAgIFNVQiAgICAgcFJpZ2h0SW5kZXgscFJpZ2h0LCMxIAorICAgICAgICAKKyAgICAgICAgQUREICAgICB5LGlGcmFtZUhlaWdodCxpRXhwYW5kUGVscyxMU0wgIzEKKyAgICAgICAgTERSICAgICBleHBhbmRUbzRieXRlcyw9MHgwMTAxMDEwMQorICAgICAgICAKKyAgICAgICAgUlNCICAgICBSb3dTdGVwLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAsTFNMICMxCisKKyAgICAgICAgOy8vIFRoZSBZIExvb3AgaXMgdW5yb2xsZWQgdHdpY2UKK0V4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AgIAorICAgICAgICBMRFJCICAgIHRlbXBMZWZ0MixbcFNyY0RzdFBsYW5lLGlQbGFuZVN0ZXBdICAgICAgICAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKKyAgICAgICAgTERSQiAgICB0ZW1wUmlnaHQyLFtwUmlnaHRJbmRleCxpUGxhbmVTdGVwXQorICAgICAgICBNX0xEUkIgIHRlbXBMZWZ0MSxbcFNyY0RzdFBsYW5lXSxpUGxhbmVTdGVwLExTTCAjMSAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKKyAgICAgICAgTV9MRFJCICB0ZW1wUmlnaHQxLFtwUmlnaHRJbmRleF0saVBsYW5lU3RlcCxMU0wgIzEKKyAgICAgICAgICAgICAgCisgICAgICAgIFNVQiAgICAgeCxpRXhwYW5kUGVscywjNAorICAgICAgICBNVUwgICAgIHRlbXBMZWZ0Mix0ZW1wTGVmdDIsZXhwYW5kVG80Ynl0ZXMgICAgICAgICAgICAgIDsvLyBDb3B5IHRoZSBzaW5nbGUgYnl0ZSB0byA0IGJ5dGVzCisgICAgICAgIE1VTCAgICAgdGVtcFJpZ2h0Mix0ZW1wUmlnaHQyLGV4cGFuZFRvNGJ5dGVzCisgICAgICAgIE1VTCAgICAgdGVtcExlZnQxLHRlbXBMZWZ0MSxleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKKyAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQxLHRlbXBSaWdodDEsZXhwYW5kVG80Ynl0ZXMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8geCBsb29wCitFeHBhbmRGcmFtZUxlZnRSaWdodFhsb29wICAgICAgICAKKyAgICAgICAgU1VCUyAgICB4LHgsIzQKKyAgICAgICAgU1RSICAgICB0ZW1wTGVmdDIsW3BMZWZ0LGlQbGFuZVN0ZXBdICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSA0IGJ5dGVzIGF0IG9uZSBnbworICAgICAgICBTVFIgICAgIHRlbXBSaWdodDIsW3BSaWdodCxpUGxhbmVTdGVwXQorICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MSxbcExlZnRdLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCisgICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MSxbcFJpZ2h0XSwjNAorICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgeSx5LCMyCisgICAgICAgIEFERCAgICAgcExlZnQscExlZnQsUm93U3RlcAorICAgICAgICBBREQgICAgIHBSaWdodCxwUmlnaHQsUm93U3RlcAorICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAKK0VuZCAgICAgICAgICAgICAKKyAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKKyAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MGYyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcworICogCisgKi8KKyAKKyNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisjZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorICAKKy8qIENBVkxDIHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07CitleHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNkOWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIyMiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKzsvLyBGdW5jdGlvbnM6Cis7Ly8gICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ248QUxJR05NRU5UPl91bnNhZmUgIAorOy8vCis7Ly8gSW1wbGVtZW50cyBBdmVyYWdlIG9mIDR4NCB3aXRoIGVxdWF0aW9uIGMgPSAoYStiKzEpPj4xLgorOy8vIEZpcnN0IG9wZXJhbmQgd2lsbCBiZSBhdCBvZmZzZXQgQUxJR05NRU5UIGZyb20gYWxpZ25lZCBhZGRyZXNzCis7Ly8gU2Vjb25kIG9wZXJhbmQgd2lsbCBiZSBhdCBhbGlnbmVkIGxvY2F0aW9uIGFuZCB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0LgorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyMixyMyB3aGVyZSByMiBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByMyBzdGVwIHNpemUKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjIgLSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIGxvY2F0aW9uCis7Ly8gcjMgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwUHJlZDAgICAgICAgICAgUk4gMAoraVByZWRTdGVwMCAgICAgIFJOIDEKK3BQcmVkMSAgICAgICAgICBSTiAyCitpUHJlZFN0ZXAxICAgICAgUk4gMworcERzdFByZWQgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lQcmVkQTAgICAgICAgICBSTiAxMAoraVByZWRBMSAgICAgICAgIFJOIDExCitpUHJlZEIwICAgICAgICAgUk4gMTIKK2lQcmVkQjEgICAgICAgICBSTiAxNAorVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitSZXN1bHRBICAgICAgICAgUk4gNQorUmVzdWx0QiAgICAgICAgIFJOIDQKK3IweDgwODA4MDgwICAgICBSTiA3CisKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAwIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4CisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMAorICAgICAgICBNX0VORAorCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAyIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMSAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2CisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQyCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMyBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4CisKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDMKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZlNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Cit7CisgICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLyogMngyIERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQoreworICAgIDAsIDEsIDIsIDMKK307CisKKworLyoKKyAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQorICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAorICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICovCitjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KK3sKKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KKyAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KKyAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KKyAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KKyAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKKyAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKKyAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKKyAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKKyAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKKyAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKKyAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKKyAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKKyAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKKyAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKKyAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKKyAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKKyAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKKyAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKKyAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKKyAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKKyAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0geworICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAorICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAorICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAorICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAorICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAorICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKKyAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKKyAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKKyAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKKyAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKKyAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKKyAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKKyAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7CisgICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCisgICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCisgICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7CisgICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCisgICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCisgICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCisgICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCisgICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7CisgICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0geworICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMworfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7CisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0geworICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7CisgICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0geworICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7CisgICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKKyAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKKyAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKKyAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgorfTsKKworLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JjZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICAgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIzN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzNjYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICBJRiAgQVJNMTEzNkpTCisKK01BU0tfMSAgRVFVIDB4MDEwMTAxMDEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BRMCAgICAgICAgUk4gMAorU3RlcEFyZyAgICBSTiAxCit0QzBBcmcgICAgIFJOIDIKK2FscGhhICAgICAgUk4gNgorCitiZXRhICAgICAgIFJOIDE0CitiUyAgICAgICAgIFJOIDE0Cit0QzAgICAgICAgIFJOIDE0CitwdEMwICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgIFJOIDMgCitwXzEgICAgIFJOIDUgIAorcF8yICAgICBSTiA0ICAKK3BfMyAgICAgUk4gMiAgCitxXzAgICAgIFJOIDggIAorcV8xICAgICBSTiA5ICAKK3FfMiAgICAgUk4gMTAgCitxXzMgICAgIFJOIDEyIAorCisKKzsvLyBGaWx0ZXJpbmcKKworYXAwcTAgICBSTiAxICAKK2ZpbHQgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgUk4gNworbTAxICAgICBSTiAxMQorCithcGZsZyAgIFJOIDAgCithcWZsZyAgIFJOIDYKKwordEMgICAgICBSTiAxCisKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKworcG9zICAgICBSTiA3CituZWcgICAgIFJOIDEyCisKK1AwYSAgICAgUk4gMSAgIAorUDFhICAgICBSTiA4ICAgCitRMGEgICAgIFJOIDcgIAorUTFhICAgICBSTiA0ICAgCisKK3UxICAgICAgUk4gMyAgIAorbWF4ICAgICBSTiAxMgorbWluICAgICBSTiAyICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKK3FfM2IgICAgUk4gOSAgIAorcF8zYiAgICBSTiAwCithcHFmbGcgIFJOIDEyCisKK1AwYiAgICAgUk4gNgorUDFiICAgICBSTiA3IAorUDJiICAgICBSTiAxCisKK1EwYiAgICAgUk4gOSAKK1ExYiAgICAgUk4gMCAKK1EyYiAgICAgUk4gMgorCis7Ly8gTWlzY2VsbGFub3VzCisKK2EgICAgICAgUk4gMAordDAgICAgICBSTiAzIAordDEgICAgICBSTiAxMgordDIgICAgICBSTiA3Cit0MyAgICAgIFJOIDExCit0NCAgICAgIFJOIDQgICAKK3Q1ICAgICAgUk4gMSAgIAordDggICAgICBSTiA2ICAgCit0OSAgICAgIFJOIDE0ICAKK3QxMCAgICAgUk4gNSAgIAordDExICAgICBSTiA5ICAgCisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlKCkKKzsvLworOy8vIElucHV0cyAtIDMsNCw1LDgsOSwxMCAtIElucHV0IFBpeGVscyAocDAtcDIscTAtcTIpCis7Ly8gICAgICAgIC0gMiAtIGZpbHQsIDAgLSBhcGZsZywgNiAtIGFxZmxnCis7Ly8gICAgICAgIC0gMTEgLSBtMDEsIDcgLSB0QzAKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSAxLDgsNywxMSAtIE91dHB1dCBQaXhlbHMoUDBhLFAxYSxRMGEsUTFhKQorOy8vCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0CisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUsIGxyCisKKyAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93CisgICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAorICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNworICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNworCisgICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKKyAgICAgICAgCisgICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCisgICAgICAgIE1VTCAgICAgdEMwLCB0MiwgbTAxCisgICAgICAgIAorICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKworICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMAorICAgICAgICBBTkQgICAgIHQyLCB0MiwgbTAxCisgICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVSFNVQjggIHQ1LCBwXzAsIHFfMAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE1PViAgICAgbTAwLCAjMAorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQorICAgICAgICAKKyAgICAgICAgOy8vIHRDID0gdEMwCisgICAgICAgIDsvLyBpZiAoYXAgPCBiZXRhKSB0QysrOworICAgICAgICA7Ly8gaWYgKGFxIDwgYmV0YSkgdEMrKzsKKyAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCisgICAgICAgIFNFTCAgICAgdEMwLCB0QzAsIG0wMAorICAgICAgICBVUUFERDggIHRDLCB0QzAsIGFwZmxnCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIGFxZmxnCisKKyAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICAKKyAgICAgICAgOy8vUmVsb2FkIG0wMQorICAgICAgICBMRFIgICAgIG0wMSw9TUFTS18xCisKKyAgICAgICAgVVFBREQ4ICBQMGEsIHBfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUTBhLCBxXzAsIHBvcworICAgICAgICBVUVNVQjggIFAwYSwgUDBhLCBuZWcKKyAgICAgICAgVVFBREQ4ICBRMGEsIFEwYSwgbmVnCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAorICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCisgICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKKyAgICAgICAgU0VMICAgICBQMGEsIFAwYSwgcF8wCisgICAgICAgIFNFTCAgICAgUTBhLCBRMGEsIHFfMAorICAgIAorICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOworICAgICAgICA7Ly8gdTEgPSAocDAgKyBxMCArIDEpPj4xCisgICAgICAgIDsvLyB1MSA9ICggKHFfMCAtIHBfMCcpPj4xICkgXiAweDgwCisgICAgICAgIE1WTiAgICAgcF8wLCBwXzAKKyAgICAgICAgVUhTVUI4ICB1MSwgcV8wLCBwXzAgCisgICAgICAgIFVRQUREOCAgbWF4LCBwXzEsIHRDMAorICAgICAgICBFT1IgICAgIHUxLCB1MSwgbTAxICxMU0wgIzcKKyAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBID0gKHAyK3UxKT4+MSAKKyAgICAgICAgOy8vIFRoZW4gZGVsdGEgPSBDbGlwMyggLXRDMCwgdEMwLCBBIC0gcDEpCisKKyAgICAgICAgOy8vIENsaXAgUDEKKyAgICAgICAgVUhBREQ4ICBQMWEsIHBfMiwgdTEKKyAgICAgICAgVVFTVUI4ICBtaW4sIHBfMSwgdEMwCisgICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWF4CisgICAgICAgIFNFTCAgICAgUDFhLCBtYXgsIFAxYQorICAgICAgICBVU1VCOCAgIHQ0LCBQMWEsIG1pbgorICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBtaW4KKworICAgICAgICA7Ly8gQ2xpcCBRMQorICAgICAgICBVSEFERDggIFExYSwgcV8yLCB1MQorICAgICAgICBVUUFERDggIG1heCwgcV8xLCB0QzAKKyAgICAgICAgVVFTVUI4ICBtaW4sIHFfMSwgdEMwCisgICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWF4CisgICAgICAgIFNFTCAgICAgUTFhLCBtYXgsIFExYQorICAgICAgICBVU1VCOCAgIHQwLCBRMWEsIG1pbgorICAgICAgICBTRUwgICAgIFExYSwgUTFhLCBtaW4KKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MCwgYXBmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBwXzEKKyAgICAgICAgVVNVQjggICB0MCwgYXFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIHQzLCBRMWEsIHFfMQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKKzsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLGFxZmxnCis7Ly8gICAgICAgIC0gMSAtIGFwMHEwLCA2IC0gYWxwaGEKKzsvLyAgICAgICAgLSA3IC0gbTAwLCAxMSAtIG0wMQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIDYsNywxLDksMCwyIC0gT3V0cHV0IFBpeGVscyhQMGIsUDFiLFAyYiwgUTBiLFExYixRMmIpCis7Ly8gCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0CisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlLCBscgorICAgIAorICAgICAgICA7Ly8gYXBmbGcgPSBhcGZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAorICAgICAgICA7Ly8gYXBmbGcgPSBhcWZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAorCisgICAgICAgIE1fQVJHICAgcER1bW15LDQKKyAgICAgICAgTV9BUkcgICBwUV8zLDQKKyAgICAgICAgTV9BUkcgICBwUF8zLDQKKyAgICAgICAgCisgICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKKyAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgOy8vdDkgPSBkcDJwMAorICAgICAgICBVSEFERDggIGFscGhhLCBhbHBoYSwgbTAwCisgICAgICAgIEFERCAgICAgYWxwaGEsIGFscGhhLCBtMDEsIExTTCAjMSAgICAgICAgCisgICAgICAgIFVTVUI4ICAgYXAwcTAsIGFwMHEwLCBhbHBoYQorICAgICAgICBTRUwgICAgIGFwcWZsZywgbTAwLCBhcGZsZworCisgICAgICAgIDsvLyBQMCA9IChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMgCisgICAgICAgIDsvLyAgICA9ICgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSArIDMqKHEwLXAwKSArIDgqcDAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIDIqKHAxLXAwKSArIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MykKKworICAgICAgICA7Ly8gUDEgPSAocDIgKyBwMSArIHEwICsgcDAgKyAyKT4+MgorICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIChwMS1wMCkgLSAocDAtcTApICsgMik+PjIpCisgICAgICAgIAorICAgICAgICA7Ly8gUDIgPSAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSAoMioocDMtcDApICsgMyoocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyA4KnAwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMy1wMCkgKyAocDItcDApICsgdDIgKyAyKT4+MikKKworICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKKyAgICAgICAgVVNVQjggICB0MiwgcF8wLCBxXzAgICAgICAgICAKKyAgICAgICAgU1NVQjggICB0NSwgdDksIHQyICAgICAgICAgICAKKworICAgICAgICBVU1VCOCAgIHQ4LCBxXzEsIHFfMCAgICAgICAgIAorICAgICAgICBTSEFERDggIHQ4LCB0NSwgdDgKKworICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMCAgICAgICAgIAorICAgICAgICBTQUREOCAgIHQ4LCB0OCwgdDkKKyAgICAgICAgU0hTVUI4ICB0OCwgdDgsIHQyCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQorICAgICAgICBTSEFERDggIHQ4LCB0OCwgbTAxCisgICAgICAgIFNIQUREOCAgdDksIHQ1LCBtMDEKKyAgICAgICAgU0FERDggICBQMGIsIHBfMCwgdDggICAgICAgICAKKyAgICAgICAgOy8vIFAwYiByZWFkeQorICAgICAgICAKKyAgICAgICAgOy8vIENvbXB1dGUgUDFiCisgICAgICAgIE1fTERSICAgcF8zYiwgcFBfMworICAgICAgICBTQUREOCAgIFAxYiwgcF8wLCB0OSAgICAgICAgIAorICAgICAgICA7Ly8gUDFiIHJlYWR5CisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBQMmIKKyAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgICAgICAKKyAgICAgICAgU0FERDggICB0NSwgdDUsIHQ5CisgICAgICAgIFVIU1VCOCAgdDksIHBfM2IsIHBfMCAgICAgICAgCisgICAgICAgIEVPUiAgICAgYSwgcF8zYiwgcF8wICAgICAgICAgCisgICAgICAgIEFORCAgICAgYSwgYSwgbTAxCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCBhCisgICAgICAgIFVIQUREOCAgYSwgcF8wLCBxXzEKKyAgICAgICAgU0FERDggICB0NSwgdDUsIG0wMQorICAgICAgICBTSEFERDggIHQ1LCB0NSwgdDkKKyAgICAgICAgTVZOICAgICB0OSwgcF8xCisgICAgICAgIFNBREQ4ICAgUDJiLCBwXzAsIHQ1ICAgICAgICAgCisgICAgICAgIDsvLyBQMmIgcmVhZHkKKyAgICAgICAgCisgICAgICAgIFVIU1VCOCAgYSwgYSwgdDkKKyAgICAgICAgT1JSICAgICB0OSwgYXBxZmxnLCBtMDEKKyAgICAgICAgVVNVQjggICB0OSwgYXBxZmxnLCB0OQorCisgICAgICAgIEVPUiAgICAgYSwgYSwgbTAxLCBMU0wgIzcKKyAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgYQorICAgICAgICBTRUwgICAgIFAxYiwgUDFiLCBwXzEKKyAgICAgICAgU0VMICAgICBQMmIsIFAyYiwgcF8yCisKKyAgICAgICAgVVNVQjggICB0NCwgZmlsdCwgbTAxCisgICAgICAgIFNFTCAgICAgUDBiLCBQMGIsIHBfMAorCisgICAgICAgIAorICAgICAgICA7Ly8gUTAgPSAocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zIAorICAgICAgICA7Ly8gICAgPSAoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA4KnEwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAyKihxMS1xMCkgKyAocDEtcDApICsgMyoocDAtcTApICsgNCk+PjMpCisKKyAgICAgICAgOy8vIFExID0gKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIKKyAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDIpPj4yKQorCisgICAgICAgIDsvLyBRMiA9ICgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zCisgICAgICAgIDsvLyAgICA9ICgyKihxMy1xMCkgKyAzKihxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDgqcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEzLXEwKSArIChxMi1xMCkgKyB0MiArIDIpPj4yKQorCisKKyAgICAgICAgOy8vIENvbXB1dGUgUTBiIFExYgorICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMCAgICAgICAgICAgCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBxXzAKKyAgICAgICAgVVNVQjggICB0OSwgcF8xLCBwXzAKKyAgICAgICAgU0FERDggICB0MCwgdDQsIGEKKyAgICAgICAgU0hBREQ4ICB0OSwgdDAsIHQ5CisgICAgICAgIFVIQUREOCAgdDEwLCBxXzAsIHBfMQorICAgICAgICBTQUREOCAgIHQ5LCB0OSwgYQorICAgICAgICBVU1VCOCAgIGEsIHFfMSwgcV8wCisgICAgICAgIFNIQUREOCAgdDksIHQ5LCBhCisgICAgICAgIFNIQUREOCAgdDAsIHQwLCBhCisgICAgICAgIFNIQUREOCAgdDksIHQ5LCBtMDEKKyAgICAgICAgU0hBREQ4ICBhLCB0MCwgbTAxCisgICAgICAgIFNBREQ4ICAgdDksIHFfMCwgdDkgICAgICAgICAgICAKKyAgICAgICAgOy8vIFEwYiByZWFkeSAtIHQ5CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHQ0LCAjMAorICAgICAgICBVSEFERDggIGFwcWZsZywgYXBxZmxnLCB0NAorICAgICAgICAKKyAgICAgICAgU0FERDggICBRMWIsIHFfMCwgYSAKKyAgICAgICAgOy8vIFExYiByZWFkeQorICAgICAgIAorICAgICAgICBVU1VCOCAgIHQ0LCBhcHFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFExYiwgUTFiLCBxXzEKKyAgICAgICAgTVZOICAgICB0MTEsIHFfMQorICAgICAgICBVSFNVQjggIHQxMCwgdDEwLCB0MTEKKyAgICAgICAgTV9MRFIgICBxXzNiLCBwUV8zCisgICAgICAgIEVPUiAgICAgdDEwLCB0MTAsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgdDksIHQ5LCB0MTAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEyYgorICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMAorICAgICAgICBTQUREOCAgIHQ0LCB0MCwgdDQKKyAgICAgICAgRU9SICAgICB0MCwgcV8zYiwgcV8wIAorICAgICAgICBBTkQgICAgIHQwLCB0MCwgbTAxCisgICAgICAgIFNIQUREOCAgdDQsIHQ0LCB0MAorICAgICAgICBVSFNVQjggIHQxMCwgcV8zYiwgcV8wCisgICAgICAgIFNBREQ4ICAgdDQsIHQ0LCBtMDEKKyAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQxMAorCisgICAgICAgIFVTVUI4ICAgdDEwLCBmaWx0LCBtMDEKKyAgICAgICAgU0VMICAgICBRMGIsIHQ5LCBxXzAKKworICAgICAgICBTQUREOCAgIHQ0LCBxXzAsIHQ0ICAgICAgICAgICAgCisgICAgICAgIDsvLyBRMmIgcmVhZHkgLSB0NAorCisgICAgICAgIFVTVUI4ICAgdDEwLCBhcHFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFEyYiwgdDQsIHFfMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDQ4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpAQCAtMCwwICsxLDMyNSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisgICAgICAgIAorTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKK1RXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcHBCaXRTdHJlYW0gICAgIFJOIDAKK3BPZmZzZXQgICAgICAgICBSTiAxCitwTnVtQ29lZmYgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK25DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKK3NNYXhOdW1Db2VmZiAgICBSTiA1CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCisKKzsvLyBMZXZlbCBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorVHJhaWxpbmdPbmVzICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitMZXZlbFN1ZmZpeCAgICAgUk4gMworU3VmZml4TGVuZ3RoICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIFJ1biBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorWmVyb3NMZWZ0ICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFJ1blRhYmxlICAgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKK3BQb3NDb2VmYnVmICAgICBSTiAwCit0ZW1wICAgICAgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKK3BaaWdaYWcgICAgICAgICBSTiA2CisKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorQ29lZmZOdW0gICAgICAgIFJOIDE0CisKKworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKKyAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKKyAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAorICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCisgICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcE5DLCA0CisgICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIE1fTERSICAgICAgbkMsIHBOQworICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCisKKyAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKKyAgICAKKyAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKKyAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKKyAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKKyAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cworCisgICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAorICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0CisgICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCisgICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCisgICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcworICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCisgICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcworVHJhaWxpbmdPbmVzTG9vcCAgICAKKyAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNT1YgICAgIFQxLCAjMQorICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKKyAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCitUcmFpbGluZ09uZXNEb25lICAgIAorICAgIAorICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCisgICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCisgICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKKyAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0CisgICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgorICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAorICAgICAgICAKK0xldmVsTG9vcAorICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAorICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAorICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKKyAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCisgICAgICAgIAorICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAorICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1CisgICAgICAgIAorICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4CisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAorICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAorICAgICAgICAgICAgIAorTGV2ZWxDb2RlUmVhZCAgICAgICAgCisgICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKKyAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93CisgICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgorICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQorICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKKyAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKKyAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAorICAgICAgICBCR1QgICAgIExldmVsTG9vcAorICAgICAgICAKK0RlY29kZVJ1bnMgICAgICAgIAorICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KKyAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAorICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQorICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorCisgICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAorCisgICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKKworICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKK1J1bkxvb3AgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCisgICAgICAgIEJMVCAgICAgTGFzdFJ1bgorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCisKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAorICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIFJ1bkxvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAorTm9aZXJvc0xlZnQgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAorCitMYXN0UnVuICAgICAgICAKKyAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCisgICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBURVEgICAgIFQxLCAjMTUKKyAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICAKKworICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKKworICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgorICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBURVEgICAgIFQxLCAjNAorICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAgICAgCisgICAgICAgIAorT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCisgICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KKyAgICAgICAgCisgICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCisgICAgICAgIAorICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAorICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKKyAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2CisgICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKKworICAgICAgICAKKyAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCisgICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKKyAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0CisgICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgorICAgICAgICAgICAgCitFbmRCYWRTeW1ib2wKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCisgICAgICAgIEIgICAgICAgRW5kICAgIAorICAgICAgICAKK0VuZE5vRXJyb3IKKyAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAorRW5kCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZmMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsMTIzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgICAgIAorICAgICAgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAgICAgICAgCisgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBEQ0IgIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKKyAgICAgICAgIERDQiAgMTEsIDE4LCAxNAorICAgICAgICAgRENCICAxMywgMjAsIDE2CisgICAgICAgICBEQ0IgIDE0LCAyMywgMTgKKyAgICAgICAgIERDQiAgMTYsIDI1LCAyMAorICAgICAgICAgRENCICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgRENXIDEwLCAxNiwgMTMgCisgICAgICAgICBEQ1cgMTEsIDE4LCAxNAorICAgICAgICAgRENXIDEzLCAyMCwgMTYKKyAgICAgICAgIERDVyAxNCwgMjMsIDE4CisgICAgICAgICBEQ1cgMTYsIDI1LCAyMAorICAgICAgICAgRENXIDE4LCAyOSwgMjMgCisgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiOTU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisgICAgSUYgQVJNMTEzNkpTIAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDgKK2lIZWlnaHQgICAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCit4ICAgICAgICAgICAgICAgUk4gNworeDAgICAgICAgICAgICAgIFJOIDcKK3gxICAgICAgICAgICAgICBSTiAxMAoreDIgICAgICAgICAgICAgIFJOIDExCitTY3JhdGNoICAgICAgICAgUk4gMTIKKworOy8vIEZ1bmN0aW9uOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0CisKK1N0YXJ0QWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ29weTB0b0FsaWduZWQgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorICAgICAgCitDb3B5MXRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTJ0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisKK0NvcHkzdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKKworQ29weUVuZCAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKKworICAgICAgICBNX0VORAorICAgIAorCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjIscjMscjQscjUscjYKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKKzsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjaworU3RhcnRWQWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NXSVRDSCB4CisgICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICAKK0NvcHkwdG9WQWxpZ25lZCAgCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisgICAgICAKK0NvcHkxdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weVZFbmQgIAorCitDb3B5MnRvVkFsaWduZWQgICAgICAgIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkzdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCisKK0NvcHlWRW5kICAKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisKKyAgICAgICAgTV9FTkQKKworCisgICAgRU5ESUYKKworICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBiNmVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxNDkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjAscjIscjgscjkscjEyCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK3gwICAgICAgICAgICAgICBSTiA0Cit4MSAgICAgICAgICAgICAgUk4gNQoreDIgICAgICAgICAgICAgIFJOIDgKK3gzICAgICAgICAgICAgICBSTiA5CitUZW1wICAgICAgICAgICAgUk4gMTIKKworICAgIElGIEFSTTExMzZKUworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2CisKK0NvcHk0eDRTdGFydAorICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBNX1NXSVRDSCBUZW1wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMworICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMQorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKyAgICAgIAorQ29weTR4NEFsaWduMgorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjMgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRFbmQKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjZmU1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE3OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKworOy8vIEZ1bmN0aW9uczogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCis7Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KKzsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgorOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KKworCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKyAgICAgICAgCitNQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyYzAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAwICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorVGVtcDMgICAgICAgICAgIFJOIDEwCitUZW1wNCAgICAgICAgICAgUk4gMTEKK3BCdWYgICAgICAgICAgICBSTiA3CityMHgwZmUwMGZlMCAgICAgUk4gNgorcjB4MDBmZjAwZmYgICAgIFJOIDEyCitDb3VudCAgICAgICAgICAgUk4gMTQKK1ZhbHVlQTAgICAgICAgICBSTiAxMAorVmFsdWVBMSAgICAgICAgIFJOIDExCisKKyAgICBJRiBBUk0xMTM2SlMKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCitMb29wU3RhcnQxCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAorICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCitFbmQxCisgICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgorICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAorCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgorICAgICAgICAKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgorCitMb29wU3RhcnQgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAorCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCisgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKK0VuZDIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04CisgICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAorCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFmZjZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICBJRiBBUk0xMTM2SlMgCisKKworICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKKyAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQxLCA4CisgICAgICAgIE1fQUxMT0M4IHBUZW1wUmVzdWx0MiwgOAorICAgICAgICBNX0FMTE9DNCBwcFNyYywgNAorICAgICAgICBNX0FMTE9DNCBwcERzdCwgNAorICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwQ291bnRlciwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgOy8vIEZ1bmN0aW9uOiAKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAorICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByNgorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1ZhbEEgICAgICAgICAgICBSTiA0CitWYWxCICAgICAgICAgICAgUk4gNQorVmFsQyAgICAgICAgICAgIFJOIDYKK1ZhbEQgICAgICAgICAgICBSTiA3CitWYWxFICAgICAgICAgICAgUk4gOAorVmFsRiAgICAgICAgICAgIFJOIDkKK1ZhbEcgICAgICAgICAgICBSTiAxMgorVmFsSCAgICAgICAgICAgIFJOIDE0CitWYWxJICAgICAgICAgICAgUk4gMQorCitUZW1wMSAgICAgICAgICAgUk4gMworVGVtcDIgICAgICAgICAgIFJOIDEKK1RlbXAzICAgICAgICAgICBSTiAxMgorVGVtcDQgICAgICAgICAgIFJOIDcKK1RlbXA1ICAgICAgICAgICBSTiA1CityMHgwZmUwMGZlMCAgICAgUk4gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KK3IweDAwZmYwMGZmICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAorQ291bnRlciAgICAgICAgIFJOIDExCitwSW50ZXJCdWYgICAgICAgUk4gOAorCitWYWxDQSAgICAgICAgICAgUk4gOAorVmFsREIgICAgICAgICAgIFJOIDkKK1ZhbEdFICAgICAgICAgICBSTiAxMAorVmFsSEYgICAgICAgICAgIFJOIDExCityMHgwMDE0MDAwMSAgICAgUk4gMTIKK3IweDAwMTRmZmZiICAgICBSTiAxNAorCityMHgwMDAxZmMwMCAgICAgUk4gMTEKKworQWNjeCAgICAgICAgICAgIFJOIDgKK0FjY3kgICAgICAgICAgICBSTiA5CitUZW1wNiAgICAgICAgICAgUk4gMTQKKworICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKKworICAgICAgICBNT1YgICAgICAgICBwRHN0LCBwSW50ZXJCdWYgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGRzdFN0ZXAsICMxNgorCisgICAgICAgIDsvLyBTZXQgdXAgY291bnRlciBvZiBmb3JtYXQsIFswXSAgWzBdICBbMSAoaGVpZ2h0KV0gIFs4ICh3aWR0aCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIE1fU1RSICAgICAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisKK0hlaWdodExvb3AKK05leHRUd29Sb3dzTG9vcAorICAgICAgICBMRFIgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbZDEgYzEgYjEgYTFdCisgICAgICAgIExEUiAgICAgVmFsQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtkMCBjMCBiMCBhMF0KKyAgICAgICAgTERSICAgICBWYWxILCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMSBnMSBmMSBlMV0gICAgICAgIAorICAgICAgICBMRFIgICAgIFZhbEUsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gwIGcwIGYwIGUwXQorICAgICAgICBMRFJCICAgIFRlbXAyLCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbbDEgazEgajEgaTFdCisgICAgICAgIExEUkIgICAgVGVtcDEsIFtwU3JjXSwgIy04ICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtsMCBrMCBqMCBpMF0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgVmFsQiwgVmFsQSwgVmFsRCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbYjEgYTEgYjAgYTBdCisgICAgICAgIFBLSFRCICAgVmFsRCwgVmFsRCwgVmFsQSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbZDEgYzEgZDAgYzBdCisgICAgICAgIFVYVEFCMTYgVmFsQSwgcjB4MDBmZjAwZmYsIFZhbEIgICAgICAgICAgICAgICAgIDsvLyBbMDAgYTEgMDAgYTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2IFZhbEMsIHIweDAwZmYwMGZmLCBWYWxEICAgICAgICAgICAgICAgICA7Ly8gWzAwIGMxIDAwIGMwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgUEtIQlQgICBWYWxJLCBUZW1wMSwgVGVtcDIsIExTTCAjMTYgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxGLCBWYWxFLCBWYWxILCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtmMSBlMSBmMCBlMF0KKyAgICAgICAgUEtIVEIgICBWYWxILCBWYWxILCBWYWxFLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtoMSBnMSBoMCBnMF0KKyAgICAgICAgVVhUQUIxNiBWYWxFLCByMHgwMGZmMDBmZiwgVmFsRiAgICAgICAgICAgICAgICAgOy8vIFswMCBlMSAwMCBlMF0gKyBbMCAyNTUgMCAyNTVdCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MwCisgICAgICAgIDsvLyBBY2MwID0gYSAtIDUqYiArIDIwKmMgKyAyMCpkIC0gNSplICsgZgorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxDLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsRSwgVmFsQiwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2IEFjYzAsIFZhbEEsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMCwgQWNjMCwgVGVtcDEgICAgICAgCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MxCisgICAgICAgIDsvLyBBY2MxID0gYiAtIDUqYyArIDIwKmQgKyAyMCplIC0gNSpmICsgZworICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxFLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsQywgVmFsRiwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVmFsRywgcjB4MDBmZjAwZmYsIFZhbEggICAgICAgICAgICAgICAgIDsvLyBbMDAgZzEgMDAgZzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMSwgVmFsRywgVmFsQiwgUk9SICM4CisgICAgICAgIEFERCAgICAgQWNjMSwgQWNjMSwgVGVtcDEgICAgICAgIAorCisgICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKKyAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMgorICAgICAgICA7Ly8gQWNjMiA9IGMgLSA1KmQgKyAyMCplICsgMjAqZiAtIDUqZyArIGgKKyAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRywgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgQWNjMywgVmFsSSwgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEUsIFZhbEYsIFJPUiAjOAorICAgICAgICAKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDEsIFRlbXAyLCBMU0wgIzIgICAgICAgIAorICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxHLCBWYWxGLCBST1IgIzgKKyAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAorICAgICAgICBBREQgICAgIEFjYzIsIEFjYzIsIFRlbXAxICAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzMKKyAgICAgICAgOy8vIEFjYzMgPSBkIC0gNSplICsgMjAqZiArIDIwKmcgLSA1KmggKyBpCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEgsIFJPUiAjOAorICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMgorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMywgQWNjMywgVGVtcDEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAorICAgICAgICBNX0xEUiAgIHNyY1N0ZXAsIHBTcmNTdGVwCisKKyAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgZXZlbiBzdG9yZSBBY2MwLUFjYzMgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyCisgICAgICAgIDsvLyBJZiBDb3VudGVyIGlzIG9mZiBzdG9yZSBBY2MwLUFjYzMgYW5kIHByZXZpb3VzIEFjYzAtQWNjMyBpbiBhIGludGVybWVkaWF0ZSBidWYgCisgICAgICAgIEFORFMgICAgICAgIFRlbXAzLCBDb3VudGVyLCAjMQorICAgICAgICBCRVEgICAgICAgICBOb1Byb2Nlc3NpbmcgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFBhY2tpbmcgcHJldmlvdXMgYW5kIGN1cnJlbnQgQWNjMC1BY2MzIHZhbHVlcworICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDEKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzAsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYTIgMCBhMF0gPSBbMCBhMyAwIGEyXSBbMCBhMSAwIGEwXQorICAgICAgICBQS0hUQiAgICAgICBBY2MwLCBBY2MwLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICA7Ly9bMCBhMyAwIGExXSA9IFswIGExIDAgYTBdIFswIGEzIDAgYTJdIAorICAgICAgICBTVFIgICAgICAgICBBY2MwLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MxLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGIyIDAgYjBdID0gWzAgYjMgMCBiMl0gWzAgYjEgMCBiMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMSwgQWNjMSwgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGIzIDAgYjFdID0gWzAgYjEgMCBiMF0gWzAgYjMgMCBiMl0KKyAgICAgICAgTV9MRFJEICAgICAgQWNjeCwgQWNjeSwgcFRlbXBSZXN1bHQyCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N4LCBBY2MyLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGMyIDAgYzBdID0gWzAgYzMgMCBjMl0gWzAgYzEgMCBjMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMiwgQWNjMiwgQWNjeCwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGMzIDAgYzFdID0gWzAgYzEgMCBjMF0gWzAgYzMgMCBjMl0KKyAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeSwgQWNjMywgTFNMICMxNiAgICAgICAgICA7Ly9bMCBkMiAwIGQwXSA9IFswIGQzIDAgZDJdIFswIGQxIDAgZDBdCisgICAgICAgIFBLSFRCICAgICAgIEFjYzMsIEFjYzMsIEFjY3ksIEFTUiAjMTYgICAgICAgICAgICA7Ly9bMCBkMyAwIGQxXSA9IFswIGQxIDAgZDBdIFswIGQzIDAgZDJdCisgICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjLTEyCisgICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQWZ0ZXJTdG9yZQorCitOb1Byb2Nlc3NpbmcKKyAgICAgICAgTV9TVFJEICAgICAgQWNjMCwgQWNjMSwgcFRlbXBSZXN1bHQxCisgICAgICAgIE1fU1RSRCAgICAgIEFjYzIsIEFjYzMsIHBUZW1wUmVzdWx0MgorQWZ0ZXJTdG9yZQorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMSAgICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAorCisgICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgIDsvL1swIGExIDAgYTBdCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0XSwgIzQKKyAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3RdLCAjNAorICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdF0sICMtMTIKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgIDsvLworICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzE2CisgICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgorICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKKworSGVpZ2h0TG9vcDEKKyAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKworICAgICAgICBNX0xEUiAgICAgICBWYWxDQSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGMgMCBhXQorICAgICAgICBNX0xEUiAgICAgICBWYWxEQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQorICAgICAgICBNX0xEUiAgICAgICBWYWxHRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGcgMCBlXQorICAgICAgICBNX0xEUiAgICAgICBWYWxIRiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGggMCBmXQorCisKKyAgICAgICAgOy8vIEFjYzAgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGMgMCBhXSArIFswIGQgMCBmXSkpIC0gKDUgKiAoYiArIGUpKSAKKyAgICAgICAgOy8vIEFjYzEgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGUgMCBnXSArIFswIGQgMCBiXSkpIC0gKDUgKiAoYyArIGYpKSAKKyAgICAgICAgOy8vIEFjYzIgPSBzbXVhZCAoWzAgMSAwIDIwXSwgYWRkKFswIGMgMCBlXSArIFswIGggMCBmXSkpIC0gKDUgKiAoZCArIGcpKSAKKyAgICAgICAgOy8vIEFjYzMgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGQgMCBmXSArIFswIGkgMCBnXSkpIC0gKDUgKiAoZSArIGgpKSAKKworICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQorCisgICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2CisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKKyAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAorCisgICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAorICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCisgICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMSwgQWNjMSwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMiwgQWNjMiwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MzLCBbcERzdF0sIGRzdFN0ZXAKKworCisgICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzEKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKKyAgICAgICAgQkdUICAgICAgICAgSGVpZ2h0TG9vcDEKK0VuZAorICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0OGUxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDI3NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgCisgICAgCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMgCisgICAgICAgIAorICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKKyAgICAgICAgTV9BTExPQzQgcHBTcmMsIDQKKyAgICAgICAgTV9BTExPQzQgcHBEc3QsIDQKKyAgICAgICAgTV9BTExPQzQgcENvdW50ZXIsIDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIDsvLyBGdW5jdGlvbjoKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAorICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByNgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCitWYWxBICAgICAgICAgICAgUk4gNQorVmFsQTAgICAgICAgICAgIFJOIDQKK1ZhbEExICAgICAgICAgICBSTiA1CitWYWxBRjAgICAgICAgICAgUk4gNAorVmFsQUYxICAgICAgICAgIFJOIDUKKworVmFsQiAgICAgICAgICAgIFJOIDExCisKK1ZhbEMgICAgICAgICAgICBSTiA1CitWYWxDMCAgICAgICAgICAgUk4gNAorVmFsQzEgICAgICAgICAgIFJOIDUKK1ZhbENEMCAgICAgICAgICBSTiAxMgorVmFsQ0QxICAgICAgICAgIFJOIDE0CitWYWxDRjAgICAgICAgICAgUk4gNAorVmFsQ0YxICAgICAgICAgIFJOIDUKKworVmFsRCAgICAgICAgICAgIFJOIDEwCisKK1ZhbEUgICAgICAgICAgICBSTiA3CitWYWxFMCAgICAgICAgICAgUk4gNgorVmFsRTEgICAgICAgICAgIFJOIDcKK1ZhbEVCMCAgICAgICAgICBSTiAxMAorVmFsRUIxICAgICAgICAgIFJOIDExCitWYWxFRDAgICAgICAgICAgUk4gNgorVmFsRUQxICAgICAgICAgIFJOIDcKKworVmFsRiAgICAgICAgICAgIFJOIDEwCisKK1ZhbEcgICAgICAgICAgICBSTiAxNAorVmFsRzAgICAgICAgICAgIFJOIDEyCitWYWxHMSAgICAgICAgICAgUk4gMTQKK1ZhbEdCMCAgICAgICAgICBSTiAxMgorVmFsR0IxICAgICAgICAgIFJOIDE0CisKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1RlbXAgICAgICAgICAgICBSTiA3CitTdGVwICAgICAgICAgICAgUk4gNgorCitwSW50ZXJCdWYgICAgICAgUk4gOAorQ291bnRlciAgICAgICAgIFJOIDgKK3IweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKK3IweDAwMDFmYzAwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KKworICAgIAorOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK1ZhbENBICAgICAgICAgICBSTiA4CitWYWxEQiAgICAgICAgICAgUk4gOQorVmFsR0UgICAgICAgICAgIFJOIDEwCitWYWxIRiAgICAgICAgICAgUk4gMTEKK3IweDAwMTQwMDAxICAgICBSTiAxMgorcjB4MDAxNGZmZmIgICAgIFJOIDE0CisKK3IweDAwMDAwMjAwICAgICBSTiAxMgorcjB4MDAwMDAwZmYgICAgIFJOIDEyCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKKyAgICAgICAgTU9WICAgICAgICAgcERzdCwgcEludGVyQnVmICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBkc3RTdGVwLCAjMjQKKworICAgICAgICA7Ly8gU2V0IHVwIGNvdW50ZXIgb2YgZm9ybWF0LCBbMF0gIFswXSAgWzEgKGhlaWdodCldICBbOCAod2lkdGgpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjMQorICAgICAgICBNT1YgICAgICAgICBUZW1wLCAjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIENvdW50ZXIsIFRlbXAsIENvdW50ZXIsIExTTCAjOCAgICAgICAgOy8vIFswIDAgSCBXXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKK1dpZHRoTG9vcAorICAgICAgICBNX1NUUiAgICAgICBwU3JjLCBwcFNyYworICAgICAgICBNX1NUUiAgICAgICBwRHN0LCBwcERzdAorSGVpZ2h0TG9vcAorVHdvUm93c0xvb3AKKyAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQwLCBWYWxFMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDEsIFZhbEUxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KKyAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCisgICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsRUQxLCBWYWxDRjEsIFZhbEVEMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIFZhbEEsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBMRFIgICAgICAgICBWYWxBLCBbVmFsQV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFthMyBhMiBhMSBhMF0KKyAgICAgICAgUlNCICAgICAgICAgVmFsRUQwLCBWYWxDRjAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrRStEKSAtIChPZmYrQytGKSAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFZhbEVEMSwgVmFsRUQxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQwLCBWYWxFRDAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitFK0QpIC0gKE9mZitDK0YpXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBMCwgcjB4MDBmZjAwZmYsIFZhbEEgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBMSwgcjB4MDBmZjAwZmYsIFZhbEEsIFJPUiAjOCAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjAsIFZhbEEwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMSwgVmFsQTEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQorICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCAjNF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgorICAgICAgICBVWFRBQjE2ICAgICBWYWxHMCwgcjB4MDBmZjAwZmYsIFZhbEcgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHMSwgcjB4MDBmZjAwZmYsIFZhbEcsIFJPUiAjOCAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjAsIFZhbEcwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMSwgVmFsRzEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgQWNjMiwgVmFsRUQwLCBWYWxHQjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MyID0gMTYqT2ZmICsgKEIrRykgKyAyMCooRCtFKSAtIDUqKEMrRikKKyAgICAgICAgQUREICAgICAgICAgQWNjMywgVmFsRUQxLCBWYWxHQjEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsICM0XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxIDw8IDggICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcFNyYywgcHBTcmMKKyAgICAgICAgTV9MRFIgICAgICAgcERzdCwgcHBEc3QKKyAgICAgICAgQUREUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIygxIDw8IDgpLTQgICAgICAgICAgIDsvLyBMb29wIHRpbGwgd2lkdGggaXMgMTIKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzQKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzgKKyAgICAgICAgQUREICAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzE8PDgKKyAgICAgICAgQlBMICAgICAgICAgV2lkdGhMb29wCisgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgIDsvLworICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCAjMjQKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzI0CisgICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgorICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKKworSGVpZ2h0TG9vcDEKKyAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKworCisgICAgICAgIExEUiAgICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBjIDAgYV0KKyAgICAgICAgTERSICAgICAgICAgVmFsREIsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQorICAgICAgICBMRFIgICAgICAgICBWYWxHRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCisgICAgICAgIExEUiAgICAgICAgIFZhbEhGLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBoIDAgZl0KKworICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAorICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAorICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAorICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAorICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQorCisgICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM4ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2CisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKKyAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAorCisgICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAorICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCisgICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAorICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCisgICAgICAgIE1PViAgICAgICAgIEFjYzIsIEFjYzIsIExTUiAjMTAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAorCisgICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgICAgIEFjYzIsIEFjYzIsIEFjYzMsIExTTCAjOAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQorICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MyLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQorRW5kCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTBjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzOSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgSUYgQVJNMTEzNkpTCisKKzsvLyBGdW5jdGlvbjogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCis7Ly8gYmUgYWxpZ25lZC4gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBjb3JyZXNwb25kaW5nIHN0ZXAgc2l6ZQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCisKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworQWNjMCAgICAgICAgICAgIFJOIDQKK0FjYzEgICAgICAgICAgICBSTiA1CitBY2MyICAgICAgICAgICAgUk4gNgorQWNjMyAgICAgICAgICAgIFJOIDcKKworVmFsQSAgICAgICAgICAgIFJOIDQKK1ZhbEIgICAgICAgICAgICBSTiA1CitWYWxDICAgICAgICAgICAgUk4gNgorVmFsRCAgICAgICAgICAgIFJOIDcKK1ZhbEUgICAgICAgICAgICBSTiA4CitWYWxGICAgICAgICAgICAgUk4gOQorVmFsRyAgICAgICAgICAgIFJOIDEyCitWYWxIICAgICAgICAgICAgUk4gMTQKK1ZhbEkgICAgICAgICAgICBSTiAxCisKK1RlbXAxICAgICAgICAgICBSTiAzCitUZW1wMiAgICAgICAgICAgUk4gMQorVGVtcDMgICAgICAgICAgIFJOIDEyCitUZW1wNCAgICAgICAgICAgUk4gNworVGVtcDUgICAgICAgICAgIFJOIDUKK3IweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQorcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CitDb3VudGVyICAgICAgICAgUk4gMTEKKworSGVpZ2h0ICAgICAgICAgIFJOIDMKKworICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjYKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgQ291bnRlciwgIzIKKyAgICAgICAgTV9TVFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCisgICAgICAgIE1fU1RSICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAorICAgICAgICBMRFIgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKKworTmV4dFR3b1Jvd3NMb29wCisgICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KKyAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQorICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCisgICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCisgICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KKyAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KKyAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KKyAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQorICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQorICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKKyAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKKyAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKKyAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCisKKyAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIDB4MGZlMDBmZTAgPSAoMTYgKiBPZmZzZXQpIC0gMTYgd2hlcmUgT2Zmc2V0IGlzIDI1NSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKKyAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgQWNjMSwgQWNjMSwgcjB4MGZlMDBmZTAKKyAgICAgICAgVVNBVDE2ICBBY2MwLCAjMTMsIEFjYzAKKyAgICAgICAgVVNBVDE2ICBBY2MxLCAjMTMsIEFjYzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCisgICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFORCAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNQorICAgICAgICBBTkQgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUKKyAgICAgICAgT1JSICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzggICAgICAgIAorICAgICAgICBSU0IgICAgIFRlbXA1LCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDUsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDUgICAgICAgIAorCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMworICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKKyAgICAgICAgVVhUQUIxNiBUZW1wNSwgVmFsRSwgVmFsSCwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXA1LCBUZW1wMiwgTFNMICMyCisgICAgICAgIExEUiAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wNQorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MzLCBBY2MzLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVU0FUMTYgIEFjYzMsICMxMywgQWNjMworICAgICAgICBVU0FUMTYgIEFjYzIsICMxMywgQWNjMiAgICAgICAgCisKKyAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcAorICAgICAgICBBTkQgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUKKyAgICAgICAgQU5EICAgICBBY2MyLCByMHgwMGZmMDBmZiwgQWNjMiwgTFNSICM1CisgICAgICAgIE9SUiAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4CisgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKKyAgICAgICAgUEtIQlQgICBBY2MxLCBBY2MwLCBBY2MyLCBMU0wgIzE2ICAgCisgICAgICAgIE1fU1RSICAgQWNjMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQxCisgICAgICAgIFBLSFRCICAgQWNjMiwgQWNjMiwgQWNjMCwgQVNSICMxNiAgIAorICAgICAgICBNX1NUUiAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0MgorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgQkdUICAgICBOZXh0VHdvUm93c0xvb3AKK0VuZAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgIEVORAorICAgIAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2NkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE4NSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorCisKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorCisgICAgICAgIDsvLyBGdW5jdGlvbjogCisgICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEltcGxlbWVudHMgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCisgICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMgd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIGNvcnJlc3BvbmRpbmcgc3RlcCBzaXplCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCisgICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKKyAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjYKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworVmFsQSAgICAgICAgICAgIFJOIDUKK1ZhbEEwICAgICAgICAgICBSTiA0CitWYWxBMSAgICAgICAgICAgUk4gNQorVmFsQUYwICAgICAgICAgIFJOIDQKK1ZhbEFGMSAgICAgICAgICBSTiA1CisKK1ZhbEIgICAgICAgICAgICBSTiAxMQorCitWYWxDICAgICAgICAgICAgUk4gNQorVmFsQzAgICAgICAgICAgIFJOIDQKK1ZhbEMxICAgICAgICAgICBSTiA1CitWYWxDRDAgICAgICAgICAgUk4gMTIKK1ZhbENEMSAgICAgICAgICBSTiAxNAorVmFsQ0YwICAgICAgICAgIFJOIDQKK1ZhbENGMSAgICAgICAgICBSTiA1CisKK1ZhbEQgICAgICAgICAgICBSTiAxMAorCitWYWxFICAgICAgICAgICAgUk4gNworVmFsRTAgICAgICAgICAgIFJOIDYKK1ZhbEUxICAgICAgICAgICBSTiA3CitWYWxFQjAgICAgICAgICAgUk4gMTAKK1ZhbEVCMSAgICAgICAgICBSTiAxMQorVmFsRUQwICAgICAgICAgIFJOIDYKK1ZhbEVEMSAgICAgICAgICBSTiA3CisKK1ZhbEYgICAgICAgICAgICBSTiAxMAorCitWYWxHICAgICAgICAgICAgUk4gMTQKK1ZhbEcwICAgICAgICAgICBSTiAxMgorVmFsRzEgICAgICAgICAgIFJOIDE0CitWYWxHQjAgICAgICAgICAgUk4gMTIKK1ZhbEdCMSAgICAgICAgICBSTiAxNAorCitBY2MwICAgICAgICAgICAgUk4gNAorQWNjMSAgICAgICAgICAgIFJOIDUKK0FjYzIgICAgICAgICAgICBSTiA2CitBY2MzICAgICAgICAgICAgUk4gNworCitUZW1wICAgICAgICAgICAgUk4gNworSGVpZ2h0ICAgICAgICAgIFJOIDMKK1N0ZXAgICAgICAgICAgICBSTiA2CisKK0NvdW50ZXIgICAgICAgICBSTiA4CityMHgwMGZmMDBmZiAgICAgUk4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CityMHgwZmUwMGZlMCAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCisKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICMyCisgICAgICAgIAorVHdvUm93c0xvb3AKKyAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEIsIFtwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEUwLCByMHgwMGZmMDBmZiwgVmFsRSAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEUxLCByMHgwMGZmMDBmZiwgVmFsRSwgUk9SICM4ICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QwLCBWYWxDMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDEsIFZhbEMxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIwLCBWYWxFMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQorICAgICAgICBSU0IgICAgICAgICBWYWxDRDAsIFZhbEVCMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitDK0QpIC0gKE9mZitCK0UpCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxELCBbcFNyYywgc3JjU3RlcCwgTFNMICMxXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIxLCBWYWxFMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMSwgVmFsRUIxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDAsIFZhbEUwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMSwgVmFsRTEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsRiwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZjMgZjIgZjEgZjBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsQ0QwLCBWYWxDRDAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitDK0QpIC0gKE9mZitCK0UpXQorICAgICAgICBBREQgICAgICAgICBWYWxDRDEsIFZhbENEMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjEsIFZhbEMxLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YwLCBWYWxDMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDEsIFZhbENGMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgVmFsQSwgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIExEUiAgICAgICAgIFZhbEEsIFtWYWxBXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2EzIGEyIGExIGEwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDAsIFZhbENGMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitFK0QpIC0gKE9mZitDK0YpICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQxLCBWYWxFRDEsIFZhbEVEMSwgTFNMICMyICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxFRDAsIFZhbEVEMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRildCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEEwLCByMHgwMGZmMDBmZiwgVmFsQSAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEExLCByMHgwMGZmMDBmZiwgVmFsQSwgUk9SICM4ICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMCwgVmFsQTAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYxLCBWYWxBMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAorICAgICAgICBBREQgICAgICAgICBBY2MxLCBWYWxDRDEsIFZhbEFGMSAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxHLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtnMyBnMiBnMSBnMF0KKyAgICAgICAgQUREICAgICAgICAgQWNjMCwgVmFsQ0QwLCBWYWxBRjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MwID0gMTYqT2ZmICsgKEErRikgKyAyMCooQytEKSAtIDUqKEIrRSkgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBBY2MxLCBBY2MxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgOy8vIEFjYzEgLT0gKDE2Kk9mZiAtIDE2KQorICAgICAgICBVUVNVQjE2ICAgICBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcwLCByMHgwMGZmMDBmZiwgVmFsRyAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcxLCByMHgwMGZmMDBmZiwgVmFsRywgUk9SICM4ICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMCwgVmFsRzAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IxLCBWYWxHMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBBY2MyLCBWYWxFRDAsIFZhbEdCMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzIgPSAxNipPZmYgKyAoQitHKSArIDIwKihEK0UpIC0gNSooQytGKQorICAgICAgICBBREQgICAgICAgICBBY2MzLCBWYWxFRDEsIFZhbEdCMSAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzMsIEFjYzMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMyAtPSAoMTYqT2ZmIC0gMTYpCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzIsIEFjYzIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgQWNjMSwgIzEzLCBBY2MxICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXR1cmF0ZSB0byA4KzUgPSAxMyBiaXRzCisgICAgICAgIFVTQVQxNiAgICAgIEFjYzAsICMxMywgQWNjMAorICAgICAgICBVU0FUMTYgICAgICBBY2MzLCAjMTMsIEFjYzMgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBBY2MyLCAjMTMsIEFjYzIKKyAgICAgICAgQU5EICAgICAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNSAgICAgICAgIDsvLyBbMCBhMyAwIGExXQorICAgICAgICBBTkQgICAgICAgICBBY2MwLCByMHgwMGZmMDBmZiwgQWNjMCwgTFNSICM1ICAgICAgICAgOy8vIFswIGEyIDAgYTBdCisgICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOCAgICAgICAgICAgICAgICA7Ly8gW2EzIGEyIGExIGEwXQorICAgICAgICBBTkQgICAgICAgICBBY2MzLCByMHgwMGZmMDBmZiwgQWNjMywgTFNSICM1ICAgICAgICAgOy8vIFswIGIzIDAgYjFdCisgICAgICAgIEFORCAgICAgICAgIEFjYzIsIHIweDAwZmYwMGZmLCBBY2MyLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjIgMCBiMF0KKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKKyAgICAgICAgT1JSICAgICAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIEJHVCAgICAgICAgIFR3b1Jvd3NMb29wCitFbmQKKyAgICAgICAgU1VCICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFkMTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKQEAgLTAsMCArMSwyNzMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vIGlucHV0IHJlZ2lzdGVycworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitpU3JjU3RlcCAgICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgICAgICBSTiAzCitpV2lkdGggICAgICAgICAgICAgICBSTiA0CitpSGVpZ2h0ICAgICAgICAgICAgICBSTiA1CitkeCAgICAgICAgICAgICAgICAgICBSTiA2CitkeSAgICAgICAgICAgICAgICAgICBSTiA3CisKKworOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycwordGVtcCAgICAgICAgICAgICAgICAgUk4gMTEKK3IweDIwICAgICAgICAgICAgICAgIFJOIDEyCit0bXAweDIwICAgICAgICAgICAgICBSTiAxNAorcmV0dXJuICAgICAgICAgICAgICAgUk4gMAorZHhQbHVzZHkgICAgICAgICAgICAgUk4gMTAKK0VpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCitFaWdodE1pbnVzZHkgICAgICAgICBSTiA5CitkeEVpZ2h0TWludXNkeCAgICAgICBSTiA4CitCQUNvZWZmICAgICAgICAgICAgICBSTiA2CitEQ0NvZWZmICAgICAgICAgICAgICBSTiA3CisgICAgICAgICAgICAgICAgICAgICAKK2lEc3RTdGVweDJNaW51c1dpZHRoIFJOIDgKK2lTcmNTdGVweDJNaW51c1dpZHRoIFJOIDkKK2lTcmNTdGVwMSAgICAgICAgICAgIFJOIDEwCisKK3BTcmMxICAgICAgICAgICAgICAgIFJOIDEKK3BTcmMyICAgICAgICAgICAgICAgIFJOIDgKK3BEc3QxICAgICAgICAgICAgICAgIFJOIDgKK3BEc3QyICAgICAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKK3BpeDAwICAgICAgICAgICAgICAgIFJOIDgKK3BpeDAxICAgICAgICAgICAgICAgIFJOIDkKK3BpeDEwICAgICAgICAgICAgICAgIFJOIDEwCitwaXgxMSAgICAgICAgICAgICAgICBSTiAxMQorCitPdXQwMTAwICAgICAgICAgICAgICBSTiA4ICAKK091dDExMTAgICAgICAgICAgICAgIFJOIDEwIAorCit4MDAgICAgICAgICAgICAgICAgICBSTiA4Cit4MDEgICAgICAgICAgICAgICAgICBSTiAxMAoreDAyICAgICAgICAgICAgICAgICAgUk4gMTIKK3gxMCAgICAgICAgICAgICAgICAgIFJOIDkKK3gxMSAgICAgICAgICAgICAgICAgIFJOIDExCit4MTIgICAgICAgICAgICAgICAgICBSTiAxNAoreDIwICAgICAgICAgICAgICAgICAgUk4gMTAKK3gyMSAgICAgICAgICAgICAgICAgIFJOIDEyCit4MjIgICAgICAgICAgICAgICAgICBSTiAxNAorICAgICAgICAgICAgICAgICAgICAgCit4MDF4MDAgICAgICAgICAgICAgICBSTiA4ICAKK3gwMngwMSAgICAgICAgICAgICAgIFJOIDEwIAoreDExeDEwICAgICAgICAgICAgICAgUk4gOSAgCit4MTJ4MTEgICAgICAgICAgICAgICBSTiAxMSAKK3gyMXgyMCAgICAgICAgICAgICAgIFJOIDEwIAoreDIyeDIxICAgICAgICAgICAgICAgUk4gMTIgCisgICAgICAgICAgICAgICAgICAgICAKK091dFJvdzAwICAgICAgICAgICAgIFJOIDEyCitPdXRSb3cwMSAgICAgICAgICAgICBSTiAxNAorT3V0Um93MTAgICAgICAgICAgICAgUk4gMTAKK091dFJvdzExICAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKK091dFJvdzAxMDAgICAgICAgICAgIFJOIDEyCitPdXRSb3cxMTEwICAgICAgICAgICBSTiAxMgorICAgICAgICAgICAgICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0CisgICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAorICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKKyAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBpV2lkdGgsICBXaWR0aCAgCisgICAgICAgIE1fTERSICAgaUhlaWdodCwgSGVpZ2h0ICAKKyAgICAgICAgTV9MRFIgICBkeCwgICAgICBEeCAKKyAgICAgICAgTV9MRFIgICBkeSwgICAgICBEeQorICAgICAgICAKKyAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5CisgICAgICAgIAorICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQorICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKKyAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMsIGlTcmNTdGVwCisgICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4CisgICAgICAgIENNTiAgICAgZHgsZHkKKyAgICAgICAgQUREICAgICBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R4LCBkeCwgTFNMICMxNgorICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gUGFja2VkIENvZWZmcy4KKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgQkFDb2VmZiwgZHhFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBNVUwgICAgIERDQ29lZmYsIGR4RWlnaHRNaW51c2R4LCBkeSAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNraW5nIGVpdGhlciBvZiBkeCBhbmQgZHkgYmVpbmcgbm9uLXplcm8KKyAgICAgICAgCisgICAgICAgIEJFUSAgICAgTVZJc1plcm8KKyAgICAgICAgCis7Ly8gUGl4ZWwgbGF5b3V0OgorOy8vCis7Ly8gICB4MDAgeDAxIHgwMgorOy8vICAgeDEwIHgxMSB4MTIKKzsvLyAgIHgyMCB4MjEgeDIyCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQorICAgICAgICAKK091dGVyTG9vcE1WSXNOb3RaZXJvCisKK0lubmVyTG9vcE1WSXNOb3RaZXJvCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMCwgW3BTcmMsICAjKzBdICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDEwLCBbcFNyYzEsICMrMF0gICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MDEsIFtwU3JjLCAgIysxXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDExLCBbcFNyYzEsICMrMV0gICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMiwgW3BTcmMsICAjKzJdISAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgxMiwgW3BTcmMxLCAjKzJdISAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgwMXgwMCwgeDAwLCB4MDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgICAgICAgICAgT1JSICAgICB4MDJ4MDEsIHgwMSwgeDAyLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHIweDIwLCAgIzMyCisgICAgICAgICAgICAgICAgT1JSICAgICB4MTF4MTAsIHgxMCwgeDExLCBMU0wgIzE2ICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgeDEyeDExLCB4MTEsIHgxMiwgTFNMICMxNiAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICB4MDF4MDAsIHgwMXgwMCwgQkFDb2VmZiwgcjB4MjAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMngwMSwgeDAyeDAxLCBCQUNvZWZmLCByMHgyMCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gaVdpZHRoIHBhY2tlZCB3aXRoIE1TQiAodG9wIDE2IGJpdHMpIAorICAgICAgICAgICAgICAgIDsvLyBhcyBpbm5lciBsb29wIGNvdW50ZXIgdmFsdWUgaS5lIAorICAgICAgICAgICAgICAgIDsvLyAoaVdpZHRoIC0xKSBhbmQgTFNCIChsb3dlciAxNiBiaXRzKQorICAgICAgICAgICAgICAgIDsvLyBhcyBvcmlnaW5hbCB3aWR0aAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MDAsIHgxMXgxMCwgRENDb2VmZiwgeDAxeDAwICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMSwgeDEyeDExLCBEQ0NvZWZmLCB4MDJ4MDEgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBSU0IgICAgIHBTcmMyLCBwU3JjLCBwU3JjMSwgTFNMICMxCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMCwgT3V0Um93MDAsIExTUiAjNgorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MDEsIE91dFJvdzAxLCBMU1IgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgyMCxbcFNyYzIsICMtMl0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIE91dFJvdzAxMDAsIE91dFJvdzAwLCBPdXRSb3cwMSwgTFNMICM4CisgICAgICAgICAgICAgICAgU1RSSCAgICBPdXRSb3cwMTAwLCBbcERzdF0sICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MjEsW3BTcmMyLCAjLTFdCisgICAgICAgICAgICAgICAgTERSQiAgICB4MjIsW3BTcmMyLCAjKzBdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRHN0MSwgcERzdCwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgyMXgyMCwgeDIwLCB4MjEsIExTTCAjMTYKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgyMngyMSwgeDIxLCB4MjIsIExTTCAjMTYgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgdG1wMHgyMCwgIzMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIFJldXNpbmcgdGhlIHBhY2tlZCBkYXRhIHgxMXgxMCBhbmQgeDEyeDExCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICB4MTF4MTAsICB4MTF4MTAsICBCQUNvZWZmLCB0bXAweDIwCisgICAgICAgICAgICAgICAgU01MQUQgICB4MTJ4MTEsICB4MTJ4MTEsICBCQUNvZWZmLCB0bXAweDIwCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cxMCwgeDIxeDIwLCBEQ0NvZWZmLCB4MTF4MTAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzExLCB4MjJ4MjEsIERDQ29lZmYsIHgxMngxMQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTAsIE91dFJvdzEwLCBMU1IgIzYKKyAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzExLCBPdXRSb3cxMSwgTFNSICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MTExMCwgT3V0Um93MTAsIE91dFJvdzExLCBMU0wgIzgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzExMTAsIFtwRHN0MSwgIy0yXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2CisgICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCisgICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCisgICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCisgICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgorICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCisKK01WSXNaZXJvCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKK091dGVyTG9vcE1WSXNaZXJvCisKK0lubmVyTG9vcE1WSXNaZXJvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDAsIFtwU3JjXSwgICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDEsIFtwU3JjXSwgICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTAsIFtwU3JjMV0sICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTEsIFtwU3JjMV0sICMrMQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdDIsICBwRHN0LCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIE91dDAxMDAsIHBpeDAwLCBwaXgwMSwgTFNMICM4IAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MTExMCwgcGl4MTAsIHBpeDExLCBMU0wgIzgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dDAxMDAsIFtwRHN0XSwgICMyCisgICAgICAgICAgICAgICAgU1RSSCAgICBPdXQxMTEwLCBbcERzdDJdLCAjMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2CisgICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCisgICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCisgICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCisgICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgorICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FTkQKKworICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgICAgIEVORAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTYyZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpAQCAtMCwwICsxLDc0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgIAorICAgICAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisgICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKKyAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4CisgICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQorICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCisgICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgorICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKKyAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgorICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKKyAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCisgICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQorICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKKyAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1CisgICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAorICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKKyAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCisgICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBFTkQKKyAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWQxODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCkBAIC0wLDAgKzEsNDA3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKzsvLyAKKzsvLyAKKworICAgICAgICAKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERzdCAgICAgICAgICAgICAgICBSTiAgMAorcFNyYyAgICAgICAgICAgICAgICBSTiAgMQorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2luMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKK2luMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQoraW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCitpbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KK2luMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQoraW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KK2luMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCitpbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQorCis7Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQordHJSb3cwMCAgICAgICAgICAgICBSTiAgMgordHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKK3RyUm93MDIgICAgICAgICAgICAgUk4gIDMKK3RyUm93MTIgICAgICAgICAgICAgUk4gIDUKK3RyUm93MjAgICAgICAgICAgICAgUk4gIDExCit0clJvdzMwICAgICAgICAgICAgIFJOICAxMgordHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKK3RyUm93MjIgICAgICAgICAgICAgUk4gIDcKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2UwICAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitlMSAgICAgICAgICAgICAgICAgIFJOICA2CitlMiAgICAgICAgICAgICAgICAgIFJOICA4CitlMyAgICAgICAgICAgICAgICAgIFJOICA5Citjb25zdFplcm8gICAgICAgICAgIFJOICAxCisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCityb3dPcDAwICAgICAgICAgICAgIFJOICAyCityb3dPcDEwICAgICAgICAgICAgIFJOICAxMAorcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKK3Jvd09wMzAgICAgICAgICAgICAgUk4gIDEyCityb3dPcDAyICAgICAgICAgICAgIFJOICAzCityb3dPcDEyICAgICAgICAgICAgIFJOICA1Cityb3dPcDIyICAgICAgICAgICAgIFJOICA3Cityb3dPcDMyICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKK3RyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCit0ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAordHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCit0ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCit0ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2cwICAgICAgICAgICAgICAgICAgUk4gIDEwCitnMSAgICAgICAgICAgICAgICAgIFJOICAxMQorZzIgICAgICAgICAgICAgICAgICBSTiAgMTIKK2czICAgICAgICAgICAgICAgICAgUk4gIDE0ICAgCisKKzsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscworY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitjb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitjb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK2NvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAorCisKK3RlbXAxICAgICAgICAgICAgICAgUk4gIDEwICAgICAgICAgICAgICAgICAgOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcworY29uc3QxICAgICAgICAgICAgICBSTiAgMTEgICAgICAKK2NvbnN0MiAgICAgICAgICAgICAgUk4gIDEyCittYXNrICAgICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gT3V0cHV0IHBpeGVscworb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK291dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitvdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK291dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitvdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK291dDMyICAgICAgICAgICAgICAgUk4gIDkgIAorICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCxyMTEKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwU3JjLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9CisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgY29uc3RaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIDtMRFIgICAgICAgY29uc3RaZXJvLD0weDAwMDAwMDAwICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCisgICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKKyAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4CisgICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0CisgICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0CisgICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0CisgICAgICAgIDsvLworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIGQwIGQxIC0gLQorICAgICAgICA7Ly8gICBkNCBkNSAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKKyAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCisgICAgICAgIAorICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KKyAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFNTVUIxNiAgICBlMSwgdHJSb3cwMCx0clJvdzIwICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyICAKKyAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFNIQUREMTYgICBlMywgdHJSb3czMCxjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyAgYXZvaWQgcGlwZWxpbmUgc3RhbGxzIGZvciBlMiBhbmQgZTMKKyAgICAgICAgU1NVQjE2ICAgIGUyLCBlMiwgdHJSb3czMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAgCisgICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgIAorICAgICAgICBTQUREMTYgICAgcm93T3AwMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMyAgCisgICAgICAgIFNBREQxNiAgICByb3dPcDEwLCBlMSwgZTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyICAKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMjAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIgIAorICAgICAgICBTU1VCMTYgICAgcm93T3AzMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAyLHRyUm93MjIKKyAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAyLHRyUm93MjIKKyAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMyLGNvbnN0WmVybworICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMyCisgICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTIKKyAgICAgICAgU0FERDE2ICAgIHJvd09wMDIsIGUwLCBlMworICAgICAgICBTQUREMTYgICAgcm93T3AxMiwgZTEsIGUyCisgICAgICAgIFNTVUIxNiAgICByb3dPcDIyLCBlMSwgZTIKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMzIsIGUwLCBlMworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQorICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgZDAgZDEgLSAtCisgICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKKyAgICAgICAgCisgICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQorICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnMKKyAgICAgICAgCisgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAwLHRyQ29sMjAKKyAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAwLHRyQ29sMjAKKyAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzAsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzAKKyAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMAorICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgZzAsIGczCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBnMSwgZzIKKyAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjAsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AzMCwgZzAsIGczCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAyLHRyQ29sMjIKKyAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAyLHRyQ29sMjIKKyAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzIsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzIKKyAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMgorICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgZzAsIGczCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEyLCBnMSwgZzIKKyAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjIsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AzMiwgZzAsIGczCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBjb25zdDE6IFNlcnZlcyBkdWFsIHB1cnBvc2UgCisgICAgICAgIDsvLyAoMSkgQWRkICMzMiB0byBib3RoIHRoZSBsb3dlciBhbmQgaGlnaGVyIDE2Yml0cyBvZiB0aGUgU0lNRCByZXN1bHQgCisgICAgICAgIDsvLyAoMikgQ29udmVydCB0aGUgbG93ZXIgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIG51bWJlciAoQWRkIDMyNzY4KQorICAgICAgICAKKyAgICAgICAgTERSICAgICBjb25zdDEsID0weDAwMjA4MDIwICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICBtYXNrLCA9MHhmZmZmMDNmZiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gbWFzayB0aGUgZG93biBzaGlmdGVkIDYgYml0cyAgCisgICAgICAgIAorICAgICAgICA7Ly8gY29uc3QyKCM1MTIpOiB1c2VkIHRvIGNvbnZlcnQgdGhlIGxvd2VyIDE2Yml0IG51bWJlciBiYWNrIHRvIHNpZ25lZCB2YWx1ZSAKKyAgICAgIAorICAgICAgICBNT1YgICAgIGNvbnN0MiwjMHgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29uc3QyID0gMl45CisgICAgICAgIAorICAgICAgICA7Ly8gRmlyc3QgUm93IAorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMDAsIGNvbE9wMDAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgY29sT3AwMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AwMCwgbWFzaywgY29sT3AwMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AwMiwgbWFzaywgY29sT3AwMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MDAsY29sT3AwMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQwMixjb2xPcDAyLGNvbnN0MiAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFNlY29uZCBSb3cKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBjb2xPcDEwLCBjb25zdDEKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGNvbE9wMTIsIGNvbnN0MQorICAgICAgICBBTkQgICAgIGNvbE9wMTAsIG1hc2ssIGNvbE9wMTAsIEFTUiAjNgorICAgICAgICBBTkQgICAgIGNvbE9wMTIsIG1hc2ssIGNvbE9wMTIsIEFTUiAjNgorICAgICAgICBTU1VCMTYgIG91dDEwLGNvbE9wMTAsY29uc3QyCisgICAgICAgIFNTVUIxNiAgb3V0MTIsY29sT3AxMixjb25zdDIgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRoaXJkIFJvdworICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMjAsIGNvbE9wMjAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AyMiwgY29sT3AyMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AyMCwgbWFzaywgY29sT3AyMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AyMiwgbWFzaywgY29sT3AyMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MjAsY29sT3AyMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQyMixjb2xPcDIyLGNvbnN0MgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBGb3VydGggUm93ICAgCisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgY29sT3AzMCwgY29sT3AzMCwgY29uc3QxCisgICAgICAgIFNBREQxNiAgICBjb2xPcDMyLCBjb2xPcDMyLCBjb25zdDEKKyAgICAgICAgQU5EICAgICBjb2xPcDMwLCBtYXNrLCBjb2xPcDMwLCBBU1IgIzYKKyAgICAgICAgQU5EICAgICBjb2xPcDMyLCBtYXNrLCBjb2xPcDMyLCBBU1IgIzYKKyAgICAgICAgU1NVQjE2ICBvdXQzMCxjb2xPcDMwLGNvbnN0MgorICAgICAgICBTU1VCMTYgIG91dDMyLGNvbE9wMzIsY29uc3QyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEc3Qse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgCisgICAgCisgICAgCisKKworCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgICAgICAgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKQEAgLTAsMCArMSw5MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgICAgICBSTiAwICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCitwRHN0ICAgICAgICAgICAgUk4gMSAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFZhcmlhYmxlcyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjICAgICAgICAgICAgUk4gMiAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZXMKK0ZsYWcgICAgICAgICAgICBSTiAzICAgIAorVmFsdWUgICAgICAgICAgIFJOIDQgICAgCitWYWx1ZTIgICAgICAgICAgUk4gNSAgICAKK3N0ck9mZnNldCAgICAgICBSTiA2ICAgIAorY3N0T2Zmc2V0ICAgICAgIFJOIDcgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCwgcjcKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTU9WICAgICAgVmFsdWUyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+CisgICAgICAgIAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjOF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0XSAgPSBwRHN0WzVdICA9IHBEc3RbNl0gID0gcERzdFs3XSAgPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzE2XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbOF0gID0gcERzdFs5XSAgPSBwRHN0WzEwXSA9IHBEc3RbMTFdID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMyNF0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyXSA9IHBEc3RbMTNdID0gcERzdFsxNF0gPSBwRHN0WzE1XSA9IDAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBsb29wIGJlbG93IHBhcnNlcyBhbmQgdW5wYWNrcyB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgQy1tb2RlbCBoYXMgCisgICAgICAgIDsvLyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIGxvZ2ljIGZvciBzaWduIGV4dGVuc2lvbi4gIEJ1dCBpbiB0aGUgdjYgdmVyc2lvbiwKKyAgICAgICAgOy8vIHRoYXQgY2FuIGJlIGVhc2lseSB0YWtlbiBjYXJlIGJ5IGxvYWRpbmcgdGhlIGRhdGEgZnJvbSA8cFNyYz4gc3RyZWFtIGFzIAorICAgICAgICA7Ly8gU0lHTkVEIGJ5dGUvaGFsZndvcmQuIFNvLCBiYXNlZCBvbiB0aGUgZmlyc3QgVFNUIGluc3RydWN0aW9uLCA4LWJpdHMgb3IgCisgICAgICAgIDsvLyAxNi1iaXRzIGFyZSByZWFkLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5leHQsIHRvIGNvbXB1dGUgdGhlIG9mZnNldCwgd2hlcmUgdGhlIHVucGFja2VkIHZhbHVlIG5lZWRzIHRvIGJlIHN0b3JlZCwKKyAgICAgICAgOy8vIHdlIG1vZGlmeSB0aGUgY29tcHV0YXRpb24gdG8gcGVyZm9ybSBbKEZsYWcgJiAxNSkgPCAxXSBhcyBbKEZsYWcgPCAxKSAmIDMxXQorICAgICAgICA7Ly8gVGhpcyByZXN1bHRzIGluIGEgc2F2aW5nIG9mIG9uZSBjeWNsZS4KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOworICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKworICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCisgICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KKyAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKKyAgICAgICAgCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlNmI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jaworICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KKyAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIzODYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgbHVtYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrCisgKigxNngxNikuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIGltYWdlIHdpZHRoCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyB2YWx1ZXMgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzIG9yIHBCUyBpcyBOVUxMLgorICogICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4CisgKiAgICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCisJY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTlmMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KKyAqCQkJCQkJCQlidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKKyAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCisgKQorCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmI0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAorICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAorICogb2YgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sKKyAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybworICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKKyAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCisgKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3MTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKQEAgLTAsMCArMSw0ODAgQEAKKzsvLworOy8vIChjKSBDb3B5cmlnaHQgMjAwNyBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworICAgICAgICAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAorICAgICAgICAKKyAgICBNX1ZBUklBTlRTIEFSTTExMzZKUywgQVJNMTEzNkpTX1UKKyAgICAgICAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcFNyY0RzdCAgICAgICBSTiAgMAorUVAgICAgICAgICAgICBSTiAgMQorCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcFFQZGl2ICAgICAgICAgIFJOICA0CitwUVBtb2QgICAgICAgICAgUk4gIDUKK3BWUm93ICAgICAgICAgICBSTiAgMgorUVBtb2QgICAgICAgICAgIFJOICA2CitzaGlmdCAgICAgICAgICAgUk4gIDMKK3Jvd0x1bWEwMSAgICAgICBSTiAgMQorcm93THVtYTIzICAgICAgIFJOICA0CisKK1NyY0RzdDAwICAgICAgICBSTiAgNQorU3JjRHN0MDIgICAgICAgIFJOICA2CitTcmNEc3QxMCAgICAgICAgUk4gIDcKK1NyY0RzdDEyICAgICAgICBSTiAgOAorU3JjRHN0MjAgICAgICAgIFJOICA5CitTcmNEc3QyMiAgICAgICAgUk4gIDEwCitTcmNEc3QzMCAgICAgICAgUk4gIDExCitTcmNEc3QzMiAgICAgICAgUk4gIDEyCisKK3RlbXAxICAgICAgICAgICBSTiAgMgordGVtcDIgICAgICAgICAgIFJOICAzCit0ZW1wMyAgICAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQorICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSSCAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswMHwwYV0KKyAgICAgICAgTERSSCAgICB0ZW1wMyxbcFZSb3csIzJdICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzICAgICA9IFswMHwwYl0gICAKKyAgICAgICAgTERSSCAgICByb3dMdW1hMjMsW3BWUm93LCM0XSAgICAgICAgICAgICAgICAgOy8vIHJvd0x1bWEyMyA9IFswMHwwY10gCisgICAgICAgIE9SUiAgICAgcm93THVtYTAxLHJvd0x1bWEwMSx0ZW1wMyxMU0wgIzE2ICAgIDsvLyByb3dMdW1hMDEgPSBbMGJ8MGFdICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcworICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCisgICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAorICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQorICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKKyAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCisgICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKKyAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCisgICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCisgICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCisgICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscworICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDEKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAyCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMyAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0ICAgCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgorICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCisgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTX1UKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcFNyY0RzdCAgICAgICBSTiAgMAorUVAgICAgICAgICAgICBSTiAgMQorCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcFFQZGl2ICAgICAgICAgIFJOICA0CitwUVBtb2QgICAgICAgICAgUk4gIDUKK3BWUm93ICAgICAgICAgICBSTiAgMgorUVBtb2QgICAgICAgICAgIFJOICA2CitzaGlmdCAgICAgICAgICAgUk4gIDMKK3Jvd0x1bWEwMSAgICAgICBSTiAgMQorcm93THVtYTIzICAgICAgIFJOICA0CisKK1NyY0RzdDAwICAgICAgICBSTiAgNQorU3JjRHN0MDIgICAgICAgIFJOICA2CitTcmNEc3QxMCAgICAgICAgUk4gIDcKK1NyY0RzdDEyICAgICAgICBSTiAgOAorU3JjRHN0MjAgICAgICAgIFJOICA5CitTcmNEc3QyMiAgICAgICAgUk4gIDEwCitTcmNEc3QzMCAgICAgICAgUk4gIDExCitTcmNEc3QzMiAgICAgICAgUk4gIDEyCisKK3RlbXAxICAgICAgICAgICBSTiAgMgordGVtcDIgICAgICAgICAgIFJOICAzCit0ZW1wMyAgICAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQorICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgIHJvd0x1bWEwMSxbcFZSb3csUVBtb2RdISAgICAgICAgICAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXQorICAgICAgICBMRFIgICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMGR8MGNdICAgIAorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgMTYgJ3NyYycgdmFsdWVzCisgICAgICAgIExETUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJ1NoaWZ0JyByYW5nZXMgYmV0d2VlbiBbMCw4XSAKKyAgICAgICAgOy8vIFNvIHdlIGNhbiBzaGlmdCB0aGUgcGFja2VkIHJvd0x1bWEgdmFsdWVzIFswYnwwYV0gd2l0aCBhIHNpbmdsZSBMU0wgb3BlcmF0aW9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIExTTCAgICByb3dMdW1hMDEscm93THVtYTAxLHNoaWZ0CisgICAgICAgIExTTCAgICByb3dMdW1hMjMscm93THVtYTIzLHNoaWZ0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoZSBpZGVhIGlzIHRvIHVucm9sbCB0aGUgTG9vcCBjb21wbGV0ZWx5CisgICAgICAgIDsvLyBBbGwgdGhlIDE2IHNyYyB2YWx1ZXMgYXJlIGxvYWRlZCBhdCBvbmNlIGludG8gOCByZWdpc3RlcnMgOiBTcmNEc3Q8eT48eD4gKGFib3ZlKQorICAgICAgICA7Ly8gMDw9IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldIDw9MiBmb3IgYW55ICdpPDE2JyAKKyAgICAgICAgOy8vIFNvIHRoZSBvbmx5IHZhbHVlcyBvZiBwVlJvd1tpXSB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGFyZSBmb3IgaT0wLDEsMgorICAgICAgICA7Ly8gVGhlc2UgMyB2YWx1ZXMgYXJlIGxvYWRlZCBpbnRvIHJvd0x1bWEwMSBhbmQgcm93THVtYTIzIChhYm92ZSkKKyAgICAgICAgOy8vIFdlIGZpcnN0IGNhbGN1bGF0ZSBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0IHdoaWNoIGZpdHMgaW50byAxNiBiaXRzIChhYm92ZSkKKyAgICAgICAgOy8vIFRoZW4gdGhlIHByb2R1Y3QgcFNyY0RzdFtpXSAqIChwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0gPDwgU2hpZnQpIGlzIGNhbGN1bGF0ZWQKKyAgICAgICAgOy8vIEhlcmUgd2UgaW50ZXJsZWF2ZSB0aGUgUEtIQlQgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyByb3dzICB0byBhdm9pZGUgcGlwZWxpbmUgc3RhbGxzCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIFdlIHRoZW4gcGFjayB0aGUgdHdvIDE2IGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byBhIHdvcmQgYW5kIHN0b3JlIGF0IG9uZSBnbworICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MDAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDAwLFNyY0RzdDAwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDAyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbM10gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMixTcmNEc3QwMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzJdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDAsU3JjRHN0MDAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgZmlyc3QgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QxMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMCxTcmNEc3QxMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDIsU3JjRHN0MDIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRUICB0ZW1wMixTcmNEc3QxMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzddICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMixTcmNEc3QxMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzZdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MTAsU3JjRHN0MTAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAzICAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QyMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzldICogKHBWUm93WzJdPDxTaGlmdCkgICAgICAgICAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMCxTcmNEc3QyMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzhdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEyLFNyY0RzdDEyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QyMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzExXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDIyLFNyY0RzdDIyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTBdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDIwLFNyY0RzdDIwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDQgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MzAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxM10gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMwLFNyY0RzdDMwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTJdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDMsU3JjRHN0MzIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNV0gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMyLFNyY0RzdDMyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMixTcmNEc3QyMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSByZW1haW5pbmcgcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgUEtIQlQgICBTcmNEc3QzMCxTcmNEc3QzMCx0ZW1wMSxMU0wgIzE2CisgICAgICAgIFBLSEJUICAgU3JjRHN0MzIsU3JjRHN0MzIsdGVtcDMsTFNMICMxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNUTUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTX1UgICAgICAgIAorCisKKworCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgUk4gIDAKK3BQcmVkICAgICAgIFJOICAxCitwREMgICAgICAgICBSTiAgMgorcERzdCAgICAgICAgUk4gIDMKKyAgIAorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERlbHRhICAgICAgUk4gIDQKK3BEZWx0YVRtcCAgIFJOICA2CitBQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK3BQcmVkVGVtcCAgIFJOICA3CitwRENUZW1wICAgICBSTiAgOAorcERzdFRlbXAgICAgUk4gIDkKK3BEZWx0YUFyZzEgIFJOICAxCitwRGVsdGFBcmcwICBSTiAgMAorUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitEQ3ZhbCAgICAgICBSTiAgMTAgIAorREN2YWxDb3B5ICAgUk4gIDExCitwcmVkc3RlcCAgICBSTiAgMQorZHN0U3RlcCAgICAgUk4gIDEwCit5Y291bnRlciAgICBSTiAgMAorUHJlZFZhbDEgICAgUk4gIDMKK1ByZWRWYWwyICAgIFJOICA1CitEZWx0YVZhbDEgICBSTiAgMgorRGVsdGFWYWwyICAgUk4gIDExCitQcmVkVmFsICAgICBSTiAgOAordG1wRGVsdGFWYWwgUk4gIDYKK3N1bTEgICAgICAgIFJOICAxMgorc3VtMiAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCisgICAgICAgICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0CisgICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKKyAgCisgICAgICAgIAorICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAorICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAorICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAorICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCisgICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAorICAgICAgICAKKyAgICAgICAgQ01QICAgICBBQywjMAorICAgICAgICBCRVEgICAgIERDY2FzZQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIERlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIERlcXVhbnRMdW1hQUM0eDQKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgcERDVGVtcCwjMAorICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzAscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMCBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBTVFJITkUgIERDdmFsLFtwRGVsdGFdCisgICAgICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCisgICAgICAgIAorCitEQ2Nhc2UKKyAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCisgICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAorICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2CisgICAgICAgIFBLSEJUICAgREN2YWwsREN2YWwsREN2YWwsTFNMICMxNiAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGluZyB0aGUgTG93ZXIgaGFsZndvcmQKKyAgICAgICAgTU9WICAgICBEQ3ZhbENvcHksIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5lZWRlZCBmb3IgU1RSRAorICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzhdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCisgICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMxNl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbOF0gID0gcERlbHRhWzldICA9IHBEZWx0YVsxMF0gPSBwRGVsdGFbMTFdID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzI0XSAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorT3V0RENjYXNlICAgICAgCisgICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCisgICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICBNT1YgICAgIHljb3VudGVyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvdW50ZXIgZm9yIHRoZSBQcmVkUGx1c0RlbHRhTG9vcAorICAgICAgICBMRFIgICAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCisKK1ByZWRQbHVzRGVsdGFMb29wCisgICAgICAgIAorICAgICAgIAorICAgICAgICBTVUJTICAgIHljb3VudGVyLHljb3VudGVyLCMxCisgICAgICAgIEFERCAgICAgcFByZWRUZW1wLHBQcmVkVGVtcCxwcmVkc3RlcCAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBQcmVkIHB0cgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBEZWx0YVZhbDEsdG1wRGVsdGFWYWwsRGVsdGFWYWwyLExTTCAjMTYgICAgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXSAgIAorICAgICAgICBQS0hUQiAgIERlbHRhVmFsMixEZWx0YVZhbDIsdG1wRGVsdGFWYWwsQVNSICMxNiAgICAgOy8vIERlbHRhVmFsMiA9IFtEIEJdCisgICAgICAgIAorICAgICAgICBVWFRCMTYgIFByZWRWYWwxLFByZWRWYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwxID0gWzBjMGFdCisgICAgICAgIFVYVEIxNiAgUHJlZFZhbDIsUHJlZFZhbCxST1IgIzggICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlZFZhbDIgPSBbMGQwYl0KKyAgICAgICAgCisgICAgICAgIExEUkdUICAgUHJlZFZhbCxbcFByZWRUZW1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKKyAgICAgICAgCisgICAgICAgIFFBREQxNiAgc3VtMixEZWx0YVZhbDIsUHJlZFZhbDIgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCisgICAgICAgIFFBREQxNiAgc3VtMSxEZWx0YVZhbDEsUHJlZFZhbDEKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgc3VtMiwjOCxzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYXJtQ2xpcCgwLDI1NSxzdW0yKQorICAgICAgICBVU0FUMTYgIHN1bTEsIzgsc3VtMQorICAgICAgICAKKyAgICAgICAgTERNR1RJQSAgIHBEZWx0YSEse3RtcERlbHRhVmFsLERlbHRhVmFsMn0gICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICAgIAorICAgICAgICBPUlIgICAgIHN1bTEsc3VtMSxzdW0yLExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSBbZGNiYV0KKyAgICAgICAgU1RSICAgICBzdW0xLFtwRHN0VGVtcF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRlbXAscERzdFRlbXAsZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgcHRyCisgICAgICAgIEJHVCAgICAgUHJlZFBsdXNEZWx0YUxvb3AgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgCisgICAgCisgICAgCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKyAgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2MGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDMzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNgorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMTAKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorCithcDBxMCAgICAgICBSTiA0ICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorcFEwICAgICAgICAgUk4gMAorU3RlcCAgICAgICAgUk4gMQorICAgICAgICAgICAgCis7Ly8gT3V0cHV0CisgICAgICAgICAgICAKK1BfMCAgICAgICAgIFJOIDYKK1FfMCAgICAgICAgIFJOIDcgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDICAgICAgICAgIFJOIDEyCit0QzAgICAgICAgICBSTiA1Cit0QzEgICAgICAgICBSTiAxMgorcG9zICAgICAgICAgUk4gNQorbmVnICAgICAgICAgUk4gOQorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKKworYSAgICAgICAgICAgUk4gMTAKK3QxICAgICAgICAgIFJOIDEwCit0MiAgICAgICAgICBSTiAxMgordDMgICAgICAgICAgUk4gMTQKK3Q0ICAgICAgICAgIFJOIDYKK3Q1ICAgICAgICAgIFJOIDUKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKKyAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4CisgICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKKyAgICAgICAgTV9BTExPQzQgcHBCUyw0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCisgICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBMRFIgICAgIGEsPU1BU0tfMQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgYQorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgYQorICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCBhCisKKyAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCitMb29wWQorTG9vcFgKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzIKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSxzcmNkc3RTdGVwCisKKyAgICAgICAgQ01QICAgICBiUywgIzAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSxzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSxzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8xLCBbcFEwXQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICAKKyAgICAgICAgOy8vIHBfMCA9IFtyM3AwIHIycDAgcjFwMCByMHAwXQorICAgICAgICA7Ly8gcF8xID0gW3IzcDEgcjJwMSByMXAxIHIwcDFdCisgICAgICAgIDsvLyBxXzAgPSBbcjNxMCByMnEwIHIxcTAgcjBxMF0KKyAgICAgICAgOy8vIHFfMSA9IFtyM3ExIHIycTEgcjFxMSByMHExXQorCis7Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQorICAgICAgICBUU1QgICAgIGJTLCAjMHhmZjAwCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgorICAgICAgICBUU1QgICAgIGJTLCAjMHhmZgorICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKKyAgICAgICAgVFNUICAgICBiUywgIzQKKworICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgQkVRICAgICBiU0xUNCAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKworICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKKyAgICAgICAgVUhBREQ4ICB0MSwgcF8wLCBxXzEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIE1WTiAgICAgdDIsIHBfMQorICAgICAgICBVSFNVQjggIHQxLCB0MSwgdDIKKyAgICAgICAgVVNVQjggICB0MiwgZmlsdCwgbTAxCisgICAgICAgIEVPUiAgICAgdDEsIHQxLCBtMDEsIExTTCAjNworCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMscFRocmVzaG9sZHMsICMyCisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgCisgICAgICAgIFVIQUREOCAgdDIsIHFfMCwgcF8xCisgICAgICAgIE1WTiAgICAgdDMsIHFfMQorICAgICAgICBVSFNVQjggIHQyLCB0MiwgdDMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFNFTCAgICAgUF8wLCB0MSwgcF8wCisgICAgICAgIEVPUiAgICAgdDIsIHQyLCBtMDEsIExTTCAjNworICAgICAgICBTRUwgICAgIFFfMCwgdDIsIHFfMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCitOb0ZpbHRlckJTMAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKyAgICAgICAgCisgICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdworICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKKyAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKKyAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKKworICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCisKKyAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwjMQorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKyAgICAgICAgTERSQiAgICB0QzEsIFtwVGhyZXNob2xkc10sIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCisgICAgICAgIE9SUiAgICAgdEMsIHRDMCwgdEMxLCBMU0wgIzE2CisgICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKKyAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQorICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKworICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZworICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKKyAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCisgICAgCitTdG9yZVJlc3VsdEFuZEV4aXQKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKworICAgICAgICBNX1NUUiAgIFBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1RSICAgICBRXzAsIFtwUTBdLCAjNAorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorCitFeGl0TG9vcFkKKyAgICAgICAgQUREICAgICBwQlMsIHBCUywgIzQKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0VORAorCisgICAgRU5ESUYgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM4MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDQzNyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4MDAwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDUwMDAwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDYKK3BCUyAgICAgICAgIFJOIDkKK3BRMCAgICAgICAgIFJOIDAKK2JTICAgICAgICAgIFJOIDIKK2JTVGVtcCAgICAgIFJOIDEwCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitxXzAgICAgICAgICBSTiA4ICAKK3FfMSAgICAgICAgIFJOIDkgIAorCis7Ly8gVW5wYWNraW5nCittYXNrICAgICAgICBSTiAxMSAKKworcm93MCAgICAgICAgUk4gMgorcm93MSAgICAgICAgUk4gNAorcm93MiAgICAgICAgUk4gNQorcm93MyAgICAgICAgUk4gMworCityb3c0ICAgICAgICBSTiA4Cityb3c1ICAgICAgICBSTiA5Cityb3c2ICAgICAgICBSTiAxMAorcm93NyAgICAgICAgUk4gMTIKKwordHVucGswICAgICAgUk4gMgordHVucGsyICAgICAgUk4gMTAKK3R1bnBrMyAgICAgIFJOIDEyCisKK3R1bnBrNCAgICAgIFJOIDQKK3R1bnBrNSAgICAgIFJOIDUKK3R1bnBrNiAgICAgIFJOIDE0Cit0dW5wazcgICAgICBSTiAyIAorCis7Ly8gRmlsdGVyaW5nCisKK2RwMHEwICAgICAgIFJOIDEyCitkcDFwMCAgICAgICBSTiAxMgorZHExcTAgICAgICAgUk4gMTIKKworYXAwcTAgICAgICAgUk4gNCAgCitmaWx0ICAgICAgICBSTiAyCisgICAgICAgIAorbTAwICAgICAgICAgUk4gMTQKK20wMSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKK3BRMCAgICAgICAgIFJOIDAKK1N0ZXAgICAgICAgIFJOIDEKKyAgICAgICAgICAgIAorOy8vIE91dHB1dAorICAgICAgICAgICAgCitQXzAgICAgICAgICBSTiA2CitRXzAgICAgICAgICBSTiA3IAorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCit0QyAgICAgICAgICBSTiAxMgordEMwICAgICAgICAgUk4gNQordEMxICAgICAgICAgUk4gMTIKK3BvcyAgICAgICAgIFJOIDUKK25lZyAgICAgICAgIFJOIDkKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworCis7Ly8gTWlzY2VsbGFub3VzCitYWSAgICAgICAgICBSTiA4CisKK2EgICAgICAgICAgIFJOIDEwCit0MSAgICAgICAgICBSTiAxMAordDIgICAgICAgICAgUk4gMTIKK3QzICAgICAgICAgIFJOIDE0Cit0NCAgICAgICAgICBSTiA2Cit0NSAgICAgICAgICBSTiA1CisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisgICAgICAgIAorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCisgICAgICAgIExEUiAgICAgYSw9TUFTS18xCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KKworICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKKworICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgCisgICAgICAgIAorTG9vcFkKK0xvb3BYCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcTAtcTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzgKKyAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCisKKyAgICAgICAgTV9MRFJIICByb3c0LCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworICAgICAgICBNX0xEUkggIHJvdzUsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgTERSSCAgICByb3c2LCBbcFEwXQorICAgICAgICBMRFJIICAgIHJvdzcsIFtwUTAsIHNyY2RzdFN0ZXBdCisKKyAgICAgICAgOy8vIHJvdzQgPSBbMCAwIHIwcTAgcjBxMV0KKyAgICAgICAgOy8vIHJvdzUgPSBbMCAwIHIxcTAgcjFxMV0KKyAgICAgICAgOy8vIHJvdzYgPSBbMCAwIHIycTAgcjJxMV0KKyAgICAgICAgOy8vIHJvdzcgPSBbMCAwIHIzcTAgcjNxMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAorICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazUsIHR1bnBrNSwgcm93NQorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgorICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazcsIHR1bnBrNywgcm93NworCisgICAgICAgIDsvLyB0dW5wazQgPSBbMCAwIHIwcTAgcjFxMF0KKyAgICAgICAgOy8vIHR1bnBrNSA9IFswIDAgcjBxMSByMXExXQorICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyB0dW5wazcgPSBbMCAwIHIycTEgcjNxMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzIKKworICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgorICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgorCisgICAgICAgIDsvLyBxXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIHFfMSA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQorCisKKzsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHAwLXAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBNX0xEUkggIHJvdzAsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAorICAgICAgICBNX0xEUkggIHJvdzEsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAorICAgICAgICBMRFJIICAgIHJvdzIsIFtwUTBdCisgICAgICAgIExEUkggICAgcm93MywgW3BRMCwgc3JjZHN0U3RlcF0KKyAgICAgICAgCisgICAgICAgIDsvLyByb3cwID0gWzAgMCByMHAwIHIwcDFdCisgICAgICAgIDsvLyByb3cxID0gWzAgMCByMXAwIHIxcDFdCisgICAgICAgIDsvLyByb3cyID0gWzAgMCByMnAwIHIycDFdCisgICAgICAgIDsvLyByb3czID0gWzAgMCByM3AwIHIzcDFdCisKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzAKKyAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4CisgICAgICAgIFVYVEFCICAgdHVucGsyLCB0dW5wazIsIHJvdzEsIFJPUiM4CisgICAgICAgIFVYVEFCICAgdHVucGs2LCB0dW5wazYsIHJvdzEKKworICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MgorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazAsIHR1bnBrMCwgcm93MywgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazMsIHR1bnBrMywgcm93MworCisgICAgICAgIDsvLyB0dW5wazIgPSBbMCAwIHIwcDAgcjFwMF0KKyAgICAgICAgOy8vIHR1bnBrNiA9IFswIDAgcjBwMSByMXAxXQorICAgICAgICA7Ly8gdHVucGswID0gWzAgMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyB0dW5wazMgPSBbMCAwIHIycDEgcjNwMV0KKworICAgICAgICBQS0hCVCAgIHBfMCwgdHVucGswLCB0dW5wazIsIExTTCMxNgorICAgICAgICBNX0xEUiAgIGJTVGVtcCwgcHBCUworICAgICAgICBQS0hCVCAgIHBfMSwgdHVucGszLCB0dW5wazYsIExTTCMxNgorCisgICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorCis7Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMQorICAgICAgICBMRFJIICAgIGJTVGVtcCwgW2JTVGVtcCAsIy04XQorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYwMAorICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKKyAgICAgICAgVFNUICAgICBiU1RlbXAsICMweGZmCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzQKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAorICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAorICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIDsvLyBDb21wdXRlIFAwYgorICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgTVZOICAgICB0MiwgcF8xCisgICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKKyAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3CisKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEwYiAKKyAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKKyAgICAgICAgTVZOICAgICB0MywgcV8xCisgICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKKyAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCisKKyAgICAgICAgQiAgICAgICBTdG9yZVJlc3VsdEFuZEV4aXQKKworOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCis7Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KKworTm9GaWx0ZXJGaWx0MAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjMgorTm9GaWx0ZXJCUzAKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICAKKworICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKKyAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0CisgICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3CisgICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3CisKKyAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MworCisgICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwVGhyZXNob2xkc10sICMxCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwgIzMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCisgICAgICAgIE9SUiAgICAgdEMsIHRDMSwgdEMwLCBMU0wgIzE2CisgICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKKyAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQorICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKworICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZworICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKKyAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCisgICAgCitTdG9yZVJlc3VsdEFuZEV4aXQKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICAgICBwUTAsIHBRMCwgIzEgICAgICAKKyAKKyAgICAgICAgTU9WICAgICB0MSwgUV8wLCBMU1IgIzI0CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXQorICAgICAgICBNT1YgICAgIHQxLCBQXzAsIExTUiAjMjQKKyAgICAgICAgTV9TVFJCICB0MSwgW3BRMF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMxNgorICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAorCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICM4CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTBdCisgICAgICAgIFNUUkIgICAgUF8wLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjOAorICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0hCisgICAgICAgIFNUUkIgICAgUV8wLCBbcFEwLCBzcmNkc3RTdGVwXQorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorCitFeGl0TG9vcFkKKworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNCAKKyAgICAgICAgU1VCICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM2CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjg0MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwzMzEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMKKworCitNQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAorTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKK01BU0tfMiAgICAgIEVRVSAweGZmMDBmZjAwCitMT09QX0NPVU5UICBFUVUgMHgxMTExMDAwMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhQXJnICAgUk4gMgorcEJldGFBcmcgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiAxNAorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMgorCithbHBoYSAgICAgICBSTiA2CithbHBoYTAgICAgICBSTiA2CithbHBoYTEgICAgICBSTiA4CisKK2JldGEgICAgICAgIFJOIDcKK2JldGEwICAgICAgIFJOIDcKK2JldGExICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgICAgICBSTiAzICAKK3BfMSAgICAgICAgIFJOIDUgIAorcF8yICAgICAgICAgUk4gNCAgCitwXzMgICAgICAgICBSTiAyICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCitxXzIgICAgICAgICBSTiAxMCAKK3FfMyAgICAgICAgIFJOIDEyIAorCis7Ly8gRmlsdGVyaW5nCisKK2RwMHEwICAgICAgIFJOIDEyCitkcDFwMCAgICAgICBSTiAxMgorZHExcTAgICAgICAgUk4gMTIKK2RwMnAwICAgICAgIFJOIDEyCitkcTJxMCAgICAgICBSTiAxMgorICAgICAgICAgICAgCithcDBxMCAgICAgICBSTiAxICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorYXBmbGcgICAgICAgUk4gMCAKK2FxZmxnICAgICAgIFJOIDYKK2FwcWZsZyAgICAgIFJOIDAKKyAgICAgICAgICAgIAorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCit0QzAgICAgICAgICBSTiA3CitwdEMwICAgICAgICBSTiAxCisKK3BRMGEgICAgICAgIFJOIDAgICAgCitTdGVwYSAgICAgICBSTiAxICAgIAorbWFza2EgICAgICAgUk4gMTQKKyAgICAgICAgICAgIAorUDBhICAgICAgICAgUk4gMQorUDFhICAgICAgICAgUk4gOAorUTBhICAgICAgICAgUk4gNworUTFhICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworcFEwYiAgICAgICAgUk4gMAorU3RlcGIgICAgICAgUk4gMQorbWFza2IgICAgICAgUk4gMTQKKyAgICAgICAgICAgIAorUDBiICAgICAgICAgUk4gNgorUDFiICAgICAgICAgUk4gNworUDJiICAgICAgICAgUk4gMQorUDNiICAgICAgICAgUk4gMworICAgICAgICAgICAgCitRMGIgICAgICAgICBSTiA5IAorUTFiICAgICAgICAgUk4gMCAgIAorUTJiICAgICAgICAgUk4gMiAKK1EzYiAgICAgICAgIFJOIDMgCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKK3QwICAgICAgICAgIFJOIDMgCit0MSAgICAgICAgICBSTiAxMgordDIgICAgICAgICAgUk4gMTQKK3Q3ICAgICAgICAgIFJOIDcKK3Q0ICAgICAgICAgIFJOIDQKK3Q1ICAgICAgICAgIFJOIDEgIAordDggICAgICAgICAgUk4gNiAgCithICAgICAgICAgICBSTiAwCisKKyAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DNCBwUV8zLDQKKyAgICAgICAgTV9BTExPQzQgcFBfMyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0CisgICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorCisgICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQorCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKworICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0CisKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKK0xvb3BZCitMb29wWAorOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fU1RSICAgcFEwLCBwcFEwU3RlcAorICAgICAgICBNX0xEUiAgIHBfMywgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBwXzIsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCisgICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjMQorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgIHBfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICBiUywgIzAKKyAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHFfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzIsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8zLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBCRVEgICAgIE5vRmlsdGVyQlMwCisgICAgICAgIENNUCAgICAgYlMsICM0CisgICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKKworICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKKyAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCisgICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCisgICAgICAgIE1PViAgICAgdDcsIzAKKworICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKKyAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTU9WICAgICBwXzIsIFExYgorICAgICAgICBNT1YgICAgIHBfMSwgUDJiCisgICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICMxCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIHBfMSwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgTV9TVFIgICBQMWIsIFtwUTBiLCBTdGVwYl0hCisgICAgICAgIE1fU1RSICAgUDBiLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBNX1NUUiAgIFEwYiwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgU1RSICAgICBwXzIsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICBRMmIsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQorCisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIsIExTTCAjMgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckJTMAorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzMKK05vRmlsdGVyRmlsdDAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKworYlNMVDQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzEKKyAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTU9WICAgICBwXzIsIFAwYQorICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAorICAgICAgICBNX1NUUiAgIFAxYSwgW3BRMGEsIFN0ZXBhLCBMU0wgIzFdIQorICAgICAgICBNX1NUUiAgIHBfMiwgW3BRMGEsIFN0ZXBhXSEKKyAgICAgICAgTV9TVFIgICBRMGEsIFtwUTBhLCBTdGVwYV0hCisgICAgICAgIFNUUiAgICAgUTFhLCBbcFEwYSwgU3RlcGFdCisgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBhLCBTdGVwYSwgTFNMICMyCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorRXhpdExvb3BZCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0VORAorCisgICAgRU5ESUYgICAgICAgIAorICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZGRjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNTUwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDE0CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAyCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitwXzIgICAgICAgICBSTiA0ICAKK3BfMyAgICAgICAgIFJOIDIgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKK3FfMiAgICAgICAgIFJOIDEwIAorcV8zICAgICAgICAgUk4gMTIgCisKKzsvLyBVbnBhY2tpbmcKK21hc2sgICAgICAgIFJOIDExIAorCityb3cwICAgICAgICBSTiAyCityb3cxICAgICAgICBSTiA0Cityb3cyICAgICAgICBSTiA1Cityb3czICAgICAgICBSTiAzCisKK3JvdzQgICAgICAgIFJOIDgKK3JvdzUgICAgICAgIFJOIDkKK3JvdzYgICAgICAgIFJOIDEwCityb3c3ICAgICAgICBSTiAxMgorcm93OCAgICAgICAgUk4gMTQKK3JvdzkgICAgICAgIFJOIDcKKyAgICAgICAgICAgIAordHVucGswICAgICAgUk4gOAordHVucGsxICAgICAgUk4gOQordHVucGsyICAgICAgUk4gMTAKK3R1bnBrMyAgICAgIFJOIDEyCit0dW5wazQgICAgICBSTiAwCisKK3R1bnBrNSAgICAgIFJOIDEKK3R1bnBrNiAgICAgIFJOIDE0Cit0dW5wazcgICAgICBSTiAyIAordHVucGs4ICAgICAgUk4gNSAKK3R1bnBrOSAgICAgIFJOIDYgCisgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorZHAycDAgICAgICAgUk4gMTIKK2RxMnEwICAgICAgIFJOIDEyCisgICAgICAgICAgICAKK2FwMHEwICAgICAgIFJOIDEgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCithcGZsZyAgICAgICBSTiAwIAorYXFmbGcgICAgICAgUk4gNgorYXBxZmxnICAgICAgUk4gMAorICAgICAgICAgICAgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDMCAgICAgICAgIFJOIDcKK3B0QzAgICAgICAgIFJOIDEKKworcFEwYSAgICAgICAgUk4gMCAgICAKK1N0ZXBhICAgICAgIFJOIDEgICAgCittYXNrYSAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGEgICAgICAgICBSTiAxCitQMWEgICAgICAgICBSTiA4CitRMGEgICAgICAgICBSTiA3CitRMWEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCitwUTBiICAgICAgICBSTiAwCitTdGVwYiAgICAgICBSTiAxCittYXNrYiAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGIgICAgICAgICBSTiA2CitQMWIgICAgICAgICBSTiA3CitQMmIgICAgICAgICBSTiAxCitQM2IgICAgICAgICBSTiAzCisgICAgICAgICAgICAKK1EwYiAgICAgICAgIFJOIDkgCitRMWIgICAgICAgICBSTiAwICAgCitRMmIgICAgICAgICBSTiAyIAorUTNiICAgICAgICAgUk4gMyAKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAordDAgICAgICAgICAgUk4gMyAKK3QxICAgICAgICAgIFJOIDEyCit0MiAgICAgICAgICBSTiAxNAordDcgICAgICAgICAgUk4gNwordDQgICAgICAgICAgUk4gNAordDUgICAgICAgICAgUk4gMSAgCit0OCAgICAgICAgICBSTiA2ICAKK2EgICAgICAgICAgIFJOIDAKKworICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKKyAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKKyAgICAgICAgTV9BTExPQzQgcFFfMyw0CisgICAgICAgIE1fQUxMT0M0IHBQXzMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgTV9BTExPQzggcHBRMFN0ZXAsNAorICAgICAgICBNX0FMTE9DNCBwU3RlcCw0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAorICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQorCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKworICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0CisKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICAKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzQKK0xvb3BZCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIE1fTERSICAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgcm93MiwgW3BRMF0KKyAgICAgICAgTERSICAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyByb3cwID0gW3IwcDAgcjBwMSByMHAyIHIwcDNdCisgICAgICAgIDsvLyByb3cxID0gW3IxcDAgcjFwMSByMXAyIHIxcDNdCisgICAgICAgIDsvLyByb3cyID0gW3IycDAgcjJwMSByMnAyIHIycDNdCisgICAgICAgIDsvLyByb3czID0gW3IzcDAgcjNwMSByM3AyIHIzcDNdCisKKyAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2ssIHJvdzAKKyAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIHJvdzEsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs2LCB0dW5wazYsIHJvdzEKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzIKKyAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2ssIHJvdzIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIHJvdzMsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIHJvdzMKKworICAgICAgICA7Ly8gdHVucGswID0gW3IwcDAgcjFwMCByMHAyIHIxcDJdCisgICAgICAgIDsvLyB0dW5wazYgPSBbcjBwMSByMXAxIHIwcDMgcjFwM10KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMnAwIHIzcDAgcjJwMiByM3AyXQorICAgICAgICA7Ly8gdHVucGszID0gW3IycDEgcjNwMSByMnAzIHIzcDNdCisKKyAgICAgICAgUEtIVEIgICBwXzAsIHR1bnBrMCwgdHVucGsyLCBBU1IjMTYKKyAgICAgICAgUEtIVEIgICBwXzEsIHR1bnBrNiwgdHVucGszLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICBwXzIsIHR1bnBrMiwgdHVucGswLCBMU0wjMTYKKyAgICAgICAgUEtIQlQgICBwXzMsIHR1bnBrMywgdHVucGs2LCBMU0wjMTYKKworCisgICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorICAgICAgICA7Ly8gcF8yID0gW3IwcDIgcjFwMiByMnAxIHIzcDJdCisgICAgICAgIDsvLyBwXzMgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KKworICAgICAgICBNX1NUUiAgIHBfMywgcFBfMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMb29wWAorICAgICAgICBMRFJCICAgIGJTLCBbcEJTXSwgIzQKKyAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCisgICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworCisgICAgICAgIExEUiAgICAgcm93NCwgW3BRMCwgIzRdIQorICAgICAgICBCRVEuVyAgIE5vRmlsdGVyQlMwCisgICAgICAgIE1fTERSICAgcm93NSwgW3BRMCwgc3JjZHN0U3RlcF0hCisgICAgICAgIE1fTERSICAgcm93NiwgW3BRMCwgc3JjZHN0U3RlcF0hCisgICAgICAgIE1fTERSICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KKworICAgICAgICA7Ly8gcm93NCA9IFtyMHEzIHIwcTIgcjBxMSByMHEwXQorICAgICAgICA7Ly8gcm93NSA9IFtyMXEzIHIxcTIgcjFxMSByMXEwXQorICAgICAgICA7Ly8gcm93NiA9IFtyMnEzIHIycTIgcjJxMSByMnEwXQorICAgICAgICA7Ly8gcm93NyA9IFtyM3EzIHIzcTIgcjNxMSByM3EwXQorICAgIAorICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAorICAgICAgICBDTVAgICAgIGJTLCAjNAorICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazUsIHR1bnBrNSwgcm93NQorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgorICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazcsIHR1bnBrNywgcm93NworCisgICAgICAgIDsvLyB0dW5wazQgPSBbcjBxMCByMXEwIHIwcTIgcjFxMl0KKyAgICAgICAgOy8vIHR1bnBrNSA9IFtyMHExIHIxcTEgcjBxMyByMXEzXQorICAgICAgICA7Ly8gdHVucGs2ID0gW3IycTAgcjNxMCByMnEyIHIzcTJdCisgICAgICAgIDsvLyB0dW5wazcgPSBbcjJxMSByM3ExIHIycTMgcjNxM10KKworICAgICAgICBQS0hUQiAgIHFfMywgdHVucGs0LCB0dW5wazYsIEFTUiMxNgorICAgICAgICBQS0hUQiAgIHFfMiwgdHVucGs1LCB0dW5wazcsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgorICAgICAgICBNX1NUUiAgIHFfMywgcFFfMworICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgorCisKKyAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisgICAgICAgIDsvLyBxXzIgPSBbcjBxMiByMXEyIHIycTEgcjNxMl0KKyAgICAgICAgOy8vIHFfMyA9IFtyMHEzIHIxcTMgcjJxMyByM3EzXQorCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKKworICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKKyAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCisgICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCisgICAgICAgIE1PViAgICAgdDcsIzAKKyAgICAgICAgCisKKyAgICAgICAgQkxUICAgICBiU0xUNCAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNFTCAgICAgdDEsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKyAgICAgICAgT1JSICAgICBhcHFmbGcsIGFwZmxnLCB0MSwgTFNMICMxCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBMRFIgICAgIG1hc2tiLD1NQVNLXzIKKworICAgICAgICA7Ly8gUDBiID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBQMWIgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KKyAgICAgICAgOy8vIFAyYiA9IFtyMHAyIHIxcDIgcjJwMiByM3AyXQorICAgICAgICA7Ly8gUDNiID0gW3IwcDMgcjFwMyByMnAzIHIzcDNdCisKKyAgICAgICAgTV9MRFIgICBQM2IsIHBQXzMgICAKKyAgICAgICAgTV9TVFIgICBRMGIsIHBQXzMgICAKKworICAgICAgICA7Ly8tLS0tLS1QYWNrIHAwLXAzLS0tLS0tCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgUDBiCisgICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgUDBiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBQMWIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFAxYgorCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUDJiCisgICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUDJiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBQM2IsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFAzYgorCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQorICAgICAgICA7Ly8gdHVucGszID0gW3IwcDIgcjBwMyByMnAyIHIycDNdCisgICAgICAgIDsvLyB0dW5wazggPSBbcjFwMiByMXAzIHIzcDIgcjNwM10KKworICAgICAgICBNT1YgICAgIHBfMiwgUTFiCisgICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCisKKyAgICAgICAgUEtIVEIgICByb3c5LCB0dW5wazAsIHR1bnBrMywgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcm93NywgdHVucGszLCB0dW5wazAsIExTTCMxNgorICAgICAgICBQS0hUQiAgIHJvdzMsIHR1bnBrMiwgdHVucGs4LCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazgsIHR1bnBrMiwgTFNMIzE2CisKKyAgICAgICAgOy8vIHJvdzkgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KKyAgICAgICAgOy8vIHJvdzMgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KKyAgICAgICAgOy8vIHJvdzcgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHJvdzYgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KKworICAgICAgICBNX1NUUiAgIHJvdzksIFtwUTBiXSwgU3RlcGIKKyAgICAgICAgU1RSICAgICByb3c3LCBbcFEwYiwgU3RlcGJdCisgICAgICAgIFNUUiAgICAgcm93NiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCisgICAgICAgIFNUUiAgICAgcm93MywgW3BRMGJdLCAjNAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBRM2IsIHBRXzMKKworICAgICAgICA7Ly8gUTBiID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBRMWIgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKyAgICAgICAgOy8vIFEyYiA9IFtyMHEyIHIxcTIgcjJxMiByM3EyXQorICAgICAgICA7Ly8gUTNiID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCisKKyAgICAgICAgOy8vLS0tLS0tUGFjayBxMC1xMy0tLS0tLQorICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFza2IsIHBfMgorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2IsIHBfMiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgUTBiLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBRMGIKKworICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2IsIFEzYgorICAgICAgICBBTkQgICAgIHR1bnBrOCwgbWFza2IsIFEzYiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgUTJiLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrOCwgdHVucGs4LCBRMmIKKworICAgICAgICA7Ly8gdHVucGswID0gW3IwcTEgcjBxMCByMnExIHIycTBdCisgICAgICAgIDsvLyB0dW5wazIgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KKyAgICAgICAgOy8vIHR1bnBrMyA9IFtyMHEzIHIwcTIgcjJxMyByMnEyXQorICAgICAgICA7Ly8gdHVucGs4ID0gW3IxcTMgcjFxMiByM3EzIHIzcTJdCisKKyAgICAgICAgUEtIVEIgICByb3c4LCB0dW5wazMsIHR1bnBrMCwgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcm93NywgdHVucGswLCB0dW5wazMsIExTTCMxNgorICAgICAgICBQS0hUQiAgIHJvdzQsIHR1bnBrOCwgdHVucGsyLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazIsIHR1bnBrOCwgTFNMIzE2CisKKyAgICAgICAgOy8vIHJvdzggPSBbcjBxMCByMHExIHIwcTIgcjBxM10KKyAgICAgICAgOy8vIHJvdzQgPSBbcjFxMCByMXExIHIxcTIgcjFxM10KKyAgICAgICAgOy8vIHJvdzcgPSBbcjJxMCByMnExIHIycTIgcjJxM10KKyAgICAgICAgOy8vIHJvdzYgPSBbcjNxMCByM3ExIHIzcTIgcjNxM10KKworICAgICAgICBTVFIgICAgIHJvdzQsIFtwUTBiXQorICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIKKyAgICAgICAgTU9WICAgICBwXzEsIFEyYgorCisgICAgICAgIFNUUiAgICAgcm93OCwgW3BRMF0KKworICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CitOb0ZpbHRlckJTMAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BZCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisgICAgICAgIAorYlNMVDQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzQKKyAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vLS0tLS0tLS1QYWNrIHAxLHAwLHExLHEwLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly9Mb2FkIGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAgICAgICAgTERSICAgICBtYXNrYSw9TUFTS18yCisgICAgICAgIE1fU1RSICAgUTBhLCBwUF8zCisgICAgICAgIE1PViAgICAgcF8xLCBxXzIKKworICAgICAgICA7Ly8gUDFhID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisgICAgICAgIDsvLyBQMGEgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFEwYSA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gUTFhID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisKKyAgICAgICAgQU5EICAgICB0dW5wazEsIG1hc2thLCBQMGEKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2thLCBQMGEsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGsxLCB0dW5wazEsIFAxYSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFhCisKKyAgICAgICAgTV9MRFJEICBwUTBhLCBTdGVwYSwgcHBRMFN0ZXAKKworICAgICAgICBBTkQgICAgIHR1bnBrOSwgbWFza2EsIFExYQorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2EsIFExYSwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazksIHR1bnBrOSwgUTBhLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMGEKKworICAgICAgICA7Ly8gdHVucGsxID0gW3IwcDAgcjBwMSByMnAwIHIycDFdCisgICAgICAgIDsvLyB0dW5wazIgPSBbcjFwMCByMXAxIHIzcDAgcjNwMV0KKyAgICAgICAgOy8vIHR1bnBrOSA9IFtyMHExIHIwcTAgcjJxMSByMnEwXQorICAgICAgICA7Ly8gdHVucGszID0gW3IxcTEgcjFxMCByM3ExIHIzcTBdCisKKyAgICAgICAgTU9WICAgICB0NCwgdHVucGsxLCBMU1IgIzE2CisgICAgICAgIE1PViAgICAgdDAsIHR1bnBrOSwgTFNSICMxNgorCisgICAgICAgIFNUUkggICAgdDQsW3BRMGEsICMyXSEgICAgICAgICAgOy8vU3RvcmVzIFtyMHAwIHIwcDFdCisgICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMHEwIHIwcTFdCisKKyAgICAgICAgTU9WICAgICB0NCwgdHVucGsyLCBMU1IgIzE2CisgICAgICAgIE1PViAgICAgdDAsIHR1bnBrMywgTFNSICMxNgorCisgICAgICAgIE1fU1RSSCAgdDQsW3BRMGEsIFN0ZXBhXSEgICAgICAgOy8vU3RvcmVzIFtyMXAwIHIxcDFdCisgICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMXEwIHIxcTFdCisgICAgICAgIAorICAgICAgICBNX1NUUkggIHR1bnBrMSxbcFEwYSwgU3RlcGFdISAgIDsvL1N0b3JlcyBbcjJwMCByMnAxXQorICAgICAgICBTVFJIICAgIHR1bnBrMixbcFEwYSwgU3RlcGFdICAgIDsvL1N0b3JlcyBbcjNwMCByM3AxXQorICAgICAgICBTVFJIICAgIHR1bnBrOSxbcFEwYSwgIzJdISAgICAgICAgOy8vU3RvcmVzIFtyMnEwIHIycTFdCisgICAgICAgIFNUUkggICAgdHVucGszLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3EwIHIzcTFdCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzEKKworICAgICAgICA7Ly8gTG9hZCBjb3VudGVyCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKworICAgICAgICA7Ly8gUmVsb2FkIFBpeGVscworICAgICAgICBNX0xEUiAgIHBfMCwgcFFfMworICAgICAgICBNT1YgICAgIHBfMiwgUTFhCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKK0V4aXRMb29wWQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMTYKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNQorICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE1CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRU5ESUYgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODM1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCisgKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQorICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCisgKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKyAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6CisgKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCisgKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCisgKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyYywKKyAgICAgT01YX1MzMiBzcmNTdGVwLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBkeCwKKyAgICAgT01YX1MzMiBkeSwKKyAgICAgT01YU2l6ZSByb2kKKyApCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAorICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjExYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpAQCAtMCwwICsxLDQyNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorOy8vCis7Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgorOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KKzsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCis7Ly8gUGFyYW1ldGVyczoKKzsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCis7Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCis7Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCis7Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCis7Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vCis7Ly8gUmV0dXJuIFZhbHVlOgorOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKzsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCis7Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCis7Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KKzsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgorOy8vCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgRU5ESUYKKworICAgIElGIEFSTTExMzZKUworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEVORElGCisgICAgCisgICAgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKK2lIZWlnaHQgICAgICAgICBSTiA0CitpV2lkdGggICAgICAgICAgUk4gNQorCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpZHggICAgICAgICAgICAgUk4gNgoraWR5ICAgICAgICAgICAgIFJOIDcKK2luZGV4ICAgICAgICAgICBSTiA2CitUZW1wICAgICAgICAgICAgUk4gMTIKK3BBcmdzICAgICAgICAgICBSTiAxMQorCisKKyAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAorICAgICAgICAgICAgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAorICAgIElGIEFSTTExMzZKUworCisKKyAgICAgICAgTV9BTExPQzQgcHBEc3QsIDgKKyAgICAgICAgTV9BTExPQzQgcHBTcmMsIDgKKyAgICAgICAgTV9BTExPQzQgcHBBcmdzLCAxNgorICAgICAgICBNX0FMTE9DNCBwQnVmZmVyLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTJ4MTAKKyAgICAgICAgTV9BTExPQzggcEludGVyQnVmLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDEyMCA9IDEyKjUqMgorICAgICAgICBNX0FMTE9DOCBwVGVtcEJ1ZiwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzIgPSAgOCo0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KKyAgICAgICAgOy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIG1vdGlvbiB2ZWN0b3IgZnJhY3Rpb25hbCBwYXJ0cyAoZHgsZHkpLCBvbmUgb3V0IG9mIDE2IGNhc2VzIHdpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICA7Ly8gUmVnaXN0ZXJzIHI0LCByNSwgcjYgdG8gYmUgcHJlc2VydmVkIGJ5IGludGVybmFsIHVuc2FmZSBmdW5jdGlvbnMKKyAgICAgICAgOy8vIHI0IC0gaUhlaWdodAorICAgICAgICA7Ly8gcjUgLSBpV2lkdGgKKyAgICAgICAgOy8vIHI2IC0gaW5kZXgKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKK3BCdWYgICAgICAgICAgICBSTiA4CitIZWlnaHQgICAgICAgICAgUk4gOSAKK2J1ZlN0ZXAgICAgICAgICBSTiA5CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHB0cmlkeCwgNAorICAgICAgICBNX0FSRyAgIHB0cmlkeSwgNCAgICAgICAgCisgICAgICAgIE1fQVJHICAgcHRyV2lkdGgsIDQKKyAgICAgICAgTV9BUkcgICBwdHJIZWlnaHQsIDQgICAgICAgIAorCisgICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCisgICAgICAgIE1fTERSICAgaWR4LCBwdHJpZHgKKyAgICAgICAgTV9MRFIgICBpZHksIHB0cmlkeQorICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9MRFIgICBpSGVpZ2h0LCBwdHJIZWlnaHQKKyAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJyb2kud2lkdGggJWRcbiIsIGlXaWR0aAorICAgICAgICBNX1BSSU5URiAicm9pLmhlaWdodCAlZFxuIiwgaUhlaWdodAorCisgICAgICAgIEFERCAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisKK0ludGVycG9sYXRlTHVtYQorQmxvY2s0eDRXaWR0aExvb3AKK0Jsb2NrNHg0SGVpZ2h0TG9vcAorCisgICAgICAgIFNUTSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4CisgICAgICAgIE1fU1dJVENIIGluZGV4LCBMCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8wCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8xCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8yCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8zCisgICAgICAgIE1fQ0FTRSAgQ2FzZV80CisgICAgICAgIE1fQ0FTRSAgQ2FzZV81CisgICAgICAgIE1fQ0FTRSAgQ2FzZV82CisgICAgICAgIE1fQ0FTRSAgQ2FzZV83CisgICAgICAgIE1fQ0FTRSAgQ2FzZV84CisgICAgICAgIE1fQ0FTRSAgQ2FzZV85CisgICAgICAgIE1fQ0FTRSAgQ2FzZV9hCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9iCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9jCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9kCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9lCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9mCisgICAgICAgIE1fRU5EU1dJVENICisKK0Nhc2VfMAorICAgICAgICA7Ly8gQ2FzZSBHCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDAgXG4iCisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorCitDYXNlXzEKKyAgICAgICAgOy8vIENhc2UgYQorICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV8yCisgICAgICAgIDsvLyBDYXNlIGIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMiBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzMKKyAgICAgICAgOy8vIENhc2UgYworICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV80CisgICAgICAgIDsvLyBDYXNlIGQKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfNQorICAgICAgICA7Ly8gQ2FzZSBlCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDUgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9CisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICAKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV82CisgICAgICAgIDsvLyBDYXNlIGYKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfNworICAgICAgICA7Ly8gQ2FzZSBnCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV84CisgICAgICAgIDsvLyBDYXNlIGgKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzkKKyAgICAgICAgOy8vIENhc2UgaQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9hCisgICAgICAgIDsvLyBDYXNlIGoKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYSBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2IKKyAgICAgICAgOy8vIENhc2UgaworICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYworICAgICAgICA7Ly8gQ2FzZSBuCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHBTcmMgdG8gb25lIHJvdyBkb3duCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2QKKyAgICAgICAgOy8vIENhc2UgcAorICAgICAgICBNX1BSSU5URiAiQ2FzZSBkIFxuIgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9CisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9lCisgICAgICAgIDsvLyBDYXNlIHEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZgorICAgICAgICA7Ly8gQ2FzZSByCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworQmxvY2s0eDRMb29wRW5kCisKKyAgICAgICAgOy8vIFdpZHRoIExvb3AKKyAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzQKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBCR1QgICAgIEJsb2NrNHg0V2lkdGhMb29wCisKKyAgICAgICAgOy8vIEhlaWdodCBMb29wCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKKyAgICAgICAgTV9MRFIgICBpV2lkdGgsIHB0cldpZHRoCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAorICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAorICAgICAgICBCR1QgICAgIEJsb2NrNHg0SGVpZ2h0TG9vcAorCitFbmRPZkludGVycG9sYXRpb24KKyAgICAgICAgTU9WICAgICByMCwgIzAKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgICAgICAgICAgICAgICAgIAorCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKQEAgLTAsMCArMSw0OTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAorICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQorICAgIERDVyAgIDMsIDIsIDEsNCAKKyAgICBEQ1cgIC0zLC0yLC0xLDAKKyAgICBEQ1cgICAxLCAyLCAzLDQKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorCitCTEtfU0laRSAgICAgICAgRVFVIDB4OAorTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKK01VTF9DT05TVDEgICAgICBFUVUgMHg4MDgwODA4MAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit5ICAgICAgICAgICAgICAgUk4gMTIgICAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorcmV0dXJuICAgICAgICAgIFJOIDAgICAgCitwU3JjTGVmdDIgICAgICAgUk4gMSAgICAKK3BEc3QyICAgICAgICAgICBSTiAyICAgIAorc3VtMSAgICAgICAgICAgIFJOIDYgICAgCitzdW0yICAgICAgICAgICAgUk4gNyAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAorZHN0U3RlcHgyICAgICAgIFJOIDExICAgCitsZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKK291dGVyQ291bnQgICAgICBSTiAxNCAgIAorcjB4MDEwMTAxMDEgICAgIFJOIDEwICAgCityMHgwMEZGMDBGRiAgICAgUk4gMTEgICAKKwordFZhbDAgICAgICAgICAgIFJOIDAgICAgCit0VmFsMSAgICAgICAgICAgUk4gMSAgICAKK3RWYWwyICAgICAgICAgICBSTiAyICAgIAordFZhbDMgICAgICAgICAgIFJOIDMgICAgCit0VmFsNCAgICAgICAgICAgUk4gNCAgICAKK3RWYWw1ICAgICAgICAgICBSTiA1ICAgIAordFZhbDYgICAgICAgICAgIFJOIDYgICAgCit0VmFsNyAgICAgICAgICAgUk4gNyAgICAKK3RWYWw4ICAgICAgICAgICBSTiA4ICAgIAordFZhbDkgICAgICAgICAgIFJOIDkgICAgCit0VmFsMTAgICAgICAgICAgUk4gMTAgICAKK3RWYWwxMSAgICAgICAgICBSTiAxMSAgIAordFZhbDEyICAgICAgICAgIFJOIDEyICAgCit0VmFsMTQgICAgICAgICAgUk4gMTQgICAKKworYiAgICAgICAgICAgICAgIFJOIDE0ICAgCitjICAgICAgICAgICAgICAgUk4gMTIgICAKKworcDJwMCAgICAgICAgICAgIFJOIDAgICAgCitwM3AxICAgICAgICAgICAgUk4gMSAgICAKK3A2cDQgICAgICAgICAgICBSTiAyICAgIAorcDdwNSAgICAgICAgICAgIFJOIDQgICAgCisKK3BwMnBwMCAgICAgICAgICBSTiA2ICAgIAorcHAzcHAxICAgICAgICAgIFJOIDcgICAgCitwcDZwcDQgICAgICAgICAgUk4gOCAgICAKK3BwN3BwNSAgICAgICAgICBSTiA5ICAgIAorCitwMzIxMCAgICAgICAgICAgUk4gMTAgICAKK3A3NjU0ICAgICAgICAgICBSTiAxMCAgIAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCitPTVhfVkNfQ0hST01BX0RDCisgICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgYXZhaWxhYmlsaXR5LCMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICgjT01YX1ZDX1VQUEVSIHwgI09NWF9WQ19MRUZUKSkKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwCisgICAgICAgIEJORSAgICAgIFRTVF9VUFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCisgICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDl9ICAgICAgICAgICAgIDsvLyB0VmFsIDggdG8gOSA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIHN1bTEsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICBzdW0yLCB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQorICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDggKyB0VmFsOQorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNV0KKyAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIAorICAgICAgICBMRFJCICAgICB0VmFsNCwgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQorICAgICAgICBMRFJCICAgICB0VmFsMTIsW3BTcmNMZWZ0Ml0gICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDE0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCisgICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIEFERCAgICAgIHRWYWwxNCwgdFZhbDgsIHRWYWw0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMiAgPSBzdW0ocFNyY0xlZnRbNF0gdG8gcFNyY0xlZnRbN10pCisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsMTQsICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGxlZnRzdW0yICsgMgorICAgICAgICBBREQgICAgICB0VmFsOSwgc3VtMiwgICAjMiAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB1cHN1bTIgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTEsICBzdW0xLCB0VmFsMiAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gdXBzdW0xICsgbGVmdHN1bTEKKyAgICAgICAgQUREICAgICAgc3VtMiwgIHN1bTIsIHRWYWwxNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgPSB1cHN1bTIgKyBsZWZ0c3VtMgorICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyA0KQorICAgICAgICBNT1YgICAgICBzdW0xLCAgc3VtMSwgIExTUiAjMyAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KT4+MworICAgICAgICBNT1YgICAgICB0VmFsOSwgdFZhbDksIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw5ICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgdFZhbDgsIHRWYWw4LCBMU1IgIzIgICAgICAgICAgICAgICAgOy8vICh0VmFsOCArIDIpPj4yCisgICAgICAgIE1PViAgICAgIHN1bTIsICBzdW0yLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpPj4zCisgICAgICAgIAorICAgICAgICBNVUwgICAgICB0VmFsMCwgc3VtMSwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsMSwgdFZhbDkscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOSwgc3VtMiwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCAwIHRvIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK1RTVF9VUFBFUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICAKKyAgICAgICAgQk5FICAgICAgVFNUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgc3VtMSwgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHN1bTIsICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtMSwgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIFVYVEggICAgIHN1bTIsIHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTIgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHN1bTEsIHN1bTEscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHN1bTIsIHN1bTIscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK1RTVF9MRUZUIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MyAgICAgICAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJORSAgICAgIFRTVF9DT1VOVDAKKyAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsNCArIHRWYWwxMgorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQorICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQorICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICBzdW0xLCAgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gc3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCisgICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIEFERCAgICAgIHN1bTIsICB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgIDsvLyBzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xICsgMgorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMiArIDIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHN1bTEsIHN1bTEsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDIpPj4yCisgICAgICAgIE1PViAgICAgIHN1bTIsIHN1bTIsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDIpPj4yCisgICAgICAgIAorICAgICAgICBNVUwgICAgICB0VmFsNiwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgTU9WICAgICAgdFZhbDcsdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gc3VtMQorICAgICAgICBNT1YgICAgICB0VmFsOSx0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBzdW0yCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA4IHRvIDkKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK1RTVF9DT1VOVDAKKyAgICAgICAgTERSICAgICAgc3VtMSwgPU1VTF9DT05TVDEgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IDB4ODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB0VmFsNywgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsIGxlZnRTdGVwICAgICAgOy8vIGxlZnRTdGVweDIgPSBsZWZ0U3RlcCAqIDIKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyID0gcERzdCArIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjNCAgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgNAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10gCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQorICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbNF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbN10KKyAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ19DSFJPTUFfVkVSVAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDd9ICAgICAgICAgICAgOy8vIHRWYWwgNiB0byA3ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKKworICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfQ0hST01BX1BMQU5FCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgUlNCICAgICAgdFZhbDE0LCBsZWZ0U3RlcCwgbGVmdFN0ZXAsIExTTCAjMyAgOy8vIDcqbGVmdFN0ZXAKKyAgICAgICAgTERSQiAgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMrN10gICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XQorICAgICAgICBMRFJCICAgICB0VmFsNiwgW3BTcmNMZWZ0LCArdFZhbDE0XSAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KKyAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsICMrNiBdICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzBdCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gVjAgPSBwU3JjTGVmdFs3KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIEgwID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXSAgICAgICAgCisgICAgICAgIExTTCAgICAgIHRWYWwyLCB0VmFsMiwgIzQgICAgICAgICAgICAgICAgICAgIDsvLyBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxTXSkKKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNgorICAgICAgICBTVUIgICAgICB0VmFsOSwgdFZhbDksdFZhbDEwICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCisgICAgICAgIExEUkIgICAgIHRWYWw4LCBbcFNyY0Fib3ZlLCMrNV0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0KKyAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmUsIysxXSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxXQorICAgICAgICBBREQgICAgICB0VmFsOSwgdFZhbDksIHRWYWw5LCBMU0wgIzEgICAgICAgICA7Ly8gSDEgPSAzICogKHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXSkKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw5LCB0VmFsNywgTFNMICMyICAgICAgICAgOy8vIEggPSBIMSArIEgwCisgICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KKyAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsIys0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzJdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzJdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBIID0gSCArIEgyCisgICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDE0LGxlZnRTdGVwICAgICAgICAgICAgIDsvLyA2KmxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHRWYWwxMSwgcFNyY0xlZnQsIHRWYWwxMSAgICAgICAgICAgIDsvLyBwU3JjTGVmdCArIDYqbGVmdFN0ZXAKKyAgICAgICAgTU9WICAgICAgdFZhbDEyLCBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIEggPSBIICsgSDMKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw3LCBMU0wgIzQgICAgICAgICA7Ly8gMTcgKiBICisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNyAqIEggKyAxNgorICAgICAgICBTVUIgICAgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQorICAgICAgICBBU1IgICAgICBiLCB0VmFsNywgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYiA9ICgxNyAqIEggKyAxNikgPj4gNQorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gVjEgPSAzICogKHBTcmNMZWZ0WzYqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDYsIExTTCAjMiAgICAgICAgIDsvLyBWID0gVjAgK1YxCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiLCBMU0wgIzEgICAgICAgICAgICAgICAgIDsvLyAzKmIKKyAgICAgICAgU1VCICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNiAtIDMqYgorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDcsIExTTCAjMSAgICAgICAgIDsvLyBWID0gViArIFYyCisgICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCA9TUFTS19DT05TVCAgICAgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKKyAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIFYgPSBWICsgVjcKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQgICAgICAgICAgICAgICAgOy8vIGRzdFN0ZXAgLSA0CisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDYsIExTTCAjNCAgICAgICAgIDsvLyAxNypWCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNypWICsgMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBU1IgICAgICBjLCB0VmFsNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYyA9ICgxNypWICsgMTYpPj41CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDYsIGMsIGMsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYworICAgICAgICBVWFRIICAgICBjLCBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb25seSBpbiBoYWxmIHdvcmQKKyAgICAgICAgU1VCICAgICAgdFZhbDYsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIGEgLSAzKmIgLSAzKmMgKyAxNgorICAgICAgICBPUlIgICAgICBjLCBjLCBjLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gYyBjCisgICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAyYgorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcHAyID0gZCArIDIqYgorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gM2IKKyAgICAgICAgT1JSICAgICAgcDJwMCwgICB0VmFsNiwgIHRWYWwyLCAgTFNMICMxNiAgICAgOy8vIHAycDAgICA9IHBhY2sge3AyLCBwMH0KKyAgICAgICAgVVhUSCAgICAgYiwgYgorICAgICAgICBVWFRIICAgICB0VmFsNywgdFZhbDcKKyAgICAgICAgT1JSICAgICAgYiwgYiwgYiwgTFNMICMxNiAgICAgICAgICAgICAgICAgICAgOy8vIHtiLGJ9CisgICAgICAgIE9SUiAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjMTYgICAgICAgIDsvLyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDJwMCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwM3AxICAgPSBwMnAwICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwM3AxLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHA2cDQgICA9IHAzcDEgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDZwNCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwN3A1ICAgPSBwNnA0ICsge2IsYn0KKyAgICAgICAgTU9WICAgICAgb3V0ZXJDb3VudCwgI0JMS19TSVpFICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQgICAgICAgIAorICAgICAgICAKK0xPT1BfUExBTkUgICAgICAgIAorCisgICAgICAgIFVTQVQxNiAgIHA3cDUsICAgIzEzLCBwN3A1ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA3KSBjbGlwMTMocDUpCisgICAgICAgIFVTQVQxNiAgIHA2cDQsICAgIzEzLCBwNnA0ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA2KSBjbGlwMTMocDQpCisgICAgICAgIFVTQVQxNiAgIHAzcDEsICAgIzEzLCBwM3AxICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAzKSBjbGlwMTMocDEpCisgICAgICAgIFVTQVQxNiAgIHAycDAsICAgIzEzLCBwMnAwICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAyKSBjbGlwMTMocDApCisgICAgICAgIAorICAgICAgICBBTkQgICAgICBwcDdwcDUsIHIweDAwRkYwMEZGLCBwN3A1LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA3KSBjbGlwOChwNSkKKyAgICAgICAgQU5EICAgICAgcHA2cHA0LCByMHgwMEZGMDBGRiwgcDZwNCwgQVNSICM1ICAgIDsvLyBjbGlwOChwNikgY2xpcDgocDQpCisgICAgICAgIEFORCAgICAgIHBwM3BwMSwgcjB4MDBGRjAwRkYsIHAzcDEsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDMpIGNsaXA4KHAxKQorICAgICAgICBBTkQgICAgICBwcDJwcDAsIHIweDAwRkYwMEZGLCBwMnAwLCBBU1IgIzUgICAgOy8vIGNsaXA4KHAyKSBjbGlwOChwMCkKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIG91dGVyQ291bnQsIG91dGVyQ291bnQsICMxICAgICAgICAgICA7Ly8gb3V0ZXJDb3VudC0tCisgICAgICAKKyAgICAgICAgT1JSICAgICAgcDMyMTAsIHBwMnBwMCwgcHAzcHAxLCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwMyxwMiwgcDEsIHAwfQorICAgICAgICBTVFIgICAgICBwMzIxMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzBdIHRvIHBEc3RbM119ICAKKyAgICAgICAgCisgICAgICAgIE9SUiAgICAgIHA3NjU0LCBwcDZwcDQsIHBwN3BwNSwgTFNMICM4ICAgICAgICA7Ly8gcGFjayB7cDcscDYsIHA1LCBwNH0KKyAgICAgICAgTV9TVFIgICAgcDc2NTQsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7cERzdFs0XSB0byBwRHN0WzddfQorCisgICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDdwNSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A3ICsgY30sIHtwNSArIGN9CisgICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A2ICsgY30sIHtwNCArIGN9CisgICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDNwMSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AzICsgY30sIHtwMSArIGN9CisgICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AyICsgY30sIHtwMCArIGN9CisgICAgICAKKyAgICAgICAgQk5FICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU3MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKQEAgLTAsMCArMSw1MDEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMgICAgCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2CisgICAgRENEICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9EQywgICBPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitCTEtfU0laRSAgICAgICAgRVFVIDB4MTAKK01VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQorTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0CitNVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKK01VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQorTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCisKK3JldHVybiAgICAgICAgICBSTiAwICAgIAoraW5uZXJDb3VudCAgICAgIFJOIDAgICAgCitvdXRlckNvdW50ICAgICAgUk4gMSAgICAKK3BTcmNMZWZ0MiAgICAgICBSTiAxICAgIAorcERzdDIgICAgICAgICAgIFJOIDIgICAgCitzdW0gICAgICAgICAgICAgUk4gNiAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAordGVtcDEgICAgICAgICAgIFJOIDEwICAgCit0ZW1wMiAgICAgICAgICAgUk4gMTIgICAKK2NNdWwxICAgICAgICAgICBSTiAxMSAgIAorY011bDIgICAgICAgICAgIFJOIDEyICAgCitjb3VudCAgICAgICAgICAgUk4gMTIgICAKK2RzdFN0ZXB4MiAgICAgICBSTiAxMSAgIAorbGVmdFN0ZXB4MiAgICAgIFJOIDE0ICAgCityMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKK3IweDAwRkYwMEZGICAgICBSTiAxMQorCit0VmFsMCAgICAgICAgICAgUk4gMCAgICAKK3RWYWwxICAgICAgICAgICBSTiAxICAgIAordFZhbDIgICAgICAgICAgIFJOIDIgICAgCit0VmFsMyAgICAgICAgICAgUk4gMyAgICAKK3RWYWw0ICAgICAgICAgICBSTiA0ICAgIAordFZhbDUgICAgICAgICAgIFJOIDUgICAgCit0VmFsNiAgICAgICAgICAgUk4gNiAgICAKK3RWYWw3ICAgICAgICAgICBSTiA3ICAgIAordFZhbDggICAgICAgICAgIFJOIDggICAgCit0VmFsOSAgICAgICAgICAgUk4gOSAgICAKK3RWYWwxMCAgICAgICAgICBSTiAxMCAgIAordFZhbDExICAgICAgICAgIFJOIDExICAgCit0VmFsMTIgICAgICAgICAgUk4gMTIgICAKK3RWYWwxNCAgICAgICAgICBSTiAxNCAgIAorCitiICAgICAgICAgICAgICAgUk4gMTIgICAKK2MgICAgICAgICAgICAgICBSTiAxNCAgIAorCitwMnAwICAgICAgICAgICAgUk4gMCAgICAKK3AzcDEgICAgICAgICAgICBSTiAxICAgIAorcDZwNCAgICAgICAgICAgIFJOIDIgICAgCitwN3A1ICAgICAgICAgICAgUk4gNCAgICAKK3AxMHA4ICAgICAgICAgICBSTiA2ICAgIAorcDExcDkgICAgICAgICAgIFJOIDcgICAgCitwMTRwMTIgICAgICAgICAgUk4gOCAgICAKK3AxNXAxMyAgICAgICAgICBSTiA5ICAgIAorCitwMzIxMCAgICAgICAgICAgUk4gMTAgICAKK3A3NjU0ICAgICAgICAgICBSTiAxMCAgIAorcDExMTA5OCAgICAgICAgIFJOIDEwICAgCitwMTUxNDEzMTIgICAgICAgUk4gMTAgICAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2IDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisgICAgICAgIAorT01YX1ZDXzE2WDE2X1ZFUlQKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9Oy8vIHRWYWwgNiB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gMTVdCisgICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdGFsbCBvdXRzaWRlIHRoZSBsb29wCisKK0xPT1BfVkVSVAorICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5CisgICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMT09QX1ZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCisgICAgICAgIAorT01YX1ZDXzE2WDE2X0hPUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYgCisgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwICAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcworICAgICAgICBNT1YgICAgICB5LCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFswIHRvIDNdCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsMSA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjMTIgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgMTIKKyAgICAgICAKK0xPT1BfSE9SICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMCB0byAzXQorICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs0IHRvIDddCisgICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNVQlMgICAgIHksIHksICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KKyAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzggdG8gMTFdCisgICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzggdG8gMTFdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sIGRzdFN0ZXB4MiAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMTIgdG8gMTVdCisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgQk5FICAgICAgTE9PUF9IT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDMgdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfREMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCRVEgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5LHRWYWwxMCx0VmFsMTF9Oy8vIHRWYWwgOCB0byAxMSA9IHBTcmNBYm92ZVswIHRvIDE1XQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw2LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KKyAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXSArIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEyLCAxNF0KKyAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs4LCAxMF0gKyBwU3JjQWJvdmVbMTIsIDE0XQorICAgICAgICBVWFRCMTYgICB0VmFsMTAsIHRWYWwxMCwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXQorICAgICAgICBVWFRCMTYgICB0VmFsMTEsIHRWYWwxMSwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEzLCAxNV0KKyAgICAgICAgVUFERDE2ICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs5LCAxMV0gKyBwU3JjQWJvdmVbMTMsIDE1XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs4XSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzE1XSkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsIHRWYWwyLCBMU1IgIzE2ICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIHN1bSwgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeHRyYWN0IHRoZSBsb3dlciBoYWxmIGZvciByZXN1bHQKKyAgICAgICAgCitUU1RfTEVGVCAgICAgICAgCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gSW5jIENvdW50ZXIgaWYgTGVmdCBpcyBhdmFpbGFibGUKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDEwICsgdFZhbDExCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgQUREICAgICAgc3VtLCBzdW0sIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bSArIHRWYWw3CisKK1RTVF9DT1VOVCAgICAgICAgCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1ZFUSAgICBzdW0sICMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gMTI4IGlmKGNvdW50ID09IDApCisgICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQorICAgICAgICBDTVAgICAgICBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYoY291bnQgPT0gMSkKKyAgICAgICAgQURERVEgICAgc3VtLCBzdW0sICM4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSA4IGlmKGNvdW50ID09IDEpCisgICAgICAgIEFERE5FICAgIHN1bSwgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW1sZWZ0ICsgc3VtdXBwZXIKKyAgICAgICAgQURETkUgICAgc3VtLCBzdW0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSAxNiBpZihjb3VudCA9PSAyKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIHN1bSwgc3VtICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gb25seSBieXRlIHJlc3QgY2xlYXJlZAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIExTUkVRICAgIHN1bSwgc3VtLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNCBpZihjb3VudCA9PSAxKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIExTUk5FICAgIHN1bSwgc3VtLCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNSBpZihjb3VudCA9PSAyKQorCitUU1RfQ09VTlQwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgc3VtLCBzdW0sIHN1bSwgTFNMICM4ICAgICAgICAgICAgICAgOy8vIHN1bSByZXBsaWNhdGVkIGluIHR3byBoYWxmd29yZAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE9SUiAgICAgIHRWYWw2LCBzdW0sIHN1bSwgTFNMICMxNiAgICAgICAgICAgIDsvLyBzdW0gIHJlcGxpY2F0ZWQgaW4gYWxsIGJ5dGVzCisgICAgICAgIENQWSAgICAgIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IHRWYWwwCisgICAgICAgIENQWSAgICAgIHRWYWw4LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IHRWYWwwCisgICAgICAgIENQWSAgICAgIHRWYWw5LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMyA9IHRWYWwwCisgICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICAKK0xPT1BfREMgICAgICAgIAorICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5CisgICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMT09QX0RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKworT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICM0ICA7Ly8gdFZhbDE0ID0gMTUqbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIExEUkIgICAgIHRWYWwxMCwgW3BTcmNMZWZ0LCAgdFZhbDE0XSAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KKyAgICAgICAgTERSQiAgICAgdFZhbDExLCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgOy8vIHRWYWwxMSA9IHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDEyLCBbcFNyY0Fib3ZlLCAjMTVdCisKKyAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMTIsICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KKyAgICAgICAgU1VCICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCA9IFYwID0gcFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBTVUIgICAgICB0VmFsMTEsIHRWYWwxMiwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gSDAgPSBwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwyLCAgIExTTCAjNCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSA9IDE2ICogKHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0pCisKKyAgICAgICAgTU9WICAgICB0VmFsMTEsIHRWYWwxMSwgTFNMICMzICAgICAgICAgICAgICA7Ly8gOCpbMTVdLVstMV0KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzBdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxNF0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIFJTQiAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMzICAgICAgICAgOy8vIDcqWzE0XS1bMF0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzFdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxM10KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOAorICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyA2KlsxM10tWzFdCisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4CisgICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMyXQorICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTJdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMiAgICAgICAgIDsvLyA1KlsxMl0tWzJdCisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4CisgICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMzXQorICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTFdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMyICAgICAgIDsvLyArIDQqWzExXS1bM10KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzRdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMF0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDMqWzEwXS1bNF0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzVdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM5XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsIExTTCAjMSAgICAgICA7Ly8gKyAyKls5XS1bNV0KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzZdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM4XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyAxKls4XS1bNl0KKyAgICAgICAgQUREICAgICB0VmFsNywgdFZhbDExLCB0VmFsOAorCisgICAgICAgIEFERCAgICAgIHRWYWwyLCAgdFZhbDIsICAgIzE2ICAgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYKKyAgICAgICAgTU9WICAgICAgdFZhbDEsICBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHBTcmNMZWZ0CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCAgdFZhbDE0LCAgIGxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOSAgPSAxNCpsZWZ0U3RlcAorICAgICAgICBBREQgICAgICB0VmFsOSwgIHBTcmNMZWZ0LCB0VmFsOSAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcFNyY0xlZnQgKyAxNCpsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0xlZnRbMF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgIHRWYWw3LCAgTFNMICMyICAgICAgOy8vIHRWYWw3ICA9IDUgKiBICisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAjMzIgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSA1ICogSCArIDMyCisgICAgICAgIFNVQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQorICAgICAgICBBU1IgICAgICB0VmFsMTIsIHRWYWw3LCAgIzYgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gYiA9ICg1ICogSCArIDMyKSA+PiA2CisgICAgICAgIAorICAgICAgICBSU0IgICAgICB0VmFsOCwgIHRWYWw4LCAgdFZhbDgsICBMU0wgIzMgICAgICA7Ly8gdFZhbDggID0gVjEgPSA3KiAocFNyY0xlZnRbMTQqbGVmdFN0ZXBdLXBTcmNMZWZ0WzBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDEwLCBMU0wgIzMgICAgICA7Ly8gdFZhbDYgID0gViA9IFYwICtWMQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTMqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgUlNCICAgICAgdFZhbDcsICB0VmFsMTIsICB0VmFsMTIsICBMU0wgIzMgICAgOy8vIHRWYWw3ICA9IDcqYgorICAgICAgICBTVUIgICAgICB0VmFsMiwgIHRWYWwyLCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSArIDE2IC0gNypiCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEyKmxTXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gMiAqIChwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0pCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSA2ICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjIKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzIgICAgIDsvLyB0VmFsNyAgPSA1ICogKHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMworICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTEqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEwKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjQKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzE2ICAgICAgICAgICAgICAgOy8vIHRWYWw1ICA9IGRzdFN0ZXAgLSAxNgorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDcgID0gMyAqIChwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjUKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjcKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDYsICBMU0wgIzIgICAgIDsvLyB0VmFsNiAgPSA1KlYKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICAjMzIgICAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IDUqViArIDMyCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBBU1IgICAgICB0VmFsMTQsIHRWYWw2LCAgICM2ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gYyA9ICg1KlYgKyAzMik+PjYKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIFJTQiAgICAgIHRWYWw2LCAgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzMgICAgIDsvLyB0VmFsNiAgPSA3KmMKKyAgICAgICAgVVhUSCAgICAgdFZhbDE0LCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMiwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gMipiCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzE2ICAgIDsvLyB0VmFsMTQgPSB7YyAgLCAgY30KKyAgICAgICAgU1VCICAgICAgdFZhbDYsICB0VmFsMiwgICB0VmFsNiAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IGQgPSBhIC0gNypiIC0gNypjICsgMTYKKyAgICAgICAgQUREICAgICAgdFZhbDEsICB0VmFsNiwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHBwMiA9IGQgKyAyKmIKKyAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxMCA9MypiCisgICAgICAgIE9SUiAgICAgIHRWYWwwLCAgdFZhbDYsICAgdFZhbDEsICBMU0wgIzE2ICAgIDsvLyB0dmFsMCAgPSBwMnAwICAgPSBwYWNrIHtwMiwgcDB9CisgICAgICAgIFVYVEggICAgIHRWYWwxMiwgdFZhbDEyICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBDbGVhcmVkIHRoZSB1cHBlciBoYWxmIHdvcmQKKyAgICAgICAgVVhUSCAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwxMiwgIHRWYWwxMiwgTFNMICMxNiAgICA7Ly8gdFZhbDEyID0ge2IgICwgIGJ9CisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDEwLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTAgPSB7M2IgLCAzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDEsICB0VmFsMCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHAzcDEgICA9IHAycDAgICArIHtiLGJ9CisgICAgICAgIFNBREQxNiAgIHRWYWwyLCAgdFZhbDEsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBwNnA0ICAgPSBwM3AxICAgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHRWYWw0LCAgdFZhbDIsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNCAgPSBwN3A1ICAgPSBwNnA0ICAgKyB7YixifQorICAgICAgICBTQUREMTYgICB0VmFsNiwgIHRWYWw0LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gcDEwcDggID0gcDdwNSAgICsgezNiLDNifQorICAgICAgICBTQUREMTYgICB0VmFsNywgIHRWYWw2LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcDExcDkgID0gcDEwcDggICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDgsICB0VmFsNywgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHAxNHAxMiA9IHAxMXA5ICArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDksICB0VmFsOCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw5ICA9IHAxNXAxMyA9IHAxNHAxMiArIHtiLGJ9CisgICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCAgICAgPU1BU0tfQ09OU1QgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKKyAgICAgICAgCitMT09QX1BMQU5FICAgICAgICAKKworICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwM3AxCisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAycDAKKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwMnAwLCAgIHAycDAsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwN3A1CisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHA2cDQKKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwNnA0LCAgIHA2cDQsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwMTFwOQorICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTBwOAorICAgICAgICBTQUREMTYgICBwMTFwOSwgIHAxMXA5LCAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAxMHA4LCAgcDEwcDgsICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxNXAxMworICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTRwMTIKKyAgICAgICAgU0FERDE2ICAgcDE1cDEzLCBwMTVwMTMsIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwMTRwMTIsIHAxNHAxMiwgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBBRERTICAgICByMHgwMEZGMDBGRiwgcjB4MDBGRjAwRkYsICMxPDwyOCAgICAgOy8vIExvb3AgY291bnRlciB2YWx1ZSBpbiB0b3AgNCBiaXRzCisgICAgICAgIAorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNDICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKyAgICAgICAgICAgIAorICAgICAgICBFTkQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBmNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCkBAIC0wLDAgKzEsNTY3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAorICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgRENEICBPTVhfVkNfNHg0X0hVICAgCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK0JMS19TSVpFICAgICAgICAgICAgICBFUVUgMHg4CitNVUxfQ09OU1QwICAgICAgICAgICAgRVFVIDB4MDEwMTAxMDEKK0FERF9DT05TVDEgICAgICAgICAgICBFUVUgMHg4MDgwODA4MAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZXR1cm4gICAgICAgICAgUk4gMAorcFRhYmxlICAgICAgICAgIFJOIDkKK3BjICAgICAgICAgICAgICBSTiAxNQorcjB4MDEwMTAxMDEgICAgIFJOIDEKK3IweDgwODA4MDgwICAgICBSTiAwCisKK3RWYWwwICAgICAgICAgICBSTiAwCit0VmFsMSAgICAgICAgICAgUk4gMQordFZhbDIgICAgICAgICAgIFJOIDIKK3RWYWw0ICAgICAgICAgICBSTiA0Cit0VmFsNiAgICAgICAgICAgUk4gNgordFZhbDcgICAgICAgICAgIFJOIDcKK3RWYWw4ICAgICAgICAgICBSTiA4Cit0VmFsOSAgICAgICAgICAgUk4gOQordFZhbDEwICAgICAgICAgIFJOIDEwCit0VmFsMTEgICAgICAgICAgUk4gMTEKK3RWYWwxMiAgICAgICAgICBSTiAxMgordFZhbDE0ICAgICAgICAgIFJOIDE0CisKK091dDAgICAgICAgICAgICBSTiA2CitPdXQxICAgICAgICAgICAgUk4gNworT3V0MiAgICAgICAgICAgIFJOIDgKK091dDMgICAgICAgICAgICBSTiA5CisKK0xlZnQwICAgICAgICAgICBSTiA2CitMZWZ0MSAgICAgICAgICAgUk4gNworTGVmdDIgICAgICAgICAgIFJOIDgKK0xlZnQzICAgICAgICAgICBSTiA5CisKK0Fib3ZlMDEyMyAgICAgICBSTiAxMgorQWJvdmU0NTY3ICAgICAgIFJOIDE0CisKK0Fib3ZlTGVmdCAgICAgICBSTiAxMAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworT01YX1ZDXzR4NF9WRVJUCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gcFNyY0Fib3ZlWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbMCAgdG8gM10gID0gQWJvdmUwMTIzCisgICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzQgIHRvIDddICA9IEFib3ZlMDEyMworICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs4ICB0byAxMV0gPSBBYm92ZTAxMjMKKyAgICAgICAgU1RSICAgICAgQWJvdmUwMTIzLCAgW3BEc3RdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTIgdG8gMTVdID0gQWJvdmUwMTIzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDXzR4NF9IT1IKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02IAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcworICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBNVUwgICAgICBPdXQwLCAgIExlZnQwLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQxLCAgIExlZnQxLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQyLCAgIExlZnQyLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0RDCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NgorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQk5FICAgICAgVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBVQUREMTYgICB0VmFsMTEsIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIEFERCAgICAgIHRWYWwxMSwgdFZhbDExLCAgTFNSICMxNiAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgVVhUSCAgICAgdFZhbDExLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IExlZnQwICsgTGVmdDEKKyAgICAgICAgQUREICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gTGVmdDIgKyBMZWZ0MworICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsNiArIHRWYWw3CisgICAgICAgIEFERCAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyBPdXQwICA9IHRWYWw2ICsgdFZhbDExICAgCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjNCAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyA0CisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgIExTUiAjMyAgICAgICAgICAgICAgIDsvLyBPdXQwID0gKE91dDAgKyA0KT4+MworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICNPTVhfVkNfVVBQRVIgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCTkUgICAgICBMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzICA9IHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsNiwgIEFib3ZlMDEyMywgIFJPUiAjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIE91dDAsICAgdFZhbDYsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMTYgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIE91dDAsICAgT3V0MCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgIHRvIDcgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICAKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIE91dDAsICAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IExlZnQwICsgTGVmdDEKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICBPdXQxLCAgIExlZnQyLCAgTGVmdDMgICAgICAgICAgICAgICA7Ly8gT3V0MSAgPSBMZWZ0MiArIExlZnQzCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBPdXQxICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgICsgT3V0MQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0gCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitOb25lQXZhaWxhYmxlCisgICAgICAgIE1PViAgICAgIE91dDAsICAgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXQwID0gMTI4IGlmKGNvdW50ID09IDApCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NQorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgcjB4MDEwMTAxMDEgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gZiA9IChhKzIqYitjKzIpPj4yCisgICAgICAgIDsvLyBDYWxjdWxhdGUgYXM6CisgICAgICAgIDsvLyBkID0gKGEgKyBjICk+PjEKKyAgICAgICAgOy8vIGUgPSAoZCAtIGInKT4+MQorICAgICAgICA7Ly8gZiA9IGUgKyAxMjgKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUICAgICAgICAgICAgICAgICAgCisgICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwgIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gIDsvLyBBYm92ZTAxMjMsIEFib3ZlNDU2NyA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIEJORSAgICAgIERMVXBwZXJSaWdodEF2YWlsYWJsZQorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBNT1YgICAgICB0VmFsNywgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDExLCB0VmFsNywgIExTTCAjMjQgICAgICAgICAgICAgOy8vIHtVMywgIDAwLCAgMDAsICAwMCB9CisgICAgICAgIE1VTCAgICAgIE91dDMsICAgdFZhbDcsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgVTMgfSAKKyAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gezAwJywgVTMnLCBVMicsIFUxJ30KKyAgICAgICAgVUhBREQ4ICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZDEsICBkMCB9CisgICAgICAgIFVIQUREOCAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgdFZhbDkgICAgICAgICAgIDsvLyB7eHgsICBkMiwgIHh4LCAgeHggfQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBlMSwgIGUwIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIGUyLCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7eHgsICB4eCwgIGYxLCAgZjAgfQorICAgICAgICBVQUREOCAgICB0VmFsNiwgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgZjIsICB4eCwgIHh4IH0KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBQS0hCVCAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDYgICAgICAgICAgICAgICA7Ly8ge3h4LCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgQklDICAgICAgdFZhbDYsICB0VmFsNiwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHswMCwgIGYyLCAgZjEsICBmMCB9CisgICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB7VTMsICBmMiwgIGYxLCAgZjAgfQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgIE91dDEsICAgT3V0MywgICBPdXQwLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIGYyLCAgZjEgfQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgZjIgfQorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK0RMVXBwZXJSaWdodEF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmU0NTY3LCBMU0wgIzggICA7Ly8ge1U2LCAgVTUsICBVNCwgIFUzIH0KKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIEFib3ZlNDU2NywgTFNMICMyNCAgOy8vIHtVNCwgIFUzLCAgVTIsICBVMSB9CisgICAgICAgIFBLSEJUICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcsIExTTCAjMTYgIDsvLyB7VTUsICBVNCwgIFUzLCAgVTIgfQorICAgICAgICBNVk4gICAgICB0VmFsMSwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8ge1U2JywgVTUnLCBVNCcsIFUzJ30KKyAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNCcsIFUzJywgVTInLCBVMSd9CisgICAgICAgIE1WTiAgICAgIHRWYWwyLCAgQWJvdmU0NTY3ICAgICAgICAgICAgICAgICAgIDsvLyB7VTcnLCBVNicsIFU1JywgVTQnfQorICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge2QzLCAgZDIsICBkMSwgIGQwIH0KKyAgICAgICAgVUhBREQ4ICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NyAgICAgICAgICAgOy8vIHtkNSwgIGQ0LCAgZDMsICBkMiB9CisgICAgICAgIFVIQUREOCAgIHRWYWw4LCAgQWJvdmU0NTY3LCAgdFZhbDggICAgICAgICAgIDsvLyB7ZDYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge2UzLCAgZTIsICBlMSwgIGUwIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsOSwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIHtlNSwgIGU0LCAgZTMsICBlMiB9CisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB7ZTYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2YzLCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgVUFERDggICAgdFZhbDksICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmNiwgIHh4LCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjUsICBmNCwgIGYzLCAgZjIgfQorICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gezAwLCAgZjMsICBmMiwgIGYxIH0KKyAgICAgICAgQU5EICAgICAgdFZhbDksICB0VmFsOSwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHtmNiwgIDAwLCAgMDAsICAwMCB9CisgICAgICAgIFBLSEJUICAgIE91dDEsICAgdFZhbDcsICBPdXQyLCAgTFNMICM4ICAgICAgIDsvLyB7ZjQsICBmMywgIGYyLCAgZjEgfQorICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgT3V0MiwgIExTUiAjOCAgICAgICA7Ly8ge2Y2LCAgZjUsICBmNCwgIGYzIH0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCisKK09NWF9WQ180eDRfRElBR19EUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MCwgIExTTCAjOCAgICAgIDsvLyB0VmFsNyA9IDAwIDAwIEwwIEwxCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAorICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgPUFERF9DT05TVDEgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBPUlIgICAgICB0VmFsOCwgIExlZnQzLCAgTGVmdDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDggPSAwMCAwMCBMMiBMMworICAgICAgICBQS0hCVCAgICB0VmFsNywgIHRWYWw4LCAgdFZhbDcsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSBMMCBMMSBMMiBMMworICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw3LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBMMCBMMSBMMgorICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmVMZWZ0ICAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCBVTAorICAgICAgICBPUlIgICAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmVMZWZ0LCBMU0wgIzI0ICA7Ly8gdFZhbDkgPSBVTCBMMCBMMSBMMgorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTTCAjMjQgICAgICAgICA7Ly8gdFZhbDEwPSBVMCAwMCAwMCAwMAorICAgICAgICBVWFRCICAgICB0VmFsMTEsIHRWYWw3LCAgUk9SICMyNCAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCAwMCBMMAorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDksICBMU1IgIzggICAgICA7Ly8gdFZhbDEwPSBVMCBVTCBMMCBMMQorICAgICAgICBPUlIgICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsICBMU0wgIzggICAgICA7Ly8gdFZhbDExPSBVMSBVMCBVTCBMMAorICAgICAgICBVSEFERDggICB0VmFsMTEsIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDExPSBkMSBkMCBkTCBnMAorICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw3LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBnMCBnMSBnMiBnMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVMidVMSdVMCdVTCcKKyAgICAgICAgTVZOICAgICAgdFZhbDksICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gVUwnTDAnTDEnTDInCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGUxIGUwIGVMIGgwCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsOSAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IGgwIGgxIGgyIGgzCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDEwLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGkwIGkxIGkyIGkzCisgICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQwICA9IGYxIGYwIGZMIGkwCisgICAgICAgIFVYVEggICAgIHRWYWwxMSwgT3V0MywgICBST1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIGkxIGkyCisgICAgICAgIE1PViAgICAgIHRWYWw3LCAgT3V0MCwgICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNyA9IGYwIGZMIGkwIDAwCisgICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDcsICB0VmFsMTEsICBMU1IgIzggICAgIDsvLyBPdXQxICA9IGYwIGZMIGkwIGkxCisgICAgICAgIFBLSEJUICAgIE91dDIsICAgdFZhbDExLCBPdXQwLCAgICBMU0wgIzE2ICAgIDsvLyBPdXQyICA9IGZMIGkwIGkxIGkyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjEgdG8gaTB9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjAgdG8gaTF9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZkwgdG8gaTJ9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTAgdG8gaTN9IGF0IHBEc3RbMTUgdG8gMTJdIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDXzR4NF9WUgorCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCAgICAgPSAwMCAwMCAwMCBMMAorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgICAgID0gMDAgMDAgMDAgTDEKKyAgICAgICAgTERSQiAgICAgTGVmdDIsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQyICAgICA9IDAwIDAwIDAwIEwyCisgICAgICAgIE1PViAgICAgIHRWYWwwLCAgQWJvdmUwMTIzLCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsMCAgICAgPSBVMiBVMSBVMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gVTMgVTIgVTEgVTAgCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDAsICAgQWJvdmVMZWZ0ICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMiBVMSBVMCBVTAorICAgICAgICBNVk4gICAgICB0VmFsMTEsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDExICAgID0gVTInVTEnVTAnVUwnCisgICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCAwMAorICAgICAgICBVSFNVQjggICB0VmFsMSwgIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gZDIgZDEgZDAgZEwKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCBBYm92ZUxlZnQsIExlZnQxICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IDAwIDAwIDAwIGoxICAgICAgIAorICAgICAgICBNVk4gICAgICB0VmFsNCwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgTDAnCisgICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDEwLCAgdFZhbDQgICAgICAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBrMQorICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwwLCAgIExlZnQwICAgICAgICAgICAgICA7Ly8gdFZhbDEyICAgID0gVTIgVTEgVTAgTDAKKyAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMiwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxIFUwIFVMIEwwCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIFVIQUREOCAgIHRWYWwxMCwgdFZhbDksICAgdFZhbDE0ICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBnMyBnMiBnMSBnMAorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxLCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MCAgICAgID0gZTIgZTEgZTAgZUwKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IGgzIGgyIGgxIGgwCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTIgdG8gZUx9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1PViAgICAgIHRWYWwxLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsNiwgIE91dDAsICAgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDYgICAgID0gZTEgZTAgZUwgMDAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsMiwgICBMZWZ0MSAgICAgICAgICAgICAgOy8vIHRWYWwyICAgICA9IFUxIFUwIFVMIEwxCisgICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBsMSAgICAgICAgCisgICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDEwLCAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQxICAgICAgPSBpMyBpMiBpMSBpMAorICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTEnVTAnVUwnTDEnCisgICAgICAgIE9SUiAgICAgIHRWYWwxLCAgdFZhbDEsICAgTGVmdDIgICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCBMMgorICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw2LCAgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gT3V0MiAgICAgID0gZTEgZTAgZUwgbDEKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEsICB0VmFsMSwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGcyIGcxIGcwIGoyCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7aTMgdG8gaTB9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTEgdG8gbDF9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEsICAgdFZhbDIgICAgICAgICAgICAgIDsvLyB0VmFsOSAgICAgPSBoMiBoMSBoMCBrMgorICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWw5LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MyAgICAgID0gaTIgaTEgaTAgbDIKKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtpMiB0byBsMn0gYXQgcERzdFsxNSB0byAxMl0gCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfSEQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IDAwIDAwIDAwIEwwCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IDAwIDAwIDAwIEwxCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IDAwIDAwIDAwIEwyCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IDAwIDAwIDAwIEwzCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWwyLCAgQWJvdmVMZWZ0LCBBYm92ZTAxMjMsIExTTCAjODsvLyB0VmFsMiA9IFUyIFUxIFUwIFVMCisgICAgICAgIE1WTiAgICAgIHRWYWwxLCAgTGVmdDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIEwwJworICAgICAgICBPUlIgICAgICB0VmFsNCwgIExlZnQwLCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDQgPSBVMSBVMCBVTCBMMAorICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBVMidVMSdVMCdVTCcKKyAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWw0ID0gZzMgZzIgZzEgZzAKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZUxlZnQsICB0VmFsMSAgICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZEwKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWwyICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaDMgaDIgaDEgaDAKKyAgICAgICAgVUFERDggICAgdFZhbDEsICB0VmFsMSwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZUwKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gaTMgaTIgaTEgaTAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICBMZWZ0MCwgIEFib3ZlTGVmdCwgIExTTCAjMTYgOy8vIHRWYWwyID0gMDAgVUwgMDAgTDAKKyAgICAgICAgTU9WICAgICAgdFZhbDQsICB0VmFsNCwgIExTTCAjOCAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTIgaTEgaTAgMDAKKyAgICAgICAgT1JSICAgICAgdFZhbDExLCBMZWZ0MSwgIExlZnQwLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMT0gMDAgTDAgMDAgTDEKKyAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQxLCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gMDAgTDEgMDAgTDIKKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCBMZWZ0MywgIExlZnQyLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMD0gMDAgTDIgMDAgTDMKKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsNCwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIE91dDAgID0gaTIgaTEgaTAgZUwKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdIAorICAgICAgICBNT1YgICAgICB0VmFsNCwgIE91dDAsICAgTFNMICMxNiAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBpMSBpMCAwMCAwMAorICAgICAgICBVSEFERDggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBqMSAwMCBqMgorICAgICAgICBVSEFERDggICB0VmFsNiwgIHRWYWwxMSwgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBqMiAwMCBqMworICAgICAgICBNVk4gICAgICB0VmFsMTIsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBMMCcwMCBMMScKKyAgICAgICAgTVZOICAgICAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxND0gMDAgTDEnMDAgTDInCisgICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDIsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGsxIDAwIGsyCisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDcsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGQxIDAwIGQyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDYsICB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGsyIDAwIGszCisgICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEwLCB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGQyIDAwIGQzCisgICAgICAgIFVBREQ4ICAgIHRWYWwyLCAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGwxIDAwIGwyCisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUxIDAwIGUyCisgICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGwyIDAwIGwzCisgICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDksICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGUyIDAwIGUzCisgICAgICAgIE9SUiAgICAgIE91dDIsICAgdFZhbDgsICB0VmFsMiwgIExTTCAjOCAgICAgIDsvLyBPdXQyICA9IGwxIGUxIGwyIGUyCisgICAgICAgIE9SUiAgICAgIE91dDMsICAgdFZhbDksICB0VmFsMTEsIExTTCAjOCAgICAgIDsvLyBPdXQzICA9IGwyIGUyIGwzIGUzCisgICAgICAgIFBLSFRCICAgIE91dDEsICAgdFZhbDQsICBPdXQyLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQxICA9IGkxIGkwIGwxIGUxCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfVkwKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgTU9WICAgICAgdFZhbDExLCBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgVTMKKyAgICAgICAgTVVMRVEgICAgQWJvdmU0NTY3LCB0VmFsMTEsIHIweDAxMDEwMTAxICAgICAgOy8vIEFib3ZlNDU2NyA9IFUzIFUzIFUzIFUzCisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIFUzIFUyIFUxCisgICAgICAgIE1WTiAgICAgIHRWYWwxMCwgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IFUzJ1UyJ1UxJ1UwJworICAgICAgICBPUlIgICAgICB0VmFsMiwgIHRWYWw5LCAgQWJvdmU0NTY3LCAgTFNMICMyNCA7Ly8gdFZhbDIgPSBVNCBVMyBVMiBVMQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBkNCBkMyBkMiBkMQorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCA9IGU0IGUzIGUyIGUxCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw5LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCAwMCBVMyBVMgorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlNDU2NywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCAwMAorICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8gdFZhbDkgPSBVNSBVNCBVMyBVMgorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCBVMworICAgICAgICBVSEFERDggICB0VmFsMTEsIHRWYWw5LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8gdFZhbDExPSBnNSBnNCBnMyBnMgorICAgICAgICBVSEFERDggICB0VmFsMTQsIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDE0PSBnNiBnNSBnNCBnMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVNCdVMydVMidVMScKKyAgICAgICAgTVZOICAgICAgdFZhbDcsICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gVTUnVTQnVTMnVTInCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IGQ1IGQ0IGQzIGQyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGg1IGg0IGgzIGgyCisgICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IGg2IGg1IGg0IGgzCisgICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQxICA9IGk1IGk0IGkzIGkyCisgICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQyICA9IGU1IGU0IGUzIGUyCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGk2IGk1IGk0IGkzCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIE1fU1RSICAgIE91dDMsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9IVQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1PViAgICAgIHIweDgwODA4MDgwLCAgcjB4MDEwMTAxMDEsIExTTCAjNyAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNiA9IDAwIEwxIDAwIEwwCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwyIDAwIEwxCisgICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDIsICBMZWZ0MywgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwzIDAwIEwyCisgICAgICAgIE1VTCAgICAgIE91dDMsICAgTGVmdDMsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyBPdXQzICA9IEwzIEwzIEwzIEwzCisgICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIEwyJzAwIEwxJworICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSAwMCBMMycwMCBMMicKKyAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgZzMgMDAgZzIKKyAgICAgICAgVVhUQjE2ICAgdFZhbDEyLCBPdXQzICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDMgMDAgTDMKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaDMgMDAgaDIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gMDAgZDIgMDAgZDEKKyAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZDMgMDAgZDIKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgZzQgMDAgZzMKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaTMgMDAgaTIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaDQgMDAgaDMKKyAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZTIgMDAgZTEKKyAgICAgICAgVUFERDggICAgdFZhbDExLCB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZTMgMDAgZTIKKyAgICAgICAgVUFERDggICAgdFZhbDEyLCB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaTQgMDAgaTMKKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsOCwgIHRWYWw0LCAgTFNMICM4ICAgICAgOy8vIE91dDAgID0gaTMgZTIgaTIgZTEKKyAgICAgICAgT1JSICAgICAgT3V0MSwgICB0VmFsMTEsIHRWYWwxMiwgTFNMICM4ICAgICAgOy8vIE91dDEgID0gaTQgZTMgaTMgZTIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQyICA9IEwzIEwzIGk0IGUzCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEVORAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTk3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCkBAIC0wLDAgKzEsMTI4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgIAorCisgICAgSUYgQVJNMTEzNkpTCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICBSTiAwCitwRHN0ICAgICAgICBSTiAxCitRUCAgICAgICAgICBSTiAyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgIFJOIDkKK1ZhbHVlICAgICAgIFJOIDQKK1ZhbHVlMiAgICAgIFJOIDUKK0ZsYWcgICAgICAgIFJOIDYKK3N0ck9mZnNldCAgIFJOIDcKK2NzdE9mZnNldCAgIFJOIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjB3MCAgICAgICAgUk4gIDMKK3IwdzEgICAgICAgIFJOICA0CisKK2MwdzAgICAgICAgIFJOICA1CitjMXcwICAgICAgICBSTiAgNgorCityZXR1cm4gICAgICBSTiAgMAorcFFQRGl2VGFibGUgUk4gIDUKK3BRUE1vZFRhYmxlICAgIFJOICA2CitTaGlmdCAgICAgICAgUk4gIDkKK1NjYWxlICAgICAgICBSTiAgMgorCitUZW1wMSAgICAgICBSTiAgMworVGVtcDIgICAgICAgUk4gIDQKK1RlbXAzICAgICAgIFJOICA3CitUZW1wNCAgICAgICBSTiAgOAorCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKKyAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBNT1YgICAgICBWYWx1ZTIsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCisgICAgICAgIAorCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKKworCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQorICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KKyAgICAgICAgCisgICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQorICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KKyAgICAgICAgCisgICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIAorICAgICAgICBTTVVMVEIgICBUZW1wMiwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUKKyAgICAgICAgU01VTFRCICAgVGVtcDQsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlCisgICAgICAgIFNNVUxCQiAgIFRlbXAxLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZQorICAgICAgICBTTVVMQkIgICBUZW1wMywgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUKKyAgICAgICAgTU9WICAgICAgVGVtcDIsIFRlbXAyLCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVGVtcDIgPj4gMSAmIFRlbXAxID0gKFRlbXAxID4+IDEpIDw8IDE2CisgICAgICAgIE1PViAgICAgIFRlbXA0LCBUZW1wNCwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFRlbXA0ID4+IDEgJiBUZW1wMyA9IChUZW1wMyA+PiAxKSA8PCAxNgorICAgICAgICBQS0hCVCAgICBjMHcwLCAgVGVtcDIsIFRlbXAxLCBMU0wgIzE1ICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAxIHwgVGVtcDIgfAorICAgICAgICBQS0hCVCAgICBjMXcwLCAgVGVtcDQsIFRlbXAzLCBMU0wgIzE1ICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAzIHwgVGVtcDQgfAorICAgICAgICBTVE1JQSAgICBwRHN0LCB7YzB3MCwgYzF3MH0gICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgIAorICAgIAorICAgIAorICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NhZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSw0NjkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQvRXhwb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbS90byBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMgCisKKworOy8vSW5wdXQgUmVnaXN0ZXJzCitwRGF0YSAgICAgICAgICAgICAgIFJOICAwCitRUCAgICAgICAgICAgICAgICAgIFJOICAxCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworaW4wMCAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzBdICYgU3JjWzFdIAoraW4wMiAgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzJdICYgU3JjWzNdCitpbjEwICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNF0gJiBTcmNbNV0KK2luMTIgICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s2XSAmIFNyY1s3XQoraW4yMCAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzhdICYgU3JjWzldCitpbjIyICAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTBdICYgU3JjWzExXQoraW4zMCAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEyXSAmIFNyY1sxM10KK2luMzIgICAgICAgICAgICAgICAgUk4gIDkgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxNF0gJiBTcmNbMTVdCisKKzsvLyBUcmFuc3Bvc2UgZm9yIFJvdyBvcGVyYXRpb25zIChSb3dzIHRvIGNvbHMpCit0clJvdzAwICAgICAgICAgICAgIFJOICAyCit0clJvdzEwICAgICAgICAgICAgIFJOICAxMAordHJSb3cwMiAgICAgICAgICAgICBSTiAgMwordHJSb3cxMiAgICAgICAgICAgICBSTiAgNQordHJSb3cyMCAgICAgICAgICAgICBSTiAgMTEKK3RyUm93MzAgICAgICAgICAgICAgUk4gIDEyCit0clJvdzMyICAgICAgICAgICAgIFJOICAxNAordHJSb3cyMiAgICAgICAgICAgICBSTiAgNworCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworcm93U3VtMSAgICAgICAgICAgICBSTiAgNAorcm93U3VtMiAgICAgICAgICAgICBSTiAgNgorcm93RGlmZjEgICAgICAgICAgICBSTiAgOAorcm93RGlmZjIgICAgICAgICAgICBSTiAgOQorCisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCityb3dPcDAwICAgICAgICAgICAgIFJOICAyCityb3dPcDEwICAgICAgICAgICAgIFJOICAxMAorcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKK3Jvd09wMzAgICAgICAgICAgICAgUk4gIDEyCityb3dPcDAyICAgICAgICAgICAgIFJOICAzCityb3dPcDEyICAgICAgICAgICAgIFJOICA1Cityb3dPcDIyICAgICAgICAgICAgIFJOICA3Cityb3dPcDMyICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKK3RyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCit0ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAordHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCit0ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCit0ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2NvbFN1bTEgICAgICAgICAgICAgUk4gIDEwCitjb2xTdW0yICAgICAgICAgICAgIFJOICAxMQorY29sRGlmZjEgICAgICAgICAgICBSTiAgMTIKK2NvbERpZmYyICAgICAgICAgICAgUk4gIDE0CisKKworOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCitjb2xPcDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorY29sT3AwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK2NvbE9wMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitjb2xPcDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorY29sT3AyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitjb2xPcDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMiAgICAgICAgICAgICBSTiAgOSAgCisKKzsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKK3BRUERpdlRhYmxlICAgICAgICAgUk4gIDAKK3BRUE1vZFRhYmxlICAgICAgICAgUk4gIDExCitTaGlmdCAgICAgICAgICAgICAgIFJOICAxMAorU2NhbGUgICAgICAgICAgICAgICBSTiAgMTQKK1JvdW5kICAgICAgICAgICAgICAgUk4gIDAKKwordGVtcDEgICAgICAgICAgICAgICBSTiAgMTAKK3RlbXAyICAgICAgICAgICAgICAgIFJOICAxMQordGVtcDMgICAgICAgICAgICAgICBSTiAgMTIKK3RlbXA0ICAgICAgICAgICAgICAgUk4gIDEKKworCisKKzsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCitvdXQwMCAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorb3V0MDIgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK291dDEwICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitvdXQxMiAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorb3V0MjAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK291dDIyICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitvdXQzMCAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorb3V0MzIgICAgICAgICAgICAgICBSTiAgOSAgCisgICAgICAKKyAgICAgICAgCisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCAgICBwRGF0YU9uU3RhY2ssIDQKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQscjExCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKKyAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgCisgICAgICAgIExETUlBICAgcERhdGEse2luMDAsaW4wMixpbjEwLGluMTIsaW4yMCxpbjIyLGluMzAsaW4zMn0KKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBtYXRyaXggaW5vcmRlciB0byBwZXJmb3JtIHJvdyBvcHMgYXMgY29sb3VtbiBvcHMKKyAgICAgICAgOy8vIElucHV0OiAgIGluW11bXSA9IG9yaWdpbmFsIG1hdHJpeAorICAgICAgICA7Ly8gT3V0cHV0OiAgdHJSb3dbXVtdPSB0cmFuc3Bvc2VkIG1hdHJpeAorICAgICAgICA7Ly8gU3RlcDE6IE9idGFpbiB0aGUgTEwgcGFydCBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAyOiBPYnRhaW4gdGhlIEhMIHBhcnQKKyAgICAgICAgOy8vIHN0ZXAzOiBPYnRhaW4gdGhlIExIIHBhcnQKKyAgICAgICAgOy8vIFN0ZXA0OiBPYnRhaW4gdGhlIEhIIHBhcnQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJSb3cxMCxpbjEwLGluMDAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0gICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMCxpbjAwLGluMTAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0clJvdzMwLGluMTIsaW4wMixBU1IgIzE2ICAgICAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyUm93MjAsaW4wMixpbjEyLExTTCAjMTYgICAgICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAorICAgICAgICAKKyAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgLSAtIGQyIGQzIAorICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHRyUm93MDIsaW4yMCxpbjMwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJSb3cxMixpbjMwLGluMjAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzMyLGluMzIsaW4yMixBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJSb3cyMixpbjIyLGluMzIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYxLHRyUm93MDAsdHJSb3cxMCAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYyLHRyUm93MjAsdHJSb3czMCAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMDAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMTAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMjAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMzAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMix0clJvdzEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMix0clJvdzMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOy8vIElucHV0OiAgcm93T3BbXVtdCisgICAgICAgIDsvLyBPdXRwdXQ6IHRyQ29sW11bXSAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMCxyb3dPcDEwLHJvd09wMDAsQVNSICMxNiAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXQorICAgICAgICBQS0hCVCAgIHRyQ29sMDAscm93T3AwMCxyb3dPcDEwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0ckNvbDMwLHJvd09wMTIscm93T3AwMixBU1IgIzE2ICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJDb2wyMCxyb3dPcDAyLHJvd09wMTIsTFNMICMxNiAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKKyAgICAgICAgCisgICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKKyAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB0ckNvbDAyLHJvd09wMjAscm93T3AzMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMixyb3dPcDMwLHJvd09wMjAsQVNSICMxNiAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMzIscm93T3AzMixyb3dPcDIyLEFTUiAjMTYgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDIyLHJvd09wMjIscm93T3AzMixMU0wgIzE2ICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gU3RvcmUgcERhdGEoUk4wKSBvbiBzdGFjayBhbmQgcmVzdG9yZSBpdCBvbmx5IGF0IHRoZSBmaW5hbCBzdG9yZSBiYWNrCisgICAgICAgIDsvLyBUaGlzIGZyZWVzIHVwIGEgcmVnaXN0ZXIgKFJOMCkgd2hpY2ggaXMgdXNlZCB0byByZWR1Y2UgbnVtYmVyIG9mIGludGVybWVkaWF0ZSBzdGFsbHMgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fU1RSICAgICAgIHBEYXRhLHBEYXRhT25TdGFjaworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMCx0ckNvbDEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMCx0ckNvbDMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMix0ckNvbDEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMix0ckNvbDMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgTERSICAgICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSU0IgICAgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMjIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIGNvbE9wMzIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIExEUlNCICAgICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyA8RGVxdWFudGl6ZT4gaW1wcm92ZXMgb24gdGhlIGMtcmVmZXJlbmNlIGNvZGUKKyAgICAgICAgOy8vIEJvdGggdGhlICBjYXNlcyBpLmUuLCBTaGlmdD49MCBhbmQgU2hpZnQ8MCBjYXNlcyBhcmUgY292ZXJlZCB0b2dldGhlcgorICAgICAgICA7Ly8gV2UgZG8gbm90IHN1YnRyYWN0IDIgZnJvbSBTaGlmdCBhcyBpbiBDIHJlZmVyZW5jZSwgaW5zdGVhZCBwZXJmb3JtIGEKKyAgICAgICAgOy8vIFNjYWxlIDw8IFNoaWZ0IG9uY2UgaW4gdGhlIGJlZ2lubmluZyBhbmQgZG8gYSByaWdodCBzaGlmdCBieSBhIAorICAgICAgICA7Ly8gY29uc3RhbnQgMiBhZnRlciB0aGUgTXVsdGlwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiBSb3VuZCB3b3VsZCBiZSAyIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBCeSBkb2luZyB0aGlzIHdlIGF2aW9kIHRoZSBCcmFuY2hlcyByZXF1aXJlZCBhbmQgYWxzbyAKKyAgICAgICAgOy8vIHJlZHVjZSB0aGUgY29kZSBzaXplIHN1YnN0YW50aWFsbHkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBSb3VuZCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJvdW5kID0gMgorICAgICAgICBMU0wgICAgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDAwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AwMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCisgICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCisgICAgICAgIFBLSEJUICAgb3V0MDAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICBQS0hCVCAgIG91dDAyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AxMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMTIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDEwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQxMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDMKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AyMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMjIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMiAKKyAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKKyAgICAgICAgUEtIQlQgICBvdXQyMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIFBLSEJUICAgb3V0MjIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0CisgICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMzAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDMyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBwRGF0YSxwRGF0YU9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEYXRhIHBvaW50ZXIgZnJvbSBzdGFjaworICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDMwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQzMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3N0b3JlX2NvZWZmCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEYXRhLHtvdXQwMCxvdXQwMixvdXQxMCxvdXQxMixvdXQyMCxvdXQyMixvdXQzMCxvdXQzMn0KKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORCAgICAgICAgCisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAorICAgIAorCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgICAgICAKKworCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BwU3JjICAgICAgICAgICAgICAgUk4gIDAKK3BEc3QgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjIgICAgICAgICAgICAgICAgUk4gIDIKKworOy8vT3V0cHV0IFJlZ2lzdGVycworcmVzdWx0ICAgICAgICAgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERzdFI0ICAgICAgICAgICAgICBSTiAgNAorcERzdFIwICAgICAgICAgICAgICBSTiAgMAorUVBSMSAgICAgICAgICAgICAgICBSTiAgMQorUVBSNSAgICAgICAgICAgICAgICBSTiAgNQorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQorICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCisgICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAorICAgIAorCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxMTVkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YSFVGRlRBQl9IXworI2RlZmluZSBfT01YSFVGRlRBQl9IXworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07CisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07CisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY4NjVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAorCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMWU1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCkBAIC0wLDAgKzEsNzUgQEAKKzsgLyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgQ2xpcHBpbmcgMTYgYml0IHZhbHVlIHRvIFswLDI1NV0gUmFuZ2UKKzsgKi8gCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAKKyAgICAgCisgICAgICBJRiBBUk0xMTM2SlMKKyAKKzsvL0lucHV0IEFyZ3VtZW50cworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgICAgICBSTiAxCitzdGVwICAgICAgICAgICAgICAgICBSTiAyCisKKzsvLyBMb2NhbCB2YXJpYWJsZXMKKworeDAgICAgICAgICAgICAgICAgICAgUk4gMworeDEgICAgICAgICAgICAgICAgICAgUk4gNAoreDIgICAgICAgICAgICAgICAgICAgUk4gNQoreDMgICAgICAgICAgICAgICAgICAgUk4gNgorCitDb3VudCAgICAgICAgICAgICAgICBSTiAxNAorICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4LHI2CisgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgIENvdW50LCM4Citsb29wCisKKyAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MCwgeDF9CisgICAgICAgIFNVQlMgICAgICAgICBDb3VudCxDb3VudCwgIzEgICAgICAgICAgOy8vIGNvdW50IGRvd24KKyAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MiwgeDN9CisgICAgICAgIFVTQVQxNiAgICAgICB4MCwgIzgsIHgwICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFVTQVQxNiAgICAgICB4MSwgIzgsIHgxICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3RdCisgICAgICAgIE1PViAgICAgICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgwLCBbcERzdCwjMV0KKyAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjMl0KKyAgICAgICAgTU9WICAgICAgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBTVFJCICAgICAgICAgeDEsIFtwRHN0LCMzXQorICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICAgeDIsICM4LCB4MiAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBVU0FUMTYgICAgICAgeDMsICM4LCB4MyAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM0XQorICAgICAgICBNT1YgICAgICAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIFNUUkIgICAgICAgICB4MiwgW3BEc3QsIzVdCisgICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzZdCisgICAgICAgIE1PViAgICAgICAgICB4MywgeDMsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgzLCBbcERzdCwjN10KKyAgICAgICAgQUREICAgICAgICAgIHBEc3QscERzdCxzdGVwICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcERzdCBieSBzdGVwIHZhbHVlCisgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgIGxvb3AgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb250aW51ZSBsb29wIHVudGlsIENvdW50IHJlYWNoZXMgNjQgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMDkwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzOTggQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCis7ICoKKzsgKiAKKzsgKgorOyAqIAorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKKworZnR5cGUgICAgICAgICAgICAgICAgUk4gMAordGVtcDMgICAgICAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgICAgUk4gNQorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRXNjYXBlICAgICAgICAgICAgICAgUk4gNQorCis7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKK3ppZ3phZyAgICAgICAgICAgICAgIFJOIDAKK3N0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKK3RlbXAyICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKK3NpZ24gICAgICAgICAgICAgICAgIFJOIDUKK0xhc3QgICAgICAgICAgICAgICAgIFJOIDcKK3N0b3JlUnVuICAgICAgICAgICAgIFJOIDE0CisKKworcGFja1JldEluZGV4ICAgICAgICAgUk4gNQorCisKK21hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAorICAgICAgICAKKworCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisgICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAorICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCisgICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCisgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKKworICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucworCitnZXRWTENiaXRzCisgICAgICAgIAorICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCisgICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAorICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMworCisgICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCisgICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQorCisgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KKworICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCisgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgCisgICAgICAgIAorCitlbmRGaWxsVkxECisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQorICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQorICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICAKKworbm90RXNjYXBlbW9kZQorCisgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQorICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAorICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAKKworICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQorCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCisgICAgICAgIAorICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCisgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcworICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQorCisgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKKworZnR5cGUyCisKKyAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCisgICAgICAgIAorRmlsbFZMREwxICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKKyAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAorIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MworICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAKK3N0b3JlTGV2ZWxMMQorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworIAorCisKKyAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKKworRXNjYXBlTW9kZTMKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCisKKyAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQorICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2CisgICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCisgICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgICAgIAorCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKworCisgCitzdG9yZUxldmVsTGFzdAorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCisgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgICAKK2VuZAorCisgICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKKworICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cworCisgICAgICAgIAorRXhpdE9rCisgICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAorICAgCisgICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKworICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgICAgICAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCisgICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgorCitFeGl0RXJyb3IKKyAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAorICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworZXhpdDIKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRkMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpAQCAtMCwwICsxLDIxMSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisKKworCisvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKKworLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIAorLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6CisvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cworLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKKy8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCisvLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0CisvLworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCisvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCisvLworLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQorLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorCisvLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQorLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCisvLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKKyAKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCisgICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCisgICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCisgICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCisgICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCisgICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCisgICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCisgICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCisgICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCisgICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCisgICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCisgICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCisgICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCisgICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCisgICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCisgICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCisgICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCisgICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCisgICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCisgICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCisgICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCisgICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCisgICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKK307CisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKKworCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Cit9OworCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKKyAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKKyAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKKyAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKKyAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKKyAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKKyAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKKyAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKKyAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKKyAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKKyAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKKyAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAoreworICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKKyAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAoreworICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCisgICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAoreworICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKKyAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisKKwk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEKK307CisKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Cit7CisgICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsCTAsCTAsCTAsCisJCisJMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2Y4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpAQCAtMCwwICsxLDc1IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBMb29rdXAgdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyAgICAvKiAqIFRhYmxlIEVudHJpZXMgY29udGFpbiBEYyBTY2FsZXIgdmFsdWVzCisgICAgICAgKiBhcm1WQ000UDJfRENTY2FsZXJbaV09IDggICAgICAgICAgIGZvciBpPTEgIHRvICA0IGFuZCBpPTMzIHRvIDM2CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaSAgICAgICAgIGZvciBpPTUgIHRvICA4CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGkrOCAgICAgICAgIGZvciBpPTkgIHRvICAyNQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmktMTYgICAgICBmb3IgaT0yNiB0byAgMzEKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gKGktMzIrMTMpLzIgZm9yIGk9MzcgdG8gIDU5CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGktNi0zMiAgICAgIGZvciBpPTYwIHRvICA2MworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICBmb3IgaT0wIGFuZCBpPTMyCisgICAgICAgKi8KKyAgICAgICAKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfRENTY2FsZXJbNjRdPXsKKwkweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweGEsICAweGMsICAweGUsICAKKyAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAKKyAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAorICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MmEsIDB4MmMsIDB4MmUsCisgICAgMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHg5LCAgMHg5LCAgMHhhLCAgCisgICAgMHhhLCAgMHhiLCAgMHhiLCAgMHhjLCAgMHhjLCAgMHhkLCAgMHhkLCAgMHhlLCAgCisgICAgMHhlLCAgMHhmLCAgMHhmLCAgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgCisgICAgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKKworfTsKKworICAgICAgICAgICAgICAKKyAgICAgLyogIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKKyAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNltpXT1yb3VuZCgzMjc2Ny9pKQorICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzBdPSAwCisgICAgICAqLworCitjb25zdCBPTVhfUzE2IGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNls2NF09eworCTB4MDAwMCwweDdmZmYsMHg0MDAwLDB4MmFhYSwweDIwMDAsMHgxOTk5LDB4MTU1NSwweDEyNDksCisgICAgMHgxMDAwLDB4MGUzOSwweDBjY2QsMHgwYmEzLDB4MGFhYiwweDA5ZDksMHgwOTI1LDB4MDg4OCwKKyAgICAweDA4MDAsMHgwNzg3LDB4MDcxYywweDA2YmQsMHgwNjY2LDB4MDYxOCwweDA1ZDEsMHgwNTkxLAorICAgIDB4MDU1NSwweDA1MWYsMHgwNGVjLDB4MDRiZSwweDA0OTIsMHgwNDZhLDB4MDQ0NCwweDA0MjEsCisgICAgMHgwNDAwLDB4MDNlMSwweDAzYzQsMHgwM2E4LDB4MDM4ZSwweDAzNzYsMHgwMzVlLDB4MDM0OCwKKyAgICAweDAzMzMsMHgwMzFmLDB4MDMwYywweDAyZmEsMHgwMmU5LDB4MDJkOCwweDAyYzgsMHgwMmI5LAorICAgIDB4MDJhYiwweDAyOWQsMHgwMjhmLDB4MDI4MiwweDAyNzYsMHgwMjZhLDB4MDI1ZiwweDAyNTQsCisgICAgMHgwMjQ5LDB4MDIzZiwweDAyMzUsMHgwMjJiLDB4MDIyMiwweDAyMTksMHgwMjExLDB4MDIwOAorCSAgIAorfTsKKyAgICAgCisgICAgICAvKiBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCisgICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbaV09cm91bmQoMTMxMDcxL2kpCisgICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbMF09IDAKKyAgICAgICAqLworCitjb25zdCBPTVhfUzMyIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMls2NF09eworCTB4MDAwMDAwMDAsMHgwMDAxZmZmZiwweDAwMDEwMDAwLDB4MDAwMGFhYWEsIDB4MDAwMDgwMDAsIDB4MDAwMDY2NjYsIDB4MDAwMDU1NTUsIDB4MDAwMDQ5MjQsCisgICAgMHgwMDAwNDAwMCwweDAwMDAzOGUzLDB4MDAwMDMzMzMsMHgwMDAwMmU4YywgMHgwMDAwMmFhYiwgMHgwMDAwMjc2MiwgMHgwMDAwMjQ5MiwgMHgwMDAwMjIyMiwKKyAgICAweDAwMDAyMDAwLDB4MDAwMDFlMWUsMHgwMDAwMWM3MiwweDAwMDAxYWYyLCAweDAwMDAxOTlhLCAweDAwMDAxODYxLCAweDAwMDAxNzQ2LCAweDAwMDAxNjQzLAorICAgIDB4MDAwMDE1NTUsMHgwMDAwMTQ3YiwweDAwMDAxM2IxLDB4MDAwMDEyZjYsIDB4MDAwMDEyNDksIDB4MDAwMDExYTgsIDB4MDAwMDExMTEsIDB4MDAwMDEwODQsCisgICAgMHgwMDAwMTAwMCwweDAwMDAwZjg0LDB4MDAwMDBmMGYsMHgwMDAwMGVhMSwgMHgwMDAwMGUzOSwgMHgwMDAwMGRkNiwgMHgwMDAwMGQ3OSwgMHgwMDAwMGQyMSwKKyAgICAweDAwMDAwY2NkLDB4MDAwMDBjN2QsMHgwMDAwMGMzMSwweDAwMDAwYmU4LCAweDAwMDAwYmEzLCAweDAwMDAwYjYxLCAweDAwMDAwYjIxLCAweDAwMDAwYWU1LAorICAgIDB4MDAwMDBhYWIsMHgwMDAwMGE3MywweDAwMDAwYTNkLDB4MDAwMDBhMGEsIDB4MDAwMDA5ZDksIDB4MDAwMDA5YTksIDB4MDAwMDA5N2IsIDB4MDAwMDA5NGYsCisgICAgMHgwMDAwMDkyNSwweDAwMDAwOGZiLDB4MDAwMDA4ZDQsMHgwMDAwMDhhZSwgMHgwMDAwMDg4OSwgMHgwMDAwMDg2NSwgMHgwMDAwMDg0MiwgMHgwMDAwMDgyMAorCQorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTJkODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCkBAIC0wLDAgKzEsMTA0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7ICoqCis7ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCis7ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCis7ICoKKzsgKi8KKworICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgIElOQ0xVREUgb214VkNfcy5oCisKKworICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgIElGIEFSTTExMzZKUworIAorOy8vIElucHV0IEFyZ3VtZW50cworQmxvY2tJbmRleCAgICAgICAgIFJOIDAKK3BDb2VmQnVmUm93ICAgICAgICBSTiAxCitwQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgorcHJlZERpciAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgICBSTiA0CitwUXBCdWYgICAgICAgICAgICAgUk4gNQorCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICBSTiAwCitibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCitibG9ja0RDVG9wICAgICAgICAgUk4gNworYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKK3RlbXAxICAgICAgICAgICAgICBSTiA5Cit0ZW1wMiAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKKworICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAorICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAorICAgIAorICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQorICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCisgICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KKyAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KKyAgICAgICAgICAgICAKKyAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAorICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCisgICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAorICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCisgICAgICAKKyAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgorICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCisgICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCisgICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQorICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCisgICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKKworICAgICAgICAgCisgICAgCisgICAgICAgTV9FTkQKKyAKKyAgICAgICBFTkRJRgorCisgICAgICAgRU5EICAgIAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE3ZjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKy8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCisgKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAorICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKK3sKKyAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKKyAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAorICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKKyAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCisgICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAorICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCisgICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAorICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCisKKwkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAorICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAorICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKKyAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKKyAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAorICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKKyAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCisgICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKKworICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCisgICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAorICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKKyAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCisgICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAorICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCisgICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2CisKKworfTsKKworCisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2QyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZyBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKKyAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5CisgKiBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvcgorICogZnVydGhlciByZWNvbnN0cnVjdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddCisgKiBbaW5dCVFQCQkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgaW5kaWNhdGVzIHVzaW5nIHF1YW50aXphdGlvbiBtZXRob2QgZGVmaW5lZCBpbiBzaG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoZWFkZXIgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgaW5kaWNhdGVzIG5vcm1haWwgcXVhbnRpemF0aW9uIG1ldGhvZC4KKyAqIFtvdXRdIHBwQml0U3RyZWFtIAkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtCisgKiBbb3V0XSBwRHN0CQkJcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cyBvZgorICogICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBkYXRhIHR5cGUpLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0CisgKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOgorICogICAtICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIFFQIDw9IDA7CisgKgkgLSBwRHN0IG5vdCAxNi1ieXRlIGFsaWduZWQKKyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcigKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKKyAgICAxNSBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KKyAgICBPTVhfUzE2IHRlbXBCdWZbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMTsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1Zik7CisgICAgCisgICAgCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIFFQKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisJICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDlhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgorICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKKyAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddLgorICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCisgKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKKyAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKKyAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCisgKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KKyAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQorICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKKyAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgorICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAorICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCisgKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQworICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQorICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCisgKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0CisgKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKKyAqCQkJCQkJCQltYWNyb2Jsb2NrLgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCisgKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgorICogICAgICBvcgorICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKKyAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCisgKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCisgKiAgICAgIG9yCisgKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7CisgICAgT01YX0lOVCAgcHJlZFFQOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICAKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7CisgICAgfQorCisgICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCisgICAgaWYgKGJsb2NrSW5kZXggPD0gMykKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKKyAgICB9CisgICAgCisKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGlmIChpbnRyYURDVkxDID09IDEpCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgdmlkZW9Db21wKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgIGN1clFQLAorICAgICAgICBwcmVkUVAsCisgICAgICAgIHByZWREaXIsCisgICAgICAgIEFDUHJlZEZsYWcsCisgICAgICAgIHZpZGVvQ29tcCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIGN1clFQLAorICAgICB2aWRlb0NvbXAsCisgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCisgICAgICAgaXQgdG8gMCB0byAyNTUgKi8KKyAgICAKKwlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7CisJCisJCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4NjFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKQEAgLTAsMCArMSwzNjQgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqIAorOyAqKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUAorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogRGVjb2RlcyBhbmQgcGFkcyBmb3VyIG1vdGlvbiB2ZWN0b3JzIG9mIHRoZSBub24taW50cmEgbWFjcm9ibG9jayBpbiBQLVZPUC4KKzsgKiBUaGUgbW90aW9uIHZlY3RvciBwYWRkaW5nIHByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjYuMS42IG9mCis7ICogSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCis7ICogW2luXSAgICBwU3JjTVZMZWZ0TUIgICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIHBTcmNNVlVwcGVyTUIgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlciBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIHBTcmNNVlVwcGVyUmlnaHRNQiBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIGZjb2RlRm9yd2FyZCAgICAgICBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00Cis7ICogICAgICAgICAgICAgICAgICAgICBiaXQgc3RyZWFtIHN5bnRheAorOyAqIFtpbl0gICAgTUJUeXBlICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlCis7ICogICAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbgorOyAqICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgZmlsbGVkIHdpdGggdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBzYW1lIGRlY29kZWQgdmVjdG9yLgorOyAqIFtvdXRdICAgcHBCaXRTdHJlYW0gICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwKKzsgKiAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorOyAqICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgIHBEc3RNVkN1ck1CICAgICAgICAgcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgd2hpY2ggY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtbm8gZXJyb3IKKzsgKiAKKzsgKiAgICAgICAgICAgICAgICAgICAgIAorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICoKKzsgKgorICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorICAgICAgICBJTkNMVURFIG9teFZDX3MuaAorICAgICAgICAKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgIAorICAgICAgICAgICAgICAgIAorCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgIFJOIDEKK3BTcmNNVkxlZnRNQiAgICAgICAgICBSTiAyCitwU3JjTVZVcHBlck1CICAgICAgICAgUk4gMworcFNyY01WVXBwZXJSaWdodE1CICAgIFJOIDQKK3BEc3RNVkN1ck1CICAgICAgICAgICBSTiA1CitmY29kZUZvcndhcmQgICAgICAgICAgUk4gNgorTUJUeXBlICAgICAgICAgICAgICAgIFJOIDcKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK3plcm8gICAgICAgICAgICAgICAgICBSTiA0CitvbmUgICAgICAgICAgICAgICAgICAgUk4gNAorc2NhbGVGYWN0b3IgICAgICAgICAgIFJOIDEKKworCitSZXR1cm4gICAgICAgICAgICAgICAgUk4gMAorCitWbGNNVkQgICAgICAgICAgICAgICAgUk4gMAoraW5kZXggICAgICAgICAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgICBSTiA3CisKK212SG9yRGF0YSAgICAgICAgICAgICBSTiA0CittdkhvclJlc2lkdWFsICAgICAgICAgUk4gMAorCittdlZlckRhdGEgICAgICAgICAgICAgUk4gNCAgICAgICAgICAgICAKK212VmVyUmVzaWR1YWwgICAgICAgICBSTiAwCisKK3RlbXAgICAgICAgICAgICAgICAgICBSTiAxCisKK3RlbXAxICAgICAgICAgICAgICAgICBSTiAzCitIaWdoICAgICAgICAgICAgICAgICAgUk4gNAorTG93ICAgICAgICAgICAgICAgICAgIFJOIDIKK1JhbmdlICAgICAgICAgICAgICAgICBSTiAxCisKK0Jsa0NvdW50ICAgICAgICAgICAgICBSTiAxNAorCitkaWZmTVZkeCAgICAgICAgICAgICAgUk4gMAorZGlmZk1WZHkgICAgICAgICAgICAgIFJOIDEKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgICBSTiA4CitSQml0Q291bnQgICAgICAgICAgICAgUk4gOQorUkJpdEJ1ZmZlciAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgIFJOIDEyCitMUiAgICAgICAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRAorICAgICAgIElNUE9SVCAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAorCisgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAgICAgICAgCisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBwRHN0TVZDdXJNQiw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBEc3RNVlByZWRNRSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBCbGtDb3VudCw0CisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwQml0T2Zmc2V0LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVkxlZnRNQiw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZVcHBlck1CLDQKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR4LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR5LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcEhpZ2gsNAorICAgICAgIAorICAgICAgICAgICAgICAKKworCisgICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLHIxMQorICAgICAgIAorICAgICAgIE1fQVJHICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrLDQgICAgICAgICAgIDsvLyBwb2ludGVyIHRvICBwU3JjTVZVcHBlclJpZ2h0TUIgb24gc3RhY2sKKyAgICAgICBNX0FSRyAgICAgICAgICAgcERzdE1WQ3VyTUJvblN0YWNrLDQgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBwRHN0TVZDdXJNQiBvbiBzdGFjaworICAgICAgIE1fQVJHICAgICAgICAgICBmY29kZUZvcndhcmRvblN0YWNrLDQgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIGZjb2RlRm9yd2FyZCBvbiBzdGFjayAKKyAgICAgICBNX0FSRyAgICAgICAgICAgTUJUeXBlb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBNQlR5cGUgb24gc3RhY2sKKworICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0U3RyZWFtIE1hY3JvCisKKyAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjayAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE1CVHlwZSBmcm9tIHN0YWNrCisgICAgICAgTV9MRFIgICAgICAgICAgIHBEc3RNVkN1ck1CLHBEc3RNVkN1ck1Cb25TdGFjayAgICAgICAgOy8vIExvYWQgcERzdE1WQ3VyTUIgZnJvbSBzdGFjaworICAgICAgIE1PViAgICAgICAgICAgICB6ZXJvLCMwCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkEgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQQorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQV9RICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBX1EKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUJdCisgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIE1PViAgICAgICAgICAgICBCbGtDb3VudCwjMAorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdE9LCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0ViAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFZfUSAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0Vl9RCisgICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCM0CisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUgorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSX1EKKyAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzEKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgZmNvZGVGb3J3YXJkLGZjb2RlRm9yd2FyZG9uU3RhY2sgICAgICA7Ly8gTG9hZCBmY29kZUZvcndhcmQgIGZyb20gc3RhY2sKKworICAgICAgIDsvLyBTdG9yaW5nIHRoZSB2YWx1ZXMgdGVtcG9yYXJpbHkgb24gc3RhY2sKKworICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgICAgICAKKworICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMSAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPWZjb2RlRm9yd2FyZC0xCisgICAgICAgTU9WICAgICAgICAgICAgIG9uZSwjMQorICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgorICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixvbmUsdGVtcCAgICAgICAgICAgICAgICAgIDsvLyBzY2FsZUZhY3Rvcj0xPDwoZmNvZGVGb3J3YXJkLTEpCisgICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKKyAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isc2NhbGVGYWN0b3IsIzUgICAgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgc2NhbGVGYWN0b3IscEhpZ2ggICAgICAgICAgICAgICAgICAgICA7Ly8gW3BIaWdoXT0zMipzY2FsZUZhY3RvcgorICAgICAgICAgICAgICAKKyAgICAgICA7Ly8gVkxEIERlY29kaW5nCisKKworTG9vcAorCisgICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZCB0aGUgb3B0aW1pemVkIE1WRCBWTEMgdGFibGUKKworICAgICAgIDsvLyBIb3Jpem9udGFsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCisKKyAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gdmFyaWFibGUgbGVuZ2h0IGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybworICAgICAgCisgICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgdGhlIGRlY29kZWQgc3ltYm9sIGlzIGFuIGludmFsaWVkIHN5bWJvbCAKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLCMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvclJlc2lkdWFsPTEKKyAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCisgICAgICAgVEVRTkUgICAgICAgICAgIG12SG9yRGF0YSwjMAorICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdkhvckRhdGE9MCBkaWZmTVZkeD1tdkhvckRhdGEgICAgICAgICAKKyAgICAgICBCRVEgICAgICAgICAgICAgVmVydGljYWxEYXRhCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCisgICAgICAgTV9CRF9WUkVBRDggICAgIG12SG9yUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIGdldCBtdkhvclJlc2lkdWFsIGZyb20gYml0c3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtdkhvckRhdGEhPTAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBtdkhvckRhdGEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgbXZIb3JEYXRhLG12SG9yRGF0YSwjMCAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWFicyhtdkhvckRhdGEpCisgICAgICAgU1VCICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsbXZIb3JSZXNpZHVhbCxmY29kZUZvcndhcmQKKyAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhLGZjb2RlRm9yd2FyZCxtdkhvclJlc2lkdWFsIDsvLyBkaWZmTVZkeD1hYnMobXZIb3JEYXRhKSpmY29kZUZvcndhcmQrbXZIb3JSZXNpZHVhbC1mY29kZUZvcndhcmQKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzEKKyAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzAKKyAgICAgICAKKyAgICAgICA7Ly8gVmVydGljYWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KKworVmVydGljYWxEYXRhCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIGRpZmZNVmR4IG9uIHN0YWNrCisgICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZGluZyB0aGUgYWRkcmVzcyBvZiBvcHRpbWl6ZWQgVkxDIHRhYmxlcworCisgICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGCisgICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIFZMQyBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBhbiBJbnZhbGllZCBTeW1ib2wgb2NjdXJzCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIG12VmVyRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12VmVyRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCwjMSAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQorICAgICAgIFRFUU5FICAgICAgICAgICBtdlZlckRhdGEsIzAKKyAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHkgPSBtdlZlckRhdGEgaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZWZXJEYXRhPTAKKyAgICAgICBCRVEgICAgICAgICAgICAgRmluZE1WUHJlZAorCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCisgICAgICAgTV9CRF9WUkVBRDggICAgIG12VmVyUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIEdldCBtdlZlclJlc2lkdWFsIGZyb20gYml0IHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbW5WZXJEYXRhIT0wCisgICAgICAgICAgICAgCisKKyAgICAgICBDTVAgICAgICAgICAgICAgbXZWZXJEYXRhLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIG12VmVyRGF0YSxtdlZlckRhdGEsIzAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCxtdlZlclJlc2lkdWFsLGZjb2RlRm9yd2FyZAorICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEsZmNvZGVGb3J3YXJkLG12VmVyUmVzaWR1YWwgOy8vIGRpZmZNVmR5PWFicyhtdlZlckRhdGEpKmZjb2RlRm9yd2FyZCttdlZlclJlc2lkdWFsLWZjb2RlRm9yd2FyZAorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMQorICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMAorCisgICAgICAgOy8vQ2FsbGluZyB0aGUgRnVuY3Rpb24gb214VkNNNFAyX0ZpbmRNVnByZWQKKyAgICAgICAgCitGaW5kTVZQcmVkCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHkscGRpZmZNVmR5CisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAscERzdE1WQ3VyTUIsQmxrQ291bnQsTFNMICMyICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCisgICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAgb24gc3RhY2sgZm9yIHBhc3NpbmcgYXMgYW4gYXJndW1lbnQgdG8gRmluZE1WUHJlZAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLCMwCisgICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscERzdE1WUHJlZE1FICAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3MgcERzdE1WUHJlZE1FPU5VTEwgYXMgYW4gYXJndW1lbnQgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzc3MgQmxrQ291bnQgYXMgQXJndW1lbnQgdGhyb3VnaCBzdGFjaworCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAscFNyY01WTGVmdE1CICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAgKFJOIDEpPXBTcmNNVkxlZnRNQgorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIscFNyY01WVXBwZXJSaWdodE1Cb25TdGFjaworICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZMZWZ0TUIscFNyY01WVXBwZXJNQiAgICAgICAgICAgIDsvLyBwU3JjTVZMZWZ0TUIgKCBSTiAyKSA9IHBTcmNNVlVwcGVyTUIKKyAgICAgICBNT1YgICAgICAgICAgICAgcHBCaXRTdHJlYW0scERzdE1WQ3VyTUIgICAgICAgICAgICAgICA7Ly8gcHBCaXRTdHJlYW0gICggUk4gMCkgPSBwRHN0TVZDdXJNQgorICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIDsvLyBwU3JjTVZVcHBlck1CKCBSTiAzKSA9IHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIAorICAgICAgIEJMICAgICAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBzdWJyb3V0aW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkCisKKyAgICAgICA7Ly8gU3RvcmUgSG9yaXpvbnRhbCBNb3Rpb24gVmVjdG9yCisgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEJsa0NvdW50IGZyb20gc3RhY2sKKyAgICAgICBNX0xEUiAgICAgICAgICAgSGlnaCxwSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0zMipzY2FsZUZhY3RvcgorICAgICAgIExTTCAgICAgICAgICAgICB0ZW1wMSxCbGtDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPUJsa0NvdW50KjQKKyAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeAorICAgICAgIAorICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQorICAgICAgIAorICAgICAgIAorICAgICAgIFJTQiAgICAgICAgICAgICBMb3csSGlnaCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb3cgPSAtMzIqc2NhbGVGYWN0b3IKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHg9cERzdE1WQ3VyTUJbQmxrQ291bnRdK2RpZmZNVmR4CisgICAgICAgQUREICAgICAgICAgICAgIFJhbmdlLEhpZ2gsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJhbmdlPTY0KlNjYWxlRmFjdG9yCisgICAgICAgU1VCICAgICAgICAgICAgIEhpZ2gsSGlnaCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9IDMyKnNjYWxlRmFjdG9yLTEKKworICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeDxMb3cgICAgICAgICAgCisgICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4Kz1SYW5nZQorICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHggPiBIaWdoIGRpZmZNVmR4LT1SYW5nZQorICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdCisKKyAgICAgICA7Ly8gU3RvcmUgVmVydGljYWwKKworICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSx0ZW1wMSwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT00KkJsa0NvdW50KzIKKyAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR5ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeQorICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XS5kaWZmTVZkeQorICAgICAgIEFERCAgICAgICAgICAgICBCbGtDb3VudCxCbGtDb3VudCwjMSAgICAgICAgICAgICAgICAgIDsvLyBCbGtDb3VudD1CbGtDb3VudCsxCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdworICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeTxMb3cgIGRpZmZNVmR5Kz1SYW5nZSAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaAorICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeSA+IEhpZ2ggZGlmZk1WZHktPVJhbmdlCisgICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIEJsa0NvdW50LENvdW50CisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKKworICAgICAgIEJMVCAgICAgICAgICAgICBMb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBCbGtDb3VudDxDb3VudCBDb250aW51ZSB0aGUgTG9vcAorCisKKyAgICAgICA7Ly8gSWYgTUJUeXBlPU9NWF9WQ19JTlRFUiBvciBNQnR5cGU9T01YX1ZDX0lOVEVSX1EgY29weSBwRHN0TVZDdXJNQlswXSB0bworICAgICAgIDsvLyBwRHN0TVZDdXJNQlsxXSwgcERzdE1WQ3VyTUJbMl0sIHBEc3RNVkN1ck1CWzNdIAorCisgICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBMRFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUJdCisgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICAKKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzhdCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCMxMl0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKyAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGluZyB0aGUgTWFjcm8gICAgICAgCisKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSworIAorRXhpdEVycm9yCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorCitFeGl0T0sgICAgICAgICAgICAgCisKKyAgICAgICBNX0VORAorICAgICAgIEVORElGCisgICAgICAgRU5ECisKKworICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzYjI1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpAQCAtMCwwICsxLDEzMiBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgorCisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKKyAgICAgICAgIAorICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2NzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCkBAIC0wLDAgKzEsMTM2IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKKyAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgorICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgICAgICAgCisKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKKworICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KKworCisKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5Y2IxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCkBAIC0wLDAgKzEsMjI0IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorICAgICAgCisKKworICAgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCisgICAgICAgIAorCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorUHJlZERpciAgICAgICAgICAgICAgUk4gMworc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwordmlkZW9Db21wICAgICAgICAgICAgUk4gNQorOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAorcERDQ2hyb21hSW5kZXggICAgICAgUk4gNworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgorcG93T2ZTaXplICAgICAgICAgICAgUk4gNwordGVtcDEgICAgICAgICAgICAgICAgUk4gNQorCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0RDVmFsICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0CisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCisgICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCisKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCisKKyAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCisKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQorCisgICAgCisgICAgICAgCisKK0RlY29kZURDCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAorICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCisgICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKKyAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCisgICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCisKK0NoZWNrRENWYWx1ZVNpemUKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAorCisgICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQorCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICAKKworICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50CisKK0FDRGVjb2RlCisKKyAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCisgICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjaworICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKKyAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgorCisgICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjaworICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgICAgICAgIAorICAgICAgICAgICAgICAKKworRXhpdEVycm9yCisgCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKK0V4aXRPSworICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCkBAIC0wLDAgKzEsMTk0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCis7Ly8KKyAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtVkNDT01NX3MuaAorCisgICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQorICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCisgICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCitwU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKK3BTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQorcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCitwU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKK3BEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAorcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1CitpQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0CitDYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCisKK3BDYW5kTVYxICAgICAgICAgICAgICAgUk4gNworcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4CitwQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKKworQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAorQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAorQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCitDYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKK0NhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKK0NhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKKwordGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAorCit6ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0CityZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKKyAgICAgICAgCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFpbiByb3V0aW5lCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAorCisgICAgICAgIE1fQUxMT0M0IE1WLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0CisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAorICAgICAgICBNX0FSRyAgIEJsaywgNAorICAgICAgICAKKyAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgorICAgICAgICBNT1YgICB6ZXJvLCAjMAorICAgICAgICBNX0xEUiBpQmxrLCBCbGsKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCisgICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKKyAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKKyAgICAKKyAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KKworICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKKyAgICAgICAgTV9TV0lUQ0ggaUJsaworICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorT01YVkNCbGswCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0CisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAorCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4CisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMworICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgIAorICAgICAgICBCICAgICBCbGtFbmQKKyAgICAKK09NWFZDQmxrMQorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgorICAgIAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQorICAgICAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazMKKyAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKKyAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAorICAgIAorQmxrRW5kCisKKyAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybworICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5CisgICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKKyAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCisgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQorCisgICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQorICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KKyAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCisKKyAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAorCisgICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKKyAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKKworICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KKyAgICAgICAgICAgCisgICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCisKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKKworICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAorICAgIAorICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgorICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCisKKyAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAKKyAgICAgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYjU0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKQEAgLTAsMCArMSw3MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsaworOy8vCisgICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKKyAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQorICAgICAgICA7Ly8gICAgCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0CisgICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0CisgICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAorICAgIEVORElGCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0lEQ1Q4eDhibGssIHIxMQorICAgIEVORElGCisgICAgCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3BEc3QgICAgICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1Jlc3VsdCAgICAgICAgICBSTiAwCisKKzsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAorOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCis7Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKKzsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCis7Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworcFNyYyAgICBSTiAwICAgIAorU3RyaWRlICBSTiAxICAgIAorcERlc3QgICBSTiAyICAgIAorcFNjYWxlICBSTiAzICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAorICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCisgICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQgICAgICAgCisgICAgRU5ESUYgIAorICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk2NWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCkBAIC0wLDAgKzEsNzEzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8KKzsvLworCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCisKKyAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgSUYgIEFSTTExMzZKUworICAgIAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1BQ1JPIERFRklOSVRJT05TCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLworICAgIDsvLyAgIGRlc3Rbal0gPSAoeFtqXSArIHlbal0gKyByb3VuZCkgPj4gMSwgICBqPTAuLjMKKyAgICA7Ly8KKyAgICA7Ly8gU2ltaWxhciB0byBVSEFERDggaW5zdHJ1Y3Rpb24sIGJ1dCB3aXRoIGEgcm91bmRpbmcgdmFsdWUgb2YgMSBhZGRlZCB0bworICAgIDsvLyBlYWNoIHN1bSBiZWZvcmUgZGl2aWRpbmcgYnkgdHdvLCBpZiByb3VuZCBpcyAxCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzaworICAgIDsvLworICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICR4ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB4WzNdIDogIHhbMl0gIDogIHhbMV0gIDogIHhbMF0KKyAgICA7Ly8gJHkgICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHlbM10gOiAgeVsyXSAgOiAgeVsxXSAgOiAgeVswXQorICAgIDsvLyAkcm91bmQgICAgMCBpZiBubyByb3VuZGluZyB0byBiZSBhZGRlZCwgMSBpZiByb3VuZGluZyB0byBiZSBkb25lCisgICAgOy8vICRtYXNrICAgICBzb21lIHJlZ2lzdGVyIHNldCB0byAweDgwODA4MDgwCisgICAgOy8vCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICRkZXN0ICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KKworICAgIE1BQ1JPCisgICAgTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzaworICAgIElGICRyb3VuZCA9IDEKKyAgICAgICAgSUYgICRkZXN0IC89ICR5CisgICAgICAgICAgICBNVk4gICAgICAgICAkZGVzdCwgJHgKKyAgICAgICAgICAgIFVIU1VCOCAgICAgICRkZXN0LCAkeSwgJGRlc3QKKyAgICAgICAgICAgIEVPUiAgICAgICAgICRkZXN0LCAkZGVzdCwgJG1hc2sKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR5CisgICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHgsICRkZXN0CisgICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCisgICAgICAgIEVORElGCisgICAgRUxTRQorICAgICAgICBVSEFERDggICAgICAkZGVzdCwgJHgsICR5CisgICAgRU5ESUYKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSAkcFNyYyAoYWxpZ25lZCBvciB1bmFsaWduZWQgbG9jYXRpb25zKQorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAorICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgorICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQorICAgIDsvLyAkc2NyYXRjaCAgICBBIHNjcmF0Y2ggcmVnaXN0ZXIsIHVzZWQgaW50ZXJuYWxseSBmb3IgdGVtcCBjYWxjdWxhdGlvbnMKKyAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKKyAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKKyAgICA7Ly8KKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHBTcmMgICAgICAgSW4gY2FzZSB0aGUgbWFjcm8gYWNjZXB0cyBzdHJpZGUsIGl0IGluY3JlbWVudHMgdGhlIHBTcmMgYnkgCisgICAgOy8vICAgICAgICAgICAgIHRoYXQgdmFsdWUsIGVsc2UgdW5jaGFuZ2VkCisgICAgOy8vICRvdXQwICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbM10gOiAgelsyXSAgOiAgelsxXSAgOiAgelswXQorICAgIDsvLyAkb3V0MSAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzddIDogIHpbNl0gIDogIHpbNV0gIDogIHpbNF0KKyAgICA7Ly8KKyAgICA7Ly8gTm90ZTogeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nLiBJbiBjYXNlIG9mZnNldCBpcyAwLCAkc2NyYXRjaCBpcyBub3QgbW9kaWZpZWQuCisKKyAgICBNQUNSTworICAgIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAorICAgICAgICBJRiAkb2Zmc2V0ID0gMAorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskb3V0MCwgJG91dDF9CisgICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxLCAkc2NyYXRjaH0gCisgICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQwLCAkb3V0MCwgTFNSICM4ICogJG9mZnNldAorICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDAsICRvdXQwLCAkb3V0MSwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQorICAgICAgICAgICAgTU9WICAgICAgICAgJG91dDEsICRvdXQxLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkb3V0MSwgJG91dDEsICRzY3JhdGNoLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisgICAgICAgIEVORElGCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBMb2FkcyB0aHJlZSB3b3JkcyBmb3IgWCBpbnRlcnBvbGF0aW9uLCB1cGRhdGUgcG9pbnRlciB0byBuZXh0IHJvdy4gRm9yIAorICAgIDsvLyBYIGludGVycG9sYXRpb24sIGdpdmVuIGEgdHJ1bmNhdGVkLTRieXRlQWxpZ25lZCBzb3VyY2UgcG9pbnRlciwgCisgICAgOy8vIGludmFyaWFibHkgdGhyZWUgY29udGlub3VzIHdvcmRzIGFyZSByZXF1aXJlZCBmcm9tIHRoZXJlIHRvIGdldCB0aGUKKyAgICA7Ly8gbmluZSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciBmb3IgZmlsdGVyaW5nLiAKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAorICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgorICAgIDsvLworICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQorICAgIDsvLworICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgorICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQorICAgIDsvLworICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICBJbmNyZW1lbnRlZCBieSAkc3JjU3RlcAorICAgIDsvLworICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIG91dHB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKKyAgICA7Ly8gICAgICAgICAgICAgVGhlIG91dHB1dHMgYXJlIHNwZWNpZmljYWxseSBnZW5lcmF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4gRm9sbG93aW5nIGlzIHRoZSBpbGx1c3RyYXRpb24gdG8gc2hvdyAKKyAgICA7Ly8gICAgICAgICAgICAgaG93IHRoZSBuaW5lIGJ5dGVzIGFyZSBzcGFubmVkIGZvciBkaWZmZXJlbnQgb2Zmc2V0cyBmcm9tIAorICAgIDsvLyAgICAgICAgICAgICBub3RUcnVuY2F0ZWRGb3JBbGlnbm1lbnRTb3VyY2VQb2ludGVyLgorICAgIDsvLworICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgT2Zmc2V0IHwgQWxpZ25lZCBQdHIgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8CisgICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMCAgIHwgICAgICAgMCAgICAgfCAwMTIzICB8IDQ1NjcgIHwgOHh4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMSAgIHwgICAgICAtMSAgICAgfCB4MDEyICB8IDM0NTYgIHwgNzh4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMiAgIHwgICAgICAtMiAgICAgfCB4eDAxICB8IDIzNDUgIHwgNjc4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMyAgIHwgICAgICAtMyAgICAgfCB4eHgwICB8ICAgICAgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gCisgICAgOy8vICAgICAgICAgICAgIHdoZXJlIHRoZSBudW1iZXJpbmcgKDAtOCkgaXMgdG8gZGVzaWduYXRlIHRoZSA5IGJ5dGVzIGZyb20KKyAgICA7Ly8gICAgICAgICAgICAgc3RhcnQgb2YgYSBwYXJ0aWN1bGFyIHJvdy4gVGhlIGlsbHVzdHJhdGlvbiBkb2Vzbid0IHRha2UgaW4gCisgICAgOy8vICAgICAgICAgICAgIGFjY291bnQgdGhlIHBvc2l0aW9uaW5nIG9mIGJ5dGVzIHdpdGggaW4gdGhlIHdvcmQgYW5kIHRoZSAKKyAgICA7Ly8gICAgICAgICAgICAgbWFjcm8gY29tYmluYXRpb24gd2l0aCBNX0VYVF9YSU5UIHdpbGwgd29yayBvbmx5IGluIGxpdHRsZSAKKyAgICA7Ly8gICAgICAgICAgICAgZW5kaWFuIGVudmlyb25zCisgICAgOy8vIAorICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCisgICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZworCisgICAgTUFDUk8KKyAgICBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgICAgICBJRiAkb2Zmc2V0IC89IDMKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDEsICR3b3JkMn0KKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskd29yZDAsICR3b3JkMiwgJHdvcmQzfQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBFeHRyYWN0IGZvdXIgcmVnaXN0ZXJzIG9mIGZvdXIgcGl4ZWxzIGZvciBYIGludGVycG9sYXRpb24gCisgICAgOy8vIAorICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCisgICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCisgICAgOy8vIAorICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIGlucHV0cyBiYXNlZCBvbiB0aGUgJG9mZnNldCBwYXJhbWV0ZXIuIAorICAgIDsvLyAgICAgICAgICAgICBUaGUgaW5wdXRzIGFyZSBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4KKyAgICA7Ly8KKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCB5eXl5ICB8IDEyMzQgIHwgNTY3OCAgfAorICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgQnl0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIHBvaW50ZXIgKG5vdCB0cnVuY2F0ZWQgZm9yCisgICAgOy8vICAgICAgICAgICAgIDQgYnl0ZSBhbGlnbm1lbnQpIGFzIHNob3duIGluIHRoZSB0YWJsZS4gCisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICA7Ly8gICAgICAgICAgICAgfCAwMTIzICB8IDQ1NjcgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vCisgICAgOy8vIE5vdGU6IHskd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDN9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nCisKKyAgICBNQUNSTworICAgIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgICAgIElGICRvZmZzZXQgPSAwCisgICAgICAgICAgICA7ICR3b3JkMCBhbmQgJHdvcmQxIGFyZSBvaworICAgICAgICAgICAgOyAkd29yZDIsICR3b3JkMyBhcmUganVzdCA4IHNoaWZ0ZWQgdmVyc2lvbnMKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjMjQKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMiwgJHdvcmQwLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMiwgJHdvcmQyLCAkd29yZDEsIExTTCAjMjQKKyAgICAgICAgRUxJRiAkb2Zmc2V0ID0gMworICAgICAgICAgICAgOyAkd29yZDIgYW5kICR3b3JkMyBhcmUgb2sgKHRha2VuIGNhcmUgd2hpbGUgbG9hZGluZyBpdHNlbGYpCisgICAgICAgICAgICA7IHNldCAkd29yZDAgJiAkd29yZDEKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzI0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQyLCBMU0wgIzgKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQyLCBMU1IgIzI0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQzLCBMU0wgIzgKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQwLCAkd29yZDAsIExTUiAjOCAqICRvZmZzZXQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMCwgJHdvcmQwLCAkd29yZDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQxLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjKDMyIC0gOCAqICgoJG9mZnNldCkrMSkpCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0CisgICAgICAgIEVORElGCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBDb21wdXRlcyBoYWxmLXN1bSBhbmQgeG9yIG9mIHR3byBpbnB1dHMgYW5kIHB1dHMgdGhlbSBpbiB0aGUgaW5wdXQgCisgICAgOy8vIHJlZ2lzdGVycyBpbiB0aGF0IG9yZGVyCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICR2MCAgICAgICAgIGEsIGZpcnN0IGlucHV0CisgICAgOy8vICR2MSAgICAgICAgIGIsIHNlY29uZCBpbnB1dAorICAgIDsvLyAkdG1wICAgICAgICBzY3JhdGNoIHJlZ2lzdGVyCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkdjAgICAgICAgICAoYSArIGIpLzIKKyAgICA7Ly8gJHYxICAgICAgICAgYSBeIGIKKworICAgIE1BQ1JPCisgICAgTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCisgICAgICAgIFVIQUREOCAgICAgICR0bXAsICR2MCwgJHYxICAgICA7Ly8gczAgPSBhICsgYgorICAgICAgICBFT1IgICAgICAgICAkdjEsICR2MCwgJHYxICAgICAgOy8vIGwwID0gYSBeIGIKKyAgICAgICAgTU9WICAgICAgICAgJHYwLCAkdG1wICAgICAgICAgIDsvLyBzMAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIENhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0IHZhbHVlcyAoYSxiLGMsZCkgZm9yIEhhbGZQaXhlbFhZIHByZWRpY3QgdHlwZSBpbiAKKyAgICA7Ly8gbWNSZWNvbkJsb2NrIG1vZHVsZS4gVmVyeSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgCisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZIGRvbmUgaGVyZS4gVXNlcyAidG1wIiBhcyBzY3JhdGNoIHJlZ2lzdGVyIGFuZCAKKyAgICA7Ly8gInlNYXNrIiBmb3IgbWFzayB2YXJpYWJsZSAiMHgxMDEwMTAxeCIgc2V0IGluIGl0LiBJbiB5TWFzayA0IGxzYnMgYXJlIAorICAgIDsvLyBub3Qgc2lnbmlmaWNhbnQgYW5kIGFyZSB1c2VkIGJ5IHRoZSBjYWxsZWUgZm9yIHJvdyBjb3VudGVyICh5KQorICAgIDsvLworICAgIDsvLyBTb21lIHBvaW50cyB0byBub3RlIGFyZToKKyAgICA7Ly8gMS4gSW5wdXQgaXMgcGFpciBvZiBwYWlyLWF2ZXJhZ2VzIGFuZCBYb3JzCisgICAgOy8vIDIuICRzdW0xIGFuZCAkbHNiMSBhcmUgbm90IG1vZGlmaWVkIGFuZCBoZW5jZSBjYW4gYmUgcmV1c2VkIGluIGFub3RoZXIgCisgICAgOy8vICAgIHJ1bm5pbmcgYXZlcmFnZQorICAgIDsvLyAzLiBPdXRwdXQgaXMgaW4gdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9BVkc0ICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiKSA+PiAxLCB3aGVyZSBhIGFuZCBiIGFyZSAxc3QgYW5kIDJuZCBpbnB1dHMgdG8gYmUgYXZlcmFnZWQKKyAgICA7Ly8gJGxzYjAgICAgICAgKGEgXiBiKQorICAgIDsvLyAkc3VtMSAgICAgICAoYyArIGQpID4+IDEuIE5vdCBtb2RpZmllZAorICAgIDsvLyAkbHNiMSAgICAgICAoYyBeIGQpICAgICAgIE5vdCBtb2RpZmllZAorICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiICsgYyArIGQgKyAxKSAvIDQgOiBJZiBubyByb3VuZGluZworICAgIDsvLyAgICAgICAgICAgICAoYSArIGIgKyBjICsgZCArIDIpIC8gNCA6IElmIHJvdW5kaW5nCisKKyAgICBNQUNSTworICAgIE1fQVZHNCAgICAgICAgICAkc3VtMCwgJGxzYjAsICRzdW0xLCAkbHNiMSwgJHJuZFZhbAorICAgICAgICBMQ0xTIE9QMQorICAgICAgICBMQ0xTIE9QMgorICAgICAgICBJRiAkcm5kVmFsID0gMCA7Ly8gcm91bmRpbmcgY2FzZQorT1AxIFNFVFMgIkFORCIKK09QMiBTRVRTICJPUlIiCisgICAgICAgIEVMU0UgICAgICAgICAgIDsvLyBOb3Qgcm91bmRpbmcgY2FzZQorT1AxIFNFVFMgIk9SUiIKK09QMiBTRVRTICJBTkQiCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBMQ0xTIGxzYjIKKyAgICAgICAgTENMUyBzdW0yCisgICAgICAgIExDTFMgZGVzdAorICAgIAorbHNiMiAgU0VUUyAidG1wIgorc3VtMiAgU0VUUyAiJGxzYjAiCitkZXN0ICBTRVRTICIkc3VtMCIKKworICAgICAgICAkT1AxICAgICAgICAkbHNiMCwgJGxzYjAsICRsc2IxICAgICAgICAgIDsvLyBlMCA9IGUwICYgZTEKKyAgICAgICAgRU9SICAgICAgICAgJGxzYjIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gZTIgPSBzMCBeIHMxCisgICAgICAgICRPUDIgICAgICAgICRsc2IyLCAkbHNiMiwgJGxzYjAgICAgICAgICAgOy8vIGUyID0gZTIgfCBlMAorICAgICAgICBBTkQgICAgICAgICAkbHNiMiwgJGxzYjIsIHlNYXNrLCBMU1IgIyA0IDsvLyBlMiA9IGUyICYgbWFzaworICAgICAgICBVSEFERDggICAgICAkc3VtMiwgJHN1bTAsICRzdW0xICAgICAgICAgIDsvLyBzMiA9IChzMCArIHMxKS8yCisgICAgICAgIFVBREQ4ICAgICAgICRkZXN0LCAkc3VtMiwgJGxzYjIgICAgICAgICAgOy8vIGRlc3QgPSAgczIgKyBlMgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBJbXBsZW1lbnQgbW90aW9uIGNvbXBlbnNhdGlvbiByb3V0aW5lcyB1c2luZyB0aGUgbmFtZWQgcmVnaXN0ZXJzIGluIAorICAgIDsvLyBjYWxsZWUgZnVuY3Rpb24uIEVhY2ggb2YgdGhlIGZvbGxvd2luZyA0IGltcGxlbWVudCB0aGUgNCBwcmVkaWN0IHR5cGUKKyAgICA7Ly8gRWFjaCBoYW5kbGVzIDggY2FzZXMgZWFjaCBpZSBhbGwgdGhlIGNvbWJpbmF0aW9ucyBvZiA0IHR5cGVzIG9mIHNvdXJjZSAKKyAgICA7Ly8gYWxpZ25tZW50IG9mZnNldHMgYW5kIDIgdHlwZXMgb2Ygcm91bmRpbmcgZmxhZworICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRybmRWYWwgICAgIEFzc2VtYmxlciBWYXJpYWJsZS4gMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vICRvZmZzZXQgICAgICRwU3JjIE1PRCA0IHZhbHVlLiBPZmZzZXQgZnJvbSA0IGJ5dGUgYWxpZ25lZCBsb2NhdGlvbi4KKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIE91dHB1dHMgY29tZSBpbiB0aGUgbmFtZWQgcmVnaXN0ZXJzIG9mIHRoZSBjYWxsZWUgZnVuY3Rpb25zCisgICAgOy8vIFRoZSBtYWNybyBsb2FkcyB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciwgcHJvY2Vzc2VzIGl0IGFuZCAKKyAgICA7Ly8gc3RvcmVzIGluIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyLiBEb2VzIHRoZSB3aG9sZSBwcmVkaWN0aW9uIGN5Y2xlCisgICAgOy8vIG9mIE1vdGlvbiBDb21wZW5zYXRpb24gcm91dGluZSBmb3IgYSBwYXJ0aWN1bGFyIHByZWRpY3RUeXBlCisgICAgOy8vIEFmdGVyIHRoaXMgb25seSByZXNpZHVlIGFkZGl0aW9uIHRvIHRoZSBwcmVkaWN0ZWQgdmFsdWVzIHJlbWFpbgorCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEludGVnZXJQaXhlbCBwcmVkaWN0VHlwZS4gQm90aAorICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGJhc2UuIEl0IGlzIGp1c3QgYSBjb3B5CisgICAgOy8vIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLiBUd28gbGluZXMgYXJlIGRvbmUgcGVyIGxvb3AgdG8gcmVkdWNlIAorICAgIDsvLyBzdGFsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIGFzIHdlbGwgZm9yIHRoYXQgcHVycG9zZS4KKyAgICA7Ly8gCisgICAgOy8vIE1fTE9BRF9YIGxvYWRzIGEgd2hvbGUgcm93IGluIHR3byByZWdpc3RlcnMgYW5kIHRoZW4gdGhleSBhcmUgc3RvcmVkCisgICAgCitDYXNlSW50ZWdlclBpeGVsUm5kME9mZnNldCRvZmZzZXQKK0Nhc2VJbnRlZ2VyUGl4ZWxSbmQxT2Zmc2V0JG9mZnNldAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CitZbG9vcEludGVnZXJQaXhlbE9mZnNldCRvZmZzZXQKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMgorICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAorICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CisgICAgQkdUICAgICAgICAgWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFggcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gTG9vcCBoYXMgYmVlbiBzb2Z0d2FyZSBwaXBlbGluZWQgdG8gcmVkdWNlIAorICAgIDsvLyBzdGFsbHMuCisgICAgOy8vIAorICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCBob3Jpem9udGFsIHBpeGVsLgorICAgIDsvLyBNX0xPQURfWElOVCBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZSA0IHJlZ2lzdGVycywgMiB3aXRoIAorICAgIDsvLyBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiBlYWNoIHJlZ2lzdGVyIGFuZCBhbm90aGVyIDIKKyAgICA7Ly8gcmVnaXN0ZXJzIHdpdGggcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gb25lIGhvcml6b250YWxseSBzaGlmdGVkIHBpeGVsCisgICAgOy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluaXRpYWwgcm93IHBpeGVscy4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgCisgICAgOy8vIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSB0byBkbyA0IGxhbmUgU0lNRC4KKyAgICA7Ly8gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIG9mIHRoZSAKKyAgICA7Ly8gcm91bmRpbmcgYXMgcmVxdWlyZWQKKyAgICAKK0Nhc2VIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgSUYgJHJuZFZhbCA9IDAKKyAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCisgICAgRU5ESUYKKworICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKK1lsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMxCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgIE1fVUhBREQ4UiAgIHRtcDUsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCisgICAgTV9VSEFERDhSICAgdG1wNiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBTVFJEICAgICAgICB0bXA1LCB0bXA2LCBbcERzdF0sIGRzdFN0ZXAKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFkgcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gUHJlTG9hZGluZyBpcyB1c2VkIHRvIGF2b2lkIHJlbG9hZCBvZiBzYW1lIGRhdGEuIAorICAgIDsvLyAKKyAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgdmVydGljYWwgcGl4ZWwuCisgICAgOy8vIE1fTE9BRF9YIGdlbmVyYXRlcyAyIHJlZ2lzdGVycyB3aXRoIGFsbCBwaXhlbHMgaW4gYSByb3cgd2l0aCA0IHBpeGVsIGluIAorICAgIDsvLyBlYWNoIHJlZ2lzdGVyLiBUaGVzZSBhcmUgc2V0IG9mIHBhY2tlZCByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gCisgICAgOy8vIDQgbGFuZSBTSU1ELiBBZnRlciB0aGF0IE1fVUhBREQ4UiBtYWNybyBkb2VzIHRoZSBhdmVyYWdpbmcgdGFraW5nIGNhcmUgCisgICAgOy8vIG9mIHRoZSByb3VuZGluZyBhcyByZXF1aXJlZAorICAgIAorQ2FzZUhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBJRiAkcm5kVmFsID0gMAorICAgICAgICBMRFIgbWFzaywgPTB4ODA4MDgwODAKKyAgICBFTkRJRgorCisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wNSwgJG9mZnNldCA7Ly8gUHJlLWxvYWQKK1lsb29wSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMyCisgICAgOy8vIFByb2Nlc3Npbmcgb25lIGxpbmUKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CisgICAgTV9VSEFERDhSICAgdG1wMSwgdG1wMSwgdG1wMywgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBNX1VIQUREOFIgICB0bXAyLCB0bXAyLCB0bXA0LCAoMS0kcm5kVmFsKSwgbWFzaworICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAorICAgIDsvLyBQcm9jZXNzaW5nIGFub3RoZXIgbGluZQorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQKKyAgICBNX1VIQUREOFIgICB0bXAzLCB0bXAzLCB0bXAxLCAoMS0kcm5kVmFsKSwgbWFzaworICAgIE1fVUhBREQ4UiAgIHRtcDQsIHRtcDQsIHRtcDIsICgxLSRybmRWYWwpLCBtYXNrCisgICAgU1RSRCAgICAgICAgdG1wMywgdG1wNCwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFhZIHByZWRpY3RUeXBlLiBUaGUgdHdvCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAorICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKKyAgICA7Ly8gCisgICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsLCBob3Jpem9udGFsIAorICAgIDsvLyBhbmQgcmlnaHQtZG93biBkaWFnb25hbCBwaXhlbHMuIEp1c3QgYXMgaW4gSGFsZlBpeGVsWCBjYXNlLCBNX0xPQURfWElOVAorICAgIDsvLyBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZXMgNCByZWdpc3RlcnMgd2l0aCBhIHJvdyBhbmQgaXRzCisgICAgOy8vIDEgcGl4ZWwgcmlnaHQgc2hpZnRlZCB2ZXJzaW9uLCB3aXRoIDQgcGl4ZWxzIGluIG9uZSByZWdpc3Rlci4gQW5vdGhlciAKKyAgICA7Ly8gY2FsbCBvZiB0aGF0IG1hY3JvLWNvbWJpbmF0aW9uIGdldHMgYW5vdGhlciByb3cuIFRoZW4gTV9IU1VNX1hPUiBpcyAKKyAgICA7Ly8gY2FsbGVkIHRvIGdldCBtdXR1YWwgaGFsZi1zdW0gYW5kIHhvciBjb21iaW5hdGlvbnMgb2YgYSByb3cgd2l0aCBpdHMKKyAgICA7Ly8gc2hpZnRlZCB2ZXJzaW9uIGFzIHRoZXkgYXJlIGlucHV0cyB0byB0aGUgTV9BVkc0IG1hY3JvIHdoaWNoIGNvbXB1dGVzCisgICAgOy8vIHRoZSA0IGVsZW1lbnQgYXZlcmFnZSB3aXRoIHJvdW5kaW5nLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGhhbGYtc3VtL3hvciAKKyAgICA7Ly8gdmFsdWVzIHRoYXQgYXJlIHByZXNlcnZlZCBmb3IgbmV4dCByb3cgYXMgdGhleSBjYW4gYmUgcmUtdXNlZCBpbiB0aGUgCisgICAgOy8vIG5leHQgY2FsbCB0byB0aGUgTV9BVkc0IGFuZCBzYXZlcyByZWNvbXB1dGF0aW9uLgorICAgIDsvLyBEdWUgdG8gbGFjayBvZiByZWdpc3RlciwgdGhlIHJvdyBjb3VudGVyIGFuZCBhIG1hc2tpbmcgdmFsdWUgcmVxdWlyZWQgCisgICAgOy8vIGluIE1fQVZHNCBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgcmVnaXN0ZXIgeU1hc2sgd2hlcmUgdGhlIGxhc3QgbmliYmxlCisgICAgOy8vIGhvbGRzIHRoZSByb3cgY291bnRlciB2YWx1ZXMgYW5kIHJlc3QgaG9sZHMgdGhlIG1hc2tpbmcgdmFyaWFibGUgbGVmdCAKKyAgICA7Ly8gc2hpZnRlZCBieSA0CisgICAgCitDYXNlSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBMRFIgICAgICAgICB5TWFzaywgPSgoMHgwMTAxMDEwMSA8PCA0KSArIDgpCisKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCisgICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCwgbDAKKyAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMwJywgbDAnCisKK1lsb29wSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICA7Ly8gUHJvY2Vzc3Npbmcgb25lIGxpbmUKKyAgICA7Ly8gdDAwLCB0MDEsIHQxMCwgdDExIHJlcXVpcmVkIGZyb20gcHJldmlvdXMgbG9vcAorICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMSA7Ly8gTG9hZCBjLCBjJywgZCwgZCcKKyAgICBTVUIgICAgICAgICB5TWFzaywgeU1hc2ssICMyCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDIwLCB0MjEsIHQzMCwgdDMxCisgICAgTV9IU1VNX1hPUiAgdDIwLCB0MzAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMSwgbDEKKyAgICBNX0hTVU1fWE9SICB0MjEsIHQzMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMxJywgbDEnCisgICAgTV9BVkc0ICAgICAgdDAwLCB0MTAsIHQyMCwgdDMwLCAkcm5kVmFsIDsvLyBzMCwgbDAsIHMxLCBsMQorICAgIE1fQVZHNCAgICAgIHQwMSwgdDExLCB0MjEsIHQzMSwgJHJuZFZhbCA7Ly8gczAnLCBsMCcsIHMxJywgbDEnCisgICAgU1RSRCAgICAgICAgdDAwLCB0MDEsIFtwRHN0XSwgZHN0U3RlcCAgIDsvLyBzdG9yZSB0aGUgYXZlcmFnZQorICAgIAorICAgIDsvLyBQcm9jZXNzc2luZyBhbm90aGVyIGxpbmUKKyAgICA7Ly8gdDIwLCB0MjEsIHQzMCwgdDMxIHJlcXVpcmVkIGZyb20gYWJvdmUKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCisgICAgVFNUICAgICAgICAgeU1hc2ssICM3CisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCisgICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcAorICAgIE1fSFNVTV9YT1IgIHQwMSwgdDExLCB0bXAKKyAgICBNX0FWRzQgICAgICB0MjAsIHQzMCwgdDAwLCB0MTAsICRybmRWYWwKKyAgICBNX0FWRzQgICAgICB0MjEsIHQzMSwgdDAxLCB0MTEsICRybmRWYWwKKyAgICBTVFJEICAgICAgICB0MjAsIHQyMSwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBJRiAkb2Zmc2V0Lz0zIDpMT1I6ICRybmRWYWwvPTEKKyAgICAgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zIGVuZCBoZXJlCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDQga2luZHMgb2Ygb2Zmc2V0cyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGFuZCBybmRWYWwKKyAgICA7Ly8gY29tYmluYXRpb24gaW4gdGhlICJzd2l0Y2giIHRvIHByZWRpY3Rpb24gcHJvY2Vzc2luZyBjb2RlIHNlZ21lbnQKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcm5kICAgICAgICAgICAgMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFInMgZm9yIHRoZSAiTV9TV0lUQ0giIG1hY3JvCisKKyAgICBNQUNSTworICAgIE1fQ0FTRV9PRkZTRVQgJHJuZCwgJHByZWRpY3RUeXBlCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQyCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQzCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCAyIGtpbmRzIG9mIHJvdW5kaW5nICJjYXNlcyIgZm9yIGVhY2ggcHJlZGljdFR5cGUgaW4gdGhlIAorICAgIDsvLyAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcHJlZGljdFR5cGUKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX0NBU0VfT0ZGU0VUIiBtYWNyb3MKKworICAgIE1BQ1JPCisgICAgTV9DQVNFX01DUkVDT05CTE9DSyAkcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFX09GRlNFVCAgMCwgJHByZWRpY3RUeXBlIDsvLyAwIGZvciByb3VuZGluZworICAgICAgICBNX0NBU0VfT0ZGU0VUICAxLCAkcHJlZGljdFR5cGUgOy8vIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCA4IGtpbmRzIG9mIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb25zIGhhbmRsaW5nIG1hY3JvcyAKKyAgICA7Ly8gZm9yIHRoZSBzcGVjaWZpZWQgcHJlZGljdFR5cGUuIEluIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUsIAorICAgIDsvLyByb3VuZGluZyBpcyBub3QgcmVxdWlyZWQgc28gc2FtZSBjb2RlIHNlZ21lbnQgaGFuZGxlcyBib3RoIGNhc2VzCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0sgICAgJHByZWRpY3RUeXBlCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiIgbWFjcm9zIGZvciBzcGVjaWZpZWQgCisgICAgOy8vIHByZWRpY3RUeXBlLiBFYWNoIAorICAgIDsvLyAgICAgICAgICAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiAkcm5kLCAkb2Zmc2V0IAorICAgIDsvLyBpcyBhbiBjb2RlIHNlZ21lbnQgKHN0YXJ0aW5nIHdpdGggYSBsYWJlbCBpbmRpY2F0aW5nIHRoZSBwcmVkaWN0VHlwZSwgCisgICAgOy8vIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb24pCisgICAgOy8vIEZvdXIgY2FsbHMgb2YgdGhpcyBtYWNybyB3aXRoIHRoZSA0IHByZWRpY3Rpb24gbW9kZXMgcG9wdWxhdGUgYWxsIHRoZSAzMiAKKyAgICA7Ly8gaGFuZGxlcnMKKworICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAwCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAxCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAyCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAzCisgICAgSUYgIiRwcmVkaWN0VHlwZSIgLz0gIkludGVnZXJQaXhlbCIgOy8vIElmIG5vdCBJbnRlZ2VyUGl4ZWwgdGhlbiByb3VuZGluZyBtYWtlcyBhIGRpZmZlcmVuY2UKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDAKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDEKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDIKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDMKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKK2FyZ19wU3JjUmVzaWR1ZSAgICAgICBSTiAyCitwU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMTIKK3BEc3QgICAgICAgICAgICAgICAgICBSTiAzCitkc3RTdGVwICAgICAgICAgICAgICAgUk4gMgorcHJlZGljdFR5cGUgICAgICAgICAgIFJOIDEwCitybmRWYWwgICAgICAgICAgICAgICAgUk4gMTEKK21hc2sgICAgICAgICAgICAgICAgICBSTiAxMQorCis7Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3plcm8gICAgICAgICAgICAgICAgICBSTiAxMgoreSAgICAgICAgICAgICAgICAgICAgIFJOIDE0CisKK3RtcDEgICAgICAgICAgICAgICAgICBSTiA0Cit0bXAyICAgICAgICAgICAgICAgICAgUk4gNQordG1wMyAgICAgICAgICAgICAgICAgIFJOIDYKK3RtcDQgICAgICAgICAgICAgICAgICBSTiA3Cit0bXA1ICAgICAgICAgICAgICAgICAgUk4gOAordG1wNiAgICAgICAgICAgICAgICAgIFJOIDkKK3RtcDcgICAgICAgICAgICAgICAgICBSTiAxMAordG1wOCAgICAgICAgICAgICAgICAgIFJOIDExCit0bXA5ICAgICAgICAgICAgICAgICAgUk4gMTIKKwordDAwICAgICAgICAgICAgICAgICAgIFJOIDQKK3QwMSAgICAgICAgICAgICAgICAgICBSTiA1Cit0MTAgICAgICAgICAgICAgICAgICAgUk4gNgordDExICAgICAgICAgICAgICAgICAgIFJOIDcKK3QyMCAgICAgICAgICAgICAgICAgICBSTiA4Cit0MjEgICAgICAgICAgICAgICAgICAgUk4gOQordDMwICAgICAgICAgICAgICAgICAgIFJOIDEwCit0MzEgICAgICAgICAgICAgICAgICAgUk4gMTEKK3RtcCAgICAgICAgICAgICAgICAgICBSTiAxMgorCit5TWFzayAgICAgICAgICAgICAgICAgUk4gMTQKKworZHN0ICAgICAgICAgICAgICAgICAgIFJOIDEKK3JldHVybiAgICAgICAgICAgICAgICBSTiAwCisKKyAgICA7Ly8gQWxsb2NhdGUgbWVtb3J5IG9uIHN0YWNrCisgICAgTV9BTExPQzQgICAgU3RrX3BEc3QsICAgICAgICAgICA0CisgICAgTV9BTExPQzQgICAgU3RrX3BTcmNSZXNpZHVlLCAgICA0CisgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgIE1fU1RBUlQgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2ssIHIxMQorICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0CisgICAgOy8vIFNhdmUgb24gc3RhY2sKKyAgICBNX1NUUiAgICAgICBwRHN0LCBTdGtfcERzdAorICAgIE1fU1RSICAgICAgIGFyZ19wU3JjUmVzaWR1ZSwgU3RrX3BTcmNSZXNpZHVlCisgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAorICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKKyAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKKyAgICAKKyAgICBNT1YgICAgICAgICB5LCAjOAorICAgIAorICAgIEFORCAgICAgICAgIHRtcDEsIHBTcmMsICMzCisgICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHRtcDEsIHByZWRpY3RUeXBlLCBMU0wgIzMKKyAgICBPUlIgICAgICAgICBwcmVkaWN0VHlwZSwgcHJlZGljdFR5cGUsIHJuZFZhbCwgTFNMICMyCisgICAgOy8vIFRydW5jYXRpbmcgc291cmNlIHBvaW50ZXIgdG8gYWxpZ24gdG8gNCBieXRlIGxvY2F0aW9uCisgICAgQklDICAgICAgICAgcFNyYywgcFNyYywgIzMKKworICAgIDsvLyBJbXBsZW1lbnRhdGlvbiB0YWtlcyBjYXJlIG9mIGFsbCBjb21iaW5hdGlvbnMgb2YgZGlmZmVyZW50IAorICAgIDsvLyBwcmVkaWN0VHlwZXMsIHJvdW5kaW5nIGNhc2VzIGFuZCBzb3VyY2UgcG9pbnRlciBvZmZzZXRzIHRvIGFsaWdubWVudCAKKyAgICA7Ly8gb2YgNCBieXRlcyBpbiBkaWZmZXJlbnQgY29kZSBiYXNlcyB1bmxlc3Mgb25lIG9mIHRoZXNlIHBhcmFtZXRlciB3YXNuJ3QgCisgICAgOy8vIG1ha2luZyBhbnkgZGlmZmVyZW5jZSB0byB0aGUgaW1wbGVtZW50YXRpb24uIEJlbG93IE1fQ0FTRV9NQ1JFQ09OQkxPQ0sKKyAgICA7Ly8gbWFjcm9zIGJyYW5jaCBpbnRvIDggTV9DQVNFIG1hY3JvcyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgMiAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYW5kIDQgb2Zmc2V0cyBvZiB0aGUgcFNyYyBwb2ludGVyIHRvIHRoZSA0IGJ5dGUgCisgICAgOy8vIGFsaWdubWVudC4gCisgICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCisgICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWQorICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFhZCisgICAgTV9FTkRTV0lUQ0gKKworICAgIDsvLyBUaGUgTV9NQ1JFQ09OQkxPQ0sgbWFjcm9zIHBvcHVsYXRlIHRoZSBjb2RlIGJhc2VzIGJ5IGNhbGxpbmcgYWxsIDggCisgICAgOy8vIHBhcnRpY3VsYXIgbWFjcm9zICg0IGluIGNhc2Ugb2YgSW50ZWdlclBpeGVsIGFzIHJvdW5kaW5nIG1ha2VzIG5vIAorICAgIDsvLyBkaWZmZXJlbmNlIHRoZXJlKSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgYWxsIGNhc2VzIG9mIHJvdW5kaW5nIGFuZCAKKyAgICA7Ly8gb2Zmc2V0cy4gTFRPUkcgaXMgdXNlZCB0byBzZWdtZW50IHRoZSBjb2RlIGFzIGNvZGUgc2l6ZSBibG9hdGVkIGJleW9uZCAKKyAgICA7Ly8gNEtCLgorICAgIE1fTUNSRUNPTkJMT0NLIEludGVnZXJQaXhlbAorICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFgKKyAgICBMVE9SRworICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKKyAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQorU3dpdGNoUHJlZGljdFR5cGVFbmQKKworICAgIDsvLyBSZXNpZHVlIEFkZGl0aW9uCisgICAgOy8vIFRoaXMgaXMgZG9uZSBpbiAyIGxhbmUgU0lNRCB0aG91Z2ggbG9hZHMgYXJlIGZ1cnRoZXIgb3B0aW1pemVkIGFuZAorICAgIDsvLyA0IGJ5dGVzIGFyZSBsb2FkZWQgaW4gY2FzZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIuIEFsZ29yaXRobWljIAorICAgIDsvLyBkZXRhaWxzIGFyZSBpbiBpbmxpbmVkIGNvbW1lbnRzCisgICAgTV9MRFIgICAgICAgcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQorICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAorICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCitwU3JjUmVzaWR1ZU5vdE51bGwgICAgCisgICAgTV9MRFIgICAgICAgcERzdCwgU3RrX3BEc3QKKyAgICBNT1YgICAgICAgICB5LCAjOAorICAgIFNVQiAgICAgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsICM0CitZbG9vcF9wU3JjUmVzaWR1ZU5vdE51bGwKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMQorICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdICAgICAgICAgICAgICAgIDsvLyBkc3QgPSBbZGNiYV0KKyAgICBMRE1JQSAgICAgICBwU3JjUmVzaWR1ZSEsIHt0bXAxLCB0bXAyfSA7Ly8gdG1wMT1bRENdIHRtcDI9W0JBXQorICAgIFBLSEJUICAgICAgIHRtcDMsIHRtcDEsIHRtcDIsIExTTCAjMTYgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXQorICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQorICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdCAgICAgICAgICAgICAgICAgIDsvLyB0bXAxID0gWzBjMGFdCisgICAgVVhUQjE2ICAgICAgdG1wMiwgZHN0LCBST1IgIzggICAgICAgICAgOy8vIHRtcDIgPSBbMGQwYl0KKyAgICBRQUREMTYgICAgICB0bXAxLCB0bXAxLCB0bXAzICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCisgICAgUUFERDE2ICAgICAgdG1wMiwgdG1wMiwgdG1wNAorICAgIFVTQVQxNiAgICAgIHRtcDEsICM4LCB0bXAxCisgICAgVVNBVDE2ICAgICAgdG1wMiwgIzgsIHRtcDIgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwgMjU1LCB0bXAyKQorICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOCAgIDsvLyB0bXAxID0gW2RjYmFdCisgICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCAjNAorICAgIAorICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdCisgICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0KKyAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2CisgICAgUEtIVEIgICAgICAgdG1wNCwgdG1wMiwgdG1wMSwgQVNSICMxNgorICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdAorICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4CisgICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMworICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKKyAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQorICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyCisgICAgT1JSICAgICAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisgICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCBkc3RTdGVwCisgICAgCisgICAgQkdUICAgICAgICAgWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCitwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAorCisgICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKQEAgLTAsMCArMSwyODMgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICogRGVzY3JpcHRpb246Cis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCis7ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKzsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCis7ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KKzsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCis7ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAorOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCis7ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKzsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCis7ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKzsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKzsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCis7ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCis7ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCis7ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCis7ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCis7ICogICA0LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqKioqKioqKioKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgICAgICAKKworICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgIAorCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisKKworOy8vIElucHV0IEFyZ3VtZW50cworCitwU3JjRHN0ICAgICAgICAgIFJOIDAKK3BQcmVkQnVmUm93ICAgICAgUk4gMQorcFByZWRCdWZDb2wgICAgICBSTiAyCitjdXJRUCAgICAgICAgICAgIFJOIDMKK1FQICAgICAgICAgICAgICAgUk4gMworcHJlZFFQICAgICAgICAgICBSTiA0CitwcmVkRGlyICAgICAgICAgIFJOIDUKK0FDUHJlZEZsYWcgICAgICAgUk4gNgordmlkZW9Db21wICAgICAgICBSTiA3ICAKKworOy8vIExvY2FsIFZhcmlhYmxlcworCit0ZW1wMiAgICAgICAgICAgIFJOIDUKK25lZ0N1clFQICAgICAgICAgUk4gNworbmVnZGNTY2FsZXIgICAgICBSTiA3Cit0ZW1wUHJlZCAgICAgICAgIFJOIDgKKworZGNTY2FsZXIgICAgICAgICBSTiA0CitDb2VmZlRhYmxlICAgICAgIFJOIDkKK2Fic0NvZWZmREMgICAgICAgUk4gOQordGVtcDMgICAgICAgICAgICBSTiA2CithYnNDb2VmZkFDICAgICAgIFJOIDYKKworc2hvcnRWaWRlb0hlYWRlciBSTiA5CitwcmVkQ29lZmZUYWJsZSAgIFJOIDEwCitDb3VudCAgICAgICAgICAgIFJOIDEwCit0ZW1wMSAgICAgICAgICAgIFJOIDEyCitpbmRleCAgICAgICAgICAgIFJOIDEyCitSZW0gICAgICAgICAgICAgIFJOIDE0Cit0ZW1wICAgICAgICAgICAgIFJOIDExCitSZXR1cm4gICAgICAgICAgIFJOIDAKKworICAgICAgIAorCisgICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjEyCisgICAgICAgCisgICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKKyAgICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAorICAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0CisgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAorICAgICAgIAorICAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCisgICAgICAgCisgICAgICAgOy8vIGRjU2NhbGVyIENhbGN1bGF0aW9uCisKKyAgICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQorICAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisgICAgICAgICAgIAorICAgIAorY2FsRENWYWwKKyAgICAgIAorICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAorICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAorCisgICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wIHByZWQgYnkgcGVyZm9ybWluZyBEaXZpc2lvbgorICAgICAgICAgICAgCisgICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKKyAgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgorICAgICAgIAorICAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgIAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wcmVkaWN0aW9uIGNvZWZmCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vYWJzQ29lZmZEQz1hYnModGVtcDEpCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikKKyAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtID0gcFByZWRCdWZSb3coQ29sKVswXS10ZW1wUHJlZCpkY1NjYWxlciAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbF0KKyAgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUmVtPj1yb3VuZChkY1NjYWxlci8yKTt0ZW1wUHJlZD10ZW1wUHJlZCsxCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvIGlmIHBQcmVkQnVmUm93KENvbClbMF08MDsgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCisKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCisgICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcDEsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wMSxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wMSB0byBwUHJlZEJ1ZkNvbAorIAorICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCisKKyAgICAgICAgICAgICAgCisgICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAorICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzQKKyAgICAgICBNVUwgICAgICAgICAgICAgdGVtcDEsY3VyUVAsdGVtcDEKKyAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uCisgICAgICAgUlNCICAgICAgICAgICAgIG5lZ0N1clFQLGN1clFQLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBDb2VmZlRhYmxlLFtwcmVkQ29lZmZUYWJsZSx0ZW1wMV0gICAgICAgICAgICAgIDsvLyBDb2VmZlRhYmxlPTB4MWZmZmYvY3VyUVAKKyAgICAgICBBREQgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9Y3VyUVArMQorICAgICAgIExTUiAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1yb3VuZChjdXJRUC8yKSAgICAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBMb29wIENvdW50CisgICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCisKKyAgICAgICAKKworbG9vcDEgICAgICAgCisgICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAorICAgICAgIAorICAgICAgIExEUlNIICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPXBQcmVkQnVmUm93W2ldLCAxPTxpPD03CisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKKyAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz0gYWJzKHBQcmVkQnVmUm93W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZSb3dbaV0qcHJlZFFQCisgICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93W2ldKnByZWRRUCoweDFmZmZmL2N1clFQCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMgICAgICAgICAgICAgICA7Ly8gUmVtPWFicyhwUHJlZEJ1ZlJvd1tpXSktdGVtcFByZWQqY3VyUVAKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldLDE8PWk8OAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgUmVtPj1yb3VuZChjdXJRUC8yKTsgdGVtcFByZWQ9dGVtcFByZWQrMQorICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZlJvd1tpXTwwIDsgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgICAgICAgIAorICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9dGVtcFByZWQrcFNyY0RzdFtpXQorICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmUm93W2ldPXRlbXAKKyAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzEKKyAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpZiBpPTgKKyAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDEKKyAgICAgICBCICAgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQKKworSG9yaXpvbnRhbAorCisgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyBpPTgKKworbG9vcDIgIAorICAgICAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDIsQ291bnQsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDI9aT4+MworICAgICAgIAorICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKKyAgICAgICAKKyAgICAgICBMRFJIICAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZkFDPXBQcmVkQnVmQ29sW2k+PjNdICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQworICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NworICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPWFicyhwUHJlZEJ1ZkNvbFtpPj4zXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUAorICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAvY3VyUVAKKyAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgUmVtIHdpdGggcm91bmQoY3VyUVAvMikKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PXJvdW5kKGN1clFQLzIpCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmQ29sW2k+PjMgPDAgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgCisgICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKKyAgICAgICAKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldK3RlbXBQcmVkCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXT0gY2xpcHBlZCB2YWx1ZQorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZkNvbFtpPj4zXT10ZW1wCisgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSs4CisgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaSB3aXRoIDY0CisgICAgICAgQkxUICAgICAgICAgICAgIGxvb3AyCisKKyAgICAgICAgICAgICAKK0V4aXQKKyAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKKworICAgICAgIE1fRU5ECisgICAgICAgRU5ESUYKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU5MWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCkBAIC0wLDAgKzEsMTQxIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorOyAqIAorOyAqCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludGVyX0kKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgorOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCis7ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KKzsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gcFNyY0RzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSBRUCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQorOyAqIFtpbl0gdmlkZW9Db21wICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorOyAqICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgICAtIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgorOyAqICAgICAgb3IKKzsgKiAgICAtIElmIFFQIDw9IDAuCis7ICogICAgICBvcgorOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCis7ICoKKzsgKi8KKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAgCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyY0RzdCAgICAgICAgICAgIFJOIDAKK1FQICAgICAgICAgICAgICAgICBSTiAxCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICAgICAgICAgICAgIFJOIDAKK0NvdW50ICAgICAgICAgICAgICBSTiA0ICAgICAgCit0ZW1wVmFsMjEgICAgICAgICAgUk4gMgordGVtcFZhbDQzICAgICAgICAgIFJOIDMKK1FQMSAgICAgICAgICAgICAgICBSTiA1CitYMiAgICAgICAgICAgICAgICAgUk4gNgorWDMgICAgICAgICAgICAgICAgIFJOIDE0CitSZXN1bHQxICAgICAgICAgICAgUk4gOAorUmVzdWx0MiAgICAgICAgICAgIFJOIDkKK3R3byAgICAgICAgICAgICAgICBSTiA3CisKKyAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjkKKyAgICAgICAKKyAgICAgICAgTU9WICAgICAgQ291bnQsIzY0CisgICAgICAgIFRTVCAgICAgIFFQLCMxCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZHMgZmlyc3QgdHdvIHZhbHVlcyBvZiBwU3JjRHN0IHRvIHRlbXBWYWwyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZXh0IHR3byB2YWx1ZXMgdG8gdGVtcFZhbDQzCisgICAgICAgIFNVQkVRICAgIFFQMSxRUCwjMSAgICAgICAgICAgICAgICA7Ly8gUVAxPVFQIGlmIFFQIGlzIG9kZCAsIFFQMT1RUC0xIGlmIFFQIGlzIGV2ZW4KKyAgICAgICAgTU9WTkUgICAgUVAxLFFQCisgICAgICAgIE1PViAgICAgIHR3bywjMgorICAgICAgICAKKyAgICAgICAgCisKK0xvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwICAgICAgICAgICAgICAgICA7Ly8gWDI9YWJzb2x1dGV2YWwoZmlyc3QgdmFsKQorICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAgaWYgUVAgaXMgb2RkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAtMSBpZiBRUCBpcyBldmVuIAorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgzPSBzZWNvbmQgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBSU0JMVCAgICBYMixYMiwjMAorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDEsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MVswLTE1XT1YMlswLTE1XSxSZXN1bHQxWzE2LTMxXT1YM1sxNi0zMV0KKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDQzKSoyCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDEsIzEyLFJlc3VsdDEgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTEUgICAgWDIsWDIsIzAKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxCisgICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdCwjOF0gICA7Ly8gTG9hZCBuZXh0IGZvdXIgVmFsdWVzIHRvIHRlbXBWYWwyMSx0ZW1wVmFsNDMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDIsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MlswLTE1XT1YMlswLTE1XSxSZXN1bHQyWzE2LTMxXT1YM1swLTE1XQorICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIAorICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAorICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIEJHVCAgICAgIExvb3AKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjhlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKQEAgLTAsMCArMSwxODggQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorIAorCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgCisgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgCisgICAKKyAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgCisgICAgICAgICAKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKK3ZpZGVvQ29tcCAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK1JldHVybiAgICAgICAgICAgICBSTiAwCitkY1NjYWxlciAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgIFJOIDEyCitpbmRleCAgICAgICAgICAgICAgUk4gNgorICAgICAgCit0ZW1wVmFsMjEgICAgICAgICAgUk4gNAordGVtcFZhbDQzICAgICAgICAgIFJOIDUKK1FQMSAgICAgICAgICAgICAgICBSTiA2CitYMiAgICAgICAgICAgICAgICAgUk4gNworWDMgICAgICAgICAgICAgICAgIFJOIDE0CitSZXN1bHQxICAgICAgICAgICAgUk4gOAorUmVzdWx0MiAgICAgICAgICAgIFJOIDkKK3R3byAgICAgICAgICAgICAgICBSTiAxMAorQ291bnQgICAgICAgICAgICAgIFJOIDExCisKKworCisgICAKKyAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjExCisKKworICAgICAgICAKKyAgICAgICAgOy8vIFBlcmZvcm0gSW52ZXJzZSBRdWFudGl6YXRpb24gZm9yIERDIGNvZWZmaWNpZW50CisKKyAgICAgICAgVEVRICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICA7Ly8gVGVzdCBpZiBzaG9ydCBWaWRlbyBIZWFkZXIgZmxhZyA9MCAgICAgICAgICAgICAKKyAgICAgICAgTU9WTkUgICAgIGRjU2NhbGVyLCM4ICAgICAgICAgICAgICA7Ly8gaWYgc2hvcnRWaWRlb0hlYWRlciBpcyBub24gemVybyBkY1NjYWxlcj04CisgICAgICAgIEJORSAgICAgICBjYWxEQ1ZhbAorICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1CisgICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQorCisKKyAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCisKK2NhbERDVmFsCisKKyAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KKyAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCisgICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCisgICAgICAgIAorCisgICAgICAgIE1PViAgICAgIENvdW50LCM2NAorICAgICAgICBUU1QgICAgICBRUCwjMQorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3RdICAgICAgOy8vIExvYWRzIGZpcnN0IHR3byB2YWx1ZXMgb2YgcFNyY0RzdCB0byB0ZW1wVmFsMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmV4dCB0d28gdmFsdWVzIHRvIHRlbXBWYWw0MworICAgICAgICBTVUJFUSAgICBRUDEsUVAsIzEgICAgICAgICAgICAgICAgOy8vIFFQMT1RUCBpZiBRUCBpcyBvZGQgLCBRUDE9UVAtMSBpZiBRUCBpcyBldmVuCisgICAgICAgIE1PVk5FICAgIFFQMSxRUAorICAgICAgICBNT1YgICAgICB0d28sIzIKKworCisgICAgICAgICAgICAgICAgCisgICAgICAgIAorCitMb29wCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMixYMiwjMCAgICAgICAgICAgICAgICAgOy8vIFgyPWFic29sdXRldmFsKGZpcnN0IHZhbCkKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQIGlmIFFQIGlzIG9kZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQLTEgaWYgUVAgaXMgZXZlbiAKKyAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMz0gc2Vjb25kIHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQxLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDFbMC0xNV09WDJbMC0xNV0sUmVzdWx0MVsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWw0MykqMgorICAgICAgICBTU0FUMTYgICBSZXN1bHQxLCMxMixSZXN1bHQxICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxFICAgIFgyLFgyLCMwCisgICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMQorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgIAorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3QsIzhdICAgOy8vIExvYWQgbmV4dCBmb3VyIFZhbHVlcyB0byB0ZW1wVmFsMjEsdGVtcFZhbDQzCisgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQyLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDJbMC0xNV09WDJbMC0xNV0sUmVzdWx0MlsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgTG9vcAorCisgICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmluZyB0aGUgSW52ZXJzZSBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQKKworICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgorICAgICAgICAKKyAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2MyZDcwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUCkBAIC0wLDAgKzEsNjMgQEAKK1RoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCitvZiBBUk0gb24gMTktRmViLTIwMDguCisKK0l0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCisKK1RoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0CitpcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KKworSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0CitxdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTQ+LgorCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKKy0gT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEKKyAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKKyAgVjcgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKKyAgaW50ZXJuYWwgYWNjZXNzCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKK2JldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCisKK0JldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50CittdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKK3NvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQorY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCitCdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKK3RoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQorYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgordGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKK2F0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCityZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQorZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKK2RhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCitCeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAordG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCitkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAord2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQord2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAorbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KKworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0luIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwordHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KKworVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDE0LlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Citub3RlLgorCitUaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCitmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KKworVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KK01ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCisKK1RoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQorIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6CisKKyAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODMxMGY2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUCkBAIC0wLDAgKzEsOTEgQEAKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAorZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKKzRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCis4YWM1ZmE4MGVhOThlMzkxZjU3MzBhMzc1MjgwYjViZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCiszYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKKzUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitmODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCis4ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKKzMyMzAwOGI3MmU5ZjA0MDk5YThjYjQyZTk5YTFmYWNlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAorZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLworNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCitkNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKzg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCis1ZjcyMTNhNGYzNzYyN2IzYzU4ZjYyOTRiYTQ3N2UzMCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworZDA2NmUzYzgxZDgyNjE2ZjM3ZWMxODEwZWE0OWU3YjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKK2ZlNjI5YTNlOWQ1NTM5NWE2MDk4YmRmMjQzMWI1ZjAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzViMTNmYjk1NGI3Njc5ZGUyMDA3NmJiNmE3ZjRlZTFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCiswMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCitmYTEwNzJjZjFkMTdlOTY2NmM5ZjFlMjE1ZmEzMDJiMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworZGIzODdiOWU2NmQzMjc4N2Y0N2VmOWNmMDM0N2RhMmEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCitlYTUzN2U0ZTJhZDAzYTE5NDA5ODEwNTVmYTNhY2UwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworMjlhNDI4Mzg4NWI5NDczYTM1NTBhODFlZmYyNTU5ZDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCithMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworYzkyMWRmNzMzOTdhMzJjOTQ3ZGM5OTZiYTY4NTg1NTMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCiszNzY5ZTE0ZjJmYzNmNTE0ZDAyNWZlNmFiNzNmZjY3YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworYzAyOWQxY2ViZWEwYTA5ZTFkMjM1YTM3ZTIxNTUwMDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworMDc2YTAzM2Y4MTYxNzUwYTY4NTc1NmY5ZjUxZjA0YzkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCitjNWI1ZDIyODQyODIyZTZlNWUzMTA5NDg4MmNiZWI0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworZjZiZGY2ZDkxNGE0YTE0NzlmNTI0OTUxYTM0MDk4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworZWJlYjA3MTNhOWIyZWEyNTk4NjM2MGVmMjYyMTM4YzQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKzc4ZWQ5ZWEyMDBmYWE3YmU2NjU0NDVhNzEzODU5YWYxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCitjMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzQwYmVkNjc5YTlmNmUwZDNlZmUyMTZiN2Q0YTljZjQ1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzI1MTNiNjA1NTliYTcxYWU0OTVjNjA1M2ZiNzc5ZmE5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisyZmIxZWUxN2MzNmUzYzE0NjljMTcwZjZkYWMxMWJmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCitjYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCis2ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLworYmVjNmRlMzQ4YjExMzQzODQ5ODg2N2I4NjkwMDE2MjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKK2RiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworZGZhN2U1YjU4MDI3YmUzNTQyZGRhMDU5M2I3N2IyZDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis0ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworMzk5OTE5NjExNzljYTAzYjYzODFiNmU2NTNiMWYxNGIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisxYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisxYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis0ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisyZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworNmNlMzYzYWFkYzlkNjVjMzA4YjQwY2NhODkwMmU0ZjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworYmYyMTJmNzg2NzcyYWVkMmJjNzA1ZDIyZmY0ZTc0ZjUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworMmJiNDdlZDljOWUyNWM1NzA5YzZkOWI0YWQzOWEzOGEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCis0MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworYmM5Nzc4ODk4ZGQ0MTEwMWRjMGZiMDEzOWVhZjgzY2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKK2ZjMTkxZWVhZTQzZjhjZTczNWRiZDMxMWNjN2JjYjhkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCis0NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCis2NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLworZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KKzdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAorMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCisxMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAorYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCisxZjgxMTg3YjQ4NDg3YThlYTZkYmMzMjc2NDhlM2U0ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKzkzNmQzZjIwMzhhNmY4NjEzZWMyNWU1MGNjNjAxZmU4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKzhmNjcwOGEyNDkxMzA5NjJlMGJjNWMwNDRhYzZkZDkzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKK2FhYjc3MTM0MTQ0MjhlOTVkZTBiYTc5OWEyNjc5YjM2ICBBUk1fREVMSVZFUllfOTc0MTQuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0YzE5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApAQCAtMCwwICsxLDc4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqCisgKi8KKyAKKyAgCisjaWZuZGVmIF9hcm1Db21tb25fSF8KKyNkZWZpbmUgX2FybUNvbW1vbl9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KK3R5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOworCisKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21waWxlciBleHRlbnNpb25zICovCisjaWZkZWYgQVJNX0RFQlVHCisvKiBkZWJ1ZyB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9CisjZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KKyNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCisjZWxzZSAKKy8qIHJlbGVhc2UgdmVyc2lvbiAqLworI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKKyNlbmRpZiAvKiBBUk1fREVCVUcgKi8KKworLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCisjZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQorI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKKworLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLworCisjZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQorI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQorI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQorI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQorI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKKworLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLworCisjZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisjZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisKKyNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQorI2Vsc2UKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCisKKyNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKKyNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorIAorT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgICAgIE9NWF9JTlQgbWluLAorICAgICAgICBPTVhfSU5UIG1heCwgCisgICAgICAgIE9NWF9TMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgICAgIE9NWF9GMzIgbWluLAorICAgICAgICBPTVhfRjMyIG1heCwgCisgICAgICAgIE9NWF9GMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKKyAgICAgICAgT01YX0YzMiB2LCAKKyAgICAgICAgT01YX0lOVCBzaGlmdCwgCisgICAgICAgIE9NWF9JTlQgc2F0Qml0cworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKyAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKyAgICApOyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRBZGRfUzMyKAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYnVnZ2luZyBtYWNyb3MKKyAqCisgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKKyAqLworI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0CisKKy8qCisgKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCisgKiBBZGQgbW9yZSBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBERUJVR19PTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKKyNlbHNlIC8qIERFQlVHX09OICovCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCisjZW5kaWYgLyogREVCVUdfT04gKi8KKworCisvKgorICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCisgKgorICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCisgKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCisgKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KKyAqLworCisjaWZkZWYgREVCVUdfRE9NQUlOX0FDCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9WQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lDCisvKiBUbyBiZSBmaWxsZWQgaW4gKi8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1NQCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSVAKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCisKKworI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KKworLypFbmQgb2YgRmlsZSovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzczOGY3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCkBAIC0wLDAgKzEsNjcwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdERlY19zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIAorOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCis7Ly8KKzsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCis7Ly8KKzsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCis7Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKKzsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKKzsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgorOy8vCis7Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAorOy8vCis7Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKzsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQorOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQorOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKzsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQorOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKzsvLworOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKKzsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCis7Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorOy8vCis7Ly8gVVNBR0U6Cis7Ly8KKzsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgorOy8vCis7Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAorOy8vCis7Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQorOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCis7Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKKzsvLyBjYWxsIE1fQkRfRklOSS4KKzsvLworOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Cis7Ly8KKzsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQorOy8vCis7Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKKzsvLworOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAorOy8vCis7Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KKzsvLworOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCis7Ly8gdmFyaWFibGVzOgorOy8vCisKKyAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQorICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKKyAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKKyAgIAorOy8vICAgICAgICAKKzsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQorOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCis7Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCis7Ly8KKzsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Cis7Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCis7Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Cis7Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKKzsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKKzsvLworOy8vCisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQorICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKKyAgICAgICAgOy8vIHNjaGVkdWxpbmcuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQorICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKKyAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKKworcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCitCaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKK0JpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkIGlucHV0cworICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQorICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCisgICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQorICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KKyAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMworICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAorICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgorICAgICAgICBNRU5EICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cworICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQorICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQorICAgICAgICBJRiAoJE48PTgpCisgICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEVMU0UgICAgICAgIAorICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCisgICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQorICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQorICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gYnVmZmVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KKyAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04CisgICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKKyAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKKyAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQorICAgICAgICAKKyAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0CisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCisgICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKKzAxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCisgICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5CisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKKyAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKKyAgICAgICAgQkNTICAgICAlRlQwMgorICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKKyAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKKyAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1CisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAorICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAorICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5CiswMgorICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQorICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1CisgICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQorICAgICAgICAKKyAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAorICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKKworICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKKyAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKKyAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3CisgICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKKyAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4CisKKyAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKKyAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKKyAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCisgICAgICAgIAorICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCisKKyAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKKyAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4CisgICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNworICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICAKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKKyAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKKyAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKKyAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAorICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCisgICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjY5OTAzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApAQCAtMCwwICsxLDIxMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjZmRhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZSAgICAgICAgIDogYXJtQ09NTV9JRENUVGFibGUuaAorICogRGVzY3JpcHRpb24gIDogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRhYmxlcyBmb3IgSURDVCBjYWxjdWxhdGlvbi4KKyAqCisgKi8KKyAgCisjaWZuZGVmIF9hcm1DT01NX0lEQ1RUYWJsZV9IXworI2RlZmluZSBfYXJtQ09NTV9JRENUVGFibGVfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQorICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKKyAgICAgICogIHMoNik9Mi4wCisgICAgICAqICBzKDcpPTQuMAorICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQorICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCisJICAqLworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdOworCisjZW5kaWYgLyogX2FybUNPTU1fSURDVFRhYmxlX0hfICovCisKKworLyogRW5kIG9mIEZpbGUgKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiYWEwODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKQEAgLTAsMCArMSwxNDUxIEBACis7Ly8KKzsvLyBUaGlzIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgc29mdHdhcmUgbWF5IGJlIHVzZWQgb25seSBhcworOy8vIGF1dGhvcmlzZWQgYnkgYSBsaWNlbnNpbmcgYWdyZWVtZW50IGZyb20gQVJNIExpbWl0ZWQKKzsvLyAgIChDKSBDT1BZUklHSFQgMjAwNCBBUk0gTGltaXRlZAorOy8vICAgICAgIEFMTCBSSUdIVFMgUkVTRVJWRUQKKzsvLyBUaGUgZW50aXJlIG5vdGljZSBhYm92ZSBtdXN0IGJlIHJlcHJvZHVjZWQgb24gYWxsIGF1dGhvcmlzZWQKKzsvLyBjb3BpZXMgYW5kIGNvcGllcyBtYXkgb25seSBiZSBtYWRlIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkCis7Ly8gYnkgYSBsaWNlbnNpbmcgYWdyZWVtZW50IGZyb20gQVJNIExpbWl0ZWQuCis7Ly8KKzsvLyBJRENUX3MucworOy8vCis7Ly8gSW52ZXJzZSBEQ1QgbW9kdWxlCis7Ly8KKzsvLyAKKzsvLyBBTEdPUklUSE0gREVTQ1JJUFRJT04KKzsvLworOy8vIFRoZSA4eDggMkQgSURDVCBpcyBwZXJmb3JtZWQgYnkgY2FsY3VsYXRpbmcgYSAxRCBJRENUIGZvciBlYWNoCis7Ly8gY29sdW1uIGFuZCB0aGVuIGEgMUQgSURDVCBmb3IgZWFjaCByb3cuCis7Ly8KKzsvLyBUaGUgOC1wb2ludCAxRCBJRENUIGlzIGRlZmluZWQgYnkKKzsvLyAgIGYoeCkgPSAoQygwKSpUKDApKmMoMCx4KSArIC4uLiArIEMoNykqVCg3KSpjKDcseCkpLzIKKzsvLworOy8vICAgQyh1KSA9IDEvc3FydCgyKSBpZiB1PTAgb3IgMSBpZiB1IT0wCis7Ly8gICBjKHUseCkgPSBjb3MoICgyeCsxKSp1KnBpLzE2ICkKKzsvLworOy8vIFdlIGNvbXB1dGUgdGhlIDgtcG9pbnQgMUQgSURDVCB1c2luZyB0aGUgcmV2ZXJzZSBvZgorOy8vIHRoZSBBcmFpLUFndWktTmFrYWppbWEgZmxvdyBncmFwaCB3aGljaCB3ZSBzcGxpdCBpbnRvCis7Ly8gNSBzdGFnZXMgbmFtZWQgaW4gcmV2ZXJzZSBvcmRlciB0byBpZGVudGlmeSB3aXRoIHRoZQorOy8vIGZvcndhcmQgRENULiBEaXJlY3QgaW52ZXJzaW9uIG9mIHRoZSBmb3J3YXJkIGZvcm11bGFlCis7Ly8gaW4gZmlsZSBGRENUX3MucyBnaXZlczoKKzsvLworOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkgIFsgQSh1KT00KkModSkqYyh1LDApIF0KKzsvLyAgICAgICAgICAgICBbIEEoMCkgPSAyKnNxcnQoMikKKzsvLyAgICAgICAgICAgICAgIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKSBdCis7Ly8KKzsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKKzsvLyAgICAgICAgICAgICBpMyA9IChqMitqNikvMiAgICAgIGkyID0gKGoyLWo2KS8yCis7Ly8gICAgICAgICAgICAgaTcgPSAoajUrajMpLzIgICAgICBpNCA9IChqNS1qMykvMgorOy8vICAgICAgICAgICAgIGk1ID0gKGoxK2o3KS8yICAgICAgaTYgPSAoajEtajcpLzIKKzsvLworOy8vIElTdGFnZSAzOiAgIGgwID0gKGkwK2kxKS8yICAgICAgaDEgPSAoaTAtaTEpLzIKKzsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKKzsvLyAgICAgICAgICAgICBoNCA9ICBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYKKzsvLyAgICAgICAgICAgICBoNiA9IC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYKKzsvLyAgICAgICAgICAgICBbIFRoZSBhYm92ZSB0d28gbGluZXMgcm90YXRlIGJ5IC0ocGkvOCkgXQorOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KS9zcXJ0MiAgaDcgPSAoaTUraTcpLzIgCis7Ly8gICAgICAgICAgICAgCis7Ly8gSVN0YWdlIDI6ICAgZzAgPSAoaDAraDMpLzIgICAgICBnMyA9IChoMC1oMykvMgorOy8vICAgICAgICAgICAgIGcxID0gKGgxK2gyKS8yICAgICAgZzIgPSAoaDEtaDIpLzIKKzsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNworOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Cis7Ly8KKzsvLyBJU3RhZ2UgMTogICBmMCA9IChnMCtnNykvMiAgICAgIGY3ID0gKGcwLWc3KS8yCis7Ly8gICAgICAgICAgICAgZjEgPSAoZzErZzYpLzIgICAgICBmNiA9IChnMS1nNikvMgorOy8vICAgICAgICAgICAgIGYyID0gKGcyK2c1KS8yICAgICAgZjUgPSAoZzItZzUpLzIKKzsvLyAgICAgICAgICAgICBmMyA9IChnMytnNCkvMiAgICAgIGY0ID0gKGczLWc0KS8yCis7Ly8KKzsvLyBOb3RlIHRoYXQgbW9zdCBjb2VmZmljaWVudHMgYXJlIGhhbHZlZCAzIHRpbWVzIGR1cmluZyB0aGUKKzsvLyBhYm92ZSBjYWxjdWxhdGlvbi4gV2UgY2FuIHJlc2NhbGUgdGhlIGFsZ29yaXRobSBkaXZpZGluZworOy8vIHRoZSBpbnB1dCBieSA4IHRvIHJlbW92ZSB0aGUgaGFsdmluZ3MuCis7Ly8KKzsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpLzgKKzsvLworOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAorOy8vICAgICAgICAgICAgIGkzID0gajIgKyBqNiAgICAgICAgaTIgPSBqMiAtIGo2Cis7Ly8gICAgICAgICAgICAgaTcgPSBqNSArIGozICAgICAgICBpNCA9IGo1IC0gajMKKzsvLyAgICAgICAgICAgICBpNSA9IGoxICsgajcgICAgICAgIGk2ID0gajEgLSBqNworOy8vCis7Ly8gSVN0YWdlIDM6ICAgaDAgPSBpMCArIGkxICAgICAgICBoMSA9IGkwIC0gaTEKKzsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKKzsvLyAgICAgICAgICAgICBoNCA9IDIqKCBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYpCis7Ly8gICAgICAgICAgICAgaDYgPSAyKigtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2KQorOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KSpzcXJ0MiAgaDcgPSBpNSArIGk3IAorOy8vICAgICAgICAgICAgIAorOy8vIElTdGFnZSAyOiAgIGcwID0gaDAgKyBoMyAgICAgICAgZzMgPSBoMCAtIGgzCis7Ly8gICAgICAgICAgICAgZzEgPSBoMSArIGgyICAgICAgICBnMiA9IGgxIC0gaDIKKzsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNworOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Cis7Ly8KKzsvLyBJU3RhZ2UgMTogICBmMCA9IGcwICsgZzcgICAgICAgIGY3ID0gZzAgLSBnNworOy8vICAgICAgICAgICAgIGYxID0gZzEgKyBnNiAgICAgICAgZjYgPSBnMSAtIGc2Cis7Ly8gICAgICAgICAgICAgZjIgPSBnMiArIGc1ICAgICAgICBmNSA9IGcyIC0gZzUKKzsvLyAgICAgICAgICAgICBmMyA9IGczICsgZzQgICAgICAgIGY0ID0gZzMgLSBnNAorOy8vCis7Ly8gTm90ZToKKzsvLyAxLiBUaGUgc2NhbGluZyBieSBBKHUpLzggY2FuIG9mdGVuIGJlIGNvbWJpbmVkIHdpdGggaW52ZXJzZQorOy8vICAgIHF1YW50aXphdGlvbi4gVGhlIGNvbHVtbiBhbmQgcm93IHNjYWxpbmdzIGNhbiBiZSBjb21iaW5lZC4KKzsvLyAyLiBUaGUgZmxvd2dyYXBoIGluIHRoZSBBQU4gcGFwZXIgaGFzIGg0LGc2IG5lZ2F0ZWQgY29tcGFyZWQKKzsvLyAgICB0byB0aGUgYWJvdmUgY29kZSBidXQgaXMgb3RoZXJ3aXNlIGlkZW50aWNhbC4KKzsvLyAzLiBUaGUgcm90YXRpb24gYnkgLXBpLzggY2FuIGJlIHBlZm9ybWVkIHVzaW5nIHRocmVlIG11bHRpcGxpZXMKKzsvLyAgICBFZyAgYyppNCtzKmk2ID0gKGk2LWk0KSpzICsgKGMrcykqaTQKKzsvLyAgICAgICAtcyppNCtjKmk2ID0gKGk2LWk0KSpzICsgKGMtcykqaTYKKzsvLyA0LiBJZiB8VCh1KXw8PTEgdGhlbiBmcm9tIHRoZSBJRENUIGRlZmluaXRpb24sCis7Ly8gICAgfGYoeCl8IDw9ICgoMS9zcXJ0MikgKyB8YygxLHgpfCArIC4uICsgfGMoNyx4KXwpLzIKKzsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIGNvcyhwaS8xNikgKyAuLi4gKyBjb3MoNypwaS8xNikpLzIKKzsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIChjb3QocGkvMzIpLTEpLzIpLzIKKzsvLyAgICAgICAgICAgID0gKDEgKyBjb3MocGkvMTYpICsgY29zKDJwaS8xNikgKyBjb3MoM3BpLzE2KSkvc3FydCgyKQorOy8vICAgICAgICAgICAgPSAoYXBwcm94KTIuNjQKKzsvLyAgICBTbyB0aGUgbWF4IGdhaW4gb2YgdGhlIDJEIElEQ1QgaXMgfng3LjAgPSAzIGJpdHMuCis7Ly8gICAgVGhlIHRhYmxlIGJlbG93IHNob3dzIGlucHV0IHBhdHRlcm5zIGdlbmVyYXRpbmcgdGhlIG1heGltdW0KKzsvLyAgICB2YWx1ZSBvZiB8Zih1KXwgZm9yIGlucHV0IGluIHRoZSByYW5nZSB8VCh4KXw8PTEuIE09LTEsIFA9KzEKKzsvLyAgICBJbnB1dFBhdHRlcm4gICAgICBNYXggfGYoeCl8Cis7Ly8gICAgICBQUFBQUFBQUCAgICAgICAgfGYwfCA9ICAyLjY0Cis7Ly8gICAgICBQUFBNTU1NTSAgICAgICAgfGYxfCA9ICAyLjY0Cis7Ly8gICAgICBQUE1NTVBQUCAgICAgICAgfGYyfCA9ICAyLjY0Cis7Ly8gICAgICBQUE1NUFBNTSAgICAgICAgfGYzfCA9ICAyLjY0Cis7Ly8gICAgICBQTU1QUE1NUCAgICAgICAgfGY0fCA9ICAyLjY0Cis7Ly8gICAgICBQTU1QTU1QTSAgICAgICAgfGY1fCA9ICAyLjY0Cis7Ly8gICAgICBQTVBQTVBNUCAgICAgICAgfGY2fCA9ICAyLjY0Cis7Ly8gICAgICBQTVBNUE1QTSAgICAgICAgfGY3fCA9ICAyLjY0Cis7Ly8gICBOb3RlIHRoYXQgdGhpcyBpbnB1dCBwYXR0ZXJuIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlCis7Ly8gICBjb3JyZXNwb25kaW5nIG1heCBpbnB1dCBwYXR0ZXIgZm9yIHRoZSBGRENULgorCis7Ly8gQXJndW1lbnRzCisKK3BTcmMgICAgUk4gMCAgICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCitTdHJpZGUgIFJOIDEgICAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcworcERlc3QgICBSTiAyICAgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgorcFNjYWxlICBSTiAzICAgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworCisgICAgICAgIDsvLyBEQ1QgSW52ZXJzZSBNYWNybworICAgICAgICA7Ly8gVGhlIERDVCBjb2RlIHNob3VsZCBiZSBwYXJhbWV0cml6ZWQgYWNjb3JkaW5nCisgICAgICAgIDsvLyB0byB0aGUgZm9sbG93aW5nIGlucHV0czoKKyAgICAgICAgOy8vICRvdXRzaXplID0gInU4IiAgOiAgOC1iaXQgdW5zaWduZWQgZGF0YSBzYXR1cmF0ZWQgKDAgdG8gKzI1NSkKKyAgICAgICAgOy8vICAgICAgICAgICAgInM5IiAgOiAxNi1iaXQgc2lnbmVkIGRhdGEgc2F0dXJhdGVkIHRvIDktYml0ICgtMjU2IHRvICsyNTUpCisgICAgICAgIDsvLyAgICAgICAgICAgICJzMTYiIDogMTYtYml0IHNpZ25lZCBkYXRhIG5vdCBzYXR1cmF0ZWQgKG1heCBzaXplIH4rLy0xNDI3MykKKyAgICAgICAgOy8vICRpbnNjYWxlID0gInMxNiIgOiBzaWduZWQgMTYtYml0IGFhbi1zY2FsZSB0YWJsZSwgUTE1IGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICJzMzIiIDogc2lnbmVkIDMyLWJpdCBhYW4tc2NhbGUgdGFibGUsIFEyMyBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0czoKKyAgICAgICAgOy8vIHBTcmMgICA9IHIwID0gUG9pbnRlciB0byBpbnB1dCBkYXRhCisgICAgICAgIDsvLyAgICAgICAgICAgICAgIFJhbmdlIGlzIC0yNTYgdG8gKzI1NSAoOS1iaXQpCisgICAgICAgIDsvLyBTdHJpZGUgPSByMSA9IFN0cmlkZSBiZXR3ZWVuIGlucHV0IGxpbmVzCisgICAgICAgIDsvLyBwRGVzdCAgPSByMiA9IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEKKyAgICAgICAgOy8vIHBTY2FsZSA9IHIzID0gUG9pbnRlciB0byBhYW4tc2NhbGUgdGFibGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGJ5ICRpbnNjYWxlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fSURDVCAgJG91dHNpemUsICRpbnNjYWxlLCAkc3RyaWRlCisgICAgICAgIExDTEEgICAgU0hJRlQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly8gUkVHSVNURVIgQUxMT0NBVElPTgorOy8vIFRoaXMgaXMgaGFyZCBzaW5jZSB3ZSBoYXZlIDggdmFsdWVzLCA5IGZyZWUgcmVnaXN0ZXJzIGFuZCBlYWNoCis7Ly8gYnV0dGVyZmx5IHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiBXZSBhbHNvIHdhbnQgdG8gCis7Ly8gbWFpbnRhaW4gcmVnaXN0ZXIgb3JkZXIgc28gd2UgY2FuIHVzZSBMRE0vU1RNLiBUaGUgdGFibGUgYmVsb3cKKzsvLyBzdW1tYXJpc2VzIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIHRoYXQgbWVldHMgYWxsIHRoZXNlIGNyaXRlcmlhLgorOy8vIGE9MXN0Y29sLCBiPTJuZGNvbCwgZixnLGgsaSBhcmUgZGF0YWZsb3cgcG9pbnRzIGRlc2NyaWJlZCBhYm92ZS4KKzsvLworOy8vIHIxICBhMDEgICAgIGcwICBoMAorOy8vIHI0ICBiMDEgZjAgIGcxICBoMSAgaTAKKzsvLyByNSAgYTIzIGYxICBnMiAgICAgIGkxCis7Ly8gcjYgIGIyMyBmMiAgZzMgIGgyICBpMgorOy8vIHI3ICBhNDUgZjMgICAgICBoMyAgaTMKKzsvLyByOCAgYjQ1IGY0ICBnNCAgaDQgIGk0Cis7Ly8gcjkgIGE2NyBmNSAgZzUgIGg1ICBpNQorOy8vIHIxMCBiNjcgZjYgIGc2ICBoNiAgaTYKKzsvLyByMTEgICAgIGY3ICBnNyAgaDcgIGk3Cis7Ly8KK3JhMDEgICAgUk4gMQorcmIwMSAgICBSTiA0CityYTIzICAgIFJOIDUKK3JiMjMgICAgUk4gNgorcmE0NSAgICBSTiA3CityYjQ1ICAgIFJOIDgKK3JhNjcgICAgUk4gOQorcmI2NyAgICBSTiAxMAorcnRtcCAgICBSTiAxMQorY3NQaUJ5OCBSTiAxMiAgIDsvLyBbIChTaW4ocGkvOClAUTE1KSwgKENvcyhwaS84KUBRMTUpIF0KK0xvb3BSUjIgUk4gMTQgICA7Ly8gWyBMb29wTnVtYmVyPDwxMyAsICgxL1NxcnQoMikpQFExNSBdCis7Ly8gVHJhbnNwb3NlIGFsbG9jYXRpb24KK3hmdCAgICAgUk4gcmEwMQoreGYwICAgICBSTiByYjAxCit4ZjEgICAgIFJOIHJhMjMKK3hmMiAgICAgUk4gcmIyMworeGYzICAgICBSTiByYTQ1Cit4ZjQgICAgIFJOIHJiNDUKK3hmNSAgICAgUk4gcmE2NworeGY2ICAgICBSTiByYjY3Cit4ZjcgICAgIFJOIHJ0bXAKKzsvLyBJU3RhZ2UgMSBhbGxvY2F0aW9uCit4ZzAgICAgIFJOIHhmdAoreGcxICAgICBSTiB4ZjAKK3hnMiAgICAgUk4geGYxCit4ZzMgICAgIFJOIHhmMgoreGd0ICAgICBSTiB4ZjMKK3hnNCAgICAgUk4geGY0Cit4ZzUgICAgIFJOIHhmNQoreGc2ICAgICBSTiB4ZjYKK3hnNyAgICAgUk4geGY3Cis7Ly8gSVN0YWdlIDIgYWxsb2NhdGlvbgoreGgwICAgICBSTiB4ZzAKK3hoMSAgICAgUk4geGcxCit4aHQgICAgIFJOIHhnMgoreGgyICAgICBSTiB4ZzMKK3hoMyAgICAgUk4geGd0Cit4aDQgICAgIFJOIHhnNAoreGg1ICAgICBSTiB4ZzUKK3hoNiAgICAgUk4geGc2Cit4aDcgICAgIFJOIHhnNworOy8vIElTdGFnZSAzLDQgYWxsb2NhdGlvbgoreGl0ICAgICBSTiB4aDAKK3hpMCAgICAgUk4geGgxCit4aTEgICAgIFJOIHhodAoreGkyICAgICBSTiB4aDIKK3hpMyAgICAgUk4geGgzCit4aTQgICAgIFJOIHhoNAoreGk1ICAgICBSTiB4aDUKK3hpNiAgICAgUk4geGg2Cit4aTcgICAgIFJOIHhoNworICAgICAgICAKKyAgICAgICAgTV9TVFIgICBwRGVzdCwgIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX1NUUiAgIFN0cmlkZSwgcFN0cmlkZQorICAgICAgICBFTkRJRgorICAgICAgICBNX0FEUiAgIHBEZXN0LCAgcEJsaworICAgICAgICBMRFIgICAgIGNzUGlCeTgsID0weDMwZmM3NjQyCisgICAgICAgIExEUiAgICAgTG9vcFJSMiwgPTB4MDAwMDVhODIKKyAgCit2Nl9pZGN0X2NvbCRfRgorICAgICAgICA7Ly8gTG9hZCBldmVuIHZhbHVlcworICAgICAgICBMRFIgICAgIHhpNCwgW3BTcmNdLCAjNCAgOy8vIGowCisgICAgICAgIExEUiAgICAgeGk1LCBbcFNyYywgIzQqMTYtNF0gIDsvLyBqNAorICAgICAgICBMRFIgICAgIHhpNiwgW3BTcmMsICMyKjE2LTRdICA7Ly8gajIKKyAgICAgICAgTERSICAgICB4aTcsIFtwU3JjLCAjNioxNi00XSAgOy8vIGo2CisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgRXZlbiBWYWx1ZXMKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiA7Ly8gMTZ4MTYgbXVsCitTSElGVCAgICAgICBTRVRBICAgIDEyCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM0CisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzQqMTYtNF0gICAgICAgIAorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICMyKjE2LTRdCisgICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQorICAgICAgICAgICAgU01MQUJCICB4aTMsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk0LCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBQkIgIHhpMCwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTUsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTMsIHhpNCwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGkxLCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNiwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIFNNTEFCQiAgeGkyLCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNywgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTEsIHhpMSwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMSwgeGk2LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAorU0hJRlQgICAgICAgU0VUQSAgICAoMTIrOC0xNikKKyAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM4CisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzAqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM0KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzQqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk1LCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGUsICMyKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzIqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM2KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk3LCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBvZGQgdmFsdWVzCisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTYtNF0gICAgICA7Ly8gajEKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNi00XSAgICAgIDsvLyBqNworICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2LTRdICAgICAgOy8vIGo1CisgICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTYtNF0gICAgICA7Ly8gajMKKyAgICAgICAgCisgICAgICAgIElGICB7VFJVRX0KKyAgICAgICAgICAgIDsvLyBzaG9ydGN1dCBpZiBvZGQgdmFsdWVzIDAKKyAgICAgICAgICAgIFRFUSAgICAgeGkwLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTEsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMiwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkzLCAjMAorICAgICAgICAgICAgQkVRICAgICB2Nk9kZFplcm8kX0YKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBzY2FsZWQgZXZlbiB2YWx1ZXMKKyAgICAgICAgU1RNSUEgICBwRGVzdCwge3hpNCwgeGk1LCB4aTYsIHhpN30KKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSBvZGQgdmFsdWVzCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIKKyAgICAgICAgICAgIDsvLyBQZXJmb3JtIEFBTiBTY2FsZQorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjE2LTRdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzcqMTYtNF0gICAgICAgIAorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM1KjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpNywgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTAsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFCQiAgeGk0LCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMSwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTcsIHhpNywgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNywgeGkwLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyoxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTUsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkyLCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk0LCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgU01MQUJCICB4aTYsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkzLCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNSwgeGk1LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk1LCB4aTIsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjMSozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzcqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjNyozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTAsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkwLCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMSwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTEsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzUqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNSozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzMqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTIsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkyLCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMywgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTMsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAorICAgICAgICBTQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTSEFERDE2IHhpNSwgeGk1LCB4aXQKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFNIQUREMTYgeGk3LCB4aTcsIHhpdAorICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdF0gICAgICAgICAgICA7Ly8gajAsIGo0IHNjYWxlZAorICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMQorICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFNBREQxNiAgeGYzLCB4ZzMsIHhnNAorICAgICAgICBTU1VCMTYgIHhmNCwgeGczLCB4ZzQKKyAgICAgICAgU0FERDE2ICB4ZjIsIHhnMiwgeGc1CisgICAgICAgIFNTVUIxNiAgeGY1LCB4ZzIsIHhnNQorICAgICAgICBTQUREMTYgIHhmMSwgeGcxLCB4ZzYKKyAgICAgICAgU1NVQjE2ICB4ZjYsIHhnMSwgeGc2CisgICAgICAgIFNBREQxNiAgeGYwLCB4ZzAsIHhnNworICAgICAgICBTU1VCMTYgIHhmNywgeGcwLCB4ZzcKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCisgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQorICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCisgICAgICAgIEVORElGCisgICAgICAgIEIgICAgICAgdjZfaWRjdF9yb3ckX0YKKyAgICAgICAgCit2Nk9kZFplcm8kX0YKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICBTSEFERDE2IHhpMywgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTQsIHhpNQorICAgICAgICBTSFNVQjE2IHhoMSwgeGk0LCB4aTUgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBNT1YgIHhmMywgeGczCisgICAgICAgIE1PViAgeGY0LCB4ZzMKKyAgICAgICAgTU9WICB4ZjIsIHhnMgorICAgICAgICBNT1YgIHhmNSwgeGcyCisgICAgICAgIE1PViAgeGYxLCB4ZzEKKyAgICAgICAgTU9WICB4ZjYsIHhnMQorICAgICAgICBNT1YgIHhmMCwgeGcwCisgICAgICAgIE1PViAgeGY3LCB4ZzAKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKyAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgorICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCisgICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgIAorICAgICAgICAKK3Y2X2lkY3Rfcm93JF9GCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzNHRvNyB4MS80CisgICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50CisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTZdICAgICAgOy8vIGoxCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTZdICAgICAgOy8vIDQqajcKKyAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNl0gICAgICA7Ly8gajUKKyAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNl0gICAgICA7Ly8gajMKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIDIqajcKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajcgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgU0hBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKKyAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgorICAgICAgICAKKyAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQorICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCisgICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCisgICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgorICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80CisgICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKKyAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMyKjE2XSAgICAgIDsvLyBqMgorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM2KjE2XSAgICAgIDsvLyAyKmo2CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYKKyAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1CisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNgorICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzQqMTZdICAgICAgOy8vIGo0CisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyY10sICM0ICAgICAgICAgOy8vIGowCisKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIAorICAgICAgICBBREQgICAgIHhpMCwgeGkwLCB4aXQsIExTTCAjMiAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAorICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgU0hBREQxNiB4ZjMsIHhnMywgeGc0CisgICAgICAgIFNIU1VCMTYgeGY0LCB4ZzMsIHhnNAorICAgICAgICBTSEFERDE2IHhmMiwgeGcyLCB4ZzUKKyAgICAgICAgU0hTVUIxNiB4ZjUsIHhnMiwgeGc1CisgICAgICAgIFNIQUREMTYgeGYxLCB4ZzEsIHhnNgorICAgICAgICBTSFNVQjE2IHhmNiwgeGcxLCB4ZzYKKyAgICAgICAgU0hBREQxNiB4ZjAsIHhnMCwgeGc3CisgICAgICAgIFNIU1VCMTYgeGY3LCB4ZzAsIHhnNworICAgICAgICAKKyAgICAgICAgOy8vIFNhdHVyYXRlCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICBVU0FUMTYgIHhmMCwgIzgsIHhmMAorICAgICAgICAgICAgVVNBVDE2ICB4ZjEsICM4LCB4ZjEKKyAgICAgICAgICAgIFVTQVQxNiAgeGYyLCAjOCwgeGYyCisgICAgICAgICAgICBVU0FUMTYgIHhmMywgIzgsIHhmMworICAgICAgICAgICAgVVNBVDE2ICB4ZjQsICM4LCB4ZjQKKyAgICAgICAgICAgIFVTQVQxNiAgeGY1LCAjOCwgeGY1CisgICAgICAgICAgICBVU0FUMTYgIHhmNiwgIzgsIHhmNgorICAgICAgICAgICAgVVNBVDE2ICB4ZjcsICM4LCB4ZjcgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgU1NBVDE2ICB4ZjAsICM5LCB4ZjAKKyAgICAgICAgICAgIFNTQVQxNiAgeGYxLCAjOSwgeGYxCisgICAgICAgICAgICBTU0FUMTYgIHhmMiwgIzksIHhmMgorICAgICAgICAgICAgU1NBVDE2ICB4ZjMsICM5LCB4ZjMKKyAgICAgICAgICAgIFNTQVQxNiAgeGY0LCAjOSwgeGY0CisgICAgICAgICAgICBTU0FUMTYgIHhmNSwgIzksIHhmNQorICAgICAgICAgICAgU1NBVDE2ICB4ZjYsICM5LCB4ZjYKKyAgICAgICAgICAgIFNTQVQxNiAgeGY3LCAjOSwgeGY3ICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdG8gUm93LCBQYWNrIGFuZCBzdG9yZQorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgT1JSICAgICB4ZjAsIHhmMCwgeGYxLCBMU0wgIzggOy8vIFsgYjEgYjAgYTEgYTAgXQorICAgICAgICAgICAgT1JSICAgICB4ZjIsIHhmMiwgeGYzLCBMU0wgIzggOy8vIFsgYjMgYjIgYTMgYTIgXQorICAgICAgICAgICAgT1JSICAgICB4ZjQsIHhmNCwgeGY1LCBMU0wgIzggOy8vIFsgYjUgYjQgYTUgYTQgXQorICAgICAgICAgICAgT1JSICAgICB4ZjYsIHhmNiwgeGY3LCBMU0wgIzggOy8vIFsgYjcgYjYgYTcgYTYgXQorICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMiwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjIsIHhmMCwgQVNSICMxNgorICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjQsIHhmNiwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjYsIHhmNCwgQVNSICMxNgorICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjN9CisgICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5Iik6TE9SOigiJG91dHNpemUiPSJzMTYiKSAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9yb3ckX0YKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworCisKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCitTcmMwICAgICAgICAgICAgRVFVICA3ICAgICAgICAgICAgICAKK1NyYzEgICAgICAgICAgICBFUVUgIDggICAgICAgICAgICAgIAorU3JjMiAgICAgICAgICAgIEVRVSAgOSAgICAgICAgICAgICAgCitTcmMzICAgICAgICAgICAgRVFVICAxMCAgICAgICAgICAgICAgCitTcmM0ICAgICAgICAgICAgRVFVICAxMSAgICAgICAgICAgICAgCitTcmM1ICAgICAgICAgICAgRVFVICAxMiAgICAgICAgICAgICAgCitTcmM2ICAgICAgICAgICAgRVFVICAxMworU3JjNyAgICAgICAgICAgIEVRVSAgMTQKK1RtcCAgICAgICAgICAgICBFUVUgIDE1CisKK3FYajAgICAgICAgICAgICBRTiBTcmMwLlMxNiAKK3FYajEgICAgICAgICAgICBRTiBTcmMxLlMxNgorcVhqMiAgICAgICAgICAgIFFOIFNyYzIuUzE2CitxWGozICAgICAgICAgICAgUU4gU3JjMy5TMTYKK3FYajQgICAgICAgICAgICBRTiBTcmM0LlMxNgorcVhqNSAgICAgICAgICAgIFFOIFNyYzUuUzE2CitxWGo2ICAgICAgICAgICAgUU4gU3JjNi5TMTYKK3FYajcgICAgICAgICAgICBRTiBTcmM3LlMxNgorcVhqdCAgICAgICAgICAgIFFOIFRtcC5TMTYKKworZFhqMGxvICAgICAgICAgIEROIChTcmMwKjIpLlMxNgorZFhqMGhpICAgICAgICAgIEROIChTcmMwKjIrMSkuUzE2CitkWGoxbG8gICAgICAgICAgRE4gKFNyYzEqMikuUzE2CitkWGoxaGkgICAgICAgICAgRE4gKFNyYzEqMisxKS5TMTYKK2RYajJsbyAgICAgICAgICBETiAoU3JjMioyKS5TMTYKK2RYajJoaSAgICAgICAgICBETiAoU3JjMioyKzEpLlMxNgorZFhqM2xvICAgICAgICAgIEROIChTcmMzKjIpLlMxNgorZFhqM2hpICAgICAgICAgIEROIChTcmMzKjIrMSkuUzE2CitkWGo0bG8gICAgICAgICAgRE4gKFNyYzQqMikuUzE2CitkWGo0aGkgICAgICAgICAgRE4gKFNyYzQqMisxKS5TMTYKK2RYajVsbyAgICAgICAgICBETiAoU3JjNSoyKS5TMTYKK2RYajVoaSAgICAgICAgICBETiAoU3JjNSoyKzEpLlMxNgorZFhqNmxvICAgICAgICAgIEROIChTcmM2KjIpLlMxNgorZFhqNmhpICAgICAgICAgIEROIChTcmM2KjIrMSkuUzE2CitkWGo3bG8gICAgICAgICAgRE4gKFNyYzcqMikuUzE2CitkWGo3aGkgICAgICAgICAgRE4gKFNyYzcqMisxKS5TMTYKK2RYanRsbyAgICAgICAgICBETiAoVG1wKjIpLlMxNgorZFhqdGhpICAgICAgICAgIEROIChUbXAqMisxKS5TMTYKKworcVhpMCAgICAgICAgICAgIFFOIHFYajAKK3FYaTEgICAgICAgICAgICBRTiBxWGo0CitxWGkyICAgICAgICAgICAgUU4gcVhqMgorcVhpMyAgICAgICAgICAgIFFOIHFYajcKK3FYaTQgICAgICAgICAgICBRTiBxWGo1CitxWGk1ICAgICAgICAgICAgUU4gcVhqdAorcVhpNiAgICAgICAgICAgIFFOIHFYajEKK3FYaTcgICAgICAgICAgICBRTiBxWGo2CitxWGl0ICAgICAgICAgICAgUU4gcVhqMworCitkWGkwbG8gICAgICAgICAgRE4gZFhqMGxvCitkWGkwaGkgICAgICAgICAgRE4gZFhqMGhpCitkWGkxbG8gICAgICAgICAgRE4gZFhqNGxvCitkWGkxaGkgICAgICAgICAgRE4gZFhqNGhpCitkWGkybG8gICAgICAgICAgRE4gZFhqMmxvCitkWGkyaGkgICAgICAgICAgRE4gZFhqMmhpCitkWGkzbG8gICAgICAgICAgRE4gZFhqN2xvCitkWGkzaGkgICAgICAgICAgRE4gZFhqN2hpCitkWGk0bG8gICAgICAgICAgRE4gZFhqNWxvCitkWGk0aGkgICAgICAgICAgRE4gZFhqNWhpCitkWGk1bG8gICAgICAgICAgRE4gZFhqdGxvCitkWGk1aGkgICAgICAgICAgRE4gZFhqdGhpCitkWGk2bG8gICAgICAgICAgRE4gZFhqMWxvCitkWGk2aGkgICAgICAgICAgRE4gZFhqMWhpCitkWGk3bG8gICAgICAgICAgRE4gZFhqNmxvCitkWGk3aGkgICAgICAgICAgRE4gZFhqNmhpCitkWGl0bG8gICAgICAgICAgRE4gZFhqM2xvCitkWGl0aGkgICAgICAgICAgRE4gZFhqM2hpCisKK3FYaDAgICAgICAgICAgICBRTiBxWGl0CitxWGgxICAgICAgICAgICAgUU4gcVhpMAorcVhoMiAgICAgICAgICAgIFFOIHFYaTIKK3FYaDMgICAgICAgICAgICBRTiBxWGkzCitxWGg0ICAgICAgICAgICAgUU4gcVhpNworcVhoNSAgICAgICAgICAgIFFOIHFYaTUKK3FYaDYgICAgICAgICAgICBRTiBxWGk0CitxWGg3ICAgICAgICAgICAgUU4gcVhpMQorcVhodCAgICAgICAgICAgIFFOIHFYaTYKKworZFhoMGxvICAgICAgICAgIEROIGRYaXRsbworZFhoMGhpICAgICAgICAgIEROIGRYaXRoaQorZFhoMWxvICAgICAgICAgIEROIGRYaTBsbworZFhoMWhpICAgICAgICAgIEROIGRYaTBoaQorZFhoMmxvICAgICAgICAgIEROIGRYaTJsbworZFhoMmhpICAgICAgICAgIEROIGRYaTJoaQorZFhoM2xvICAgICAgICAgIEROIGRYaTNsbworZFhoM2hpICAgICAgICAgIEROIGRYaTNoaQorZFhoNGxvICAgICAgICAgIEROIGRYaTdsbworZFhoNGhpICAgICAgICAgIEROIGRYaTdoaQorZFhoNWxvICAgICAgICAgIEROIGRYaTVsbworZFhoNWhpICAgICAgICAgIEROIGRYaTVoaQorZFhoNmxvICAgICAgICAgIEROIGRYaTRsbworZFhoNmhpICAgICAgICAgIEROIGRYaTRoaQorZFhoN2xvICAgICAgICAgIEROIGRYaTFsbworZFhoN2hpICAgICAgICAgIEROIGRYaTFoaQorZFhodGxvICAgICAgICAgIEROIGRYaTZsbworZFhodGhpICAgICAgICAgIEROIGRYaTZoaQorCitxWGcwICAgICAgICAgICAgUU4gcVhoMgorcVhnMSAgICAgICAgICAgIFFOIHFYaHQKK3FYZzIgICAgICAgICAgICBRTiBxWGgxCitxWGczICAgICAgICAgICAgUU4gcVhoMAorcVhnNCAgICAgICAgICAgIFFOIHFYaDQKK3FYZzUgICAgICAgICAgICBRTiBxWGg1CitxWGc2ICAgICAgICAgICAgUU4gcVhoNgorcVhnNyAgICAgICAgICAgIFFOIHFYaDcKK3FYZ3QgICAgICAgICAgICBRTiBxWGgzCisKK3FYZjAgICAgICAgICAgICBRTiBxWGc2CitxWGYxICAgICAgICAgICAgUU4gcVhnNQorcVhmMiAgICAgICAgICAgIFFOIHFYZzQKK3FYZjMgICAgICAgICAgICBRTiBxWGd0CitxWGY0ICAgICAgICAgICAgUU4gcVhnMworcVhmNSAgICAgICAgICAgIFFOIHFYZzIKK3FYZjYgICAgICAgICAgICBRTiBxWGcxCitxWGY3ICAgICAgICAgICAgUU4gcVhnMAorcVhmdCAgICAgICAgICAgIFFOIHFYZzcKKworCitxWHQwICAgICAgICAgICAgUU4gMS5TMzIKK3FYdDEgICAgICAgICAgICBRTiAyLlMzMgorcVQwbG8gICAgICAgICAgIFFOIDEuUzMyICAgICAgICAgCitxVDBoaSAgICAgICAgICAgUU4gMi5TMzIgICAgICAgICAKK3FUMWxvICAgICAgICAgICBRTiAzLlMzMiAgICAgICAgIAorcVQxaGkgICAgICAgICAgIFFOIDQuUzMyICAgICAgICAgCitxU2NhbGVsbyAgICAgICAgUU4gNS5TMzIgICAgICAgIDsvLyB1c2VkIHRvIHJlYWQgcG9zdCBzY2FsZSB2YWx1ZXMKK3FTY2FsZWhpICAgICAgICBRTiA2LlMzMgorcVRlbXAwICAgICAgICAgIFFOIDUuUzMyICAgICAgICAgCitxVGVtcDEgICAgICAgICAgUU4gNi5TMzIgICAgCisKKworU2NhbGUxICAgICAgICAgIEVRVSA2CitTY2FsZTIgICAgICAgICAgRVFVIDE1CitxU2NhbGUxICAgICAgICAgUU4gU2NhbGUxLlMxNiAgICAgCitxU2NhbGUyICAgICAgICAgUU4gU2NhbGUyLlMxNiAgICAgCitkU2NhbGUxbG8gICAgICAgRE4gKFNjYWxlMSoyKS5TMTYgICAgIAorZFNjYWxlMWhpICAgICAgIEROIChTY2FsZTEqMisxKS5TMTYKK2RTY2FsZTJsbyAgICAgICBETiAoU2NhbGUyKjIpLlMxNiAgICAgCitkU2NhbGUyaGkgICAgICAgRE4gKFNjYWxlMioyKzEpLlMxNgorCitkQ29lZnMgICAgICAgICAgRE4gMC5TMTYgICAgICAgIDsvLyBTY2FsZSBjb2VmZmljaWVudHMgaW4gZm9ybWF0IHtbMF0gW0NdIFtTXSBbSW52U3FydDJdfQorSW52U3FydDIgICAgICAgIEROIGRDb2Vmc1swXSAgICA7Ly8gMS9zcXJ0KDIpIGluIFExNQorUyAgICAgICAgICAgICAgIEROIGRDb2Vmc1sxXSAgICA7Ly8gU2luKFBJLzgpIGluIFExNQorQyAgICAgICAgICAgICAgIEROIGRDb2Vmc1syXSAgICA7Ly8gQ29zKFBJLzgpIGluIFExNQorCitwVGVtcCAgICAgICAgICAgUk4gMTIKKworICAgICAgICAgICAgICAgIAorICAgICAgICBJTVBPUlQgIGFybUNPTU1fSURDVENvZWYKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtxWGowLHFYajF9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqMixxWGozfSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajQscVhqNX0sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGo2LHFYajd9LCBbcFNyYyBANjRdIQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgUHJlU2NhbGUgYW5kIG11bHRpcGx5IHdpdGggU3JjCisgICAgICAgIDsvLyBJU3RhZ2UgNAorICAgICAgICAKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTZYMTYgTXVsCisgICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzJYMzIgLHVsCisgICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgorICAgICAgICBFTkRJRgorCisgICAgICAgIDsvLyBJU3RhZ2UgMworICAgICAgICBWUURNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWUURNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCisgICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMworCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMgorICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3CisgICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQorICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3CisgICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKKworICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorWFRSMCAgICAgICAgICAgIEVRVSBTcmM1CitYVFIxICAgICAgICAgICAgRVFVIFRtcAorWFRSMiAgICAgICAgICAgIEVRVSBTcmM2CitYVFIzICAgICAgICAgICAgRVFVIFNyYzcKK1hUUjQgICAgICAgICAgICBFUVUgU3JjMworWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCitYVFI2ICAgICAgICAgICAgRVFVIFNyYzEKK1hUUjcgICAgICAgICAgICBFUVUgU3JjMgorWFRSdCAgICAgICAgICAgIEVRVSBTcmM0CisgICAgICAgICAgICAgICAgCitxQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKK3FBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKK3FBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKK3FBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKK3FBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKK3FBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKK3FBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKK3FBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKKworZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQorZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQorZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQorZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKK2RCNSAgICAgICAgICAgICBETiAgWFRSNSoyCitkQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgorZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKKworICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCisgICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQorICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3CisgICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCisgICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCisgICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2CisgICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKKyAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKKyAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKKyAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKKyAgICAgICAgCisKK3FZajAgICAgICAgICAgICBRTiBxWGYwCitxWWoxICAgICAgICAgICAgUU4gcVhmMQorcVlqMiAgICAgICAgICAgIFFOIHFYZjIKK3FZajMgICAgICAgICAgICBRTiBxWGYzCitxWWo0ICAgICAgICAgICAgUU4gcVhmNAorcVlqNSAgICAgICAgICAgIFFOIHFYZjUKK3FZajYgICAgICAgICAgICBRTiBxWGY2CitxWWo3ICAgICAgICAgICAgUU4gcVhmNworcVlqdCAgICAgICAgICAgIFFOIHFYZnQKKworZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgorZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2CitkWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2CitkWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKK2RZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKK2RZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgorZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgorZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2CitkWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2CitkWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKK2RZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKK2RZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgorZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgorZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2CitkWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2CitkWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKK2RZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKK2RZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgorCitxWWkwICAgICAgICAgICAgUU4gcVlqMAorcVlpMSAgICAgICAgICAgIFFOIHFZajQKK3FZaTIgICAgICAgICAgICBRTiBxWWoyCitxWWkzICAgICAgICAgICAgUU4gcVlqNworcVlpNCAgICAgICAgICAgIFFOIHFZajUKK3FZaTUgICAgICAgICAgICBRTiBxWWp0CitxWWk2ICAgICAgICAgICAgUU4gcVlqMQorcVlpNyAgICAgICAgICAgIFFOIHFZajYKK3FZaXQgICAgICAgICAgICBRTiBxWWozCisKK2RZaTBsbyAgICAgICAgICBETiBkWWowbG8KK2RZaTBoaSAgICAgICAgICBETiBkWWowaGkKK2RZaTFsbyAgICAgICAgICBETiBkWWo0bG8KK2RZaTFoaSAgICAgICAgICBETiBkWWo0aGkKK2RZaTJsbyAgICAgICAgICBETiBkWWoybG8KK2RZaTJoaSAgICAgICAgICBETiBkWWoyaGkKK2RZaTNsbyAgICAgICAgICBETiBkWWo3bG8KK2RZaTNoaSAgICAgICAgICBETiBkWWo3aGkKK2RZaTRsbyAgICAgICAgICBETiBkWWo1bG8KK2RZaTRoaSAgICAgICAgICBETiBkWWo1aGkKK2RZaTVsbyAgICAgICAgICBETiBkWWp0bG8KK2RZaTVoaSAgICAgICAgICBETiBkWWp0aGkKK2RZaTZsbyAgICAgICAgICBETiBkWWoxbG8KK2RZaTZoaSAgICAgICAgICBETiBkWWoxaGkKK2RZaTdsbyAgICAgICAgICBETiBkWWo2bG8KK2RZaTdoaSAgICAgICAgICBETiBkWWo2aGkKK2RZaXRsbyAgICAgICAgICBETiBkWWozbG8KK2RZaXRoaSAgICAgICAgICBETiBkWWozaGkKKworcVloMCAgICAgICAgICAgIFFOIHFZaXQKK3FZaDEgICAgICAgICAgICBRTiBxWWkwCitxWWgyICAgICAgICAgICAgUU4gcVlpMgorcVloMyAgICAgICAgICAgIFFOIHFZaTMKK3FZaDQgICAgICAgICAgICBRTiBxWWk3CitxWWg1ICAgICAgICAgICAgUU4gcVlpNQorcVloNiAgICAgICAgICAgIFFOIHFZaTQKK3FZaDcgICAgICAgICAgICBRTiBxWWkxCitxWWh0ICAgICAgICAgICAgUU4gcVlpNgorCitkWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCitkWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCitkWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCitkWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCitkWWgybG8gICAgICAgICAgRE4gZFlpMmxvCitkWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCitkWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCitkWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCitkWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCitkWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCitkWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCitkWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCitkWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCitkWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCitkWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCitkWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCitkWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCitkWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCisKK3FZZzAgICAgICAgICAgICBRTiBxWWgyCitxWWcxICAgICAgICAgICAgUU4gcVlodAorcVlnMiAgICAgICAgICAgIFFOIHFZaDEKK3FZZzMgICAgICAgICAgICBRTiBxWWgwCitxWWc0ICAgICAgICAgICAgUU4gcVloNAorcVlnNSAgICAgICAgICAgIFFOIHFZaDUKK3FZZzYgICAgICAgICAgICBRTiBxWWg2CitxWWc3ICAgICAgICAgICAgUU4gcVloNworcVlndCAgICAgICAgICAgIFFOIHFZaDMKKworcVlmMCAgICAgICAgICAgIFFOIHFZZzYKK3FZZjEgICAgICAgICAgICBRTiBxWWc1CitxWWYyICAgICAgICAgICAgUU4gcVlnNAorcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKK3FZZjQgICAgICAgICAgICBRTiBxWWczCitxWWY1ICAgICAgICAgICAgUU4gcVlnMgorcVlmNiAgICAgICAgICAgIFFOIHFZZzEKK3FZZjcgICAgICAgICAgICBRTiBxWWcwCitxWWZ0ICAgICAgICAgICAgUU4gcVlnNworCisgICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCisgICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKKyAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2CisgICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMworCisgICAgICAgIFZRRE1VTEggICAgIHFZaTIsIHFZaTIsIEludlNxcnQyICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcFRlbXAsICMweDQgICAgICAgICAgICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCisgICAgICAgIFZEVVAgICAgICAgIHFTY2FsZTEsIHBUZW1wICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0CisgICAgICAgIFZBREQgICAgICAgIHFZaTAsIHFZaTAsIHFTY2FsZTEKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFZaDAsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAraTEpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVloMSwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMC1pMSkvMgorCisgICAgICAgIFZIQUREICAgICAgIHFZaDcsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgVlNVQiAgICAgICAgcVloNSwgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWU1VCICAgICAgICBxWWgyLCBxWWkyLCBxWWkzICAgICAgICA7Ly8gaDIsIGgzCisgICAgICAgIFZRRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCisKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAorICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgorICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNworICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2CisgICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgorICAgICAgICAKKworICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgorICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3CisgICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCisKK1lUUjAgICAgICAgICAgICBFUVUgU3JjMAorWVRSMSAgICAgICAgICAgIEVRVSBTcmM0CitZVFIyICAgICAgICAgICAgRVFVIFNyYzEKK1lUUjMgICAgICAgICAgICBFUVUgU3JjMgorWVRSNCAgICAgICAgICAgIEVRVSBTcmM3CitZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKK1lUUjYgICAgICAgICAgICBFUVUgVG1wCitZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKK1lUUnQgICAgICAgICAgICBFUVUgU3JjMworCitxQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQorcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgorcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgorcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgorcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgorcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgorcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgorcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgorCitkRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQorZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQorZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQorZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKK2RENSAgICAgICAgICAgICBETiAgWVRSNSoyCitkRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgorZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQorICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCisgICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNworICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgorICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMworICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgorICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0CisgICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1CisgICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2CisgICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3CisKKyAgICAgICAgCitkWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4CitkWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4CitkWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4CitkWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4CitkWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4CitkWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4CitkWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4CitkWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4CisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgorICAgICAgICA7Ly8KKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMworICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQorICAgICAgICAgICAgCisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORElGCisKKworCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorCisKKworICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93CisgICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAorICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgorICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IEZsYWcKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKKyAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQorICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdworICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93CisgICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCisgICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCisgICAgICAgIElGICIkTGFzdFJvdyI9IjAiCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQorICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgorICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCisgICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKK3FTY2FsZTBsbyAgICAgICBRTiAwLlMzMgorcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCitxU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKK3FTY2FsZTFoaSAgICAgICBRTiAzLlMzMgorcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQorCitxU3JjMGxvICAgICAgICAgUU4gNC5TMzIKK3FTcmMwaGkgICAgICAgICBRTiA1LlMzMgorcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCitxU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKK3FTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCitxU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQorcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKKworcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQorCisgICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAwCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAxICYgNworICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAyICYgNgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCisgICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAorICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCisgICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIDsvLyBSb3cgNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxMTE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKKyAqLworIAorCisKKyNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCisjZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXworCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKyAgCisvKiBNYXNrIHRhYmxlICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYjNlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCisjaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKyNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXworCisKKy8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KKyNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLworI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKKyNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQorCisvKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLworI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQorCisKKy8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCisjZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KKworCisvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KKy8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCisKKy8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCisjZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMXAwLTAwYmV0MCIKKworLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBUk0gQXJjaGl0ZWN0dXJlIFY3IHdpdGggTkVPTiIKKworLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCisKKworI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk1NmJkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKQEAgLTAsMCArMSwxMTU3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCis7Ly8KKworOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KKyBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICisgR0JMTCBBUk1DT01NX1NfSAorCisgICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgCisgICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKK0FSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KKworOy8vIEdsb2JhbHMKKworICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKKyAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50CisgICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCisgICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCisgICAgICAgIAorICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZworICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCisgICAgICAgIAorICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKKyAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCisgICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50CisgICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQorICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKKyAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAorICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCisgICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAorICAgICAgICAKK19JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KK19TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKK19GICAgICAgICAgICAgICBTRVRBICAgIDAKK19Td051bSAgICAgICAgICBTRVRBICAgIDAKK18zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgorXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQorOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQorOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCitfQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCisgICAgICAgRUxTRQorX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAorICAgICAgIEVORElGCisKKworCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCisgICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cworICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVFMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQorICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAorICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCisgICAgICAgIEdCTEwgJHZhcgorICAgICAgICBHQkxMIF9vayR2YXIKKyR2YXIgICAgU0VUTCB7RkFMU0V9CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKworICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0CisgICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKKyAgICAgICAgOy8vIGNvcmUuCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX1ZBUklBTlQgJHYwCisgICAgICAgIF9NX1ZBUklBTlQgJHYxCisgICAgICAgIF9NX1ZBUklBTlQgJHYyCisgICAgICAgIF9NX1ZBUklBTlQgJHYzCisgICAgICAgIF9NX1ZBUklBTlQgJHY0CisgICAgICAgIF9NX1ZBUklBTlQgJHY1CisgICAgICAgIF9NX1ZBUklBTlQgJHY2CisgICAgICAgIF9NX1ZBUklBTlQgJHY3CisgICAgICAgIAorICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKKyAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKK19WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCisgICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUworICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIGZhbGNvbi12ZnAsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgZmFsY29uLWZ1bGwtbmVvbiwgQ29ydGV4QTgKKyAgICAgICAgX01fVFJZIENvcnRleC1BOE5vTmVvbiwgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk03VERNSQorICAgICAgICAKKyAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50CisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTFNFCiskX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQorICAgICAgICBNQUNSTworICAgICAgICBfTV9WQVJJQU5UICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKKyAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKKyAgICAgICAgRU5ESUYKKyR2YXIgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZworICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCisgICAgICAgIDsvLyBjaG9zZW4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKKyAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBfTV9UUlkxICR2MAorICAgICAgICBfTV9UUlkxICR2MQorICAgICAgICBfTV9UUlkxICR2MgorICAgICAgICBfTV9UUlkxICR2MworICAgICAgICBfTV9UUlkxICR2NAorICAgICAgICBfTV9UUlkxICR2NQorICAgICAgICBfTV9UUlkxICR2NgorICAgICAgICBfTV9UUlkxICR2NworICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkxICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgorX1ZhcmlhbnQgU0VUUyAiJHZhciIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSVUNUICRzbmFtZQorX1N0cnVjdCBTRVRTICIkc25hbWUiCitfU3RPZmYgIFNFVEEgMAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAorICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCisgICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAorICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQorICAgICAgICBNQUNSTworICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKKyAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQorICAgICAgICBFTkRJRgorJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCisgICAgICAgIElGICIkbnVtYmVyIjw+IiIKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgorICAgICAgICBFTFNFCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNUUlVDVAorc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKK19TdHJ1Y3QgU0VUUyAiIgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCisgICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1dJVENIICR2LCAkcworICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKK19Td0xvbmcgU0VUTCB7RkFMU0V9CisgICAgICAgIElGICIkcyI9IkwiCitfU3dMb25nICAgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KKyAgICAgICAgICAgIEVORElGCitfU3dpdGNoJF9Td051bQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCisgICAgICAgICAgICBOT1AKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9DQVNFICAkbGFiZWwKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBCICAgJGxhYmVsCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICBBTElHTiAyCisgICAgICAgIE1FTkQgICAgICAgCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKKyAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCisgICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCisgICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgIiRhbGlnbiI9IiIKKyAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKKyAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgorICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KKyAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KKyAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCisgICAgICAgIEVORElGCiskbmFtZQorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworOy8vCis7Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCis7Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCis7Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgCisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKKyAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgX0luRnVuYworJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKK19BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KKyAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAorICAgICAgICBNQUNSTworICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0CisgICAgICAgIExDTEEgICAgX3NoCisgICAgICAgIExDTEEgICAgX2NzdAorX3NoICAgICBTRVRBICAgIDAKK19jc3QgICAgU0VUQSAgICAkY29uc3QKKyAgICAgICAgSUYgX2NzdD0wCisgICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCitfY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKK19zaCAgICAgICAgIFNFVEEgX3NoKzIKKyAgICAgICAgV0VORAorICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAorICAgICAgICBJRiBfY3N0Pj0yNTYKKyAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgorICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCisgICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAorICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCisgICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAorICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKKyAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKKyAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPbiBFbnRyeToKKyAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQorICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKKyAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgorICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKKyAgICAgICAgICAgIElGICIkYTEiPSIiCisgICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0CitfT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKKyAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAorICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKK19iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQorX29mZnNldCAgICAgU0VUUyAiJGExIgorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAkaSAgJHIsICRhMAorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UgOy8vIEFSTQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCitfYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKK19vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCisgICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCisgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgorICAgICAgICBNQUNSTworICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCisgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKKyAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKKyAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcworICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgorICAgICAgICA7Ly8gICAgCisgICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCisgICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5CisgICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCisgICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCisgICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKKyAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCitfSW5GdW5jIFNFVEwge1RSVUV9CitfUkJ5dGVzIFNFVEEgMAorX1dvcmtzcGFjZSBTRVRBIDAKKworICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCisgICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorICAgICAgICBFWFBPUlQgICRuYW1lCiskbmFtZSAgIEZVTkNUSU9OCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycworICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAorICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCisgICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGIChfU0J5dGVzIT0wKQorICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICAKK19BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKKyAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGICIkcnJlZyI9IiIKK19SUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKK19SUmVnTGlzdCAgIFNFVFMgInI0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKKyAgICAgICAgSUYgIiRkcmVnIj0iIgorX0RSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJGRyZWciPSJkOCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQ5IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDExIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTIiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMyIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTUiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUkVUICRjYworICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKKyAgICAgICAgICAgIEJYJGNjIGxyCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybworICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAorICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FWElUICAkY2MKKyAgICAgICAgQVNTRVJUICBfSW5GdW5jCisgICAgICAgIElGICBfU0J5dGVzIT0wCisgICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAorICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQorICAgICAgICAgICAgX01fUkVUICRjYworICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgICAgICBNQUNSTworICAgICAgICBNX0VORAorICAgICAgICBBU1NFUlQgX0luRnVuYworX0luRnVuYyBTRVRMIHtGQUxTRX0KK19FbmQkX0YKKworICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKKyAgICAgICAgSUYgX1NCeXRlcyE9MAorICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1JFVAorICAgICAgICBFTkRGVU5DCisKKyAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCisgICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKK19TQnl0ZXMgICAgICAgIFNFVEEgMAorX0YgICAgICAgICAgICAgU0VUQSBfRisxCisgICAgICAgIE1FTkQKKworICAgICAgICAgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBEZWJ1ZyBNYWNyb3MKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgR0JMTCAgICBERUJVR19PTgorREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KKyAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KK0RFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KKyAgICAgICAgCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgorICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBFeGFtcGxlczoKKyAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKKyAgICAgICAgOy8vIGZsYWdzLgorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIElGIERFQlVHX09OCisgICAgICAgIAorICAgICAgICBJTVBPUlQgIHByaW50ZgorICAgICAgICBMQ0xBICAgIG5BcmdzCituQXJncwlTRVRBICAgIDAKKyAgICAgICAgCisgICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KKyAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQorICAgICAgICAKKyAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQorICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKKyAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KK25BcmdzICAgICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwwIjw+IiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCisgICAgICAgIEFEUiAgICAgcjAsICVGVDAwCisgICAgICAgIElGIG5BcmdzPTEKKyAgICAgICAgICBMRFIgICByMSwgW3NwXQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0yCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MworICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcworICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKKyAgICAgICAgQkwgICAgICBwcmludGYKKyAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKKyAgICAgICAgQiAgICAgICAlRlQwMQorMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50CisgICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCisgICAgICAgIEFMSUdOCiswMSAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycworICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9CisKKyAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KKyAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQorICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCisgICAgICAgIElGIERFQlVHX1NUQUxMU19PTgorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAorICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCisgICAgICAgICAgICBMQ0xBIF9wbGxlbgorICAgICAgICAgICAgTENMUyBfcGwKKyAgICAgICAgICAgIExDTEwgX3BsbG9nCitfcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCitfcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQorICAgICAgICAgICAgSUYgOkRFRjokX3BsCisgICAgICAgICAgICAgICAgSUYgJF9wbAorICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAorICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQorX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKK19zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0CisgICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCisJCQlNT1Ygc3AsIHNwCitfc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKKyAgICAgICAgICAgICAgICAgICAgV0VORAorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcworOy8vIAorOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcworOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQorOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQorOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZworOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgorOy8vCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKKworCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKKyAgICAgICAgICAgIAorICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhNjhkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgorICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAorICoKKyAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQorICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKKyAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldworICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAorICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKKyAqICAgYXQgcnVudGltZS4KKyAqCisgKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAorICogCisgKi8KKworICAKKyNpZm5kZWYgX2FybU9NWF9IXworI2RlZmluZSBfYXJtT01YX0hfCisKKworLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLworI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKKyNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKKworLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KKyNkZWZpbmUgQkFSRV9TVUZGSVggCisKKworCisvKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLworI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKKyNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKKworCisKKworLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLworI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisKKworI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCisKKyNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCisKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisKKworI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjI5NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCkBAIC0wLDAgKzEsMjUyIEBACisvKioKKyAqIEZpbGU6IG9teHR5cGVzLmgKKyAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworICAKKyNpZm5kZWYgX09NWFRZUEVTX0hfCisjZGVmaW5lIF9PTVhUWVBFU19IXworCisjaW5jbHVkZSA8bGltaXRzLmg+IAorCisjZGVmaW5lIE9NWF9JTgorI2RlZmluZSBPTVhfT1VUCisjZGVmaW5lIE9NWF9JTk9VVAorCisKK3R5cGVkZWYgZW51bSB7CisgICAgCisgICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KKyAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAorICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAorICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KKyAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCisgICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCisgICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCisJT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLworCisgICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCisgICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLworCisgICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCisKKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLworCisgICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCisKKyAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCisgICAgCisgfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLworCisgCisvKiBPTVhfVTggKi8KKyNpZiBVQ0hBUl9NQVggPT0gMHhmZgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKKyNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKKyNlbHNlCisjZXJyb3IgT01YX1U4IHVuZGVmaW5lZAorI2VuZGlmIAorCisgCisvKiBPTVhfUzggKi8KKyNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OworI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzggdW5kZWZpbmVkCisjZW5kaWYKKyAKKyAKKy8qIE9NWF9VMTYgKi8KKyNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OworI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMTYgKi8KKyNpZiBTSFJUX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKKyNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1UzMiAqLworI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7CisjZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MzMiAqLworI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7CisjZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCisjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCisgICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCisjZWxzZQorICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQorI2VuZGlmCisKKworLyogT01YX1NDOCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMTYgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MzMiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzY0ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX0YzMiAqLwordHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9GNjQgKi8KK3R5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0lOVCAqLwordHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLworCisKKyNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKKyNkZWZpbmUgT01YX01JTl9VOCAgCQkwCisjZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCisjZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAorI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQorI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKKworI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKKyNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCisjZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQorI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCisjZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCisjZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCisKK3R5cGVkZWYgdm9pZCBPTVhWb2lkOworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCisjZW5kaWYKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCisgICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKKyAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAorICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KKwlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCit9T01YUmVjdDsKKworCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KKyBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KKwkKK30gT01YUG9pbnQ7CisKKworLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KKyBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KKwkKK30gT01YU2l6ZTsKKworI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODcwM2QxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKQEAgLTAsMCArMSw3NyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gCitPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICBFUVUgIDAgICAgOy8vIE5vIGVycm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAorT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgRVFVIC0yICAgIDsvLyBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICAgICAKK09NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgIEVRVSAtMTgyICA7Ly8gSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgICAgIAorT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgRVFVIC05ICAgIDsvLyBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gCitPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICBFUVUgLTE1OSAgOy8vIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgCitPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICBFUVUgLTE2NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgCitPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICBFUVUgLTE2MyAgOy8vIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgIEVRVSAtMTYyICA7Ly8gQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgICAgIAorT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgRVFVIC0xNjAgIDsvLyBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yIAorCis7Ly8gT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbgorT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgRVFVIC01ICAgIDsvLyBCYWQgQXJndW1lbnRzIAorCitPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICBFUVUgLTE1NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgIAorT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgRVFVIC0xNTYgIDsvLyBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICAgIAorT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgRVFVIC0xNTUgIDsvLyBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICBFUVUgLTE1NCAgOy8vIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgIAorT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgRVFVIC0xNTMgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgRVFVIC0xNTIgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICAgCisKK09NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgIEVRVSAtMTgzICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgIAorT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgRVFVIC0xODEgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgIEVRVSAtMTcgICA7Ly8gQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uIAorCitPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICBFUVUgLTE4MCAgOy8vIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAKKworT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgRVFVIDB4N0ZGRkZGRkYKKworCisKK09NWF9NSU5fUzggICAgICBFUVUgCSAgIAkoLTEyOCkKK09NWF9NSU5fVTggIAlFUVUgICAgIAkwCitPTVhfTUlOX1MxNgkJRVFVICAgICAgCSgtMzI3NjgpCitPTVhfTUlOX1UxNgkJRVFVCSAgICAgICAgMAorCisKK09NWF9NSU5fUzMyCQlFUVUJKC0yMTQ3NDgzNjQ3LTEpCitPTVhfTUlOX1UzMgkJRVFVCTAKKworT01YX01BWF9TOAkJRVFVCSgxMjcpCitPTVhfTUFYX1U4CQlFUVUJKDI1NSkKK09NWF9NQVhfUzE2CQlFUVUJKDMyNzY3KQorT01YX01BWF9VMTYJCUVRVQkoMHhGRkZGKQorT01YX01BWF9TMzIJCUVRVQkoMjE0NzQ4MzY0NykKK09NWF9NQVhfVTMyCQlFUVUJKDB4RkZGRkZGRkYpCisKK09NWF9WQ19VUFBFUiAgICBFUVUgMHgxICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAorT01YX1ZDX0xFRlQgICAgIEVRVSAweDIgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zIAorT01YX1ZDX1VQUEVSX1JJR0hUICAgIEVRVSAweDQwICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCisKK05VTEwgICAgRVFVIDAKKworOy8vIFN0cnVjdHVyZXMKKworICAgIElOQ0xVREUgICAgIGFybUNPTU1fcy5oCisKKyAgICBNX1NUUlVDVCAgICBPTVhQb2ludAorICAgIE1fRklFTEQgICAgIHgsIDQKKyAgICBNX0ZJRUxEICAgICB5LCA0CisgICAgTV9FTkRTVFJVQ1QKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDllNzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsCkBAIC0wLDAgKzEsMTEzIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgCisjIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCisjIE9wZW5NQVggREw6IHYxLjAuMgorIyBSZXZpc2lvbjogICAxMjI5MAorIyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTggLWMnOworJEFTICAgICAgID0gJ2FybWFzbSc7CiskQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCc7CisjICRMSUIgICAgICA9ICdhcm1saW5rJzsKKyMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7CisjICRMSUJfVFlQRSA9ICcubyc7CiskTElCICAgICAgPSAnYXJtYXInOworJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKKyRMSUJfVFlQRSA9ICcuYSc7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KK0BoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KK29wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOworQGZpbGVsaXN0ID0gPEZJTEVTPjsKK2Nsb3NlKEZJTEVTKTsKKworIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCitmb3JlYWNoICRoIChAaGVhZGVybGlzdCkKK3sKKyAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOworfQorCisjIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7CisKKyMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKK21rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKK21rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKKworJG9iamxpc3QgPSAnJzsKKworIyBDb21waWxlIGVhY2ggZmlsZQorZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQoreworCW15ICRmOworCW15ICRiYXNlOworCW15ICRleHQ7CisJbXkgJG9iamZpbGU7CisKKwljaG9tcCgkZmlsZSk7CisJJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOworCisJKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKKyAgICAkZj1+cy9bXG5cZlxyXS8vZzsgIyBSZW1vdmUgYW55IGVuZC1vZi1saW5lIGNoYXJhY3RlcnMKKworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkYjhlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsNzUgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisuL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisuL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisuL2FwaS9hcm1DT01NX3MuaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL2FwaS9vbXh0eXBlc19zLmgKKy4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKy4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL2FybVZDQ09NTV9zLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvYXBpL29teFZDX3MuaAorLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKy4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU3MmE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCkBAIC0wLDAgKzEsOTM2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKKyAqCisgKi8KKworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorCitPTVhfSU5UIGFybVNpZ25DaGVjayAoCisgICAgT01YX1MxNiB2YXIKKykKKworeworICAgIE9NWF9JTlQgU2lnbjsKKyAgICAKKyAgICBpZiAodmFyIDwgMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHZhciA+IDApCisgICAgeworICAgICAgICBTaWduID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU2lnbiA9IDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBTaWduOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICBPTVhfSU5UIG1pbiwKKyAgICBPTVhfSU5UIG1heCwgCisgICAgT01YX1MzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgIE9NWF9GMzIgbWluLAorICAgIE9NWF9GMzIgbWF4LCAKKyAgICBPTVhfRjMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCit7CisgICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKKyAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKKyAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7CisgICAgT01YX1UzMiB2SW50OworICAgIE9NWF9VMzIgdkludFNhdDsKKyAgICAKKyAgICBpZih2IDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OworICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKKyAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7CisgICAgdkludFNhdCA9IHZJbnQ7CisgICAgaWYodkludFNhdCA+IG1heFYpIAorICAgICAgICB2SW50U2F0ID0gbWF4VjsKKyAgICByZXR1cm4gdkludFNhdDsKK30KKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKAorICAgICAgICBPTVhfVTggKnBCdWYxLAorICAgICAgICBPTVhfVTggKnBCdWYyLAorICAgICAgICBPTVhfSU5UIGVsZW1TaXplCisgICAgICAgKQoreworICAgIE9NWF9JTlQgaTsKKyAgICBPTVhfVTggdGVtcDsKKyAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7CisgICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKKyAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorKQoreworICAgIE9NWF9TMzIgYSwgYiwgYzsKKyAgICAKKyAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7CisgICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOworICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7CisgICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCisgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorKQoreworICAgIE9NWF9VOCBpOyAgICAKKyAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAorICAgIHsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCit7CisgICAgT01YX1M2NCBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKKyAgICB7CisgICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKKyAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKKworICAgIHJldHVybiBSZXN1bHQ7ICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCit7CisgICAgCisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKKworICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7CisgICAgfQorICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7CisgICAgfQorCisgICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKKyAgICAKKyAgICByZXR1cm4gbWFjOworfQorCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQoreworICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7CisKKyAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKKyAgICB9CisKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqICAgICAKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkyLGxvMTsKKyAgICBPTVhfVTE2IGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOworICAgIE9NWF9TMzIgcmVzdWx0OworICAgIAorICAgIGxvMSAgPSBpbnB1dDE7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gaGkyICogbG8xOworICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTEsaGkyOworICAgIE9NWF9VMTYgbG8xLGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOworICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOworICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKKyAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKKyAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKK3sKKyAgICBPTVhfRjY0IHJlc3VsdDsKKyAgICAKKyAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7CisgICAgCisgICAgaWYgKHJlc3VsdCA+PSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9IDAuNTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0IC09IDAuNTsKKyAgICB9CisKKyAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Cit9CisKKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWY5MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgCisgICAgaWYoTiA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCit7CisgICAgaWYoKnBPZmZzZXQgPiAwKQorICAgIHsKKyAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7CisgICAgICAgICpwT2Zmc2V0ID0gMDsKKyAgICB9ICAgIAorfQorCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCit7CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQorICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCisgKiBwb2ludGVkIGJ5IHBDb2RlQm9vaworICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKnBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgorICoqLworI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKKworT01YX1UxNiBhcm1VblBhY2tWTEMzMigKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCispCit7ICAgIAorICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgT01YX0lOVCBJbmRleDsKKyAgICAgICAgCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKKyAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQorICAgIHsKKyAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47CisgICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7CisgICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gSW5kZXg7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBwQ29kZUJvb2srKzsKKyAgICB9CisKKyAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCisgICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCisgKgorICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispCit7CisgICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgICAgIAorICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLworICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKKyAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKKworICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLworICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQorICAgIHsKKyAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7CisgICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKKyAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOworICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OworICAgIH0KKworICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KKyAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOworICAgIAorICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispCit7CisgICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmNWUyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYworICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCisJICAKK19fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KK3sKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKKyAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKKyAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKKyAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKKyAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKK307CisgICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCitjb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQoreworICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCisgICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAorICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAorICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKKyAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKK307CisgICAKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQoreworICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KKyAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCisgICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLworICAgIDB4MDAwMCAgICAKK307CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDlmODhjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKworY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCit9OworCitjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzViNTEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaApAQCAtMCwwICsxLDExNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybVZpZGVvLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgorICoKKyAqLworCisKKyNpZm5kZWYgX2FybVZpZGVvX0hfCisjZGVmaW5lIF9hcm1WaWRlb19IXworCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RydWN0IG00cDJfTUVTcGVjCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOworfTsKKworc3RydWN0IG00cDEwX01FU3BlYworeworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Cit0eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECisgKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0CisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECisgKi8KKworT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKKyAgICBPTVhfUzE2IG12WCwKKyAgICBPTVhfUzE2IG12WSwKKyAgICBPTVhfSU5UIGNhbmRTQUQsCisgICAgT01YX1MxNiBiZXN0TVZYLAorICAgIE9NWF9TMTYgYmVzdE1WWSwKKyAgICBPTVhfSU5UIGJlc3RTQUQpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KKyAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKyAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KKyAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCisgKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKKyAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaworICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKKyAgICAgT01YX0lOVCBjdXJRUCwKKyAgICAgT01YX0lOVCBwcmVkUVAsCisgICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAorICAgICBPTVhfVTggIHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAorICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKKyAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQorICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAorICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4CisgKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKKyAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCisgKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorICAgIE9NWF9VMzIgc3RvcmVSdW4sCisgICAgT01YX1MxNiAqIHBEc3QsCisgICAgT01YX1MxNiBzdG9yZUxldmVsLAorICAgIE9NWF9VOCAgc2lnbiwKKyAgICBPTVhfVTggIGxhc3QsCisgICAgT01YX1U4ICAqIGluZGV4LAorICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCisgKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispOworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKKyAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAorICAgICBPTVhfVTggKiBwVHJhbnNwCispOworCisvKiAKKyAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKKyAqLworLyogRGVmaW5lcyAqLworI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKKworCisvKiBEZXF1YW50IHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKK2V4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107CisKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCisgKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgorICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCisgKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYworICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAorICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQorICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAorICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCisgKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKKyAqIAorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCisgICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCisgICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCisgICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCisgICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KKyAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLworICAgIGludCBDaHJvbWFGbGFnCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAorCQlPTVhfVTMyIAlpU3JjU3RlcCwgCisJCU9NWF9VOCogCXBEc3QsIAorCQlPTVhfVTMyIAlpRHN0U3RlcCwgCisJCU9NWF9VMzIgCWlXaWR0aCwgCisJCU9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQorCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKKwkgT01YX1UzMiAJaVNyY1N0ZXAsIAorIAkgT01YX1U4KiAJcERzdCwKKyAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKKyAJIE9NWF9VMzIgCWlXaWR0aCwgCisgCSBPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCisgKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQsCisJT01YX1UzMgkJaVdpZHRoKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcworICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKKyAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlXaWR0aCwKKwkgT01YX1UzMgkJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKKyAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCisgKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgorICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKKyAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCisgKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKKyAgICAgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYgKnBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9TMTYqIHBEQywKKyAgICAgaW50IEFDCispOworCisjZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMmEwMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCkBAIC0wLDAgKzEsNzIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDQ09NTV9zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCis7Ly8gCis7Ly8gRm9ybXVsYSB1c2VkOgorOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KKworCisKKyAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAorICAgICAKKyAgICAgOy8vLyoKKyAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMworICAgICA7Ly8gKgorICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgICAgIDsvLyAqIAorICAgICA7Ly8gKiBSZW1hcmtzOgorICAgICA7Ly8gKgorICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgorICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKKyAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCisgICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgorICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCisgICAgIDsvLyAqLworICAgICAKKyAgICAgTUFDUk8KKworICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCisgICAgIAorICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCisgICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKKyAgICAgU1VCTFQgJHksICR5LCAkdDsKKworICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQorICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KKworICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKKyAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKKyAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCisKKyAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQorICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAorCisgICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKKyAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKKyAgICAgCisgICAgIE1FTkQKKyAgICBFTkRJRiAgICAgIAorICAgIAorICAgIAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAorCisgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODlmMzA0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCkBAIC0wLDAgKzEsMTI5IEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKzsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLworOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KKworO2VudW0geworT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCis7fQorCis7LyoqIGRpcmVjdGlvbiAqLworO2VudW0geworT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKK09NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOworT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKKzt9CisKKzsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCis7ZW51bSB7CitPTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgYSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWCAgRVFVIDE7CS8qKiBjYXNlIGIgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1kgIEVRVSAyOwkvKiogY2FzZSBjICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgZCAqLworO30KKworO2VudW0geworT01YX1VQUEVSICAJCQkJRVFVIDE7CQkvKiogc2V0IGlmIHRoZSBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX0xFRlQgICAJCQkJRVFVIDI7CQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfQ0VOVEVSIAkJCQlFUVUgNDsKK09NWF9SSUdIVAkJCQlFUVUgODsKK09NWF9MT1dFUiAgCQkJCUVRVQkxNjsKK09NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OworT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgorO30KKworO2VudW0geworT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJLyoqIEFscGhhIGNvbXBvbmVudCAqLworO30KKworO2VudW0geworT01YX1ZJREVPX0lOVEVSCQkJRVFVIDA7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUl9RCQlFUVUgMTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSNFYJCUVRVSAyOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5UUkEJCQlFUVUgMzsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5UUkFfUQkJRVFVIDQ7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSNFZfUQkJRVFVIDU7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCitPTVhfVklERU9fRElSRUNUCQlFUVUgNjsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAoTVBFRy00IG9ubHkpICovCitPTVhfVklERU9fSU5URVJQT0xBVEUJRVFVIDc7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19CQUNLV0FSRAkJRVFVIDg7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19GT1JXQVJECQlFUVUgOTsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX05PVENPREVECQlFUVUgMTA7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KKzt9CisKKztlbnVtIHsKK09NWF8xNlgxNl9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9EQyAJCQlFUVUgMjsJCS8qKiBJbnRyYV8xNngxNl9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV8xNngxNl9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO2VudW0geworT01YXzR4NF9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IT1IgIAkJCUVRVSAxOwkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RDICAgCQkJRVFVIDI7CQkvKiogSW50cmFfNHg0X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RJQUdfREwgCQlFUVUgMzsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19EUiAJCUVRVSA0OwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVlIgCQkJCUVRVSA1OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSEQgCQkJCUVRVSA2OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X1ZMIAkJCQlFUVUgNzsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSFUgCQkJCUVRVSA4OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO2VudW0geworT01YX0NIUk9NQV9EQyAJCQlFUVUgMDsJCS8qKiBJbnRyYV9DaHJvbWFfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1ZFUlQgCQlFUVUgMjsJLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfQ2hyb21hX1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7dHlwZWRlZglzdHJ1Y3QgewkKK3gJRVFVCTA7Cit5CUVRVQk0OworO31PTVhDb29yZGluYXRlOworCis7dHlwZWRlZiBzdHJ1Y3QgeworZHgJRVFVCTA7CitkeQlFUVUJMjsKKzt9T01YTW90aW9uVmVjdG9yOworCis7dHlwZWRlZiBzdHJ1Y3QgeworeHgJCUVRVQkwOworeXkJCUVRVQk0Oword2lkdGgJRVFVCTg7CitoZWlnaHQJRVFVCTEyOworO31PTVhpUmVjdDsKKworO3R5cGVkZWYgZW51bSB7CitPTVhfVkNfSU5URVIgICAgICAgICBFUVUgMDsgICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUl9RICAgICAgIEVRVSAxOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5URVI0ViAgICAgICBFUVUgMjsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVFJBICAgICAgICAgRVFVIDM7ICAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KK09NWF9WQ19JTlRSQV9RICAgICAgIEVRVSA0OyAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWX1EgICAgIEVRVSA1OyAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworO30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKztlbnVtIHsKK09NWF9WQ19OT05FICAgICAgICAgIEVRVSAwCitPTVhfVkNfSE9SSVpPTlRBTCAgICBFUVUgMQorT01YX1ZDX1ZFUlRJQ0FMICAgICAgRVFVIDIgCis7fTsKKworCisJRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTZkNTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCkBAIC0wLDAgKzEsOTUgQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgICAgIElGIENvcnRleEE4CisgICAgIAorICAgICAKKyA7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmMgICAgUk4gMCAgICAgICAgCitwRHN0ICAgIFJOIDEgICAgICAgIAorc3RlcCAgICBSTiAyCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICBSTiAwCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworWDAgICAgICBETiBEMC5TOCAKK1gxICAgICAgRE4gRDEuUzggCitYMiAgICAgIEROIEQyLlM4CitYMyAgICAgIEROIEQzLlM4CitYNCAgICAgIEROIEQ0LlM4CitYNSAgICAgIEROIEQ1LlM4CitYNiAgICAgIEROIEQ2LlM4CitYNyAgICAgIEROIEQ3LlM4IAorIAorICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYKKyAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAgICAgICAgOy8vIExvYWQgMTYgYnl0ZXMgZnJvbSAxNiBieXRlIGFsaWduZWQgcFNyYyBhbmQgcFNyYz1wU3JjICsgc3RlcCBhZnRlciBsb2FkaW5nCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICA7Ly8gU3RvcmUgMzIgYnl0ZXMgdG8gMTYgYnl0ZSBhbGlnbmVkIHBEc3QgICAKKyAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQorICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCisgICAgICAgICAKKyAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgICAgICAgICAgCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKKworICAgICAgICAKKyAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisKKyAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI5ZTVlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKQEAgLTAsMCArMSw3MCBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAgICBJRiBDb3J0ZXhBOAorICAgICAKKyAgICAgCisgOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMworUmV0dXJuICBSTiAwCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworWDAgICAgICBETiBEMC5TOCAKK1gxICAgICAgRE4gRDEuUzgKK1gyICAgICAgRE4gRDIuUzgKK1gzICAgICAgRE4gRDMuUzgKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTh4OAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcCAgICAgICAgICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSA4IGJ5dGUgYWxpZ25lZCBwU3JjLCBwU3JjPXBTcmMrc3RlcCBhZnRlciBsb2FkCisgICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICA7Ly8gU3RvcmUgMTYgYnl0ZXMgdG8gOCBieXRlIGFsaWduZWQgcERzdCAgCisgICAgICAgIFZTVDEgIHtYMixYM30sW3BEc3RdISAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTEQxICB7WDB9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICAgIAorICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjNWI3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCkBAIC0wLDAgKzEsMjM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKworICAgIAorICAgIElGIENvcnRleEE4CisgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCisKKzsvL0lucHV0IHJlZ2lzdGVycworCitwU3JjRHN0UGxhbmUgICAgUk4gIDAKK2lGcmFtZVdpZHRoICAgICBSTiAgMQoraUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAoraUV4cGFuZFBlbHMgICAgIFJOICAzCitpUGxhbmVTdGVwICAgICAgUk4gIDQKK3BUb3AgICAgICAgICAgICBSTiAgNQorcEJvdCAgICAgICAgICAgIFJOICA2CitwRHN0VG9wICAgICAgICAgUk4gIDcKK3BEc3RCb3QgICAgICAgICBSTiAgOAorcExlZnQgICAgICAgICAgIFJOICA1CitwUmlnaHQgICAgICAgICAgUk4gIDYKK3BEc3RMZWZ0ICAgICAgICBSTiAgOQorcERzdFJpZ2h0ICAgICAgIFJOICAxMAorT2Zmc2V0ICAgICAgICAgIFJOICAxMQorVGVtcCAgICAgICAgICAgIFJOICAxNAorQ291bnRlciAgICAgICAgIFJOICAxMgorVG1wICAgICAgICAgICAgIFJOICA3Cis7Ly9PdXRwdXQgcmVnaXN0ZXJzCisKK3Jlc3VsdCAgICAgICAgICBSTiAgMAorOy8vIE5lb24gcmVnaXN0ZXJzCitxRGF0YTAgICAgICAgICAgUU4gIDAuVTgKK3FEYXRhMSAgICAgICAgICBRTiAgMS5VOAorZERhdGEwICAgICAgICAgIEROICAwLlU4CitkRGF0YTEgICAgICAgICAgRE4gIDEuVTgKK2REYXRhMiAgICAgICAgICBETiAgMi5VOAorZERhdGEzICAgICAgICAgIEROICAzLlU4CisKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgICAgcFBsYW5lU3RlcCwgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgICAgaVBsYW5lU3RlcCwgcFBsYW5lU3RlcAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFRvcCwgcFNyY0RzdFBsYW5lLCAjMCAgICAgICAgICAgICAgOy8vIFRvcCByb3cgcG9pbnRlciBvZiB0aGUgZnJhbWUKKyAgICAgICAgTVVMICAgICAgICAgT2Zmc2V0LCBpRXhwYW5kUGVscywgaVBsYW5lU3RlcCAgICAgOy8vIEUqU3RlcCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIFRlbXAsIGlGcmFtZUhlaWdodCwgIzEgICAgICAgICAgICAgIDsvLyBILTEKKyAgICAgICAgTVVMICAgICAgICAgVGVtcCwgaVBsYW5lU3RlcCwgVGVtcCAgICAgICAgICAgICAgOy8vIChILTEpKlN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcEJvdCwgVGVtcCwgcFNyY0RzdFBsYW5lICAgICAgICAgICAgOy8vIEJQdHIgPSBUUHRyICsgKEgtMSkqU3RlcAorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRnJhbWVXaWR0aCAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgbG9vcCBjb3VudGVyCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgaWYgcFNyY0RzdFBsYW5lIGFuZCBpUGxhbmVTdGVwIGFyZSAxNiBieXRlIGFsaWduZWQKKyAgICAgICAgVFNUICAgICAgICAgcFNyY0RzdFBsYW5lLCAjMHhmCisgICAgICAgIFRTVEVRICAgICAgIGlQbGFuZVN0ZXAsICMweGYgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICBIb3I4TG9vcDAwCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgdG9wIGFuZCBib3R0b20gcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyB0b3AgcmVnaW9uID0gdG9wIHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gYm90dG9tIHJlZ2lvbiA9IGxhc3Qgcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworCisgICAgICAgIDsvLyBDYXNlIGZvciAxNiBieXRlIGFsaWdubWVudAorSG9yMTZMb29wMDAKKyAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0CisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDEyOF0hCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKKyAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAorICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEAxMjhdIQorVmVyMTZMb29wMAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyMTZMb29wMAorCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgorICAgICAgICBCR1QgICAgICAgICBIb3IxNkxvb3AwMAorICAgICAgICBCICAgICAgICAgICBFbmRBbGlnbmVkTG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIENhc2UgZm9yIDggYnl0ZSBhbGlnbm1lbnQKK0hvcjhMb29wMDAKKyAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0CisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDY0XSEKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgorICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDY0XSEKK1ZlcjhMb29wMAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXI4TG9vcDAKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKKyAgICAgICAgQkdUICAgICAgICAgSG9yOExvb3AwMAorCitFbmRBbGlnbmVkTG9vcAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjRHN0UGxhbmUsIGlGcmFtZVdpZHRoCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RSaWdodCwgVGVtcCwgT2Zmc2V0CisgICAgICAgIFNVQiAgICAgICAgIHBSaWdodCwgVGVtcCwgIzEKKyAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBTcmNEc3RQbGFuZSwgT2Zmc2V0ICAgIAorICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIGlFeHBhbmRQZWxzICAgIAorICAgICAgICBBREQgICAgICAgICBwTGVmdCwgcFNyY0RzdFBsYW5lLCAjMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAgICAgICAgIDsvLyBUb3AtTGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMAorICAgICAgICBTVUIgICAgICAgICBPZmZzZXQsIGlQbGFuZVN0ZXAsIGlFeHBhbmRQZWxzCisgICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcCAgICAgICA7Ly8gVG9wLVJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGExCisgICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb3B5IHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyB0b3AtbGVmdCByZWdpb24gPSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIHRvcC1yaWdodCByZWdpb24gPSB0b3AtcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworSG9yTG9vcDExCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCitWZXJMb29wMQorICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4CisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDEKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJQTCAgICAgICAgIEhvckxvb3AxMQorCisgICAgICAgIFNVQiAgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgbGVmdCBhbmQgcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyBMZWZ0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIGxlZnQgc3RhcnQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIFJpZ2h0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIHJpZ2h0IGVuZCBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8KK0hvckxvb3AyMgorICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcAorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscworICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAKK1Zlckxvb3AyCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMgorCisgICAgICAgIFNVQlMgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AyMgorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgYm90dG9tLWxlZnQgYW5kIGJvdHRvbS1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKKyAgICAgICAgOy8vIGJvdHRvbS1sZWZ0IHJlZ2lvbiA9IGJvdHRvbS1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gYm90dG9tLXJpZ2h0IHJlZ2lvbiA9IGJvdHRvbS1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vCitIb3JMb29wMzMKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKK1Zlckxvb3AzCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMworCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0CisgICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKKyAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDMzCitFbmQKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX0VORCAgICAKKyAgICAKKyAgICBFTkRJRgorCisKKworICAgICAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQ3YTJkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIEhlYWRlciBmaWxlIGZvciBvcHRpbWl6ZWQgSC4yNjQgQ0FMVkMgdGFibGVzCisgKiAKKyAqLworIAorI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisgIAorLyogQ0FWTEMgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMDg5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjIyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCis7Ly8gRnVuY3Rpb25zOgorOy8vICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduPEFMSUdOTUVOVD5fdW5zYWZlICAKKzsvLworOy8vIEltcGxlbWVudHMgQXZlcmFnZSBvZiA0eDQgd2l0aCBlcXVhdGlvbiBjID0gKGErYisxKT4+MS4KKzsvLyBGaXJzdCBvcGVyYW5kIHdpbGwgYmUgYXQgb2Zmc2V0IEFMSUdOTUVOVCBmcm9tIGFsaWduZWQgYWRkcmVzcworOy8vIFNlY29uZCBvcGVyYW5kIHdpbGwgYmUgYXQgYWxpZ25lZCBsb2NhdGlvbiBhbmQgd2lsbCBiZSB1c2VkIGFzIG91dHB1dC4KKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMgd2hlcmUgcjIgY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjMgc3RlcCBzaXplCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByNCxyNSxyNixyOCxyOSxyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIyIC0gcG9pbnRlciB0byB0aGUgYWxpZ25lZCBsb2NhdGlvbgorOy8vIHIzIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFByZWQwICAgICAgICAgIFJOIDAKK2lQcmVkU3RlcDAgICAgICBSTiAxCitwUHJlZDEgICAgICAgICAgUk4gMgoraVByZWRTdGVwMSAgICAgIFJOIDMKK3BEc3RQcmVkICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpUHJlZEEwICAgICAgICAgUk4gMTAKK2lQcmVkQTEgICAgICAgICBSTiAxMQoraVByZWRCMCAgICAgICAgIFJOIDEyCitpUHJlZEIxICAgICAgICAgUk4gMTQKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorUmVzdWx0QSAgICAgICAgIFJOIDUKK1Jlc3VsdEIgICAgICAgICBSTiA0CityMHg4MDgwODA4MCAgICAgUk4gNworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMCBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDAKKyAgICAgICAgTV9FTkQKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMiBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKKworICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMgorICAgICAgICBNX0VORAorCisKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDMgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQzCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM3NDk1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Cit7CisgICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLyogMngyIERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQoreworICAgIDAsIDEsIDIsIDMKK307CisKKworLyoKKyAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQorICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAorICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICovCitjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KK3sKKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KKyAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KKyAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KKyAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KKyAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKKyAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKKyAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKKyAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKKyAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKKyAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKKyAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKKyAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKKyAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKKyAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKKyAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKKyAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKKyAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKKyAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKKyAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKKyAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKKyAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0geworICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAorICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAorICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAorICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAorICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAorICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKKyAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKKyAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKKyAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKKyAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKKyAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKKyAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKKyAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7CisgICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCisgICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCisgICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7CisgICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCisgICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCisgICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCisgICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCisgICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7CisgICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0geworICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMworfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7CisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0geworICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7CisgICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0geworICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7CisgICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKKyAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKKyAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKKyAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgorfTsKKworLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzNhNzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE5OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAgICAgCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CisKKzsvLyBiU0xUNAorZFRDMzIxMCAgICAgRE4gRDE4LlU4ICAgCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKK2RNYXNrXzQgICAgIEROIEQyNi5VMTYKKworZFRlbXAgICAgICAgRE4gRDI4LlU4CitkRHVtbXkgICAgICBETiBEMTcuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKKworOy8vIGJTR0U0CisKK2RIU3AwcTEgICAgIEROIEQxMy5VOAorZEhTcTBwMSAgICAgRE4gRDMxLlU4ICAgCisKK2RCUzMyMTAgICAgIEROIEQyOC5VMTYKKworZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTggICA7VGVtcDIgICAgICAgIAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Cis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKKzsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgCisgICAgICAgIDtkVEMzMjEwIC0xOAorICAgICAgICA7ZFRlbXAtMjgKKworICAgICAgICBWTEQxICAgICAgICBkMTguVTMyWzBdLCBbcFRocmVzaG9sZHNdISA7aGVyZQorCisgICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKKyAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQorCisgICAgICAgIDsvLyBxRHAxcTEtMTEKKyAgICAgICAgOy8vIHFEcTBwMC0xMAorICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZFRlbXAsIGRUQzMyMTAKKyAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAorICAgICAgICBWWklQLjggICAgICBkVEMzMjEwLCBkVGVtcAorICAgIAorICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAorCisgICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCisKKyAgICAgICAgOy8vIGRUQzMyMTAtMTgKKyAgICAgICAgOy8vIGRUZW1wLTI4CisgICAgICAgIDsvLyBkVEMtMzEKKyAgICAgICAgVkJJRiAgICAgICAgZFRDMzIxMCwgZE1hc2tfMCwgZEZpbHQKKyAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMzIxMCwgZE1hc2tfMQorICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQorICAgICAgICA7Ly8gZERlbHRhLWQyMAorCisgICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKyAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcworICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKyAgICAgICAgOzEKKyAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKworICAgICAgICA7Ly8gZFBfMG4gLSAyOQorICAgICAgICA7Ly8gZFFfMG4gLSAyNAorCisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOworCisgICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBxUF8wbiAtIDE0CisgICAgICAgIDsvLyBxUV8wbiAtIDEyCisgICAgICAgIAorICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAorICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAorCisgICAgICAgIDsxCisgICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCisgICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCisgICAgICAgIAorICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KKyAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCisKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIAorICAgICAgICA7ZEhTcTBwMSAtIDMxCisgICAgICAgIDtkSFNwMHExIC0gMTMKKyAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCisgICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKKworICAgICAgICA7Ly8gUHJlcGFyZSB0aGUgYlMgbWFzaworCisgICAgICAgIDsvLyBkSFNwMHExLTEzCisgICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTEzCisgICAgICAgIDsvLyBkSFNxMHAxLTMxCisgICAgICAgIDsvLyBkUV8wdC1UZW1wMS0zMQorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorCisgICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAorICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGICAKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFmZTRmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAgICAgCitwVGhyZXNob2xkcyBSTiA1CisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CisKKzsvLyBiU0xUNAorZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCitkVEMxICAgICAgICBETiBEMTkuVTggICAKK2RUQzAxICAgICAgIEROIEQxOC5VOCAgIAorCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBDb21wdXRpbmcgUDAsUTAKK3FEcTBwMCAgICAgIFFOIFExMC5TMTYKK3FEcDFxMSAgICAgIFFOIFExMS5TMTYKK3FEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCitkRGVsdGEgICAgICBETiBEMjAuUzgKKworCis7Ly8gQ29tcHV0aW5nIFAxLFExCitkUnAwcTAgICAgICBETiBEMjQuVTgKKworZE1heFAgICAgICAgRE4gRDIzLlU4CitkTWluUCAgICAgICBETiBEMjIuVTgKKworZE1heFEgICAgICAgRE4gRDE5LlU4CitkTWluUSAgICAgICBETiBEMjEuVTgKKworZERlbHRhUCAgICAgRE4gRDI2LlU4CitkRGVsdGFRICAgICBETiBEMjcuVTgKKworcVBfMG4gICAgICAgUU4gUTE0LlMxNgorcVFfMG4gICAgICAgUU4gUTEyLlMxNgorCitkUV8wbiAgICAgICBETiBEMjQuVTgKK2RRXzFuICAgICAgIEROIEQyNS5VOAorZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKKworOy8vIGJTR0U0CisKK3FTcDBxMCAgICAgIFFOIFExMC5VMTYKKworcVNwMnExICAgICAgUU4gUTExLlUxNgorcVNwMHEwcDEgICAgUU4gUTEyLlUxNgorcVNwM3AyICAgICAgUU4gUTEzLlUxNgorZEhTcDBxMSAgICAgRE4gRDI4LlU4CisKK3FTcTJwMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHExICAgIFFOIFExMi5VMTYKK3FTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQorZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCisKK3FUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCitxVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAorCitkUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCitkUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorZFBfMm4gICAgICAgRE4gRDMxLlU4CisKK2RRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKzsvLworOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQorOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNworOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIHBUaHJlc2hvbGRzOiByNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDE6IEQyOS1EMzAsIFEwLVExOiBEMjQtRDI1Cis7Ly8gICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zIC0gcFRocmVzaG9sZHM6IHI1CisKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICAKKyAgICAgICAgOy8vIHFEcTBwMC0xMAorICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RUQzBbXX0sIFtwVGhyZXNob2xkc10hCisgICAgICAgIDsvLyBxRHAxcTEtMTEKKyAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkVEMxW119LCBbcFRocmVzaG9sZHNdIQorCisgICAgICAgIDsvLyBkUnAwcTAtMjQKKyAgICAgICAgVlNIUiAgICAgICAgcURwMXExLCBxRHAxcTEsICMyICAgICAgCisgICAgCisgICAgICAgIDsvLyBkVEMwMSA9IChkVEMxIDw8IDQpIHwgZFRDMAorICAgICAgICA7Ly8gZFRDMDEtMTgKKyAgICAgICAgVkVYVCAgICAgICAgZFRDMDEsIGRUQzAsIGRUQzEsICM0CisgICAgICAgIDsvLyBkVGVtcC0xOQorICAgICAgICBWQU5EICAgICAgICBkVGVtcCwgZEFwZmxnLCBkTWFza18xCisgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkVEMwMSwgZE1hc2tfMCwgZEZpbHQKKyAgICAKKworICAgICAgICA7Ly8gZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7CisgICAgICAgIDsvLyBkRGVsdGEgPSAocURwMXExID4+IDIgKyBxRHEwcDAgKyAxKT4+IDEKKworICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAorICAgICAgICBWUkhBREQgICAgICBxRGVsdGEsIHFEcDFxMSwgcURxMHAwICAKKyAgICAgICAgVlJIQUREICAgICAgZFJwMHEwLCBkUF8wLCBkUV8wICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMDEsIGRUZW1wCisKKyAgICAgICAgOy8vIGRUQyA9IGRUQzAxICsgKGRBcGxnICYgMSkgKyAoZEFxZmxnICYgMSkKKyAgICAgICAgCisgICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXFmbGcsIGRNYXNrXzEKKyAgICAgICAgVlFBREQgICAgICAgZE1heFAsIGRQXzEsIGRUQzAxICAgICAgCisgICAgICAgIFZRTU9WTiAgICAgIGREZWx0YSwgcURlbHRhCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDLCBkVGVtcAorCisgICAgICAgIDsvLyBkTWF4UCA9IFFBREQoZFBfMSwgZFRDMDEpCisgICAgICAgIDsvLyBkTWluUCA9IFFTVUIoZFBfMSwgZFRDMDEpCisgCisgICAgICAgIDsvLyBkTWF4UC1kMjMKKyAgICAgICAgOy8vIGRNaW5QLWQyMgorICAgICAgICBWUVNVQiAgICAgICBkTWluUCwgZFBfMSwgZFRDMDEgICAgICAKKworICAgICAgICA7Ly8gZERlbHRhLWQyMAorCisgICAgICAgIDsvLyBkTWF4USA9IFFBREQoZFFfMSwgZFRDMDEpCisgICAgICAgIDsvLyBkTWluUSA9IFFTVUIoZFFfMSwgZFRDMDEpCisgCisgICAgICAgIDsvLyBkTWF4US0xOQorICAgICAgICA7Ly8gZE1pblEtMjEKKyAgICAgICAgVlFBREQgICAgICAgZE1heFEsIGRRXzEsIGRUQzAxCisgICAgICAgIFZIQUREICAgICAgIGREZWx0YVAsIGRScDBxMCwgZFBfMiAgIAorICAgICAgICBWTUlOICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcworCisgICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKKyAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcworICAgICAgICAKKyAgICAgICAgVlFTVUIgICAgICAgZE1pblEsIGRRXzEsIGRUQzAxCisKKyAgICAgICAgOy8vIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKKyAgICAgICAgOy8vIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOworCisgICAgICAgIDsvLyBkRGVsdGFQID0gKGRQXzIgKyBkUnAwcTApPj4xOworICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKGRQXzEgLSBkVEMwMSwgZFBfMSArIGRUQzAxLCBkRGVsdGFQKTsKKyAgICAgICAgOy8vIGRQXzFuID0gYXJtQ2xpcChNaW5QLCBNYXhQLCBkRGVsdGFQKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7CisgICAgICAgIDsvLyBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKHExICsgZGVsdGEpOworCisgICAgICAgIDsvLyBkRGVsdGFRID0gKGRRXzIgKyBkUnAwcTApPj4xOworICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKGRRXzEgLSBkVEMwMSwgZFFfMSArIGRUQzAxLCBkRGVsdGFRKTsKKyAgICAgICAgOy8vIGRRXzFuID0gYXJtQ2xpcChNaW5RLCBNYXhRLCBkRGVsdGFRKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkRGVsdGFQLTI2CisgICAgICAgIFZIQUREICAgICAgIGREZWx0YVEsIGRScDBxMCwgZFFfMiAgIAorCisgICAgICAgIDsvLyBkRGVsdGFRLTI3CisgICAgICAgIAorICAgICAgICA7Ly8gZFBfMG4gLSAyOQorICAgICAgICA7Ly8gZFBfMW4gLSAzMAorICAgICAgICA7Ly8gZFFfMG4gLSAyNAorICAgICAgICA7Ly8gZFFfMW4gLSAyNQorICAgICAgICAKKyAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7CisKKyAgICAgICAgVk1BWCAgICAgICAgZFBfMW4sIGREZWx0YVAsIGRNaW5QICAgCisgICAgICAgIFZNQVggICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCisKKyAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRRXzAgLSBkZWx0YSk7CisKKyAgICAgICAgOy8vIGRQXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7CisgICAgICAgIDsvLyBkUV8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICAKKyAgICAgICAgOy8vIHFQXzBuIC0gMTQKKyAgICAgICAgOy8vIHFRXzBuIC0gMTIKKyAgICAgICAgCisgICAgICAgIFZNT1ZMICAgICAgIHFQXzBuLCBkUF8wCisgICAgICAgIFZNT1ZMICAgICAgIHFRXzBuLCBkUV8wCisKKyAgICAgICAgVkFERFcgICAgICAgcVBfMG4sIHFQXzBuLCBkRGVsdGEKKyAgICAgICAgVlNVQlcgICAgICAgcVFfMG4sIHFRXzBuLCBkRGVsdGEKKyAgICAgICAgCisgICAgICAgIFZRTU9WVU4gICAgIGRQXzBuLCBxUF8wbgorICAgICAgICBWUU1PVlVOICAgICBkUV8wbiwgcVFfMG4KKyAgICAgICAgCisgICAgICAgIFZNQVggICAgICAgIGRRXzFuLCBkRGVsdGFRLCBkTWluUQorCisgICAgICAgIFZNSU4gICAgICAgIGRQXzFuLCBkUF8xbiwgZE1heFAKKyAgICAgICAgVk1JTiAgICAgICAgZFFfMW4sIGRRXzFuLCBkTWF4UQorICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKKworICAgICAgICBWQklGICAgICAgICBkUF8xbiwgZFBfMSwgZEFwZmxnCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisgICAgICAgIFZCSUYgICAgICAgIGRRXzFuLCBkUV8xLCBkQXFmbGcKKworICAgICAgICBNX0VORAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCis7Ly8KKzsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKKzsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKKzsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBhbHBoYTogRDAsIGRNYXNrXzE6IEQxNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDI6IEQyOS1EMzEsIFEwLVEyOiBEMjQsRDI1LEQyOAorCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQorCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIAorCisgICAgICAgIDsvLyBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAorICAgICAgICA7Ly8gYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpICAgICAgICAKKworICAgICAgICA7Ly8gKCBkQXBmbGcgJiBkQXAwcTAgPCAoZEFscGhhID4+IDIgKyAyKSApCisgICAgICAgIDsvLyAoIGRBcWZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKKworICAgICAgICA7Ly8gKCBkQXBmbGcgPSBkQXBmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQorICAgICAgICA7Ly8gKCBkQXFmbGcgPSBkQXFmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQorCisgICAgICAgIDsvLyBQIEZpbHRlcgorCisgICAgICAgIFZTSFIgICAgICAgIGRUZW1wLCBkQWxwaGEsICMyCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQorCisgICAgICAgIDsvLyBxU3AwcTAtMTAKKyAgICAgICAgVkFEREwgICAgICAgcVNwMHEwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQorCisgICAgICAgIDsvLyBxU3AycTEtMTEKKyAgICAgICAgOy8vIHFTcDBxMHAxLTEyCisgICAgICAgIFZBRERMICAgICAgIHFTcDJxMSwgZFBfMiwgZFFfMSAgICAgIAorICAgICAgICBWQUREVyAgICAgICBxU3AwcTBwMSwgcVNwMHEwLCBkUF8xICAKKworICAgICAgICBWQ0dUICAgICAgICBkVGVtcCwgZFRlbXAsIGRBcDBxMAorICAgICAgICBWU0hSICAgICAgICBxU3AycTEsICMxICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoICggKHAwICsgcTAgKyBwMSkgKyAocDIgKyBxMSk+PjEgKSA+PiAxICsgMSApID4+IDEKKworICAgICAgICA7Ly8gZFBfMG4gPSAoICggKHFTcDBxMCArIGRQXzEpICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUF8wbiA9ICggKCBxU3AwcTBwMSArIHFTcDJxMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFBfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKGRQXzIgKyBxU3AwcTBwMSArIDIpPj4yKTsKKyAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKHFUZW1wMiArIDIpPj4yKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoIChwMyArIHAyKSArIChwMSArIHAwICsgcTAgKyBwMikgPj4gMSArIDIpPj4yKTsKKworICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIChkUF8yICsgcVNwMHEwcDEpID4+IDEgKyAyKSA+PiAyKTsKKyAgICAgICAgOy8vIGRQXzJuID0gKE9NWF9VOCkoKCBxU3AzcDIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOworCisgICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBwMSwgcVNwMnExCisgICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcDEsIGRQXzIgIAorICAgICAgICAKKyAgICAgICAgOy8vIHFTcDNwMi0xMworICAgICAgICBWQURETCAgICAgICBxU3AzcDIsIGRQXzMsIGRQXzIgICAgICAKKworICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRBcGZsZywgZFRlbXAKKyAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCisgICAgICAgIFZTUkEgICAgICAgIHFTcDNwMiwgcVRlbXAyLCAjMSAgICAgIAorICAgICAgICA7Ly8gZEhTcDBxMS0yOAorICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRBcWZsZywgZFRlbXAKKworICAgICAgICA7Ly8gZFBfMG4tMjkKKyAgICAgICAgOy8vIGRQXzB0LWRIU3AwcTEtMjgKKyAgICAgICAgVlFSU0hSTiAgICAgZFBfMG4sIHFUZW1wMSwgIzEKKyAgICAgICAgVlJIQUREICAgICAgZFBfMHQsIGRIU3AwcTEsIGRQXzEgICAgCisKKyAgICAgICAgOy8vIGRQXzFuLTMwCisgICAgICAgIFZRUlNIUk4gICAgIGRQXzFuLCBxVGVtcDIsICMyCisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3EycDEsIGRRXzIsIGRQXzEgICAgICAgICAgCisgICAgICAgIFZBRERXICAgICAgIHFTcDBxMHExLCBxU3AwcTAsIGRRXzEgICAgICAKKyAgICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wdCwgZEFwZmxnICAgIAorCisgICAgICAgIDsvLyBRIEZpbHRlcgorCisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpKChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoICggKHAwICsgcTAgKyBxMSkgKyAocTIgKyBwMSk+PjEgKSA+PiAxICsgMSApID4+IDEKKworICAgICAgICA7Ly8gZFFfMG4gPSAoICggKHFTcDBxMCArIGRRXzEpICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUV8wbiA9ICggKCBxU3AwcTBxMSArIHFTcTJwMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFFfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWzEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHEwICsgcTAgKyAyKT4+Mik7CisgICAgICAgIAorICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgoZFFfMiArIHFTcDBxMHExICsgMik+PjIpOworICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIHBRMFsyKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoIChxMyArIHEyKSArIChxMSArIHAwICsgcTAgKyBxMikgPj4gMSArIDIpPj4yKTsKKworICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIChkUV8yICsgcVNwMHEwcTEpID4+IDEgKyAyKSA+PiAyKTsKKyAgICAgICAgOy8vIGRRXzJuID0gKE9NWF9VOCkoKCBxU3EzcTIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOworCisgICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgOy8vIHFTcTJwMS0xMQorICAgICAgICA7Ly8gcVNwMHEwcTEtMTIKKworCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgOy8vIHFUZW1wMS1xU3EycDEtMTEKKyAgICAgICAgOy8vIHFTcTNxMi0xMworICAgICAgICA7Ly8gZFBfMm4tMzEKKyAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgIGRQXzJuLCBxU3AzcDIsICMyCisgICAgICAgIFZBRERMICAgICAgIHFTcTNxMiwgZFFfMywgZFFfMiAgICAgICAgICAKKworICAgICAgICBWU0hSICAgICAgICBxU3EycDEsICMxICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBxMSwgcVNxMnAxCisgICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcTEsIGRRXzIgICAgICAKKworICAgICAgICA7Ly8gZEhTcTBwMS0yOAorICAgICAgICBWSEFERCAgICAgICBkSFNxMHAxLCBkUV8wLCBkUF8xICAgICAgICAgCisKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0CisgICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKKworICAgICAgICBWU1JBICAgICAgICBxU3EzcTIsIHFUZW1wMiwgIzEgICAgICAgICAgCisKKyAgICAgICAgOy8vIGRRXzEtVGVtcDItMjUKKyAgICAgICAgOy8vIGRRXzAtVGVtcDItMjQKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMW4sIHFUZW1wMiwgIzIKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMG4sIHFUZW1wMSwgIzEKKworICAgICAgICA7Ly8gZFFfMHQtVGVtcDEtMjIKKyAgICAgICAgVlJIQUREICAgICAgZFFfMHQsIGRIU3EwcDEsIGRRXzEKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZyAgICAgICAgIAorCisgICAgICAgIFZCSUYgICAgICAgIGRQXzJuLCBkUF8yLCBkQXBmbGcgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMHQsIGRBcWZsZyAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgIGRRXzJuLCBxU3EzcTIsICMyCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdAorICAgICAgICBWQklGICAgICAgICBkUV8ybiwgZFFfMiwgZEFxZmxnICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAKKworCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMGE4OWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKQEAgLTAsMCArMSwzMjUgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisgICAgICAgIAorTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKK1RXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcHBCaXRTdHJlYW0gICAgIFJOIDAKK3BPZmZzZXQgICAgICAgICBSTiAxCitwTnVtQ29lZmYgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK25DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKK3NNYXhOdW1Db2VmZiAgICBSTiA1CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCisKKzsvLyBMZXZlbCBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorVHJhaWxpbmdPbmVzICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitMZXZlbFN1ZmZpeCAgICAgUk4gMworU3VmZml4TGVuZ3RoICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIFJ1biBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorWmVyb3NMZWZ0ICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFJ1blRhYmxlICAgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKK3BQb3NDb2VmYnVmICAgICBSTiAwCit0ZW1wICAgICAgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKK3BaaWdaYWcgICAgICAgICBSTiA2CisKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorQ29lZmZOdW0gICAgICAgIFJOIDE0CisKKworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKKyAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKKyAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAorICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCisgICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcE5DLCA0CisgICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIE1fTERSICAgICAgbkMsIHBOQworICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCisKKyAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKKyAgICAKKyAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKKyAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKKyAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKKyAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cworCisgICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAorICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0CisgICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCisgICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCisgICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcworICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCisgICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcworVHJhaWxpbmdPbmVzTG9vcCAgICAKKyAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNT1YgICAgIFQxLCAjMQorICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKKyAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCitUcmFpbGluZ09uZXNEb25lICAgIAorICAgIAorICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCisgICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCisgICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKKyAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0CisgICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgorICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAorICAgICAgICAKK0xldmVsTG9vcAorICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAorICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAorICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKKyAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCisgICAgICAgIAorICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAorICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1CisgICAgICAgIAorICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4CisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAorICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAorICAgICAgICAgICAgIAorTGV2ZWxDb2RlUmVhZCAgICAgICAgCisgICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKKyAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93CisgICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgorICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQorICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKKyAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKKyAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAorICAgICAgICBCR1QgICAgIExldmVsTG9vcAorICAgICAgICAKK0RlY29kZVJ1bnMgICAgICAgIAorICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KKyAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAorICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQorICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorCisgICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAorCisgICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKKworICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKK1J1bkxvb3AgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCisgICAgICAgIEJMVCAgICAgTGFzdFJ1bgorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCisKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAorICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIFJ1bkxvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAorTm9aZXJvc0xlZnQgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAorCitMYXN0UnVuICAgICAgICAKKyAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCisgICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBURVEgICAgIFQxLCAjMTUKKyAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICAKKworICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKKworICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgorICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBURVEgICAgIFQxLCAjNAorICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAgICAgCisgICAgICAgIAorT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCisgICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KKyAgICAgICAgCisgICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCisgICAgICAgIAorICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAorICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKKyAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2CisgICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKKworICAgICAgICAKKyAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCisgICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKKyAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0CisgICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgorICAgICAgICAgICAgCitFbmRCYWRTeW1ib2wKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCisgICAgICAgIEIgICAgICAgRW5kICAgIAorICAgICAgICAKK0VuZE5vRXJyb3IKKyAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAorRW5kCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzYxNjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsMTIzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorCisgICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAgICAKKyAgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgICAgCisgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBEQ0IgIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKKyAgICAgICAgIERDQiAgMTEsIDE4LCAxNAorICAgICAgICAgRENCICAxMywgMjAsIDE2CisgICAgICAgICBEQ0IgIDE0LCAyMywgMTgKKyAgICAgICAgIERDQiAgMTYsIDI1LCAyMAorICAgICAgICAgRENCICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgRENXIDEwLCAxNiwgMTMgCisgICAgICAgICBEQ1cgMTEsIDE4LCAxNAorICAgICAgICAgRENXIDEzLCAyMCwgMTYKKyAgICAgICAgIERDVyAxNCwgMjMsIDE4CisgICAgICAgICBEQ1cgMTYsIDI1LCAyMAorICAgICAgICAgRENXIDE4LCAyOSwgMjMgCisgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU5MTJkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKyAgICBJRiBBUk0xMTM2SlMgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gOAoraUhlaWdodCAgICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK3ggICAgICAgICAgICAgICBSTiA3Cit4MCAgICAgICAgICAgICAgUk4gNworeDEgICAgICAgICAgICAgIFJOIDEwCit4MiAgICAgICAgICAgICAgUk4gMTEKK1NjcmF0Y2ggICAgICAgICBSTiAxMgorCis7Ly8gRnVuY3Rpb246IAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYSA0IGJ5dGUgYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDkgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyByb3dzIHRvIGNvcHkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIyLHIzLHI0LHI1LHI2Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb3B5IHBEc3QgdG8gc2NyYXRjaAorICAgICAgICBNT1YgICAgIFNjcmF0Y2gsIHBEc3QKKworU3RhcnRBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMworICAgICAgICAKKyAgICAgICAgTV9TV0lUQ0ggeAorICAgICAgICBNX0NBU0UgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5M3RvQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5MHRvQWxpZ25lZCAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisgICAgICAKK0NvcHkxdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorCitDb3B5MnRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTN0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvQWxpZ25lZAorCitDb3B5RW5kICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcFNyYywgU2NyYXRjaAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICMxMgorCisgICAgICAgIE1fRU5ECisgICAgCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gb2Ygcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwU3JjIHRvIHN0YWNrCitTdGFydFZBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkxdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b1ZBbGlnbmVkCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorQ29weTB0b1ZBbGlnbmVkICAKKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKyAgICAgIAorQ29weTF0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzgKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkydG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMxNgorICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKworQ29weTN0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMjQKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvVkFsaWduZWQKKworQ29weVZFbmQgIAorCisgICAgICAgIFNVQiAgICAgcFNyYywgcERzdCwgIzI4CisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKworICAgICAgICBNX0VORAorCisKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyNzU4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE0OSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMSxyMyxyNCxyNSxyNixyNyxyMTAscjExLHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHIwLHIyLHI4LHI5LHIxMgorCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIAorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCit4MCAgICAgICAgICAgICAgUk4gNAoreDEgICAgICAgICAgICAgIFJOIDUKK3gyICAgICAgICAgICAgICBSTiA4Cit4MyAgICAgICAgICAgICAgUk4gOQorVGVtcCAgICAgICAgICAgIFJOIDEyCisKKyAgICBJRiBBUk0xMTM2SlMKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlLCByNgorCitDb3B5NHg0U3RhcnQKKyAgICAgICAgOy8vIERvIENvcHkgYW5kIGJyYW5jaCB0byBFbmRPZkludGVycG9sYXRpb24KKyAgICAgICAgQU5EICAgICBUZW1wLCBwU3JjLCAjMworICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgTV9TV0lUQ0ggVGVtcAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjAKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24xCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMgorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjMKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ29weTR4NEFsaWduMAorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9MRFIgICB4MSwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDMsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9TVFIgICB4MywgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjEKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0CisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisgICAgICAKK0NvcHk0eDRBbGlnbjIKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorCitDb3B5NHg0QWxpZ24zIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorCitDb3B5NHg0RW5kCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlNWEzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxNzggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKworOy8vIEZ1bmN0aW9uczogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCis7Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KKzsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgorOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KKworCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKyAgICAgICAgCitNQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyYzAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAwICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorVGVtcDMgICAgICAgICAgIFJOIDEwCitUZW1wNCAgICAgICAgICAgUk4gMTEKK3BCdWYgICAgICAgICAgICBSTiA3CityMHgwZmUwMGZlMCAgICAgUk4gNgorcjB4MDBmZjAwZmYgICAgIFJOIDEyCitDb3VudCAgICAgICAgICAgUk4gMTQKK1ZhbHVlQTAgICAgICAgICBSTiAxMAorVmFsdWVBMSAgICAgICAgIFJOIDExCisKKyAgICBJRiBBUk0xMTM2SlMKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCitMb29wU3RhcnQxCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAorICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCitFbmQxCisgICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgorICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAorCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgorICAgICAgICAKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgorCitMb29wU3RhcnQgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAorCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCisgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKK0VuZDIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04CisgICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAorCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTY4NGNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzEzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorcUNvZWZmNSAgICAgICAgIFFOIDE0LlMzMgorcUNvZWZmMjAgICAgICAgIFFOIDE1LlMzMgorICAgICAgICAKK3FTcmMwMSAgICAgICAgICBRTiAwLlU4CitkU3JjMCAgICAgICAgICAgRE4gMC5VOAorZFNyYzEgICAgICAgICAgIEROIDEuVTggICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCitkU3JjYiAgICAgICAgICAgRE4gNC5VOAorZFNyY2MgICAgICAgICAgIEROIDIuVTgKK2RTcmNkICAgICAgICAgICBETiAzLlU4CitkU3JjZSAgICAgICAgICAgRE4gNS5VOAorZFNyY2YgICAgICAgICAgIEROIDEuVTgKKworcVNyY2IgICAgICAgICAgIFFOIDIuUzE2CitxU3JjYyAgICAgICAgICAgUU4gMS5TMTYKK2RTcmNCICAgICAgICAgICBETiA0LlMxNgorZFNyY0MgICAgICAgICAgIEROIDIuUzE2CisKK3FSZXMwICAgICAgICAgICBRTiA1LlMxNgorcVJlczEgICAgICAgICAgIFFOIDYuUzE2CitxUmVzMiAgICAgICAgICAgUU4gNy5TMTYKK3FSZXMzICAgICAgICAgICBRTiA4LlMxNgorcVJlczQgICAgICAgICAgIFFOIDkuUzE2CitxUmVzNSAgICAgICAgICAgUU4gMTAuUzE2CitxUmVzNiAgICAgICAgICAgUU4gMTEuUzE2CitxUmVzNyAgICAgICAgICAgUU4gMTIuUzE2CitxUmVzOCAgICAgICAgICAgUU4gMTMuUzE2CisgICAgCitkUmVzMCAgICAgICAgICAgRE4gMTAuUzE2CitkUmVzMSAgICAgICAgICAgRE4gMTIuUzE2CitkUmVzMiAgICAgICAgICAgRE4gMTQuUzE2CitkUmVzMyAgICAgICAgICAgRE4gMTYuUzE2CitkUmVzNCAgICAgICAgICAgRE4gMTguUzE2CitkUmVzNSAgICAgICAgICAgRE4gMjAuUzE2CitkUmVzNiAgICAgICAgICAgRE4gMjIuUzE2CitkUmVzNyAgICAgICAgICAgRE4gMjQuUzE2CitkUmVzOCAgICAgICAgICAgRE4gMjYuUzE2CisgICAgCitxQWNjMDEgICAgICAgICAgUU4gNS5TMzIKK3FBY2MyMyAgICAgICAgICBRTiA2LlMzMgorcUFjYzQ1ICAgICAgICAgIFFOIDIuUzMyCitxQWNjNjcgICAgICAgICAgUU4gMy5TMzIKK3FTdW1CRSAgICAgICAgICBRTiAwLlMzMgorcVN1bUNEICAgICAgICAgIFFOIDEuUzMyCisKK2RUZW1wQWNjMCAgICAgICBETiAwLlUxNgorZFRlbXBBY2MxICAgICAgIEROIDIuVTE2CitkVGVtcEFjYzIgICAgICAgRE4gNC5VMTYKK2RUZW1wQWNjMyAgICAgICBETiA2LlUxNgorCitxVEFjYzAgICAgICAgICAgUU4gMC5VMTYKK3FUQWNjMSAgICAgICAgICBRTiAxLlUxNgorcVRBY2MyICAgICAgICAgIFFOIDIuVTE2CitxVEFjYzMgICAgICAgICAgUU4gMy5VMTYKKworZEFjYzAgICAgICAgICAgIEROIDAuVTgKK2RBY2MxICAgICAgICAgICBETiAyLlU4CitkQWNjMiAgICAgICAgICAgRE4gNC5VOAorZEFjYzMgICAgICAgICAgIEROIDYuVTgKKworZFRtcDAgICAgICAgICAgIEROIDguUzE2CitkVG1wMSAgICAgICAgICAgRE4gOS5TMTYKK3FUbXAwICAgICAgICAgICBRTiA0LlMzMgorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1CisKKyAgICAgICAgOy8vIFJvdzAKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cxCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczEsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczAsIGRSZXMwLCBkVG1wMCA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMxLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3cyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczIsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93MworICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXMzLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczMsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMzLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczQsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczQsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzUKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczQsIGRSZXM0LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM1LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNSwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93NgorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM2LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzNSwgZFJlczUsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczYsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c3CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczcsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM2LCBkUmVzNiwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczcsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzgKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzOCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKworICAgICAgICBWU1VCICAgICAgICBkUmVzNywgZFJlczcsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczgsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM4LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIFZNT1YgICAgICAgIHFDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1PViAgICAgICAgcUNvZWZmNSwgIzUKKworICAgICAgICA7Ly8gQ29sMAorICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRSZXMwLCBkUmVzNSAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXMyLCBkUmVzMyAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMxLCBkUmVzNCAgICAgICAgOy8vIGIrZQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM4LCBkUmVzOCwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBxQWNjMDEsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzAxLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKworICAgICAgICA7Ly8gQ29sMQorICAgICAgICBWQURETCAgICAgICBxQWNjMjMsIGRSZXMxLCBkUmVzNiAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXMzLCBkUmVzNCAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMyLCBkUmVzNSAgICAgICAgOy8vIGIrZQorICAgICAgICBWTUxBICAgICAgICBxQWNjMjMsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorCisgICAgICAgIFZTVUIgICAgICAgIHFBY2MwMSwgcUFjYzAxLCBxVG1wMAorCis7ICAgICAgICBWTUxTICAgICAgICBxQWNjMjMsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorCisgICAgICAgIDsvLyBDb2wyCisgICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFJlczIsIGRSZXM3ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczQsIGRSZXM1ICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczMsIGRSZXM2ICAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIHFBY2M0NSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKyAgICAgICAgVlNVQiAgICAgICAgcUFjYzIzLCBxQWNjMjMsIHFUbXAwCisKKzsgICAgICAgIFZNTFMgICAgICAgIHFBY2M0NSwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29sMworICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRSZXMzLCBkUmVzOCAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXM1LCBkUmVzNiAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXM0LCBkUmVzNyAgICAgICAgOy8vIGIrZQorICAgICAgICBWTUxBICAgICAgICBxQWNjNjcsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorCisgICAgICAgIFZTVUIgICAgICAgIHFBY2M0NSwgcUFjYzQ1LCBxVG1wMAorCisgICAgICAgIFZNTFMgICAgICAgIHFBY2M2NywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKworICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzAsIHFBY2MwMSwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMSwgcUFjYzIzLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MyLCBxQWNjNDUsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzMsIHFBY2M2NywgIzEwCisgICAgICAgIAorICAgICAgICBWUU1PVk4gICAgICBkQWNjMCwgcVRBY2MwCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MxLCBxVEFjYzEKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzIsIHFUQWNjMgorICAgICAgICBWUU1PVk4gICAgICBkQWNjMywgcVRBY2MzCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2JjMDkxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDI2NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgIElGIENvcnRleEE4CisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZFRDb2VmZjUgICAgICAgIEROIDMwLlU4CitkVENvZWZmMjAgICAgICAgRE4gMzEuVTgKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworcVNyY0EwMSAgICAgICAgIFFOIDAuVTgKK3FTcmNCMjMgICAgICAgICBRTiAxLlU4CitxU3JjQzQ1ICAgICAgICAgUU4gMi5VOAorcVNyY0Q2NyAgICAgICAgIFFOIDMuVTgKK3FTcmNFODkgICAgICAgICBRTiA0LlU4CitxU3JjRjEwMTEgICAgICAgUU4gNS5VOAorcVNyY0cxMjEzICAgICAgIFFOIDYuVTgKK3FTcmNIMTQxNSAgICAgICBRTiA3LlU4CitxU3JjSTE2MTcgICAgICAgUU4gOC5VOAorCitkU3JjQTAgICAgICAgICAgRE4gMC5VOAorZFNyY0IyICAgICAgICAgIEROIDIuVTgKK2RTcmNDNCAgICAgICAgICBETiA0LlU4CitkU3JjRDYgICAgICAgICAgRE4gNi5VOAorZFNyY0U4ICAgICAgICAgIEROIDguVTgKK2RTcmNGMTAgICAgICAgICBETiAxMC5VOAorZFNyY0cxMiAgICAgICAgIEROIDEyLlU4CitkU3JjSDE0ICAgICAgICAgRE4gMTQuVTgKK2RTcmNJMTYgICAgICAgICBETiAxNi5VOAorCitkU3JjQTEgICAgICAgICAgRE4gMS5VOAorZFNyY0IzICAgICAgICAgIEROIDMuVTgKK2RTcmNDNSAgICAgICAgICBETiA1LlU4CitkU3JjRDcgICAgICAgICAgRE4gNy5VOAorZFNyY0U5ICAgICAgICAgIEROIDkuVTgKK2RTcmNGMTEgICAgICAgICBETiAxMS5VOAorZFNyY0cxMyAgICAgICAgIEROIDEzLlU4CitkU3JjSDE1ICAgICAgICAgRE4gMTUuVTgKK2RTcmNJMTcgICAgICAgICBETiAxNy5VOAorCitxVGVtcFAwMSAgICAgICAgUU4gOS5TMTYKK3FUZW1wUTAxICAgICAgICBRTiAxMC5TMTYKK3FUZW1wUjAxICAgICAgICBRTiAxMS5TMTYKK3FUZW1wUzAxICAgICAgICBRTiAxMi5TMTYKKworcVRlbXBQMjMgICAgICAgIFFOIDAuUzE2CitxVGVtcFEyMyAgICAgICAgUU4gMS5TMTYKK3FUZW1wUjIzICAgICAgICBRTiAyLlMxNgorcVRlbXBTMjMgICAgICAgIFFOIDMuUzE2CisKK2RUZW1wUDAgICAgICAgICBETiAxOC5TMTYKK2RUZW1wUDEgICAgICAgICBETiAxOS5TMTYKK2RUZW1wUDIgICAgICAgICBETiAwLlMxNgorCitkVGVtcFEwICAgICAgICAgRE4gMjAuUzE2CitkVGVtcFExICAgICAgICAgRE4gMjEuUzE2CitkVGVtcFEyICAgICAgICAgRE4gMi5TMTYKKworZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgorZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgorZFRlbXBSMiAgICAgICAgIEROIDQuUzE2CisKK2RUZW1wUzAgICAgICAgICBETiAyNC5TMTYKK2RUZW1wUzEgICAgICAgICBETiAyNS5TMTYKK2RUZW1wUzIgICAgICAgICBETiA2LlMxNgorIAorZFRlbXBCMCAgICAgICAgIEROIDI2LlMxNgorZFRlbXBDMCAgICAgICAgIEROIDI3LlMxNgorZFRlbXBEMCAgICAgICAgIEROIDI4LlMxNgorZFRlbXBGMCAgICAgICAgIEROIDI5LlMxNgorCitkVGVtcEFjYzAgICAgICAgRE4gMC5VMTYKK2RUZW1wQWNjMSAgICAgICBETiAyLlUxNgorZFRlbXBBY2MyICAgICAgIEROIDQuVTE2CitkVGVtcEFjYzMgICAgICAgRE4gNi5VMTYKKworZEFjYzAgICAgICAgICAgIEROIDAuVTgKK2RBY2MxICAgICAgICAgICBETiAyLlU4CitkQWNjMiAgICAgICAgICAgRE4gNC5VOAorZEFjYzMgICAgICAgICAgIEROIDYuVTgKKworcUFjYzAgICAgICAgICAgIFFOIDAuUzMyCitxQWNjMSAgICAgICAgICAgUU4gMS5TMzIKK3FBY2MyICAgICAgICAgICBRTiAyLlMzMgorcUFjYzMgICAgICAgICAgIFFOIDMuUzMyCisKK3FUQWNjMCAgICAgICAgICBRTiAwLlUxNgorcVRBY2MxICAgICAgICAgIFFOIDEuVTE2CitxVEFjYzIgICAgICAgICAgUU4gMi5VMTYKK3FUQWNjMyAgICAgICAgICBRTiAzLlUxNiAgICAgICAgICAgICAgICAKKworcVRtcCAgICAgICAgICAgIFFOIDQuUzE2CitkVG1wICAgICAgICAgICAgRE4gOC5TMTYKKworICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gYTE1XSAgIAorICAgICAgICBBREQgICAgICAgICByMTIsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorICAgICAgICBWTU9WICAgICAgICBkVENvZWZmNSwgIzUKKyAgICAgICAgVk1PViAgICAgICAgZFRDb2VmZjIwLCAjMjAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0YxMDExLCBbcjEyXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBxU3JjQjIzLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gYjE1XQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0cxMjEzLCBbcjEyXSwgc3JjU3RlcAorICAgICAgICBWQURETCAgICAgICBxVGVtcFAwMSwgZFNyY0EwLCBkU3JjRjEwICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0M0NSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2MwIGMxIGMyIGMzIC4uIGMxNV0KKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBQMjMsIGRTcmNBMSwgZFNyY0YxMSAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjRDY3LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBRMDEsIGRTcmNCMiwgZFNyY0cxMiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0U4OSwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly90MAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAwMSwgZFNyY0M0LCBkVENvZWZmMjAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNIMTQxNSwgW3IxMl0sIHNyY1N0ZXAKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAyMywgZFNyY0M1LCBkVENvZWZmMjAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNJMTYxNywgW3IxMl0sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbaTAgaTEgaTIgaTMgLi4gXQorICAgICAgICAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMDEsIGRTcmNENiwgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTAxLCBkU3JjRDYsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAyMywgZFNyY0IzLCBkVENvZWZmNQorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBSMDEsIGRTcmNDNCwgZFNyY0gxNCAgIAorICAgICAgICAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMDEsIGRTcmNCMiwgZFRDb2VmZjUKKworICAgICAgICBWQURETCAgICAgICBxVGVtcFEyMywgZFNyY0IzLCBkU3JjRzEzICAgCisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMjMsIGRTcmNENywgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTAxLCBkU3JjRTgsIGRUQ29lZmYyMAorCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDAxLCBkU3JjRTgsIGRUQ29lZmY1CisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTIzLCBkU3JjRDcsIGRUQ29lZmYyMAorCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDIzLCBkU3JjRTksIGRUQ29lZmY1CisKKyAgICAgICAgOy8vdDEKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIwMSwgZFNyY0U4LCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMDEsIGRTcmNDNCwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMjMsIGRTcmNDNSwgZFRDb2VmZjUKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBSMjMsIGRTcmNDNSwgZFNyY0gxNSAgIAorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjAxLCBkU3JjRjEwLCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMDEsIGRTcmNGMTAsIGRUQ29lZmY1CisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTIzLCBkU3JjRTksIGRUQ29lZmYyMAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIyMywgZFNyY0U5LCBkVENvZWZmMjAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBTMDEsIGRTcmNENiwgZFNyY0kxNiAgIAorCisKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMDEsIGRTcmNENiwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMjMsIGRTcmNGMTEsIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjIzLCBkU3JjRDcsIGRUQ29lZmY1CisKKyAgICAgICAgOy8vdDIKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBTMjMsIGRTcmNENywgZFNyY0kxNyAgIAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMwMSwgZFNyY0YxMCwgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjAxLCBkU3JjRzEyLCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIyMywgZFNyY0cxMywgZFRDb2VmZjUKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMyMywgZFNyY0YxMSwgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzAxLCBkU3JjRzEyLCBkVENvZWZmMjAKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzEKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMjMsIGRTcmNGMTEsIGRUQ29lZmYyMAorCisKKyAgICAgICAgOy8vdDMKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMjMsIGRTcmNHMTMsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMwMSwgZFNyY0U4LCBkVENvZWZmNQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMgorICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzIzLCBkU3JjRTksIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzAxLCBkU3JjSDE0LCBkVENvZWZmNQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFAxLCBkVGVtcFAyLCAjMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMworICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMyMywgZFNyY0gxNSwgZFRDb2VmZjUKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFBY2MwLCBkVGVtcFAwLCBkVGVtcEYwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKKyAgICAgICAgOy8vaCAKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKKyAgICAgICAgCisgICAgICAgIDsvLyByZXMwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUDEKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzAsIGRUZW1wQzAsIGRDb2VmZjIwCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUTAsIGRUZW1wUTEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUTEsIGRUZW1wUTIsICMxCisgICAgICAgIFZNTFNMICAgICAgIHFBY2MwLCBkVGVtcEIwLCBkQ29lZmY1CisKKyAgICAgICAgOy8vIHJlczEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzEKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzEsIGRUZW1wUTAsIGRUZW1wRjAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFExCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUjAsIGRUZW1wUjEsICMzCisgICAgICAgIFZNTEFMICAgICAgIHFBY2MxLCBkVGVtcEMwLCBkQ29lZmYyMAorICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFIxLCBkVGVtcFIyLCAjMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVG1wLCBkVGVtcFIwLCBkVGVtcFIxLCAjMQorICAgICAgICBWQURETCAgICAgICBxQWNjMiwgZFRlbXBSMCwgZFRlbXBGMAorICAgICAgICBWTUxTTCAgICAgICBxQWNjMSwgZFRlbXBCMCwgZENvZWZmNQorOyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzEKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICAKKyAgICAgICAgOy8vIHJlczIKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRtcCwgZFRlbXBSMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMworICAgICAgICBWTUxBTCAgICAgICBxQWNjMiwgZFRlbXBDMCwgZENvZWZmMjAKKzsgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUjEKKyAgICAgICAgCisgICAgICAgIDsvLyByZXMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUzEsIGRUZW1wUzIsICMxCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKKyAgICAgICAgVkVYVCAgICAgICAgZFRtcCwgZFRlbXBTMCwgZFRlbXBTMSwgIzEKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzMsIGRUZW1wUzAsIGRUZW1wRjAKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzIsIGRUZW1wQjAsIGRDb2VmZjUKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzMsIGRUZW1wQzAsIGRDb2VmZjIwCisgICAgICAgIFZBREQgICAgICAgIGRUbXAsIGRUbXAsIGRUZW1wUzEKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzMsIGRUbXAsIGRDb2VmZjUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MwLCBxQWNjMCwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMSwgcUFjYzEsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2MyLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MzLCBxQWNjMywgIzEwCisKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzAsIHFUQWNjMAorICAgICAgICBWUU1PVk4gICAgICBkQWNjMSwgcVRBY2MxCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MyLCBxVEFjYzIKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzMsIHFUQWNjMworICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIAorICAgIAorCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhYmU4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIyOCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjExCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworcVNyY0EwMSAgICAgICAgIFFOIDExLlU4CitxU3JjQjAxICAgICAgICAgUU4gMTIuVTgKK3FTcmNDMDEgICAgICAgICBRTiAxMy5VOAorcVNyY0QwMSAgICAgICAgIFFOIDE0LlU4CisKK2RTcmNBMCAgICAgICAgICBETiAyMi5VOAorZFNyY0ExICAgICAgICAgIEROIDIzLlU4CitkU3JjQjAgICAgICAgICAgRE4gMjQuVTgKK2RTcmNCMSAgICAgICAgICBETiAyNS5VOAorZFNyY0MwICAgICAgICAgIEROIDI2LlU4CitkU3JjQzEgICAgICAgICAgRE4gMjcuVTgKK2RTcmNEMCAgICAgICAgICBETiAyOC5VOAorZFNyY0QxICAgICAgICAgIEROIDI5LlU4CisKK2RTcmNiICAgICAgICAgICBETiAxMi5VOAorZFNyY2UgICAgICAgICAgIEROIDEzLlU4CitkU3JjZiAgICAgICAgICAgRE4gMTAuVTgKKworZFNyYzBjICAgICAgICAgIEROIDE0LlU4CitkU3JjMWMgICAgICAgICAgRE4gMTYuVTgKK2RTcmMyYyAgICAgICAgICBETiAxOC5VOAorZFNyYzNjICAgICAgICAgIEROIDIwLlU4CisgICAgICAgICAgICAgICAgICAgCitkU3JjMGQgICAgICAgICAgRE4gMTUuVTgKK2RTcmMxZCAgICAgICAgICBETiAxNy5VOAorZFNyYzJkICAgICAgICAgIEROIDE5LlU4CitkU3JjM2QgICAgICAgICAgRE4gMjEuVTgKKworcVRlbXAwMSAgICAgICAgIFFOIDQuUzE2CitxVGVtcDIzICAgICAgICAgUU4gNi5TMTYKK2RUZW1wMCAgICAgICAgICBETiA4LlMxNgorZFRlbXAyICAgICAgICAgIEROIDEyLlMxNgorCitxUmVzMDEgICAgICAgICAgUU4gMTEuUzE2CitxUmVzMjMgICAgICAgICAgUU4gMTIuUzE2CitxUmVzNDUgICAgICAgICAgUU4gMTMuUzE2CitxUmVzNjcgICAgICAgICAgUU4gMTQuUzE2CisKK2RSZXMwICAgICAgICAgICBETiAyMi5TMTYKK2RSZXMyICAgICAgICAgICBETiAyNC5TMTYKK2RSZXM0ICAgICAgICAgICBETiAyNi5TMTYKK2RSZXM2ICAgICAgICAgICBETiAyOC5TMTYKKworZEFjYzAgICAgICAgICAgIEROIDIyLlU4CitkQWNjMiAgICAgICAgICAgRE4gMjQuVTgKK2RBY2M0ICAgICAgICAgICBETiAyNi5VOAorZEFjYzYgICAgICAgICAgIEROIDI4LlU4CisKK2RSZXN1bHQwICAgICAgICBETiAyMi5VMzIKK2RSZXN1bHQyICAgICAgICBETiAyNC5VMzIKK2RSZXN1bHQ0ICAgICAgICBETiAyNi5VMzIKK2RSZXN1bHQ2ICAgICAgICBETiAyOC5VMzIKKworICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQSByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNBMCwgZFNyY0ExLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQTAsIGRTcmNBMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjMGMsIGRTcmNBMCwgZFNyY0ExLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjMGQsIGRTcmNBMCwgZFNyY0ExLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0EwLCBkU3JjQTEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXMwMSwgZFNyY0EwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMGMsIGRTcmMwZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNCMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBCIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KKzsgICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAorICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNCMCwgZFNyY0IxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQjAsIGRTcmNCMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjMWMsIGRTcmNCMCwgZFNyY0IxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjMWQsIGRTcmNCMCwgZFNyY0IxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0IwLCBkU3JjQjEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXMyMywgZFNyY0IwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRlbXAwICAgIDsvLyBUZVJpCisKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzFjLCBkU3JjMWQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjQzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQyByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAgICAgICAgICAKKzsgICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAorICAgICAgICAKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgOy8vIFRlUmkKKworICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0MwLCBkU3JjQzEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNDMCwgZFNyY0MxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMyYywgZFNyY0MwLCBkU3JjQzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMyZCwgZFNyY0MwLCBkU3JjQzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQzAsIGRTcmNDMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczQ1LCBkU3JjQzAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUZW1wMCAgOy8vIFRlUmkKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMyYywgZFNyYzJkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpIFRlUmkKKyAgICAgICAgCisKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNEMCwgZFNyY0QxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjRDAsIGRTcmNEMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjM2MsIGRTcmNEMCwgZFNyY0QxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjM2QsIGRTcmNEMCwgZFNyY0QxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0QwLCBkU3JjRDEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXM2NywgZFNyY0QwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM0LCBkUmVzNCwgZFRlbXAwIDsvLyBUZVJpCisKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzNjLCBkU3JjM2QgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM2LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcVJlczAxLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMiwgcVJlczIzLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICBWUVJTSFJVTiAgICBkQWNjNCwgcVJlczQ1LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICBWUVJTSFJVTiAgICBkQWNjNiwgcVJlczY3LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisKKyAgICBFTkQKKyAgICAKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OWM5MGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxMzQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjExCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworVGVtcCAgICAgICAgICAgIFJOIDEyCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CisKK2RTcmMwICAgICAgICAgICBETiA3LlU4CitkU3JjMSAgICAgICAgICAgRE4gOC5VOAorZFNyYzIgICAgICAgICAgIEROIDkuVTgKK2RTcmMzICAgICAgICAgICBETiAxMC5VOAorZFNyYzQgICAgICAgICAgIEROIDExLlU4CitkU3JjNSAgICAgICAgICAgRE4gMTIuVTgKK2RTcmM2ICAgICAgICAgICBETiAxMy5VOAorZFNyYzcgICAgICAgICAgIEROIDE0LlU4CitkU3JjOCAgICAgICAgICAgRE4gMTUuVTgKKworcVN1bUJFMDEgICAgICAgIFFOIDguUzE2CitxU3VtQ0QwMSAgICAgICAgUU4gOS5TMTYKK2RTdW1CRTAgICAgICAgICBETiAxNi5TMTYKK2RTdW1DRDAgICAgICAgICBETiAxOC5TMTYKKworcUFjYzAxICAgICAgICAgIFFOIDAuUzE2CitxQWNjMjMgICAgICAgICAgUU4gMS5TMTYKK3FBY2M0NSAgICAgICAgICBRTiAyLlMxNgorcUFjYzY3ICAgICAgICAgIFFOIDMuUzE2CisKK2RSZXMwICAgICAgICAgICBETiAwLlMxNgorZFJlczEgICAgICAgICAgIEROIDIuUzE2CitkUmVzMiAgICAgICAgICAgRE4gNC5TMTYKK2RSZXMzICAgICAgICAgICBETiA2LlMxNgorCitkQWNjMCAgICAgICAgICAgRE4gMC5VOAorZEFjYzEgICAgICAgICAgIEROIDIuVTgKK2RBY2MyICAgICAgICAgICBETiA0LlU4CitkQWNjMyAgICAgICAgICAgRE4gNi5VOCAgICAgICAgCisgICAgICAgIAorCitkVG1wMCAgICAgICAgICAgRE4gMjAuUzE2CitkVG1wMSAgICAgICAgICAgRE4gMjEuUzE2CitkVG1wMiAgICAgICAgICAgRE4gMjIuUzE2CitkVG1wMyAgICAgICAgICAgRE4gMjMuUzE2CisKKworICAgICAgICBWTEQxICAgICAgICBkU3JjMCwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uIF0gCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorICAgICAgICBWTEQxICAgICAgICBkU3JjMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uIF0KKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWTEQxICAgICAgICBkU3JjNSwgW1RlbXBdLCBzcmNTdGVwICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2MwIGMxIGMyIGMzIC4uIF0KKyAgICAgICAgVkFEREwgICAgICAgcUFjYzAxLCBkU3JjMCwgZFNyYzUgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWTEQxICAgICAgICBkU3JjMywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzYsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzQsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBkU3JjNywgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMSwgZFNyYzQgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmMyLCBkU3JjMyAgICAgOy8vIGMrZCAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM4LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCis7ICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgCis7ICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMiwgZFNyYzUgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmMzLCBkU3JjNCAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxQWNjMjMsIGRTcmMxLCBkU3JjNiAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMxLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkKKzsgICAgICAgIFZNTEEgICAgICAgIGRSZXMxLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorCis7ICAgICAgICBWTEQxICAgICAgICBkU3JjNywgW1RlbXBdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMywgZFNyYzYgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmM0LCBkU3JjNSAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxQWNjNDUsIGRTcmMyLCBkU3JjNyAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorOyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKzsgICAgICAgIFZMRDEgICAgICAgIGRTcmM4LCBbVGVtcF0sIHNyY1N0ZXAgICAgIDsvLyBbaTAgaTEgaTIgaTMgLi4gXSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjNCwgZFNyYzcgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzY3LCBkU3JjMywgZFNyYzggICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzUsIGRTcmM2ICAgICA7Ly8gYytkCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMzLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwCisgICAgICAgIFZBREQgICAgICAgIGRSZXMxLCBkUmVzMSwgZFRtcDEKKyAgICAgICAgVkFERCAgICAgICAgZFJlczIsIGRSZXMyLCBkVG1wMgorICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTVVMICAgICAgICBkVG1wMywgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWQUREICAgICAgICBkUmVzMywgZFJlczMsIGRUbXAzCisKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzAsIHFBY2MwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMSwgcUFjYzIzLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MyLCBxQWNjNDUsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzMsIHFBY2M2NywgIzUgICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgIAorICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjBlYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKQEAgLTAsMCArMSwzMTggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorCisgICAgSUYgQ29ydGV4QTgKKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8gICAgICAKKyAgICAKKyAgICBEQ0QgICBXaWR0aElzMk1WSXNOb3RaZXJvLCBXaWR0aElzMk1WSXNOb3RaZXJvCisgICAgRENEICAgV2lkdGhJczRNVklzTm90WmVybywgV2lkdGhJczRNVklzTm90WmVybworICAgIERDRCAgIFdpZHRoSXM4TVZJc05vdFplcm8KKyAgICAKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvICAgICAgCisgICAgCisgICAgRENEICAgV2lkdGhJczJNVklzWmVybywgV2lkdGhJczJNVklzWmVybworICAgIERDRCAgIFdpZHRoSXM0TVZJc1plcm8sIFdpZHRoSXM0TVZJc1plcm8KKyAgICBEQ0QgICBXaWR0aElzOE1WSXNaZXJvCisgICAgCisgICAgCis7Ly8gaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmMgICAgICAgICAgICAgICAgIFJOIDAKK2lTcmNTdGVwICAgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICAgICAgIFJOIDMKK2lXaWR0aCAgICAgICAgICAgICAgIFJOIDQKK2lIZWlnaHQgICAgICAgICAgICAgIFJOIDUKK2R4ICAgICAgICAgICAgICAgICAgIFJOIDYKK2R5ICAgICAgICAgICAgICAgICAgIFJOIDcKKworOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycworcGMgICAgICAgICAgICAgICAgICAgUk4gMTUKK3JldHVybiAgICAgICAgICAgICAgIFJOIDAKK0VpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCitFaWdodE1pbnVzZHkgICAgICAgICBSTiA5CisKK0FDb2VmZiAgICAgICAgICAgICAgIFJOIDEyCitCQ29lZmYgICAgICAgICAgICAgICBSTiA5CitDQ29lZmYgICAgICAgICAgICAgICBSTiA4CitEQ29lZmYgICAgICAgICAgICAgICBSTiA2CisKK3BUYWJsZSAgICAgICAgICAgICAgIFJOIDExCisKK1N0ZXAxICAgICAgICAgICAgICAgIFJOIDEwCitTcmNTdGVwTWludXMxICAgICAgICBSTiAxNAorCitkQUNvZWZmICAgICAgICAgICAgICBETiBEMTIuVTgKK2RCQ29lZmYgICAgICAgICAgICAgIEROIEQxMy5VOAorZENDb2VmZiAgICAgICAgICAgICAgRE4gRDE0LlU4CitkRENvZWZmICAgICAgICAgICAgICBETiBEMTUuVTgKKworZFJvdzBhICAgICAgICAgICAgICAgRE4gRDAuVTgKK2RSb3cwYiAgICAgICAgICAgICAgIEROIEQxLlU4CitkUm93MWEgICAgICAgICAgICAgICBETiBEMi5VOAorZFJvdzFiICAgICAgICAgICAgICAgRE4gRDMuVTgKKworcVJvdzBhICAgICAgICAgICAgICAgUU4gUTIuUzE2CitxUm93MGIgICAgICAgICAgICAgICBRTiBRMy5TMTYKKworOy8vZEluZGV4ICAgICAgICAgICAgICAgRE4gICAgRDE2LlU4ICAgICAgICAgICAgICAgICAKK3FSb3cxYSAgICAgICAgICAgICAgIFFOIFExMS5TMTYKK3FSb3cxYiAgICAgICAgICAgICAgIFFOIFExMi5TMTYKKworZFJvdzJhICAgICAgICAgICAgICAgRE4gRDE2LlU4CitkUm93MmIgICAgICAgICAgICAgICBETiBEMTcuVTgKK2RSb3czYSAgICAgICAgICAgICAgIEROIEQxOC5VOAorZFJvdzNiICAgICAgICAgICAgICAgRE4gRDE5LlU4CisKK3FPdXRSb3cyICAgICAgICAgICAgIFFOIFExMS5VMTYKK3FPdXRSb3czICAgICAgICAgICAgIFFOIFExMi5VMTYKK2RPdXRSb3cyICAgICAgICAgICAgIEROIEQyMC5VOAorZE91dFJvdzMgICAgICAgICAgICAgRE4gRDIxLlU4CitkT3V0Um93MlU2NCAgICAgICAgICBETiBEMjAuVTY0CitkT3V0Um93M1U2NCAgICAgICAgICBETiBEMjEuVTY0CisKK3FPdXRSb3cwICAgICAgICAgICAgIFFOIFEyLlUxNgorcU91dFJvdzEgICAgICAgICAgICAgUU4gUTMuVTE2CitkT3V0Um93MCAgICAgICAgICAgICBETiBEOC5VOAorZE91dFJvdzEgICAgICAgICAgICAgRE4gRDkuVTgKKworZE91dFJvdzBVNjQgICAgICAgICAgRE4gRDguVTY0CitkT3V0Um93MVU2NCAgICAgICAgICBETiBEOS5VNjQKKworZE91dFJvdzBVMzIgICAgICAgICAgRE4gRDguVTMyCitkT3V0Um93MVUzMiAgICAgICAgICBETiBEOS5VMzIKKworZE91dFJvdzBVMTYgICAgICAgICAgRE4gRDguVTE2CitkT3V0Um93MVUxNiAgICAgICAgICBETiBEOS5VMTYKKworCitkT3V0MFU2NCAgICAgICAgICAgICBETiBEMC5VNjQKK2RPdXQxVTY0ICAgICAgICAgICAgIEROIEQxLlU2NAorCitkT3V0MDBVMzIgICAgICAgICAgICBETiBEMC5VMzIKK2RPdXQwMVUzMiAgICAgICAgICAgIEROIEQxLlUzMgorZE91dDEwVTMyICAgICAgICAgICAgRE4gRDIuVTMyCitkT3V0MTFVMzIgICAgICAgICAgICBETiBEMy5VMzIKKworZE91dDBVMTYgICAgICAgICAgICAgRE4gRDAuVTE2CitkT3V0MVUxNiAgICAgICAgICAgICBETiBEMS5VMTYKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLCByMTEsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0CisgICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAorICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKKyAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTV9MRFJEICAgZHgsIGR5LCBEeAorICAgICAgICBNX0xEUkQgICBpV2lkdGgsIGlIZWlnaHQsIFdpZHRoCisgICAgICAgIAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R4ID0gOCAtIGR4CisgICAgICAgIDsvLyBFaWdodE1pbnVzZHkgPSA4IC0gZHkKKyAgICAgICAgCisgICAgICAgIDsvLyBBQ29lZmYgPSBFaWdodE1pbnVzZHggKiBFaWdodE1pbnVzZHkKKyAgICAgICAgOy8vIEJDb2VmZiA9IGR4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBDQ29lZmYgPSBFaWdodE1pbnVzZHggKiBkeQorICAgICAgICA7Ly8gRENvZWZmID0gZHggKiBkeQorICAgICAgICAKKyAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHgsIGR4LCAjOCAKKyAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHksIGR5LCAjOAorICAgICAgICBDTU4gICAgIGR4LGR5CisgICAgICAgIE1PViAgICAgU3RlcDEsICMxCisgICAgICAgIExEUkVRICAgcFRhYmxlLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8KKyAgICAgICAgU1VCICAgICBTcmNTdGVwTWludXMxLCBpU3JjU3RlcCwgU3RlcDEKKyAgICAgICAgTERSTkUgICBwVGFibGUsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybworICAgICAgICAKKyAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICAgICAgICAgOy8vIDBhCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIEFDb2VmZiwgRWlnaHRNaW51c2R4LCBFaWdodE1pbnVzZHkKKyAgICAgICAgU01VTEJCICBCQ29lZmYsIGR4LCBFaWdodE1pbnVzZHkKKyAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICAgICAgICAgOy8vIDBiCisgICAgICAgIFNNVUxCQiAgQ0NvZWZmLCBFaWdodE1pbnVzZHgsIGR5CisgICAgICAgIFNNVUxCQiAgRENvZWZmLCBkeCwgZHkKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZEFDb2VmZiwgQUNvZWZmCisgICAgICAgIFZEVVAgICAgZEJDb2VmZiwgQkNvZWZmCisgICAgICAgIFZEVVAgICAgZENDb2VmZiwgQ0NvZWZmCisgICAgICAgIFZEVVAgICAgZERDb2VmZiwgRENvZWZmCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBjLCBbcFRhYmxlLCBpV2lkdGgsIExTTCAjMV0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGlXaWR0aAorICAgICAgICAKKzsvLyBQaXhlbCBsYXlvdXQ6Cis7Ly8KKzsvLyAgIHgwMCB4MDEgeDAyCis7Ly8gICB4MTAgeDExIHgxMgorOy8vICAgeDIwIHgyMSB4MjIKKworOy8vIElmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApCitXaWR0aElzOE1WSXNOb3RaZXJvCisKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDFhCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAxYgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MmEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMmEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzJiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDJiCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cxYSwgZFJvdzJhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3czYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAzYQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3cyYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MWIsIGRSb3czYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93M2IsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gM2IKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MmEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDBhCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzNiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzNhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAwYgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3cwYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cyYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3czYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3cwYiwgZERDb2VmZgorCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MiwgcU91dFJvdzIsICM2CisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTY0LCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MywgcU91dFJvdzMsICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTY0LCBbcERzdF0sIGlEc3RTdGVwICAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzJVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzNVNjQsIFtwRHN0XSwgaURzdFN0ZXAgIAorICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzOE1WSXNOb3RaZXJvCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorCitXaWR0aElzNE1WSXNOb3RaZXJvCisKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQorICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcCAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorCitXaWR0aElzMk1WSXNOb3RaZXJvCisKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQorICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcCAgCisKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXMyTVZJc05vdFplcm8gCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCitXaWR0aElzOE1WSXNaZXJvCisgICAgICAgICAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBpU3JjU3RlcAorCitXaWR0aElzOExvb3BNVklzWmVybworICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MFU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDFVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM4TG9vcE1WSXNaZXJvCisKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKK1dpZHRoSXM0TVZJc1plcm8gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MDBVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDAxVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzNE1WSXNaZXJvIAorICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKyAgICAgICAgICAgICAgICAKK1dpZHRoSXMyTVZJc1plcm8gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MFUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MVUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczJNVklzWmVybyAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBNX0VORAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFTkQKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2UyNjQyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKQEAgLTAsMCArMSw3NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgIAorICAgICAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisgICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKKyAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4CisgICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQorICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCisgICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgorICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKKyAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgorICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKKyAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCisgICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQorICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKKyAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1CisgICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAorICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKKyAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCisgICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBFTkQKKyAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlOWMzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCkBAIC0wLDAgKzEsMTg2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworOy8vIAorOy8vIAorCisgICAgICAgIAorOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorICAgIAorCisKKworCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQ29ydGV4QTgKKworOy8vIEFSTSBSZWdpc3RlcnMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERzdCAgICAgICAgICAgICAgICBSTiAgMAorcFNyYyAgICAgICAgICAgICAgICBSTiAgMQorCisKKzsvLyBOZW9uIFJlZ2lzdGVycworICAgICAgCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2ICAgICAgIAorZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2ICAgICAgIAorZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2ICAgICAgIAorZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zICAgICAgIAorZFplcm8gICAgICAgICAgICAgICBETiAgRDQuUzE2CitkZTAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RlMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGUyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZTMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RJbjFSUyAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZEluM1JTICAgICAgICAgICAgICBETiAgRDguUzE2CitkZjAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RmMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGYyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkZjMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKK3FmMDEgICAgICAgICAgICAgICAgUU4gIFEwLjMyCitxZjIzICAgICAgICAgICAgICAgIFFOICBRMS4zMgorZGcwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitkZzEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2RnMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGczICAgICAgICAgICAgICAgICBETiAgRDguUzE2CitkZjFSUyAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RmM1JTICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorCis7Ly8gT3V0cHV0IHBpeGVscworZGgwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkaDEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RoMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZGgzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LCAsZDgKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscyBpbiB0cmFuc3Bvc2VkIGZvcm0KKyAgICAgICAgCisgICAgICAgIFZMRDQgICAge2RJbjAsZEluMSxkSW4yLGRJbjN9LFtwU3JjXQorICAgICAgICAKKyAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRlMCxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZTEsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCisgICAgICAgIFZIQUREICAgICAgIGRJbjFSUyxkSW4xLGRaZXJvICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBWSEFERCAgICAgICBkSW4zUlMsZEluMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZTIsZEluMVJTLGRJbjMgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZTMsZEluMSxkSW4zUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAorICAgICAgICBWQUREICAgICAgICBkZjAsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMworICAgICAgICBWQUREICAgICAgICBkZjEsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgorICAgICAgICBWU1VCICAgICAgICBkZjIsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgorICAgICAgICBWU1VCICAgICAgICBkZjMsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZGYwLGRmMQorICAgICAgICBWVFJOICAgIGRmMixkZjMKKyAgICAgICAgVlRSTiAgICBxZjAxLHFmMjMgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgICAgZGgwLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMSwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDIsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgzLCM2CisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlNUMSAgIHtkaDAsZGgxLGRoMixkaDN9LFtwRHN0XQorICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAKK0VuZCAgICAgICAgICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NvcnRleEE4ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzUyZTIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpAQCAtMCwwICsxLDkyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICAgICAgUk4gMCAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQorcERzdCAgICAgICAgICAgIFJOIDEgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBWYXJpYWJsZXMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyYyAgICAgICAgICAgIFJOIDIgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGVzCitGbGFnICAgICAgICAgICAgUk4gMyAgICAKK1ZhbHVlICAgICAgICAgICBSTiA0ICAgIAorVmFsdWUyICAgICAgICAgIFJOIDUgICAgCitzdHJPZmZzZXQgICAgICAgUk4gNiAgICAKK2NzdE9mZnNldCAgICAgICBSTiA3ICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQsIHI3CisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKKyAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsgRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIE1PViAgICAgIFZhbHVlMiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorICAgICAgICAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzhdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNF0gID0gcERzdFs1XSAgPSBwRHN0WzZdICA9IHBEc3RbN10gID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMxNl0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzhdICA9IHBEc3RbOV0gID0gcERzdFsxMF0gPSBwRHN0WzExXSA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMjRdICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMl0gPSBwRHN0WzEzXSA9IHBEc3RbMTRdID0gcERzdFsxNV0gPSAwCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBUaGUgbG9vcCBiZWxvdyBwYXJzZXMgYW5kIHVucGFja3MgdGhlIGlucHV0IHN0cmVhbS4gVGhlIEMtbW9kZWwgaGFzIAorICAgICAgICA7Ly8gYSBzb21ld2hhdCBjb21wbGljYXRlZCBsb2dpYyBmb3Igc2lnbiBleHRlbnNpb24uICBCdXQgaW4gdGhlIHY2IHZlcnNpb24sCisgICAgICAgIDsvLyB0aGF0IGNhbiBiZSBlYXNpbHkgdGFrZW4gY2FyZSBieSBsb2FkaW5nIHRoZSBkYXRhIGZyb20gPHBTcmM+IHN0cmVhbSBhcyAKKyAgICAgICAgOy8vIFNJR05FRCBieXRlL2hhbGZ3b3JkLiBTbywgYmFzZWQgb24gdGhlIGZpcnN0IFRTVCBpbnN0cnVjdGlvbiwgOC1iaXRzIG9yIAorICAgICAgICA7Ly8gMTYtYml0cyBhcmUgcmVhZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBOZXh0LCB0byBjb21wdXRlIHRoZSBvZmZzZXQsIHdoZXJlIHRoZSB1bnBhY2tlZCB2YWx1ZSBuZWVkcyB0byBiZSBzdG9yZWQsCisgICAgICAgIDsvLyB3ZSBtb2RpZnkgdGhlIGNvbXB1dGF0aW9uIHRvIHBlcmZvcm0gWyhGbGFnICYgMTUpIDwgMV0gYXMgWyhGbGFnIDwgMSkgJiAzMV0KKyAgICAgICAgOy8vIFRoaXMgcmVzdWx0cyBpbiBhIHNhdmluZyBvZiBvbmUgY3ljbGUuCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcyAgIAorICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKKyAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKKyAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQorICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+CisgICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCisgICAgICAgIAorICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQwZDRkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKQEAgLTAsMCArMSw4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jaworICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KKyAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTkzNjVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sKKyAqKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgaW1hZ2Ugd2lkdGgKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCBob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IHZhbHVlcyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlICBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMgb3IgcEJTIGlzIE5VTEwuCisgKiAgICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCisuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKKwljb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzE2LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlODcxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyByYXN0ZXIgc2NhbiBvcmRlciwgbmFtZWx5IHBvc2l0aW9uIG9yZGVyLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtCisgKgkJCQkJCQkJYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICoJCQkJCQkJCXBvaW50ZWQgdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzCisgKgkJCQkJCQkJaW4gdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAorICkKKworeworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDE3LCA0KTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjllNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw2OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAorICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAorICogb2YgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sKKyAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybworICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKKyAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCisgKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg1YTQ4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKQEAgLTAsMCArMSwzOTYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworICAgICAgICAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorCisKKworCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorICAgIAorOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCisgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIENvcnRleEE4CisgICAgCisKKzsvLyBBUk0gUmVnaXN0ZXJzCisKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgUk4gIDAKK3BQcmVkICAgICAgIFJOICAxCitwREMgICAgICAgICBSTiAgMgorcERzdCAgICAgICAgUk4gIDMKKyAgIAorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly9SZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKK3BRUGRpdiAgICAgIFJOICAxMAorcFFQbW9kICAgICAgUk4gIDExCitwVlJvdyAgICAgICBSTiAgMgorUVBtb2QgICAgICAgUk4gIDEyCitzaGlmdCAgICAgICBSTiAgMTQKK2luZGV4MCAgICAgIFJOICAxIAoraW5kZXgxICAgICAgUk4gIDEwIAorCis7Ly9SZWdpc3RlcnMgdXNlZCBpbiBEZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorcERlbHRhICAgICAgUk4gIDQKK3BEZWx0YVRtcCAgIFJOICA2CitBQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK3BQcmVkVGVtcCAgIFJOICA3CitwRENUZW1wICAgICBSTiAgOAorcERzdFRlbXAgICAgUk4gIDkKK3BEZWx0YUFyZzEgIFJOICAxCitwRGVsdGFBcmcwICBSTiAgMAorUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitEQ3ZhbCAgICAgICBSTiAgMTAgIAorcHJlZHN0ZXAgICAgUk4gIDEKK2RzdFN0ZXAgICAgIFJOICAxMAorUHJlZFZhbDEgICAgUk4gIDMKK1ByZWRWYWwyICAgIFJOICA1CisKKworCisKKzsvLyBOZW9uIFJlZ2lzdGVycworCis7Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisKK2RWbWF0cml4ICAgICAgICAgICAgRE4gIEQ2LjggIAorZGluZGV4Um93MCAgICAgICAgICBETiAgRDcuMzIgCitkaW5kZXhSb3cxICAgICAgICAgIEROICBEOS4zMiAKK2RCeXRlSW5kZXhSb3cwICAgICAgRE4gIEQ3LjgKK2RCeXRlSW5kZXhSb3cxICAgICAgRE4gIEQ5LjgKK2RWUm93MCAgICAgICAgICAgICAgRE4gIEQ4LjggIAorZFZSb3cxICAgICAgICAgICAgICBETiAgRDQuOAorZFZSb3cwVTE2ICAgICAgICAgICBETiAgRDguVTE2CitkVlJvdzFVMTYgICAgICAgICAgIEROICBENC5VMTYKK2RWUm93MlUxNiAgICAgICAgICAgRE4gIEQ4LlUxNgorZFZSb3czVTE2ICAgICAgICAgICBETiAgRDQuVTE2CisKK2RTaGlmdCAgICAgICAgICAgICAgRE4gIEQ1LlUxNgorZFNyY1JvdzAgICAgICAgICAgICBETiAgRDAuSTE2CitkU3JjUm93MSAgICAgICAgICAgIEROICBEMS5JMTYKK2RTcmNSb3cyICAgICAgICAgICAgRE4gIEQyLkkxNiAgICAKK2RTcmNSb3czICAgICAgICAgICAgRE4gIEQzLkkxNgorZERxbnRSb3cwICAgICAgICAgICBETiAgRDAuSTE2ICAKK2REcW50Um93MSAgICAgICAgICAgRE4gIEQxLkkxNiAKK2REcW50Um93MiAgICAgICAgICAgRE4gIEQyLkkxNiAKK2REcW50Um93MyAgICAgICAgICAgRE4gIEQzLkkxNiAgCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBpbiBUcmFuc2Zvcm1SZXNpZHVhbDR4NAorCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2ICAgICAgIAorZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2ICAgICAgIAorZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2ICAgICAgIAorZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxSW4wMSAgICAgICAgICAgICAgIFFOICBRMC4zMgorcUluMjMgICAgICAgICAgICAgICBRTiAgUTEuMzIKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgICAgICAgCitkWmVybyAgICAgICAgICAgICAgIEROICBENC5TMTYKK2RlMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGUxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZTIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RlMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZEluMVJTICAgICAgICAgICAgICBETiAgRDcuUzE2CitkSW4zUlMgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGYxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkZjIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RmMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcWYwMSAgICAgICAgICAgICAgICBRTiAgUTAuMzIKK3FmMjMgICAgICAgICAgICAgICAgUU4gIFExLjMyCitkZzAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RnMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGcyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZzMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMVJTICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGYzUlMgICAgICAgICAgICAgICBETiAgRDguUzE2CisKKzsvLyBPdXRwdXQgcGl4ZWxzCitkaDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RoMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGgyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkaDMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYgCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBpbiBEZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorCitkRGVsdGFSb3cwICAgICAgICAgIEROICBEMC5TMTYKK2REZWx0YVJvdzEgICAgICAgICAgRE4gIEQxLlMxNgorZERlbHRhUm93MiAgICAgICAgICBETiAgRDIuUzE2CitkRGVsdGFSb3czICAgICAgICAgIEROICBEMy5TMTYKK3FEZWx0YVJvdzAxICAgICAgICAgUU4gIFEwLlMxNgorcURlbHRhUm93MjMgICAgICAgICBRTiAgUTEuUzE2CisKK2RQcmVkVmFsUm93MDEgICAgICAgRE4gIEQ0LlU4CitkUHJlZFZhbFJvdzIzICAgICAgIEROICBENS5VOAorCitxU3VtUm93MDEgICAgICAgICAgIFFOICBRMy5TMTYKK3FTdW1Sb3cyMyAgICAgICAgICAgUU4gIFE0LlMxNgorZERzdFJvdzAxICAgICAgICAgICBETiAgRDAuVTgKK2REc3RSb3cyMyAgICAgICAgICAgRE4gIEQxLlU4CitkRHN0Um93MCAgICAgICAgICAgIEROICBEMC4zMlswXQorZERzdFJvdzEgICAgICAgICAgICBETiAgRDAuMzJbMV0KK2REc3RSb3cyICAgICAgICAgICAgRE4gIEQxLjMyWzBdCitkRHN0Um93MyAgICAgICAgICAgIEROICBEMS4zMlsxXQorICAgIAorICAgICAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DOCBwQnVmZmVyLCAzMgorICAgICAgICAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCxyMTEsZDkKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHJlZFN0ZXBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgZHN0U3RlcE9uU3RhY2ssNAorICAgICAgICBNX0FSRyAgIFFQT25TdGFjaywgNAorICAgICAgICBNX0FSRyAgIEFDT25TdGFjayw0CisgIAorICAgICAgICAKKyAgICAgICAgTV9BRFIgICBwRGVsdGEscEJ1ZmZlciAKKyAgICAgICAgTV9MRFIgICBBQyxBQ09uU3RhY2sgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyByMSxyMixyMyBiZWZvcmUgZnVuY3Rpb24gY2FsbCAgICAKKyAgICAgICAgTU9WICAgICBwUHJlZFRlbXAscFByZWQKKyAgICAgICAgTU9WICAgICBwRENUZW1wLHBEQworICAgICAgICBNT1YgICAgIHBEc3RUZW1wLHBEc3QKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgQUMsIzAKKyAgICAgICAgQkVRICAgICBEQ2Nhc2UKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQgOiBzdGF0aWMgZnVuY3Rpb24gaW5saW5lZAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vQkwgICAgICBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKKyAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2CisgICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2CisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICBpbmRleDEsPTB4MDMwMjA1MDQgCisgICAgICAgIExEUiAgICBpbmRleDAsPTB4MDUwNDAxMDAgICAgICAgICAgICAgICAgICAgOy8vIEluZGV4ZXMgaW50byBkVm1hdHJpeAorICAgICAgICBBREQgICAgcFZSb3cscFZSb3csUVBtb2QKKyAgICAgICAgVkRVUCAgIGRpbmRleFJvdzAsaW5kZXgwIAorICAgICAgICBWRFVQICAgZGluZGV4Um93MSxpbmRleDEKKyAgICAgICAgVkRVUCAgIGRTaGlmdCxzaGlmdCAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFsbCA0eDQgcFZSb3dbXSB2YWx1ZXMKKyAgICAgICAgVkxEMSAgIGRWbWF0cml4LFtwVlJvd10gICAgICAgICAgICAgICAgICAgICA7Ly8gZFZtYXRyaXggPSBbMGR8MGN8MGJ8MGFdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlRCTCAgIGRWUm93MCxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MCAgICAgICA7Ly8gcm93MCA9IHJvdzIgPSBbcFZSb3dbMl0gfCBwVlJvd1swXSB8IHBWUm93WzJdIHwgcFZSb3dbMF1dCisgICAgICAgIFZUQkwgICBkVlJvdzEsZFZtYXRyaXgsZEJ5dGVJbmRleFJvdzEgICAgICAgOy8vIHJvdzEgPSByb3czID0gW3BWUm93WzFdIHwgcFZSb3dbMl0gfCBwVlJvd1sxXSB8IHBWUm93WzJdXQorICAgICAgICBDTVAgICAgIHBEQ1RlbXAsIzAKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgJ3NyYycgdmFsdWVzICAKKyAgICAgICAgVkxEMSAgIHsgZFNyY1JvdzAsZFNyY1JvdzEsZFNyY1JvdzIsZFNyY1JvdzMgfSxbcERlbHRhXSAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICBkVlJvdzBVMTYsZFZSb3cwVTE2LGRTaGlmdCAKKyAgICAgICAgVlNITCAgIGRWUm93MVUxNixkVlJvdzFVMTYsZFNoaWZ0IAorICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBseSBzcmNbXSB3aXRoIHBWUm93W10KKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzAsZFNyY1JvdzAsZFZSb3cwVTE2CisgICAgICAgIFZNVUwgICAgZERxbnRSb3cxLGRTcmNSb3cxLGRWUm93MVUxNgorICAgICAgICBWTVVMICAgIGREcW50Um93MixkU3JjUm93MixkVlJvdzJVMTYKKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzMsZFNyY1JvdzMsZFZSb3czVTE2CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRyYW5zZm9ybVJlc2lkdWFsNHg0IDogSW5saW5lZCB0byBhdm9pZCBMb2FkL1N0b3JlcworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vQkwgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIDsvL1NUUkhORSAgREN2YWwsW3BEZWx0YV0KKyAgICAgICAgVk1PVk5FICAgIGRJbjBbMF0sREN2YWwKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgaW5wdXQgcGl4ZWxzIDogcGVyZm9ybSBSb3cgb3BzIGFzIENvbCBvcHMKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZEluMCxkSW4xCisgICAgICAgIFZUUk4gICAgZEluMixkSW4zCisgICAgICAgIFZUUk4gICAgcUluMDEscUluMjMgCisgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgZFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGUwLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRlMSxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZEluMVJTLGRJbjEsZFplcm8gICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRJbjNSUyxkSW4zLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRlMixkSW4xUlMsZEluMyAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRlMyxkSW4xLGRJbjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRmMCxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRmMSxkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMixkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMyxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZGYwLGRmMQorICAgICAgICBWVFJOICAgIGRmMixkZjMKKyAgICAgICAgVlRSTiAgICBxZjAxLHFmMjMgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkZzAsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgVlNVQiAgICAgICAgZGcxLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCisgICAgICAgIFZIQUREICAgICAgIGRmMVJTLGRmMSxkWmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBWSEFERCAgICAgICBkZjNSUyxkZjMsZFplcm8KKyAgICAgICAgVlNVQiAgICAgICAgZGcyLGRmMVJTLGRmMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKKyAgICAgICAgVkFERCAgICAgICAgZGczLGRmMSxkZjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRoMCxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRoMSxkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRoMixkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRoMyxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICAgICBkaDAsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgxLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMiwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDMsIzYKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCisgICAgICAgIAorCitEQ2Nhc2UKKyAgICAgICAgOy8vIENhbGN1bGF0ZSB0aGUgVHJhbnNmb3JtZWQgREN2YWx1ZSA6IChEQ3ZhbCszMik+PjYKKyAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCisgICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAorICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2CisgICAgICAgIAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzAsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKKyAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cxLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbNF0gID0gcERlbHRhWzVdICA9IHBEZWx0YVs2XSAgPSBwRGVsdGFbN10gPSBEQ3ZhbAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzIsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs4XSAgPSBwRGVsdGFbOV0gID0gcERlbHRhWzEwXSA9IHBEZWx0YVsxMV0gPSBEQ3ZhbAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzMsIERDdmFsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKK091dERDY2FzZSAgICAgIAorICAgICAgICBNX0xEUiAgIHByZWRzdGVwLHByZWRTdGVwT25TdGFjaworICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsZHN0U3RlcE9uU3RhY2sKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgUHJlZFZhbDEsW3BQcmVkVGVtcF0scHJlZHN0ZXAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMixbcFByZWRUZW1wXSxwcmVkc3RlcAorICAgICAgICBWTU9WICAgIGRQcmVkVmFsUm93MDEsUHJlZFZhbDEsUHJlZFZhbDIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgUHJlZFZhbDEsW3BQcmVkVGVtcF0scHJlZHN0ZXAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMixbcFByZWRUZW1wXQorICAgICAgICBWTU9WICAgIGRQcmVkVmFsUm93MjMsUHJlZFZhbDEsUHJlZFZhbDIKKyAKKyAgICAgICAgCisgICAgICAgIFZBRERXICAgcVN1bVJvdzAxLHFEZWx0YVJvdzAxLGRQcmVkVmFsUm93MDEKKyAgICAgICAgVkFERFcgICBxU3VtUm93MjMscURlbHRhUm93MjMsZFByZWRWYWxSb3cyMworICAgICAgICBWUU1PVlVOIGREc3RSb3cwMSxxU3VtUm93MDEKKyAgICAgICAgVlFNT1ZVTiBkRHN0Um93MjMscVN1bVJvdzIzCisgICAgICAgIAorIAorICAgICAgICBWU1QxICAgIGREc3RSb3cwLFtwRHN0VGVtcF0sZHN0U3RlcAorICAgICAgICBWU1QxICAgIGREc3RSb3cxLFtwRHN0VGVtcF0sZHN0U3RlcAorICAgICAgICBWU1QxICAgIGREc3RSb3cyLFtwRHN0VGVtcF0sZHN0U3RlcAorICAgICAgICBWU1QxICAgIGREc3RSb3czLFtwRHN0VGVtcF0KKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ09SVEVYQTggICAKKyAgICAKKyAgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDIwMiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElGIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICAgICAgCitMT09QX0NPVU5UICBFUVUgMHg0MDAwMDAwMAorTUFTS18zICAgICAgRVFVIDB4MDMwMzAzMDMKK01BU0tfNCAgICAgIEVRVSAweDA0MDQwNDA0CisKKzsvLyBGdW5jdGlvbiBhcmd1bWVudHMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzMyMTAgICAgICBSTiA2CisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA3CisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCitxQlMzMjEwICAgICBRTiBRMTMuVTE2CitkQlMzMjEwICAgICBETiBEMjYKK2RNYXNrX2JzICAgIEROIEQyNworZEZpbHRfYnMgICAgRE4gRDI2LlUxNgorCis7Ly8gYlNMVDQKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorZE1hc2tfNCAgICAgRE4gRDEuVTE2CisKK01hc2tfNCAgICAgIFJOIDgKK01hc2tfMyAgICAgIFJOIDkKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBSZXN1bHQKK2RQXzB0ICAgICAgIEROIEQxMy5VOCAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFFfMG4gICAgICAgRE4gRDI0LlU4CisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCByOSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgO2xvYWQgYWxwaGExLGJldGExIHNvbWV3aGVyZSB0byBhdm9pZCBtb3JlIGxvYWRzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdIQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEgOz8KKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0hIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTERSICAgICAgICAgTWFza18zLCA9TUFTS18zCisgICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKK0xvb3BZICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgYlMzMjEwLCBbcEJTXSwgIzgKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIGRQXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUF8xLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICAgICAgYlMzMjEwLCAjMAorICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgOzEKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCisgICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAorICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKKworICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKyAgICAgICAgVk1PVi5VMzIgICAgZEJTMzIxMFswXSwgYlMzMjEwCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKyAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAgCisgICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAorICAgICAgICAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRNYXNrX2JzLlU4CisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzMKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisgICAgICAgIAorICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKworICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfNCAgICAgICAgCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZUU1QgICAgICAgIGRGaWx0X2JzLCBkRmlsdF9icywgZE1hc2tfNAorCisgICAgICAgIDsvLyBiUyA9PSA0IEZpbHRlcmluZworICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKKyAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icworICAgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisKKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorTm9GaWx0ZXJCUzAKKworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlNmMxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwyODIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSUYgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgICAgICAKK0xPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCitNQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMworTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKK3BTcmNEc3RfUCAgIFJOIDEwCitwU3JjRHN0X1EgICBSTiAxMgorCitwVG1wICAgICAgICBSTiAxMAorcFRtcDIgICAgICAgUk4gMTIKK3N0ZXAgICAgICAgIFJOIDE0CisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA3CisKKzsvLyBSb3dzIGlucHV0CitkUm93MCAgICAgICBETiBENy5VOAorZFJvdzEgICAgICAgRE4gRDguVTggIAorZFJvdzIgICAgICAgRE4gRDUuVTggIAorZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKK2RSb3c0ICAgICAgIEROIEQ2LlU4ICAKK2RSb3c1ICAgICAgIEROIEQ5LlU4ICAKK2RSb3c2ICAgICAgIEROIEQ0LlU4IAorZFJvdzcgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCitxQlMzMjEwICAgICBRTiBRMTMuVTE2CitkQlMzMjEwICAgICBETiBEMjYKK2RNYXNrX2JzICAgIEROIEQyNworZEZpbHRfYnMgICAgRE4gRDI2LlUxNgorCis7Ly8gYlNMVDQKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorZE1hc2tfNCAgICAgRE4gRDEuVTE2CisKK01hc2tfNCAgICAgIFJOIDgKK01hc2tfMyAgICAgIFJOIDkKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBSZXN1bHQKK2RQXzB0ICAgICAgIEROIEQxMy5VOCAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFFfMG4gICAgICAgRE4gRDI0LlU4CisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTIsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAorICAgICAgICBNX0FSRyAgIHBwQlMsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBkMC1kQWxwaGFfMAorICAgICAgICA7Ly8gZDItZEJldGFfMAorCisgICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAorICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKKworICAgICAgICA7ZE1hc2tfMC0xNAorICAgICAgICA7ZE1hc2tfMS0xNQorICAgICAgICA7ZE1hc2tfNC0xOQorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKKworCitMb29wWSAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4CisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgOzEKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBzdGVwCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KKyAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KKyAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KKyAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KKyAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KKyAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KKyAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KKyAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KKworICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQorICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQorICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKKworICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgorICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKKworICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NworICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKKworCisgICAgICAgIDtSZWFsaWduIHRoZSBwb2ludGVycworCisgICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAorICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKKworICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKyAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorCisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180CisKKyAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKKyAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icworCisgICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1AsIHBTcmNEc3QsICMzCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFRtcDIsIHBTcmNEc3RfUCwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzBdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzFdfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMl19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bM119LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls0XX0sIFtwU3JjRHN0X1BdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls1XX0sIFtwVG1wMl0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzZdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzddfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdF9RLCBwU3JjRHN0LCAjNAorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0X1EsIHNyY2RzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblswXX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsxXX0sIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMl19LCBbcFNyY0RzdF9RXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bM119LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzRdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzVdfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls2XX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls3XX0sIFtwVG1wXSwgc3RlcAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKworICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK05vRmlsdGVyQlMwCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYKKworCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjM2Y0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDI4OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIElGIENvcnRleEE4CisKK0xPT1BfQ09VTlQgIEVRVSAweDU1MDAwMDAwCisKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMTAgICAgICAgIFJOIDEyCisKK3BBbHBoYV8wICAgIFJOIDIKK3BCZXRhXzAgICAgIFJOIDMKKworcEFscGhhXzEgICAgUk4gNworcEJldGFfMSAgICAgUk4gOAorCisKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDkKKworcFRtcCAgICAgICAgUk4gNgorc3RlcCAgICAgICAgUk4gMTAKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CitkQXAxcDAgICAgICBETiBEMTIuVTgKK2RBcTFxMCAgICAgIEROIEQxOC5VOAorZEFwMnAwICAgICAgRE4gRDE5LlU4CitkQXEycTAgICAgICBETiBEMTcuVTgKKworOy8vIGJTTFQ0CitkVEMwICAgICAgICBETiBEMTguVTggICAKK2RUQzEgICAgICAgIEROIEQxOS5VOCAgIAorZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCisKK2RUQ3MgICAgICAgIEROIEQzMS5TOAorZFRDICAgICAgICAgRE4gRDMxLlU4CisKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorCitNYXNrXzAgICAgICBSTiAxMQorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK2RScDBxMCAgICAgIEROIEQyNC5VOAorCitkTWF4UCAgICAgICBETiBEMjMuVTgKK2RNaW5QICAgICAgIEROIEQyMi5VOAorCitkTWF4USAgICAgICBETiBEMTkuVTgKK2RNaW5RICAgICAgIEROIEQyMS5VOAorCitkRGVsdGFQICAgICBETiBEMjYuVTgKK2REZWx0YVEgICAgIEROIEQyNy5VOAorCitxUF8wbiAgICAgICBRTiBRMTQuUzE2CitxUV8wbiAgICAgICBRTiBRMTIuUzE2CisKK2RRXzBuICAgICAgIEROIEQyNC5VOAorZFFfMW4gICAgICAgRE4gRDI1LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorCis7Ly8gYlNHRTQKKworcVNwMHEwICAgICAgUU4gUTEwLlUxNgorCitxU3AycTEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBwMSAgICBRTiBRMTIuVTE2CitxU3AzcDIgICAgICBRTiBRMTMuVTE2CitkSFNwMHExICAgICBETiBEMjguVTgKKworcVNxMnAxICAgICAgUU4gUTExLlUxNgorcVNwMHEwcTEgICAgUU4gUTEyLlUxNgorcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCitkSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKKworcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKK3FUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCisKK2RQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKK2RRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CitkUF8ybiAgICAgICBETiBEMzEuVTgKKworZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgQUREICAgICAgICAgcEFscGhhXzEsIHBBbHBoYV8wLCAjMQorICAgICAgICBBREQgICAgICAgICBwQmV0YV8xLCBwQmV0YV8wLCAjMQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0gCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKKworICAgICAgICBNT1YgICAgICAgICBNYXNrXzAsIzAKKworICAgICAgICA7ZE1hc2tfMC0xNAorICAgICAgICA7ZE1hc2tfMS0xNQorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorCisgICAgICAgIExEUiAgICAgICAgIFhZLD1MT09QX0NPVU5UCisKKyAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKKyAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCitMb29wWSAgICAgICAgCitMb29wWCAgICAgICAgCisgICAgICAgIExEUkggICAgICAgIGJTMTAsIFtwQlNdLCAjMgorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIENNUCAgICAgICAgIGJTMTAsICMwCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMywgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzIsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUF8xLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRRXzAsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzAsIGRQXzEKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMSwgW3BUbXBdCisgICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFFfMCwgZFBfMAorICAgICAgICBWTEQxICAgICAgICBkUV8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFswXSwgTWFza18wCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmMDAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMV0sIE1hc2tfMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWTEQxICAgICAgICBkUV8zLCBbcFNyY0RzdF0KKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzQgCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorICAgIAorICAgICAgICBCTkUgICAgICAgICBiU0dFNCAgICAgICAgCitiU0xUNAorICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwVG1wLCAjOAorCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCisKK05vRmlsdGVyQlMwCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM4CisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgorICAgICAgICBCQ0MgICAgICAgICBMb29wWAorICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8gYlMgPj0gNCBGaWx0ZXJpbmcKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIFZTVDEgICAgICAgIGRQXzJuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLFhZLFhZCisgICAgICAgIFZTVDEgICAgICAgIGRRXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgorICAgICAgICBWU1QxICAgICAgICBkUV8ybiwgW3BTcmNEc3RdCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwVG1wLCAjOAorICAgICAgICBCQ0MgICAgICAgICBMb29wWAorCitFeGl0TG9vcFkgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICMxNgorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMiAKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRgorICAgIAorCisgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2ZmJiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDQzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKworTE9PUF9DT1VOVCAgRVFVIDB4MTEwMDAwMDAKKworCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMxMCAgICAgICAgUk4gMTIKKworcEFscGhhXzAgICAgUk4gMgorcEJldGFfMCAgICAgUk4gMworCitwQWxwaGFfMSAgICBSTiA3CitwQmV0YV8xICAgICBSTiA4CisKK3BUbXAgICAgICAgIFJOIDEwCitwVG1wU3RlcCAgICBSTiAxMQorCis7Ly8gTG9vcCAKKworWFkgICAgICAgICAgUk4gOQorCis7Ly8gUm93cyBpbnB1dAorZFJvdzAgICAgICAgRE4gRDcuVTgKK2RSb3cxICAgICAgIEROIEQ4LlU4ICAKK2RSb3cyICAgICAgIEROIEQ1LlU4ICAKK2RSb3czICAgICAgIEROIEQxMC5VOCAgCitkUm93NCAgICAgICBETiBENi5VOCAgCitkUm93NSAgICAgICBETiBEOS5VOCAgCitkUm93NiAgICAgICBETiBENC5VOCAKK2RSb3c3ICAgICAgIEROIEQxMS5VOCAKKworOy8vIGRSb3cwIC0gZFBfMywgZFJvdzEgLSBkUV8wLCBkUm93MiAtIGRQXzEsIGRSb3czIC0gZFFfMgorOy8vIGRSb3c0IC0gZFBfMiwgZFJvdzUgLSBkUV8xLCBkUm93NiAtIGRQXzAsIGRSb3c3IC0gZFFfMworCis7Ly8gUm93cyBvdXRwdXQKK2RSb3duMCAgICAgIEROIEQ3LlU4CitkUm93bjEgICAgICBETiBEMjQuVTgKK2RSb3duMiAgICAgIEROIEQzMC5VOAorZFJvd24zICAgICAgRE4gRDEwLlU4CitkUm93bjQgICAgICBETiBENi5VOAorZFJvd241ICAgICAgRE4gRDI1LlU4CitkUm93bjYgICAgICBETiBEMjkuVTgKK2RSb3duNyAgICAgIEROIEQxMS5VOAorCis7Ly8gZFBfMG4gICAgICAgRE4gRDI5LlU4Cis7Ly8gZFBfMW4gICAgICAgRE4gRDMwLlU4Cis7Ly8gZFBfMm4gICAgICAgRE4gRDMxLlU4Cis7Ly8gCis7Ly8gZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKKzsvLyBkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorOy8vIGRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCis7Ly8gCis7Ly8gZFJvd24wIC0gZFBfMywgIGRSb3duMSAtIGRRXzBuCis7Ly8gZFJvd24yIC0gZFBfMW4sIGRSb3duMyAtIGRRXzIKKzsvLyBkUm93bjQgLSBkUF8yLCAgZFJvd241IC0gZFFfMW4KKzsvLyBkUm93bjYgLSBkUF8wbiwgZFJvd243IC0gZFFfMworCitkUm93MG4gICAgICBETiBENy5VOAorZFJvdzFuICAgICAgRE4gRDI0LlU4CitkUm93Mm4gICAgICBETiBEMzAuVTgKK2RSb3czbiAgICAgIEROIEQyOC5VOAorZFJvdzRuICAgICAgRE4gRDMxLlU4CitkUm93NW4gICAgICBETiBEMjUuVTgKK2RSb3c2biAgICAgIEROIEQyOS5VOAorZFJvdzduICAgICAgRE4gRDExLlU4CisKKzsvLyBkUm93MG4gLSBkUF8zLCBkUm93MW4gLSBkUV8wbiwgZFJvdzJuIC0gZFBfMW4sIGRSb3czbiAtIGRRXzJuCis7Ly8gZFJvdzRuIC0gZFBfMiwgZFJvdzVuIC0gZFFfMW4sIGRSb3c2biAtIGRQXzBuLCBkUm93N24gLSBkUV8zCisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKKzsvLyBiU0xUNAorZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCitkVEMxICAgICAgICBETiBEMTkuVTggICAKK2RUQzAxICAgICAgIEROIEQxOC5VOCAgIAorCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKKworTWFza18wICAgICAgUk4gNgorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK2RScDBxMCAgICAgIEROIEQyNC5VOAorCitkTWF4UCAgICAgICBETiBEMjMuVTgKK2RNaW5QICAgICAgIEROIEQyMi5VOAorCitkTWF4USAgICAgICBETiBEMTkuVTgKK2RNaW5RICAgICAgIEROIEQyMS5VOAorCitkRGVsdGFQICAgICBETiBEMjYuVTgKK2REZWx0YVEgICAgIEROIEQyNy5VOAorCitxUF8wbiAgICAgICBRTiBRMTQuUzE2CitxUV8wbiAgICAgICBRTiBRMTIuUzE2CisKK2RRXzBuICAgICAgIEROIEQyNC5VOAorZFFfMW4gICAgICAgRE4gRDI1LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorCis7Ly8gYlNHRTQKKworcVNwMHEwICAgICAgUU4gUTEwLlUxNgorCitxU3AycTEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBwMSAgICBRTiBRMTIuVTE2CitxU3AzcDIgICAgICBRTiBRMTMuVTE2CitkSFNwMHExICAgICBETiBEMjguVTgKKworcVNxMnAxICAgICAgUU4gUTExLlUxNgorcVNwMHEwcTEgICAgUU4gUTEyLlUxNgorcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCitkSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKKworcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKK3FUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCisKK2RQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKK2RRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CitkUF8ybiAgICAgICBETiBEMzEuVTgKKworZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgQUREICAgICAgICAgcEFscGhhXzEsIHBBbHBoYV8wLCAjMQorICAgICAgICBBREQgICAgICAgICBwQmV0YV8xLCBwQmV0YV8wLCAjMQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAorCisgICAgICAgIDtkTWFza18wLTE0CisgICAgICAgIDtkTWFza18xLTE1CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisKKyAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKKyAgICAKKyAgICAgICAgQUREICAgICAgICAgcFRtcFN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKK0xvb3BZICAgICAgICAKK0xvb3BYICAgICAgICAKKyAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICM0CisKKyAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKKyAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICA7Ly8gTG9hZCA4IHJvd3Mgb2YgZGF0YQorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cwLCBkUm93MQorICAgICAgICBWTEQxICAgICAgICBkUm93MywgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWWklQLjggICAgICBkUm93MiwgZFJvdzMKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzQsIGRSb3c1CisgICAgICAgIFZaSVAuMTYgICAgIGRSb3cxLCBkUm93MworICAgIAorCisgICAgICAgIDsvLyBkUm93MCA9IFtxM3IwIHEycjAgcTFyMCBxMHIwIHAwcjAgcDFyMCBwMnIwIHAzcjBdCisgICAgICAgIDsvLyBkUm93MSA9IFtxM3IxIHEycjEgcTFyMSBxMHIxIHAwcjEgcDFyMSBwMnIxIHAzcjFdCisgICAgICAgIDsvLyBkUm93MiA9IFtxM3IyIHEycjIgcTFyMiBxMHIyIHAwcjIgcDFyMiBwMnIyIHAzcjJdCisgICAgICAgIDsvLyBkUm93MyA9IFtxM3IzIHEycjMgcTFyMyBxMHIzIHAwcjMgcDFyMyBwMnIzIHAzcjNdCisgICAgICAgIDsvLyBkUm93NCA9IFtxM3I0IHEycjQgcTFyNCBxMHI0IHAwcjQgcDFyNCBwMnI0IHAzcjRdCisgICAgICAgIDsvLyBkUm93NSA9IFtxM3I1IHEycjUgcTFyNSBxMHI1IHAwcjUgcDFyNSBwMnI1IHAzcjVdCisgICAgICAgIDsvLyBkUm93NiA9IFtxM3I2IHEycjYgcTFyNiBxMHI2IHAwcjYgcDFyNiBwMnI2IHAzcjZdCisgICAgICAgIDsvLyBkUm93NyA9IFtxM3I3IHEycjcgcTFyNyBxMHI3IHAwcjcgcDFyNyBwMnI3IHAzcjddCisKKyAgICAgICAgOy8vIDh4OCBUcmFuc3Bvc2UKKworICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzAsIGRSb3cyCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c1LCBkUm93NworICAgICAgICAKKworICAgICAgICBWWklQLjE2ICAgICBkUm93NCwgZFJvdzYKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzEsIGRSb3c1CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cyLCBkUm93NgorICAgICAgICBWWklQLjMyICAgICBkUm93MywgZFJvdzcKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzAsIGRSb3c0CisgICAgICAgIAorCisgICAgICAgIDsvLyBkUm93MCAtIGRQXzMsIGRSb3cxIC0gZFFfMCwgZFJvdzIgLSBkUF8xLCBkUm93MyAtIGRRXzIKKyAgICAgICAgOy8vIGRSb3c0IC0gZFBfMiwgZFJvdzUgLSBkUV8xLCBkUm93NiAtIGRQXzAsIGRSb3c3IC0gZFFfMworCisgICAgICAgIDsvLyBkUV8wID0gW3EwcjcgcTByNiBxMHI1IHEwcjQgcTByMyBxMHIyIHEwcjEgcTByMF0KKyAgICAgICAgOy8vIGRRXzEgPSBbcTFyNyBxMXI2IHExcjUgcTFyNCBxMXIzIHExcjIgcTFyMSBxMXIwXQorICAgICAgICA7Ly8gZFFfMiA9IFtxMnI3IHEycjYgcTJyNSBxMnI0IHEycjMgcTJyMiBxMnIxIHEycjBdCisgICAgICAgIDsvLyBkUV8zID0gW3EzcjcgcTNyNiBxM3I1IHEzcjQgcTNyMyBxM3IyIHEzcjEgcTNyMF0KKworICAgICAgICA7Ly8gZFBfMCA9IFtwMHI3IHAwcjYgcDByNSBwMHI0IHAwcjMgcDByMiBwMHIxIHAwcjBdCisgICAgICAgIDsvLyBkUF8xID0gW3AxcjcgcDFyNiBwMXI1IHAxcjQgcDFyMyBwMXIyIHAxcjEgcDFyMF0KKyAgICAgICAgOy8vIGRQXzIgPSBbcDJyNyBwMnI2IHAycjUgcDJyNCBwMnIzIHAycjIgcDJyMSBwMnIwXQorICAgICAgICA7Ly8gZFBfMyA9IFtwM3I3IHAzcjYgcDNyNSBwM3I0IHAzcjMgcDNyMiBwM3IxIHAzcjBdCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAorCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmCisgICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAorCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMF0sIE1hc2tfMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZjAwCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAorCisgICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzFdLCBNYXNrXzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzQgCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorICAgIAorICAgICAgICBCTkUgICAgICAgICBiU0dFNCAgICAgICAgCitiU0xUNAorICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8gVHJhbnNwb3NlCisKKyAgICAgICAgVlpJUC44ICAgICAgZFBfMywgIGRQXzIgIAorICAgICAgICBWWklQLjggICAgICBkUF8xbiwgZFBfMG4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMG4sIGRRXzFuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzIsICBkUV8zCisKKyAgICAgICAgCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzMsICBkUF8xbgorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzBuLCBkUV8yCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzFuLCBkUV8zCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzIsICBkUF8wbgorCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzMsICBkUV8wbgorICAgICAgICBWWklQLjMyICAgICBkUF8xbiwgZFFfMgorICAgICAgICBWWklQLjMyICAgICBkUF8yLCAgZFFfMW4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMG4sIGRRXzMKKworICAgICAgICA7Ly8gZFJvd24wIC0gZFBfMywgIGRSb3duMSAtIGRRXzBuCisgICAgICAgIDsvLyBkUm93bjIgLSBkUF8xbiwgZFJvd24zIC0gZFFfMgorICAgICAgICA7Ly8gZFJvd240IC0gZFBfMiwgIGRSb3duNSAtIGRRXzFuCisgICAgICAgIDsvLyBkUm93bjYgLSBkUF8wbiwgZFJvd243IC0gZFFfMworCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjEsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24yLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMywgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICA7MQorICAgICAgICBWU1QxICAgICAgICBkUm93bjQsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd241LCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd242LCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd243LCBbcFRtcF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQorCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCisKK05vRmlsdGVyQlMwCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZworICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKworICAgICAgICBWWklQLjggICAgICBkUF8zLCAgZFBfMm4gICAKKyAgICAgICAgVlpJUC44ICAgICAgZFBfMW4sIGRQXzBuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzBuLCBkUV8xbgorICAgICAgICBWWklQLjggICAgICBkUV8ybiwgZFFfMworCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzMsICBkUF8xbgorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzBuLCBkUV8ybgorICAgICAgICBWWklQLjE2ICAgICBkUV8xbiwgZFFfMworICAgICAgICBWWklQLjE2ICAgICBkUF8ybiwgZFBfMG4KKworICAgICAgICBWWklQLjMyICAgICBkUF8zLCAgZFFfMG4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMW4sIGRRXzJuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzJuLCBkUV8xbgorICAgICAgICBWWklQLjMyICAgICBkUF8wbiwgZFFfMworCisgICAgICAgIDsvLyBkUm93MG4gLSBkUF8zLCBkUm93MW4gLSBkUV8wbiwgZFJvdzJuIC0gZFBfMW4sIGRSb3czbiAtIGRRXzJuCisgICAgICAgIDsvLyBkUm93NG4gLSBkUF8yLCBkUm93NW4gLSBkUV8xbiwgZFJvdzZuIC0gZFBfMG4sIGRSb3c3biAtIGRRXzMKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgICAgIGRSb3cwbiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93MW4sIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzJuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3czbiwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93NG4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzVuLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLFhZLFhZCisgICAgICAgIFZTVDEgICAgICAgIGRSb3c2biwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZTVDEgICAgICAgIGRSb3c3biwgW3BUbXBdLCBwVG1wU3RlcAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKworRXhpdExvb3BZICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcEJTLCBwQlMsICMxNAorICAgICAgICBTVUIgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMxNAorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjMTYKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMgCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdCisgICAgICAgIEJORSAgICAgICAgIExvb3BZCisKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjZTQxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKyAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCisgKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KKyAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgorICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKKyAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KKyAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KKyAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjLAorICAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX1MzMiBkc3RTdGVwLAorICAgICBPTVhfUzMyIGR4LAorICAgICBPTVhfUzMyIGR5LAorICAgICBPTVhTaXplIHJvaQorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCisgICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQyZWJjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCkBAIC0wLDAgKzEsNTUzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKKzsvLworOy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSBpbiB2NiBhc3NlbWJseS4KKzsvLyBQZXJmb3JtcyBxdWFydGVyIHBlbCBpbnRlcnBvbGF0aW9uIG9mIGludGVyIGx1bWEgTUIuCis7Ly8gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorOy8vIFBhcmFtZXRlcnM6Cis7Ly8gW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgorOy8vIFtpbl0gICAgc3JjU3RlcCAgICAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQorOy8vIFtpbl0gICAgZHN0U3RlcCAgICAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aAorOy8vIFtpbl0gICAgZHggICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvcgorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCis7Ly8gW2luXSAgICBkeSAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvcgorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCis7Ly8gW2luXSAgICByb2kgICAgICAgICBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Cis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LgorOy8vIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLworOy8vIFJldHVybiBWYWx1ZToKKzsvLyBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCis7Ly8gSXQgaXMgYXNzdWVkIHRoYXQgZm9sbG93aW5nIGNhc2VzIGFyZSBzYXRpc2ZpZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjoKKzsvLyAgcFNyYyBvciBwRHN0IGlzIG5vdCBOVUxMLgorOy8vICBzcmNTdGVwIG9yIGRzdFN0ZXAgPj0gcm9pLndpZHRoLgorOy8vICAgICBkeCBvciBkeSBpcyBpbiB0aGUgcmFuZ2UgWzAtM10uCis7Ly8gICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG5vdCBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIERzdCBpcyA0IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIHBEc3QgaXMgOCBieXRlIGFsaWduZWQuCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byAxNiwgcERzdCBpcyAxNiBieXRlIGFsaWduZWQuCis7Ly8gICAgIHNyY1N0ZXAgYW5kIGRzdFN0ZXAgaXMgbXVsdGlwbGUgb2YgOC4KKzsvLworOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgICAgICAKKworICAgIElGIENvcnRleEE4CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgRU5ESUYKKyAgICAKKyAgICAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworaUhlaWdodCAgICAgICAgIFJOIDQKK2lXaWR0aCAgICAgICAgICBSTiA1CisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKKworICAgIElGIENvcnRleEE4CisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KKyAgICAgICAgOy8vCisgICAgICAgIE1fQUxMT0M0ICAgIHBwQXJncywgMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExLCBkMTUKKworcFNyY0JLICAgICAgICAgIFJOIDgKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCitkU3JjMGMgICAgICAgICAgRE4gMTQuVTgKK2RTcmMxYyAgICAgICAgICBETiAxNi5VOAorZFNyYzJjICAgICAgICAgIEROIDE4LlU4CitkU3JjM2MgICAgICAgICAgRE4gMjAuVTggICAgICAgICAgICAgICAgICAgCitkU3JjMGQgICAgICAgICAgRE4gMTUuVTgKK2RTcmMxZCAgICAgICAgICBETiAxNy5VOAorZFNyYzJkICAgICAgICAgIEROIDE5LlU4CitkU3JjM2QgICAgICAgICAgRE4gMjEuVTgKK2RBY2NIMCAgICAgICAgICBETiAyMi5VOAorZEFjY0gxICAgICAgICAgIEROIDI0LlU4CitkQWNjSDIgICAgICAgICAgRE4gMjYuVTgKK2RBY2NIMyAgICAgICAgICBETiAyOC5VOAorZFJlc3VsdEgwICAgICAgIEROIDIyLlUzMgorZFJlc3VsdEgxICAgICAgIEROIDI0LlUzMgorZFJlc3VsdEgyICAgICAgIEROIDI2LlUzMgorZFJlc3VsdEgzICAgICAgIEROIDI4LlUzMgorCis7Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitkU3JjMCAgICAgICAgICAgRE4gOS5VOAorZFNyYzEgICAgICAgICAgIEROIDEwLlU4CitkU3JjMiAgICAgICAgICAgRE4gMTEuVTgKK2RTcmMzICAgICAgICAgICBETiAxMi5VOAorZFNyYzQgICAgICAgICAgIEROIDEzLlU4CitkQWNjVjAgICAgICAgICAgRE4gMC5VOAorZEFjY1YxICAgICAgICAgIEROIDIuVTgKK2RBY2NWMiAgICAgICAgICBETiA0LlU4CitkQWNjVjMgICAgICAgICAgRE4gNi5VOAorZFJlc3VsdFYwICAgICAgIEROIDAuVTMyCitkUmVzdWx0VjEgICAgICAgRE4gMi5VMzIKK2RSZXN1bHRWMiAgICAgICBETiA0LlUzMgorZFJlc3VsdFYzICAgICAgIEROIDYuVTMyCisgICAgICAgIAorOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgRGlhZ29uYWwgaW50ZXJwb2xhdGlvbgorZFRBY2MwICAgICAgICAgIEROIDAuVTgKK2RUQWNjMSAgICAgICAgICBETiAyLlU4CitkVEFjYzIgICAgICAgICAgRE4gNC5VOAorZFRBY2MzICAgICAgICAgIEROIDYuVTgKK2RUUmVzMCAgICAgICAgICBETiAwLjMyCitkVFJlczEgICAgICAgICAgRE4gMi4zMgorZFRSZXMyICAgICAgICAgIEROIDQuMzIKK2RUUmVzMyAgICAgICAgICBETiA2LjMyCitkVFJlc3VsdDAgICAgICAgRE4gMTQuVTgKK2RUUmVzdWx0MSAgICAgICBETiAxNi5VOAorZFRSZXN1bHQyICAgICAgIEROIDE4LlU4CitkVFJlc3VsdDMgICAgICAgRE4gMjAuVTgKK2RUZW1wUDAgICAgICAgICBETiAxOC5TMTYKK2RUZW1wUDEgICAgICAgICBETiAxOS5TMTYKK2RUZW1wUTAgICAgICAgICBETiAyMC5TMTYKK2RUZW1wUTEgICAgICAgICBETiAyMS5TMTYKK2RUZW1wUjAgICAgICAgICBETiAyMi5TMTYKK2RUZW1wUjEgICAgICAgICBETiAyMy5TMTYKK2RUZW1wUzAgICAgICAgICBETiAyNC5TMTYKK2RUZW1wUzEgICAgICAgICBETiAyNS5TMTYKK3FUZW1wUDAxICAgICAgICBRTiA5LlMxNgorcVRlbXBRMDEgICAgICAgIFFOIDEwLlMxNgorcVRlbXBSMDEgICAgICAgIFFOIDExLlMxNgorcVRlbXBTMDEgICAgICAgIFFOIDEyLlMxNgorCis7Ly8gSW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IgYXZlcmFnaW5nCitxUmVzMiAgICAgICAgICAgUU4gNy5TMTYKK3FSZXMzICAgICAgICAgICBRTiA4LlMxNgorcVJlczQgICAgICAgICAgIFFOIDkuUzE2CitxUmVzNSAgICAgICAgICAgUU4gMTAuUzE2CitxUmVzNiAgICAgICAgICAgUU4gMTEuUzE2CisgICAgICAgCis7Ly8gRm9yIGltcGxlbWVudGluZyBjb3B5CitkRHN0MCAgICAgICAgICAgIEROIDkuMzIKK2REc3QxICAgICAgICAgICAgRE4gMTAuMzIKK2REc3QyICAgICAgICAgICAgRE4gMTEuMzIKK2REc3QzICAgICAgICAgICAgRE4gMTIuMzIKKworICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICAgICBwdHJpZHgsIDQKKyAgICAgICAgTV9BUkcgICAgICAgcHRyaWR5LCA0ICAgICAgICAKKyAgICAgICAgTV9BUkcgICAgICAgcHRyV2lkdGgsIDQKKyAgICAgICAgTV9BUkcgICAgICAgcHRySGVpZ2h0LCA0ICAgICAgICAKKworICAgICAgICA7Ly8gTG9hZCBzdHJ1Y3R1cmUgZWxlbWVudHMgb2Ygcm9pIAorICAgICAgICBNX0xEUiAgICAgICBpZHgsIHB0cmlkeAorICAgICAgICBNX0xEUiAgICAgICBpZHksIHB0cmlkeQorICAgICAgICBNX0xEUiAgICAgICBpV2lkdGgsIHB0cldpZHRoCisgICAgICAgIE1fTERSICAgICAgIGlIZWlnaHQsIHB0ckhlaWdodAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIE1vdmUgY29lZmZpY2llbnRzIE5lb24gcmVnaXN0ZXJzCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0Jsb2NrNHg0V2lkdGhMb29wCitCbG9jazR4NEhlaWdodExvb3AKKworICAgICAgICBTVE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBzd2l0Y2ggdGFibGUgdXNpbmcgbW90aW9uIHZlY3RvciBhcyBpbmRleAorICAgICAgICBBREQgICAgICAgICBwYywgcGMsIGluZGV4LCBMU0wgIzIKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9mCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMCAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMiAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNCAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNiAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfOCAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfOSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfYSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfYiAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfYyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZAorICAgICAgICBCICAgICAgICAgICBDYXNlX2UgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlX2YKKyAgICAgICAgICAgICAgICAgICAgCitDYXNlXzAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBDYXNlIEcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkcyBhIDR4NCBibG9jayBvZiAuOCBhbmQgc3RvcmVzIGFzIC4zMgorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEgCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzIsIFtUZW1wXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBkU3JjMSwgW3BTcmNdCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZERzdDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkRHN0MlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGREc3QxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZERzdDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV8xCisgICAgICAgIDsvLyBDYXNlIGEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMSBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkU3JjMGMKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRTcmMyYworICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZFNyYzFjCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkU3JjM2MKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzIKKyAgICAgICAgOy8vIENhc2UgYgorICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzMKKyAgICAgICAgOy8vIENhc2UgYworICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwZAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJkCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWQKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzZAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfNAorICAgICAgICA7Ly8gQ2FzZSBkCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDQgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YwLCBkQWNjVjAsIGRTcmMwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMiwgZEFjY1YyLCBkU3JjMgorICAgICAgICBWUkhBREQgICAgICBkQWNjVjEsIGRBY2NWMSwgZFNyYzEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YzLCBkQWNjVjMsIGRTcmMzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV81CisgICAgICAgIDsvLyBDYXNlIGUKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjQkssICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV82CisgICAgICAgIDsvLyBDYXNlIGYKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVJlczIsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxUmVzMywgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFSZXM0LCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVJlczUsICM1ICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIAorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfNworICAgICAgICA7Ly8gQ2FzZSBnCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjQkssICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfOAorICAgICAgICA7Ly8gQ2FzZSBoCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDggXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV85CisgICAgICAgIDsvLyBDYXNlIGkKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOSBcbiIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBWRVhUICAgICAgICBkVGVtcFAwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcFEwLCBkVGVtcFEwLCBkVGVtcFExLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcFIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcFMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMgorICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxVGVtcFAwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFUZW1wUTAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVRlbXBSMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxVGVtcFMwMSwgIzUgICAgICAgIAorCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgorICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2EKKyAgICAgICAgOy8vIENhc2UgagorICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2IKKyAgICAgICAgOy8vIENhc2UgaworICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMzCisgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCisKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYworICAgICAgICA7Ly8gQ2FzZSBuCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YwLCBkQWNjVjAsIGRTcmMxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMiwgZEFjY1YyLCBkU3JjMworICAgICAgICBWUkhBREQgICAgICBkQWNjVjEsIGRBY2NWMSwgZFNyYzIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YzLCBkQWNjVjMsIGRTcmM0CisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZAorICAgICAgICA7Ly8gQ2FzZSBwCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyY0JLLCBzcmNTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9lCisgICAgICAgIDsvLyBDYXNlIHEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMywgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXM0LCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczUsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNiwgIzUgICAgICAgIAorCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgorICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2YKKyAgICAgICAgOy8vIENhc2UgcgorICAgICAgICBNX1BSSU5URiAiQ2FzZSBmIFxuIgorICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyY0JLLCBzcmNTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworCisKK0Jsb2NrNHg0TG9vcEVuZAorCisgICAgICAgIDsvLyBXaWR0aCBMb29wCisgICAgICAgIDsvL01fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCisgICAgICAgIFNVQlMgICAgICAgIGlXaWR0aCwgaVdpZHRoLCAjNAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAorICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NFdpZHRoTG9vcAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIEhlaWdodCBMb29wCisgICAgICAgIFNVQlMgICAgICAgIGlIZWlnaHQsIGlIZWlnaHQsICM0CisgICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAorICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCBpV2lkdGgKKyAgICAgICAgQkdUICAgICAgICAgQmxvY2s0eDRIZWlnaHRMb29wCisKK0VuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBNT1YgICAgICAgICByMCwgIzAKKyAgICAgICAgTV9FTkQgICAgICAgCisKKyAgICBFTkRJRiAgCisgICAgICAgIDsvLyBFbmQgb2YgQ29ydGV4QTgKKyAgICAgICAgICAgICAgICAgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2E2MDcwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpAQCAtMCwwICsxLDQzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorICAgICAgICAgCisgICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAorICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQorICAgIERDVyAgIDMsIDIsIDEsNCAKKyAgICBEQ1cgIC0zLC0yLC0xLDAKKyAgICBEQ1cgICAxLCAyLCAzLDQKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgIElGIENvcnRleEE4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorcmV0dXJuICAgICAgICAgIFJOIDAgIAorcFRhYmxlICAgICAgICAgIFJOIDggCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBJbnB1dCBBcmd1bWVudHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcE11bHRpcGxpZXJUYWJsZSAgICBSTiAgMiAgICAgCisKK3BUbXAgICAgICAgICAgICBSTiA5CitzdGVwICAgICAgICAgICAgUk4gMTAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gTmVvbiBSZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8gT01YX1ZDX0NIUk9NQV9IT1IKKworZExlZnRWYWwwICAgICAgIEROICBEMC44CitkTGVmdFZhbDEgICAgICAgRE4gIEQxLjgKK2RMZWZ0VmFsMiAgICAgICBETiAgRDIuOAorZExlZnRWYWwzICAgICAgIEROICBEMy44CitkTGVmdFZhbDQgICAgICAgRE4gIEQ0LjgKK2RMZWZ0VmFsNSAgICAgICBETiAgRDUuOAorZExlZnRWYWw2ICAgICAgIEROICBENi44CitkTGVmdFZhbDcgICAgICAgRE4gIEQ3LjgKKworOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAorCitkQWJvdmVWYWwgICAgICAgRE4gIEQwLlU4CisKKzsvLyBPTVhfVkNfQ0hST01BX0RDCisKK2RMZWZ0VmFsICAgICAgICBETiAgRDEuVTgKK2RTdW1BYm92ZVZhbFUxNiBETiAgRDIuVTE2CitkU3VtQWJvdmVWYWxVMzIgRE4gIEQzLlUzMgorZFN1bUFib3ZlVmFsVTggIEROICBEMy5VOAorZFN1bUxlZnRWYWxVMTYgIEROICBEMi5VMTYKK2RTdW1MZWZ0VmFsVTMyICBETiAgRDEuVTMyCitkU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4CitkU3VtQWJvdmVMZWZ0ICAgRE4gIEQyLlUzMgorZFN1bUFib3ZlTGVmdFU4IEROICBEMi5VOAorZEluZGV4Um93MFU4ICAgIEROICBENS5VOAorZEluZGV4Um93MCAgICAgIEROICBENS5VNjQKK2RJbmRleFJvdzRVOCAgICBETiAgRDYuVTgKK2RJbmRleFJvdzQgICAgICBETiAgRDYuVTY0CitkRHN0Um93MCAgICAgICAgRE4gIEQwLlU4CitkRHN0Um93NCAgICAgICAgRE4gIEQ0LlU4CitkQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4CisKKzsvLyBPTVhfVkNfQ0hST01BX1BMQU5FCisKK2RSZXZBYm92ZVZhbCAgICBETiAgRDMuVTggIAorZFJldkFib3ZlVmFsVTY0IEROICBEMy5VNjQgIAorZEFib3ZlTGVmdFZhbCAgIEROICBEMi5VOAorcUFib3ZlN21pbnVzMCAgIFFOICBRMy5TMTYgCitxQWJvdmVEaWZmICAgICAgUU4gIFEyLlMxNiAKK2RJbmRleCAgICAgICAgICBETiAgRDguVTggIAorZERpZmZBYm92ZVU4ICAgIEROICBEOS5VOCAgCitkRGlmZkFib3ZlUzE2ICAgRE4gIEQ5LlMxNiAKK2RBYm92ZURpZmYwVTggICBETiAgRDQuVTggIAorZEFib3ZlRGlmZjBVNjQgIEROICBENC5VNjQKK2RBYm92ZTdtaW51czBVOCBETiAgRDYuVTggIAorZE11bHRpcGxpZXIgICAgIEROICBEMTAuUzE2IAorZEhvclByZWQgICAgICAgIEROICBEMTEuUzE2IAorZFJldkxlZnRWYWwgICAgIEROICBEMy5VOAorZFJldkxlZnRWYWxVNjQgIEROICBEMy5VNjQKK3FMZWZ0N21pbnVzMCAgICBRTiAgUTcuUzE2CitxTGVmdERpZmYgICAgICAgUU4gIFE2LlMxNgorZERpZmZMZWZ0VTggICAgIEROICBEMTYuVTgKK2REaWZmTGVmdFMxNiAgICBETiAgRDE2LlMxNgorZExlZnREaWZmMFU4ICAgIEROICBEMTIuVTgKK2RMZWZ0RGlmZjBVNjQgICBETiAgRDEyLlU2NAorZExlZnQ3bWludXMwVTggIEROICBEMTQuVTgKK2RWZXJQcmVkICAgICAgICBETiAgRDMuUzE2IAorZEhWVmFsUzE2ICAgICAgIEROICBEMy5TMTYKK2RIVlZhbFMzMiAgICAgICBETiAgRDMuUzMyCitkSFZUZW1wUzMyICAgICAgRE4gIEQyLlMzMgorcUEgICAgICAgICAgICAgIFFOICBRMC5TMTYKK3FCICAgICAgICAgICAgICBRTiAgUTIuUzE2CitxQyAgICAgICAgICAgICAgUU4gIFEzLlMxNgorcU11bHRpcGxpZXIgICAgIFFOICBRNS5TMTYKK2RNdWx0aXBsaWVyMCAgICBETiAgRDEwLlMxNgorZE11bHRpcGxpZXIxICAgIEROICBEMTEuUzE2CitxQzAgICAgICAgICAgICAgUU4gIFEwLlMxNgorcUMxICAgICAgICAgICAgIFFOICBRMS5TMTYKK3FDMiAgICAgICAgICAgICBRTiAgUTQuUzE2CitxQzMgICAgICAgICAgICAgUU4gIFE1LlMxNgorcUM0ICAgICAgICAgICAgIFFOICBRNi5TMTYKK3FDNSAgICAgICAgICAgICBRTiAgUTcuUzE2CitxQzYgICAgICAgICAgICAgUU4gIFE4LlMxNgorcUM3ICAgICAgICAgICAgIFFOICBROS5TMTYKK3FTdW0wICAgICAgICAgICBRTiAgUTAuUzE2CitxU3VtMSAgICAgICAgICAgUU4gIFExLlMxNgorcVN1bTIgICAgICAgICAgIFFOICBRNC5TMTYKK3FTdW0zICAgICAgICAgICBRTiAgUTUuUzE2CitxU3VtNCAgICAgICAgICAgUU4gIFE2LlMxNgorcVN1bTUgICAgICAgICAgIFFOICBRNy5TMTYKK3FTdW02ICAgICAgICAgICBRTiAgUTguUzE2CitxU3VtNyAgICAgICAgICAgUU4gIFE5LlMxNgorZFN1bTAgICAgICAgICAgIEROICBEMC5VOAorZFN1bTEgICAgICAgICAgIEROICBEMS5VOAorZFN1bTIgICAgICAgICAgIEROICBEMi5VOAorZFN1bTMgICAgICAgICAgIEROICBEMy5VOAorZFN1bTQgICAgICAgICAgIEROICBENC5VOAorZFN1bTUgICAgICAgICAgIEROICBENS5VOAorZFN1bTYgICAgICAgICAgIEROICBENi5VOAorZFN1bTcgICAgICAgICAgIEROICBENy5VOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCByMTAsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDggICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisKK09NWF9WQ19DSFJPTUFfREMKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OExlZnROb3RBdmFpbGFibGUKKworICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorCisgICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs2XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzddfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0gICAgICAKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbworICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDddICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCs1KzYrNyB8ICAwKzErMiszIF0gCisgICAgICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA0KzUrNis3IHwgIDArMSsyKzMgXSAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgIGRTdW1BYm92ZUxlZnQsZFN1bUFib3ZlVmFsVTMyLGRTdW1MZWZ0VmFsVTMyCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZUxlZnQsZFN1bUFib3ZlTGVmdCwjMyAgICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDQpID4+IDMKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIAorICAgICAgICBWTU9WICAgICBkSW5kZXhSb3cwVTgsIzB4MGMgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzRVOCwjMHgwNAorICAgICAgICBWU0hMICAgICBkSW5kZXhSb3cwLGRJbmRleFJvdzAsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4MCA9IDB4MGMwYzBjMGMwMDAwMDAwMCAKKyAgICAgICAgVlNIUiAgICAgZEluZGV4Um93NCxkSW5kZXhSb3c0LCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleDQgPSAweDAwMDAwMDAwMDQwNDA0MDQKKyAgICAgICAgVkFERCAgICAgZEluZGV4Um93NFU4LGRJbmRleFJvdzRVOCxkSW5kZXhSb3cwVTggICAgIDsvLyBpbmRleDQgPSAweDBjMGMwYzBjMDQwNDA0MDQKKyAgICAgICAgVlRCTCAgICAgZERzdFJvdzAse2RTdW1BYm92ZUxlZnRVOCxkU3VtQWJvdmVWYWxVOH0sZEluZGV4Um93MFU4CisgICAgICAgIFZUQkwgICAgIGREc3RSb3c0LHtkU3VtTGVmdFZhbFU4LGRTdW1BYm92ZUxlZnRVOH0sZEluZGV4Um93NFU4CisgCitEQ0Nocm9tYTh4OExlZnRTdG9yZSAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorCitEQ0Nocm9tYTh4OExlZnRPbmx5QXZhaWxhYmxlCisKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDQrNSs2KzcgfCAgMCsxKzIrMyBdICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgIGREc3RSb3cwLGRTdW1MZWZ0VmFsVThbMF0KKyAgICAgICAgVkRVUCAgICAgZERzdFJvdzQsZFN1bUxlZnRWYWxVOFs0XQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhMZWZ0U3RvcmUgIAorICAgICAgICAKKworRENDaHJvbWE4eDhMZWZ0Tm90QXZhaWxhYmxlCisgICAgICAgICAgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgorICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4Tm9uZUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gN10gIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQrNSs2KzcgfCAgMCsxKzIrMyBdIAorICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzBVOCwjMHgwNAorICAgICAgICBWU0hMICAgICBkSW5kZXhSb3cwLGRJbmRleFJvdzAsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4ID0gMHgwNDA0MDQwNDAwMDAwMDAwCisgICAgICAgIFZUQkwgICAgIGREc3RSb3cwLHtkU3VtQWJvdmVWYWxVOH0sZEluZGV4Um93MFU4IAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhVcHBlclN0b3JlCisgICAgICAgIAorCitEQ0Nocm9tYTh4OE5vbmVBdmFpbGFibGUgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZENvbnN0MTI4VTgsIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAweDgwODA4MDgwODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisKK0RDQ2hyb21hOHg4VXBwZXJTdG9yZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgCisgICAgICAgIE1fRVhJVAorCisKK09NWF9WQ19DSFJPTUFfVkVSVAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFVwcGVyU3RvcmUKKyAgICAgICAgCisKK09NWF9WQ19DSFJPTUFfSE9SCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNFtdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDVbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw2W119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsN1tdfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhQbGFuZVN0b3JlCisgICAgICAgIAorICAgICAgICAKK09NWF9WQ19DSFJPTUFfUExBTkUKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0VmFsWzBdLFtwU3JjQWJvdmVMZWZ0XQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs0XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzVdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs3XX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZSRVY2NCAgZFJldkFib3ZlVmFsLGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmV2ZXJzZSBvcmRlciBvZiBieXRlcyA9IHBTcmNBYm92ZVswOjE6MjozOjQ6NTo2OjddCisgICAgICAgIFZTVUJMICAgcUFib3ZlN21pbnVzMCxkUmV2QWJvdmVWYWwsZEFib3ZlTGVmdFZhbCAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgVlNIUiAgICBkUmV2QWJvdmVWYWxVNjQsZFJldkFib3ZlVmFsVTY0LCM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbWDowOjE6MjozOjQ6NTo2XQorICAgICAgICBWU1VCTCAgIHFBYm92ZURpZmYsZFJldkFib3ZlVmFsLGRBYm92ZVZhbCAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XSAtIHBTcmNBYm92ZVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XSAtIHBTcmNBYm92ZVsyXQorICAgICAgICAKKyAgICAgICAgVlJFVjY0ICBkUmV2TGVmdFZhbCxkTGVmdFZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXZlcnNlIG9yZGVyIG9mIGJ5dGVzID0gcFNyY0xlZnRbMDoxOjI6Mzo0OjU6Njo3XQorICAgICAgICBWU1VCTCAgIHFMZWZ0N21pbnVzMCxkUmV2TGVmdFZhbCxkQWJvdmVMZWZ0VmFsICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgVlNIUiAgICBkUmV2TGVmdFZhbFU2NCxkUmV2TGVmdFZhbFU2NCwjOCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFtYOjA6MToyOjM6NDo1OjZdCisgICAgICAgIFZTVUJMICAgcUxlZnREaWZmLGRSZXZMZWZ0VmFsLGRMZWZ0VmFsICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNl0gLSBwU3JjTGVmdFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzVdIC0gcFNyY0xlZnRbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0XSAtIHBTcmNMZWZ0WzJdCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBNdWx0aXBsaWVyVGFibGUsPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4ICAgOy8vIFVzZWQgdG8gY2FsY3VsYXRlIEh2YWwgJiBWdmFsICAKKyAgICAgICAgVlNITCAgICBkQWJvdmVEaWZmMFU2NCxkQWJvdmVEaWZmMFU2NCwjMTYgIAorICAgICAgICBWRVhUICAgIGREaWZmQWJvdmVVOCxkQWJvdmVEaWZmMFU4LGRBYm92ZTdtaW51czBVOCwjMiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNy0wIHwgNC0yIHwgNS0xIHwgNi0wIF0KKyAgICAgICAgVkxEMSAgICBkTXVsdGlwbGllcixbcE11bHRpcGxpZXJUYWJsZV0hIAorICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjBVNjQsZExlZnREaWZmMFU2NCwjMTYgIAorICAgICAgICBWRVhUICAgIGREaWZmTGVmdFU4LGRMZWZ0RGlmZjBVOCxkTGVmdDdtaW51czBVOCwjMiAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA3LTAgfCA0LTIgfCA1LTEgfCA2LTAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNVUwgICAgZEhvclByZWQsZERpZmZBYm92ZVMxNixkTXVsdGlwbGllciAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0Kig3LTApIHwgMSooNC0yKSB8IDIqKDUtMSkgfCAzKig2LTApIF0KKyAgICAgICAgVk1VTCAgICBkVmVyUHJlZCxkRGlmZkxlZnRTMTYsZE11bHRpcGxpZXIKKyAgICAgICAgVlBBREQgICBkSFZWYWxTMTYsZEhvclByZWQsZFZlclByZWQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWUEFEREwgIGRIVlZhbFMzMixkSFZWYWxTMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtWfEhdIGluIDMyIGJpdHMgZWFjaAorICAgICAgICBWU0hMICAgIGRIVlRlbXBTMzIsZEhWVmFsUzMyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE3KkggPSAxNipIICsgSCA9IChIPDw0KStICisgICAgICAgIFZBREQgICAgZEhWVmFsUzMyLGRIVlZhbFMzMixkSFZUZW1wUzMyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWyAxNypWICB8IDE3KkggXWluIDMyIGJpdHMgZWFjaAorICAgICAgICBWTEQxICAgIHtkTXVsdGlwbGllcjAsZE11bHRpcGxpZXIxfSxbcE11bHRpcGxpZXJUYWJsZV0gICAgICAgICAgOy8vIHFNdWx0aXBsaWVyID0gWyA0fDN8MnwxfDB8LTF8LTJ8LTMgXSAgCisgICAgICAgIFZSU0hSICAgZEhWVmFsUzMyLGRIVlZhbFMzMiwjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2N8Yl0gaW4gMTZiaXRzIGVhY2gKKyAgICAgICAgVkFEREwgICBxQSxkQWJvdmVWYWwsZExlZnRWYWwKKyAgICAgICAgVkRVUCAgICBxQSxxQVs3XQorICAgICAgICBWU0hMICAgIHFBLHFBLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFthfGF8YXxhfGF8YXxhfGFdCisgICAgICAgIFZEVVAgICAgcUIsZEhWVmFsUzE2WzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2J8YnxifGJ8YnxifGJ8Yl0KKyAgICAgICAgVkRVUCAgICBxQyxkSFZWYWxTMTZbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbY3xjfGN8Y3xjfGN8Y3xjXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNVUwgICAgcUIscUIscU11bHRpcGxpZXIKKyAgICAgICAgVk1VTCAgICBxQyxxQyxxTXVsdGlwbGllcgorICAgICAgICBWQUREICAgIHFCLHFCLHFBIAorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBxQzAscUNbMF0KKyAgICAgICAgVkRVUCAgICBxQzEscUNbMV0KKyAgICAgICAgVkRVUCAgICBxQzIscUNbMl0KKyAgICAgICAgVkRVUCAgICBxQzMscUNbM10KKyAgICAgICAgVkRVUCAgICBxQzQscUNbNF0KKyAgICAgICAgVkRVUCAgICBxQzUscUNbNV0KKyAgICAgICAgVkRVUCAgICBxQzYscUNbNl0KKyAgICAgICAgVkRVUCAgICBxQzcscUNbN10KKyAgICAgICAgCisgICAgICAgIFZBREQgICAgcVN1bTAscUIscUMwCisgICAgICAgIFZBREQgICAgcVN1bTEscUIscUMxCisgICAgICAgIFZBREQgICAgcVN1bTIscUIscUMyCisgICAgICAgIFZBREQgICAgcVN1bTMscUIscUMzCisgICAgICAgIFZBREQgICAgcVN1bTQscUIscUM0CisgICAgICAgIFZBREQgICAgcVN1bTUscUIscUM1CisgICAgICAgIFZBREQgICAgcVN1bTYscUIscUM2CisgICAgICAgIFZBREQgICAgcVN1bTcscUIscUM3CisgICAgICAgIAorICAgICAgICBWUVJTSFJVTiBkU3VtMCxxU3VtMCwjNSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gKE9NWF9VOClhcm1DbGlwKDAsMjU1LChTdW0rMTYpPj41KQorICAgICAgICBWUVJTSFJVTiBkU3VtMSxxU3VtMSwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtMixxU3VtMiwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtMyxxU3VtMywjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNCxxU3VtNCwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNSxxU3VtNSwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNixxU3VtNiwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNyxxU3VtNywjNSAgICAgIAorCitEQ0Nocm9tYTh4OFBsYW5lU3RvcmUgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRTdW0wLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtMSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTIsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW0zLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTUsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW02LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNyxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVORAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTljMGVlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCkBAIC0wLDAgKzEsNDI0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAorICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQorICAgIAorCisgICAgSUYgQ29ydGV4QTgKKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNiwxCisgICAgRENXICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDggCisgICAgRENXICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICBEQ1cgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gQ29uc3RhbnRzIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorQkxLX1NJWkUgICAgICAgIEVRVSAweDEwCitNVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKK01VTF9DT05TVDEgICAgICBFUVUgMHgwMDA2MDAwNAorTVVMX0NPTlNUMiAgICAgIEVRVSAweDAwMDcwMDA1CitNVUxfQ09OU1QzICAgICAgRVFVIDB4MDAwMzAwMDEKK01BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit5ICAgICAgICAgICAgICAgUk4gMTIgICAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorCityZXR1cm4gICAgICAgICAgUk4gMCAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAorY291bnQgICAgICAgICAgIFJOIDExICAgCitwTXVsdFRhYmxlICAgICAgUk4gOQorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE5lb24gcmVnaXN0ZXJzCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3FBYm92ZSAgICAgICAgICBRTiBRMC5VOAorcUxlZnQgICAgICAgICAgIFFOIFExLlU4CitxU3VtOCAgICAgICAgICAgUU4gUTAuVTE2CitkU3VtODAgICAgICAgICAgRE4gRDAuVTE2CitkU3VtODEgICAgICAgICAgRE4gRDEuVTE2CitkU3VtNCAgICAgICAgICAgRE4gRDAuVTE2CitkU3VtMiAgICAgICAgICAgRE4gRDAuVTMyCitkU3VtMSAgICAgICAgICAgRE4gRDAuVTY0CitxT3V0ICAgICAgICAgICAgUU4gUTMuVTgKK2RTdW1MZWZ0ICAgICAgICBETiBENi5VNjQKK2RTdW1BYm92ZSAgICAgICBETiBENy5VNjQKK2RTdW0gICAgICAgICAgICBETiBEOC5VNjQKK2RTdW0wICAgICAgICAgICBETiBEOC5VOFswXQorCitxSCAgICAgICAgICAgICAgUU4gUTExLlMzMgorcVYgICAgICAgICAgICAgIFFOIFExMi5TMzIKK3FBICAgICAgICAgICAgICBRTiBRMTEuUzE2CitxQiAgICAgICAgICAgICAgUU4gUTYuUzE2CitxQyAgICAgICAgICAgICAgUU4gUTcuUzE2CisKK3FCMCAgICAgICAgICAgICBRTiBRNS5TMTYKK3FCMSAgICAgICAgICAgICBRTiBRNi5TMTYKK2RBMSAgICAgICAgICAgICBETiBEMjMuUzE2CisKK2RIMCAgICAgICAgICAgICBETiBEMjIuUzMyCitkSDEgICAgICAgICAgICAgRE4gRDIzLlMzMgorZFYwICAgICAgICAgICAgIEROIEQyNC5TMzIKK2RWMSAgICAgICAgICAgICBETiBEMjUuUzMyCisKK3FIViAgICAgICAgICAgICBRTiBRMTEuUzY0CitxSFYwICAgICAgICAgICAgUU4gUTExLlMzMgorcUhWMSAgICAgICAgICAgIFFOIFExMi5TNjQKKworZEhWMDAgICAgICAgICAgIEROIEQyMi5TMzIKK2RIVjAxICAgICAgICAgICBETiBEMjMuUzMyCisKK2RIVjAgICAgICAgICAgICBETiBEMjIuUzE2WzBdCitkSFYxICAgICAgICAgICAgRE4gRDIzLlMxNlswXQorZEhWMTAgICAgICAgICAgIEROIEQyNC5TNjQKK2RIVjExICAgICAgICAgICBETiBEMjUuUzY0CisKK3FTdW0wICAgICAgICAgICBRTiBRMC5TMTYKK3FTdW0xICAgICAgICAgICBRTiBRMS5TMTYKKworZE91dDAgICAgICAgICAgIEROIEQ2LlU4CitkT3V0MSAgICAgICAgICAgRE4gRDcuVTgKKworZExlZnQwICAgICAgICAgIEROIEQyLlU4CitkTGVmdDEgICAgICAgICAgRE4gRDMuVTgKK3FDb25zdCAgICAgICAgICBRTiBRMTMuUzE2CisKK2RBYm92ZTAgICAgICAgICBETiBEMC5VOAorZEFib3ZlMSAgICAgICAgIEROIEQxLlU4CisKK2RSZXZMZWZ0NjQgICAgICBETiBEMTIuVTY0CitkUmV2TGVmdCAgICAgICAgRE4gRDEyLlU4CitkUmV2QWJvdmU2NCAgICAgRE4gRDUuVTY0CitkUmV2QWJvdmUgICAgICAgRE4gRDUuVTgKK3FMZWZ0RGlmZiAgICAgICBRTiBROC5TMTYKK2RMZWZ0RGlmZjEgICAgICBETiBEMTcuUzE2CitkTGVmdERpZmY2NCAgICAgRE4gRDE3LlM2NAorcURpZmZMZWZ0ICAgICAgIFFOIFE4LlMxNgorcURpZmZBYm92ZSAgICAgIFFOIFE0LlMxNgorZEFib3ZlRGlmZjEgICAgIEROIEQ5LlMxNgorZEFib3ZlRGlmZjY0ICAgIEROIEQ5LlM2NAorcUFib3ZlRGlmZiAgICAgIFFOIFE0LlMxNgorCitkQWJvdmVMZWZ0ICAgICAgRE4gRDQuVTgKKworZERpZmZMZWZ0MCAgICAgIEROIEQxNi5TMTYKK2REaWZmTGVmdDEgICAgICBETiBEMTcuUzE2CitkRGlmZkFib3ZlMCAgICAgRE4gRDguUzE2CitkRGlmZkFib3ZlMSAgICAgRE4gRDkuUzE2CisKK3FMZWZ0MTVtaW51czAgICBRTiBRNy5TMTYKK2RMZWZ0MTVtaW51czAgICBETiBEMTQuUzE2CitxQWJvdmUxNW1pbnVzMCAgUU4gUTMuUzE2CitkQWJvdmUxNW1pbnVzMCAgRE4gRDYuUzE2CisKK3FNdWx0aXBsaWVyICAgICBRTiBRMTAuUzE2CitxTXVsdGlwbGllcjAgICAgUU4gUTEwLlMxNgorcU11bHRpcGxpZXIxICAgIFFOIFExMi5TMTYKK2RNdWx0aXBsaWVyMCAgICBETiBEMjAuUzE2CitkTXVsdGlwbGllcjEgICAgRE4gRDIxLlMxNgorCitkQlBsdXNDTXVsdDcgICAgRE4gRDEuUzY0CitkQlBsdXNDTXVsdDdTMTYgRE4gRDEuUzE2CisKK3FUbXAgICAgICAgICAgICBRTiBRMC5VOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworcFRtcCAgICAgICAgICAgIFJOIDgKK3N0ZXAgICAgICAgICAgICBSTiAxMAorcFRtcDIgICAgICAgICAgIFJOIDExCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfVkVSVAorICAgICAgICBWTEQxICAgIHFBYm92ZSwgIFtwU3JjQWJvdmVdCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXQorICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfSE9SCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgbGVmdFN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHBUbXAyLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0U3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorTG9vcEhvciAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFNVQlMgICAgIHksIHksICM4CisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgQk5FICAgICAgTG9vcEhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMTYgdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfREMKKyAgICAgICAgTU9WICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvdW50ID0gMAorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCRVEgICAgICBVcHBlck9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgbGVmdAorCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMl19LCBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbM119LCBbcFRtcF0sc3RlcAorICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sIFtwVG1wXSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzZdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs3XX0sIFtwVG1wXSxzdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sIFtwVG1wXSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sW3BUbXBdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEyXX0sW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEzXX0sW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sW3BUbXBdIAorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgcVN1bTgsIHFMZWZ0CisgICAgICAgIEFERCAgICAgY291bnQsIGNvdW50LCAjMSAgICAKKyAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCisgICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdCwgZFN1bTIKKyAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUxlZnQsICM0CisgICAgICAgIAorVXBwZXJPck5vbmVBdmFpbGFibGUKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAgI09NWF9WQ19VUFBFUiAgICAgICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIEJFUSAgICAgIEJvdGhPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCisgICAgICAgIFZMRDEgICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0KKyAgICAgICAgQUREICAgICAgY291bnQsIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHVwcGVyIGluYyBjb3VudCBieSAxCisgICAgICAgIFZQQURETCAgIHFTdW04LCBxQWJvdmUKKyAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCisgICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmUsIGRTdW0yCisgICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW1BYm92ZSwgIzQKKyAgICAgICAgCitCb3RoT3JOb25lQXZhaWxhYmxlCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgYm90aCBhdmFpbGFibGUKKyAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQorICAgICAgICBWQUREICAgICBkU3VtLCBkU3VtQWJvdmUsIGRTdW1MZWZ0CisgICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW0sICM1CisgICAgICAgIAorCitOb25lQXZhaWxhYmxlCisgICAgICAgIFZEVVAgICAgIHFPdXQsIGRTdW0wICAgICAgICAKKyAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBub25lIGF2YWlsYWJsZQorICAgICAgICBBREQgICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgQk5FICAgICAgTG9vcERDCisgICAgICAgIFZNT1YgICAgIHFPdXQsICMxMjgKK0xvb3BEQyAgICAgICAgCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKworT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgICAgIExEUiAgICAgcE11bHRUYWJsZSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKKyAgICAgICAgVkxEMSAgICBxQWJvdmUsIFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0WzBdLFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzBdfSwgIFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxXX0sICBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sICBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sICBbcFRtcF0sc3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNF19LCAgW3BTcmNMZWZ0XSxzdGVwICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNV19LCAgW3BUbXBdLHN0ZXAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgIFtwVG1wXSxzdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sICBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMF19LCBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMV19LCBbcFRtcF0sc3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSwgW3BTcmNMZWZ0XSxzdGVwICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSwgW3BUbXBdLHN0ZXAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sIFtwVG1wXSAgIAorCisgICAgICAgIFZSRVY2NCAgZFJldkFib3ZlLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCisgICAgICAgIFZTVUJMICAgcUFib3ZlMTVtaW51czAsIGRSZXZBYm92ZSwgZEFib3ZlTGVmdCAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdIAorICAgICAgICBWU0hSICAgIGRSZXZBYm92ZTY0LCBkUmV2QWJvdmU2NCwgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCisgICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZiwgZFJldkFib3ZlLCBkQWJvdmUwICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjY0LCBkQWJvdmVEaWZmNjQsICMxNiAKKyAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlMSwgZEFib3ZlRGlmZjEsIGRBYm92ZTE1bWludXMwLCAjMSAgCisKKyAgICAgICAgVlJFVjY0ICBkUmV2TGVmdCxkTGVmdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNToxNDoxMzoxMjoxMToxMDo5OjhdIAorICAgICAgICBWU1VCTCAgIHFMZWZ0MTVtaW51czAsZFJldkxlZnQsIGRBYm92ZUxlZnQgICAgICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0gCisgICAgICAgIFZTSFIgICAgZFJldkxlZnQ2NCwgZFJldkxlZnQ2NCwgIzggICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMTQ6MTM6MTI6MTE6MTA6OTo4OlhdIAorICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdCwgZExlZnQwICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTXVsdGlwbGllciA9IFs4fDF8MnwuLi58Nnw3XQorICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyLCBbcE11bHRUYWJsZV0hICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjY0LCBkTGVmdERpZmY2NCwgIzE2CisgICAgICAgIFZFWFQgICAgZERpZmZMZWZ0MSwgZExlZnREaWZmMSwgZExlZnQxNW1pbnVzMCwgIzEgICAgIAorICAgICAgICAKKyAgICAgICAgVk1VTEwgICBxSCxkRGlmZkFib3ZlMCwgZE11bHRpcGxpZXIwICAgICAgICAgICAgICAgIAorICAgICAgICBWTVVMTCAgIHFWLGREaWZmTGVmdDAsICBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNTEFMICAgcUgsZERpZmZBYm92ZTEsIGRNdWx0aXBsaWVyMSAKKyAgICAgICAgVk1MQUwgICBxVixkRGlmZkxlZnQxLCAgZE11bHRpcGxpZXIxCisgICAgICAgIAorICAgICAgICBWUEFERCAgIGRIVjAwLGRIMSxkSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlBBREQgICBkSFYwMSxkVjEsZFYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgcUhWLCBxSFYwCisgICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzIKKyAgICAgICAgVkFERCAgICBxSFYscUhWLHFIVjEgCisgICAgICAgIAorICAgICAgICA7Ly8gSFYgPSBbYyA9ICgoNSpWKzMyKT4+NikgfCBiID0gKCg1KkgrMzIpPj42KV0KKyAgICAgICAgVlJTSFIgICBxSFYscUhWLCM2CisgICAgICAgIAorICAgICAgICA7Ly8gSFYxID0gW2MqN3xiKjddCisgICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzMKKyAgICAgICAgVlNVQiAgICBxSFYxLHFIVjEscUhWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBsaWVyMSA9IFswfDF8MnwuLi58N10KKyAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjAsIFtwTXVsdFRhYmxlXSEgICAgCisgICAgICAgIFZEVVAgICAgcUIsIGRIVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZEVVAgICAgcUMsIGRIVjEgCisgICAgICAgIAorICAgICAgICBWQURETCAgIHFBLGRBYm92ZTEsZExlZnQxCisgICAgICAgIFZTSEwgICAgcUEscUEsICM0CisgICAgICAgIFZEVVAgICAgcUEsZEExWzNdICAKKyAgICAgICAgVkFERCAgICBkQlBsdXNDTXVsdDcsIGRIVjEwLCBkSFYxMQorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzh8OXwxMHwuLi58MTVdCisgICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIxLCBbcE11bHRUYWJsZV0KKyAgICAgICAgOy8vIENvbnN0ID0gYSAtIDcqKGIrYykKKyAgICAgICAgVkRVUCAgICBxQ29uc3QsIGRCUGx1c0NNdWx0N1MxNlswXQorICAgICAgICBWU1VCICAgIHFDb25zdCwgcUEsIHFDb25zdAorICAgICAgICAKKyAgICAgICAgOy8vIEIwID0gWzAqYnwxKmJ8MipifDMqYnwuLi4uLi58NypiXQorICAgICAgICBWTVVMICAgIHFCMCxxQixxTXVsdGlwbGllcjAKKyAgICAgICAgCisgICAgICAgIDsvLyBCMCA9IFs4KmJ8OSpifDEwKmJ8MTEqYnwuLi4ufDE1KmJdCisgICAgICAgIFZNVUwgICAgcUIxLHFCLHFNdWx0aXBsaWVyMQorICAgICAgICAKKyAgICAgICAgVkFERCAgICBxU3VtMCwgcUIwLCBxQ29uc3QKKyAgICAgICAgVkFERCAgICBxU3VtMSwgcUIxLCBxQ29uc3QgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvb3BzIGZvciAxNiB0aW1lcworTG9vcFBsYW5lICAgICAgIAorICAgICAgICA7Ly8gKGIqeCArIGMqeSArIEMpPj41CisgICAgICAgIFZRUlNIUlVOIGRPdXQwLCBxU3VtMCwjNQorICAgICAgICBWUVJTSFJVTiBkT3V0MSwgcVN1bTEsIzUgICAgICAKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEKKyAgICAgICAgVlNUMSAgICAgcU91dCxbcERzdF0sZHN0U3RlcAorICAgICAgICBWQUREICAgICBxU3VtMCxxU3VtMCxxQyAKKyAgICAgICAgVkFERCAgICAgcVN1bTEscVN1bTEscUMgCisgICAgICAgIEJORSAgICAgIExvb3BQbGFuZQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgICAgIAorICAgICAgICBFTkQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOWViOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCkBAIC0wLDAgKzEsNTMxIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0CisgICAgRENEICBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAorICAgIERDRCAgT01YX1ZDXzR4NF9ESUFHX0RSLCAgT01YX1ZDXzR4NF9WUgorICAgIERDRCAgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAorICAgIERDRCAgT01YX1ZDXzR4NF9IVSAgIAorICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZXR1cm4gICAgICAgICAgUk4gMAorcFRhYmxlICAgICAgICAgIFJOIDgKK3BjICAgICAgICAgICAgICBSTiAxNQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3BEc3QxICAgICAgICAgICBSTiAxIAorcERzdDIgICAgICAgICAgIFJOIDQgCitwRHN0MyAgICAgICAgICAgUk4gNiAKKworcFNyY1RtcCAgICAgICAgIFJOIDkKK3NyY1N0ZXAgICAgICAgICBSTiAxMAorcERzdFRtcCAgICAgICAgIFJOIDExCitkc3RlcCAgICAgICAgICAgUk4gMTIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIE5lb24gcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsvLyBPTVhfVkNfQ0hST01BX1ZFUlQKK2RBYm92ZVUzMiAgICAgICBETiAgRDAuVTMyCisKKzsvLyBPTVhfVkNfQ0hST01BX0hPUgorZExlZnRWYWwwICAgICAgIEROICBEMC44CitkTGVmdFZhbDEgICAgICAgRE4gIEQxLjgKK2RMZWZ0VmFsMiAgICAgICBETiAgRDIuOAorZExlZnRWYWwzICAgICAgIEROICBEMy44CitkTGVmdFZhbDBVMzIgICAgRE4gIEQwLlUzMgorZExlZnRWYWwxVTMyICAgIEROICBEMS5VMzIKK2RMZWZ0VmFsMlUzMiAgICBETiAgRDIuVTMyCitkTGVmdFZhbDNVMzIgICAgRE4gIEQzLlUzMgorCis7Ly8gT01YX1ZDXzR4NF9EQworZExlZnRWYWwgICAgICAgIEROICBEMC5VOAorZExlZnRWYWxVMzIgICAgIEROICBEMC5VMzIKK2RTdW1BYm92ZUxlZnRVMTYgIEROICBEMS5VMTYKK2RTdW1BYm92ZUxlZnRVMzIgIEROICBEMS5VMzIKK2RTdW1BYm92ZUxlZnRVNjQgIEROICBEMS5VNjQKK2RTdW1BYm92ZUxlZnRVOCBETiAgRDEuVTgKK2RTdW0gICAgICAgICAgICBETiAgRDAuVTgKKworZFN1bUxlZnRWYWxVMTYgIEROICBEMS5VMTYKK2RTdW1MZWZ0VmFsVTMyICBETiAgRDEuVTMyCitkU3VtTGVmdFZhbFU2NCAgRE4gIEQxLlU2NAorZFN1bUxlZnRWYWxVOCAgIEROICBEMS5VOAorCitkQWJvdmVWYWwgICAgICAgRE4gIEQwLlU4CitkU3VtQWJvdmVWYWxVMTYgIEROICBEMS5VMTYKK2RTdW1BYm92ZVZhbFUzMiAgRE4gIEQxLlUzMgorZFN1bUFib3ZlVmFsVTY0ICBETiAgRDEuVTY0CitkU3VtQWJvdmVWYWxVOCAgIEROICBEMS5VOAorZENvbnN0MTI4VTggICAgIEROICBEMC5VOAorCisKKzsvL09NWF9WQ180eDRfRElBR19ETAorCitkQWJvdmUgICAgICAgICAgRE4gIEQwLlU4CitkVTcgICAgICAgICAgICAgRE4gIEQyLlU4CitkVTMgICAgICAgICAgICAgRE4gIEQyLlU4CitkQWJvdmUwICAgICAgICAgRE4gIEQzLlU4CitkQWJvdmUxICAgICAgICAgRE4gIEQ0LlU4CitkQWJvdmUyICAgICAgICAgRE4gIEQ1LlU4CitkVG1wICAgICAgICAgICAgRE4gIEQ2LlU4CitkVG1wMCAgICAgICAgICAgRE4gIEQ3LlU4CitkVG1wMSAgICAgICAgICAgRE4gIEQ4LlU4CitkVG1wMiAgICAgICAgICAgIEROICBEOS5VOAorZFRtcDMgICAgICAgICAgICBETiAgRDEwLlU4CitkVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgorCisKKzsvL09NWF9WQ180eDRfRElBR19EUgorZExlZnQgICAgICAgICAgIEROICBEMS5VOAorZFVMICAgICAgICAgICAgIEROICBEMi5VOAorCis7Ly9PTVhfVkNfNHg0X1ZSCitkTGVmdDAgICAgICAgICAgRE4gIEQxLlU4CitkTGVmdDEgICAgICAgICAgRE4gIEQyLlU4CitkRXZlbjAgICAgICAgICAgRE4gIEQzLlU4CitkRXZlbjEgICAgICAgICAgRE4gIEQ0LlU4CitkRXZlbjIgICAgICAgICAgRE4gIEQ1LlU4CitkT2RkMCAgICAgICAgICAgRE4gIEQ2LlU4CitkT2RkMSAgICAgICAgICAgRE4gIEQxMS5VOAorZE9kZDIgICAgICAgICAgIEROICBEMTIuVTgKK2RUbXAzVTMyICAgICAgICBETiAgRDEwLlUzMiAgICAKK2RUbXAyVTMyICAgICAgICBETiAgRDkuVTMyCisKKworOy8vT01YX1ZDXzR4NF9IRAorZFRtcDFVNjQgICAgICAgIEROICBEOC5VNjQKK2RUbXAwVTY0ICAgICAgICBETiAgRDcuVTY0CitkVG1wVTY0ICAgICAgICAgRE4gIEQ2LlU2NAorZFRtcFUzMiAgICAgICAgIEROICBENi5VMzIKK2RUbXAxVTMyICAgICAgICBETiAgRDguVTMyCisKKzsvL09NWF9WQ180eDRfSFUKK2RMMyAgICAgICAgICAgICBETiAgRDIuVTgKK2RMZWZ0SFUwICAgICAgICBETiAgRDMuVTgKK2RMZWZ0SFUxICAgICAgICBETiAgRDQuVTgKK2RMZWZ0SFUyICAgICAgICBETiAgRDUuVTgKK2RUbXAwVTMyICAgICAgICBETiAgRDcuVTMyCisKKworCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIHIxMixkMTIKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NCAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUkQgICBwcmVkTW9kZSxhdmFpbGFiaWxpdHksUHJlZE1vZGUgICAgIDsvLyBBcmcgcHJlZE1vZGUgJiBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUkQgICBsZWZ0U3RlcCxkc3RTdGVwLExlZnRTdGVwICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgJiBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworCitPTVhfVkNfNHg0X0hPUgorICAgICAgICAKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMFtdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDFbXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwyW119LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsM1tdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZExlZnRWYWwwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDFVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMlUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZExlZnRWYWwzVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfVkVSVAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZQorICAgICAgICBWTEQxICAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0KKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0sZHN0ZXAKKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXSxkc3RlcAorICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RdCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdFRtcF0KKworICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKworT01YX1ZDXzR4NF9EQworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0Tm90QXZhaWxhYmxlCisKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIGFsc28KKyAgICAgICAgVkxEMSAgICAgZExlZnRWYWxVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszIHwgMCsxXSB8IHBTcmNMZWZ0WzIrMyB8IDArMV1dICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTMyLCBkU3VtQWJvdmVMZWZ0VTE2ICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszKzArMV0gfCBwU3JjTGVmdFsyKzMrMCsxXV0gCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVNjQsIGRTdW1BYm92ZUxlZnRVMzIgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSArIHBTcmNMZWZ0WzIrMyswKzFdXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZUxlZnRVNjQsZFN1bUFib3ZlTGVmdFU2NCwjMyAgICAgICA7Ly8gU3VtID0gKFN1bSArIDQpID4+IDMKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVMZWZ0VThbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgCisgICAgICAgIAorRENQcmVkaWN0NHg0TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gWyBYWCB8IHBTcmNMZWZ0WzIrMyB8IDArMV1dICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIFsgWFhYWCB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtTGVmdFZhbFU4WzBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDRMZWZ0Tm90QXZhaWxhYmxlCisgICAgICAgICAgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgorICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NE5vbmVBdmFpbGFibGUKKworICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIAorICAgICAgICBWTEQxICAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0Fib3ZlWzIrMyB8IDArMV1dICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIFsgWFhYWCB8IHBTcmNBYm92ZVsyKzMrMCsxXV0gCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUFib3ZlVmFsVThbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAorICAgICAgICAKK0RDUHJlZGljdDR4NE5vbmVBdmFpbGFibGUgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZENvbnN0MTI4VTgsIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAweDgwODA4MDgwODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCitPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCisgICAgICAgIEJFUSAgICAgRGlhZ0RMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQorICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKKyAgICAgICAgVkRVUCAgICBkVTcsIGRBYm92ZTBbN10gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVN3xVN3xVN3xVN3xVN3xVN10KKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUwLCBkVTcsICMxICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVNnxVNXxVNHxVM3xVMnxVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUwLCBkVTcsICMyICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVN3xVNnxVNXxVNHxVM3xVMl0gCisgICAgICAgIEIgICAgICAgRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAgICAgICAgCisgICAgICAgCitEaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCisgICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTNdCisKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLCBkQWJvdmUsIGRVMywgIzQgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMiBVMSBVMF0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUsIGRVMywgIzUgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVMl0KKyAgICAgICAKK0RpYWdETFByZWRpY3Q0eDRTdG9yZSAgCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAsIGRBYm92ZTAsIGRBYm92ZTIKKyAgICAgICAgVlJIQUREICBkVG1wLCBkVG1wLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCisgICAgICAgIAorCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorCitPTVhfVkNfNHg0X0RJQUdfRFIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMworICAgICAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtYfFh8WHxYfFUzfFUyfFUxfFUwXQorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVTCxMMCxMMSxMMixMMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQgPSBbVUx8TDB8TDF8TDJ8TDN8WHxYfFhdICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBwRHN0MSxwRHN0LGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMCxkTGVmdCxkQWJvdmUsIzMgICAgICAgICAgICAgICAgIDsvLyBbVTJ8VTF8VTB8VUx8TDB8TDF8TDJ8TDNdICAgCisgICAgICAgIEFERCAgICAgcERzdDIscERzdDEsZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRBYm92ZTEsZExlZnQsZEFib3ZlLCM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfFVMfEwwfEwxfEwyXSAgIAorICAgICAgICBBREQgICAgIHBEc3QzLHBEc3QyLGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRMZWZ0LGRBYm92ZSwjNSAgICAgICAgICAgICAgICAgOy8vIFsgWHxVM3xVMnxVMXxVMHxVTHxMMHxMMV0gICAKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QzXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFswXSxbMV0sWzJdLFszXSBAIHBEc3QzCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0Ml0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMV0sWzJdLFszXSxbNF0gQCBwRHN0MgorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDFdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJdLFszXSxbNF0sWzVdIEAgcERzdDEKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFszXSxbNF0sWzVdLFs2XSBAIHBEc3QKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisKK09NWF9WQ180eDRfVlIKKworICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVUwsVTAsVTEsVTIsVTMKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0KKyAgICAgICAgVkxEMSAgICBkQWJvdmVbN10sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAgOy8vIFtVTHxYfFh8WHxVM3xVMnxVMXxVMF0KKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEwwLEwxLEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdDAgPSBbTDB8TDJ8WHxYfFh8WHxYfFhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdDEgPSBbTDF8IFh8WHxYfFh8WHxYfFhdICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdDBbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnQxWzddfSxbcFNyY0xlZnRdLGxlZnRTdGVwICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0MFs2XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZE9kZDIsZEFib3ZlLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIFVMIF0KKyAgICAgICAgVkVYVCAgICBkRXZlbjAsZExlZnQwLGRPZGQyLCM2ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTEgVTAgVUwgTDAgTDIgXQorICAgICAgICBWRVhUICAgIGRFdmVuMSxkTGVmdDEsZE9kZDIsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMiBVMSBVMCBVTCBMMSBdCisgICAgICAgIFZFWFQgICAgZEV2ZW4yLGRMZWZ0MCxkQWJvdmUsIzcgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIEwwIF0KKyAgICAgICAgVkVYVCAgICBkT2RkMCxkTGVmdDEsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDEgXQorICAgICAgICBWRVhUICAgIGRPZGQxLGRMZWZ0MCxkT2RkMiwjNyAgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMiBVMSBVMCBVTCBMMCBdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAxLCBkT2RkMCwgZE9kZDIKKyAgICAgICAgVlJIQUREICBkVG1wMSwgZFRtcDEsIGRPZGQxICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOSA3IDUgMyAxIF0KKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDAsIGRFdmVuMCwgZEV2ZW4yCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkRXZlbjEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IDggNiA0IDIgMCBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkVG1wMyxkVG1wMSxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA5IDcgNSAzIF0gCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcDIsZFRtcDAsZFRtcDAsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IHggOCA2IDQgMiBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wM1UzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs5XSxbN10sWzVdLFszXQorICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gVG1wWzhdLFs2XSxbNF0sWzJdCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KKyAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIFRtcFs2XSxbNF0sWzJdLFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X0hECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVTAsVTEsVTIsVTMKKyAgICAgICAgVkxEMSAgICBkQWJvdmUsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vZEFib3ZlTGVmdFZhbCA9IFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0KKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFsgVTJ8VTF8VTB8VUx8TDB8TDF8TDJ8TDMgXSAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzIgICAgICAgICAgICAgICAgIDsvLyBbIFUxfFUwfFVMfEwwfEwxfEwyfEwzfFggXSAgIAorICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCMxICAgICAgICAgICAgICAgICA7Ly8gWyBVMHxVTHxMMHxMMXxMMnxMM3xYfFggXSAgICAgCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAwLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDAgfCAxIHwgMiB8IDQgfCA2IHwgOCB8IFggfCBYIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWUkhBREQgIGRUbXAxLCBkQWJvdmUxLCBkQWJvdmUwICAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MQorICAgICAgICBWU0hMICAgIGRUbXAxVTY0LGRUbXAxVTY0LCMyNCAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAzfDV8IDcgfDkgfCBYIHwgWCB8IFggfCBYIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU0hMICAgIGRUbXBVNjQsZFRtcDBVNjQsIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAyfDR8Nnw4fCBYIHwgWCB8IFggfCBYIF0KKyAgICAgICAgVlpJUCAgICBkVG1wMSxkVG1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAgPSBbIDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IF0KKyAgICAgICAgVkVYVCAgICBkVG1wMCxkVG1wMCxkVG1wMCwjNiAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgIFh8IFh8IFh8IFh8IFh8IFh8IDAgfCAxIF0KKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wLGRUbXAwLCMyICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8NyBdCisgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzFdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFswfDF8MnwzXQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMV0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsyfDN8NHw1XQorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFs0fDV8Nnw3XQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFs2fDd8OHw5XQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X1ZMCisKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCisgICAgICAgIEJFUSAgICAgRGlhZ1ZMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQorICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0gCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSxkQWJvdmUwLGRBYm92ZTAsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfFU3fFU2fFU1fFU0fFUzfFUyfFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsZEFib3ZlMSxkQWJvdmUxLCMxICAgICAgICAgICAgICAgOy8vIFsgWHwgWHxVN3xVNnxVNXxVNHxVM3xVMl0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgRGlhZ1ZMUHJlZGljdDR4NFN0b3JlICAgICAgICAgCisgICAgICAgCitEaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfC18LXwtfC1dIAorICAgICAgICBWRFVQICAgIGRVMywgZEFib3ZlWzddICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KKworICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMiBVMSBVMF0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUsIGRVMywgIzUgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTIgVTFdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlLCBkVTMsICM2ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQorICAgICAgIAorRGlhZ1ZMUHJlZGljdDR4NFN0b3JlICAKKyAgICAgICAgCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IDh8IDZ8IDR8IDJ8IDAgXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMywgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAzLCBkVG1wMywgZEFib3ZlMSAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOXwgN3wgNXwgM3wgMSBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOHwgNnwgNHwgMiBdCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcDIsZFRtcDMsZFRtcDEsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IFh8IDl8IDd8IDV8IDMgXQorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs2XSxbNF0sWzJdLFswXQorICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gVG1wWzddLFs1XSxbM10sWzFdCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KKyAgICAgICAgVlNUMSAgICBkVG1wMlUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIFRtcFs5XSxbN10sWzVdLFszXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X0hVCisgICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMMnxMMXxMMHxYfFh8WHxYXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZEwzLGRMZWZ0WzddICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDNdCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRMZWZ0SFUwLGRMZWZ0LGRMMywjNCAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwyfEwxfEwwXQorICAgICAgICBWRVhUICAgIGRMZWZ0SFUxLGRMZWZ0LGRMMywjNSAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwyfEwxXQorICAgICAgICBWRVhUICAgIGRMZWZ0SFUyLGRMZWZ0LGRMMywjNiAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwyXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMCwgZExlZnRIVTAsIGRMZWZ0SFUyCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkTGVmdEhVMSAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA1IHwgMyB8IDEgXQorICAgICAgICAKKyAgICAgICAgVlJIQUREICBkVG1wMSwgZExlZnRIVTEsIGRMZWZ0SFUwICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgVG1wWyBMMyB8IEwzIHwgTDMgfCBMMyB8IEwzIHwgNCB8IDIgfCAwIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcDEgPSBUbXBbN3wgNnwgNXwgNHwgM3wgMnwgMXwgMF0gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcDAgPSBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzN8MnwxfDBdIAorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAxLGRUbXAxLCMyCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbNXw0fDN8Ml0gCisgICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs3fDZ8NXw0XSAgCisgICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBbOXw4fDd8Nl0gCisgICAgICAgIAorICAgICAgICAKK0V4aXRQcmVkaWN0NHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTM5NDMzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSwxNDAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgIAorCisgICAgCisgICAgCisgICAgSUYgQ29ydGV4QTgKKworOy8vIEFSTSBSZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICBSTiAwCitwRHN0ICAgICAgICBSTiAxCitRUCAgICAgICAgICBSTiAyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgIFJOIDkKK1ZhbHVlICAgICAgIFJOIDQKK1ZhbHVlMiAgICAgIFJOIDUKK0ZsYWcgICAgICAgIFJOIDYKK3N0ck9mZnNldCAgIFJOIDcKK2NzdE9mZnNldCAgIFJOIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjB3MCAgICAgICAgUk4gIDMKK3IwdzEgICAgICAgIFJOICA0CisKK2MwdzAgICAgICAgIFJOICA1CitjMXcwICAgICAgICBSTiAgNgorCityZXR1cm4gICAgICBSTiAgMAorcFFQRGl2VGFibGUgUk4gIDUKK3BRUE1vZFRhYmxlICAgIFJOICA2CitTaGlmdCAgICAgICAgUk4gIDkKK1NjYWxlICAgICAgICBSTiAgMgorCisKKworOy8vIE5lb24gUmVnaXN0ZXJzCisKK2RaZXJvICAgICAgIEROICBEMC5VMTYKK2RJbnZUckNvZWZmIEROICBEMC5TMTYKK2RTY2FsZSAgICAgIEROICBEMS5TMTYKK3FEcW50Q29lZmYgIFFOICBRMS5TMzIKK2REcW50Q29lZmYgIEROICBEMi5TMTYKKworCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQorICAgICAgICAKKyAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBWTU9WICAgIGRaZXJvLCAjMAorICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFplcm8sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAgICAKKyAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KKworCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vSW52VHJhbnNmb3JtREMyeDI6IElubGluZWQgKEltcGxlbWVudGVkIGluIEFSTSBWNikKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIExETUlBICAgIHBEc3QsIHtyMHcwLCByMHcxfSAgICAgICAgICAgICAgICAgIDsvLyByMHcwID0gfGMxfGMwfCAmIHIwdzEgPSB8YzN8YzJ8CisKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBMRFIgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgU0FERFNVQlggcjB3MCwgcjB3MCwgIHIwdzAgICAgICAgICAgICAgICAgICAgOy8vIFsgYzAwK2MwMSwgYzAwLWMwMSBdCisgICAgICAgIFNBRERTVUJYIHIwdzEsIHIwdzEsICByMHcxICAgICAgICAgICAgICAgICAgIDsvLyBbIGMxMCtjMTEsIGMxMC1jMTEgXQorICAgICAgICAKKyAgICAgICAgTERSU0IgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIExEUlNCICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgYzB3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwK2QxMCwgZDAxK2QxMSBdCisgICAgICAgIFNTVUIxNiAgIGMxdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMC1kMTAsIGQwMS1kMTEgXQorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly9EZXF1YW50Q2hyb21hREMyeDI6IElubGluZWQgKE5lb24gSW1wbGVtZW50YXRpb24pCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIFZNT1YgICAgIGRJbnZUckNvZWZmLCBjMHcwLCBjMXcwICAKKyAgICAgICAgVlJFVjMyICAgZEludlRyQ29lZmYsZEludlRyQ29lZmYgIAorICAgICAgICBWRFVQICAgICBkU2NhbGUsU2NhbGUgCisgICAgICAgIAorICAgICAgICBWTVVMTCAgICBxRHFudENvZWZmLGRJbnZUckNvZWZmLGRTY2FsZQorICAgICAgICBWU0hSTiAgICBkRHFudENvZWZmLHFEcW50Q29lZmYsIzEKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkRHFudENvZWZmLFtwRHN0XSAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgIAorICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTI5OTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSwyNjQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCis7Ly8gCis7Ly8gCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERhdGEgICAgICAgICAgICAgICBSTiAgMAorUVAgICAgICAgICAgICAgICAgICBSTiAgMSAgICAKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly8gQVJNIFJlZ2lzdGVycworCitwUVBEaXZUYWJsZSAgICAgICAgIFJOICAyCitwUVBNb2RUYWJsZSAgICAgICAgIFJOICAzCitTaGlmdCAgICAgICAgICAgICAgIFJOICA0CitTY2FsZSAgICAgICAgICAgICAgIFJOICA1CisKKzsvLyBORU9OIFJlZ2lzdGVycworCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2ICAgCisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCitkUm93U3VtMSAgICAgICAgICAgIEROICBENC5TMTYKK2RSb3dTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgorZFJvd0RpZmYxICAgICAgICAgICBETiAgRDYuUzE2CitkUm93RGlmZjIgICAgICAgICAgIEROICBENy5TMTYKKworOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKK2RSb3dPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZFJvd09wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkUm93T3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RSb3dPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcVJvd09wMDEgICAgICAgICAgICBRTiAgUTAuMzIKK3FSb3dPcDIzICAgICAgICAgICAgUU4gIFExLjMyCisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCitkQ29sU3VtMSAgICAgICAgICAgIEROICBENC5TMTYKK2RDb2xTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgorZENvbERpZmYxICAgICAgICAgICBETiAgRDYuUzE2CitkQ29sRGlmZjIgICAgICAgICAgIEROICBENy5TMTYKKworOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCitkQ29sT3AwICAgICAgICAgICAgIEROICBEMC5TMTYKK2RDb2xPcDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZENvbE9wMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkQ29sT3AzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcworCitkU2NhbGUgICAgICAgICAgICAgIEROICBENS5TMTYKK3FSb3VuZDAgICAgICAgICAgICAgUU4gIFEzLlMzMgorcVJvdW5kMSAgICAgICAgICAgICBRTiAgUTQuUzMyCitxUm91bmQyICAgICAgICAgICAgIFFOICBRNS5TMzIKK3FSb3VuZDMgICAgICAgICAgICAgUU4gIFE2LlMzMgorCis7Ly8gSW52VHJhbnNmb3JtZWQgYW5kIERlcXVhbnRpemVkIHBpeGVscworZE91dDAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkT3V0MSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkT3V0MiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkT3V0MyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyNSxkMTMKKyAgICAKKyAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA0IEQtcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIFRyYW5zcG9zZWQgZm9ybQorICAgICAgICAKKyAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BEYXRhXQorICAgICAgICBMRFIgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gU2NhbGUgZmFjdG9yIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgQVJNIGluc3RydWN0aW9ucworICAgICAgICA7Ly8gSW50ZXJsZWF2ZWQgd2l0aCBORU9OIGluc3RydWN0aW9ucyBpbm9yZGVyIHRvIER1YWwgaXNzdWUKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgZFJvd1N1bTEsZEluMCxkSW4xCisgICAgICAgIFZBREQgICAgZFJvd1N1bTIsZEluMixkSW4zCisgICAgICAgIFZTVUIgICAgZFJvd0RpZmYxLGRJbjAsZEluMQorICAgICAgICBMRFJTQiAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KKyAgICAgICAgVlNVQiAgICBkUm93RGlmZjIsZEluMixkSW4zCisgICAgICAgIExEUlNCICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKKyAgICAgICAgVkFERCAgICBkUm93T3AwLGRSb3dTdW0xLGRSb3dTdW0yCisgICAgICAgIFZTVUIgICAgZFJvd09wMSxkUm93U3VtMSxkUm93U3VtMgorICAgICAgICBWU1VCICAgIGRSb3dPcDIsZFJvd0RpZmYxLGRSb3dEaWZmMgorICAgICAgICBMU0wgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAorICAgICAgICBWQUREICAgIGRSb3dPcDMsZFJvd0RpZmYxLGRSb3dEaWZmMgorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkUm93T3AwLGRSb3dPcDEKKyAgICAgICAgVlRSTiAgICBkUm93T3AyLGRSb3dPcDMKKyAgICAgICAgVlRSTiAgICBxUm93T3AwMSxxUm93T3AyMyAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgZENvbFN1bTEsZFJvd09wMCxkUm93T3AxCisgICAgICAgIFZBREQgICAgZENvbFN1bTIsZFJvd09wMixkUm93T3AzCisgICAgICAgIFZTVUIgICAgZENvbERpZmYxLGRSb3dPcDAsZFJvd09wMQorICAgICAgICBWU1VCICAgIGRDb2xEaWZmMixkUm93T3AyLGRSb3dPcDMKKyAgICAgICAgVkFERCAgICBkQ29sT3AwLGRDb2xTdW0xLGRDb2xTdW0yCisgICAgICAgIFZTVUIgICAgZENvbE9wMSxkQ29sU3VtMSxkQ29sU3VtMgorICAgICAgICBWU1VCICAgIGRDb2xPcDIsZENvbERpZmYxLGRDb2xEaWZmMgorICAgICAgICBWQUREICAgIGRDb2xPcDMsZENvbERpZmYxLGRDb2xEaWZmMgorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQorICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCisgICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQorICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCisgICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAorICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWRFVQICAgIGRTY2FsZSwgU2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSAtPiBORU9OICBjb3B5ICdzY2FsZScgdG8gdmVjdG9yCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1PViAgICBxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdGhlIFJvdW5kIFZhbHVlIAorICAgICAgICBWTU9WICAgIHFSb3VuZDEsIzIKKyAgICAgICAgVk1PViAgICBxUm91bmQyLCMyCisgICAgICAgIFZNT1YgICAgcVJvdW5kMywjMgorICAgICAgICAKKyAgICAgICAgVk1MQUwgICBxUm91bmQwLGRDb2xPcDAsZFNjYWxlICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0W2ldICogU2NhbGUgKyBSb3VuZCAKKyAgICAgICAgVk1MQUwgICBxUm91bmQxLGRDb2xPcDEsZFNjYWxlCisgICAgICAgIFZNTEFMICAgcVJvdW5kMixkQ29sT3AyLGRTY2FsZQorICAgICAgICBWTUxBTCAgIHFSb3VuZDMsZENvbE9wMyxkU2NhbGUKKyAgICAgICAgCisgICAgICAgIFZTSFJOICAgZE91dDAscVJvdW5kMCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJpZ2h0IHNoaWZ0IGJ5IDIgJiAoT01YX1MxNilWYWx1ZQorICAgICAgICBWU0hSTiAgIGRPdXQxLHFSb3VuZDEsIzIKKyAgICAgICAgVlNIUk4gICBkT3V0MixxUm91bmQyLCMyCisgICAgICAgIFZTSFJOICAgZE91dDMscVJvdW5kMywjMgorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtkT3V0MCxkT3V0MSxkT3V0MixkT3V0M30sIFtwRGF0YV0KKworICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5EICAgICAgICAKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NPUlRFWEE4ICAgCisgICAgICAgIAorCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgICAgICAgICBSTiAgMAorcERzdCAgICAgICAgICAgICAgICBSTiAgMQorUVBSMiAgICAgICAgICAgICAgICBSTiAgMgorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICAgICAgICAgIFJOICAwCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwRHN0UjQgICAgICAgICAgICAgIFJOICA0CitwRHN0UjAgICAgICAgICAgICAgIFJOICAwCitRUFIxICAgICAgICAgICAgICAgIFJOICAxCitRUFI1ICAgICAgICAgICAgICAgIFJOICA1CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLHI1CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSNCxwRHN0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjEKKyAgICAgICAgTU9WICAgICBRUFI1LFFQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIyCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBwRHN0UjAscERzdFI0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMAorICAgICAgICBNT1YgICAgIFFQUjEsUVBSNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIxCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAKKyAgICAKKworICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMmRmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBNVk4gICAgICByMTIscjEyCisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCithcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAorICAgIExEUiAgICAgIHI0LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIExTUiAgICAgIHIxMCxyMTAsIzE2CisgICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzE2CisgICAgTFNSICAgICAgcjExLHIxMSwjMTYKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjMTYKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjMTYKKyAgICBMU1IgICAgICByMTEscjExLCMxNgorICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICMxNgorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKK2FybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAorICAgIExTUiAgICAgIHIxMSxyMTEsIzI0CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAorICAgIExTUiAgICAgIHIxMSxyMTEsIzI0CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllZTIyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmU6CisgICAgVkxEMS4zMiAge2QxOFswXX0sW3I1XSEKKyAgICBWU1VCTC5VOCBxMTEsZDUsZDkKKyAgICBWTU9WICAgICBkMjgsZDE4CisgICAgVlNVQkwuVTggcTEwLGQ4LGQ0CisgICAgVlNIUi5TMTYgcTExLHExMSwjMgorICAgIFZaSVAuOCAgIGQxOCxkMjgKKyAgICBWQklGICAgICBkMTgsZDE0LGQxNgorICAgIFZSSEFERC5TMTYgcTEwLHExMSxxMTAKKyAgICBWQURELkk4ICBkMzEsZDE4LGQxNQorICAgIFZRTU9WTi5TMTYgZDIwLHExMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgVk1JTi5TOCAgZDIwLGQyMCxkMzEKKyAgICBWTkVHLlM4ICBkMzEsZDMxCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBWTUFYLlM4ICBkMjAsZDIwLGQzMQorICAgIFZNT1ZMLlU4IHExNCxkNAorICAgIFZNT1ZMLlU4IHExMixkOAorICAgIFZBRERXLlM4IHExNCxxMTQsZDIwCisgICAgVlNVQlcuUzggcTEyLHExMixkMjAKKyAgICBWUU1PVlVOLlMxNiBkMjkscTE0CisgICAgVlFNT1ZVTi5TMTYgZDI0LHExMgorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKK2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZToKKyAgICBWSEFERC5VOCBkMTMsZDQsZDkKKyAgICBWSEFERC5VOCBkMzEsZDgsZDUKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBWUkhBREQuVTggZDEzLGQxMyxkNQorICAgIFZSSEFERC5VOCBkMzEsZDMxLGQ5CisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmM2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZToKKyAgICBWU1VCTC5VOCBxMTEsZDUsZDkKKyAgICBWTEQxLjggICB7ZDE4W119LFtyNV0hCisgICAgVlNVQkwuVTggcTEwLGQ4LGQ0CisgICAgVkxEMS44ICAge2QxOVtdfSxbcjVdIQorICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKKyAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAorICAgIFZBTkQgICAgIGQxOSxkMTcsZDE1CisgICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKKyAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCisgICAgVlJIQURELlU4IGQyNCxkNCxkOAorICAgIFZBREQuSTggIGQzMSxkMTgsZDE5CisgICAgVkFORCAgICAgZDE5LGQxMixkMTUKKyAgICBWUUFERC5VOCBkMjMsZDUsZDE4CisgICAgVlFNT1ZOLlMxNiBkMjAscTEwCisgICAgVkFERC5JOCAgZDMxLGQzMSxkMTkKKyAgICBWUVNVQi5VOCBkMjIsZDUsZDE4CisgICAgVlFBREQuVTggZDE5LGQ5LGQxOAorICAgIFZIQURELlU4IGQyNixkMjQsZDYKKyAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQorICAgIFZORUcuUzggIGQzMSxkMzEKKyAgICBWUVNVQi5VOCBkMjEsZDksZDE4CisgICAgVkhBREQuVTggZDI3LGQyNCxkMTAKKyAgICBWTUFYLlU4ICBkMzAsZDI2LGQyMgorICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCisgICAgVk1PVkwuVTggcTE0LGQ0CisgICAgVk1PVkwuVTggcTEyLGQ4CisgICAgVkFERFcuUzggcTE0LHExNCxkMjAKKyAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAorICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKKyAgICBWUU1PVlVOLlMxNiBkMjQscTEyCisgICAgVk1BWC5VOCAgZDI1LGQyNyxkMjEKKyAgICBWTUlOLlU4ICBkMzAsZDMwLGQyMworICAgIFZNSU4uVTggIGQyNSxkMjUsZDE5CisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgVkJJRiAgICAgZDI1LGQ5LGQxMgorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZToKKyAgICBWU0hSLlU4ICBkMTksZDAsIzIKKyAgICBWQURELkk4ICBkMTksZDE5LGQxNQorICAgIFZBRERMLlU4IHExMCxkOCxkNAorICAgIFZBREQuSTggIGQxOSxkMTksZDE1CisgICAgVkFEREwuVTggcTExLGQ2LGQ5CisgICAgVkFERFcuVTggcTEyLHExMCxkNQorICAgIFZDR1QuVTggIGQxOSxkMTksZDEzCisgICAgVlNIUi5VMTYgcTExLHExMSwjMQorICAgIFZIQURELlUxNiBxMTEscTEyLHExMQorICAgIFZBRERXLlU4IHExMixxMTIsZDYKKyAgICBWQURETC5VOCBxMTMsZDcsZDYKKyAgICBWQU5EICAgICBkMTcsZDE3LGQxOQorICAgIFZIQURELlU4IGQyOCxkNCxkOQorICAgIFZTUkEuVTE2IHExMyxxMTIsIzEKKyAgICBWQU5EICAgICBkMTIsZDEyLGQxOQorICAgIFZRUlNIUk4uVTE2IGQyOSxxMTEsIzEKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNQorICAgIFZRUlNIUk4uVTE2IGQzMCxxMTIsIzIKKyAgICBWQURETC5VOCBxMTEsZDEwLGQ1CisgICAgVkFERFcuVTggcTEyLHExMCxkOQorICAgIFZCSUYgICAgIGQyOSxkMjgsZDE3CisgICAgVlFSU0hSTi5VMTYgZDMxLHExMywjMgorICAgIFZBRERMLlU4IHExMyxkMTEsZDEwCisgICAgVlNIUi5VMTYgcTExLHExMSwjMQorICAgIFZIQURELlUxNiBxMTEscTEyLHExMQorICAgIFZBRERXLlU4IHExMixxMTIsZDEwCisgICAgVkhBREQuVTggZDI4LGQ4LGQ1CisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKKyAgICBWU1JBLlUxNiBxMTMscTEyLCMxCisgICAgVlFSU0hSTi5VMTYgZDI1LHExMiwjMgorICAgIFZRUlNIUk4uVTE2IGQyNCxxMTEsIzEKKyAgICBWUkhBREQuVTggZDIyLGQyOCxkOQorICAgIFZCSUYgICAgIGQyNSxkOSxkMTIKKyAgICBWQklGICAgICBkMzEsZDYsZDE3CisgICAgVkJJRiAgICAgZDI0LGQyMixkMTIKKyAgICBWUVJTSFJOLlUxNiBkMjgscTEzLCMyCisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIFZCSUYgICAgIGQyOCxkMTAsZDEyCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4YmQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCithcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcjoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFNVQiAgICAgIHNwLHNwLCMweDQwCisgICAgTERSICAgICAgcjEwLFtyMCwjMF0KKyAgICBMRFIgICAgICByMTIsW3IxLCMwXQorICAgIExEUiAgICAgIHI2LCA9YXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjhdCisgICAgTERSQiAgICAgcjksW3IxMCwjMl0KKyAgICBMRFJCICAgICByOCxbcjEwLCMxXQorICAgIExEUkIgICAgIHIxMSxbcjEwXSwjMworICAgIEFERCAgICAgIHIxMixyMTIsIzgKKyAgICBMRFIgICAgICByNixbcjYscjQsTFNMICMyXQorICAgIE9SUiAgICAgIHI5LHI5LHI4LExTTCAjOAorICAgIE9SUiAgICAgIHIxMSxyOSxyMTEsTFNMICMxNgorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBNT1ZTICAgICByNywjMHgxZQorICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjcKKyAgICBTVUJTICAgICByMTIscjEyLCM4CitMMHg0NDoKKyAgICBCQ0MgICAgICBMMQorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMMToKKyAgICBMRFJIICAgICByNyxbcjYscjddCisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIEFERCAgICAgIHIxMixyMTIsIzQKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgQkNTICAgICAgTDB4NzQKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjMHhhCisgICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQorICAgIEJJQyAgICAgIHI3LHI3LCMxCisgICAgQiAgICAgICAgTDB4NDQKK0wweDc0OgorICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMworICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKKyAgICBMU1JTICAgICByNSxyNywjMgorICAgIFNUUkIgICAgIHI1LFtyMiwjMF0KKyAgICBCRVEgICAgICBMMHgzNDQKKyAgICBDTVAgICAgICByNywjMHg0NAorICAgIEJHRSAgICAgIEwweDMzYworICAgIFNUUiAgICAgIHIwLFtzcCwjMF0KKyAgICBTVFIgICAgICByMSxbc3AsIzRdCisgICAgU1RSICAgICAgcjMsW3NwLCM4XQorICAgIEFORFMgICAgIHIxLHI3LCMzCisgICAgQUREICAgICAgcjIsc3AsIzB4YworICAgIEJFUSAgICAgIEwweGQ4CisgICAgTU9WICAgICAgcjAscjEKK0wweGFjOgorICAgIExTTFMgICAgIHI3LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCM3CisgICAgQkNDICAgICAgTDIKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDI6CisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIExTUiAgICAgIHI3LHI3LCMzMQorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBNT1YgICAgICByOCwjMQorICAgIFNVQiAgICAgIHI4LHI4LHI3LExTTCAjMQorICAgIFNUUkggICAgIHI4LFtyMl0sIzIKKyAgICBCR1QgICAgICBMMHhhYworTDB4ZDg6CisgICAgU1VCUyAgICAgcjAscjUscjEKKyAgICBCRVEgICAgICBMMHgxYjgKKyAgICBNT1YgICAgICByNCwjMQorICAgIENNUCAgICAgIHI1LCMweGEKKyAgICBNT1ZMRSAgICByNCwjMAorICAgIENNUCAgICAgIHIxLCMzCisgICAgTU9WTFQgICAgcjEsIzQKKyAgICBNT1ZHRSAgICByMSwjMgorICAgIE1PVkdFICAgIHI0LCMwCitMMHhmYzoKKyAgICBMU0xTICAgICByNyxyMTEscjEyCisgICAgQ0xaICAgICAgcjcscjcKKyAgICBBREQgICAgICByMTIscjEyLHI3CisgICAgU1VCUyAgICAgcjEyLHIxMiwjNworICAgIEJDQyAgICAgIEwzCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKKyAgICBPUlIgICAgICByMTEscjgscjExLExTTCAjOAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBCQ0MgICAgICBMMworICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMMzoKKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBDTVAgICAgICByNywjMHgxMAorICAgIEJHRSAgICAgIEwweDMzYworICAgIE1PVlMgICAgIGxyLHI0CisgICAgVEVRRVEgICAgcjcsIzB4ZQorICAgIE1PVkVRICAgIGxyLCM0CisgICAgVEVRICAgICAgcjcsIzB4ZgorICAgIE1PVkVRICAgIGxyLCMweGMKKyAgICBURVFFUSAgICByNCwjMAorICAgIEFEREVRICAgIHI3LHI3LCMweGYKKyAgICBURVEgICAgICBsciwjMAorICAgIEJFUSAgICAgIEwweDE4NAorICAgIExTTCAgICAgIHIzLHIxMSxyMTIKKyAgICBBREQgICAgICByMTIscjEyLGxyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorICAgIFJTQiAgICAgIHI5LGxyLCMweDIwCisgICAgQkNDICAgICAgTDQKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorICAgIE9SUiAgICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorICAgIEJDQyAgICAgIEw0CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0w0OgorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBMU1IgICAgICByMyxyMyxyOQorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNMICAgICAgcjcscjcscjQKKyAgICBBREQgICAgICByNyxyMyxyNworTDB4MTg0OgorICAgIEFERCAgICAgIHI3LHI3LHIxCisgICAgTU9WICAgICAgcjEsIzIKKyAgICBMU1JTICAgICByOCxyNywjMQorICAgIFJTQkNTICAgIHI4LHI4LCMwCisgICAgU1RSSCAgICAgcjgsW3IyXSwjMgorICAgIExEUiAgICAgIHI5LCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgTERSU0IgICAgcjgsW3I5LHI0XQorICAgIFRFUSAgICAgIHI0LCMwCisgICAgTU9WRVEgICAgcjQsIzEKKyAgICBDTVAgICAgICByNyxyOAorICAgIEFERENTICAgIHI0LHI0LCMxCisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBCR1QgICAgICBMMHhmYworTDB4MWI4OgorICAgIExEUiAgICAgIHI4LFtzcCwjMHg2Y10KKyAgICBTVUIgICAgICByMCxyNSwjMQorICAgIFNVQlMgICAgIHIxLHI4LHI1CisgICAgQUREICAgICAgcjQsc3AsIzB4MmMKKyAgICBNT1YgICAgICBscixyNQorICAgIFNVQiAgICAgIGxyLGxyLCMxCisgICAgQkVRICAgICAgTDB4MmIwCisgICAgVEVRICAgICAgcjgsIzQKKyAgICBMRFJFUSAgICByNiwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcyAtIDQpCisgICAgTERSTkUgICAgcjYsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcyAtIDQpCisgICAgTERSICAgICAgcjYsW3I2LHI1LExTTCAjMl0KKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgTU9WUyAgICAgcjcsIzB4MWUKKyAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI3CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorTDB4MWY0OgorICAgIEJDQyAgICAgIEw1CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0w1OgorICAgIExEUkggICAgIHI3LFtyNixyN10KKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgQUREICAgICAgcjEyLHIxMiwjNAorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBCQ1MgICAgICBMMHgyMjQKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjMHhhCisgICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQorICAgIEJJQyAgICAgIHI3LHI3LCMxCisgICAgQiAgICAgICAgTDB4MWY0CitMMHgyMjQ6CisgICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCisgICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAorICAgIENNUCAgICAgIHI3LCMweDEwCisgICAgQkdFICAgICAgTDB4MzNjCisgICAgTERSICAgICAgcjMsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcyAtIDQpCisgICAgQUREICAgICAgcjQsc3AsIzB4MmMKKyAgICBNT1ZTICAgICByMSxyNworICAgIEFERCAgICAgIGxyLGxyLHIxCisgICAgQkVRICAgICAgTDB4MmIwCitMMHgyNDg6CisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBMRFIgICAgICByNixbcjMscjEsTFNMICMyXQorICAgIEJMVCAgICAgIEwweDJiYworICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBNT1ZTICAgICByNywjMHhlCisgICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyOAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKK0wweDI2NDoKKyAgICBCQ0MgICAgICBMNgorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMNjoKKyAgICBMRFJIICAgICByNyxbcjYscjddCisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIEFERCAgICAgIHIxMixyMTIsIzMKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgQkNTICAgICAgTDB4Mjk0CisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIFNVQlMgICAgIHIxMixyMTIsIzkKKyAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5CisgICAgQklDICAgICAgcjcscjcsIzEKKyAgICBCICAgICAgICBMMHgyNjQKK0wweDI5NDoKKyAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKKyAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCisgICAgQ01QICAgICAgcjcsIzB4ZgorICAgIEJHRSAgICAgIEwweDMzYworICAgIFNVQlMgICAgIHIxLHIxLHI3CisgICAgU1RSQiAgICAgcjcsW3I0XSwjMQorICAgIEJHVCAgICAgIEwweDI0OAorTDB4MmIwOgorICAgIFNVQlMgICAgIHIwLHIwLCMxCisgICAgQkxUICAgICAgTDcKKyAgICBTVFJCICAgICByMSxbcjRdLCMxCitMNzoKKyAgICBCR1QgICAgICBMMHgyYjAKK0wweDJiYzoKKyAgICBTVFJCICAgICByMSxbcjRdLCMxCisgICAgTERSICAgICAgcjgsW3NwLCMweDZjXQorICAgIFRFUSAgICAgIHI4LCMweGYKKyAgICBBRERFUSAgICBscixsciwjMQorICAgIFNVQiAgICAgIHI0LHI0LHI1CisgICAgU1VCICAgICAgcjIscjIscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIExEUiAgICAgIHIzLFtzcCwjOF0KKyAgICBMRFIgICAgICByMCxbcjMsIzBdCisgICAgVEVRICAgICAgcjgsIzQKKyAgICBMRFJFUSAgICByNiwgPWFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgIExEUk5FICAgIHI2LCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CitMMHgyZWM6CisgICAgTERSQiAgICAgcjksW3I0XSwjMQorICAgIExEUkIgICAgIHI4LFtyNixscl0KKyAgICBTVUIgICAgICBscixsciwjMQorICAgIFNVQiAgICAgIGxyLGxyLHI5CisgICAgTERSU0ggICAgcjksW3IyXSwjMgorICAgIFNVQlMgICAgIHI1LHI1LCMxCisgICAgT1JSRVEgICAgcjgscjgsIzB4MjAKKyAgICBBREQgICAgICByMSxyOSwjMHg4MAorICAgIENNUCAgICAgIHIxLCMweDEwMAorICAgIE9SUkNTICAgIHI4LHI4LCMweDEwCisgICAgVEVRICAgICAgcjUsIzAKKyAgICBTVFJCICAgICByOCxbcjBdLCMxCisgICAgU1RSQiAgICAgcjksW3IwXSwjMQorICAgIExTUiAgICAgIHI5LHI5LCM4CisgICAgQkNDICAgICAgTDgKKyAgICBTVFJCICAgICByOSxbcjBdLCMxCitMODoKKyAgICBCTkUgICAgICBMMHgyZWMKKyAgICBTVFIgICAgICByMCxbcjMsIzBdCisgICAgTERSICAgICAgcjAsW3NwLCMwXQorICAgIExEUiAgICAgIHIxLFtzcCwjNF0KKyAgICBCICAgICAgICBMMHgzNDQKK0wweDMzYzoKKyAgICBNVk4gICAgICByMCwjMQorICAgIEIgICAgICAgIEwweDM1YworTDB4MzQ0OgorICAgIEFERCAgICAgIHIxMCxyMTAscjEyLExTUiAjMworICAgIEFORCAgICAgIHIxMixyMTIsIzcKKyAgICBTVUIgICAgICByMTAscjEwLCM0CisgICAgU1RSICAgICAgcjEyLFtyMSwjMF0KKyAgICBTVFIgICAgICByMTAsW3IwLCMwXQorICAgIE1PViAgICAgIHIwLCMwCitMMHgzNWM6CisgICAgQUREICAgICAgc3Asc3AsIzB4NDAKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWI0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorCithcm1WQ000UDEwX1Bvc1RvVkNvbDR4NDoKKyAgICAuYnl0ZSAgMCwgMiwgMCwgMgorICAgIC5ieXRlICAyLCAxLCAyLCAxCisgICAgLmJ5dGUgIDAsIDIsIDAsIDIKKyAgICAuYnl0ZSAgMiwgMSwgMiwgMQorCithcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MjoKKyAgICAuYnl0ZSAgMCwgMgorICAgIC5ieXRlICAyLCAxCisKK2FybVZDTTRQMTBfVk1hdHJpeDoKKyAgICAuYnl0ZSAgMTAsIDE2LCAxMworICAgIC5ieXRlICAxMSwgMTgsIDE0CisgICAgLmJ5dGUgIDEzLCAyMCwgMTYKKyAgICAuYnl0ZSAgMTQsIDIzLCAxOAorICAgIC5ieXRlICAxNiwgMjUsIDIwCisgICAgLmJ5dGUgIDE4LCAyOSwgMjMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfUVBEaXZUYWJsZToKKyAgICAuYnl0ZSAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgLmJ5dGUgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgIC5ieXRlICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAuYnl0ZSAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgLmJ5dGUgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgIC5ieXRlICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAuYnl0ZSAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgLmJ5dGUgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgIC5ieXRlICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGU6CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1FQTW9kdWxvVGFibGU6CisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBpbnZpZHVhbCBieXRlIHZhbHVlcyBzdG9yZWQgYXMKKzsvLyBoYWxmd29yZHMuIFRoaXMgYXZvaWRzIHVucGFja2luZyBpbnNpZGUgdGhlIGZ1bmN0aW9uCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfVk1hdHJpeFUxNjoKKyAgICAuaHdvcmQgMTAsIDE2LCAxMworICAgIC5od29yZCAxMSwgMTgsIDE0CisgICAgLmh3b3JkIDEzLCAyMCwgMTYKKyAgICAuaHdvcmQgMTQsIDIzLCAxOAorICAgIC5od29yZCAxNiwgMjUsIDIwCisgICAgLmh3b3JkIDE4LCAyOSwgMjMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiYzY5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmU6CisgICAgTU9WICAgICAgcjEyLHI4CisgICAgQU5EICAgICAgcjcscjAsIzMKKyAgICBCSUMgICAgICByMCxyMCwjMworICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgorICAgIE5PUAorICAgIEIgICAgICAgIENvcHkwdG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weTF0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5MnRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkzdG9BbGlnbmVkCitDb3B5MHRvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkwdG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weUVuZAorQ29weTF0b0FsaWduZWQ6CisgICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9CisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBBREQgICAgICByMCxyMCxyMQorICAgIExTUiAgICAgIHI3LHI3LCM4CisgICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjMjQKKyAgICBMU1IgICAgICByMTAscjEwLCM4CisgICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMyNAorICAgIExTUiAgICAgIHIxMSxyMTEsIzgKKyAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9CisgICAgQkdUICAgICAgQ29weTF0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5RW5kCitDb3B5MnRvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgTFNSICAgICAgcjcscjcsIzE2CisgICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjMTYKKyAgICBMU1IgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjMTYKKyAgICBMU1IgICAgICByMTEscjExLCMxNgorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5MnRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlFbmQKK0NvcHkzdG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBMU1IgICAgICByNyxyNywjMjQKKyAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICM4CisgICAgTFNSICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzgKKyAgICBMU1IgICAgICByMTEscjExLCMyNAorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5M3RvQWxpZ25lZAorQ29weUVuZDoKKyAgICBNT1YgICAgICByMCxyMTIKKyAgICBNT1YgICAgICByMSwjMHhjCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlOgorICAgIEFORCAgICAgIHI3LHIwLCMzCisgICAgQklDICAgICAgcjAscjAsIzMKKyAgICBBREQgICAgICBwYyxwYyxyNyxMU0wgIzIKKyAgICBOT1AKKyAgICBCICAgICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5M3RvVkFsaWduZWQKK0NvcHkwdG9WQWxpZ25lZDoKKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBTVFIgICAgICByNyxbcjhdLCM0CisgICAgQkdUICAgICAgQ29weTB0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weVZFbmQKK0NvcHkxdG9WQWxpZ25lZDoKKyAgICBMRFIgICAgICByMTAsW3IwLCM0XQorICAgIExEUiAgICAgIHI3LFtyMF0scjEKKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIExTTCAgICAgIHIxMCxyMTAsIzI0CisgICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjOAorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5VkVuZAorQ29weTJ0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgTFNMICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICMxNgorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5VkVuZAorQ29weTN0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgTFNMICAgICAgcjEwLHIxMCwjOAorICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzI0CisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkzdG9WQWxpZ25lZAorQ29weVZFbmQ6CisgICAgU1VCICAgICAgcjAscjgsIzB4MWMKKyAgICBNT1YgICAgICByMSwjNAorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTIyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIEFORCAgICAgIHIxMixyMCwjMworICAgIEJJQyAgICAgIHIwLHIwLCMzCisgICAgQUREICAgICAgcGMscGMscjEyLExTTCAjMgorICAgIE5PUAorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjAKKyAgICBCICAgICAgICBDb3B5NHg0QWxpZ24xCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMgorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjMKK0NvcHk0eDRBbGlnbjA6CisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI1LFtyMF0scjEKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBMRFIgICAgICByOSxbcjBdLHIxCisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIFNUUiAgICAgIHI5LFtyMl0scjMKKyAgICBCICAgICAgICBDb3B5NHg0RW5kCitDb3B5NHg0QWxpZ24xOgorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjOAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMjQKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzgKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzI0CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjOAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMjQKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzgKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzI0CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIEIgICAgICAgIENvcHk0eDRFbmQKK0NvcHk0eDRBbGlnbjI6CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMxNgorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMTYKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzE2CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICMxNgorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzE2CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMxNgorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMTYKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzE2CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIEIgICAgICAgIENvcHk0eDRFbmQKK0NvcHk0eDRBbGlnbjM6CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMyNAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjOAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMjQKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzgKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMyNAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjOAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMjQKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzgKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCitDb3B5NHg0RW5kOgorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRhYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTU9WICAgICAgbHIsIzQKKyAgICBMRFIgICAgICByNiwgPTB4ZmUwMGZlMAorICAgIExEUiAgICAgIHIxMiwgPTB4ZmYwMGZmCitMb29wU3RhcnQxOgorICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KKyAgICBMRFIgICAgICByMTAsW3IwLCM4XQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgVVFTVUIxNiAgcjExLHIxMSxyNgorICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKKyAgICBVUVNVQjE2ICByNSxyNSxyNgorICAgIFVRU1VCMTYgIHI0LHI0LHI2CisgICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKKyAgICBVU0FUMTYgICByMTAsIzEzLHIxMAorICAgIFVTQVQxNiAgIHI1LCMxMyxyNQorICAgIFVTQVQxNiAgIHI0LCMxMyxyNAorICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQorICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQorICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKKyAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1CisgICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4CisgICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAorICAgIFNVQlMgICAgIGxyLGxyLCMxCisgICAgU1RSRCAgICAgcjEwLHIxMSxbcjddLCM4CisgICAgQkdUICAgICAgTG9vcFN0YXJ0MQorICAgIFNVQiAgICAgIHIwLHI3LCMweDIwCisgICAgTU9WICAgICAgcjEsIzgKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjYsID0weGZlMDBmZTAKKyAgICBMRFIgICAgICByMTIsID0weGZmMDBmZgorICAgIE1PViAgICAgIGxyLCMyCitMb29wU3RhcnQ6CisgICAgTERSICAgICAgcjExLFtyMCwjMHhjXQorICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBVUVNVQjE2ICByMTEscjExLHI2CisgICAgVVFTVUIxNiAgcjEwLHIxMCxyNgorICAgIFVRU1VCMTYgIHI1LHI1LHI2CisgICAgVVFTVUIxNiAgcjQscjQscjYKKyAgICBVU0FUMTYgICByMTEsIzEzLHIxMQorICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCisgICAgVVNBVDE2ICAgcjUsIzEzLHI1CisgICAgVVNBVDE2ICAgcjQsIzEzLHI0CisgICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1CisgICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1CisgICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQorICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKKyAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKKyAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4CisgICAgUEtIQlQgICAgcjQscjEwLHIxMSxMU0wgIzE2CisgICAgU1RSICAgICAgcjQsW3I3XSwjOAorICAgIFBLSFRCICAgIHI1LHIxMSxyMTAsQVNSICMxNgorICAgIFNUUiAgICAgIHI1LFtyN10sIy00CisgICAgTERSICAgICAgcjExLFtyMCwjMHhjXQorICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBVUVNVQjE2ICByMTEscjExLHI2CisgICAgVVFTVUIxNiAgcjEwLHIxMCxyNgorICAgIFVRU1VCMTYgIHI1LHI1LHI2CisgICAgVVFTVUIxNiAgcjQscjQscjYKKyAgICBVU0FUMTYgICByMTEsIzEzLHIxMQorICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCisgICAgVVNBVDE2ICAgcjUsIzEzLHI1CisgICAgVVNBVDE2ICAgcjQsIzEzLHI0CisgICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1CisgICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1CisgICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQorICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKKyAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKKyAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4CisgICAgUEtIQlQgICAgcjQscjEwLHIxMSxMU0wgIzE2CisgICAgU1VCUyAgICAgbHIsbHIsIzEKKyAgICBTVFIgICAgICByNCxbcjddLCM4CisgICAgUEtIVEIgICAgcjUscjExLHIxMCxBU1IgIzE2CisgICAgU1RSICAgICAgcjUsW3I3XSwjNAorICAgIEJHVCAgICAgIExvb3BTdGFydAorICAgIFNVQiAgICAgIHIwLHI3LCMweDE4CisgICAgTU9WICAgICAgcjEsIzQKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzMDk3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTUsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMTAsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxNixkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxMCxkMTAsZDgKKyAgICBWTUxBLkkxNiBkMTIsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxNyxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxMixkMTIsZDgKKyAgICBWTUxBLkkxNiBkMTQsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxOCxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxNCxkMTQsZDgKKyAgICBWTUxBLkkxNiBkMTYsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxOSxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxNixkMTYsZDgKKyAgICBWTUxBLkkxNiBkMTgsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTAsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMTgsZDE4LGQ4CisgICAgVk1MQS5JMTYgZDIwLGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTExLGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDIwLGQyMCxkOAorICAgIFZNTEEuSTE2IGQyMixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMixkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQyMixkMjIsZDgKKyAgICBWTUxBLkkxNiBkMjQsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTMsZDAsZDEKKyAgICBWU1VCLkkxNiBkMjQsZDI0LGQ4CisgICAgVk1MQS5JMTYgZDI2LGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZNT1YuSTMyIHExNSwjMHgxNAorICAgIFZNT1YuSTMyIHExNCwjMHg1CisgICAgVkFEREwuUzE2IHE1LGQxMCxkMjAKKyAgICBWQURETC5TMTYgcTEsZDE0LGQxNgorICAgIFZBRERMLlMxNiBxMCxkMTIsZDE4CisgICAgVlNVQi5JMTYgZDI2LGQyNixkOAorICAgIFZNTEEuSTMyIHE1LHExLHExNQorICAgIFZNVUwuSTMyIHE0LHEwLHExNAorICAgIFZBRERMLlMxNiBxNixkMTIsZDIyCisgICAgVkFEREwuUzE2IHExLGQxNixkMTgKKyAgICBWQURETC5TMTYgcTAsZDE0LGQyMAorICAgIFZNTEEuSTMyIHE2LHExLHExNQorICAgIFZTVUIuSTMyIHE1LHE1LHE0CisgICAgVk1VTC5JMzIgcTQscTAscTE0CisgICAgVkFEREwuUzE2IHEyLGQxNCxkMjQKKyAgICBWQURETC5TMTYgcTEsZDE4LGQyMAorICAgIFZBRERMLlMxNiBxMCxkMTYsZDIyCisgICAgVk1MQS5JMzIgcTIscTEscTE1CisgICAgVlNVQi5JMzIgcTYscTYscTQKKyAgICBWTVVMLkkzMiBxNCxxMCxxMTQKKyAgICBWQURETC5TMTYgcTMsZDE2LGQyNgorICAgIFZBRERMLlMxNiBxMSxkMjAsZDIyCisgICAgVkFEREwuUzE2IHEwLGQxOCxkMjQKKyAgICBWTUxBLkkzMiBxMyxxMSxxMTUKKyAgICBWU1VCLkkzMiBxMixxMixxNAorICAgIFZNTFMuSTMyIHEzLHEwLHExNAorICAgIFZRUlNIUlVOLlMzMiBkMCxxNSwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDIscTYsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ0LHEyLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNixxMywjMTAKKyAgICBWUU1PVk4uVTE2IGQwLHEwCisgICAgVlFNT1ZOLlUxNiBkMixxMQorICAgIFZRTU9WTi5VMTYgZDQscTIKKyAgICBWUU1PVk4uVTE2IGQ2LHEzCisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTFjMzNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKKyAgICBWTU9WLkk4ICBkMzAsIzB4NQorICAgIFZNT1YuSTggIGQzMSwjMHgxNAorICAgIFZMRDEuOCAgIHtkMTAsZDExfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMixkM30sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTIsZDEzfSxbcjEyXSxyMQorICAgIFZBRERMLlU4IHE5LGQwLGQxMAorICAgIFZMRDEuOCAgIHtkNCxkNX0sW3IwXSxyMQorICAgIFZBRERMLlU4IHEwLGQxLGQxMQorICAgIFZMRDEuOCAgIHtkNixkN30sW3IwXSxyMQorICAgIFZBRERMLlU4IHExMCxkMixkMTIKKyAgICBWTEQxLjggICB7ZDgsZDl9LFtyMF0scjEKKyAgICBWTUxBTC5VOCBxOSxkNCxkMzEKKyAgICBWTEQxLjggICB7ZDE0LGQxNX0sW3IxMl0scjEKKyAgICBWTUxBTC5VOCBxMCxkNSxkMzEKKyAgICBWTEQxLjggICB7ZDE2LGQxN30sW3IxMl0scjEKKyAgICBWTUxBTC5VOCBxOSxkNixkMzEKKyAgICBWTUxBTC5VOCBxMTAsZDYsZDMxCisgICAgVk1MU0wuVTggcTAsZDMsZDMwCisgICAgVkFEREwuVTggcTExLGQ0LGQxNAorICAgIFZNTFNMLlU4IHE5LGQyLGQzMAorICAgIFZBRERMLlU4IHExLGQzLGQxMworICAgIFZNTEFMLlU4IHEwLGQ3LGQzMQorICAgIFZNTEFMLlU4IHExMCxkOCxkMzEKKyAgICBWTUxTTC5VOCBxOSxkOCxkMzAKKyAgICBWTUxBTC5VOCBxMSxkNyxkMzEKKyAgICBWTUxTTC5VOCBxMCxkOSxkMzAKKyAgICBWTUxBTC5VOCBxMTEsZDgsZDMxCisgICAgVk1MU0wuVTggcTEwLGQ0LGQzMAorICAgIFZNTFNMLlU4IHExLGQ1LGQzMAorICAgIFZBRERMLlU4IHEyLGQ1LGQxNQorICAgIFZNTEFMLlU4IHExMSxkMTAsZDMxCisgICAgVk1MU0wuVTggcTEwLGQxMCxkMzAKKyAgICBWTUxBTC5VOCBxMSxkOSxkMzEKKyAgICBWTUxBTC5VOCBxMixkOSxkMzEKKyAgICBWQURETC5VOCBxMTIsZDYsZDE2CisgICAgVk1MU0wuVTggcTExLGQ2LGQzMAorICAgIFZNTFNMLlU4IHExLGQxMSxkMzAKKyAgICBWTUxTTC5VOCBxMixkNyxkMzAKKyAgICBWQURETC5VOCBxMyxkNyxkMTcKKyAgICBWTUxBTC5VOCBxMTIsZDEwLGQzMQorICAgIFZNTFNMLlU4IHExMSxkMTIsZDMwCisgICAgVk1MU0wuVTggcTIsZDEzLGQzMAorICAgIFZNTEFMLlU4IHEzLGQxMSxkMzEKKyAgICBWTUxBTC5VOCBxMTIsZDEyLGQzMQorICAgIFZFWFQuOCAgIGQyNixkMTgsZDE5LCMyCisgICAgVk1MQUwuVTggcTIsZDExLGQzMQorICAgIFZNTEFMLlU4IHEzLGQxMyxkMzEKKyAgICBWTUxTTC5VOCBxMTIsZDgsZDMwCisgICAgVkVYVC44ICAgZDI3LGQxOCxkMTksIzQKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTUxTTC5VOCBxMyxkOSxkMzAKKyAgICBWTUxTTC5VOCBxMTIsZDE0LGQzMAorICAgIFZFWFQuOCAgIGQyOSxkMTksZDAsIzIKKyAgICBWRVhULjggICBkMjgsZDE4LGQxOSwjNgorICAgIFZNTFNMLlU4IHEzLGQxNSxkMzAKKyAgICBWQURETC5TMTYgcTAsZDE4LGQyOQorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVk1PVi5JMTYgZDMwLCMweDUKKyAgICBWQURELkkxNiBkMjYsZDI2LGQxOQorICAgIFZNTEFMLlMxNiBxMCxkMjcsZDMxCisgICAgVkVYVC44ICAgZDI3LGQyMCxkMjEsIzQKKyAgICBWRVhULjggICBkMjgsZDIwLGQyMSwjNgorICAgIFZFWFQuOCAgIGQyOSxkMjEsZDIsIzIKKyAgICBWTUxTTC5TMTYgcTAsZDI2LGQzMAorICAgIFZFWFQuOCAgIGQyNixkMjAsZDIxLCMyCisgICAgVkFEREwuUzE2IHExLGQyMCxkMjkKKyAgICBWQURELkkxNiBkMjcsZDI3LGQyOAorICAgIFZBREQuSTE2IGQyNixkMjYsZDIxCisgICAgVkVYVC44ICAgZDI4LGQyMixkMjMsIzYKKyAgICBWTUxBTC5TMTYgcTEsZDI3LGQzMQorICAgIFZFWFQuOCAgIGQyOSxkMjMsZDQsIzIKKyAgICBWRVhULjggICBkMjcsZDIyLGQyMywjNAorICAgIFZFWFQuOCAgIGQ4LGQyMixkMjMsIzIKKyAgICBWQURETC5TMTYgcTIsZDIyLGQyOQorICAgIFZNTFNMLlMxNiBxMSxkMjYsZDMwCisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWQURELkkxNiBkMjYsZDgsZDIzCisgICAgVkVYVC44ICAgZDI4LGQyNCxkMjUsIzYKKyAgICBWTUxBTC5TMTYgcTIsZDI3LGQzMQorICAgIFZFWFQuOCAgIGQyNyxkMjQsZDI1LCM0CisgICAgVkVYVC44ICAgZDI5LGQyNSxkNiwjMgorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVkVYVC44ICAgZDgsZDI0LGQyNSwjMgorICAgIFZBRERMLlMxNiBxMyxkMjQsZDI5CisgICAgVk1MU0wuUzE2IHEyLGQyNixkMzAKKyAgICBWTUxBTC5TMTYgcTMsZDI3LGQzMQorICAgIFZBREQuSTE2IGQ4LGQ4LGQyNQorICAgIFZNTFNMLlMxNiBxMyxkOCxkMzAKKyAgICBWUVJTSFJVTi5TMzIgZDAscTAsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQyLHExLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNCxxMiwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDYscTMsIzEwCisgICAgVlFNT1ZOLlUxNiBkMCxxMAorICAgIFZRTU9WTi5VMTYgZDIscTEKKyAgICBWUU1PVk4uVTE2IGQ0LHEyCisgICAgVlFNT1ZOLlUxNiBkNixxMworICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTE0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkMjIsZDIzfSxbcjBdLHIxCisgICAgVkVYVC44ICAgZDEwLGQyMixkMjMsIzUKKyAgICBWRVhULjggICBkMTIsZDIyLGQyMywjMQorICAgIFZFWFQuOCAgIGQxNCxkMjIsZDIzLCMyCisgICAgVkVYVC44ICAgZDE1LGQyMixkMjMsIzMKKyAgICBWRVhULjggICBkMTMsZDIyLGQyMywjNAorICAgIFZBRERMLlU4IHExMSxkMjIsZDEwCisgICAgVkFEREwuVTggcTQsZDE0LGQxNQorICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTEQxLjggICB7ZDI0LGQyNX0sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQyMixkOCxkMzEKKyAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCisgICAgVkVYVC44ICAgZDEwLGQyNCxkMjUsIzUKKyAgICBWRVhULjggICBkMTIsZDI0LGQyNSwjMQorICAgIFZFWFQuOCAgIGQxNixkMjQsZDI1LCMyCisgICAgVkVYVC44ICAgZDE3LGQyNCxkMjUsIzMKKyAgICBWRVhULjggICBkMTMsZDI0LGQyNSwjNAorICAgIFZBRERMLlU4IHExMixkMjQsZDEwCisgICAgVlNVQi5JMTYgZDIyLGQyMixkOAorICAgIFZBRERMLlU4IHE0LGQxNixkMTcKKyAgICBWQURETC5VOCBxNixkMTIsZDEzCisgICAgVkxEMS44ICAge2QyNixkMjd9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMjQsZDgsZDMxCisgICAgVk1VTC5JMTYgZDgsZDEyLGQzMAorICAgIFZFWFQuOCAgIGQxMCxkMjYsZDI3LCM1CisgICAgVkVYVC44ICAgZDEyLGQyNixkMjcsIzEKKyAgICBWRVhULjggICBkMTgsZDI2LGQyNywjMgorICAgIFZFWFQuOCAgIGQxOSxkMjYsZDI3LCMzCisgICAgVkVYVC44ICAgZDEzLGQyNixkMjcsIzQKKyAgICBWQURETC5VOCBxMTMsZDI2LGQxMAorICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKKyAgICBWQURETC5VOCBxNCxkMTgsZDE5CisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZMRDEuOCAgIHtkMjgsZDI5fSxbcjBdLHIxCisgICAgVk1MQS5JMTYgZDI2LGQ4LGQzMQorICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKKyAgICBWRVhULjggICBkMTAsZDI4LGQyOSwjNQorICAgIFZFWFQuOCAgIGQxMixkMjgsZDI5LCMxCisgICAgVkVYVC44ICAgZDIwLGQyOCxkMjksIzIKKyAgICBWRVhULjggICBkMjEsZDI4LGQyOSwjMworICAgIFZFWFQuOCAgIGQxMyxkMjgsZDI5LCM0CisgICAgVkFEREwuVTggcTE0LGQyOCxkMTAKKyAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4CisgICAgVkFEREwuVTggcTQsZDIwLGQyMQorICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTUxBLkkxNiBkMjgsZDgsZDMxCisgICAgVk1MUy5JMTYgZDI4LGQxMixkMzAKKyAgICBWUVJTSFJVTi5TMTYgZDIyLHExMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMjQscTEyLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyNixxMTMsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDI4LHExNCwjNQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTg0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMQorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKKyAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDEyfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQorICAgIFZBRERMLlU4IHEwLGQ3LGQxMgorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDEzfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMTF9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDE0fSxbcjEyXSxyMQorICAgIFZBRERMLlU4IHE4LGQ4LGQxMQorICAgIFZBRERMLlU4IHE5LGQ5LGQxMAorICAgIFZMRDEuOCAgIHtkMTV9LFtyMTJdLHIxCisgICAgVk1MUy5JMTYgZDAsZDE2LGQzMAorICAgIFZNVUwuSTE2IGQyMCxkMTgsZDMxCisgICAgVkFEREwuVTggcTgsZDksZDEyCisgICAgVkFEREwuVTggcTksZDEwLGQxMQorICAgIFZBRERMLlU4IHExLGQ4LGQxMworICAgIFZNTFMuSTE2IGQyLGQxNixkMzAKKyAgICBWTVVMLkkxNiBkMjEsZDE4LGQzMQorICAgIFZBRERMLlU4IHE4LGQxMCxkMTMKKyAgICBWQURETC5VOCBxOSxkMTEsZDEyCisgICAgVkFEREwuVTggcTIsZDksZDE0CisgICAgVk1MUy5JMTYgZDQsZDE2LGQzMAorICAgIFZNVUwuSTE2IGQyMixkMTgsZDMxCisgICAgVkFEREwuVTggcTgsZDExLGQxNAorICAgIFZBRERMLlU4IHEzLGQxMCxkMTUKKyAgICBWQURETC5VOCBxOSxkMTIsZDEzCisgICAgVk1MUy5JMTYgZDYsZDE2LGQzMAorICAgIFZBREQuSTE2IGQwLGQwLGQyMAorICAgIFZBREQuSTE2IGQyLGQyLGQyMQorICAgIFZBREQuSTE2IGQ0LGQ0LGQyMgorICAgIFZNTEEuSTE2IGQ2LGQxOCxkMzEKKyAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIscTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDQscTIsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDYscTMsIzUKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUyMGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybzoKKyAgICAud29yZCAgIFdpZHRoSXMyTVZJc05vdFplcm8sIFdpZHRoSXMyTVZJc05vdFplcm8KKyAgICAud29yZCAgIFdpZHRoSXM0TVZJc05vdFplcm8sIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICAud29yZCAgIFdpZHRoSXM4TVZJc05vdFplcm8KKworYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm86CisgICAgLndvcmQgICBXaWR0aElzMk1WSXNaZXJvLCBXaWR0aElzMk1WSXNaZXJvCisgICAgLndvcmQgICBXaWR0aElzNE1WSXNaZXJvLCBXaWR0aElzNE1WSXNaZXJvCisgICAgLndvcmQgICBXaWR0aElzOE1WSXNaZXJvCisKKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBMRFJEICAgICByNixyNyxbc3AsIzB4NzBdCisgICAgTERSRCAgICAgcjQscjUsW3NwLCMweDY4XQorICAgIFJTQiAgICAgIHI4LHI2LCM4CisgICAgUlNCICAgICAgcjkscjcsIzgKKyAgICBDTU4gICAgICByNixyNworICAgIE1PViAgICAgIHIxMCwjMQorICAgIExEUkVRICAgIHIxMSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCisgICAgU1VCICAgICAgbHIscjEscjEwCisgICAgTERSTkUgICAgcjExLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8KKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCisgICAgU01VTEJCICAgcjEyLHI4LHI5CisgICAgU01VTEJCICAgcjkscjYscjkKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBTTVVMQkIgICByOCxyOCxyNworICAgIFNNVUxCQiAgIHI2LHI2LHI3CisgICAgVkRVUC44ICAgZDEyLHIxMgorICAgIFZEVVAuOCAgIGQxMyxyOQorICAgIFZEVVAuOCAgIGQxNCxyOAorICAgIFZEVVAuOCAgIGQxNSxyNgorICAgIExEUiAgICAgIHBjLFtyMTEscjQsTFNMICMxXQorCitXaWR0aElzOE1WSXNOb3RaZXJvOgorICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKKyAgICBWTVVMTC5VOCBxMixkMCxkMTIKKyAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKKyAgICBWTVVMTC5VOCBxMyxkMixkMTIKKyAgICBWTEQxLjggICB7ZDE2fSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQxLGQxMworICAgIFZMRDEuOCAgIHtkMTd9LFtyMF0sbHIKKyAgICBWTVVMTC5VOCBxMTEsZDE2LGQxMgorICAgIFZNTEFMLlU4IHEzLGQzLGQxMworICAgIFZMRDEuOCAgIHtkMTh9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTIsZDIsZDE0CisgICAgVk1MQUwuVTggcTExLGQxNyxkMTMKKyAgICBWTVVMTC5VOCBxMTIsZDE4LGQxMgorICAgIFZMRDEuOCAgIHtkMTl9LFtyMF0sbHIKKyAgICBWTUxBTC5VOCBxMyxkMTYsZDE0CisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHExMixkMTksZDEzCisgICAgVk1MQUwuVTggcTExLGQxOCxkMTQKKyAgICBWTUxBTC5VOCBxMixkMyxkMTUKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBWTUxBTC5VOCBxMTIsZDAsZDE0CisgICAgVk1MQUwuVTggcTMsZDE3LGQxNQorICAgIFZNTEFMLlU4IHExMSxkMTksZDE1CisgICAgU1VCUyAgICAgcjUscjUsIzQKKyAgICBWTUxBTC5VOCBxMTIsZDEsZDE1CisgICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKKyAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgorICAgIFZRUlNIUk4uVTE2IGQyMCxxMTEsIzYKKyAgICBWU1QxLjY0ICB7ZDh9LFtyMl0scjMKKyAgICBWUVJTSFJOLlUxNiBkMjEscTEyLCM2CisgICAgVlNUMS42NCAge2Q5fSxbcjJdLHIzCisgICAgVlNUMS42NCAge2QyMH0sW3IyXSxyMworICAgIFZTVDEuNjQgIHtkMjF9LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzOE1WSXNOb3RaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXM0TVZJc05vdFplcm86CisgICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAorICAgIFZNVUxMLlU4IHEyLGQwLGQxMgorICAgIFZNVUxMLlU4IHEzLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgorICAgIFZNTEFMLlU4IHEyLGQxLGQxMworICAgIFZNTEFMLlU4IHEzLGQzLGQxMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMixkMTQKKyAgICBWTUxBTC5VOCBxMyxkMCxkMTQKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZNTEFMLlU4IHEzLGQxLGQxNQorICAgIFZNTEFMLlU4IHEyLGQzLGQxNQorICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2CisgICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXMyTVZJc05vdFplcm86CisgICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAorICAgIFZNVUxMLlU4IHEyLGQwLGQxMgorICAgIFZNVUxMLlU4IHEzLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgorICAgIFZNTEFMLlU4IHEyLGQxLGQxMworICAgIFZNTEFMLlU4IHEzLGQzLGQxMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMixkMTQKKyAgICBWTUxBTC5VOCBxMyxkMCxkMTQKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZNTEFMLlU4IHEzLGQxLGQxNQorICAgIFZNTEFMLlU4IHEyLGQzLGQxNQorICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2CisgICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKKyAgICBWU1QxLjE2ICB7ZDhbMF19LFtyMl0scjMKKyAgICBWU1QxLjE2ICB7ZDlbMF19LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzMk1WSXNOb3RaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXM4TVZJc1plcm86CisgICAgU1VCICAgICAgcjAscjAscjEKK1dpZHRoSXM4TG9vcE1WSXNaZXJvOgorICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCisgICAgVlNUMS42NCAge2QwfSxbcjJdLHIzCisgICAgVlNUMS42NCAge2QxfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczhMb29wTVZJc1plcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczRNVklzWmVybzoKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQorICAgIFZTVDEuMzIgIHtkMVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc1plcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczJNVklzWmVybzoKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZTVDEuMTYgIHtkMFswXX0sW3IyXSxyMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQorICAgIFZTVDEuMTYgIHtkMVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc1plcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDZkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUwpAQCAtMCwwICsxLDY4IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGU6CisgICAgLndvcmQgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQorICAgIC53b3JkIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKKyAgICAud29yZCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCisgICAgLndvcmQgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgorICAgIC53b3JkIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKKyAgICAud29yZCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCisgICAgLndvcmQgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQorICAgIC53b3JkIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKKworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZToKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZToKKyAgICAuYnl0ZSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2CisgICAgLmJ5dGUgMTcsIDE3LCAxNywgMTcsIDE3LCAxNworICAgIC5ieXRlIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKKyAgICAuYnl0ZSAxOSwgMTksIDE5LCAxOSwgMTksIDE5CisgICAgLmJ5dGUgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAorICAgIC5ieXRlIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKKyAgICAuYnl0ZSAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCisgICAgLmJ5dGUgMjMsIDIzLCAyMywgMjMsIDIzLCAyMworICAgIC5ieXRlIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRkNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NDoKKyAgICBWUFVTSCAgICB7ZDh9CisgICAgVkxENC4xNiAge2QwLGQxLGQyLGQzfSxbcjFdCisgICAgVk1PVi5JMTYgZDQsIzAKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlRSTi4xNiAgZDAsZDEKKyAgICBWVFJOLjE2ICBkMixkMworICAgIFZUUk4uMzIgIHEwLHExCisgICAgVkFERC5JMTYgZDUsZDAsZDIKKyAgICBWU1VCLkkxNiBkNixkMCxkMgorICAgIFZIQURELlMxNiBkNyxkMSxkNAorICAgIFZIQURELlMxNiBkOCxkMyxkNAorICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCisgICAgVkFERC5JMTYgZDgsZDEsZDgKKyAgICBWQURELkkxNiBkMCxkNSxkOAorICAgIFZBREQuSTE2IGQxLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWU1VCLkkxNiBkMyxkNSxkOAorICAgIFZSU0hSLlMxNiBkMCxkMCwjNgorICAgIFZSU0hSLlMxNiBkMSxkMSwjNgorICAgIFZSU0hSLlMxNiBkMixkMiwjNgorICAgIFZSU0hSLlMxNiBkMyxkMywjNgorICAgIFZTVDEuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIFZQT1AgICAgIHtkOH0KKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1MmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKK2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQ6CisgICAgUFVTSCAgICAge3I0LXI4LGxyfQorICAgIExEUiAgICAgIHIyLFtyMCwjMF0KKyAgICBNT1YgICAgICByNywjMHgxZgorICAgIE1PViAgICAgIHI0LCMwCisgICAgTU9WICAgICAgcjUsIzAKKyAgICBMRFJCICAgICByMyxbcjJdLCMxCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCMwXQorICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjOF0KKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MTBdCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCMweDE4XQordW5wYWNrTG9vcDoKKyAgICBUU1QgICAgICByMywjMHgxMAorICAgIExEUk5FU0IgIHI1LFtyMiwjMV0KKyAgICBMRFJORUIgICByNCxbcjJdLCMyCisgICAgQU5EICAgICAgcjYscjcscjMsTFNMICMxCisgICAgTERSRVFTQiAgcjQsW3IyXSwjMQorICAgIE9SUk5FICAgIHI0LHI0LHI1LExTTCAjOAorICAgIFRTVCAgICAgIHIzLCMweDIwCisgICAgTERSRVFCICAgcjMsW3IyXSwjMQorICAgIFNUUkggICAgIHI0LFtyMSxyNl0KKyAgICBCRVEgICAgICB1bnBhY2tMb29wCisgICAgU1RSICAgICAgcjIsW3IwLCMwXQorICAgIFBPUCAgICAgIHtyNC1yOCxwY30KKyAgICAuZW5kZnVuYworICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2MTA1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCitvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0k6CisgICAgUFVTSCAgICAge3I0LXI5LGxyfQorICAgIE1PVlMgICAgIHI2LHIwCisgICAgU1VCICAgICAgc3Asc3AsIzB4YworICAgIE1PViAgICAgIHI5LHIxCisgICAgTU9WICAgICAgcjcscjIKKyAgICBNT1YgICAgICByOCxyMworICAgIExEUiAgICAgIHI0LFtzcCwjMHgyOF0KKyAgICBMRFIgICAgICByNSxbc3AsIzB4MmNdCisgICAgQkVRICAgICAgTDB4NTgKKyAgICBUU1QgICAgICByNiwjNworICAgIFRTVEVRICAgIHI5LCM3CisgICAgQk5FICAgICAgTDB4NTgKKyAgICBDTVAgICAgICByNywjMAorICAgIENNUE5FICAgIHI4LCMwCisgICAgQ01QTkUgICAgcjQsIzAKKyAgICBCRVEgICAgICBMMHg1OAorICAgIFRTVCAgICAgIHI0LCMzCisgICAgQk5FICAgICAgTDB4NTgKKyAgICBDTVAgICAgICByNSwjMAorICAgIEJFUSAgICAgIEwweDU4CisgICAgVFNUICAgICAgcjUsIzMKKyAgICBCRVEgICAgICBMMHg2NAorTDB4NTg6CisgICAgTVZOICAgICAgcjAsIzQKK0wweDVjOgorICAgIEFERCAgICAgIHNwLHNwLCMweGMKKyAgICBQT1AgICAgICB7cjQtcjkscGN9CitMMHg2NDoKKyAgICBTVFIgICAgICByNCxbc3AsIzBdCisgICAgTU9WICAgICAgcjMscjgKKyAgICBTVFIgICAgICByNSxbc3AsIzRdCisgICAgTU9WICAgICAgcjIscjcKKyAgICBNT1YgICAgICByMSxyOQorICAgIE1PViAgICAgIHIwLHI2CisgICAgQkwgICAgICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKKyAgICBDTVAgICAgICByMCwjMAorICAgIEJORSAgICAgIEwweDVjCisgICAgQUREICAgICAgcjMscjUsIzB4MTAKKyAgICBBREQgICAgICByMixyNCwjMHgxMAorICAgIFNUUiAgICAgIHIzLFtzcCwjNF0KKyAgICBTVFIgICAgICByMixbc3AsIzBdCisgICAgQUREICAgICAgcjMscjgsIzIKKyAgICBBREQgICAgICByMixyNywjMgorICAgIE1PViAgICAgIHIxLHI5CisgICAgTU9WICAgICAgcjAscjYKKyAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQorICAgIEFERCAgICAgIHNwLHNwLCMweGMKKyAgICBQT1AgICAgICB7cjQtcjkscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIxZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKK29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQ6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDl9CisgICAgU1VCICAgICAgc3Asc3AsIzB4MjAKKyAgICBBREQgICAgICByNCxzcCwjMAorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KKyAgICBNT1YgICAgICByNyxyMQorICAgIE1PViAgICAgIHI4LHIyCisgICAgTU9WICAgICAgcjkscjMKKyAgICBDTVAgICAgICByNSwjMAorICAgIEJFUSAgICAgIEwweDExNAorICAgIE1PViAgICAgIHIxLHI0CisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAgOy8vCisgICAgTERSICAgICAgcjEsW3NwLCMweDYwXQorICAgIExEUiAgICAgIHIxMSwgPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgIExEUiAgICAgIHIxMCwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIExEUiAgICAgIHIyLCAgPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgIExEUlNCICAgIHIxMixbcjExLHIxXQorICAgIExEUlNCICAgIGxyLFtyMTAscjFdCisgICAgTERSICAgICAgcjEwLCA9MHgzMDIwNTA0CisgICAgTERSICAgICAgcjEsID0weDUwNDAxMDAKKyAgICBBREQgICAgICByMixyMixyMTIKKyAgICBWRFVQLjMyICBkNyxyMQorICAgIFZEVVAuMzIgIGQ5LHIxMAorICAgIFZEVVAuMTYgIGQ1LGxyCisgICAgVkxEMS44ICAge2Q2fSxbcjJdCisgICAgVlRCTC44ICAgZDgse2Q2fSxkNworICAgIFZUQkwuOCAgIGQ0LHtkNn0sZDkKKyAgICBDTVAgICAgICByOCwjMAorICAgIFZMRDEuMTYgIHtkMCxkMSxkMixkM30sW3I0XQorICAgIFZTSEwuVTE2IGQ4LGQ4LGQ1CisgICAgVlNITC5VMTYgZDQsZDQsZDUKKyAgICBCRVEgICAgICBMMQorICAgIExEUlNIICAgIHIxMCxbcjgsIzBdCitMMToKKyAgICBWTVVMLkkxNiBkMCxkMCxkOAorICAgIFZNVUwuSTE2IGQxLGQxLGQ0CisgICAgVk1VTC5JMTYgZDIsZDIsZDgKKyAgICBWTVVMLkkxNiBkMyxkMyxkNAorICAgIFZNT1ZORS4xNiBkMFswXSxyMTAKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWTU9WLkkxNiBkNCwjMAorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlJTSFIuUzE2IGQwLGQwLCM2CisgICAgVlJTSFIuUzE2IGQxLGQxLCM2CisgICAgVlJTSFIuUzE2IGQyLGQyLCM2CisgICAgVlJTSFIuUzE2IGQzLGQzLCM2CisgICAgQiAgICAgICAgTDB4MTMwCitMMHgxMTQ6CisgICAgTERSU0ggICAgcjEwLFtyOCwjMF0KKyAgICBBREQgICAgICByMTAscjEwLCMweDIwCisgICAgQVNSICAgICAgcjEwLHIxMCwjNgorICAgIFZEVVAuMTYgIGQwLHIxMAorICAgIFZEVVAuMTYgIGQxLHIxMAorICAgIFZEVVAuMTYgIGQyLHIxMAorICAgIFZEVVAuMTYgIGQzLHIxMAorTDB4MTMwOgorICAgIExEUiAgICAgIHIxLFtzcCwjMHg1OF0KKyAgICBMRFIgICAgICByMTAsW3NwLCMweDVjXQorICAgIExEUiAgICAgIHIzLFtyN10scjEKKyAgICBMRFIgICAgICByNSxbcjddLHIxCisgICAgVk1PViAgICAgZDQscjMscjUKKyAgICBMRFIgICAgICByMyxbcjddLHIxCisgICAgTERSICAgICAgcjUsW3I3LCMwXQorICAgIFZNT1YgICAgIGQ1LHIzLHI1CisgICAgVkFERFcuVTggcTMscTAsZDQKKyAgICBWQUREVy5VOCBxNCxxMSxkNQorICAgIFZRTU9WVU4uUzE2IGQwLHEzCisgICAgVlFNT1ZVTi5TMTYgZDEscTQKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyOV0scjEwCisgICAgVlNUMS4zMiAge2QwWzFdfSxbcjldLHIxMAorICAgIFZTVDEuMzIgIHtkMVswXX0sW3I5XSxyMTAKKyAgICBWU1QxLjMyICB7ZDFbMV19LFtyOV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIEFERCAgICAgIHNwLHNwLCMweDIwCisgICAgVlBPUCAgICAge2Q4LWQ5fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJhNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSQorb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEwLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgVkxEMS44ICAge2QwW119LFtyMl0hCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAscjEKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXSEKKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjRdCisgICAgTERSICAgICAgcjUsW3NwLCMweDYwXQorICAgIExEUiAgICAgIHI5LCA9MHgzMDMwMzAzCisgICAgTERSICAgICAgcjgsID0weDQwNDA0MDQKKyAgICBWTU9WLkk4ICBkMTQsIzAKKyAgICBWTU9WLkk4ICBkMTUsIzB4MQorICAgIFZNT1YuSTE2IGQxLCMweDQKKyAgICBNT1YgICAgICByNywjMHg0MDAwMDAwMAorTDB4Mzg6CisgICAgTERSICAgICAgcjYsW3I0XSwjOAorICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMQorICAgIENNUCAgICAgIHI2LCMwCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxCisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCisgICAgVkFCRC5VOCAgZDEzLGQ0LGQ4CisgICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQorICAgIEJFUSAgICAgIEwweGU0CisgICAgVkFCRC5VOCAgZDEyLGQ1LGQ0CisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFZNT1YuMzIgIGQyNlswXSxyNgorICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVk1PVkwuVTggcTEzLGQyNgorICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKKyAgICBWQ0dULlMxNiBkMjcsZDI2LCMwCisgICAgVkNHVC5VOCAgZDEyLGQyLGQxMgorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQU5EICAgICBkMTYsZDE2LGQyNworICAgIFRTVCAgICAgIHI2LHI5CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgIFRTVCAgICAgIHI2LHI4CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgVlRTVC4xNiAgZDI2LGQyNixkMQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIFZCSVQgICAgIGQyOSxkMTMsZDI2CisgICAgVkJJVCAgICAgZDI0LGQzMSxkMjYKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorTDB4ZTQ6CisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZGRiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXSEKKyAgICBTVUIgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdIQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCisgICAgTERSICAgICAgcjgsID0weDQwNDA0MDQKKyAgICBMRFIgICAgICByOSwgPTB4MzAzMDMwMworICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgVk1PVi5JMTYgZDEsIzB4NAorICAgIE1PViAgICAgIHI3LCMweDQwMDAwMDAwCitMMHgzNDoKKyAgICBMRFIgICAgICByNixbcjRdLCM4CisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgQUREICAgICAgbHIscjEscjEKKyAgICBWTEQxLjggICB7ZDd9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDh9LFtyMTBdLGxyCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLGxyCisgICAgVkxEMS44ICAge2QxMH0sW3IxMF0sbHIKKyAgICBWTEQxLjggICB7ZDZ9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDl9LFtyMTBdLGxyCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLGxyCisgICAgVkxEMS44ICAge2QxMX0sW3IxMF0sbHIKKyAgICBWWklQLjggICBkNyxkOAorICAgIFZaSVAuOCAgIGQ1LGQxMAorICAgIFZaSVAuOCAgIGQ2LGQ5CisgICAgVlpJUC44ICAgZDQsZDExCisgICAgVlpJUC4xNiAgZDcsZDUKKyAgICBWWklQLjE2ICBkOCxkMTAKKyAgICBWWklQLjE2ICBkNixkNAorICAgIFZaSVAuMTYgIGQ5LGQxMQorICAgIFZUUk4uMzIgIGQ3LGQ2CisgICAgVlRSTi4zMiAgZDUsZDQKKyAgICBWVFJOLjMyICBkMTAsZDExCisgICAgVlRSTi4zMiAgZDgsZDkKKyAgICBDTVAgICAgICByNiwjMAorICAgIFZBQkQuVTggIGQxOSxkNixkNAorICAgIFZBQkQuVTggIGQxMyxkNCxkOAorICAgIEJFUSAgICAgIEwweDE3MAorICAgIFZBQkQuVTggIGQxMixkNSxkNAorICAgIFZBQkQuVTggIGQxOCxkOSxkOAorICAgIFZNT1YuMzIgIGQyNlswXSxyNgorICAgIFZDR1QuVTggIGQxNixkMCxkMTMKKyAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgorICAgIFZNT1ZMLlU4IHExMyxkMjYKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVkNHVC5TMTYgZDI3LGQyNiwjMAorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWQ0dULlU4ICBkMTksZDIsZDE5CisgICAgVkFORCAgICAgZDE2LGQxNixkMjcKKyAgICBUU1QgICAgICByNixyOQorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICBUU1QgICAgICByNixyOAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZUU1QuMTYgIGQyNixkMjYsZDEKKyAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICBWQklUICAgICBkMjksZDEzLGQyNgorICAgIFZCSVQgICAgIGQyNCxkMzEsZDI2CisgICAgQUREICAgICAgcjEwLHIwLCMzCisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIEFERCAgICAgIHIxMixyMTAscjEKKyAgICBBREQgICAgICBscixyMSxyMQorICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZTVDEuOCAgIHtkMjlbMF19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVsxXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzJdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjlbM119LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyOVs0XX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzVdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjlbNl19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVs3XX0sW3IxMl0sbHIKKyAgICBBREQgICAgICByMTIscjAsIzQKKyAgICBBREQgICAgICByMTAscjEyLHIxCisgICAgVlNUMS44ICAge2QyNFswXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzFdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjRbMl19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyNFszXX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzRdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbNV19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyNFs2XX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzddfSxbcjEwXSxscgorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQk5FICAgICAgTDB4MzQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK0wweDE3MDoKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgQUREUyAgICAgcjcscjcscjcKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgQk5FICAgICAgTDB4MzQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NTg5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgQUREICAgICAgcjcscjIsIzEKKyAgICBBREQgICAgICByOCxyMywjMQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcjUsW3NwLCMweDY4XQorICAgIE1PViAgICAgIHIxMSwjMAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgQUREICAgICAgcjEwLHIxLHIxCisgICAgTU9WICAgICAgcjksIzB4NTUwMDAwMDAKK0wweDM4OgorICAgIExEUkggICAgIHIxMixbcjRdLCMyCisgICAgQUREICAgICAgcjYscjAscjEKKyAgICBDTVAgICAgICByMTIsIzAKKyAgICBCRVEgICAgICBMMHhlNAorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDZ9LFtyNl0scjEwCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkNH0sW3I2XSxyMTAKKyAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEwCisgICAgVkFCRC5VOCAgZDEyLGQ0LGQ1CisgICAgVkxEMS44ICAge2Q5fSxbcjZdCisgICAgVkFCRC5VOCAgZDEzLGQ4LGQ0CisgICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQorICAgIFZBQkQuVTggIGQxOCxkOSxkOAorICAgIFZBQkQuVTggIGQxOSxkNixkNAorICAgIFZDR1QuVTggIGQxNixkMCxkMTMKKyAgICBUU1QgICAgICByMTIsIzB4ZmYKKyAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgorICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKKyAgICBWTU9WRVEuMzIgZDE2WzBdLHIxMQorICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWTU9WRVEuMzIgZDE2WzFdLHIxMQorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWTEQxLjggICB7ZDExfSxbcjBdCisgICAgVkFORCAgICAgZDE2LGQxNixkMTIKKyAgICBUU1QgICAgICByMTIsIzQKKyAgICBWQU5EICAgICBkMTIsZDE2LGQxNworICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5CisgICAgQk5FICAgICAgTDB4ZjgKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBTVUIgICAgICByMCxyMCxyMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQorICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgorICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0KKyAgICBBREQgICAgICByMCxyNiwjOAorICAgIEJDQyAgICAgIEwweDM4CisgICAgQiAgICAgICAgTDB4MTMwCitMMHhlNDoKKyAgICBBREQgICAgICByMCxyMCwjOAorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgQUREICAgICAgcjUscjUsIzIKKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDEzMAorTDB4Zjg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIFZTVDEuOCAgIHtkMzF9LFtyMF0scjEKKyAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQorICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgorICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0scjEKKyAgICBBREQgICAgICByNSxyNSwjMgorICAgIFZTVDEuOCAgIHtkMjh9LFtyMF0KKyAgICBBREQgICAgICByMCxyNiwjOAorICAgIEJDQyAgICAgIEwweDM4CitMMHgxMzA6CisgICAgU1VCICAgICAgcjAscjAsIzB4MTAKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCisgICAgQk5FICAgICAgTDB4MzgKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjYzMyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgQUREICAgICAgcjcscjIsIzEKKyAgICBBREQgICAgICByOCxyMywjMQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgU1VCICAgICAgcjAscjAsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCisgICAgTU9WICAgICAgcjYsIzAKKyAgICBWTU9WLkk4ICBkMTQsIzAKKyAgICBWTU9WLkk4ICBkMTUsIzB4MQorICAgIE1PViAgICAgIHI5LCMweDExMDAwMDAwCisgICAgQUREICAgICAgcjExLHIxLHIxCitMMHgzODoKKyAgICBMRFJIICAgICByMTIsW3I0XSwjNAorICAgIENNUCAgICAgIHIxMiwjMAorICAgIEJFUSAgICAgIEwweDE2MAorICAgIEFERCAgICAgIHIxMCxyMCxyMQorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTEKKyAgICBWTEQxLjggICB7ZDh9LFtyMTBdLHIxMQorICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMTEKKyAgICBWWklQLjggICBkNyxkOAorICAgIFZMRDEuOCAgIHtkMTB9LFtyMTBdLHIxMQorICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxyMTEKKyAgICBWWklQLjggICBkNSxkMTAKKyAgICBWTEQxLjggICB7ZDl9LFtyMTBdLHIxMQorICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxyMTEKKyAgICBWTEQxLjggICB7ZDExfSxbcjEwXSxyMTEKKyAgICBWWklQLjggICBkNixkOQorICAgIFZaSVAuMTYgIGQ4LGQxMAorICAgIFZaSVAuOCAgIGQ0LGQxMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZaSVAuMTYgIGQ3LGQ1CisgICAgVlpJUC4xNiAgZDksZDExCisgICAgVlpJUC4xNiAgZDYsZDQKKyAgICBWVFJOLjMyICBkOCxkOQorICAgIFZUUk4uMzIgIGQ1LGQ0CisgICAgVlRSTi4zMiAgZDEwLGQxMQorICAgIFZUUk4uMzIgIGQ3LGQ2CisgICAgVkFCRC5VOCAgZDEzLGQ0LGQ4CisgICAgVkFCRC5VOCAgZDEyLGQ1LGQ0CisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVFNUICAgICAgcjEyLCMweGZmCisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZNT1ZFUS4zMiBkMTZbMF0scjYKKyAgICBUU1QgICAgICByMTIsIzB4ZmYwMAorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCisgICAgVk1PVkVRLjMyIGQxNlsxXSxyNgorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFRTVCAgICAgIHIxMiwjNAorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTkUgICAgICBMMHgxN2MKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgVlpJUC44ICAgZDcsZDYKKyAgICBWWklQLjggICBkMzAsZDI5CisgICAgVlpJUC44ICAgZDI0LGQyNQorICAgIFZaSVAuOCAgIGQxMCxkMTEKKyAgICBWWklQLjE2ICBkNyxkMzAKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBWWklQLjE2ICBkMjQsZDEwCisgICAgVlpJUC4xNiAgZDI1LGQxMQorICAgIFZaSVAuMTYgIGQ2LGQyOQorICAgIFZUUk4uMzIgIGQ3LGQyNAorICAgIFZUUk4uMzIgIGQzMCxkMTAKKyAgICBWVFJOLjMyICBkNixkMjUKKyAgICBWVFJOLjMyICBkMjksZDExCisgICAgVlNUMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjR9LFtyMTBdLHIxMQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QxMH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2Q2fSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKKyAgICBBREQgICAgICByNSxyNSwjMgorICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVkxEMS44ICAge2QwW119LFtyN10KKyAgICBBREQgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxZjAKK0wweDE2MDoKKyAgICBBREQgICAgICByMCxyMCwjNAorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVkxEMS44ICAge2QwW119LFtyN10KKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxZjAKK0wweDE3YzoKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgVlpJUC44ICAgZDcsZDMxCisgICAgVlpJUC44ICAgZDMwLGQyOQorICAgIFZaSVAuOCAgIGQyNCxkMjUKKyAgICBWWklQLjggICBkMjgsZDExCisgICAgVlpJUC4xNiAgZDcsZDMwCisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgVlpJUC4xNiAgZDI0LGQyOAorICAgIFZaSVAuMTYgIGQyNSxkMTEKKyAgICBWWklQLjE2ICBkMzEsZDI5CisgICAgVlRSTi4zMiAgZDcsZDI0CisgICAgVlRSTi4zMiAgZDMwLGQyOAorICAgIFZUUk4uMzIgIGQzMSxkMjUKKyAgICBWVFJOLjMyICBkMjksZDExCisgICAgVlNUMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjR9LFtyMTBdLHIxMQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyOH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMX0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDI1fSxbcjEwXSxyMTEKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjExCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBWU1QxLjggICB7ZDExfSxbcjEwXSxyMTEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorTDB4MWYwOgorICAgIFNVQiAgICAgIHI0LHI0LCMweGUKKyAgICBTVUIgICAgICByNSxyNSwjMHhlCisgICAgU1VCICAgICAgcjAscjAsIzB4MTAKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgQk5FICAgICAgTDB4MzgKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjM2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCitvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgU1VCICAgICAgc3Asc3AsIzB4MTAKKyAgICBMRFIgICAgICByNixbc3AsIzB4NzhdCisgICAgTERSICAgICAgcjcsW3NwLCMweDdjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg4MF0KKyAgICBMRFIgICAgICByNCxbc3AsIzB4ODRdCisgICAgQUREICAgICAgcjYscjYscjcsTFNMICMyCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgVk1PVi5JMTYgZDMxLCMweDE0CisgICAgVk1PVi5JMTYgZDMwLCMweDUKK0wweDJjOgorICAgIFNUTSAgICAgIHIxMSx7cjAtcjN9CisgICAgQUREICAgICAgcGMscGMscjYsTFNMICMyCisgICAgQiAgICAgICAgTDB4M2YwCisgICAgQiAgICAgICAgTDB4NzgKKyAgICBCICAgICAgICBMMHhhOAorICAgIEIgICAgICAgIEwweGRjCisgICAgQiAgICAgICAgTDB4MTAwCisgICAgQiAgICAgICAgTDB4MTM0CisgICAgQiAgICAgICAgTDB4MTY4CisgICAgQiAgICAgICAgTDB4MWE4CisgICAgQiAgICAgICAgTDB4MWYwCisgICAgQiAgICAgICAgTDB4MjM0CisgICAgQiAgICAgICAgTDB4MjU4CisgICAgQiAgICAgICAgTDB4MmIwCisgICAgQiAgICAgICAgTDB4MmQ4CisgICAgQiAgICAgICAgTDB4MzMwCisgICAgQiAgICAgICAgTDB4MzY0CisgICAgQiAgICAgICAgTDB4M2E4CisgICAgQiAgICAgICAgTDB4M2YwCitMMHg3ODoKKyAgICBBREQgICAgICByMTIscjAscjEsTFNMICMxCisgICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxMX0sW3IxMl0scjEKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdCisgICAgVkxEMS44ICAge2QxMn0sW3IxMl0KKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2Q5WzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QxMVswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QxMlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweGE4OgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMTQKKyAgICBWUkhBREQuVTggZDI2LGQyNixkMTgKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMTYKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHhkYzoKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MTAwOgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMTUKKyAgICBWUkhBREQuVTggZDI2LGQyNixkMTkKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMTcKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkMjEKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxMzQ6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDAsZDAsZDkKKyAgICBWUkhBREQuVTggZDQsZDQsZDExCisgICAgVlJIQURELlU4IGQyLGQyLGQxMAorICAgIFZSSEFERC5VOCBkNixkNixkMTIKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDE2ODoKKyAgICBNT1YgICAgICByOCxyMAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgU1VCICAgICAgcjAscjgsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCisgICAgVlJIQURELlU4IGQyNixkMjYsZDQKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2CisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MWE4OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgVlFSU0hSVU4uUzE2IGQxNCxxNywjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE4LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQyMCxxMTAsIzUKKyAgICBWUkhBREQuVTggZDAsZDAsZDE0CisgICAgVlJIQURELlU4IGQ0LGQ0LGQxOAorICAgIFZSSEFERC5VOCBkMixkMixkMTYKKyAgICBWUkhBREQuVTggZDYsZDYsZDIwCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxZjA6CisgICAgTU9WICAgICAgcjgscjAKKyAgICBBREQgICAgICByMCxyMCwjMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgU1VCICAgICAgcjAscjgsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCisgICAgVlJIQURELlU4IGQyNixkMjYsZDQKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2CisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MjM0OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyNTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAorICAgIFZFWFQuOCAgIGQyMCxkMjAsZDIxLCM0CisgICAgVkVYVC44ICAgZDIyLGQyMixkMjMsIzQKKyAgICBWRVhULjggICBkMjQsZDI0LGQyNSwjNAorICAgIFZRUlNIUlVOLlMxNiBkMTQscTksIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE2LHExMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTExLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyMCxxMTIsIzUKKyAgICBWUkhBREQuVTggZDAsZDAsZDE0CisgICAgVlJIQURELlU4IGQ0LGQ0LGQxOAorICAgIFZSSEFERC5VOCBkMixkMixkMTYKKyAgICBWUkhBREQuVTggZDYsZDYsZDIwCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyYjA6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDJkODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM2CisgICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzYKKyAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNgorICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM2CisgICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDMzMDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTAKKyAgICBWUkhBREQuVTggZDQsZDQsZDEyCisgICAgVlJIQURELlU4IGQyLGQyLGQxMQorICAgIFZSSEFERC5VOCBkNixkNixkMTMKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDM2NDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjAscjgscjEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgzYTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE4LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyMCxxMTEsIzUKKyAgICBWUkhBREQuVTggZDAsZDAsZDE0CisgICAgVlJIQURELlU4IGQ0LGQ0LGQxOAorICAgIFZSSEFERC5VOCBkMixkMixkMTYKKyAgICBWUkhBREQuVTggZDYsZDYsZDIwCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgzZjA6CisgICAgTU9WICAgICAgcjgscjAKKyAgICBBREQgICAgICByMCxyMCwjMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjAscjgscjEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCitMMHg0MzQ6CisgICAgTERNICAgICAgcjExLHtyMC1yM30KKyAgICBTVUJTICAgICByNSxyNSwjNAorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQUREICAgICAgcjIscjIsIzQKKyAgICBCR1QgICAgICBMMHgyYworICAgIFNVQlMgICAgIHI0LHI0LCM0CisgICAgTERSICAgICAgcjUsW3NwLCMweDgwXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIEFERCAgICAgIHIyLHIyLHIzLExTTCAjMgorICAgIFNVQiAgICAgIHIwLHIwLHI1CisgICAgU1VCICAgICAgcjIscjIscjUKKyAgICBCR1QgICAgICBMMHgyYworICAgIE1PViAgICAgIHIwLCMwCisgICAgQUREICAgICAgc3Asc3AsIzB4MTAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0OWU0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4OgorICAgIC53b3JkICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAud29yZCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUKKworYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDg6CisgICAgLmh3b3JkICAgMywgMiwgMSw0CisgICAgLmh3b3JkICAtMywtMiwtMSwwCisgICAgLmh3b3JkICAgMSwgMiwgMyw0CisKKworICAgIC50ZXh0CisgICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OAorb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4OgorICAgIFBVU0ggICAgIHtyNC1yMTAsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBMRFIgICAgICByOCwgPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKKyAgICBMRFIgICAgICByNixbc3AsIzB4NjhdCisgICAgTERSICAgICAgcjQsW3NwLCMweDYwXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KKyAgICBMRFIgICAgICByNyxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcGMsW3I4LHI2LExTTCAjMl0KK09NWF9WQ19DSFJPTUFfREM6CisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHhlOAorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVsxXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzNdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4Y2MKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQQURETC5VOCBkMixkMAorICAgIFZQQURETC5VMTYgZDMsZDIKKyAgICBWUEFEREwuVTggZDIsZDEKKyAgICBWUEFEREwuVTE2IGQxLGQyCisgICAgVkFERC5JMzIgZDIsZDMsZDEKKyAgICBWUlNIUi5VMzIgZDIsZDIsIzMKKyAgICBWUlNIUi5VMzIgZDMsZDMsIzIKKyAgICBWUlNIUi5VMzIgZDEsZDEsIzIKKyAgICBWTU9WLkk4ICBkNSwjMHhjCisgICAgVk1PVi5JOCAgZDYsIzB4NAorICAgIFZTSEwuSTY0IGQ1LGQ1LCMzMgorICAgIFZTSFIuVTY0IGQ2LGQ2LCMzMgorICAgIFZBREQuSTggIGQ2LGQ2LGQ1CisgICAgVlRCTC44ICAgZDAse2QyLWQzfSxkNQorICAgIFZUQkwuOCAgIGQ0LHtkMS1kMn0sZDYKK0wweDljOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3I5XQorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KK0wweGNjOgorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQxCisgICAgVlBBRERMLlUxNiBkMSxkMgorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgVkRVUC44ICAgZDQsZDFbNF0KKyAgICBCICAgICAgICBMMHg5YworTDB4ZTg6CisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHgxMTQKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQQURETC5VOCBkMixkMAorICAgIFZQQURETC5VMTYgZDMsZDIKKyAgICBWUlNIUi5VMzIgZDMsZDMsIzIKKyAgICBWTU9WLkk4ICBkNSwjMHg0CisgICAgVlNITC5JNjQgZDUsZDUsIzMyCisgICAgVlRCTC44ICAgZDAse2QzfSxkNQorICAgIEIgICAgICAgIEwweDExYworTDB4MTE0OgorICAgIFZNT1YuSTggIGQwLCMweDgwCisgICAgTU9WICAgICAgcjAsIzAKK0wweDExYzoKKyAgICBBREQgICAgICByOSxyMyxyNQorICAgIEFERCAgICAgIHIxMCxyNSxyNQorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0KKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTAscGN9CitPTVhfVkNfQ0hST01BX1ZFUlQ6CisgICAgVkxEMS44ICAge2QwfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBCICAgICAgICBMMHgxMWMKK09NWF9WQ19DSFJPTUFfSE9SOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QyW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2Q0W119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q1W119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2Q2W119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q3W119LFtyOV0KKyAgICBCICAgICAgICBMMHgyOGMKK09NWF9WQ19DSFJPTUFfUExBTkU6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBWTEQxLjggICB7ZDJbMF19LFtyMl0KKyAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzddfSxbcjldCisgICAgVlJFVjY0LjggZDMsZDAKKyAgICBWU1VCTC5VOCBxMyxkMyxkMgorICAgIFZTSFIuVTY0IGQzLGQzLCM4CisgICAgVlNVQkwuVTggcTIsZDMsZDAKKyAgICBWUkVWNjQuOCBkMyxkMQorICAgIFZTVUJMLlU4IHE3LGQzLGQyCisgICAgVlNIUi5VNjQgZDMsZDMsIzgKKyAgICBWU1VCTC5VOCBxNixkMyxkMQorICAgIExEUiAgICAgIHIyLCA9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgKKyAgICBWU0hMLkk2NCBkNCxkNCwjMTYKKyAgICBWRVhULjggICBkOSxkNCxkNiwjMgorICAgIFZMRDEuMTYgIHtkMTB9LFtyMl0hCisgICAgVlNITC5JNjQgZDEyLGQxMiwjMTYKKyAgICBWRVhULjggICBkMTYsZDEyLGQxNCwjMgorICAgIFZNVUwuSTE2IGQxMSxkOSxkMTAKKyAgICBWTVVMLkkxNiBkMyxkMTYsZDEwCisgICAgVlBBREQuSTE2IGQzLGQxMSxkMworICAgIFZQQURETC5TMTYgZDMsZDMKKyAgICBWU0hMLkkzMiBkMixkMywjNAorICAgIFZBREQuSTMyIGQzLGQzLGQyCisgICAgVkxEMS4xNiAge2QxMCxkMTF9LFtyMl0KKyAgICBWUlNIUi5TMzIgZDMsZDMsIzUKKyAgICBWQURETC5VOCBxMCxkMCxkMQorICAgIFZEVVAuMTYgIHEwLGQxWzNdCisgICAgVlNITC5JMTYgcTAscTAsIzQKKyAgICBWRFVQLjE2ICBxMixkM1swXQorICAgIFZEVVAuMTYgIHEzLGQzWzJdCisgICAgVk1VTC5JMTYgcTIscTIscTUKKyAgICBWTVVMLkkxNiBxMyxxMyxxNQorICAgIFZBREQuSTE2IHEyLHEyLHEwCisgICAgVkRVUC4xNiAgcTAsZDZbMF0KKyAgICBWRFVQLjE2ICBxMSxkNlsxXQorICAgIFZEVVAuMTYgIHE0LGQ2WzJdCisgICAgVkRVUC4xNiAgcTUsZDZbM10KKyAgICBWRFVQLjE2ICBxNixkN1swXQorICAgIFZEVVAuMTYgIHE3LGQ3WzFdCisgICAgVkRVUC4xNiAgcTgsZDdbMl0KKyAgICBWRFVQLjE2ICBxOSxkN1szXQorICAgIFZBREQuSTE2IHEwLHEyLHEwCisgICAgVkFERC5JMTYgcTEscTIscTEKKyAgICBWQURELkkxNiBxNCxxMixxNAorICAgIFZBREQuSTE2IHE1LHEyLHE1CisgICAgVkFERC5JMTYgcTYscTIscTYKKyAgICBWQURELkkxNiBxNyxxMixxNworICAgIFZBREQuSTE2IHE4LHEyLHE4CisgICAgVkFERC5JMTYgcTkscTIscTkKKyAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDEscTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIscTQsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDMscTUsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDQscTYsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDUscTcsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDYscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDcscTksIzUKK0wweDI4YzoKKyAgICBBREQgICAgICByOSxyMyxyNQorICAgIEFERCAgICAgIHIxMCxyNSxyNQorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDF9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QyfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkM30sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q1fSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNn0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDd9LFtyOV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNjhmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisKKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNjoKKyAgICAud29yZCAgT01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IKKyAgICAud29yZCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQorCisKKworYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNjoKKyAgICAuaHdvcmQgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgOAorICAgIC5od29yZCAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3CisgICAgLmh3b3JkICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKworICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2CisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNgorb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTY6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUiAgICAgIHI5LCA9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2CisgICAgTERSICAgICAgcjYsW3NwLCMweDcwXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcjcsW3NwLCMweDc0XQorICAgIE1PViAgICAgIHIxMiwjMHgxMAorICAgIExEUiAgICAgIHBjLFtyOSxyNixMU0wgIzJdCitPTVhfVkNfMTZYMTZfVkVSVDoKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBBREQgICAgICByOCxyMyxyNQorICAgIEFERCAgICAgIHIxMCxyNSxyNQorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitPTVhfVkNfMTZYMTZfSE9SOgorICAgIEFERCAgICAgIHI4LHIwLHI0CisgICAgQUREICAgICAgcjQscjQscjQKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByNSxyNSxyNQorTDB4OGM6CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIEJORSAgICAgIEwweDhjCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitPTVhfVkNfMTZYMTZfREM6CisgICAgTU9WICAgICAgcjExLCMwCisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHgxNGMKKyAgICBBREQgICAgICByOCxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQorICAgIFZQQURETC5VOCBxMCxxMQorICAgIEFERCAgICAgIHIxMSxyMTEsIzEKKyAgICBWUEFERC5JMTYgZDAsZDAsZDEKKyAgICBWUEFEREwuVTE2IGQwLGQwCisgICAgVlBBRERMLlUzMiBkNixkMAorICAgIFZSU0hSLlU2NCBkOCxkNiwjNAorTDB4MTRjOgorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4MTcwCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCisgICAgQUREICAgICAgcjExLHIxMSwjMQorICAgIFZQQURETC5VOCBxMCxxMAorICAgIFZQQURELkkxNiBkMCxkMCxkMQorICAgIFZQQURETC5VMTYgZDAsZDAKKyAgICBWUEFEREwuVTMyIGQ3LGQwCisgICAgVlJTSFIuVTY0IGQ4LGQ3LCM0CitMMHgxNzA6CisgICAgQ01QICAgICAgcjExLCMyCisgICAgQk5FICAgICAgTDB4MTgwCisgICAgVkFERC5JNjQgZDgsZDcsZDYKKyAgICBWUlNIUi5VNjQgZDgsZDgsIzUKK0wweDE4MDoKKyAgICBWRFVQLjggICBxMyxkOFswXQorICAgIENNUCAgICAgIHIxMSwjMAorICAgIEFERCAgICAgIHI4LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgQk5FICAgICAgTDB4MTk4CisgICAgVk1PVi5JOCAgcTMsIzB4ODAKK0wweDE5ODoKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitPTVhfVkNfMTZYMTZfUExBTkU6CisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2CisgICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCisgICAgVkxEMS44ICAge2Q0WzBdfSxbcjJdCisgICAgQUREICAgICAgcjgscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDJbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzFdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMlsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbM119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMls1XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzddfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1swXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1szXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbN119LFtyOF0KKyAgICBWUkVWNjQuOCBkNSxkMQorICAgIFZTVUJMLlU4IHEzLGQ1LGQ0CisgICAgVlNIUi5VNjQgZDUsZDUsIzgKKyAgICBWU1VCTC5VOCBxNCxkNSxkMAorICAgIFZTSEwuSTY0IGQ5LGQ5LCMxNgorICAgIFZFWFQuOCAgIGQ5LGQ5LGQ2LCMyCisgICAgVlJFVjY0LjggZDEyLGQzCisgICAgVlNVQkwuVTggcTcsZDEyLGQ0CisgICAgVlNIUi5VNjQgZDEyLGQxMiwjOAorICAgIFZTVUJMLlU4IHE4LGQxMixkMgorICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQorICAgIFZTSEwuSTY0IGQxNyxkMTcsIzE2CisgICAgVkVYVC44ICAgZDE3LGQxNyxkMTQsIzIKKyAgICBWTVVMTC5TMTYgcTExLGQ4LGQyMAorICAgIFZNVUxMLlMxNiBxMTIsZDE2LGQyMAorICAgIFZNTEFMLlMxNiBxMTEsZDksZDIxCisgICAgVk1MQUwuUzE2IHExMixkMTcsZDIxCisgICAgVlBBREQuSTMyIGQyMixkMjMsZDIyCisgICAgVlBBREQuSTMyIGQyMyxkMjUsZDI0CisgICAgVlBBRERMLlMzMiBxMTEscTExCisgICAgVlNITC5JNjQgcTEyLHExMSwjMgorICAgIFZBREQuSTY0IHExMSxxMTEscTEyCisgICAgVlJTSFIuUzY0IHExMSxxMTEsIzYKKyAgICBWU0hMLkk2NCBxMTIscTExLCMzCisgICAgVlNVQi5JNjQgcTEyLHExMixxMTEKKyAgICBWTEQxLjE2ICB7ZDIwLGQyMX0sW3I5XSEKKyAgICBWRFVQLjE2ICBxNixkMjJbMF0KKyAgICBWRFVQLjE2ICBxNyxkMjNbMF0KKyAgICBWQURETC5VOCBxMTEsZDEsZDMKKyAgICBWU0hMLkkxNiBxMTEscTExLCM0CisgICAgVkRVUC4xNiAgcTExLGQyM1szXQorICAgIFZBREQuSTY0IGQxLGQyNCxkMjUKKyAgICBWTEQxLjE2ICB7ZDI0LGQyNX0sW3I5XQorICAgIFZEVVAuMTYgIHExMyxkMVswXQorICAgIFZTVUIuSTE2IHExMyxxMTEscTEzCisgICAgVk1VTC5JMTYgcTUscTYscTEwCisgICAgVk1VTC5JMTYgcTYscTYscTEyCisgICAgVkFERC5JMTYgcTAscTUscTEzCisgICAgVkFERC5JMTYgcTEscTYscTEzCitMMHgyZDQ6CisgICAgVlFSU0hSVU4uUzE2IGQ2LHEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQ3LHExLCM1CisgICAgU1VCUyAgICAgcjEyLHIxMiwjMQorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyNQorICAgIFZBREQuSTE2IHEwLHEwLHE3CisgICAgVkFERC5JMTYgcTEscTEscTcKKyAgICBCTkUgICAgICBMMHgyZDQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZkN2VmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisKKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQ6CisgICAgLndvcmQgT01YX1ZDXzR4NF9WRVJULCAgICAgT01YX1ZDXzR4NF9IT1IKKyAgICAud29yZCBPTVhfVkNfNHg0X0RDLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAud29yZCBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgLndvcmQgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAorICAgIC53b3JkIE9NWF9WQ180eDRfSFUKKworICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NAorICAgIC5mdW5jICAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQ6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDEyfQorICAgIExEUiAgICAgIHI4LCA9YXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBMRFJEICAgICByNixyNyxbc3AsIzB4NThdCisgICAgTERSRCAgICAgcjQscjUsW3NwLCMweDUwXQorICAgIExEUiAgICAgIHBjLFtyOCxyNixMU0wgIzJdCitPTVhfVkNfNHg0X0hPUjoKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVtdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjBdCisgICAgVkxEMS44ICAge2QzW119LFtyOV0KKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2QxWzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDNbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X1ZFUlQ6CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CitMMHg1ODoKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0RDOgorICAgIFRTVCAgICAgIHI3LCMyCisgICAgQkVRICAgICAgTDB4ZGMKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMFswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDBbMV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QwWzJdfSxbcjBdCisgICAgVkxEMS44ICAge2QwWzNdfSxbcjldCisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHhiYworICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZQQURETC5VMzIgZDEsZDEKKyAgICBWUlNIUi5VNjQgZDEsZDEsIzMKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWRFVQLjggICBkMCxkMVswXQorICAgIEIgICAgICAgIEwweDU4CitMMHhiYzoKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQQURETC5VOCBkMSxkMAorICAgIFZQQURETC5VMTYgZDEsZDEKKyAgICBWUlNIUi5VMzIgZDEsZDEsIzIKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWRFVQLjggICBkMCxkMVswXQorICAgIEIgICAgICAgIEwweDU4CitMMHhkYzoKKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweDEwOAorICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweDEwODoKKyAgICBWTU9WLkk4ICBkMCwjMHg4MAorICAgIE1PViAgICAgIHIwLCMwCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgQiAgICAgICAgTDB4NTgKK09NWF9WQ180eDRfRElBR19ETDoKKyAgICBUU1QgICAgICByNywjMHg0MAorICAgIEJFUSAgICAgIEwweDEzOAorICAgIFZMRDEuOCAgIHtkM30sW3IxXQorICAgIFZEVVAuOCAgIGQyLGQzWzddCisgICAgVkVYVC44ICAgZDQsZDMsZDIsIzEKKyAgICBWRVhULjggICBkNSxkMyxkMiwjMgorICAgIEIgICAgICAgIEwweDE0YworTDB4MTM4OgorICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQorICAgIFZEVVAuOCAgIGQyLGQwWzddCisgICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMCxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2CitMMHgxNGM6CisgICAgVkhBREQuVTggZDYsZDMsZDUKKyAgICBWUkhBREQuVTggZDYsZDYsZDQKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfRElBR19EUjoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIEFERCAgICAgIHIxLHIzLHI1CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KKyAgICBWRVhULjggICBkMyxkMSxkMCwjMworICAgIEFERCAgICAgIHI0LHIxLHI1CisgICAgVkVYVC44ICAgZDQsZDEsZDAsIzQKKyAgICBBREQgICAgICByNixyNCxyNQorICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCM1CisgICAgVkhBREQuVTggZDYsZDMsZDUKKyAgICBWUkhBREQuVTggZDYsZDYsZDQKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyNl0KKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3I0XQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjFdCisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVlI6CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgVkxEMS44ICAge2QwWzddfSxbcjJdCisgICAgVkxEMS44ICAge2QxWzddfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QyWzddfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdCisgICAgVkVYVC44ICAgZDEyLGQwLGQwLCM3CisgICAgVkVYVC44ICAgZDMsZDEsZDEyLCM2CisgICAgVkVYVC44ICAgZDQsZDIsZDEyLCM3CisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzcKKyAgICBWRVhULjggICBkNixkMixkMCwjNworICAgIFZFWFQuOCAgIGQxMSxkMSxkMTIsIzcKKyAgICBWSEFERC5VOCBkOCxkNixkMTIKKyAgICBWUkhBREQuVTggZDgsZDgsZDExCisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWRVhULjggICBkMTAsZDgsZDgsIzEKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWRVhULjggICBkOSxkNyxkNywjMQorICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2Q5WzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjExXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9IRDoKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdCisgICAgVkxEMS44ICAge2QxWzNdfSxbcjldCisgICAgVkVYVC44ICAgZDMsZDEsZDAsIzMKKyAgICBWRVhULjggICBkNCxkMSxkMCwjMgorICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCMxCisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWUkhBREQuVTggZDgsZDQsZDMKKyAgICBWU0hMLkk2NCBkOCxkOCwjMjQKKyAgICBWU0hMLkk2NCBkNixkNywjMTYKKyAgICBWWklQLjggICBkOCxkNgorICAgIFZFWFQuOCAgIGQ3LGQ3LGQ3LCM2CisgICAgVkVYVC44ICAgZDgsZDYsZDcsIzIKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWU1QxLjMyICB7ZDhbMV19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2Q2WzFdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X1ZMOgorICAgIFRTVCAgICAgIHI3LCMweDQwCisgICAgQkVRICAgICAgTDB4MmI0CisgICAgVkxEMS44ICAge2QzfSxbcjFdCisgICAgVkVYVC44ICAgZDQsZDMsZDMsIzEKKyAgICBWRVhULjggICBkNSxkNCxkNCwjMQorICAgIEIgICAgICAgIEwweDJjOAorTDB4MmI0OgorICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQorICAgIFZEVVAuOCAgIGQyLGQwWzddCisgICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMCxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2CitMMHgyYzg6CisgICAgVlJIQURELlU4IGQ3LGQ0LGQzCisgICAgVkhBREQuVTggZDEwLGQzLGQ1CisgICAgVlJIQURELlU4IGQxMCxkMTAsZDQKKyAgICBWRVhULjggICBkOCxkNyxkNywjMQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZFWFQuOCAgIGQ5LGQxMCxkOCwjMQorICAgIFZTVDEuMzIgIHtkN1swXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0hVOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KKyAgICBWRFVQLjggICBkMixkMVs3XQorICAgIFZFWFQuOCAgIGQzLGQxLGQyLCM0CisgICAgVkVYVC44ICAgZDQsZDEsZDIsIzUKKyAgICBWRVhULjggICBkNSxkMSxkMiwjNgorICAgIFZIQURELlU4IGQ3LGQzLGQ1CisgICAgVlJIQURELlU4IGQ3LGQ3LGQ0CisgICAgVlJIQURELlU4IGQ4LGQ0LGQzCisgICAgVlpJUC44ICAgZDgsZDcKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkOCxkOCxkOCwjMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCisgICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1CisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdCitMMHgzNDg6CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDEyfQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGE4OWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcgorICAgIC5mdW5jICAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcgorb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcjoKKyAgICBwdXNoICAgIHtyNC1yMTAsIGxyfQorICAgIGxkciAgICAgcjksIFtyMCwjMF0KKyAgICB2bW92LmkxNiAgICBkMCwgIzAKKyAgICBtb3YgICAgIHI4LCAjMHgxZgorICAgIHZzdDEuMTYgICAge2QwfSwgW3IxXQorICAgIGxkcmIgICAgcjYsIFtyOV0sICMxCit1bnBhY2tMb29wOgorICAgIHRzdCAgICAgcjYsICMweDEwCisgICAgbGRybmVzYiByNSwgW3I5LCAjMV0KKyAgICBsZHJuZWIgIHI0LCBbcjldLCAjMgorICAgIGFuZCAgICAgcjcsIHI4LCByNiwgbHNsICMxCisgICAgbGRyZXFzYiByNCwgW3I5XSwgIzEKKyAgICBvcnJuZSAgIHI0LCByNCwgcjUsIGxzbCAjOAorICAgIHRzdCAgICAgcjYsICMweDIwCisgICAgbGRyZXFiICByNiwgW3I5XSwgIzEKKyAgICBzdHJoICAgIHI0LCBbcjEsIHI3XQorICAgIGJlcSAgICAgdW5wYWNrTG9vcAorICAgIGxkbWlhICAgcjEsIHtyMywgcjR9CisgICAgc3RyICAgICByOSwgW3IwLCAjMF0KKyAgICBsZHIgICAgIHI1LCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgbGRyICAgICByNiwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICBzYWRkc3VieCAgICAgICAgcjMsIHIzLCByMworICAgIHNhZGRzdWJ4ICAgICAgICByNCwgcjQsIHI0CisgICAgbGRyc2IgICByOSwgW3I1LCByMl0KKyAgICBsZHJzYiAgIHIyLCBbcjYsIHIyXQorICAgIHNhZGQxNiAgcjUsIHIzLCByNAorICAgIHNzdWIxNiAgcjYsIHIzLCByNAorICAgIGxzbCAgICAgcjIsIHIyLCByOQorICAgIHZtb3YgICAgZDAsIHI1LCByNgorICAgIHZyZXYzMi4xNiAgZDAsIGQwCisgICAgdmR1cC4xNiAgICBkMSwgcjIKKyAgICB2bXVsbC5zMTYgICBxMSwgZDAsIGQxCisgICAgdnNocm4uaTMyICAgZDIsIHExLCAjMQorICAgIHZzdDEuMTYgICAge2QyfSwgW3IxXQorICAgIG1vdiAgICAgcjAsICMwCisgICAgcG9wICAgICB7cjQtcjEwLCBwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKK2FybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NDoKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxM30KKyAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KKyAgICBMRFIgICAgICByMiwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIExEUiAgICAgIHIzLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIFZBREQuSTE2IGQ0LGQwLGQxCisgICAgVkFERC5JMTYgZDUsZDIsZDMKKyAgICBWU1VCLkkxNiBkNixkMCxkMQorICAgIExEUlNCICAgIHI0LFtyMixyMV0KKyAgICBWU1VCLkkxNiBkNyxkMixkMworICAgIExEUlNCICAgIHI1LFtyMyxyMV0KKyAgICBWQURELkkxNiBkMCxkNCxkNQorICAgIFZTVUIuSTE2IGQxLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBMU0wgICAgICByNSxyNSxyNAorICAgIFZBREQuSTE2IGQzLGQ2LGQ3CisgICAgVlRSTi4xNiAgZDAsZDEKKyAgICBWVFJOLjE2ICBkMixkMworICAgIFZUUk4uMzIgIHEwLHExCisgICAgVkFERC5JMTYgZDQsZDAsZDEKKyAgICBWQURELkkxNiBkNSxkMixkMworICAgIFZTVUIuSTE2IGQ2LGQwLGQxCisgICAgVlNVQi5JMTYgZDcsZDIsZDMKKyAgICBWQURELkkxNiBkMCxkNCxkNQorICAgIFZTVUIuSTE2IGQxLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWQURELkkxNiBkMyxkNixkNworICAgIFZEVVAuMTYgIGQ1LHI1CisgICAgVk1PVi5JMzIgcTMsIzB4MgorICAgIFZNT1YuSTMyIHE0LCMweDIKKyAgICBWTU9WLkkzMiBxNSwjMHgyCisgICAgVk1PVi5JMzIgcTYsIzB4MgorICAgIFZNTEFMLlMxNiBxMyxkMCxkNQorICAgIFZNTEFMLlMxNiBxNCxkMSxkNQorICAgIFZNTEFMLlMxNiBxNSxkMixkNQorICAgIFZNTEFMLlMxNiBxNixkMyxkNQorICAgIFZTSFJOLkkzMiBkMCxxMywjMgorICAgIFZTSFJOLkkzMiBkMSxxNCwjMgorICAgIFZTSFJOLkkzMiBkMixxNSwjMgorICAgIFZTSFJOLkkzMiBkMyxxNiwjMgorICAgIFZTVDEuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIFZQT1AgICAgIHtkOC1kMTN9CisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKy5nbG9iYWwgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKKy5mdW5jICAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKK29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBNT1YgICAgICByNCxyMQorICAgIE1PViAgICAgIHI1LHIyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIE1PViAgICAgIHIwLHI0CisgICAgTU9WICAgICAgcjEscjUKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGI1NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKKyAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWEhVRkZUQUJfSF8KKyNkZWZpbmUgX09NWEhVRkZUQUJfSF8KKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF07CisKKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdOworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdOworLy9leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFszMl07CitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdOworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXQorCisjZW5kaWYgLyogX09NWEhVRkZUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTk1MjAzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAorCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVmZTZkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCkBAIC0wLDAgKzEsODIgQEAKKzsgLyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBDbGlwcGluZyAxNiBiaXQgdmFsdWUgdG8gWzAsMjU1XSBSYW5nZQorOyAqLyAKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIAorCisgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgIElGIENvcnRleEE4Cis7Ly9JbnB1dCBBcmd1bWVudHMKKworcFNyYyAgICAgICAgICAgICAgICAgUk4gMAorcERzdCAgICAgICAgICAgICAgICAgUk4gMQorc3RlcCAgICAgICAgICAgICAgICAgUk4gMgorCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworcXgwICAgICAgICAgICAgICAgICAgUU4gIFEwLlMxNiAgICAgICAgICAgICAgICAgIAorZHgwMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZHgwMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorcXgxICAgICAgICAgICAgICAgICAgUU4gIFExLlMxNgorZHgxMCAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZHgxMSAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCitxeDIgICAgICAgICAgICAgICAgICBRTiAgUTIuUzE2ICAgICAgICAgICAgICAgICAgCitkeDIwICAgICAgICAgICAgICAgICBETiAgRDQuUzE2CitkeDIxICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitxeDMgICAgICAgICAgICAgICAgICBRTiAgUTMuUzE2CitkeDMwICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkeDMxICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CisKKworZGNsaXAwICAgICAgICAgICAgICAgRE4gIEQwLlU4CitkY2xpcDEgICAgICAgICAgICAgICBETiAgRDIuVTggCitkY2xpcDIgICAgICAgICAgICAgICBETiAgRDQuVTgKK2RjbGlwMyAgICAgICAgICAgICAgIEROICBENi5VOAorIAorICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4CisKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCisgICAgICAgCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgwMCxkeDAxLGR4MTAsZHgxMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCAxNiBlbnRyaWVzIGZyb20gcFNyYworICAgICAgIFZMRDEgICAgICAgICAge2R4MjAsZHgyMSxkeDMwLGR4MzF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgbmV4dCAxNiBlbnRyaWVzIGZyb20gcFNyYyAgCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDAscXgwLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAwW2ldPWNsaXAgcXgwW2ldIHRvIFswLDI1NV0KKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMSxxeDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDFbaV09Y2xpcCBxeDFbaV0gdG8gWzAsMjU1XQorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMH0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAxfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMixxeDIsIzAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMyxxeDMsIzAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDJ9LFtwRHN0XSxzdGVwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAzfSxbcERzdF0sc3RlcAorCisKKyAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE3ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpAQCAtMCwwICsxLDM5OCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIsIGludHJhIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIAorOyAqCis7ICogCis7ICoKKzsgKiAKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIAorCisKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CisKK2Z0eXBlICAgICAgICAgICAgICAgIFJOIDAKK3RlbXAzICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAgICAgICAgICAgICAgICAgIFJOIDUKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKK0VzY2FwZSAgICAgICAgICAgICAgIFJOIDUKKworOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCit6aWd6YWcgICAgICAgICAgICAgICBSTiAwCitzdG9yZUxldmVsICAgICAgICAgICBSTiAxCit0ZW1wMiAgICAgICAgICAgICAgICBSTiA0Cit0ZW1wMSAgICAgICAgICAgICAgICBSTiA1CitzaWduICAgICAgICAgICAgICAgICBSTiA1CitMYXN0ICAgICAgICAgICAgICAgICBSTiA3CitzdG9yZVJ1biAgICAgICAgICAgICBSTiAxNAorCisKK3BhY2tSZXRJbmRleCAgICAgICAgIFJOIDUKKworCittYXJrZXJiaXQgICAgICAgICAgICBSTiA1CisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0xSICAgICAgICAgICAgICAgICAgIFJOIDE0ICAgICAgICAKKyAgICAgICAgCisKKworICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwT2Zmc2V0LDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBMaW5rUmVnaXN0ZXIsNCAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworICAgICAgICA7Ly8gZ2V0IHRoZSB0YWJsZSBhZGRyZXNzZXMgZnJvbSBzdGFjayAgICAgICAKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgQUxMIHplcm9zIGF0IHBEc3QKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSBDb3VudCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIExhc3QsIzAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMaW5rIFJlZ2lzdGVyIG9uIFN0YWNrCisgICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMiwjMAorICAgICAgICBNT1YgICAgICAgICAgICAgTFIsIzAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgTWFjcm8gYW5kIFN0b3JlIGFsbCB6ZXJvcyB0byBwRHN0IAorICAKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBwQml0c3RyZWFtIG9uIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcEJpdE9mZnNldCBvbiBzdGFjaworICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgICAgICBwRHN0LHBEc3QsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRHN0CisKKyAgICAgICAgOy8vIFRoZSBhcm1WQ000UDJfR2V0VkxDQml0cyBiZWdpbnMKKworZ2V0VkxDYml0cworICAgICAgICAKKyAgICAgICAgTV9CRF9MT09LOCAgICAgIEVzY2FwZSw3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEVzY2FwZSBWYWx1ZQorICAgICAgICBMU1IgICAgICAgICAgICAgRXNjYXBlLEVzY2FwZSwjMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRXNjYXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGZvciBlc2NhcGUgbW9kZQorICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzAKKyAgICAgICAgQk5FICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggaWYgbm90IGluIEVzY2FwZSBtb2RlIDMKKworICAgICAgICBNX0JEX1ZTS0lQOCAgICAgIzcsVDEKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBzaG9ydFZpZGVvSGVhZGVyIGZsYWcgdG8ga25vdyB0aGUgdHlwZSBvZiBFc2NhcGUgbW9kZQorICAgICAgICBCRVEgICAgICAgICAgICAgZW5kRmlsbFZMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEVzY2FwZSBNb2RlIDQKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZUxldmVsLDgsVDEKKworICAgICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHdoZXRoZXIgdGhlIFJlc2VydmVkIHZhbHVlcyBmb3IgTGV2ZWwgYXJlIHVzZWQgYW5kIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGl0IGlzIHNvCisKKyAgICAgICAgVEVRICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKKyAgICAgICAgVEVRTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIzEyOCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGVycm9yIGlmIENvdW50K3N0b3JlUnVuID49IDY0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBBZGRyZXNzIG9mIFppZ3phZyB0YWJsZQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICAgICAgICAgICAgICAgIAorICAgICAgICBTWFRCICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gRXh0ZW5kIHN0b3JlTGV2ZWwgdG8gMzIgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBMZXZlbAorICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgIAorICAgICAgICAKKworZW5kRmlsbFZMRAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBGdHlwZSggRXNjYXBlIE1vZGUpIHZhbHVlIGJhc2VkIG9uIHRoZSB0d28gc3VjY2Vzc2l2ZSBiaXRzIGluIHRoZSBiaXRzdHJlYW0KKyAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgIAorICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzEKKyAgICAgICAgQkVRICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMxCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMworICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzIKKyAgICAgICAgCisKK25vdEVzY2FwZW1vZGUKKworICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyB0YWJsZSB3aXRoIGxhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQ29tYmluZWQgVkxDIFRhYmxlCisgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZnR5cGUgPj0zIGdldCBwZXJmb3JtIEZpeGVkIExlbmd0aCBEZWNvZGluZyAoRXNjYXBlIE1vZGUgMykKKyAgICAgICAgQkdFICAgICAgICAgICAgIEVzY2FwZU1vZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIGNvbnRpbnVlIG5vcm1hbCBWTEMgRGVjb2RpbmcKKyAgICAgICAgCisgICAgICAgIDsvLyBWYXJpYWJsZSBsZW5naCBkZWNvZGluZywgImFybVVuUGFja1ZMQzMyIiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgICAgICAgcGFja1JldEluZGV4LFQxLFQyLHBWbGNUYWJsZUwwTDEsNCwyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHRlbXAzLD0weEZGRgorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIHBhY2tSZXRJbmRleCx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBmb3IgaW52YWxpZCBzeW1ib2wKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBpbnZhbGlkIHN5bWJvbCBvY2N1cnMgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgICAgICBMYXN0LHBhY2tSZXRJbmRleCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IExhc3QgZnJvbSBwYWNrZWQgSW5kZXgKKyAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlUnVuLHBhY2tSZXRJbmRleCwjNyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgUnVuIFZhbHVlIGZyb20gUGFja2VkIGluZGV4CisgICAgICAgIEFORCAgICAgICAgICAgICBzdG9yZUxldmVsLHBhY2tSZXRJbmRleCwjMHg3YyAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmVMZXZlbD1wYWNrUmV0SW5kZXhbMi02XSxzdG9yZUxldmVsWzAtMV09MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggdGFibGUKKyAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTGV2ZWwgdmFsdWUKKworICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGZ0eXBlMgorICAgICAgICAKKyAgICAgICAgOy8vIGZ0eXBlPT0xOyBFc2NhcGUgbW9kZSA9MQorICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBMTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgOy8vIElmIHRoZSBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSxzdG9yZVJ1bl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVMZXZlbCx0ZW1wMSxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgCisKK2Z0eXBlMgorCisgICAgICAgIDsvLyBmdHlwZSA9MjsgRXNjYXBlIG1vZGUgPTIKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzIKKyAgICAgICAgQk5FICAgICAgICAgICAgIEZpbGxWTERMMQorICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwUk1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgICA7Ly8gSWYgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCisgICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wMixzdG9yZUxldmVsLCMxCisgICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsdGVtcDJdCisKKyAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHN0b3JlUnVuLCMxCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bix0ZW1wMQorICAgICAgICAKK0ZpbGxWTERMMSAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHNpZ24sMSxUMQorCisgICAgICAgIENNUCAgICAgICAgICAgICBzaWduLCMxCisgICAgICAgIFJTQkVRICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzAKKyAKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ2h0CisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisgCitzdG9yZUxldmVsTDEKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgTGV2ZWwgdmFsIGlzIExhc3Qgbm9uIHplcm8gdmFsCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBMU1IgICAgICAgICAgICAgTGFzdCxMYXN0LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAKKworCisgICAgICAgIDsvLyBGaXhlZCBMZW5naCBEZWNvZGluZyBFc2NhcGUgTW9kZSAzCisKK0VzY2FwZU1vZGUzCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKKyAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQorICAgICAgICBURVEgICAgICAgICAgICAgbWFya2VyYml0LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG1hcmtlciBiaXQgaXMgemVybworICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQxNiAgICAgc3RvcmVMZXZlbCwxMixUMQorCisgICAgICAgIFRTVCAgICAgICAgICAgICBzdG9yZUxldmVsLCMweDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVzdCBpZiB0aGUgbGV2ZWwgaXMgbmVnYXRpdmUKKyAgICAgICAgU1VCTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjNDA5NgorICAgICAgICBDTVAgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBDTVBORSAgICAgICAgICAgc3RvcmVMZXZlbCwjLTIwNDgKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBMZXZlbD09MCBvciAgLTIwNDggCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKKyAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQorICAgICAgICAgICAKKworICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIgKCBTaWduIG5vdCB1c2VkIGFzIHN0b3JlTGV2ZWwgaXMgcHJlcHJvY2Vzc2VkKQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW4gTGVuZ3RoCisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisKKworIAorc3RvcmVMZXZlbExhc3QKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZW5kIAorICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAgICAgICAgCitlbmQKKworICAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vUnVuIHRoZSBMb29wIHVudGlsbCBDb3VudCByZWFjaGVzIDY0CisKKyAgICAgICAgQkxUICAgICAgICAgICAgIGdldFZMQ2JpdHMKKworICAgICAgICAKK0V4aXRPaworICAgICAgICA7Ly8gRXhpdCBXaGVuIFZMQyBEZWNvZGluZyBpcyBkb25lIFN1Y2Nlc3NmdWxseSAKKyAgIAorICAgICAgICA7Ly8gTG9hZGluZyBwcEJpdFN0cmVhbSBhbmQgcEJpdE9mZnNldCBmcm9tIHN0YWNrCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0CisKKyAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgICAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTU9WTkUgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIExpbmsgUmVnaXN0ZXIgQmFjaworICAgICAgICBCICAgICAgICAgICAgICAgZXhpdDIKKworRXhpdEVycm9yCisgICAgICAgIDsvLyBFeGl0IFdoZW4gYW4gRXJyb3Igb2NjdXJzIAorCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKyAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisKK2V4aXQyCisgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhhZjk3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKQEAgLTAsMCArMSwyMTEgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisKKworCisvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKKworLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIAorLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6CisvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cworLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKKy8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCisvLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0CisvLworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCisvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCisvLworLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQorLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorCisvLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQorLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCisvLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKKyAKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCisgICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCisgICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCisgICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCisgICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCisgICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCisgICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCisgICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCisgICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCisgICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCisgICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCisgICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCisgICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCisgICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCisgICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCisgICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCisgICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCisgICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCisgICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCisgICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCisgICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCisgICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCisgICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKK307CisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKKworCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Cit9OworCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKKyAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKKyAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKKyAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKKyAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKKyAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKKyAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKKyAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKKyAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKKyAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKKyAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKKyAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAoreworICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKKyAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAoreworICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCisgICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAoreworICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKKyAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisKKwk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEKK307CisKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Cit7CisgICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsCTAsCTAsCTAsCisJCisJMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5NDhmODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpAQCAtMCwwICsxLDc1IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIExvb2t1cCB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworICAgIC8qICogVGFibGUgRW50cmllcyBjb250YWluIERjIFNjYWxlciB2YWx1ZXMKKyAgICAgICAqIGFybVZDTTRQMl9EQ1NjYWxlcltpXT0gOCAgICAgICAgICAgZm9yIGk9MSAgdG8gIDQgYW5kIGk9MzMgdG8gMzYKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippICAgICAgICAgZm9yIGk9NSAgdG8gIDgKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaSs4ICAgICAgICAgZm9yIGk9OSAgdG8gIDI1CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaS0xNiAgICAgIGZvciBpPTI2IHRvICAzMQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAoaS0zMisxMykvMiBmb3IgaT0zNyB0byAgNTkKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaS02LTMyICAgICAgZm9yIGk9NjAgdG8gIDYzCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgIGZvciBpPTAgYW5kIGk9MzIKKyAgICAgICAqLworICAgICAgIAorY29uc3QgT01YX1U4IGFybVZDTTRQMl9EQ1NjYWxlcls2NF09eworCTB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4YSwgIDB4YywgIDB4ZSwgIAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIAorICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCisgICAgMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwKKyAgICAweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweDksICAweDksICAweGEsICAKKyAgICAweGEsICAweGIsICAweGIsICAweGMsICAweGMsICAweGQsICAweGQsICAweGUsICAKKyAgICAweGUsICAweGYsICAweGYsICAweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAKKyAgICAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAorCit9OworCisgICAgICAgICAgICAgIAorICAgICAvKiAgVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MworICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2W2ldPXJvdW5kKDMyNzY3L2kpCisgICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbMF09IDAKKyAgICAgICovCisKK2NvbnN0IE9NWF9TMTYgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzY0XT17CisJMHgwMDAwLDB4N2ZmZiwweDQwMDAsMHgyYWFhLDB4MjAwMCwweDE5OTksMHgxNTU1LDB4MTI0OSwKKyAgICAweDEwMDAsMHgwZTM5LDB4MGNjZCwweDBiYTMsMHgwYWFiLDB4MDlkOSwweDA5MjUsMHgwODg4LAorICAgIDB4MDgwMCwweDA3ODcsMHgwNzFjLDB4MDZiZCwweDA2NjYsMHgwNjE4LDB4MDVkMSwweDA1OTEsCisgICAgMHgwNTU1LDB4MDUxZiwweDA0ZWMsMHgwNGJlLDB4MDQ5MiwweDA0NmEsMHgwNDQ0LDB4MDQyMSwKKyAgICAweDA0MDAsMHgwM2UxLDB4MDNjNCwweDAzYTgsMHgwMzhlLDB4MDM3NiwweDAzNWUsMHgwMzQ4LAorICAgIDB4MDMzMywweDAzMWYsMHgwMzBjLDB4MDJmYSwweDAyZTksMHgwMmQ4LDB4MDJjOCwweDAyYjksCisgICAgMHgwMmFiLDB4MDI5ZCwweDAyOGYsMHgwMjgyLDB4MDI3NiwweDAyNmEsMHgwMjVmLDB4MDI1NCwKKyAgICAweDAyNDksMHgwMjNmLDB4MDIzNSwweDAyMmIsMHgwMjIyLDB4MDIxOSwweDAyMTEsMHgwMjA4CisJICAgCit9OworICAgICAKKyAgICAgIC8qIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKKyAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMltpXT1yb3VuZCgxMzEwNzEvaSkKKyAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMlswXT0gMAorICAgICAgICovCisKK2NvbnN0IE9NWF9TMzIgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzY0XT17CisJMHgwMDAwMDAwMCwweDAwMDFmZmZmLDB4MDAwMTAwMDAsMHgwMDAwYWFhYSwgMHgwMDAwODAwMCwgMHgwMDAwNjY2NiwgMHgwMDAwNTU1NSwgMHgwMDAwNDkyNCwKKyAgICAweDAwMDA0MDAwLDB4MDAwMDM4ZTMsMHgwMDAwMzMzMywweDAwMDAyZThjLCAweDAwMDAyYWFiLCAweDAwMDAyNzYyLCAweDAwMDAyNDkyLCAweDAwMDAyMjIyLAorICAgIDB4MDAwMDIwMDAsMHgwMDAwMWUxZSwweDAwMDAxYzcyLDB4MDAwMDFhZjIsIDB4MDAwMDE5OWEsIDB4MDAwMDE4NjEsIDB4MDAwMDE3NDYsIDB4MDAwMDE2NDMsCisgICAgMHgwMDAwMTU1NSwweDAwMDAxNDdiLDB4MDAwMDEzYjEsMHgwMDAwMTJmNiwgMHgwMDAwMTI0OSwgMHgwMDAwMTFhOCwgMHgwMDAwMTExMSwgMHgwMDAwMTA4NCwKKyAgICAweDAwMDAxMDAwLDB4MDAwMDBmODQsMHgwMDAwMGYwZiwweDAwMDAwZWExLCAweDAwMDAwZTM5LCAweDAwMDAwZGQ2LCAweDAwMDAwZDc5LCAweDAwMDAwZDIxLAorICAgIDB4MDAwMDBjY2QsMHgwMDAwMGM3ZCwweDAwMDAwYzMxLDB4MDAwMDBiZTgsIDB4MDAwMDBiYTMsIDB4MDAwMDBiNjEsIDB4MDAwMDBiMjEsIDB4MDAwMDBhZTUsCisgICAgMHgwMDAwMGFhYiwweDAwMDAwYTczLDB4MDAwMDBhM2QsMHgwMDAwMGEwYSwgMHgwMDAwMDlkOSwgMHgwMDAwMDlhOSwgMHgwMDAwMDk3YiwgMHgwMDAwMDk0ZiwKKyAgICAweDAwMDAwOTI1LDB4MDAwMDA4ZmIsMHgwMDAwMDhkNCwweDAwMDAwOGFlLCAweDAwMDAwODg5LCAweDAwMDAwODY1LCAweDAwMDAwODQyLCAweDAwMDAwODIwCisJCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRmMjQ2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKQEAgLTAsMCArMSwxMDQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOyAqKgorOyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKKzsgKiBbb3V0XXByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworOyAqIFtvdXRdcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorOyAqCis7ICovCisKKyAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICBJTkNMVURFIG9teFZDX3MuaAorCisKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKyAgICAgICBJRiBBUk0xMTM2SlMKKyAKKzsvLyBJbnB1dCBBcmd1bWVudHMKK0Jsb2NrSW5kZXggICAgICAgICBSTiAwCitwQ29lZkJ1ZlJvdyAgICAgICAgUk4gMQorcENvZWZCdWZDb2wgICAgICAgIFJOIDIKK3ByZWREaXIgICAgICAgICAgICBSTiAzCitwcmVkUVAgICAgICAgICAgICAgUk4gNAorcFFwQnVmICAgICAgICAgICAgIFJOIDUKKworOy8vIExvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgUk4gMAorYmxvY2tEQ0xlZnQgICAgICAgIFJOIDYgIAorYmxvY2tEQ1RvcCAgICAgICAgIFJOIDcKK2Jsb2NrRENUb3BMZWZ0ICAgICBSTiA4Cit0ZW1wMSAgICAgICAgICAgICAgUk4gOQordGVtcDIgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICBNX1NUQVJUICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyLHI5CisKKyAgICAgICBNX0FSRyAgICAgICBwcHJlZFFQLDQKKyAgICAgICBNX0FSRyAgICAgICBwcFFwQnVmLDQKKyAgICAKKyAgICAgICBMRFJIICAgICAgICBibG9ja0RDVG9wTGVmdCxbcENvZWZCdWZSb3csIy0xNl0KKyAgICAgICBMRFJIICAgICAgICBibG9ja0RDTGVmdCxbcENvZWZCdWZDb2xdCisgICAgICAgCisgICAgICAgVEVRICAgICAgICAgQmxvY2tJbmRleCwjMworICAgICAgIExEUkVRSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmQ29sLCMtMTZdCisgICAgICAgTERSTkVIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZSb3ddCisgICAgICAgICAgICAgCisgICAgICAgU1VCUyAgICAgICAgdGVtcDEsYmxvY2tEQ0xlZnQsYmxvY2tEQ1RvcExlZnQKKyAgICAgICBSU0JMVCAgICAgICB0ZW1wMSx0ZW1wMSwjMAorICAgICAgIFNVQlMgICAgICAgIHRlbXAyLGJsb2NrRENUb3BMZWZ0LGJsb2NrRENUb3AKKyAgICAgICBSU0JMVCAgICAgICB0ZW1wMix0ZW1wMiwjMAorICAgICAgCisgICAgICAgTV9MRFIgICAgICAgcFFwQnVmLHBwUXBCdWYKKyAgICAgICBNX0xEUiAgICAgICBwcmVkUVAscHByZWRRUAorICAgICAgIENNUCAgICAgICAgIHRlbXAxLHRlbXAyCisgICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19WRVJUSUNBTAorICAgICAgIExEUkxUQiAgICAgIHRlbXAxLFtwUXBCdWYsIzFdCisgICAgICAgU1RSTFQgICAgICAgdGVtcDIsW3ByZWREaXJdCisgICAgICAgU1RSTFQgICAgICAgdGVtcDEsW3ByZWRRUF0KKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX0hPUklaT05UQUwgICAgICAgICAgIAorICAgICAgIExEUkdFQiAgICAgIHRlbXAxLFtwUXBCdWZdCisgICAgICAgU1RSR0UgICAgICAgdGVtcDIsW3ByZWREaXJdCisgICAgICAgTU9WICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgU1RSR0UgICAgICAgdGVtcDEsW3ByZWRRUF0gCisKKyAgICAgICAgIAorICAgIAorICAgICAgIE1fRU5ECisgCisgICAgICAgRU5ESUYKKworICAgICAgIEVORCAgICAKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjFmYTcxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKy8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCisgKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAorICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKK3sKKyAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKKyAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAorICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKKyAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCisgICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAorICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCisgICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAorICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCisKKwkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAorICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAorICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKKyAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKKyAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAorICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKKyAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCisgICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKKworICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCisgICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAorICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKKyAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCisgICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAorICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCisgICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2CisKKworfTsKKworCisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5NmFkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKKyAqIHBvc2l0aW9uaW5nIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAorICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkKKyAqIG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yCisgKiBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKKyAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKgkJCQkJCQkJWzAtN10KKyAqIFtpbl0JUVAJCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBpbmRpY2F0ZXMgdXNpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBkZWZpbmVkIGluIHNob3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGhlYWRlciBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBpbmRpY2F0ZXMgbm9ybWFpbCBxdWFudGl6YXRpb24gbWV0aG9kLgorICogW291dF0gcHBCaXRTdHJlYW0gCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdIHBEc3QJCQlwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGRhdGEgdHlwZSkuIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QKKyAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6CisgKiAgIC0gKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgUVAgPD0gMDsKKyAqCSAtIHBEc3Qgbm90IDE2LWJ5dGUgYWxpZ25lZAorICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLworICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKKyAgICAKKyAgICAKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgUVApOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKwkgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjI4NjU3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyogRnVuY3Rpb24gZm9yIHNhdHVyYXRpbmcgMTYgYml0IHZhbHVlcyB0byB0aGUgWzAsMjU1XSByYW5nZSBhbmQgICovCisvKiB3cml0aW5nIG91dCBhcyA4IGJpdCB2YWx1ZXMuICBEb2VzIDY0IGVudHJpZXMgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgYXJtVkNNNFAyX0NsaXA4KE9NWF9TMTYgKnBTcmMsIE9NWF9VOCAqcERzdCwgT01YX0lOVCBkc3RTdGVwICk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgorICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKKyAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddLgorICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCisgKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKKyAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKKyAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCisgKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KKyAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQorICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKKyAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgorICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAorICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCisgKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQworICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQorICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCisgKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0CisgKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKKyAqCQkJCQkJCQltYWNyb2Jsb2NrLgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCisgKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgorICogICAgICBvcgorICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKKyAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCisgKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCisgKiAgICAgIG9yCisgKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7CisgICAgT01YX0lOVCAgcHJlZFFQOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICAKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7CisgICAgfQorCisgICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCisgICAgaWYgKGJsb2NrSW5kZXggPD0gMykKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKKyAgICB9CisgICAgCisKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGlmIChpbnRyYURDVkxDID09IDEpCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgdmlkZW9Db21wKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgIGN1clFQLAorICAgICAgICBwcmVkUVAsCisgICAgICAgIHByZWREaXIsCisgICAgICAgIEFDUHJlZEZsYWcsCisgICAgICAgIHZpZGVvQ29tcCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIGN1clFQLAorICAgICB2aWRlb0NvbXAsCisgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCisgICAgICAgaXQgdG8gMCB0byAyNTUgKi8KKyAgICAKKwlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7CisJCisJCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2MxNmY1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKQEAgLTAsMCArMSwzNjQgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICoqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgorOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKKzsgKiBJU08vSUVDIDE0NDk2LTIuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKzsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKKzsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Cis7ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCis7ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCis7ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAorOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Cis7ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgorOyAqIAorOyAqICAgICAgICAgICAgICAgICAgICAgCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKgorOyAqCisgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIElOQ0xVREUgb214VkNfcy5oCisgICAgICAgIAorICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgICAgICAgICAgCisKKworICAgICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQorcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKK3BTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCitwU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAorcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKK2Zjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2CitNQlR5cGUgICAgICAgICAgICAgICAgUk4gNworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworemVybyAgICAgICAgICAgICAgICAgIFJOIDQKK29uZSAgICAgICAgICAgICAgICAgICBSTiA0CitzY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQorCisKK1JldHVybiAgICAgICAgICAgICAgICBSTiAwCisKK1ZsY01WRCAgICAgICAgICAgICAgICBSTiAwCitpbmRleCAgICAgICAgICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKKworbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKK212SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCisKK212VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAorbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKKwordGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKKwordGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKK0hpZ2ggICAgICAgICAgICAgICAgICBSTiA0CitMb3cgICAgICAgICAgICAgICAgICAgUk4gMgorUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKKworQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0CisKK2RpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCitkaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQorCis7Ly8gU2NyYXRjaCBSZWdpc3RlcnMKKworUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKK1JCaXRDb3VudCAgICAgICAgICAgICBSTiA5CitSQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKKworVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKK0xSICAgICAgICAgICAgICAgICAgICBSTiAxNAorCisgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECisgICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCisKKyAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0CisgICAgICAgCisgICAgICAgICAgICAgIAorCisKKyAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCisgICAgICAgCisgICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjaworICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCisgICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAorICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjaworCisgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KKworICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50CisgICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKKyAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCisgICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KKyAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKKyAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQorICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjaworCisgICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjaworCisgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICAgICAgIAorCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKKyAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCisgICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCisgICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKKyAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgorICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCisgICAgICAgICAgICAgIAorICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKKworCitMb29wCisKKyAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQorCisgICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KKworICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCisgICAgICAKKyAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAorICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQorICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKKyAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCisgICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAorICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKKyAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAorICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQorICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAorICAgICAgIAorICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgorCitWZXJ0aWNhbERhdGEKKworICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKKyAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCisKKyAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKKyAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybworICAgICAgIAorICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCisgICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAorICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAorICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCisKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKKyAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKKyAgICAgICAgICAgICAKKworICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAorICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCisgICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCisgICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCisKKyAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAorICAgICAgICAKK0ZpbmRNVlByZWQKKworICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KKyAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKKyAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCisKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCisgICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgorICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCisgICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCisgICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKKworICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKKyAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjaworICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCisgICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAorICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4CisgICAgICAgCisgICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCisgICAgICAgCisgICAgICAgCisgICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKKyAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKKyAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQorCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKKyAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCisgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCisgICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KKworICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAorCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgorICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5CisgICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5CisgICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93CisgICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCisgICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKKyAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgorCisgICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCisKKworICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCisgICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KKyAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIAorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQorICAgICAgIAorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKKworICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgCitFeGl0RXJyb3IKKworICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKyAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisKK0V4aXRPSyAgICAgICAgICAgICAKKworICAgICAgIE1fRU5ECisgICAgICAgRU5ESUYKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjA4YzIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCkBAIC0wLDAgKzEsMTMyIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlciBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CisKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSB0aGUgVkxDLFppZ3phZyxMTUFYIGFuZCBSTUFYIHRhYmxlcworICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcixyMTIKKworICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICA7Ly8gTG9hZCB6aWd6YWcgdGFibGUKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjayB0byBwYXNzIGFzIGFyZ3VtZW50IHRvIHVuc2FmZSBmdW5jdGlvbgorICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBWTEMgdGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIG9wdGltaXplZCBWTEMgdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIExNQVggVGFibGVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBSTUFYIFRhYmxlcworICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc2V0IHN0YXJ0PTAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIFJNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICAgICAgICAgIAorCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgOy8vIGNhbGwgVW5zYWZlIEZ1bmN0aW9uIGZvciBWTEMgWmlnemFnIERlY29kaW5nCisgICAgICAgICAKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhMzdlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwpAQCAtMCwwICsxLDEzNiBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKKyAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgorICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgICAgICAgCisKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKKworICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KKworCisKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc4YWFmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCkBAIC0wLDAgKzEsMjI0IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAKKyAgICAgIAorCisKKyAgICAgIElGIENvcnRleEE4CisKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCisgICAgICAgIAorCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorUHJlZERpciAgICAgICAgICAgICAgUk4gMworc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwordmlkZW9Db21wICAgICAgICAgICAgUk4gNQorOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAorcERDQ2hyb21hSW5kZXggICAgICAgUk4gNworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgorcG93T2ZTaXplICAgICAgICAgICAgUk4gNwordGVtcDEgICAgICAgICAgICAgICAgUk4gNQorCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0RDVmFsICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0CisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCisgICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCisKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCisKKyAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCisKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQorCisgICAgCisgICAgICAgCisKK0RlY29kZURDCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAorICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCisgICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKKyAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCisgICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCisKK0NoZWNrRENWYWx1ZVNpemUKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAorCisgICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQorCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICAKKworICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50CisKK0FDRGVjb2RlCisKKyAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCisgICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjaworICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKKyAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgorCisgICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjaworICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgICAgICAgIAorICAgICAgICAgICAgICAKKworRXhpdEVycm9yCisgCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKK0V4aXRPSworICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhZjcxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCkBAIC0wLDAgKzEsMTk0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKKzsvLworICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1WQ0NPTU1fcy5oCisKKyAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElGIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQorICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCisgICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCitwU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKK3BTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQorcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCitwU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKK3BEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAorcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1CitpQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0CitDYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCisKK3BDYW5kTVYxICAgICAgICAgICAgICAgUk4gNworcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4CitwQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKKworQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAorQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAorQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCitDYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKK0NhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKK0NhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKKwordGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAorCit6ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0CityZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKKyAgICAgICAgCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFpbiByb3V0aW5lCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAorCisgICAgICAgIE1fQUxMT0M0IE1WLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0CisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAorICAgICAgICBNX0FSRyAgIEJsaywgNAorICAgICAgICAKKyAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgorICAgICAgICBNT1YgICB6ZXJvLCAjMAorICAgICAgICBNX0xEUiBpQmxrLCBCbGsKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCisgICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKKyAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKKyAgICAKKyAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KKworICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKKyAgICAgICAgTV9TV0lUQ0ggaUJsaworICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorT01YVkNCbGswCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0CisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAorCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4CisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMworICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgIAorICAgICAgICBCICAgICBCbGtFbmQKKyAgICAKK09NWFZDQmxrMQorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgorICAgIAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQorICAgICAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazMKKyAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKKyAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAorICAgIAorQmxrRW5kCisKKyAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybworICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5CisgICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKKyAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCisgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQorCisgICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQorICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KKyAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCisKKyAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAorCisgICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKKyAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKKworICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KKyAgICAgICAgICAgCisgICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCisKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKKworICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAorICAgIAorICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgorICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCisKKyAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAKKyAgICAgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVlM2QwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKQEAgLTAsMCArMSw3MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCis7Ly8KKyAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9JRENUX3MuaCAgICAgICAgCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtQ09NTV9JRENUUHJlU2NhbGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBGdW5jdGlvbiBwcm90b3R5cGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAgICAgT01YUmVzdWx0CisgICAgICAgIDsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsoY29uc3QgT01YX1MxNiogcFNyYywKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiogcERzdCkKKyAgICAgICAgOy8vICAgIAorICAgICAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0CisgICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0CisgICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAorICAgIEVORElGCisgICAgCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExLCBkMTUKKyAgICBFTkRJRgorICAgICAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3BEc3QgICAgICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1Jlc3VsdCAgICAgICAgICBSTiAwCisKKzsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAorOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCis7Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKKzsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCis7Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworcFNyYyAgICBSTiAwICAgIAorU3RyaWRlICBSTiAxICAgIAorcERlc3QgICBSTiAyICAgIAorcFNjYWxlICBSTiAzICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAorICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCisgICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQgICAgICAgCisgICAgRU5ESUYgIAorICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDAwZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCkBAIC0wLDAgKzEsNDQ0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLworOy8vCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKyAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKworICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIEFSTTExMzZKUyBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQ29ydGV4QTggaW1wbGVtZW50YXRpb24KKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBJRiAgQ29ydGV4QTgKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNQUNSTyBERUZJTklUSU9OUworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIEp1c3QgY29waWVzIGEgYmxvY2sgZnJvbSBwU3JjIHRvIHBEc3QKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czogTm9uZQorICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKK0Nhc2VJbnRlZ2VyUGl4ZWxfUm5kMAorQ2FzZUludGVnZXJQaXhlbF9SbmQxCisKKyAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MywgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwU3JjXSwgc3JjU3RlcAorCisgICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSGFsZlBpeGVsWCIgcHJlZGljdFR5cGUuIFRoZSB0d28gCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgIiRybmRWYWwiLiBBdmVyYWdlcyBiZXR3ZWVuCisgICAgOy8vIGEgcGl4ZWwgYW5kIHBpeGVsIHJpZ2h0IHRvIGl0LCByb3VuZGluZyBpdCBiYXNlZCBvbiAkcm5kVmFsLiBUaGUgCisgICAgOy8vIHJvdW5kaW5nIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIG9wQ29kZSBzd2l0Y2hpbmcgYmV0d2VlbiAiVlJIQUREIiBhbmQgCisgICAgOy8vICJWSEFERCIgaW5zdHJ1Y3Rpb25zLgorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOiAKKyAgICA7Ly8gICAgICRybmRWYWw6IDAgZm9yIHJvdW5kaW5nIGFuZCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwKKworICAgIExDTFMgTV9WSEFERFIKKyAgICBJRiAkcm5kVmFsID0gMAorTV9WSEFERFIgU0VUUyAiVlJIQUREIgorICAgIEVMU0UKK01fVkhBRERSIFNFVFMgIlZIQUREIgorICAgIEVORElGCisKK0Nhc2VIYWxmUGl4ZWxYX1JuZCRybmRWYWwKKworICAgIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MSwgZFJvdzFTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzFTaGZ0LCBkUm93MSwgZFJvdzFTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MiwgZFJvdzJTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzJTaGZ0LCBkUm93MiwgZFJvdzJTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MywgZFJvdzNTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzNTaGZ0LCBkUm93MywgZFJvdzNTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NCwgZFJvdzRTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzRTaGZ0LCBkUm93NCwgZFJvdzRTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzVTaGZ0LCBkUm93NSwgZFJvdzVTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NiwgZFJvdzZTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NywgZFJvdzdTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzdTaGZ0LCBkUm93NywgZFJvdzdTaGZ0LCAjMQorICAgICRNX1ZIQUREUiAgIGRSb3cwLCBkUm93MCwgZFJvdzBTaGZ0CisgICAgJE1fVkhBRERSICAgZFJvdzEsIGRSb3cxLCBkUm93MVNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzIsIGRSb3cyLCBkUm93MlNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93M1NoZnQKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzQsIGRSb3c0LCBkUm93NFNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzUsIGRSb3c1LCBkUm93NVNoZnQKKyAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NlNoZnQKKyAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzcsIGRSb3c3LCBkUm93N1NoZnQKKyAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIAorICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSGFsZlBpeGVsWSIgcHJlZGljdFR5cGUuIFRoZSB0d28gCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgIiRybmRWYWwiLiBBdmVyYWdlcyBiZXR3ZWVuCisgICAgOy8vIGEgcGl4ZWwgYW5kIHBpeGVsIGJlbG93IGl0LCByb3VuZGluZyBpdCBiYXNlZCBvbiAkcm5kVmFsLiBUaGUgCisgICAgOy8vIHJvdW5kaW5nIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIG9wQ29kZSBzd2l0Y2hpbmcgYmV0d2VlbiAiVlJIQUREIiBhbmQgCisgICAgOy8vICJWSEFERCIgaW5zdHJ1Y3Rpb25zLgorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOiAKKyAgICA7Ly8gICAgICRybmRWYWw6IDAgZm9yIHJvdW5kaW5nIGFuZCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwKKworICAgIExDTFMgTV9WSEFERFIKKyAgICBJRiAkcm5kVmFsID0gMAorTV9WSEFERFIgU0VUUyAiVlJIQUREIgorICAgIEVMU0UKK01fVkhBRERSIFNFVFMgIlZIQUREIgorICAgIEVORElGCisKK0Nhc2VIYWxmUGl4ZWxZX1JuZCRybmRWYWwKKyAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MywgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwU3JjXSwgc3JjU3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3cwLCBkUm93MCwgZFJvdzEKKyAgICBWTEQxICAgICAgICBkUm93OCwgW3BTcmNdLCBzcmNTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzEsIGRSb3cxLCBkUm93MgorICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3czCisgICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3czLCBkUm93MywgZFJvdzQKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzQsIGRSb3c0LCBkUm93NQorICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c2CisgICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3c2LCBkUm93NiwgZFJvdzcKKyAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzcsIGRSb3c3LCBkUm93OAorICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIERvZXMgaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUuIEJvdGggCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkLiAKKyAgICA7Ly8gVHlwaWNhbCBjb21wdXRhdGlvbiBmb3IgYSByb3cgZ29lcyBsaWtlIHRoaXMKKyAgICA7Ly8gICAgIDEuIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwIDsvLyBMb2FkIHRoZSByb3cgYW5kIG5leHQgOCBieXRlcworICAgIDsvLyAgICAgMi4gVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMSAgICAgOy8vIEdlbmVyYXRlIHRoZSBzaGlmdGVkIHJvdworICAgIDsvLyAgICAgMy4gVkFEREwgICAgICAgcVN1bTAsIGRSb3cwLCBkUm93MFNoZnQgICAgICAgICAgICAgOy8vIEdlbmVyYXRlIHRoZSBzdW0gb2Ygcm93IGFuZCBzaGlmdGVkIHJvdworICAgIDsvLyAgICAgNS4gVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMSAgICAgICAgICAgICAgICAgOy8vIEFkZCB0byB0aGUgc3VtIG9mIG5leHQgcm93IChvZGQgcm93IHN1bSBoYXMgcm91bmRpbmcgdmFsdWUgYWRkZWQgdG8gaXQpCisgICAgOy8vICAgICA2LiBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyICAgICAgICAgICAgICAgICAgICA7Ly8gRGl2aWRlIGJ5IDQKKyAgICA7Ly8gICAgIDcuIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAgICAgICAgICAgIDsvLyBTdG9yZQorICAgIDsvLyBPZGQgcm93cyB1bmRlcmdvIGZvbGxvd2luZyBjb21wdXRhdGlvbiBhZnRlciBzdGVwIDMKKyAgICA7Ly8gICAgIDQuIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCisgICAgOy8vIFRoaXMgc2F2ZXMgZm9yIGFkZGluZyByb3VuZGluZyB2YWx1ZSB0byBlYWNoIGZpbmFsIHN1bSAob3ZlcmFsbCBzYXZlcyA0IAorICAgIDsvLyBpbnN0cnVjdGlvbnMpLgorICAgIDsvLyBUaGVyZSBpcyByZXVzZSBvZiByZWdpc3RlcnMgZm9yIHFTdW02LCBxU3VtNyAmIHFTdW04LiBPdmVyYWxsIHNjaGVkdWxpbmcgdGFrZXMgCisgICAgOy8vIGNhcmUgb2YgdGhpcyBhbmQgYWxzbyBtaW5pbWl6ZXMgc3RhbGxzLiBSb3VuZGluZyB2YWx1ZSB3YXMgbW9kaWZpZWQgaW4gCisgICAgOy8vIEFSTSByZWdpc3RlciBybmRWYWwgKG9yaWdpbmFsbHkgdXNlZCBmb3Igcm91bmRpbmcgZmxhZykgYmVmb3JlIHRoZSBzd2l0Y2guCisgICAgOy8vIEl0IGlzIHRoZW4gcG9wdWxhdGVkIGludG8gYWxsIGxhbmVzIGluIHRoaXMgbWFjcm8uIE5vIGJyYW5jaGluZyBvdXQgdG8gCisgICAgOy8vIGxhYmVsICJTd2l0Y2hQcmVkaWN0VHlwZUVuZCIgaXMgcmVxdWlyZWQgaW4gdGhlIGVuZCBvZiB0aGUgbWFjcm8gYXMgdGhlc2UgCisgICAgOy8vIGFyZSB0aGUgbGFzdCBvZiBzd2l0Y2ggY2FzZXMuCisgICAgOy8vIAorICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6IE5vbmUKKyAgICA7Ly8gT3V0cHV0czogTm9uZQorCisgICAgTUFDUk8gCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKKworQ2FzZUhhbGZQaXhlbFhZX1JuZDAKK0Nhc2VIYWxmUGl4ZWxYWV9SbmQxCisgICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRFVQICAgICAgICBxUm91bmQsIHJuZFZhbAorICAgIFZMRDEgICAgICAgIHtkUm93MSwgZFJvdzFTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MiwgZFJvdzJTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzFTaGZ0LCBkUm93MSwgZFJvdzFTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MywgZFJvdzNTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzJTaGZ0LCBkUm93MiwgZFJvdzJTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NCwgZFJvdzRTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkFEREwgICAgICAgcVN1bTAsIGRSb3cwLCBkUm93MFNoZnQKKyAgICBWTEQxICAgICAgICB7ZFJvdzUsIGRSb3c1U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZBRERMICAgICAgIHFTdW0xLCBkUm93MSwgZFJvdzFTaGZ0CisgICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c4LCBkUm93OFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFSb3VuZAorICAgIFZBRERMICAgICAgIHFTdW0yLCBkUm93MiwgZFJvdzJTaGZ0CisgICAgVkVYVCAgICAgICAgZFJvdzVTaGZ0LCBkUm93NSwgZFJvdzVTaGZ0LCAjMQorICAgIFZBREQgICAgICAgIHFTdW0wLCBxU3VtMCwgcVN1bTEKKyAgICBWQURETCAgICAgICBxU3VtMywgZFJvdzMsIGRSb3czU2hmdAorICAgIFZFWFQgICAgICAgIGRSb3c2U2hmdCwgZFJvdzYsIGRSb3c2U2hmdCwgIzEKKyAgICBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFTdW0yCisgICAgVlNIUk4gICAgICAgZFJvdzAsIHFTdW0wLCAjMgorICAgIFZBRERMICAgICAgIHFTdW00LCBkUm93NCwgZFJvdzRTaGZ0CisgICAgVlNIUk4gICAgICAgZFJvdzEsIHFTdW0xLCAjMgorICAgIFZBREQgICAgICAgIHFTdW0zLCBxU3VtMywgcVJvdW5kCisgICAgVkFEREwgICAgICAgcVN1bTUsIGRSb3c1LCBkUm93NVNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzdTaGZ0LCBkUm93NywgZFJvdzdTaGZ0LCAjMQorICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWRVhUICAgICAgICBkUm93OFNoZnQsIGRSb3c4LCBkUm93OFNoZnQsICMxCisgICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxUm91bmQKKyAgICBWQUREICAgICAgICBxU3VtMiwgcVN1bTIsIHFTdW0zCisgICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxU3VtNAorICAgIFZBREQgICAgICAgIHFTdW00LCBxU3VtNCwgcVN1bTUKKyAgICBWU0hSTiAgICAgICBkUm93MiwgcVN1bTIsICMyCisgICAgVlNIUk4gICAgICAgZFJvdzMsIHFTdW0zLCAjMgorICAgIFZTSFJOICAgICAgIGRSb3c0LCBxU3VtNCwgIzIKKyAgICBWQURETCAgICAgICBxU3VtNiwgZFJvdzYsIGRSb3c2U2hmdAorICAgIFZBRERMICAgICAgIHFTdW03LCBkUm93NywgZFJvdzdTaGZ0CisgICAgVlNUMSAgICAgICAgZFJvdzIsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZBRERMICAgICAgIHFTdW04LCBkUm93OCwgZFJvdzhTaGZ0CisgICAgVkFERCAgICAgICAgcVN1bTcsIHFTdW03LCBxUm91bmQKKyAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZBREQgICAgICAgIHFTdW01LCBxU3VtNSwgcVN1bTYKKyAgICBWQUREICAgICAgICBxU3VtNiwgcVN1bTYsIHFTdW03CisgICAgVkFERCAgICAgICAgcVN1bTcsIHFTdW03LCBxU3VtOAorICAgIFZTSFJOICAgICAgIGRSb3c1LCBxU3VtNSwgIzIKKyAgICBWU0hSTiAgICAgICBkUm93NiwgcVN1bTYsICMyCisgICAgVlNIUk4gICAgICAgZFJvdzcsIHFTdW03LCAjMgorICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAorCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7Ly8gSW5wdXQvT3V0cHV0IFJlZ2lzdGVycworcFNyYyAgICAgICAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICAgICAgICBSTiAxCitwU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMgorcERzdCAgICAgICAgICAgICAgICAgIFJOIDMKK2RzdFN0ZXAgICAgICAgICAgICAgICBSTiA0CitwcmVkaWN0VHlwZSAgICAgICAgICAgUk4gNQorcm5kVmFsICAgICAgICAgICAgICAgIFJOIDYKKworOy8vIExvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwRHN0Q29weSAgICAgICAgICAgICAgUk4gMAorcmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKKworOy8vIE5lb24gUmVnaXN0ZXJzCitkUm93MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKK2RSb3cwU2hmdCAgICAgICAgICAgICBETiBEMS5VOAorZFJvdzEgICAgICAgICAgICAgICAgIEROIEQyLlU4CitkUm93MVNoZnQgICAgICAgICAgICAgRE4gRDMuVTgKK2RSb3cyICAgICAgICAgICAgICAgICBETiBENC5VOAorZFJvdzJTaGZ0ICAgICAgICAgICAgIEROIEQ1LlU4CitkUm93MyAgICAgICAgICAgICAgICAgRE4gRDYuVTgKK2RSb3czU2hmdCAgICAgICAgICAgICBETiBENy5VOAorZFJvdzQgICAgICAgICAgICAgICAgIEROIEQ4LlU4CitkUm93NFNoZnQgICAgICAgICAgICAgRE4gRDkuVTgKK2RSb3c1ICAgICAgICAgICAgICAgICBETiBEMTAuVTgKK2RSb3c1U2hmdCAgICAgICAgICAgICBETiBEMTEuVTgKK2RSb3c2ICAgICAgICAgICAgICAgICBETiBEMTIuVTgKK2RSb3c2U2hmdCAgICAgICAgICAgICBETiBEMTMuVTgKK2RSb3c3ICAgICAgICAgICAgICAgICBETiBEMTQuVTgKK2RSb3c3U2hmdCAgICAgICAgICAgICBETiBEMTUuVTgKK2RSb3c4ICAgICAgICAgICAgICAgICBETiBEMTYuVTgKK2RSb3c4U2hmdCAgICAgICAgICAgICBETiBEMTcuVTgKKworCitxU3VtMCAgICAgICAgICAgICAgICAgUU4gUTkuVTE2CitxU3VtMSAgICAgICAgICAgICAgICAgUU4gUTEwLlUxNgorcVN1bTIgICAgICAgICAgICAgICAgIFFOIFExMS5VMTYKK3FTdW0zICAgICAgICAgICAgICAgICBRTiBRMTIuVTE2CitxU3VtNCAgICAgICAgICAgICAgICAgUU4gUTEzLlUxNgorcVN1bTUgICAgICAgICAgICAgICAgIFFOIFExNC5VMTYKK3FTdW02ICAgICAgICAgICAgICAgICBRTiBRMC5VMTYKK3FTdW03ICAgICAgICAgICAgICAgICBRTiBRMS5VMTYKK3FTdW04ICAgICAgICAgICAgICAgICBRTiBRMi5VMTYKKworcVJvdW5kICAgICAgICAgICAgICAgIFFOIFExNS5VMTYKKworZERzdDAgICAgICAgICAgICAgICAgIEROIEQwLlU4CitkRHN0MSAgICAgICAgICAgICAgICAgRE4gRDEuVTgKK2REc3QyICAgICAgICAgICAgICAgICBETiBEMi5VOAorZERzdDMgICAgICAgICAgICAgICAgIEROIEQzLlU4CitkRHN0NCAgICAgICAgICAgICAgICAgRE4gRDQuVTgKK2REc3Q1ICAgICAgICAgICAgICAgICBETiBENS5VOAorZERzdDYgICAgICAgICAgICAgICAgIEROIEQ2LlU4CitkRHN0NyAgICAgICAgICAgICAgICAgRE4gRDcuVTgKKworcVJlczAgICAgICAgICAgICAgICAgIFFOIFE0LlMxNgorcVJlczEgICAgICAgICAgICAgICAgIFFOIFE1LlMxNgorcVJlczIgICAgICAgICAgICAgICAgIFFOIFE2LlMxNgorcVJlczMgICAgICAgICAgICAgICAgIFFOIFE3LlMxNgorcVJlczQgICAgICAgICAgICAgICAgIFFOIFE4LlMxNgorcVJlczUgICAgICAgICAgICAgICAgIFFOIFE5LlMxNgorcVJlczYgICAgICAgICAgICAgICAgIFFOIFExMC5TMTYKK3FSZXM3ICAgICAgICAgICAgICAgICBRTiBRMTEuUzE2CisKKyAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgTV9TVEFSVCAgICAgb214VkNNNFAyX01DUmVjb25CbG9jaywgcjYsIGQxNQorICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0CisgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAorICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKKyAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKKyAgICBBREQgICAgICAgICBwcmVkaWN0VHlwZSwgcm5kVmFsLCBwcmVkaWN0VHlwZSwgTFNMICMxCisgICAgUlNCICAgICAgICAgcm5kVmFsLCBybmRWYWwsICMyICAgICAgICAgICAgICA7Ly8gcHJlcGFyaW5nIHJuZFZhbCBmb3IgSGFsZlBpeGVsWFkKKyAgICAKKyAgICA7Ly8gVGhlIGZvbGxvd2luZyBpcyBpbXBsZW1lbnRhdGlvbiBvZiBzd2l0Y2hpbmcgdG8gZGlmZmVyZW50IGNvZGUgc2VnbWVudHMKKyAgICA7Ly8gYmFzZWQgb24gZGlmZmVyZW50IHByZWRpY3RUeXBlIGFuZCBybmRWYWwgZmxhZ3MuIFRoZSBjb3JyZXNwb25kaW5nIAorICAgIDsvLyBsYWJlbHMgKGUuZy4gQ2FzZUludGVnZXJQaXhlbF9SbmQwKSBhcmUgZW1iZWRkZWQgaW4gdGhlIG1hY3JvcyBmb2xsb3dpbmcKKyAgICA7Ly8gTV9FTkRTV0lUQ0ggKGUuZy4gTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsKS4gV2hpbGUgIk1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCIgCisgICAgOy8vIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkiIGhhbmRsZSBmb3IgYm90aCByb3VuZGluZyBjYXNlczsgCisgICAgOy8vICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYIiBhbmQgIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkiIG1hY3JvcyBoYW5kbGUgCisgICAgOy8vIHRoZSB0d28gcm91bmRpbmcgY2FzZXMgaW4gc2VwYXJhdGUgY29kZSBiYXNlcy4KKyAgICA7Ly8gQWxsIHRoZXNlIHRvZ2V0aGVyIGltcGxlbWVudCB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbmFsaXR5CisgICAgCisgICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VJbnRlZ2VyUGl4ZWxfUm5kMQorICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWF9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDEKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFlfUm5kMAorICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYWV9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYWV9SbmQxCisgICAgTV9FTkRTV0lUQ0gKKworICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggMAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggMQorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgMAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgMQorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCitTd2l0Y2hQcmVkaWN0VHlwZUVuZAorCisgICAgOy8vIEFmdGVyIGludGVycG9sYXRpb24gaXMgZG9uZSwgcmVzaWR1ZSBuZWVkcyB0byBiZSBhZGRlZC4gVGhpcyBpcyBkb25lIAorICAgIDsvLyBvbmx5IGluIGNhc2UgInBTcmNSZXNpZHVlIiBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uIGlzIG5vdCBOVUxMLgorICAgIDsvLyBGb2xsb3dpbmcgaXMgYSBjb21wbGV0ZWx5IHVucm9sbGVkIGNvZGUgdG8gZG8gc28uIEVhY2ggcm93IGFuZCAKKyAgICA7Ly8gY29ycmVzcG9uZGluZyByZXNpZHVlIGlzIGxvYWRlZCBhbmQgcmVzaWR1ZSBpcyBhZGRlZCBhbmQgdmFsdWUgCisgICAgOy8vIHN0b3JlZAorICAgIAorICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAorICAgIFNVQk5FICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMyAgICAgOy8vIFJlc3RvcmluZyBwRHN0CisgICAgTU9WTkUgICAgICAgcERzdENvcHksIHBEc3QKKyAgICBCRVEgICAgICAgICBwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAorcFNyY1Jlc2lkdWVOb3ROdWxsICAgIAorICAgIFZMRDEgICAgICAgIGREc3QwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWTEQxICAgICAgICBxUmVzMCwgW3BTcmNSZXNpZHVlQDEyOF0hCisgICAgVkxEMSAgICAgICAgZERzdDEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZMRDEgICAgICAgIHFSZXMxLCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWTEQxICAgICAgICBkRHN0MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkxEMSAgICAgICAgcVJlczIsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXMwLCBxUmVzMCwgZERzdDAKKyAgICBWTEQxICAgICAgICBkRHN0MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkFERFcgICAgICAgcVJlczEsIHFSZXMxLCBkRHN0MQorICAgIFZMRDEgICAgICAgIHFSZXMzLCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzMiwgcVJlczIsIGREc3QyCisgICAgVkxEMSAgICAgICAgZERzdDQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QwLCBxUmVzMAorICAgIFZMRDEgICAgICAgIHFSZXM0LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzMywgcVJlczMsIGREc3QzCisgICAgVkxEMSAgICAgICAgZERzdDUsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QxLCBxUmVzMQorICAgIFZMRDEgICAgICAgIHFSZXM1LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzNCwgcVJlczQsIGREc3Q0CisgICAgVkxEMSAgICAgICAgZERzdDYsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QyLCBxUmVzMgorICAgIFZMRDEgICAgICAgIHFSZXM2LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzNSwgcVJlczUsIGREc3Q1CisgICAgVkxEMSAgICAgICAgZERzdDcsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QzLCBxUmVzMworICAgIFZMRDEgICAgICAgIHFSZXM3LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzNiwgcVJlczYsIGREc3Q2CisgICAgVlNUMSAgICAgICAgZERzdDAsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWUU1PVlVOICAgICBkRHN0NCwgcVJlczQKKyAgICBWU1QxICAgICAgICBkRHN0MSwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZBRERXICAgICAgIHFSZXM3LCBxUmVzNywgZERzdDcKKyAgICBWU1QxICAgICAgICBkRHN0MiwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3Q1LCBxUmVzNQorICAgIFZTVDEgICAgICAgIGREc3QzLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDYsIHFSZXM2CisgICAgVlNUMSAgICAgICAgZERzdDQsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWUU1PVlVOICAgICBkRHN0NywgcVJlczcKKyAgICBWU1QxICAgICAgICBkRHN0NSwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGREc3Q2LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZERzdDcsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICAKK3BTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCisgICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICBFTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBvbXhWQ000UDJfTUNSZWNvbkJsb2NrIGVuZHMKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNzNmNjRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCkBAIC0wLDAgKzEsMzIwIEBACis7ICoqKioqKioqKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICogRGVzY3JpcHRpb246Cis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCis7ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKzsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCis7ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KKzsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCis7ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAorOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCis7ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKzsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCis7ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKzsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKzsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCis7ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCis7ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCis7ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCis7ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCis7ICogICA0LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqKioqKioqKioKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgIAorICAgICAgICAgICAgIAorCisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNgorICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICAgCisgICAgICAgIElGIENvcnRleEE4Cis7Ly8gSW5wdXQgQXJndW1lbnRzCisKK3BTcmNEc3QgICAgICAgICAgUk4gMAorcFByZWRCdWZSb3cgICAgICBSTiAxCitwUHJlZEJ1ZkNvbCAgICAgIFJOIDIKK2N1clFQICAgICAgICAgICAgUk4gMworUVAgICAgICAgICAgICAgICBSTiAzCitwcmVkUVAgICAgICAgICAgIFJOIDQKK3ByZWREaXIgICAgICAgICAgUk4gNQorQUNQcmVkRmxhZyAgICAgICBSTiA2Cit2aWRlb0NvbXAgICAgICAgIFJOIDcKKworOy8vIExvY2FsIFZhcmlhYmxlcworCitzaG9ydFZpZGVvSGVhZGVyIFJOIDQKK2RjU2NhbGVyICAgICAgICAgUk4gNAoraW5kZXggICAgICAgICAgICBSTiA2CitwcmVkQ29lZmZUYWJsZSAgIFJOIDcKK3RlbXAxICAgICAgICAgICAgUk4gNgordGVtcDIgICAgICAgICAgICBSTiA5Cit0ZW1wICAgICAgICAgICAgIFJOIDE0CitDb25zdCAgICAgICAgICAgIFJOIDgKK3RlbXBwUHJlZENvbEJ1ZiAgUk4gOAordGVtcFByZWQgICAgICAgICBSTiA5CisKK2Fic0NvZWZmREMgICAgICAgUk4gOAorbmVnZGNTY2FsZXIgICAgICBSTiAxMAorUmVtICAgICAgICAgICAgICBSTiAxMQordGVtcDMgICAgICAgICAgICBSTiAxMgorCitkY1Jvd2J1ZkNvZWZmICAgIFJOIDEwCitkY0NvbEJ1ZmZDb2VmZiAgIFJOIDExCitSZXR1cm4gICAgICAgICAgIFJOIDAKKworOy8vTkVPTiBSZWdpc3RlcnMKKworcVByZWRSb3dCdWYgICAgICAgUU4gUTAuUzE2CitkUHJlZFJvd0J1ZjAgICAgICBETiBEMC5TMTYKK2RQcmVkUm93QnVmMSAgICAgIEROIEQxLlMxNgorCisKKworCitxQ29lZmZUYWIgICAgICAgICBRTiBRMS5TMzIKKworcVByZWRRUCAgICAgICAgICAgUU4gUTIuUzE2CitkUHJlZFFQMCAgICAgICAgICBETiBENC5TMTYKK2RQcmVkUVAxICAgICAgICAgIEROIEQ1LlMxNgorCisKK3F0ZW1wMSAgICAgICAgICAgIFFOIFEzLlMzMgorcXRlbXAgICAgICAgICAgICAgUU4gUTMuUzE2CisKK2R0ZW1wMCAgICAgICAgICAgIEROIEQ2LlMxNgorZHRlbXAxICAgICAgICAgICAgRE4gRDcuUzE2CisKK2R0ZW1wMiAgICAgICAgICAgIEROIEQ4LlMxNgorZHRlbXAzICAgICAgICAgICAgRE4gRDkuUzE2CisKK2R0ZW1wNCAgICAgICAgICAgIEROIEQyLlMxNgorZHRlbXA1ICAgICAgICAgICAgRE4gRDMuUzE2CitkdGVtcDYgICAgICAgICAgICBETiBENC5TMTYKK2R0ZW1wNyAgICAgICAgICAgIEROIEQ1LlMxNgorIAorcXRlbXBQcmVkMSAgICAgICAgUU4gUTUuUzMyCitxdGVtcFByZWQgICAgICAgICBRTiBRNS5TMTYKKworZHRlbXBQcmVkMCAgICAgICAgRE4gRDEwLlMxNgorZHRlbXBQcmVkMSAgICAgICAgRE4gRDExLlMxNgorIAorICAKKworICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjExLGQxMQorCisgICAgICA7Ly8gQXNzaWduaW5nIHBvaW50ZXJzIHRvIElucHV0IGFyZ3VtZW50cyBvbiBTdGFjaworICAgIAorICAgICAgTV9BUkcgICAgICAgICAgIHByZWRRUG9uU3RhY2ssNCAgCisgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAorICAgICAgTV9BUkcgICAgICAgICAgIEFDUHJlZEZsYWdvblN0YWNrLDQKKyAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvblN0YWNrLDQKKyAgICAgIAorICAgICAgOy8vIERDIFByZWRpY3Rpb24KKworICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvblN0YWNrICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmlkZW9Db21wIEZyb20gU3RhY2sgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgTV9MRFIgICAgICAgICAgIHByZWREaXIscHJlZERpcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUHJlZGljdGlvbiBkaXJlY3Rpb24KKyAgICAgIDsvLyBEQyBTY2FsZXIgY2FsY3VsYXRpb24gICAKKyAgICAgIExEUiAgICAgICAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgQUREICAgICAgICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKKyAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisKKyAgICAgICAKKyAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAorICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAorCisgICAgICA7Ly8gQ2F1bHVjYXRlIHRlbXBQcmVkCisgICAgICAgICAgICAKKyAgICAgIExEUkVRU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB2ZXRpY2FsIGxvYWQgdGhlIGNvZWZmIGZyb20gUm93IFByZWRpY3Rpb24gQnVmZmVyCisgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgorICAgICAgCisgICAgICBSU0IgICAgICAgICAgICAgbmVnZGNTY2FsZXIsZGNTY2FsZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmVnZGNTY2FsZXI9LWRjU2NhbGVyICAgCisgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgUHJlZGljdGlvbiBjb2VmZiB0byB0ZW1wIGZvciBjb21wYXJpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBhYnNvbHV0ZSB2YWwgb2YgcHJlZGljdGlvbiBjb2VmZgorICAgICAgCisgICAgICBBREQgICAgICAgICAgICAgdGVtcCxkY1NjYWxlcixkY1NjYWxlcgorICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3ByZWRDb2VmZlRhYmxlLHRlbXBdICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmFsdWUgZnJvbSBjb2VmZiB0YWJsZSBmb3IgcGVyZm9ybWluZyBkaXZpc2lvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgorICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBwZWQ9cFByZWRCdWZSb3coQ29sKVswXSozMjc2Ny9kY1NjYWxlcgorICAgICAgQUREICAgICAgICAgICAgIHRlbXAzLGRjU2NhbGVyLCMxCisgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcHBlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdL2RjU2NhbGVyICAgICAgICAgICAgICAgICAgCisgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikgICAgICAgICAgIAorICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdkY1NjYWxlcix0ZW1wUHJlZCxhYnNDb2VmZkRDICAgICAgICAgICAgOy8vIFJlbWFpbmRlciBSZW09YWJzKHBQcmVkQnVmUm93KENvbClbMF0pLXRlbXBQcmVkKmRjU2NhbGVyCisgICAgICAKKyAgICAgIExEUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAKKyAgICAgIAorICAgICAgQ01QICAgICAgICAgICAgIFJlbSx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgUmVtIHdpdGggKGRjU2NhbGVyLzIpCisgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PShkY1NjYWxlci8yKQorICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9LXRlbXBQcmVkIGlmIAorICAgICAgIAorICAgICAgU1RSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCisgICAgICAgCisKKyAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0KKyAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0rdGVtcFByZWQKKyAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBTTVVMQkIgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCisgICAgICBNX0xEUiAgICAgICAgICAgQUNQcmVkRmxhZyxBQ1ByZWRGbGFnb25TdGFjaworICAgICAgU1RSSCAgICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLFtwUHJlZEJ1ZkNvbF0gICAgICAKKyAgICAgIAorCisgICAgICAgOy8vIEFDIFByZWRpY3Rpb24KKyAgICAgIAorICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCisgICAgICAKKyAgICAgIENNUCAgICAgICAgICAgICBBQ1ByZWRGbGFnLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgQUMgcHJlZGljdGlvbiBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgIEJORSAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBub3Qgc2V0IEV4aXQKKyAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAweDFmZmZmLygxIHRvIDYzKSAKKyAgICAgIE1PViAgICAgICAgICAgICBDb25zdCwjNAorICAgICAgTVVMICAgICAgICAgICAgIGN1clFQLGN1clFQLENvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPTQqY3VyUVAKKyAgICAgIFZEVVAgICAgICAgICAgICBkUHJlZFFQMCxwcmVkUVAKKyAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMixbcHJlZENvZWZmVGFibGUsY3VyUVBdICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPTB4MWZmZmYvY3VyUVAKKyAgICAgIFZEVVAgICAgICAgICAgICBxQ29lZmZUYWIsdGVtcDIKKyAgICAgIEJORSAgICAgICAgICAgICBIb3Jpem9udGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCBicmFuY2ggdG8gSG9yaXpvbnRhbAorICAgICAgCisgICAgIAorICAgICAgCisgICAgICA7Ly8gVmVydGljYWwKKyAgICAgIDsvL0NhbGN1bGF0aW5nIHRlbXBQcmVkCisKKyAgICAgIFZMRDEgICAgICAgICAgICB7ZFByZWRSb3dCdWYwLGRQcmVkUm93QnVmMX0sW3BQcmVkQnVmUm93XSAgICAgIDsvLyBMb2FkaW5nIHBQcmVkQnVmUm93W2ldOmk9MCB0MCA3CisgICAgICAKKyAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYwLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldOiBpPTAgdDAgMworICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTAgdDAgMworICAgICAgCisgICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMSxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSA6IGk9NCB0MCA3ICAgICAgCisKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXS9jdXJRUCkgOiBpPTAgdDAgMworICAgICAgVlNIUk4gICAgICAgICAgIGRQcmVkUVAxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIAorICAgICAgCisgICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9NCB0MCA3CisgICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0vY3VyUVApICA6IGk9NCB0MCA3CisgICAgICBWTEQxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkaW5nIHBTcmNEc3RbaV0gOiBpPTAgdG8gNworICAgICAgVlNIUk4gICAgICAgICAgIGR0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIFZNT1YgICAgICAgICAgICBkdGVtcFByZWQwLGRQcmVkUVAxCisgICAgICAKKyAgICAgIDsvL3VwZGF0aW5nIHNvdXJjZSBhbmQgcm93IHByZWRpY3Rpb24gYnVmZmVyIGNvbnRlbnRzICAgICAgCisgICAgICBWQUREICAgICAgICAgICAgcXRlbXAscXRlbXAscXRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9wU3JjRHN0W2ldPXBTcmNEc3RbaV0rcXRlbXBQcmVkW2ldOiBpPTAgdG8gNyAKKyAgICAgIFZRU0hMICAgICAgICAgICBxdGVtcCxxdGVtcCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBMRFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkaW5nIERjIFZhbHVlIG9mIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcgorICAgICAgVlNIUiAgICAgICAgICAgIHF0ZW1wLHF0ZW1wLCM0CisgICAgICAKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvL3N0b3JpbmcgYmFjayB0aGUgdXBkYXRlZCB2YWx1ZXMgCisgICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICA7Ly9zdG9yaW5nIGJhY2sgdGhlIHVwZGF0ZWQgcm93IHByZWRpY3Rpb24gdmFsdWVzICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgU1RSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JpbmcgdGhlIHVwZGF0ZWQgREMgUm93IFByZWRpY3Rpb24gY29lZmYKKyAgICAgIAorICAgICAgQiAgICAgICAgICAgICAgIEV4aXQKKworSG9yaXpvbnRhbAorCisgICAgICA7Ly8gQ2FsY3VsYXRpbmcgVGVtcHByZWQKKworICAgICAgICAgICAgCisKKyAgICAgIFZMRDEgICAgICAgICAgICB7ZFByZWRSb3dCdWYwLGRQcmVkUm93QnVmMX0sW3BQcmVkQnVmQ29sXSAgICAgIDsvLyBMb2FkaW5nIHBQcmVkQnVmQ29sW2ldOmk9MCB0MCA3CisgICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMCxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXTogaT0wIHQwIDMKKyAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT0wIHQwIDMKKyAgICAgIAorICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjEsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0gOiBpPTQgdDAgNyAgICAgIAorCisgICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0vY3VyUVApIDogaT0wIHQwIDMKKyAgICAgIFZTSFJOICAgICAgICAgICBkUHJlZFFQMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCisgICAgICAKKyAgICAgIAorICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTQgdDAgNworICAgICAgCisgICAgICBNT1YgICAgICAgICAgICAgdGVtcHBQcmVkQ29sQnVmLHBQcmVkQnVmQ29sCisgICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0vY3VyUVApICA6IGk9NCB0MCA3CisgICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3BTcmNEc3RdICAgICAgICA7Ly8gTG9hZGluZyBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKKyAgICAgIFZTSFJOICAgICAgICAgICBkdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCisgICAgICBWTU9WICAgICAgICAgICAgZHRlbXBQcmVkMCxkUHJlZFFQMQorICAgICAgCisgICAgICA7Ly8gVXBkYXRpbmcgc291cmNlIGFuZCBjb2x1bW4gcHJlZGljdGlvbiBidWZmZXIgY29udGVudHMgICAgIAorICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHBTcmNEc3QsIzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0gICAgICAgICAgOy8vIExvYWRpbmcgbmV4dCAxNiBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKKyAgICAgIFZVWlAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbnRlcmxlYXZpbmcgYnkgOAorICAgICAgVkFERCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsZHRlbXBQcmVkMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFkZGluZyB0ZW1wUHJlZCB0byBjb2VmZnMKKyAgICAgIFZRU0hMICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgVlNIUiAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwfSxbcFByZWRCdWZDb2xdISAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGluZyBQcmlkaWN0aW9uIGNvbHVtbiBidWZmZXIKKyAgICAgIFZaSVAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkZWludGVybGVhdmluZworICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFtwU3JjRHN0XSAgICAgICAgOy8vIFVwZGF0aW5nIHNvdXJjZSBjb2VmZnMgICAgICAgICAKKyAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdIQorICAgICAgCisgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsdGVtcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3RlbXAyXSEgICAgICAgICA7Ly8gTG9hZGluZyAgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0CisgICAgICAKKyAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdCisgICAgICBWVVpQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW50ZXJsZWF2aW5nIGJ5IDgKKyAgICAgIFZBREQgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLGR0ZW1wUHJlZDEKKyAgICAgIFZRU0hMICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgVlNIUiAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwfSxbcFByZWRCdWZDb2xdIQorICAgICAgVlpJUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQKKyAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbdGVtcDFdCisgICAgICBTVFJIICAgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsW3RlbXBwUHJlZENvbEJ1Zl0gCisgICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXQorICAgICAgCitFeGl0CisKKyAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XQorICAgICAgICAgIAorIAorICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKKyAKKyAgICAgIE1fRU5ECisgICAgICBFTkRJRgorCisKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDBhZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCkBAIC0wLDAgKzEsMTYyIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCis7ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCis7ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgSUYgQ29ydGV4QTgKKyAgICAgCisgICAgIAorOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKKyAgICAgCisKKzsvL0xvY2FsIFZhcmlhYmxlcworQ291bnQgICAgICAgICAgICAgIFJOIDMKK2RvdWJsZVFQICAgICAgICAgICBSTiA0CitSZXR1cm4gICAgICAgICAgICAgUk4gMAorOy8vIE5lb24gcmVnaXN0ZXJzCisKKworZFFQMTAgICAgICAgICAgICAgIEROIEQwLlMzMlswXQorcVFQMSAgICAgICAgICAgICAgIFFOIFEwLlMzMgorCitkUVAxICAgICAgICAgICAgICAgRE4gRDAuUzE2CitkTWludXNRUDEgICAgICAgICAgRE4gRDEuUzE2CisKK2RDb2VmZjAgICAgICAgICAgICBETiBEMi5TMTYKK2RDb2VmZjEgICAgICAgICAgICBETiBEMy5TMTYgICAKKworcVJlc3VsdDAgICAgICAgICAgIFFOIFEzLlMzMgorZFJlc3VsdDAgICAgICAgICAgIEROIEQ3LlMxNgorcVNpZ24wICAgICAgICAgICAgIFFOIFEzLlMzMgorZFNpZ24wICAgICAgICAgICAgIEROIEQ2LlMxNgorCitxUmVzdWx0MSAgICAgICAgICAgUU4gUTQuUzMyCitkUmVzdWx0MSAgICAgICAgICAgRE4gRDguUzE2CitxU2lnbjEgICAgICAgICAgICAgUU4gUTQuUzMyCitkU2lnbjEgICAgICAgICAgICAgRE4gRDguUzE2CisKK2QyUVAwICAgICAgICAgICAgICBETiBEMTAuUzMyWzBdCitxMlFQMCAgICAgICAgICAgICAgUU4gUTUuUzMyCitkMlFQICAgICAgICAgICAgICAgRE4gRDEwLlMxNgorCitkWmVybzAgICAgICAgICAgICAgRE4gRDExLlMxNgorZFplcm8xICAgICAgICAgICAgIEROIEQxMi5TMTYKK2RDb25zdDAgICAgICAgICAgICBETiBEMTMuUzE2CisKKyAgICAKKyAgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLHI0LGQxMworICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBBREQgICAgICBkb3VibGVRUCxRUCxRUCAgICAgICAgICAgICAgICAgICA7Ly8gZG91YmxlUVA9IDIqUVAKKyAgICAgICAgIFZNT1YgICAgIGQyUVAwLGRvdWJsZVFQCisgICAgICAgICBWRFVQICAgICBxMlFQMCxkMlFQMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTW92ZSBkb3VibGVRUCBpbiB0byBhIHNjYWxhcgorICAgICAgICAgVFNUICAgICAgUVAsIzEgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZCBmaXJzdCA4IHZhbHVlcyB0byBDb2VmZjAsQ29lZmYxCisgICAgICAgICBTVUJFUSAgICBRUCxRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZNT1YgICAgIGRRUDEwLFFQICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBRUCBpcyBldmVuIHRoZW4gUVAxPVFQLTEgZWxzZSBRUDE9UVAgICAgIAorICAgICAgICAgTU9WICAgICAgQ291bnQsIzY0CisgICAgICAgICBWRFVQICAgICBxUVAxLGRRUDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRlIHRlbXBSZXN1bHQgd2l0aCBRUDEKKyAgICAgICAgIFZTSFJOICAgIGQyUVAscTJRUDAsIzAKKyAgICAgICAgIFZFT1IgICAgIGRDb25zdDAsZENvbnN0MCxkQ29uc3QwCisgICAgICAgICBWU0hSTiAgICBkUVAxLHFRUDEsIzAgICAgICAgICAgICAgICAgICAgICA7Ly8gUVAxIHRydW5jYXRlZCB0byAxNiBiaXRzCisgICAgICAgICBWU1VCICAgICBkTWludXNRUDEsZENvbnN0MCxkUVAxICAgICAgICAgICA7Ly8gZE1pbnVzUVAxPS1RUDEKKworTG9vcCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vUGVyZm9ybWluZyBJbnZlcnNlIFF1YW50aXphdGlvbgorICAgICAgICAgCisgICAgICAgICBWQ0xUICAgICBkU2lnbjAsZENvZWZmMCwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgMAorICAgICAgICAgVkNMVCAgICAgZFNpZ24xLGRDb2VmZjEsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IDAKKyAgICAgICAgIFZDRVEgICAgIGRaZXJvMCxkQ29lZmYwLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCB6ZXJvCisgICAgICAgICBWQlNMICAgICBkU2lnbjAsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24wID0gLVFQMSBpZiBDb2VmZjA8IDAgZWxzZSBRUDEKKyAgICAgICAgIFZDRVEgICAgIGRaZXJvMSxkQ29lZmYxLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCB6ZXJvCisgICAgICAgICBWQlNMICAgICBkU2lnbjEsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24xID0gLVFQMSBpZiBDb2VmZjE8IDAgZWxzZSBRUDEKKyAgICAgICAgIFZNT1ZMICAgIHFTaWduMCxkU2lnbjAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIGV4dGVuZCBxU2lnbjAgdG8gMzIgYml0cworICAgICAgICAgVk1PVkwgICAgcVNpZ24xLGRTaWduMQorICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDAsZENvZWZmMCxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldK3FDb2VmZjBbaV0qKC0yKSBpZiBDb2VmZiA8MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAorICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDEsZENvZWZmMSxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldK3FDb2VmZjFbaV0qKC0yKSBpZiBDb2VmZiA8MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAorICAgICAgICAgOy8vIENsaXAgUmVzdWx0IHRvIFstMjA0OCwyMDQ3XSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBWUVNITCAgICBxUmVzdWx0MCxxUmVzdWx0MCwjMjAgICAgICAgICAgICA7Ly8gY2xpcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQxLHFSZXN1bHQxLCMyMAorICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQwLHFSZXN1bHQwLCM0ICAKKyAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQxLHFSZXN1bHQxLCM0CisgICAgICAgICBWU0hSTiAgICBkUmVzdWx0MCxxUmVzdWx0MCwjMTYgICAgICAgICAgICA7Ly8gTmFycm93IHRoZSBjbGlwcGVkIFZhbHVlIHRvIEhhbGZ3b3JkCisgICAgICAgICBWU0hSTiAgICBkUmVzdWx0MSxxUmVzdWx0MSwjMTYgCisgICAgICAgICBWQklUICAgICBkUmVzdWx0MCxkQ29uc3QwLGRaZXJvMCAgCisgICAgICAgICBWQklUICAgICBkUmVzdWx0MSxkQ29uc3QwLGRaZXJvMSAgICAgCisgICAgICAgICAKKyAgICAgICAgIFZTVDEgICAgIHtkUmVzdWx0MCxkUmVzdWx0MX0sW3BTcmNEc3RdISAgIDsvLyBTdG9yZSB0aGUgcmVzdWx0CisgICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjOAorICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgQkdUICAgICAgTG9vcAorCisgICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKworCisgICAgICAgICBNX0VORAorICAgICAgICAgRU5ESUYKKyAgICAgICAgIAorCisgICAgICAgIEVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAwNTkxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpAQCAtMCwwICsxLDIxMCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorOyAqIAorOyAqCis7ICoKKzsgKgorOyAqCis7ICogCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludHJhX0kKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgorOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCis7ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KKzsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqIFtpbl0gICAgUVAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCis7ICogW2luXSAgICB2aWRlb0NvbXAgICAgICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCis7ICogW2luXSAgICBzaG9ydFZpZGVvSGVhZGVyICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCis7ICogICAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCis7ICogW291dF0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgICAtICAgIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgorOyAqICAgICAgb3IKKzsgKiAgICAtIElmIFFQIDw9IDAuCis7ICogICAgICBvcgorOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCis7ICoKKyAKKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgIAorICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgCisgICAKKyAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgCisgICAgIElGIENvcnRleEE4CisgICAgIAorICAgICAKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyY0RzdCAgICAgICAgICAgIFJOIDAKK1FQICAgICAgICAgICAgICAgICBSTiAxCit2aWRlb0NvbXAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgIFJOIDMKKyAgICAgCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitkY1NjYWxlciAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgIFJOIDE0CitpbmRleCAgICAgICAgICAgICAgUk4gNQorCisKK0NvdW50ICAgICAgICAgICAgICBSTiA1Citkb3VibGVRUCAgICAgICAgICAgUk4gNAorUmV0dXJuICAgICAgICAgICAgIFJOIDAKKworCis7Ly8gTmVvbiByZWdpc3RlcnMKKworCitkUVAxMCAgICAgICAgICAgICAgRE4gRDAuUzMyWzBdCitxUVAxICAgICAgICAgICAgICAgUU4gUTAuUzMyCisKK2RRUDEgICAgICAgICAgICAgICBETiBEMC5TMTYKK2RNaW51c1FQMSAgICAgICAgICBETiBEMS5TMTYKKworZENvZWZmMCAgICAgICAgICAgIEROIEQyLlMxNgorZENvZWZmMSAgICAgICAgICAgIEROIEQzLlMxNiAgIAorCitxUmVzdWx0MCAgICAgICAgICAgUU4gUTMuUzMyCitkUmVzdWx0MCAgICAgICAgICAgRE4gRDcuUzE2CitxU2lnbjAgICAgICAgICAgICAgUU4gUTMuUzMyCitkU2lnbjAgICAgICAgICAgICAgRE4gRDYuUzE2CisKK3FSZXN1bHQxICAgICAgICAgICBRTiBRNC5TMzIKK2RSZXN1bHQxICAgICAgICAgICBETiBEOC5TMTYKK3FTaWduMSAgICAgICAgICAgICBRTiBRNC5TMzIKK2RTaWduMSAgICAgICAgICAgICBETiBEOC5TMTYKKworZDJRUDAgICAgICAgICAgICAgIEROIEQxMC5TMzJbMF0KK3EyUVAwICAgICAgICAgICAgICBRTiBRNS5TMzIKK2QyUVAgICAgICAgICAgICAgICBETiBEMTAuUzE2CisKK2RaZXJvMCAgICAgICAgICAgICBETiBEMTEuUzE2CitkWmVybzEgICAgICAgICAgICAgRE4gRDQuUzE2CitkQ29uc3QwICAgICAgICAgICAgRE4gRDUuUzE2CisKKworCisKKyAgICAgCisgICAgIAorICAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjUsZDExCisKKworICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgREMgY29lZmZpY2llbnQKKworICAgICAgICBURVEgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgIDsvLyBUZXN0IGlmIHNob3J0IFZpZGVvIEhlYWRlciBmbGFnID0wICAgICAgICAgICAgIAorICAgICAgICBNT1ZORSAgICAgZGNTY2FsZXIsIzggICAgICAgICAgICAgIDsvLyBpZiBzaG9ydFZpZGVvSGVhZGVyIGlzIG5vbiB6ZXJvIGRjU2NhbGVyPTgKKyAgICAgICAgQk5FICAgICAgIGNhbERDVmFsCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1CisgICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQorCisgICAgICAgIDsvL01fQ2FsRENTY2FsYXIgIHNob3J0VmlkZW9IZWFkZXIsdmlkZW9Db21wLCBRUAorCitjYWxEQ1ZhbAorCisgICAgICAgIExEUkggICAgIHRlbXAsW3BTcmNEc3RdCisgICAgICAgIFNNVUxCQiAgIHRlbXAsdGVtcCxkY1NjYWxlciAgICAgICA7Ly8gZGNDb2VmZiA9IGRjU2NhbGVyICogUXVhbnRpemVkIERDIGNvZWZmaWNpZW50KGZyb20gbWVtb3J5KQorICAgICAgICBTU0FUICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgOy8vIFNhdHVyYXRpbmcgdG8gMTIgYml0cworICAgICAgCisKKworICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgQWMgQ29lZmZpY2llbnRzCisgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEFERCAgICAgIGRvdWJsZVFQLFFQLFFQICAgICAgICAgICAgICAgICAgIDsvLyBkb3VibGVRUD0gMipRUAorICAgICAgICAgVk1PViAgICAgZDJRUDAsZG91YmxlUVAKKyAgICAgICAgIFZEVVAgICAgIHEyUVAwLGQyUVAwICAgICAgICAgICAgICAgICAgICAgIDsvLyBNb3ZlIGRvdWJsZVFQIGluIHRvIGEgc2NhbGFyCisgICAgICAgICBUU1QgICAgICBRUCwjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkIGZpcnN0IDggdmFsdWVzIHRvIENvZWZmMCxDb2VmZjEKKyAgICAgICAgIFNVQkVRICAgIFFQLFFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgVk1PViAgICAgZFFQMTAsUVAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFFQIGlzIGV2ZW4gdGhlbiBRUDE9UVAtMSBlbHNlIFFQMT1RUCAgICAgCisgICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKKyAgICAgICAgIFZEVVAgICAgIHFRUDEsZFFQMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGUgdGVtcFJlc3VsdCB3aXRoIFFQMQorICAgICAgICAgVlNIUk4gICAgZDJRUCxxMlFQMCwjMAorICAgICAgICAgVkVPUiAgICAgZENvbnN0MCxkQ29uc3QwLGRDb25zdDAKKyAgICAgICAgIFZTSFJOICAgIGRRUDEscVFQMSwjMCAgICAgICAgICAgICAgICAgICAgIDsvLyBRUDEgdHJ1bmNhdGVkIHRvIDE2IGJpdHMKKyAgICAgICAgIFZTVUIgICAgIGRNaW51c1FQMSxkQ29uc3QwLGRRUDEgICAgICAgICAgIDsvLyBkTWludXNRUDE9LVFQMQorCitMb29wICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly9QZXJmb3JtaW5nIEludmVyc2UgUXVhbnRpemF0aW9uCisgICAgICAgICAKKyAgICAgICAgIFZDTFQgICAgIGRTaWduMCxkQ29lZmYwLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCAwCisgICAgICAgICBWQ0xUICAgICBkU2lnbjEsZENvZWZmMSwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgMAorICAgICAgICAgVkNFUSAgICAgZFplcm8wLGRDb2VmZjAsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMCxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjAgPSAtUVAxIGlmIENvZWZmMDwgMCBlbHNlIFFQMQorICAgICAgICAgVkNFUSAgICAgZFplcm8xLGRDb2VmZjEsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMSxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjEgPSAtUVAxIGlmIENvZWZmMTwgMCBlbHNlIFFQMQorICAgICAgICAgVk1PVkwgICAgcVNpZ24wLGRTaWduMCAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gZXh0ZW5kIHFTaWduMCB0byAzMiBiaXRzCisgICAgICAgICBWTU9WTCAgICBxU2lnbjEsZFNpZ24xCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MCxkQ29lZmYwLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0rcUNvZWZmMFtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MSxkQ29lZmYxLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0rcUNvZWZmMVtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICA7Ly8gQ2xpcCBSZXN1bHQgdG8gWy0yMDQ4LDIwNDddICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQwLHFSZXN1bHQwLCMyMCAgICAgICAgICAgIDsvLyBjbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDEscVJlc3VsdDEsIzIwCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDAscVJlc3VsdDAsIzQgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDEscVJlc3VsdDEsIzQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQwLHFSZXN1bHQwLCMxNiAgICAgICAgICAgIDsvLyBOYXJyb3cgdGhlIGNsaXBwZWQgVmFsdWUgdG8gSGFsZndvcmQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQxLHFSZXN1bHQxLCMxNiAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQwLGRDb25zdDAsZFplcm8wICAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQxLGRDb25zdDAsZFplcm8xICAgICAKKyAgICAgICAgIAorICAgICAgICAgVlNUMSAgICAge2RSZXN1bHQwLGRSZXN1bHQxfSxbcFNyY0RzdF0hICAgOy8vIFN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM4CisgICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0KKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBCR1QgICAgICBMb29wCisgICAgICAgICAKKyAgICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4CisgICAgICAgICAKKyAgICAgICAgIDsvLyBTdG9yZSB0aGUgSW52ZXJzZSBxdWFudGl6ZWQgRGMgY29lZmZpY2llbnQKKyAgICAgICAgIAorICAgICAgICAgU1RSSCAgICAgdGVtcCxbcFNyY0RzdF0sIzIKKyAgICAgICAgCisgICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgIAorCisKKyAgICAgICAgIE1fRU5ECisgICAgICAgICBFTkRJRgorICAgICAgICAgCisKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWQ5MzY4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMWYzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVApAQCAtMCwwICsxLDYzIEBACitUaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcworb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgorCitJdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgorCitUaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAoraXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCisKK0lmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAorcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDEyPi4KKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCistIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxCisgIFZpZGVvIGNvZGVjcyAtIHNhbXBsZSBjb2RlCisgIFNhbXBsZSBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQorICBpbnRlcm5hbCBhY2Nlc3MKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgorYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KKworQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKK211c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQorc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCitjb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KK0J1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAordGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5CithbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCit0aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQorYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKK3JlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCitndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAorZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KK0J5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCit0byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKK2RlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCit3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCit3aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCittYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgorCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCit0d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgorCitUaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTIuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKK25vdGUuCisKK1RoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDEyLlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKK2ZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgorCitUaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KKworVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCisibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKKworICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxMi5UWFQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDFiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKQEAgLTAsMCArMSwxNDAgQEAKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitlODhlYzg0ZTEyMjUzNDA5MmI5MGM2Nzg0MTU0OWQ2ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAorOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCithMDY5ODNhYmIzOWM0NzZiMDgxZTg3ZWEyNzEzNjFhNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKK2MwMWY4YjkzYWI3M2Q4YzAwZGRmMjQ5OWYwMWRhNWZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KKzI2ZTJmZjNmNjMzNzY0ZWI3MjBkZWIzNDA5NzhkYzJkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworNzlhYTIzZDk4MTdlZmQxMWQwYzRjMmJlMzZlYzFlNWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlNDUyOTc3MDRkNzIzMDJkNGE5NDdkMDc5OGM2NjZmYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworMjA1ZGZhZmUxZmU3YmIxNjBiZjM2ZDI2MDBlMTEwMGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworYmY5MjY0MWU4NTQ4NTc3Yjc3ZTA0ZTAzZWMwNGMzNTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCitmNWVlNmY3YmU4MjJkODc0NzFjZWYzYjE4MDFkYmZjMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworMjgxMTBiM2ExM2NlY2Y0ZjIxNmQxMGJjYzc2MWM0MDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCis5YTFhMjUyNDVjOTc1ZDY0MWUxYzYzNzg4MzRhZWE0ZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworM2E2NDNlYWFhZWIxMmU4ZDI3NGRjNTlhNzM1N2E1ODYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCis0YzRkZTU5NzNhNmI3NDI1MGNlOTFhYzBiMzE3YTYxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworNGVjZGJlOTE5M2FhYmExZjliYjBlMjRjOTM4YjM0ZjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKKzY2ZTkxMmY4Yzg4ZjYwMTljYmEzZWRlMjcxNTBhNDA3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworMjY2ZGE0MmY0ZTMwMTVlNjdiMmNiYjU4MTY5ZDQzN2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCitkOTA1MjQ3ZWVhYTUyZDRlMmNmNWY2YmMzZjYxYjM0OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKKzViMjk0NDhkYjA0OTVjZDE3MTdhNGI5MjVmMTMzNzdjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYworZjY0NTFkZjI3ZjZkY2M5OTAzNmI0YjEyNTNjMjNiYjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKKzg5Mjc4N2Q4NTBlZWYwOWRjMjE0OGQ0NWI0MTZiMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCiszM2RhMWMwMWEzMWY0N2MwZjNhZWE5YTdhNWVhYTliZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKK2U5ZmIxMWIwNjY3NzUyODNkY2ZlYWU4ZDEyYTZjOTdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCithZGQ5N2JlYzA4ZTVlMWE1MzhhYTg2MDcxNjhlNjFiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCitiNjk1ZWNmYzkxN2IzOTQ3MGQxZjQwNzczYjkyMzk3MiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworNTFiYzU5NmZkMmZmNjFhZDU0NTBkNzEzODQ2MWY0YTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCitkYzZiYWEwYTM4OGRjNWVhOGZmNjVjMjRiMTc5ZTY3MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCithNTQ5OTkwMjk5NjU3NmY2NzEyODQ5ZGIzNGQ1YWQ2NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKzBjM2I3Njc0NWQ1M2U3NGE4ZTY0ZTgwZGVmMzFmYWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKzRmMjc0MmJhNWEzYzIyMDhmNTNiYzBmNmE0NDNiZTE0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKK2I0YWUyZGM5NDhlOGNhNjQ4MzFmZTNiYmZiZDg5NTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCitlMTUxMThjYmUzNzJkYjdjYWRiYTIyNWM5NDU2ZjE4OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCis2MjNjZjMzNmNmY2U3ZDAxNzRmNGU1NDA3MjQ1NmYzMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworODllNDUyYzgwZTMwMzU3Y2FkZmIwNGMwNWI2ZmUwMGMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKzNhNTU1MWNjNTRlODViYmUzNGZjOTY2YzdkYzAwZjFjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworMTE0MDMwZmEwZDhmMDBhZjZkMzI4OWY0N2E1ZTg1YmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKzllMzczYWIyOTZmYjg1YmI0NTU2NWE2YzM4NGY2ZWQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKzJkMjAwZjdjYzIzMGYzMDJkYTQ4YzU4OWRhNDJjMDJmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCitlYTNmMWQxZDE1MDdiNTU2MTBiMTM0OWM3YjU5NDZlOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYworYmQyYmYxNzQzYWVmMmE5Mzk2NTQ1ZWQwMjUzNjJiZTIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworY2E2OGU4MDk1NjdiZjg5MDQ0NjMxYjY3ZDIyOGM3Y2UgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCis3N2NhZjJiNWNiZWU5NmQzNjBhOTE5ZjI3ZTFmMTRmNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworMjYwODFlMzg0ZWM2MjdmZWRhZDQ3NGEwZTdkYWQ4NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYworMWM4M2FlOTIwN2E1NDk0NDkzNmY0YTYzYzY2NWJkOTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCis0YzM2ZTA0ZGIyMDIwMGY0ZWM3MmU1YWJhNTc0NDZmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworZjc1YjdjNWE4MGQ4YmYzM2UzMTUzODBlNGVmMGFiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKzQ4ODkyNWJiN2FlZWFlMGNjZjkzZWM0NGFmOWZjZTM1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCitjOTFhNTM0NWI1Zjg3N2IzODMxZWQxYWJjYzYwZDU3OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKKzM1NTE1YTExNWEzMmZjYWM4NDc5MDcyYTlhNWIwZGI5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKK2ZkY2Y0NjIyYmM1ZjBhZTc1YmRiMGE1MWRjZDAzMzk3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworNzRjOTI3ODE3NzQwMGExZjdjYzZkNzk5YThjOGFiMzQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCis1NmFhMmQ1MDZkMGNmZGI0ZWJkMzY2YzA3YWRiMmQ4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKzM2YjIxNjVmZDRkMmE3ZjNmM2UxZjhkYWZmNGY5NGU1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCis0YjZiMWI5MzNmYzdiYzhmMTRhMTg0YzAyYzAyODA4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworY2YwZmYwOTNhOWIzNzJkZDMyNzFlM2U1YzI4OTg0ZDQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCis5Y2NhZDlmODk0ZmJkMzIxOTRmNWI1M2RhMjE3MDcyYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCis0OTQzYTdhMmRmN2U5ZDcwMDY3NWY4YzFkZWJmNGQ5MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKzI5ZTRhN2YzOGY4YzJlODI0NmVkNzU2ZGIwM2MwMTJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisyN2JjNjRlN2MxOGRhMGFhYjljOTg3YTM4OGY2MTYwOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCis4NTkxODU2MTRiYjlkMDAxMzg2MWU0NTRkN2I5MThmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLworNjNlM2I2NGI5NmNjNDJhMjM1YzA0ZjNhMGY5OTEzMTYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KKzBhYWU0ZjY4M2Q4OTAzY2JhOTk1NmQzMzAxZWQ5ZmZlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworOGQ2YzFiNDQ5MTUzMjkxNjVkZjY0MzA4MWNjMTFhOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYworMDQzNWVjYTkzMGVhY2RhMGYyYTU5ZTg0M2Q0MDVlZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworOWE4MmRkMGIxZjA1Zjc5ODU2NzQzNmEwMDlkMDI5NjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKK2UxZTI0NjQ2YzRiZDAzZjVkZjc4Mjk1NDUyZGQ0ZWIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCis3NDZlNmIzMzRlNGEyNmQ0YTliZmFlNmQ3MzU4MjZmNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCis4YjFkODdiNzRkODBmZjEzYTE2MjE1YjYxZDVlNTJiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYworMzA5MzU4ZDM1N2JhYWZjMzhkMmIzN2JmMWU5NzY4YTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYworY2M3N2M3MjQyYjUzYzE1M2Y4ZDA5NTI3NTgzZjI3NzEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKKzdjZDhlNzc5NjAxN2UzZGQwMGI0OTRkMzRmNjI5ZjNmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKK2E0OTA1Y2I1ZjhkNGIyNDQ0NTRlZTRmNjBkMTgzNThiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCis1NTk2YjMxZTQzMzIyMmMxZTQ4NjBkZWViZmE5OGVmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCiszNjVkMDcyYmU2ZWFiMjAxZjZlMDQwMDU4YTNiYWNmYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCis3OGVkMjIxMjU4NWIwY2NhNzU5MTNhNDczYjJlYzQzMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKzUwYjJkOGRhOGYyMGY2YjFkMzliOGQzZGYzOGFmNTVkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYworNGE4NTFhMmFkNmQzNTdjZGMyMzNkOWMwYmY0NzVlMDIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworMGQ2ZDYzODc4ZjI4MjdlMDBlNWY4NWIxZThlMjYwMTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKzQ4Yjg2NWE5ODNmZTViZjMwNzVlZGRmNjUyOTUwNzIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKzVmNDhmYTc5NDE4MzVjNDZhYzc2N2U2M2ZjMjk0MDNiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworYmJhZjQ1NGI2NGIzMmIyYzQyYTc2YTdlYzM5M2Q5NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYworZWViZmY3NzJmODdhNDE0NDM2YzVjNTI4NmYyY2QyMTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYworNjVhZTI0MmViOGNiNmQxMDI3Njc3YzhlZjhmNzdjYTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKKzEyNTY0MmIxZWEwYzEyNTZkNzlhZjFlMGRkZWNhZTkzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKK2NlMjRiYTNkODNkYTRjYjc5MTQ4NWQzMTI4MjY4YmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYworMDliYzA5YTJlNmZkOTYyZTcxOTk0NDU4MmUzOGE4ZmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworNmIwZWU3YTExNjQ3MWE0ZGFkYmU1YmM4ZGJmNDI1YjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKKzIxMzIyZGNhMDI3YzI4MzUzZTNlN2ViOGYzNjIwMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKK2VmMzUzZDgzMjQ0Mjg4ZDhjMzdlMGY3MDI0OTE3N2NjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCis1NDFkZTgyNGY4YWViZTRhNWNhYzZmMTVkYTk0M2VmYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworMGI0MGIxNTRiNTkxYzdmODg0MmNmZmU0MDQyZDE3YzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworMmZmY2VjODhkM2ZjYjM3MjU0M2E4ZjQ1MDhlYTFhYzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworZTA2ZDg1Y2EwMDBhZmNiYjUwNTgwZjk4ZjAyMDNhYzggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCithZTgyYjZmY2ZjZjczMWE2MWQ3MGUxYWE0MmU2Mjc3YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisxZDA0Mzk1ZTIzMWI1OTc1NjIyNTdlOThjZGE2Y2ZiMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCis3MmMwYTM2MzI3YjZiOWI0MzZkM2JjZTdjODk2YzUyMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKzFiNjVhYTdmMzExMTI0ZWE2ZmI0N2UzODRlYzA2YTUwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKKzcxNDk1NzEwNGE2ZWY3MTM0MWZiZTZhOWVjNjVjMTM2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCis4NjQ5M2YwZWU4NTNmNjUzMzU0YTczODlmMTcyN2Y3MyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKKzVkZThhZmNmYjMwNTI5Njg3OTQ3ODJhN2MzYTBiNDFhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKzUwYmNjMjI4Y2M2NjBkYmRhMDM3NzI1MzA5ZGUzZjhiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKzRmNWNmYTFlY2M2Njg5MTNkZGU5NGUzY2FmOTdhMmUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKK2MyZWM4MDRkZGY2NGVlODQxMTQ2ZTM5YzNhNzgzNDUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKzQwODdmNmE4Mjc5MTJlZTViNDVlZDQyMTdmMWE2ZDc3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLworNWM3MTE3MDJkZGRjZWM4NTI5ODAwMzg2MGQ3NjBjZWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAorMWI5MmM5NGI3ODVjMDNlYzc2ZDRmYWUyZjJiYmRiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKK2FkOWM2OTg2ZDJhMzIwMGRkNWUxZjYxMDNhNTRhOTliICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KK2U2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCis3Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKKzEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLworM2E2ZGYwMDg1NzM2Y2JjYmUyZTNmNDVkMDhhZjQyMjEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKKzBiZjNjYjUyODYzYzgyOWIyOGMwMzUyODM1MTcwMjExICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCis1MzhiNjJmNTEwYjVhOGJkY2VkNGEzOWZhMTJkOWEyMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYworNjY5OTNlZGQ5ZDQ0MWJmM2I1YjZjOTEyZjY0MDBiNmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKzhlNTI2YTkwMDdlYjBkNDNlYmYzNjJjNDk4YjM3NDE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCis4N2Y4ZjI2ZTZlOTE3OGRmMGFiNzQxOTMzNGQ1YTNkYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYworMWE4NTc3NjQ2MTMyYWQ5YjYzYTE0NzdmZGFlYzI0NjQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCis0ODUyOWM0ZjcwYzdlOTU0ZTgzMmVlY2UxYWVlNTdiZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCisyNTI5Nzc3NjRkNGYzODI4MmI2YTU2YzU5Y2NmNGYwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCitjYzc4Y2ZhZWQ5NTAyYzJlMDI4MmM5MWZiOTVlZWFjNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYworZTQ2ODc1MWMxNWE1ODFlYmQyMmRhMDMxZTIyMTE3ZDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworM2Y0NDhkMTkxZWFlYjgyZWNiN2UyN2VmOGJhMjc4NzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworYjEyOTFjMzA3ODA4NjMxZmE4MzM2ODRhYmI5YzM0Y2UgIEFSTV9ERUxJVkVSWV85NzQxMi5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCkBAIC0wLDAgKzEsNzg1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqCisgKi8KKyAKKyAgCisjaWZuZGVmIF9hcm1Db21tb25fSF8KKyNkZWZpbmUgX2FybUNvbW1vbl9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KK3R5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOworCisKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21waWxlciBleHRlbnNpb25zICovCisjaWZkZWYgQVJNX0RFQlVHCisvKiBkZWJ1ZyB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9CisjZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KKyNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCisjZWxzZSAKKy8qIHJlbGVhc2UgdmVyc2lvbiAqLworI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKKyNlbmRpZiAvKiBBUk1fREVCVUcgKi8KKworLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCisjZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQorI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKKworLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLworCisjZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQorI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQorI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQorI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQorI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKKworLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLworCisjZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisjZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisKKyNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQorI2Vsc2UKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCisKKyNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKKyNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorIAorT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgICAgIE9NWF9JTlQgbWluLAorICAgICAgICBPTVhfSU5UIG1heCwgCisgICAgICAgIE9NWF9TMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgICAgIE9NWF9GMzIgbWluLAorICAgICAgICBPTVhfRjMyIG1heCwgCisgICAgICAgIE9NWF9GMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKKyAgICAgICAgT01YX0YzMiB2LCAKKyAgICAgICAgT01YX0lOVCBzaGlmdCwgCisgICAgICAgIE9NWF9JTlQgc2F0Qml0cworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKyAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKyAgICApOyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRBZGRfUzMyKAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYnVnZ2luZyBtYWNyb3MKKyAqCisgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKKyAqLworI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0CisKKy8qCisgKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCisgKiBBZGQgbW9yZSBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBERUJVR19PTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKKyNlbHNlIC8qIERFQlVHX09OICovCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCisjZW5kaWYgLyogREVCVUdfT04gKi8KKworCisvKgorICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCisgKgorICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCisgKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCisgKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KKyAqLworCisjaWZkZWYgREVCVUdfRE9NQUlOX0FDCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9WQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lDCisvKiBUbyBiZSBmaWxsZWQgaW4gKi8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1NQCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSVAKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCisKKworI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KKworLypFbmQgb2YgRmlsZSovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQU5TSSBDIgorCisvKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KKyNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKKworCisjZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjlmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaApAQCAtMCwwICsxLDI3NCBAQAorLyogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCisgKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCisgKgorICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCisgKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQorICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3CisgKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCisgKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucworICogICBhdCBydW50aW1lLgorICoKKyAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4CisgKiAKKyAqLworCisgIAorI2lmbmRlZiBfYXJtT01YX0hfCisjZGVmaW5lIF9hcm1PTVhfSF8KKworCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCisjZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgorI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQorCisvKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLworI2RlZmluZSBCQVJFX1NVRkZJWCAKKworCisKKy8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCisjZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAorI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAorCisKKworCisvKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKworCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKKworI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorCisjZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKKworI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKworCisjZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qKgorICogRmlsZTogb214dHlwZXMuaAorICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisgIAorI2lmbmRlZiBfT01YVFlQRVNfSF8KKyNkZWZpbmUgX09NWFRZUEVTX0hfCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gCisKKyNkZWZpbmUgT01YX0lOCisjZGVmaW5lIE9NWF9PVVQKKyNkZWZpbmUgT01YX0lOT1VUCisKKwordHlwZWRlZiBlbnVtIHsKKyAgICAKKyAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLworICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCisgICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCisgICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCisgICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLworICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KKyAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKKyAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKKwlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCisKKyAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KKyAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCisKKyAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKKworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCisKKyAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KKworICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KKyAgICAKKyB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCisKKyAKKy8qIE9NWF9VOCAqLworI2lmIFVDSEFSX01BWCA9PSAweGZmCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OworI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTggdW5kZWZpbmVkCisjZW5kaWYgCisKKyAKKy8qIE9NWF9TOCAqLworI2lmIFNDSEFSX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7CisjZWxpZiBTSFJUX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCisjZWxzZQorI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKKyNlbmRpZgorIAorIAorLyogT01YX1UxNiAqLworI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7CisjZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MxNiAqLworI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OworI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTMyICovCisjaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzMyICovCisjaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KKyNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKKyAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKKyNlbHNlCisgICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCisjZW5kaWYKKworCisvKiBPTVhfU0M4ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MxNiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzMyICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDNjQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfRjMyICovCit0eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0Y2NCAqLwordHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfSU5UICovCit0eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCisKKworI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQorI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKKyNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKKyNkZWZpbmUgT01YX01JTl9VMTYJCQkwCisjZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAorCisjZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQorI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKKyNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCisjZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKKyNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKKyNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKKwordHlwZWRlZiB2b2lkIE9NWFZvaWQ7CisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCopMCkKKyNlbmRpZgorCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKKyAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgorICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCisgICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLworCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KK31PTVhSZWN0OworCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLworIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLworCQorfSBPTVhQb2ludDsKKworCisvKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLworIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLworCQorfSBPTVhTaXplOworCisjZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMGI0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbApAQCAtMCwwICsxLDExMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIAorIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAorIyBPcGVuTUFYIERMOiB2MS4wLjIKKyMgUmV2aXNpb246ICAgOTY0MQorIyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorIyAKKyMgKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIAorIyAKKyMKKyMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgorIworCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBzdHJpY3Q7CisKK215ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7CisKKyRDQyAgICAgICA9ICdhcm1jYyc7CiskQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTdURE1JIC1jJzsKKyRBUyAgICAgICA9ICdhcm1hc20nOworJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk03VERNSSc7CisjICRMSUIgICAgICA9ICdhcm1saW5rJzsKKyMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7CisjICRMSUJfVFlQRSA9ICcubyc7CiskTElCICAgICAgPSAnYXJtYXInOworJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKKyRMSUJfVFlQRSA9ICcuYSc7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KK0BoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KK29wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOworQGZpbGVsaXN0ID0gPEZJTEVTPjsKK2Nsb3NlKEZJTEVTKTsKKworIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCitmb3JlYWNoICRoIChAaGVhZGVybGlzdCkKK3sKKyAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOworfQorCisjIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7CisKKyMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKK21rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKK21rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKKworJG9iamxpc3QgPSAnJzsKKworIyBDb21waWxlIGVhY2ggZmlsZQorZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQoreworCW15ICRmOworCW15ICRiYXNlOworCW15ICRleHQ7CisJbXkgJG9iamZpbGU7CisKKwljaG9tcCgkZmlsZSk7CisJJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOworCisJKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKKwlpZigoJGJhc2UsICRleHQpID0gJGYgPX4gLyguKylcLihcdykkLykKKwl7CisJCSRvYmpmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnb2JqJywgJGJhc2UuJy5vJyk7CisKKwkJaWYoJGV4dCBlcSAnYycpCisJCXsKKwkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOworCQkJJGNvbW1hbmQgPSAkQ0MuJyAnLiRDQ19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKKwkJCXByaW50ICIkY29tbWFuZFxuIjsKKwkJCXN5c3RlbSgkY29tbWFuZCk7CisJCX0KKwkJZWxzaWYoJGV4dCBlcSAncycpCisJCXsKKwkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOworCQkJJGNvbW1hbmQgPSAkQVMuJyAnLiRBU19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKKwkJCXByaW50ICIkY29tbWFuZFxuIjsKKwkJCXN5c3RlbSgkY29tbWFuZCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludCAiSWdub3JpbmcgZmlsZTogJGZcbiI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZGllICJObyBmaWxlIGV4dGVuc2lvbiBmb3VuZDogJGZcbiI7CisJfQorfQorCisjIERvIHRoZSBmaW5hbCBsaW5rIHN0YWdlIHRvIGNyZWF0ZSB0aGUgbGlicmFyaWVzLgorJGxpYmZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdsaWInLCAnb214VkMnLiRMSUJfVFlQRSk7CiskY29tbWFuZCA9ICRMSUIuJyAnLiRMSUJfT1BUUy4nICcuJGxpYmZpbGUuJyAnLiRvYmpsaXN0OworcHJpbnQgIiRjb21tYW5kXG4iOworKHN5c3RlbSgkY29tbWFuZCkgPT0gMCkgYW5kIHByaW50ICJCdWlsZCBzdWNjZXNzZnVsXG4iOworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjM0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dApAQCAtMCwwICsxLDEyMyBAQAorLi9hcGkvYXJtQ09NTS5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKy4vYXBpL29teHR5cGVzLmgKKy4vc3JjL2FybUNPTU0uYworLi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworLi92Yy9hcGkvYXJtVkMuaAorLi92Yy9hcGkvb214VkMuaAorLi92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCisuL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYworLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisuL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MmE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYwpAQCAtMCwwICsxLDkzNiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0CisgKgorICovCisKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKworT01YX0lOVCBhcm1TaWduQ2hlY2sgKAorICAgIE9NWF9TMTYgdmFyCispCisKK3sKKyAgICBPTVhfSU5UIFNpZ247CisgICAgCisgICAgaWYgKHZhciA8IDApCisgICAgeworICAgICAgICBTaWduID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCB2YXIgPiAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNpZ24gPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gU2lnbjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgT01YX0lOVCBtaW4sCisgICAgT01YX0lOVCBtYXgsIAorICAgIE9NWF9TMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICBPTVhfRjMyIG1pbiwKKyAgICBPTVhfRjMyIG1heCwgCisgICAgT01YX0YzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAoreworICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7CisgICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7CisgICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOworICAgIE9NWF9VMzIgdkludDsKKyAgICBPTVhfVTMyIHZJbnRTYXQ7CisgICAgCisgICAgaWYodiA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKKyAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7CisgICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOworICAgIHZJbnRTYXQgPSB2SW50OworICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKKyAgICAgICAgdkludFNhdCA9IG1heFY7CisgICAgcmV0dXJuIHZJbnRTYXQ7Cit9CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbSgKKyAgICAgICAgT01YX1U4ICpwQnVmMSwKKyAgICAgICAgT01YX1U4ICpwQnVmMiwKKyAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQorICAgICAgICkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgT01YX1U4IHRlbXA7CisgICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCisgICAgeworICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOworICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7CisgICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKykKK3sKKyAgICBPTVhfUzMyIGEsIGIsIGM7CisgICAgCisgICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOworICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOworICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAorICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKykKK3sKKyAgICBPTVhfVTggaTsgICAgCisgICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKKyAgICB7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQoreworICAgIE9NWF9TNjQgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCisgICAgeworICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7CisgICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7CisKKyAgICByZXR1cm4gUmVzdWx0OyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQoreworICAgIAorICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCisKKyAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOworICAgIH0KKyAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOworICAgIH0KKworICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7CisgICAgCisgICAgcmV0dXJuIG1hYzsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKK3sKKyAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOworCisgICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7CisgICAgfQorCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKiAgICAgCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMixsbzE7CisgICAgT01YX1UxNiBsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKyAgICAKKyAgICBsbzEgID0gaW5wdXQxOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKKyAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkxLGhpMjsKKyAgICBPTVhfVTE2IGxvMSxsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKKyAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gICBoaTEgKiBoaTI7CisgICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7CisgICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCit7CisgICAgT01YX0Y2NCByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOworICAgIAorICAgIGlmIChyZXN1bHQgPj0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAwLjU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCAtPSAwLjU7CisgICAgfQorCisgICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOworfQorCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWY5MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpAQCAtMCwwICsxLDMyOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorICogICAgCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4zMgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIAorICAgIGlmKE4gPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisgCitPTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQoreworICAgIGlmKCpwT2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICAgICpwcEJpdFN0cmVhbSArPSAxOworICAgICAgICAqcE9mZnNldCA9IDA7CisgICAgfSAgICAKK30KKworLyoqIAorICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQoreworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICpwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAorICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KKyAqKi8KKyNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKQoreyAgICAKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIE9NWF9JTlQgSW5kZXg7CisgICAgICAgIAorICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCisgICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOworICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOworICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEluZGV4OworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcENvZGVCb29rKys7CisgICAgfQorCisgICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLworICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKQoreworICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgICAgICAKKyAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7CisgICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7CisKKyAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KKyAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKKyAgICB7CisgICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOworICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7CisgICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKKyAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKKyAgICB9CisKKyAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCisgICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKKyAgICAKKyAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIEFSTV9WTEMzMiBjb2RlIAorKQoreworICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCkBAIC0wLDAgKzEsMTE1MyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybVZpZGVvLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgorICoKKyAqLworCisKKyNpZm5kZWYgX2FybVZpZGVvX0hfCisjZGVmaW5lIF9hcm1WaWRlb19IXworCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RydWN0IG00cDJfTUVTcGVjCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOworfTsKKworc3RydWN0IG00cDEwX01FU3BlYworeworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Cit0eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECisgKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0CisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECisgKi8KKworT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKKyAgICBPTVhfUzE2IG12WCwKKyAgICBPTVhfUzE2IG12WSwKKyAgICBPTVhfSU5UIGNhbmRTQUQsCisgICAgT01YX1MxNiBiZXN0TVZYLAorICAgIE9NWF9TMTYgYmVzdE1WWSwKKyAgICBPTVhfSU5UIGJlc3RTQUQpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KKyAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKyAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KKyAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCisgKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKKyAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaworICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKKyAgICAgT01YX0lOVCBjdXJRUCwKKyAgICAgT01YX0lOVCBwcmVkUVAsCisgICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAorICAgICBPTVhfVTggIHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAorICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKKyAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQorICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAorICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4CisgKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKKyAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCisgKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorICAgIE9NWF9VMzIgc3RvcmVSdW4sCisgICAgT01YX1MxNiAqIHBEc3QsCisgICAgT01YX1MxNiBzdG9yZUxldmVsLAorICAgIE9NWF9VOCAgc2lnbiwKKyAgICBPTVhfVTggIGxhc3QsCisgICAgT01YX1U4ICAqIGluZGV4LAorICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCisgKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispOworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKKyAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAorICAgICBPTVhfVTggKiBwVHJhbnNwCispOworCisvKiAKKyAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKKyAqLworLyogRGVmaW5lcyAqLworI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKKworCisvKiBEZXF1YW50IHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKK2V4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107CisKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCisgKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgorICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCisgKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYworICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAorICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQorICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAorICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCisgKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKKyAqIAorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCisgICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCisgICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCisgICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCisgICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KKyAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLworICAgIGludCBDaHJvbWFGbGFnCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAorCQlPTVhfVTMyIAlpU3JjU3RlcCwgCisJCU9NWF9VOCogCXBEc3QsIAorCQlPTVhfVTMyIAlpRHN0U3RlcCwgCisJCU9NWF9VMzIgCWlXaWR0aCwgCisJCU9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQorCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKKwkgT01YX1UzMiAJaVNyY1N0ZXAsIAorIAkgT01YX1U4KiAJcERzdCwKKyAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKKyAJIE9NWF9VMzIgCWlXaWR0aCwgCisgCSBPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCisgKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQsCisJT01YX1UzMgkJaVdpZHRoKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcworICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKKyAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlXaWR0aCwKKwkgT01YX1UzMgkJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKKyAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCisgKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgorICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKKyAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCisgKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKKyAgICAgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYgKnBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9TMTYqIHBEQywKKyAgICAgaW50IEFDCispOworCisjZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCkBAIC0wLDAgKzEsNDM4MSBAQAorLyoqCisgKiBGaWxlOiBvbXhWQy5oCisgKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09NWFZDX0hfCisjZGVmaW5lIF9PTVhWQ19IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCisvKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MxNiBkeDsKKyAgICBPTVhfUzE2IGR5OworfSBPTVhWQ01vdGlvblZlY3RvcjsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCisgKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAorICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAorICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCisgKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKKyAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKKyAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKKyAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAorICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCisgKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAorICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAorICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAorICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAorICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAorICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKKyAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCisgKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCisgICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKKyAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKKyAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAorICAgIE9NWF9VMzIgaVBsYW5lU3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCisgKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKKyAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKKyAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKKyAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKKyAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCisgKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCisgKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKKyAqICAgICAgICAgICAgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAorICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCisgKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKKyAgICBPTVhfSU5UIFhjb29yZCwKKyAgICBPTVhfSU5UIFljb29yZCwKKyAgICBPTVhfSU5UIHNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMipwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLworLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCisKK2VudW0geworICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKKyAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCisgICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAorfTsKKworCisKKy8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KKy8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCit9OworCisKKworLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KKy8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCisKK2VudW0geworICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfQ0VOVEVSID0gNCwKKyAgICBPTVhfVkNfUklHSFQgPSA4LAorICAgIE9NWF9WQ19MT1dFUiA9IDE2LAorICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKKyAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCit9OworCisKKworLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCit9IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OworCisKKworLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCit9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KKy8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9JTlQgeDsKKyAgICBPTVhfSU5UIHk7Cit9IE9NWFZDTTRQMkNvb3JkaW5hdGU7CisKKworCisvKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKK30gT01YVkNNNFAyTUVNb2RlOworCisKKworLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLworICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLworICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLworICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCit9IE9NWFZDTTRQMk1FUGFyYW1zOworCisKKworLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KKy8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAorICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLworICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKKyAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCisgKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKKyAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAorICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCisgKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAorICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAorICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAorICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKKyAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAorICogICAgICAgICAgICByZXR1cm4gTVZzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAorICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKKyAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKKyAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCisgKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKKyAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKKyAgICBPTVhfSU5UIGlCbGsKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAorICogW0lTTzE0NDk2LTJdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCisgKiAgICAgICAgICAgIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCisgKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAorICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAorICogICAgICAgICAgICAtNC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKKyAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAorICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAorICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAorICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKKyAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKKyAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKKyAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKKyAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKKyAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAorICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCisgKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAorICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCisgKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKKyAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKKyAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKKyAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCisgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKKyAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCisgKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKKyAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAorICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKKyAqICAgICAgICAgICAgaWdub3JlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAorICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKKyAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKKyAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKKyAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCisgKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKKyAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCisgICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9VMTYgKnBEc3RTQUQsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAorICogW0lTTzE0NDk2LTJdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAorICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNi4xLjMuOC4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCisgKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCisgKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAorICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAorICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKKyAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAorICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCisgKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAorICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKKyAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKKyAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKKyAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKKyAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKKyAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKKyAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCisgKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAorICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCisgKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKKyAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKKyAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKKyAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCisgKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKKyAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAorICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCisgKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKKyAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCisgKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAorICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCisgKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCisgKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAorICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAorICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAorICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKKyAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgIHBTcmMsIHBSZWMuICAKKyAqCisgKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCAqcFJlYywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKKyAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAorICAgIE9NWF9JTlQgKnBTdW1FcnIsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9VOCBjdXJRcCwKKyAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAorICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKKyAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAorICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgICAgLSBwU3JjIAorICogICAgICAgICAgICAtIHBEc3QKKyAqICAgICAgICAgICAgLSBwUmVjCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9TMTYgKnBSZWMsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCisgKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAorICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAorICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAorICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKKyAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKKyAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKKyAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKKyAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKKyAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKKyAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKKyAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCisgKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCisgKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKKyAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAorICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKKyAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAorICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAorICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAorICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBzeW50YXggCisgKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCisgKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KKyAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCisgKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKKyAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKKyAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCisgKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBpZjoKKyAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKKyAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAorICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAorICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAorICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAorICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKKyAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAorICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAorICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCisgKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKKyAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAorICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAorICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAorICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKKyAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAorICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCisgKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCisgKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAorICogICAgICAgICAgICAgIHRydWU6IAorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKKyAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKKyAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAorICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCisgKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCisgKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAorICogICAgICAgICAgICAgIHRydWU6IAorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKKyAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCisgKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAorICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAorICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKKyAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAorICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAorICoKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAorICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgYmVsb25ncyB0byAKKyAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCisgKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKKyAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAorICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKKyAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAorICogICAgICAgICBwUVBCdWYsIHBEc3QuIAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAorICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKKyAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCisgKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4CisgKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAsCisgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgT01YX1U4IGN1clFQLAorICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIGludHJhRENWTEMsCisgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAorICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCisgKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKKyAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKKyAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAorICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBRUCA8PSAwLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKKyAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAorICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCisgKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCisgKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIGN1clFQID4zMSwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCisgKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQorICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKKyAgICBPTVhfSU5UIGN1clFQLAorICAgIE9NWF9JTlQgcHJlZFFQLAorICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAorICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCisgKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCisgKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCisgKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCisgKiAgICAgICAgICAgIDYuMi4xLjIuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKKyAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCisgKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCisgICAgT01YX0lOVCBybmRWYWwKKyk7CisKKworCisvKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KKyAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7CisKKworCisvKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLworICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLworICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KKyAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLworICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLworICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KKyAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAorfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLworICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAorfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKK30gT01YVkNNNFAxME1FTW9kZTsKKworCisKKy8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAorICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKKyAgICBPTVhfVkNfUF84eDggID0gMywKKyAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCisgICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKKyAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCisgICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCisgICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAorfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLworICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAorICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAorICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAorfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCisgICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCisgICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KKyAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KKyAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KKyAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KK30gT01YVkNNNFAxMFZMQ0luZm87CisKKworCisvKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KKyAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCisgICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KKyAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLworICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KKyAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLworICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KKyAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCisgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLworfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKKworCisKKy8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KKyAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KKyAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOworICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7CisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKK30gT01YVkNNNFAxME1FUGFyYW1zOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKKyAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKKyAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCisgKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCisgKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKKyAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAorICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKKyAqICAgICAgICAgICAgMC4uMTUpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCisgKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAorICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqIE5vdGU6IAorICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCisgKiAgICAgICAgICAgIDAuLjcpLiAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAorICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKKyAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKKyAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICoKKyAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAorICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCisgKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGggCisgKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAorICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aC4gCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6CisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX1MzMiBkc3RTdGVwLAorICAgIE9NWF9TMzIgZHgsCisgICAgT01YX1MzMiBkeSwKKyAgICBPTVhTaXplIHJvaQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAorICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCisgKiAgICAgICAgICAgICAgaXMgTlVMTC4gCisgKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKKyAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAorICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKKyAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCisgKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKKyAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCisgKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAorICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKKyAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKKyAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAorICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCisgKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAorICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCisgKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCisgKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAorICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCisgKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCisgKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKKyAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKKyAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX1MzMipwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCisgKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCisgKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCisgKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKKyAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCisgKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCisgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKKyAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKKyAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCisgKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCisgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKKyAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCisgKgorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX1MzMiAqcE9mZnNldCwKKyAgICBPTVhfVTggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCisgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgIE9NWF9JTlQgc01heE51bUNvZWZmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAorICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKKyAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAorICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCisgKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAorICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCisgKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKKyAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKKyAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAorICogMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAorICogICAgICAgICAgICBleGlzdCAKKyAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAorICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAorICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCisgKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBwcmVkU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhfSU5UIEFDCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAorICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCisgKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICBPTVhfVTMyICpwU2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCisgKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCisgKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKKyAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCisgKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKKyAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCisgKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAorICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCisgKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCisgKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAorICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0LAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCisgKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAorICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCisgKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAorICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAorICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKKyAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAorICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKKyAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAorICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAorICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAorICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKKyAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKKyAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAorICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAorICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAorICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCisgKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uIAorICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRFUi4gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVFJBLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKKyAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAorICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAorICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCisgKiAgICAgICAgICAgIC0gIE1iVHlwZSAKKyAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAorICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAorICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAorICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCisgKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAorICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCisgKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKKyAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIE9NWF9VMzIgTGFtYmRhLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisgICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9JTlQgKnBEc3RDb3N0LAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKKyAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCisgKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCisgKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9VMzIgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAorICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCisgKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgtMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCisgKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0TGVmdCwKKyAgICBPTVhfVTggKnBEc3RSaWdodCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCisgKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdFVwLAorICAgIE9NWF9VOCAqcERzdERvd24sCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlXaWR0aCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKKyAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAorICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VMzIgaVFQLAorICAgIE9NWF9VOCBiSW50cmEKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKKyAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKKyAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIG1hdHJpeC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKKyAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAorICAgIE9NWF9VOCAqcERzdFJlY29uLAorICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAorICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKKyAgICBPTVhfVTggYkFDCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKKyAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKKyAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKKyAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCisgKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKKyAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgNC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAorICogICAgICAgICAgICBvZiA0LiAKKyAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAorICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKKyAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAorICogICAgICAgICAgICAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAorICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAorICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKKyAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAorICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAorICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAorICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERDQ29lZmYsCisgICAgT01YX1M4ICpwTnVtQ29lZmYsCisgICAgT01YX1UzMiBuVGhyZXNoU0FELAorICAgIE9NWF9VMzIgaVFQLAorICAgIE9NWF9VOCBiSW50cmEKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKKyAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKKyAqIHN0cnVjdHVyZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKKyAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKKyAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKKyAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKKyAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKKyAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCisgKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCisgKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKKyAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKKyAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAorICAgIE9NWF9VOCBiQUMsCisgICAgT01YX1UzMiBNYXhOdW1Db2VmLAorICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCispOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KKworLyoqIEVPRiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MTA3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwpAQCAtMCwwICsxLDc4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNDT01NX0F2ZXJhZ2UuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gYmxvY2tzIGlmIHNpemUgaVdpZHRoIFggaUhlaWdodAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgT01YX1UzMiAgICAgeCwgeTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0UHJlZCBbeSAqIGlEc3RTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICAoT01YX1U4KSgoKE9NWF9VMzIpcFByZWQwIFt5ICogaVByZWRTdGVwMCArIHhdICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZWQxIFt5ICogaVByZWRTdGVwMSArIHhdICsgMSkgPj4gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxYWM5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fU0FELmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgTnhNIGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jaworICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0LAorCU9NWF9VMzIJCWlXaWR0aAorKQoreworICAgIE9NWF9JTlQgICAgIHgsIHk7CisgICAgCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisgICAgKnBEc3RTQUQgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwU3JjT3JnIFsoeSAqIGlTdGVwT3JnKSArIHhdIC0gCisgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWYgWyh5ICogaVN0ZXBSZWYpICsgeF0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxNDQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9BdmVyYWdlXzE2eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KKyBPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0UHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCAxNiwgaUhlaWdodCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiMTMyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0F2ZXJhZ2VfOHguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gOHg0IG9yIDh4OCBvciA4eDE2IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAorICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCisgKgorICovCisgT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgJCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorICAgICBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorICAgICBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKyAgICAgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMCA9PSAwKSB8fCAoaVByZWRTdGVwMCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDQpICYmIChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCA4LCBpSGVpZ2h0KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU5YWRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgY29tcHV0aW5nIHRoZSBlcnJvciBmb3IgYSBNQiBvZiBzaXplIDh4OAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrKAorICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgICBPTVhfUzE2ICogcERzdAorKQoreworCisgICAgT01YX0lOVCAgICAgeCwgeSwgY291bnQ7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoc3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGVycm9yIGJsb2NrICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwOworICAgICAgICAgeSA8IDg7CisgICAgICAgICB5KyssIHBTcmMgKz0gc3JjU3RlcCkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1t4XSAtIHBTcmNSZWZbY291bnRdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDczMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBjb21wdXRpbmcgdGhlIGVycm9yIGZvciBhIE1CIG9mIHNpemUgOHg4CisgKiAKKyAqLworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEKAorICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworCisgICAgT01YX0lOVCAgICAgeCwgeSwgY291bnQ7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoc3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGVycm9yIGJsb2NrICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCAqcERzdFNBRCA9IDA7CisgICAgICAgICB5IDwgODsKKyAgICAgICAgIHkrKywgcFNyYyArPSBzcmNTdGVwKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW3hdIC0gcFNyY1JlZltjb3VudF07CisgICAgICAgICAgICAqcERzdFNBRCArPSBhcm1BYnMocERzdFtjb3VudF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1NzAyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29weTE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBNUEVHNCAxNngxNiBDb3B5IG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCisgKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNigKKwkJY29uc3QgT01YX1U4ICpwU3JjLCAKKwkJT01YX1U4ICpwRHN0LCAKKwkJT01YX0lOVCBzdGVwKQorIHsKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKworICAgIE9NWF9JTlQgY291bnQsaW5kZXgsIHgsIHk7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKHN0ZXAgPCAxNikgfHwgKHN0ZXAgJSAxNikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgCisgICAgLyogQ29weWluZyB0aGUgcmVmIDE2eDE2IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDE2OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gMTYpCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpbmRleF0gPSBwU3JjW2NvdW50XTsKKyAgICAgICAgfSAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjlkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db3B5OHg4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBNUEVHNCA4eDggQ29weSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAorICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDgoCisJCWNvbnN0IE9NWF9VOCAqcFNyYywgCisJCU9NWF9VOCAqcERzdCwgCisJCU9NWF9JTlQgc3RlcCkKKyB7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisKKyAgICBPTVhfSU5UIGNvdW50LGluZGV4LCB4LCB5OworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDgpIHx8IChzdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgCisgICAgLyogQ29weWluZyB0aGUgcmVmIDh4OCBibGsgdG8gdGhlIGN1cnIgYmxrICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCA4OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gOCkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssIGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbaW5kZXhdID0gcFNyY1tjb3VudF07CisgICAgICAgIH0gICAgICAgCisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTM2ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCkBAIC0wLDAgKzEsMTI2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JKAorCU9NWF9VOCoJcFNyY0RzdFBsYW5lLCAKKwlPTVhfVTMyCWlGcmFtZVdpZHRoLCAKKwlPTVhfVTMyCWlGcmFtZUhlaWdodCwgCisJT01YX1UzMglpRXhwYW5kUGVscywgCisJT01YX1UzMglpUGxhbmVTdGVwCispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICBPTVhfVTgqICAgICBwTGVmdDsKKyAgICBPTVhfVTgqICAgICBwUmlnaHQ7CisgICAgT01YX1U4KiAgICAgcFRvcDsKKyAgICBPTVhfVTgqICAgICBwQm90dG9tOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdFBsYW5lID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0UGxhbmUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVXaWR0aCA9PSAwIHx8IGlGcmFtZVdpZHRoICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaUZyYW1lSGVpZ2h0PT0gMCB8fCBpRnJhbWVIZWlnaHQgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRXhwYW5kUGVscyA9PSAwIHx8IGlFeHBhbmRQZWxzICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVBsYW5lU3RlcCA9PSAwIHx8IGlQbGFuZVN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKSwgCisgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiBUb3AgYW5kIEJvdHRvbSAqLworICAgIHBUb3AgPSBwU3JjRHN0UGxhbmUgLSAoaUV4cGFuZFBlbHMgKiBpUGxhbmVTdGVwKTsKKyAgICBwQm90dG9tID0gcFNyY0RzdFBsYW5lICsgKGlGcmFtZUhlaWdodCAqIGlQbGFuZVN0ZXApOworCisgICAgZm9yICh5ID0gMDsgeSA8IChPTVhfSU5UKWlFeHBhbmRQZWxzOyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgKE9NWF9JTlQpaUZyYW1lV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFRvcCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeF07CisgICAgICAgICAgICBwQm90dG9tIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCisgICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMZWZ0LCBSaWdodCBhbmQgQ29ybmVycyAqLworICAgIHBMZWZ0ID0gcFNyY0RzdFBsYW5lIC0gaUV4cGFuZFBlbHM7CisgICAgcFJpZ2h0ID0gcFNyY0RzdFBsYW5lICsgaUZyYW1lV2lkdGg7CisKKyAgICBmb3IgKHkgPSAtKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkgPCAoT01YX0lOVCkoaUZyYW1lSGVpZ2h0ICsgaUV4cGFuZFBlbHMpOyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcExlZnQgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3kgKiBpUGxhbmVTdGVwICsgMF07CisgICAgICAgICAgICBwUmlnaHQgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3kgKiBpUGxhbmVTdGVwICsgKGlGcmFtZVdpZHRoIC0gMSldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwpAQCAtMCwwICsxLDgxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIGxpbWl0aW5nIHRoZSBNVgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCisgKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCisgKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCisgKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAorICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAorICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCisgKiAgICAgICAgICAgIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKKyAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAorICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0KAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNViwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICAgY29uc3QgT01YUmVjdCAqIHBSZWN0Vk9QUmVmLAorICAgICBPTVhfSU5UIFhjb29yZCwKKyAgICAgT01YX0lOVCBZY29vcmQsCisgICAgIE9NWF9JTlQgc2l6ZQorKQoreworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVjdFZPUFJlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHNpemUgIT0gOCkgJiYgKHNpemUgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHBSZWN0Vk9QUmVmLT53aWR0aCA8ICgyKiBzaXplKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigocFJlY3RWT1BSZWYtPmhlaWdodCA8ICgyKiBzaXplKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBwRHN0TVYtPmR4ID0gYXJtTWluIChhcm1NYXggKHBTcmNNVi0+ZHgsIDIqcFJlY3RWT1BSZWYtPnggLSBYY29vcmQpLAorICAgICAgICAgICAgICAgICAgICAoMipwUmVjdFZPUFJlZi0+eCArIHBSZWN0Vk9QUmVmLT53aWR0aCAtIFhjb29yZCAtIHNpemUpKTsKKyAgICBwRHN0TVYtPmR5ID0gYXJtTWluIChhcm1NYXggKHBTcmNNVi0+ZHksIDIqcFJlY3RWT1BSZWYtPnkgLSBZY29vcmQpLAorICAgICAgICAgICAgICAgICAgICAoMipwUmVjdFZPUFJlZi0+eSArIHBSZWN0Vk9QUmVmLT5oZWlnaHQgLSBZY29vcmQgLSBzaXplKSk7CisKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGNlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKQEAgLTAsMCArMSw4MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9TQURfMTZ4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCgKKwkJCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJCQlPTVhfVTMyIAlpU3RlcE9yZywKKwkJCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJCQlPTVhfVTMyIAlpU3RlcFJlZiwKKwkJCU9NWF9TMzIqCXBEc3RTQUQsCisJCQlPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAorICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjFkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYwpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF84eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4KAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAorICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE4YThmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpbGU6ICAgICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogSGVhZGVyIGZpbGUgZm9yIEFSTSBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuTUFYIFZDTTRQMTAKKyAqIAorICovCisgCisjaWZuZGVmIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorI2RlZmluZSBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyAgCisvKiBDQVZMQyB0YWJsZXMgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbNjJdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbNV07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMzZhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpAQCAtMCwwICsxLDcwMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogQ0FWTEMgdGFibGVzIGZvciBILjI2NAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgorCisvKiBUYWJsZXMgbWFwcGluZyBhIGNvZGUgdG8gVHJhaWxpbmdPbmVzIGFuZCBUb3RhbENvZWZmICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXSA9IHsKKyAwLAorIDAsIDEsCisgMCwgMSwgMiwKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml0gPSB7CisgMCwKKyAxLCAxLAorIDIsIDIsIDIsCisgMywgMywgMywgMywKKyA0LCA0LCA0LCA0LAorIDUsIDUsIDUsIDUsCisgNiwgNiwgNiwgNiwKKyA3LCA3LCA3LCA3LAorIDgsIDgsIDgsIDgsCisgOSwgOSwgOSwgOSwKKyAxMCwgMTAsIDEwLCAxMCwKKyAxMSwgMTEsIDExLCAxMSwKKyAxMiwgMTIsIDEyLCAxMiwKKyAxMywgMTMsIDEzLCAxMywKKyAxNCwgMTQsIDE0LCAxNCwKKyAxNSwgMTUsIDE1LCAxNSwKKyAxNiwgMTYsIDE2LCAxNgorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjBbNjNdID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwNSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDgsIDB4MDAwNyB9LAorICAgIHsgIDYsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDksIDB4MDAwNyB9LAorICAgIHsgIDgsIDB4MDAwNiB9LAorICAgIHsgIDcsIDB4MDAwNSB9LAorICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgMTAsIDB4MDAwNyB9LAorICAgIHsgIDksIDB4MDAwNiB9LAorICAgIHsgIDgsIDB4MDAwNSB9LAorICAgIHsgIDYsIDB4MDAwMyB9LAorICAgIHsgMTEsIDB4MDAwNyB9LAorICAgIHsgMTAsIDB4MDAwNiB9LAorICAgIHsgIDksIDB4MDAwNSB9LAorICAgIHsgIDcsIDB4MDAwNCB9LAorICAgIHsgMTMsIDB4MDAwZiB9LAorICAgIHsgMTEsIDB4MDAwNiB9LAorICAgIHsgMTAsIDB4MDAwNSB9LAorICAgIHsgIDgsIDB4MDAwNCB9LAorICAgIHsgMTMsIDB4MDAwYiB9LAorICAgIHsgMTMsIDB4MDAwZSB9LAorICAgIHsgMTEsIDB4MDAwNSB9LAorICAgIHsgIDksIDB4MDAwNCB9LAorICAgIHsgMTMsIDB4MDAwOCB9LAorICAgIHsgMTMsIDB4MDAwYSB9LAorICAgIHsgMTMsIDB4MDAwZCB9LAorICAgIHsgMTAsIDB4MDAwNCB9LAorICAgIHsgMTQsIDB4MDAwZiB9LAorICAgIHsgMTQsIDB4MDAwZSB9LAorICAgIHsgMTMsIDB4MDAwOSB9LAorICAgIHsgMTEsIDB4MDAwNCB9LAorICAgIHsgMTQsIDB4MDAwYiB9LAorICAgIHsgMTQsIDB4MDAwYSB9LAorICAgIHsgMTQsIDB4MDAwZCB9LAorICAgIHsgMTMsIDB4MDAwYyB9LAorICAgIHsgMTUsIDB4MDAwZiB9LAorICAgIHsgMTUsIDB4MDAwZSB9LAorICAgIHsgMTQsIDB4MDAwOSB9LAorICAgIHsgMTQsIDB4MDAwYyB9LAorICAgIHsgMTUsIDB4MDAwYiB9LAorICAgIHsgMTUsIDB4MDAwYSB9LAorICAgIHsgMTUsIDB4MDAwZCB9LAorICAgIHsgMTQsIDB4MDAwOCB9LAorICAgIHsgMTYsIDB4MDAwZiB9LAorICAgIHsgMTUsIDB4MDAwMSB9LAorICAgIHsgMTUsIDB4MDAwOSB9LAorICAgIHsgMTUsIDB4MDAwYyB9LAorICAgIHsgMTYsIDB4MDAwYiB9LAorICAgIHsgMTYsIDB4MDAwZSB9LAorICAgIHsgMTYsIDB4MDAwZCB9LAorICAgIHsgMTUsIDB4MDAwOCB9LAorICAgIHsgMTYsIDB4MDAwNyB9LAorICAgIHsgMTYsIDB4MDAwYSB9LAorICAgIHsgMTYsIDB4MDAwOSB9LAorICAgIHsgMTYsIDB4MDAwYyB9LAorICAgIHsgMTYsIDB4MDAwNCB9LAorICAgIHsgMTYsIDB4MDAwNiB9LAorICAgIHsgMTYsIDB4MDAwNSB9LAorICAgIHsgMTYsIDB4MDAwOCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMVs2M10gPSB7CisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDBiIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDA3IH0sCisgICAgeyAgNSwgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDA3IH0sCisgICAgeyAgNiwgMHgwMDBhIH0sCisgICAgeyAgNiwgMHgwMDA5IH0sCisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgOCwgMHgwMDA3IH0sCisgICAgeyAgNiwgMHgwMDA2IH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgOCwgMHgwMDA0IH0sCisgICAgeyAgNywgMHgwMDA2IH0sCisgICAgeyAgNywgMHgwMDA1IH0sCisgICAgeyAgNSwgMHgwMDA2IH0sCisgICAgeyAgOSwgMHgwMDA3IH0sCisgICAgeyAgOCwgMHgwMDA2IH0sCisgICAgeyAgOCwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDA4IH0sCisgICAgeyAxMSwgMHgwMDBmIH0sCisgICAgeyAgOSwgMHgwMDA2IH0sCisgICAgeyAgOSwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAxMSwgMHgwMDBiIH0sCisgICAgeyAxMSwgMHgwMDBlIH0sCisgICAgeyAxMSwgMHgwMDBkIH0sCisgICAgeyAgNywgMHgwMDA0IH0sCisgICAgeyAxMiwgMHgwMDBmIH0sCisgICAgeyAxMSwgMHgwMDBhIH0sCisgICAgeyAxMSwgMHgwMDA5IH0sCisgICAgeyAgOSwgMHgwMDA0IH0sCisgICAgeyAxMiwgMHgwMDBiIH0sCisgICAgeyAxMiwgMHgwMDBlIH0sCisgICAgeyAxMiwgMHgwMDBkIH0sCisgICAgeyAxMSwgMHgwMDBjIH0sCisgICAgeyAxMiwgMHgwMDA4IH0sCisgICAgeyAxMiwgMHgwMDBhIH0sCisgICAgeyAxMiwgMHgwMDA5IH0sCisgICAgeyAxMSwgMHgwMDA4IH0sCisgICAgeyAxMywgMHgwMDBmIH0sCisgICAgeyAxMywgMHgwMDBlIH0sCisgICAgeyAxMywgMHgwMDBkIH0sCisgICAgeyAxMiwgMHgwMDBjIH0sCisgICAgeyAxMywgMHgwMDBiIH0sCisgICAgeyAxMywgMHgwMDBhIH0sCisgICAgeyAxMywgMHgwMDA5IH0sCisgICAgeyAxMywgMHgwMDBjIH0sCisgICAgeyAxMywgMHgwMDA3IH0sCisgICAgeyAxNCwgMHgwMDBiIH0sCisgICAgeyAxMywgMHgwMDA2IH0sCisgICAgeyAxMywgMHgwMDA4IH0sCisgICAgeyAxNCwgMHgwMDA5IH0sCisgICAgeyAxNCwgMHgwMDA4IH0sCisgICAgeyAxNCwgMHgwMDBhIH0sCisgICAgeyAxMywgMHgwMDAxIH0sCisgICAgeyAxNCwgMHgwMDA3IH0sCisgICAgeyAxNCwgMHgwMDA2IH0sCisgICAgeyAxNCwgMHgwMDA1IH0sCisgICAgeyAxNCwgMHgwMDA0IH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4yWzYzXSA9IHsKKyAgICB7ICA0LCAweDAwMGYgfSwKKyAgICB7ICA2LCAweDAwMGYgfSwKKyAgICB7ICA0LCAweDAwMGUgfSwKKyAgICB7ICA2LCAweDAwMGIgfSwKKyAgICB7ICA1LCAweDAwMGYgfSwKKyAgICB7ICA0LCAweDAwMGQgfSwKKyAgICB7ICA2LCAweDAwMDggfSwKKyAgICB7ICA1LCAweDAwMGMgfSwKKyAgICB7ICA1LCAweDAwMGUgfSwKKyAgICB7ICA0LCAweDAwMGMgfSwKKyAgICB7ICA3LCAweDAwMGYgfSwKKyAgICB7ICA1LCAweDAwMGEgfSwKKyAgICB7ICA1LCAweDAwMGIgfSwKKyAgICB7ICA0LCAweDAwMGIgfSwKKyAgICB7ICA3LCAweDAwMGIgfSwKKyAgICB7ICA1LCAweDAwMDggfSwKKyAgICB7ICA1LCAweDAwMDkgfSwKKyAgICB7ICA0LCAweDAwMGEgfSwKKyAgICB7ICA3LCAweDAwMDkgfSwKKyAgICB7ICA2LCAweDAwMGUgfSwKKyAgICB7ICA2LCAweDAwMGQgfSwKKyAgICB7ICA0LCAweDAwMDkgfSwKKyAgICB7ICA3LCAweDAwMDggfSwKKyAgICB7ICA2LCAweDAwMGEgfSwKKyAgICB7ICA2LCAweDAwMDkgfSwKKyAgICB7ICA0LCAweDAwMDggfSwKKyAgICB7ICA4LCAweDAwMGYgfSwKKyAgICB7ICA3LCAweDAwMGUgfSwKKyAgICB7ICA3LCAweDAwMGQgfSwKKyAgICB7ICA1LCAweDAwMGQgfSwKKyAgICB7ICA4LCAweDAwMGIgfSwKKyAgICB7ICA4LCAweDAwMGUgfSwKKyAgICB7ICA3LCAweDAwMGEgfSwKKyAgICB7ICA2LCAweDAwMGMgfSwKKyAgICB7ICA5LCAweDAwMGYgfSwKKyAgICB7ICA4LCAweDAwMGEgfSwKKyAgICB7ICA4LCAweDAwMGQgfSwKKyAgICB7ICA3LCAweDAwMGMgfSwKKyAgICB7ICA5LCAweDAwMGIgfSwKKyAgICB7ICA5LCAweDAwMGUgfSwKKyAgICB7ICA4LCAweDAwMDkgfSwKKyAgICB7ICA4LCAweDAwMGMgfSwKKyAgICB7ICA5LCAweDAwMDggfSwKKyAgICB7ICA5LCAweDAwMGEgfSwKKyAgICB7ICA5LCAweDAwMGQgfSwKKyAgICB7ICA4LCAweDAwMDggfSwKKyAgICB7IDEwLCAweDAwMGQgfSwKKyAgICB7ICA5LCAweDAwMDcgfSwKKyAgICB7ICA5LCAweDAwMDkgfSwKKyAgICB7ICA5LCAweDAwMGMgfSwKKyAgICB7IDEwLCAweDAwMDkgfSwKKyAgICB7IDEwLCAweDAwMGMgfSwKKyAgICB7IDEwLCAweDAwMGIgfSwKKyAgICB7IDEwLCAweDAwMGEgfSwKKyAgICB7IDEwLCAweDAwMDUgfSwKKyAgICB7IDEwLCAweDAwMDggfSwKKyAgICB7IDEwLCAweDAwMDcgfSwKKyAgICB7IDEwLCAweDAwMDYgfSwKKyAgICB7IDEwLCAweDAwMDEgfSwKKyAgICB7IDEwLCAweDAwMDQgfSwKKyAgICB7IDEwLCAweDAwMDMgfSwKKyAgICB7IDEwLCAweDAwMDIgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjNbNjNdID0geworICAgIHsgIDYsIDB4MDAwMyB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwNCB9LAorICAgIHsgIDYsIDB4MDAwNSB9LAorICAgIHsgIDYsIDB4MDAwNiB9LAorICAgIHsgIDYsIDB4MDAwOCB9LAorICAgIHsgIDYsIDB4MDAwOSB9LAorICAgIHsgIDYsIDB4MDAwYSB9LAorICAgIHsgIDYsIDB4MDAwYiB9LAorICAgIHsgIDYsIDB4MDAwYyB9LAorICAgIHsgIDYsIDB4MDAwZCB9LAorICAgIHsgIDYsIDB4MDAwZSB9LAorICAgIHsgIDYsIDB4MDAwZiB9LAorICAgIHsgIDYsIDB4MDAxMCB9LAorICAgIHsgIDYsIDB4MDAxMSB9LAorICAgIHsgIDYsIDB4MDAxMiB9LAorICAgIHsgIDYsIDB4MDAxMyB9LAorICAgIHsgIDYsIDB4MDAxNCB9LAorICAgIHsgIDYsIDB4MDAxNSB9LAorICAgIHsgIDYsIDB4MDAxNiB9LAorICAgIHsgIDYsIDB4MDAxNyB9LAorICAgIHsgIDYsIDB4MDAxOCB9LAorICAgIHsgIDYsIDB4MDAxOSB9LAorICAgIHsgIDYsIDB4MDAxYSB9LAorICAgIHsgIDYsIDB4MDAxYiB9LAorICAgIHsgIDYsIDB4MDAxYyB9LAorICAgIHsgIDYsIDB4MDAxZCB9LAorICAgIHsgIDYsIDB4MDAxZSB9LAorICAgIHsgIDYsIDB4MDAxZiB9LAorICAgIHsgIDYsIDB4MDAyMCB9LAorICAgIHsgIDYsIDB4MDAyMSB9LAorICAgIHsgIDYsIDB4MDAyMiB9LAorICAgIHsgIDYsIDB4MDAyMyB9LAorICAgIHsgIDYsIDB4MDAyNCB9LAorICAgIHsgIDYsIDB4MDAyNSB9LAorICAgIHsgIDYsIDB4MDAyNiB9LAorICAgIHsgIDYsIDB4MDAyNyB9LAorICAgIHsgIDYsIDB4MDAyOCB9LAorICAgIHsgIDYsIDB4MDAyOSB9LAorICAgIHsgIDYsIDB4MDAyYSB9LAorICAgIHsgIDYsIDB4MDAyYiB9LAorICAgIHsgIDYsIDB4MDAyYyB9LAorICAgIHsgIDYsIDB4MDAyZCB9LAorICAgIHsgIDYsIDB4MDAyZSB9LAorICAgIHsgIDYsIDB4MDAyZiB9LAorICAgIHsgIDYsIDB4MDAzMCB9LAorICAgIHsgIDYsIDB4MDAzMSB9LAorICAgIHsgIDYsIDB4MDAzMiB9LAorICAgIHsgIDYsIDB4MDAzMyB9LAorICAgIHsgIDYsIDB4MDAzNCB9LAorICAgIHsgIDYsIDB4MDAzNSB9LAorICAgIHsgIDYsIDB4MDAzNiB9LAorICAgIHsgIDYsIDB4MDAzNyB9LAorICAgIHsgIDYsIDB4MDAzOCB9LAorICAgIHsgIDYsIDB4MDAzOSB9LAorICAgIHsgIDYsIDB4MDAzYSB9LAorICAgIHsgIDYsIDB4MDAzYiB9LAorICAgIHsgIDYsIDB4MDAzYyB9LAorICAgIHsgIDYsIDB4MDAzZCB9LAorICAgIHsgIDYsIDB4MDAzZSB9LAorICAgIHsgIDYsIDB4MDAzZiB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNFsxNV0gPSB7CisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA3IH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAgNiwgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDAyIH0sCisgICAgeyAgOCwgMHgwMDAzIH0sCisgICAgeyAgOCwgMHgwMDAyIH0sCisgICAgeyAgNywgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKKworY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XSA9IHsKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4wLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xLAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjIsIAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjMsIAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjQKK307CisKKy8qIFRhYmxlIGZvciBsZXZlbF9wcmVmaXggKi8KKworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN10gPSB7CisgICAgeyAgMSwgMX0sCisgICAgeyAgMiwgMX0sCisgICAgeyAgMywgMX0sCisgICAgeyAgNCwgMX0sCisgICAgeyAgNSwgMX0sCisgICAgeyAgNiwgMX0sCisgICAgeyAgNywgMX0sCisgICAgeyAgOCwgMX0sCisgICAgeyAgOSwgMX0sCisgICAgeyAxMCwgMX0sCisgICAgeyAxMSwgMX0sCisgICAgeyAxMiwgMX0sCisgICAgeyAxMywgMX0sCisgICAgeyAxNCwgMX0sCisgICAgeyAxNSwgMX0sCisgICAgeyAxNiwgMX0sCisgICAgeyAgMCwgMH0KK307CisKKy8qIFRhYmxlcyBmb3IgdG90YWxfemVyb3MgKi8KKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczFbMTddID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDQsIDB4MDAwMyB9LAorICAgIHsgIDQsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgIDUsIDB4MDAwMiB9LAorICAgIHsgIDYsIDB4MDAwMyB9LAorICAgIHsgIDYsIDB4MDAwMiB9LAorICAgIHsgIDcsIDB4MDAwMyB9LAorICAgIHsgIDcsIDB4MDAwMiB9LAorICAgIHsgIDgsIDB4MDAwMyB9LAorICAgIHsgIDgsIDB4MDAwMiB9LAorICAgIHsgIDksIDB4MDAwMyB9LAorICAgIHsgIDksIDB4MDAwMiB9LAorICAgIHsgIDksIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMlsxNl0gPSB7CisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAgNSwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzWzE1XSA9IHsKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA0LCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDIgfSwKKyAgICB7ICA1LCAweDAwMDMgfSwKKyAgICB7ICA1LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczRbMTRdID0geworICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwNyB9LAorICAgIHsgIDQsIDB4MDAwNSB9LAorICAgIHsgIDQsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwNiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDQsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDQsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNVsxM10gPSB7CisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2WzEyXSA9IHsKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczdbMTFdID0geworICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOFsxMF0gPSB7CisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5WzldID0geworICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTBbOF0gPSB7CisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAwIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMVs3XSA9IHsKKyAgICB7ICA0LCAweDAwMDAgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyWzZdID0geworICAgIHsgIDQsIDB4MDAwMCB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTNbNV0gPSB7CisgICAgeyAgMywgMHgwMDAwIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNFs0XSA9IHsKKyAgICB7ICAyLCAweDAwMDAgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1WzNdID0geworICAgIHsgIDEsIDB4MDAwMCB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczIsCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTAsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTMsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNSAKK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMVs1XSA9IHsKKyAgICB7ICAxLCAxIH0sCisgICAgeyAgMiwgMSB9LAorICAgIHsgIDMsIDEgfSwKKyAgICB7ICAzLCAwIH0sCisgICAgeyAgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzJbNF0gPSB7CisgICAgeyAgMSwgMSB9LAorICAgIHsgIDIsIDEgfSwKKyAgICB7ICAyLCAwIH0sCisgICAgeyAgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzNbM10gPSB7CisgICAgeyAgMSwgMSB9LAorICAgIHsgIDEsIDAgfSwKKyAgICB7ICAwLCAwIH0KK307CisKK2NvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7CisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8yLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMworfTsKKworCisvKiBUYWJsZXMgZm9yIHJ1bl9iZWZvcmUgKi8KKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMVszXSA9IHsKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAxLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMls0XSA9IHsKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlM1s1XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNFs2XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNVs3XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNls4XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlN1sxNl0gPSB7CisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNywgMHgwMDAxIH0sCisgICAgeyAgOCwgMHgwMDAxIH0sCisgICAgeyAgOSwgMHgwMDAxIH0sCisgICAgeyAxMCwgMHgwMDAxIH0sCisgICAgeyAxMSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK2NvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XSA9IHsKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTQsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTcKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGJlZGMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCisgKiB0aGUgYmVzdCBNViBhbmQgU0FECisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgRXhwLUdvbG9tYiBjb2RlIGxlbmd0aCBmb3IgYSBnaXZlbiB2YWx1ZXMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICAgICAgIHZhbAlTaWduZWQgbnVtYmVyIGZvciB3aGljaCBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGhhcworICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsY3VsYXRlZAorICoKKyAqIFJldHVybiBWYWx1ZTogCisgKiAgICAgICAgICAgICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEV4cC1Hb2xvbWIgY29kZSBmb3IgdmFsCisgKi8KKworc3RhdGljIE9NWF9VMTYgYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoT01YX1MxNiB2YWwpCit7CisgICAgT01YX1UxNiBzaXplQ29kZU51bSwgY29kZU51bTsKKyAgICAKKyAgICAvKiBNYXBwaW5nIHZhbCB0byBjb2RlTnVtICovCisgICAgY29kZU51bSA9IGFybUFicyAodmFsKTsKKyAgICBpZiAodmFsID4gMCkKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSAoMiAqIGNvZGVOdW0pIC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IDIgKiBjb2RlTnVtOworICAgIH0KKyAgICAKKyAgICAvKiBTaXplIG9mIHRoZSBleHAtZ29sb21iIGNvZGUgKi8KKyAgICBzaXplQ29kZU51bSA9ICgyICogYXJtTG9nU2l6ZSAoY29kZU51bSArIDEpKSAtIDE7CisgICAgCisgICAgcmV0dXJuIHNpemVDb2RlTnVtOworfQorICAgICAgICAgICAgICAgIAorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIE1vdGlvbiBjb3N0IHRvIGRlY2lkZSB0aGUgCisgKiBiZXN0IE1WIGFuZCBiZXN0IE1DCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgICAgICBtdlgJeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvciBpbiAxLzQgcGVsIHVuaXRzCisgKiBbaW5dCSAgICAgICAgIG12WQl5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKKyAqIFtpbl0JICAgICAgZGlmZk1WCWRpZmZlcmVudGlhbCBNVgorICogW2luXQkgICAgIGNhbmRTQUQJQ2FuZGlkYXRlIFNBRAorICogW2luXQkgICAgICBiZXN0TVYJQmVzdCBNViwgY29udGFpbnMgYmVzdCBNViB0aWxsIHRoZSBwcmV2aW91cyBpbnRlcmF0aW9uLgorICogW2luXSAgICAgICBuTGFtZGEgICAgTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiBbaW5dICAgKnBCZXN0Q29zdCAgICBDb250YWlucyB0aGUgY3VycmVudCBiZXN0IG1vdGlvbiBjb3N0LgorICogW291dF0gICpwQmVzdENvc3QgICAgcEJlc3RDb3N0IE1vdGlvbiBjb3N0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WIAorICogICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIganVkZ2VtZW50OyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIGFzIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYsIGlmIHRoZSBjYW5kQ29zdCBpcyBsZXNzIAorICogICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGUgYmVzdCBjb3N0IHBhc3NlZCB0aGVuIHRoZSAqcEJlc3RDb3N0IHdpbGwgYmUgZXF1YWwgdG8gY2FuZENvc3QKKyAqIFtvdXRdCSAgYmVzdE1WCUZpbmFsbHkgd2lsbCBoYXZlIHRoZSBiZXN0IE1WIGFmdGVyIHRoZSBqdWRnZW1lbnQuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgbW90aW9uIGNvc3QgaXMgdGhlIGJlc3QgCisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgbW90aW9uIGNvc3QKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKykgCit7CisgICAgT01YX1MzMiBjYW5kQ29zdDsKKyAgICBPTVhfVTE2IHNpemVDb2RlTnVtOworICAgIAorICAgIHNpemVDb2RlTnVtID0gYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoZGlmZk1WLmR4KTsKKyAgICBzaXplQ29kZU51bSArPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHkpOworICAgIAorICAgIC8qIE1vdGlvbiBjb3N0ID0gU0FEICsgIGxhbWRhICogKChiaXRzdXNlZChkaWZmTVZ4KSArIChiaXRzdXNlZChkaWZmTVZ5KSkqLworICAgIGNhbmRDb3N0ID0gY2FuZFNBRCArIChuTGFtZGEgKiBzaXplQ29kZU51bSk7CisgICAgICAgIAorICAgIC8qIENhbGN1bGF0ZSBjYW5kQ29zdCAqLworICAgIGlmIChjYW5kQ29zdCA8ICpwQmVzdENvc3QpCisgICAgeworICAgICAgICAqcEJlc3RDb3N0ID0gY2FuZENvc3Q7CisgICAgICAgIGJlc3RNVi0+ZHggPSBtdlg7CisgICAgICAgIGJlc3RNVi0+ZHkgPSBtdlk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoY2FuZENvc3QgPiAqcEJlc3RDb3N0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIHNob3J0ZXIgbW90aW9uIHZlY3RvciAqLworICAgIGlmICggKG12WCAqIG12WCArIG12WSAqIG12WSkgPCAoKGJlc3RNVi0+ZHggKiBiZXN0TVYtPmR4KSArIChiZXN0TVYtPmR5ICogYmVzdE1WLT5keSkpICkKKyAgICB7CisgICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKKyAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKKyAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmIxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQorICogCisgKi8KKworI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVCTE9DS1BJWEVMCisjdW5kZWYgREVCVUdfT04KKyNkZWZpbmUgREVCVUdfT04KKyNlbmRpZiAvKiBERUJVR19BUk1WQ000UDEwX0RFQkxPQ0tQSVhFTCAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKykKK3sKKyAgICBpbnQgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICAgIGludCBhcCwgYXEsIGRlbHRhOworCisgICAgaWYgKGJTPT0wKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHAzID0gcFEwWy00KlN0ZXBdOworICAgIHAyID0gcFEwWy0zKlN0ZXBdOworICAgIHAxID0gcFEwWy0yKlN0ZXBdOworICAgIHAwID0gcFEwWy0xKlN0ZXBdOworICAgIHEwID0gcFEwWyAwKlN0ZXBdOworICAgIHExID0gcFEwWyAxKlN0ZXBdOworICAgIHEyID0gcFEwWyAyKlN0ZXBdOworICAgIHEzID0gcFEwWyAzKlN0ZXBdOworCisgICAgaWYgKGFybUFicyhwMC1xMCk+PWFscGhhIHx8IGFybUFicyhwMS1wMCk+PWJldGEgfHwgYXJtQWJzKHExLXEwKT49YmV0YSkKKyAgICB7CisgICAgICAgIERFQlVHX1BSSU5URl8xMCgiRGVCbG9ja1BpeGVsOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IHwgJTAyeCAlMDJ4ICUwMnggJTAyeCBhbHBoYT0lZCBiZXRhPSVkXG4iLAorICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBhbHBoYSwgYmV0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhcCA9IGFybUFicyhwMiAtIHAwKTsKKyAgICBhcSA9IGFybUFicyhxMiAtIHEwKTsKKworICAgIGlmIChiUyA8IDQpCisgICAgeworICAgICAgICBpbnQgdEMgPSB0QzA7CisKKyAgICAgICAgaWYgKENocm9tYUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRDKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXAgPCBiZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRDKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXEgPCBiZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRDKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7CisgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMsIHRDLCBkZWx0YSk7CisKKyAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcDAgKyBkZWx0YSk7CisgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOworCisgICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFwPGJldGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKKyAgICAgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKKyAgICAgICAgICAgIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXE8YmV0YSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOworICAgICAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOworICAgICAgICAgICAgcFEwWyAxKlN0ZXBdID0gKE9NWF9VOCkocTEgKyBkZWx0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBiUz09NCAqLworICAgIHsKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXA8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpKQorICAgICAgICB7CisgICAgICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zKTsKKyAgICAgICAgICAgIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKChwMiArIHAxICsgcDAgKyBxMCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKCgyKnAxICsgcDAgKyBxMSArIDIpPj4yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFxPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+Myk7CisgICAgICAgICAgICBwUTBbIDEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHAwICsgcTAgKyAyKT4+Mik7CisgICAgICAgICAgICBwUTBbIDIqU3RlcF0gPSAoT01YX1U4KSgoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+Myk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KSgoMipxMSArIHEwICsgcDEgKyAyKT4+Mik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUJVR19QUklOVEZfMTMoIkRlQmxvY2tQaXhlbDogJTAyeCAlMDJ4ICUwMnggJTAyeCB8ICUwMnggJTAyeCAlMDJ4ICUwMnggYlM9JWQgLT4gJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKyAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBiUywKKyAgICAgICAgcFEwWy0yKlN0ZXBdLCBwUTBbLTEqU3RlcF0scFEwWzAqU3RlcF0scFEwWzEqU3RlcF0pOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE2YWRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwpAQCAtMCwwICsxLDI2NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSCisjdW5kZWYgREVCVUdfT04KKyNkZWZpbmUgREVCVUdfT04KKyNlbmRpZgorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKKworLyogNHg0IERlWmlnWmFnIHRhYmxlICovCisKK3N0YXRpYyBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdbMTZdID0KK3sKKyAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Cit9OworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4ICAqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBuVGFibGUsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApCit7CisgICAgaW50IENvZWZmVG9rZW4sIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lczsKKyAgICBpbnQgTGV2ZWwsIExldmVsQ29kZSwgTGV2ZWxQcmVmaXgsIExldmVsU3VmZml4LCBMZXZlbFN1ZmZpeFNpemU7CisgICAgaW50IFN1ZmZpeExlbmd0aCwgUnVuLCBaZXJvc0xlZnQsQ29lZmZOdW07CisgICAgaW50IGksIEZsYWdzOworICAgIE9NWF9VOCAqcFBvc0NvZWZidWYgPSAqcHBQb3NDb2VmYnVmOworICAgIE9NWF9TMTYgcExldmVsWzE2XTsKKyAgICBPTVhfVTggIHBSdW5bMTZdOworCisgICAgQ29lZmZUb2tlbiA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1tuVGFibGVdKTsKKyAgICBhcm1SZXREYXRhRXJySWYoQ29lZmZUb2tlbiA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKKworICAgIFRyYWlsaW5nT25lcyA9IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbQ29lZmZUb2tlbl07CisgICAgVG90YWxDb2VmZiAgID0gYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbQ29lZmZUb2tlbl07CisgICAgKnBOdW1Db2VmZiAgID0gKE9NWF9VOClUb3RhbENvZWZmOworCisgICAgREVCVUdfUFJJTlRGXzIoIlRvdGFsQ29lZmYgPSAlZCwgVHJhaWxpbmdPbmVzID0gJWRcbiIsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyk7CisKKyAgICBpZiAoVG90YWxDb2VmZiA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgdHJhaWxpbmcgb25lcyAqLworICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+PVRvdGFsQ29lZmYtVHJhaWxpbmdPbmVzOyBpLS0pCisgICAgeworICAgICAgICBpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMZXZlbCA9ICsxOworICAgICAgICB9CisgICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOworCisgICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgKG5vbiB6ZXJvKSBsZXZlbCB2YWx1ZXMgKi8KKyAgICBTdWZmaXhMZW5ndGggPSAwOworICAgIGlmIChUb3RhbENvZWZmPjEwICYmIFRyYWlsaW5nT25lczwzKQorICAgIHsKKyAgICAgICAgU3VmZml4TGVuZ3RoPTE7CisgICAgfQorICAgIGZvciAoIDsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgICAgTGV2ZWxQcmVmaXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4KTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKExldmVsUHJlZml4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IFN1ZmZpeExlbmd0aDsKKyAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNCAmJiBTdWZmaXhMZW5ndGg9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gMTI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIExldmVsU3VmZml4ID0gMDsKKyAgICAgICAgaWYgKExldmVsU3VmZml4U2l6ZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsU3VmZml4ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgTGV2ZWxTdWZmaXhTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExldmVsQ29kZSA9IChMZXZlbFByZWZpeCA8PCBTdWZmaXhMZW5ndGgpICsgTGV2ZWxTdWZmaXg7CisKKworICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1ICYmIFN1ZmZpeExlbmd0aD09MCkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDE1OworICAgICAgICB9CisKKyAgICAgICAgLyogTGV2ZWxDb2RlID0gMioobWFnbml0dWRlLTEpICsgc2lnbiAqLworCisgICAgICAgIGlmIChpPT1Ub3RhbENvZWZmLTEtVHJhaWxpbmdPbmVzICYmIFRyYWlsaW5nT25lczwzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBMZXZlbCBtYWduaXR1ZGUgY2FuJ3QgYmUgMSAqLworICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExldmVsQ29kZSAmIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDJhKzEgbWFwcyB0byAtYS0xICovCisgICAgICAgICAgICBMZXZlbCA9ICgtTGV2ZWxDb2RlLTEpPj4xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMmErMCBtYXBzIHRvICthKzEgKi8KKyAgICAgICAgICAgIExldmVsID0gKExldmVsQ29kZSsyKT4+MTsKKyAgICAgICAgfQorICAgICAgICBwTGV2ZWxbaV0gPSAoT01YX1MxNilMZXZlbDsKKworICAgICAgICBERUJVR19QUklOVEZfMigiTGV2ZWxbJWRdID0gJWRcbiIsIGksIHBMZXZlbFtpXSk7CisKKyAgICAgICAgaWYgKFN1ZmZpeExlbmd0aD09MCkKKyAgICAgICAgeworICAgICAgICAgICAgU3VmZml4TGVuZ3RoPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2ICkKKyAgICAgICAgeworICAgICAgICAgICAgU3VmZml4TGVuZ3RoKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZWNvZGUgcnVuIHZhbHVlcyAqLworICAgIFplcm9zTGVmdCA9IDA7CisgICAgaWYgKFRvdGFsQ29lZmYgPCBzTWF4TnVtQ29lZmYpCisgICAgeworICAgICAgICAvKiBEZWNvZGUgVG90YWxaZXJvcyBWTEMgKi8KKyAgICAgICAgaWYgKHNNYXhOdW1Db2VmZj09NCkKKyAgICAgICAgeworICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzW1RvdGFsQ29lZmYtMV0pOworICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFplcm9zTGVmdCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzW1RvdGFsQ29lZmYtMV0pOworICAgICAgICAgICAgIGFybVJldERhdGFFcnJJZihaZXJvc0xlZnQgPT1BUk1fTk9fQ09ERUJPT0tfSU5ERVggLCBPTVhfU3RzX0Vycik7CisJICAgIH0KKyAgICB9CisKKyAgICBERUJVR19QUklOVEZfMSgiVG90YWxaZXJvcyA9ICVkXG4iLCBaZXJvc0xlZnQpOworCisJQ29lZmZOdW09WmVyb3NMZWZ0K1RvdGFsQ29lZmYtMTsKKworICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgUnVuID0gMDsKKyAgICAgICAgaWYgKFplcm9zTGVmdCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBUYWJsZSA9IFplcm9zTGVmdDsKKyAgICAgICAgICAgIGlmIChUYWJsZSA+IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGFibGUgPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUnVuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbVGFibGUtMV0pOworICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFJ1biA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKKyAgICAgICAgfQorICAgICAgICBwUnVuW2ldID0gKE9NWF9VOClSdW47CisKKyAgICAgICAgREVCVUdfUFJJTlRGXzIoIlJ1blslZF0gPSAlZFxuIiwgaSwgcFJ1bltpXSk7CisKKyAgICAgICAgWmVyb3NMZWZ0IC09IFJ1bjsKKyAgICB9CisgICAgcFJ1blswXSA9IChPTVhfVTgpWmVyb3NMZWZ0OworCisgICAgREVCVUdfUFJJTlRGXzEoIlJ1blswXSA9ICVkXG4iLCBwUnVuW2ldKTsKKworCisgICAgLyogRmlsbCBpbiBjb2VmZmljaWVudHMgKi8KKwkgICAgCisgICAgaWYgKHNNYXhOdW1Db2VmZj09MTUpCisgICAgeworICAgICAgICBDb2VmZk51bSsrOyAvKiBTa2lwIHRoZSBEQyBwb3NpdGlvbiAqLworICAgIH0KKwkKKwkvKmZvciAoaT0wO2k8VG90YWxDb2VmZjtpKyspCisJCUNvZWZmTnVtICs9IHBSdW5baV0rMTsqLworICAgIAorCWZvciAoaT0oVG90YWxDb2VmZi0xKTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgICAgLypDb2VmZk51bSArPSBwUnVuW2ldKzE7Ki8KKyAgICAgICAgTGV2ZWwgICAgID0gcExldmVsW2ldOworCisgICAgICAgIERFQlVHX1BSSU5URl8yKCJDb2VmWyVkXSA9ICVkXG4iLCBDb2VmZk51bSwgTGV2ZWwpOworCisgICAgICAgIEZsYWdzID0gQ29lZmZOdW07CisJCUNvZWZmTnVtIC09IChwUnVuW2ldKzEpOworICAgICAgICBpZiAoc01heE51bUNvZWZmPjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBlcmZvcm0gNHg0IERlWmlnWmFnICovCisgICAgICAgICAgICBGbGFncyA9IGFybVZDTTRQMTBfWmlnWmFnW0ZsYWdzXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaT09MCkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgLyogRW5kIG9mIGJsb2NrIGZsYWcgKi8KKyAgICAgICAgICAgIEZsYWdzICs9IDB4MjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExldmVsPC0xMjggfHwgTGV2ZWw+MTI3KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPdmVyZmxvdyBmbGFnICovCisgICAgICAgICAgICBGbGFncyArPSAweDEwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKEZsYWdzKTsKKyAgICAgICAgKnBQb3NDb2VmYnVmKysgPSAoT01YX1U4KShMZXZlbCAmIDB4RkYpOworICAgICAgICBpZiAoRmxhZ3MgJiAweDEwKQorICAgICAgICB7CisgICAgICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsPj44KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwcFBvc0NvZWZidWYgPSBwUG9zQ29lZmJ1ZjsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMyNTQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKQEAgLTAsMCArMSw0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgdGFibGVzCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl0gPSAKK3sKKyAgICAwLCAyLCAwLCAyLAorICAgIDIsIDEsIDIsIDEsCisgICAgMCwgMiwgMCwgMiwKKyAgICAyLCAxLCAyLCAxCit9OworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF0gPSAKK3sKKyAgICAwLCAyLAorICAgIDIsIDEKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM10gPQoreworICAgIHsgMTAsIDE2LCAxMyB9LAorICAgIHsgMTEsIDE4LCAxNCB9LAorICAgIHsgMTMsIDIwLCAxNiB9LAorICAgIHsgMTQsIDIzLCAxOCB9LAorICAgIHsgMTYsIDI1LCAyMCB9LAorICAgIHsgMTgsIDI5LCAyMyB9Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KK3ZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQoreworICAgIGludCBpOworCisgICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKKyAgICB7CisgICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKKyAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOworICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07CisgICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKKyAgICAgICAgaW50IGUwID0gZDAgKyBkMzsKKyAgICAgICAgaW50IGUxID0gZDAgLSBkMzsKKyAgICAgICAgaW50IGUyID0gZDEgKyBkMjsKKyAgICAgICAgaW50IGUzID0gZDEgLSBkMjsKKyAgICAgICAgaW50IGYwID0gZTAgKyBlMjsKKyAgICAgICAgaW50IGYxID0gKGUxIDw8IDEpICsgZTM7CisgICAgICAgIGludCBmMiA9IGUwIC0gZTI7CisgICAgICAgIGludCBmMyA9IGUxIC0gKGUzIDw8IDEpOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNilmMDsKKyAgICAgICAgcERzdFtpKzFdID0gKE9NWF9TMTYpZjE7CisgICAgICAgIHBEc3RbaSsyXSA9IChPTVhfUzE2KWYyOworICAgICAgICBwRHN0W2krM10gPSAoT01YX1MxNilmMzsKKyAgICB9CisKKyAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgIGludCBmMCA9IHBEc3RbaSswXTsKKyAgICAgICAgaW50IGYxID0gcERzdFtpKzRdOworICAgICAgICBpbnQgZjIgPSBwRHN0W2krOF07CisgICAgICAgIGludCBmMyA9IHBEc3RbaSsxMl07CisgICAgICAgIGludCBnMCA9IGYwICsgZjM7CisgICAgICAgIGludCBnMSA9IGYwIC0gZjM7CisgICAgICAgIGludCBnMiA9IGYxICsgZjI7CisgICAgICAgIGludCBnMyA9IGYxIC0gZjI7CisgICAgICAgIGludCBoMCA9IGcwICsgZzI7CisgICAgICAgIGludCBoMSA9IChnMSA8PCAxKSArIGczOworICAgICAgICBpbnQgaDIgPSBnMCAtIGcyOworICAgICAgICBpbnQgaDMgPSBnMSAtIChnMyA8PCAxKTsKKyAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpIGgwOworICAgICAgICBwRHN0W2krNF0gPSAoT01YX1MxNikgaDE7CisgICAgICAgIHBEc3RbaSs4XSA9IChPTVhfUzE2KSBoMjsKKyAgICAgICAgcERzdFtpKzEyXSA9IChPTVhfUzE2KSBoMzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMyZjRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispCit7CisgICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7CisgICAgT01YX1MxNiAgICAgQnVmIFsyMSAqIDE2XTsgIC8qIDIxIHJvd3MgYnkgMTYgcGl4ZWxzIHBlciByb3cgKi8KKyAgICBPTVhfVTMyICAgICB5LCB4OworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFsdWVzIHdpbGwgYmUgMS8yIHBlbCBhdCBIb3Jpem9udGFsIGRpcmVjdGlvbgorICAgICAqIFN0YXJ0aW5nIGF0ICgwLjUsIC0yKSBhdCB0b3AgZXh0ZW5kaW5nIHRvICgwLjUsIGhlaWdodCArIDMpIGF0IGJvdHRvbQorICAgICAqIEJ1ZiBjb250YWlucyBhIDJEIGFycmF5IG9mIHNpemUgKGlXaWR0aClYKGlIZWlnaHQgKyA1KQorICAgICAqLworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0ICsgNTsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSAoeS0yKSAqIGlTcmNTdGVwICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOworICAgICAgICAgICAgQnVmIFt5ICogaVdpZHRoICsgeF0gPSAoT01YX1MxNilIYWxmQ29lZmY7CisgICAgICAgIH0gLyogeCAqLworICAgIH0gLyogeSAqLworCisgICAgLyogVmVydGljYWwgaW50ZXJwb2xhdGUgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSB5ICogaVdpZHRoICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIEJ1ZiBbcG9zXSAtIAorICAgICAgICAgICAgICAgIDUgKiBCdWYgW3BvcyArIDEgKiBpV2lkdGhdICsgCisgICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDIgKiBpV2lkdGhdICsgCisgICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDMgKiBpV2lkdGhdIC0gCisgICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgNCAqIGlXaWR0aF0gKyAKKyAgICAgICAgICAgICAgICBCdWYgW3BvcyArIDUgKiBpV2lkdGhdOworCisgICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOworCisgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IChPTVhfVTgpIEhhbGZDb2VmZjsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljMDA3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpAQCAtMCwwICsxLDgyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsIAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9IHkgKiBpU3JjU3RlcCArIHg7CisgICAgICAgICAgICBIYWxmQ29lZmYgPSAKKyAgICAgICAgICAgICAgICBwU3JjIFtwb3MgLSAyXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMV0gLSAKKyAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zICsgMl0gKyAKKyAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzXTsKKworICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDE2KSA+PiA1OworICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7CisKKyAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gSGFsZkNvZWZmOworICAgICAgICB9IC8qIHggKi8KKyAgICB9IC8qIHkgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlY2ZjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggICAKKyAgICAgY29uc3QgT01YX1U4KiAgICBwU3JjLCAKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwgCisgICAgIE9NWF9VOCogICAgcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwgCisgICAgIE9NWF9VMzIgICAgaVdpZHRoLCAKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0CispCit7CisgICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7CisgICAgT01YX0lOVCAgICAgeSwgeDsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKworCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDIgKiBpU3JjU3RlcF0gLSAKKyAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMSAqIGlTcmNTdGVwXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMSAqIGlTcmNTdGVwXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyICogaVNyY1N0ZXBdICsgCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgMyAqIGlTcmNTdGVwXTsKKworICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDE2KSA+PiA1OworICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7CisKKyAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKE9NWF9VOCkgSGFsZkNvZWZmOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTA3ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCisgICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgICAgIE9NWF9VMzIgICAgIGR4LAorICAgICAgICBPTVhfVTMyICAgICBkeQorKQoreworICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeCA9IDggLSBkeDsKKyAgICBPTVhfVTMyICAgICBFaWdodE1pbnVzZHkgPSA4IC0gZHk7CisgICAgT01YX1UzMiAgICAgQUNvZWZmLCBCQ29lZmYsIENDb2VmZiwgRENvZWZmOworICAgIE9NWF9VMzIgICAgIHgsIHk7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlTcmNTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlEc3RTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlXaWR0aCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpSGVpZ2h0ID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIAorICAgIC8qIGlmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApICovCisgICAgaWYgKGR4ICE9IDAgfHwgZHkgIT0gMCkKKyAgICB7CisgICAgICAgIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeTsKKyAgICAgICAgQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHk7CisgICAgICAgIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5OworICAgICAgICBEQ29lZmYgPSBkeCAqIGR5OworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9ICgKKyAgICAgICAgICAgICAgICAgICAgQUNvZWZmICogcFNyYyBbeSAqIGlTcmNTdGVwICsgeF0gKworICAgICAgICAgICAgICAgICAgICBCQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4ICsgMV0gKworICAgICAgICAgICAgICAgICAgICBDQ29lZmYgKiBwU3JjIFsoeSArIDEpICogaVNyY1N0ZXAgKyB4XSArCisgICAgICAgICAgICAgICAgICAgIERDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHggKyAxXSArCisgICAgICAgICAgICAgICAgICAgIDMyKSA+PiA2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTc4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwpAQCAtMCwwICsxLDE5NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTTRQMTBfQ29weQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb3B5IGEgYmxvY2sgb2YgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK3N0YXRpYyBPTVhSZXN1bHQgYXJtTTRQMTBfQ29weSggIAorICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsCisgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgT01YX1U4KiAgICAgcERzdCwKKyAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCisgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfVTMyICAgICB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKQoreworICAgIE9NWF9VOCAgICAgIHBCdWYxIFsxNioxNl07CisgICAgY29uc3QgT01YX1U4ICAgICAgKnBTcmNIYWxmSG9yID0gcFNyYzsKKyAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZWZXIgPSBwU3JjOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHkgPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIFdvcmsgb3V0IHBvc2l0aW9ucyBmb3IgaGFsZiBwaXhlbCBpbnRlcnBvbGF0aW9uICovCisgICAgaWYgKGR4ID09IDMpCisgICAgeworICAgICAgICBwU3JjSGFsZlZlciArPSAxOworICAgIH0KKyAgICBpZiAoZHkgPT0gMykKKyAgICB7CisgICAgICAgIHBTcmNIYWxmSG9yICs9IGlTcmNTdGVwOworICAgIH0KKworICAgIC8qIFN3aXRjaCBvbiB0eXBlIG9mIHBpeGVsCisgICAgICogUGl4ZWxzIGFyZSBuYW1lZCAnYScgdG8gJ3MnIGFzIGluIHRoZSBILjI2NCBzdGFuZGFyZAorICAgICAqLworICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApCisgICAgeworICAgICAgICAvKiBHICovCisgICAgICAgIGFybU00UDEwX0NvcHkocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgIH0KKyAgICBlbHNlIGlmIChkeSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogYSwgYiwgYyAqLworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZlZlciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAwKQorICAgIHsKKyAgICAgICAgLyogZCwgaCwgbiAqLworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgICAgICAgICAocERzdCwgcFNyY0hhbGZIb3IsIGlEc3RTdGVwLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoZHggPT0gMiB8fCBkeSA9PSAyKQorICAgIHsKKyAgICAgICAgLyogaiAqLworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICAgICAgICAgICAgKHBTcmMsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBpZiAoZHggPT0gMSB8fCBkeCA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpLCBrICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgICAgICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAgICAgICAgIChwRHN0LCBwQnVmMSwgaURzdFN0ZXAsIGlXaWR0aCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR5ID09IDEgfHwgZHkgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZixxICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgICAgICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGR4PTEsMyBhbmQgZHk9MSwzICovCisgICAgeworICAgICAgICAvKiBlLCBnLCBwLCByICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBCdWYxLCBpV2lkdGgsIGlXaWR0aCwgaUhlaWdodCk7CisKKyAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisKKyAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAocEJ1ZjEsIHBEc3QsIGlXaWR0aCwgaURzdFN0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEzMDczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCkBAIC0wLDAgKzEsODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgNHg0IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKykKK3sKKyAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICB7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgaWYgKENvdW50PT0wKQorICAgIHsKKyAgICAgICAgU3VtID0gMTI4OworICAgIH0KKyAgICBlbHNlIGlmIChDb3VudD09MSkKKyAgICB7CisgICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIC8qIENvdW50ID0gMiAqLworICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDQpID4+IDM7CisgICAgfQorICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI1YmIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdID0KK3sKKyAgICB7MTMxMDcsIDUyNDMsIDgwNjZ9LAorICAgIHsxMTkxNiwgNDY2MCwgNzQ5MH0sCisgICAgezEwMDgyLCA0MTk0LCA2NTU0fSwKKyAgICB7IDkzNjIsIDM2NDcsIDU4MjV9LAorICAgIHsgODE5MiwgMzM1NSwgNTI0M30sCisgICAgeyA3MjgyLCAyODkzLCA0NTU5fQorfTsgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWUwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9TQURRdWFyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICBPTVhfUzMyICAgICBTQUQgPSAwOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU0FEICs9IGFybUFicyhwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSAtICgoCisgICAgICAgICAgICAgICAgICAgIHBTcmNSZWYwIFt5ICogaVJlZlN0ZXAwICsgeF0gKyAKKyAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjEgW3kgKiBpUmVmU3RlcDEgKyB4XSArIDEpID4+IDEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgKnBEc3RTQUQgPSBTQUQ7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY3NTZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgdHJhbnNmb3JtIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFRyYW5zZm9ybSByb3dzICovCisgICAgZm9yIChpPTA7IGk8MTY7IGkrPTQpCisgICAgeworICAgICAgICBpbnQgZDAgPSBwU3JjW2krMF07CisgICAgICAgIGludCBkMSA9IHBTcmNbaSsxXTsKKyAgICAgICAgaW50IGQyID0gcFNyY1tpKzJdOworICAgICAgICBpbnQgZDMgPSBwU3JjW2krM107CisgICAgICAgIGludCBlMCA9IGQwICsgZDI7CisgICAgICAgIGludCBlMSA9IGQwIC0gZDI7CisgICAgICAgIGludCBlMiA9IChkMT4+MSkgLSBkMzsKKyAgICAgICAgaW50IGUzID0gZDEgKyAoZDM+PjEpOworICAgICAgICBpbnQgZjAgPSBlMCArIGUzOworICAgICAgICBpbnQgZjEgPSBlMSArIGUyOworICAgICAgICBpbnQgZjIgPSBlMSAtIGUyOworICAgICAgICBpbnQgZjMgPSBlMCAtIGUzOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNilmMDsKKyAgICAgICAgcERzdFtpKzFdID0gKE9NWF9TMTYpZjE7CisgICAgICAgIHBEc3RbaSsyXSA9IChPTVhfUzE2KWYyOworICAgICAgICBwRHN0W2krM10gPSAoT01YX1MxNilmMzsKKyAgICB9CisKKyAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgIGludCBmMCA9IHBEc3RbaSswXTsKKyAgICAgICAgaW50IGYxID0gcERzdFtpKzRdOworICAgICAgICBpbnQgZjIgPSBwRHN0W2krOF07CisgICAgICAgIGludCBmMyA9IHBEc3RbaSsxMl07CisgICAgICAgIGludCBnMCA9IGYwICsgZjI7CisgICAgICAgIGludCBnMSA9IGYwIC0gZjI7CisgICAgICAgIGludCBnMiA9IChmMT4+MSkgLSBmMzsKKyAgICAgICAgaW50IGczID0gZjEgKyAoZjM+PjEpOworICAgICAgICBpbnQgaDAgPSBnMCArIGczOworICAgICAgICBpbnQgaDEgPSBnMSArIGcyOworICAgICAgICBpbnQgaDIgPSBnMSAtIGcyOworICAgICAgICBpbnQgaDMgPSBnMCAtIGczOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNikoKGgwKzMyKT4+Nik7CisgICAgICAgIHBEc3RbaSs0XSA9IChPTVhfUzE2KSgoaDErMzIpPj42KTsKKyAgICAgICAgcERzdFtpKzhdID0gKE9NWF9TMTYpKChoMiszMik+PjYpOworICAgICAgICBwRHN0W2krMTJdID0gKE9NWF9TMTYpKChoMyszMik+PjYpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTQ5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIGhlbHBlciBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKykKK3sKKyAgICBjb25zdCBPTVhfVTggKnBTcmMgPSAqcHBTcmM7CisgICAgaW50IGk7CisgICAgaW50IEZsYWcsIFZhbHVlOworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgcERzdFtpXSA9IDA7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIEZsYWcgID0gKnBTcmMrKzsKKyAgICAgICAgaWYgKEZsYWcgJiAweDEwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogOCBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSA9IEZsYWcgJiAxNTsKKyAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgIH0KKyAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7CisKKyAgICAqcHBTcmMgPSBwU3JjOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGRjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKQoreworICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKKyAgICBpbnQgaTsKKyAgICBpbnQgRmxhZywgVmFsdWU7CisKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcERzdFtpXSA9IDA7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIEZsYWcgID0gKnBTcmMrKzsKKyAgICAgICAgaWYgKEZsYWcgJiAweDEwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogOCBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSA9IEZsYWcgJiAxNTsKKyAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgIH0KKyAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7CisKKyAgICAqcHBTcmMgPSBwU3JjOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBkNTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQXZlcmFnZV80eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byA0eDQgb3IgNHg4IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKKyAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAorICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAorICoKKyAqLworIE9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaUhlaWdodAorKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gNCkgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCA0LCBpSGVpZ2h0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTBlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCkBAIC0wLDAgKzEsMTkxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBoYWxmIHBlbCBCbG9jayBtYXRjaGluZywgCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisgICAgCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCisgKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAorICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCisgKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAorICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZS4gSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworIAorT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAorICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCisgICAgT01YX1UzMiBuTGFtZGEsIAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCisgICAgT01YX1MzMiogcEJlc3RDb3N0CispCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX0lOVCAgICAgY2FuZFNBRDsKKyAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKKyAgICBPTVhfUzE2ICAgICB4LCB5OworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbnRlZ2VyTVY7CisgICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChuU3JjT3JnU3RlcCAlIGlCbG9ja1dpZHRoKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgIAorICAgICAgICAgICAgCisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKKyAgICBmcm9tWCA9IDE7CisgICAgdG9YICAgPSAxOworICAgIGZyb21ZID0gMTsKKyAgICB0b1kgICA9IDE7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLworICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOworICAgIAorICAgIGludGVnZXJNVi5keCA9IHBTcmNEc3RCZXN0TVYtPmR4OworICAgIGludGVnZXJNVi5keSA9IHBTcmNEc3RCZXN0TVYtPmR5OworICAgIAorICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIChpbnRlZ2VyTVYuZHkvNCkpICsgKGludGVnZXJNVi5keC80KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgKyB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHkgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSArICh5ICogblNyY1JlZlN0ZXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLworICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW50ZWdlck1WLmR4ICsgeCAqIDI7CisgICAgICAgICAgICBjYW5kTVYuZHkgPSBpbnRlZ2VyTVYuZHkgKyB5ICogMjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgaGFsZiBwZWwgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybUFicyh4KSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1BYnMoeSkgKiAyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KKyAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoCQorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNPcmdZLAorICAgICAgICAgICAgICAgICAgICAgICAgblNyY09yZ1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjYW5kU0FELAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgpOworIAorICAgICAgICAgICAgZGlmZk1WLmR4ID0gY2FuZE1WLmR4IC0gcE1WUHJlZC0+ZHg7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSBjYW5kTVYuZHkgLSBwTVZQcmVkLT5keTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keSwgCisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmTVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCwgCisgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5MYW1kYSwgCisgICAgICAgICAgICAgICAgICAgICAgICBwQmVzdENvc3QpOworCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc2NGUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCisgKiBpcyBpbXBsZW1lbnRlZAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIElmIAorICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZS4gSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAorICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAorICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAorICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2l0bmVycyBhcmUgTlVMTDoKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKKyAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisgCisgT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKwkgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICAgT01YX1UzMiBuTGFtZGEsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICAgT01YX1MzMiAqcEJlc3RDb3N0LAorICAgICB2b2lkICpwTUVTcGVjCispCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX0lOVCBjYW5kU0FEOworICAgIE9NWF9JTlQgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKKyAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLworICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOworICAgIE9NWF9TMTYgeCwgeTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVY7CisgICAgT01YX1MzMiBuU2VhcmNoUmFuZ2U7CisgICAgQVJNVkNNNFAxMF9NRVNwZWMgKmFybU1FU3BlYyA9IChBUk1WQ000UDEwX01FU3BlYyAqKSBwTUVTcGVjOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVkNhbmRpZGF0ZSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtSWdub3JlIChwTUVTcGVjKTsKKworICAgIGlmKGlCbG9ja1dpZHRoID09IDQpCisgICAgeworICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlNHg0OworICAgIH0KKyAgICBlbHNlIGlmKGlCbG9ja1dpZHRoID09IDgpCisgICAgeworICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlMTZ4MTY7CisgICAgfQorICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCisgICAgZnJvbVggPSBuU2VhcmNoUmFuZ2U7CisgICAgdG9YICAgPSBuU2VhcmNoUmFuZ2U7CisgICAgZnJvbVkgPSBuU2VhcmNoUmFuZ2U7CisgICAgdG9ZICAgPSBuU2VhcmNoUmFuZ2U7CisgICAgCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT54KQorICAgIHsKKyAgICAgICAgZnJvbVggPSAgcEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54OworICAgIH0KKworICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCArIGlCbG9ja1dpZHRoICsgblNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCisgICAgeworICAgICAgICB0b1ggICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPngpIC0gaUJsb2NrV2lkdGg7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT55KQorICAgIHsKKyAgICAgICAgZnJvbVkgPSBwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnk7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT55ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCisgICAgeworICAgICAgICB0b1kgICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnkpIC0gaUJsb2NrV2lkdGg7CisgICAgfQorICAgIAorICAgIHBCZXN0TVYtPmR4ID0gLWZyb21YICogNDsKKyAgICBwQmVzdE1WLT5keSA9IC1mcm9tWSAqIDQ7CisgICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLworICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOworICAgIAorICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIHkpICsgeDsKKyAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCisgICAgCSAgICAgICAgcFRlbXBTcmNPcmdZLAorICAgIAkgICAgICAgIG5TcmNPcmdTdGVwLAorICAgIAkgICAgICAgIHBUZW1wU3JjUmVmWSwKKyAgICAJICAgICAgICBuU3JjUmVmU3RlcCwKKyAgICAJICAgICAgICAmY2FuZFNBRCwKKyAgICAJICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgCSAgICAgICAgaUJsb2NrV2lkdGgpOworICAgIAkgICAgCisgICAgICAgICAgICBkaWZmTVYuZHggPSAoeCAqIDQpIC0gcE1WUHJlZC0+ZHg7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSAoeSAqIDQpIC0gcE1WUHJlZC0+ZHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgoeCAqIDQpLCAoeSAqIDQpLCBkaWZmTVYsIGNhbmRTQUQsIHBCZXN0TVYsIG5MYW1kYSwgcEJlc3RDb3N0KTsKKworICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCisgICAgfSAvKiBFbmQgb2YgeS1heGlzICovCisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzZWUyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHF1YXRlciBwZWwgQmxvY2sgbWF0Y2hpbmcsIAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyAKKyAgICAKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZS4gSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKKyAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KKyAKK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlcigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNPcmdZLCAKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLCAKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsIAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsIAorICAgIE9NWF9VMzIgbkxhbWRhLCAKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcE1WUHJlZCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNEc3RCZXN0TVYsIAorICAgIE9NWF9TMzIqIHBCZXN0Q29zdAorKQoreworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7CisgICAgT01YX0lOVCAgICAgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKKyAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLworICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7CisgICAgT01YX1MxNiAgICAgeCwgeTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIGNhbmRNViwgaW5pdGlhbE1WOworICAgIE9NWF9VOCAgICAgIGludGVycG9sWVsyNTZdOworICAgIE9NWF9TMzIgICAgIHBlbFBvc1gsIHBlbFBvc1k7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChuU3JjT3JnU3RlcCAlIGlCbG9ja1dpZHRoKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgIAorICAgICAgICAgICAgCisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKKyAgICBmcm9tWCA9IDE7CisgICAgdG9YICAgPSAxOworICAgIGZyb21ZID0gMTsKKyAgICB0b1kgICA9IDE7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLworICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOworICAgIAorICAgIGluaXRpYWxNVi5keCA9IHBTcmNEc3RCZXN0TVYtPmR4OworICAgIGluaXRpYWxNVi5keSA9IHBTcmNEc3RCZXN0TVYtPmR5OworICAgIAorICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIChpbml0aWFsTVYuZHkvNCkpICsgKGluaXRpYWxNVi5keC80KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGZyYWN0IHBlbCBwb3NpdGlvbiAqLworICAgICAgICAgICAgcGVsUG9zWCA9IChpbml0aWFsTVYuZHggJSA0KSArIHg7CisgICAgICAgICAgICBpZiAocGVsUG9zWCA8IDApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSAtIDE7CisgICAgICAgICAgICAgICAgcGVsUG9zWCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVsUG9zWSA9IChpbml0aWFsTVYuZHkgJSA0KSArIHk7CisgICAgICAgICAgICBpZiAocGVsUG9zWSA8IDApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSAtICgxICogblNyY1JlZlN0ZXApOworICAgICAgICAgICAgICAgIHBlbFBvc1kgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7IAorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBQcmVwYXJlIGNhbmQgTVYgKi8KKyAgICAgICAgICAgIGNhbmRNVi5keCA9IGluaXRpYWxNVi5keCArIHg7CisgICAgICAgICAgICBjYW5kTVYuZHkgPSBpbml0aWFsTVYuZHkgKyB5OworICAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgUXVhdGVyIHBlbCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24qLworICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZLAorICAgICAgICAgICAgICAgICAgICAgICAgblNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbFBvc1kpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCisgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY09yZ1ksCisgICAgICAgICAgICAgICAgICAgICAgICBuU3JjT3JnU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCk7CisgCisgICAgICAgICAgICBkaWZmTVYuZHggPSBjYW5kTVYuZHggLSBwTVZQcmVkLT5keDsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9IGNhbmRNVi5keSAtIHBNVlByZWQtPmR5OworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNViwgCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kU0FELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCZXN0Q29zdCk7CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2IxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgICAgICAgICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNhNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgICAgICAgICAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKKwljb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBkZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw4NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAorICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAorICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKKyAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAorICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAorICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAorICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCisgKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCisgKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKKyApCisKK3sKKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCA0LCA0KTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAorICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAorICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAorICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCisgKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAorICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAorICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCisgKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCisgKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAorICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAorICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCisgKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAorICoKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKQoreworICAgIGludCBuVGFibGU7CisKKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc1ZMQ1NlbGVjdDwwICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzTWF4TnVtQ29lZmY8MTUgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZj4xNiAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgLyogRmluZCBWTEMgdGFibGUgbnVtYmVyICovCisgICAgaWYgKHNWTENTZWxlY3Q8MikKKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHNWTENTZWxlY3Q8NCkKKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKHNWTENTZWxlY3Q8OCkKKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDI7CisgICAgfQorICAgIGVsc2UgLyogc1ZMQ1NlbGVjdCA+PSA4ICovCisgICAgeworICAgICAgICBuVGFibGUgPSAzOworICAgIH0KKworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIG5UYWJsZSwgc01heE51bUNvZWZmKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDVhMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlcXVhbnRpemUgTHVtYSBBQyBibG9jaworICovCisKK3N0YXRpYyB2b2lkIERlcXVhbnRMdW1hQUM0eDQoCisgICAgIE9NWF9TMTYqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorKQoreworICAgIGNvbnN0IE9NWF9VOCAqcFZSb3cgPSAmYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdOworICAgIGludCBTaGlmdCA9IFFQIC8gNjsKKyAgICBpbnQgaTsKKyAgICBPTVhfUzMyIFZhbHVlOworCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisKKyAgICAgICAgVmFsdWUgPSAocFNyY0RzdFtpXSAqIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQ7CisgICAgICAgIHBTcmNEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKKyAgICAgT01YX1U4ICpwRHN0LAorICAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9JTlQgQUMgICAgICAgIAorKQoreworICAgIE9NWF9TMTYgcEJ1ZmZlclsxNis0XTsKKyAgICBPTVhfUzE2ICpwRGVsdGE7CisgICAgaW50IGkseCx5OworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBQcmVkID09IE5VTEwsICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwUHJlZCksT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRTdGVwICYgMywgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiAzLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIChRUDwwKSwgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIChRUD41MSksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIHBwU3JjPT1OVUxMLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmICpwcFNyYz09TlVMTCwgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDPT0wICYmIHBEQz09TlVMTCwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIHBEZWx0YSA9IGFybUFsaWduVG84Qnl0ZXMocEJ1ZmZlcik7ICAgIAorCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIHBEZWx0YVtpXSA9IDA7CisgICAgfQorICAgIGlmIChBQykKKyAgICB7CisgICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQocHBTcmMsIHBEZWx0YSk7CisgICAgICAgIERlcXVhbnRMdW1hQUM0eDQocERlbHRhLCBRUCk7CisgICAgfQorICAgIGlmIChwREMpCisgICAgeworICAgICAgICBwRGVsdGFbMF0gPSBwRENbMF07CisgICAgfQorICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQocERlbHRhLHBEZWx0YSk7CisKKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClhcm1DbGlwKDAsMjU1LHBQcmVkW3kqcHJlZFN0ZXAreF0gKyBwRGVsdGFbNCp5K3hdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWRlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgY2hyb21hIGRlYmxvY2sgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKKyAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKKyAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICBPTVhfVTgqIHBTcmNEc3QsCisgICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCisgICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCisgICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKKyApCit7CisgICAgaW50IEksIFgsIFksIEludGVybmFsPTA7CisKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoWT0wOyBZPDg7IFkrPTQsIEludGVybmFsPTEpCisgICAgeworICAgICAgICBmb3IgKFg9MDsgWDw4OyBYKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWD4+MSkrNCooWT4+MSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8qIEZpbHRlciBob3Jpem9udGFsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCisgICAgICAgICAgICAgICAgc3JjZHN0U3RlcCwKKyAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWD4+MSkrNCooWT4+MildLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjI1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVibG9ja2luZyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCisgKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKKyAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCisgKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCU3BhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzBdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGFbMV0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoWD0wOyBYPDg7IFgrPTQsIEludGVybmFsPTEpCisgICAgeworICAgICAgICBmb3IgKFk9MDsgWTw4OyBZKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWT4+MSkrNCooWD4+MSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjNdICE9IDQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHNbWV0gPiAyNSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8qIEZpbHRlciB2ZXJ0aWNhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAorICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbKFk+PjEpKzQqKFg+PjIpXSwKKyAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQlNbSV0sCisgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTM3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1zIHRlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKKyAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCisgKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICBPTVhfVTgqIHBTcmNEc3QsCisgICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCisgICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCisgICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKKyApCit7CisgICAgaW50IEksIFgsIFksIEludGVybmFsPTA7CisKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgZm9yIChZPTA7IFk8MTY7IFkrPTQsIEludGVybmFsPTEpCisgICAgeworICAgICAgICBmb3IgKFg9MDsgWDwxNjsgWCsrKQorICAgICAgICB7CisgICAgICAgICAgICBJID0gKFg+PjIpKzQqKFk+PjIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwQlNbSV0gPiA0LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJIDwgNCkgICAgICAgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leMV0gIT0gNCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRmlsdGVyIGhvcml6b250YWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKKyAgICAgICAgICAgICAgICBzcmNkc3RTdGVwLAorICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzW0ldLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczMzQyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAorICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCisgKiAgICAgICAgICAgICAgaXMgTlVMTC4gCisgKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKKyAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgWCwgWSwgSSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVswXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzFdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisKKyAgICBmb3IgKFg9MDsgWDwxNjsgWCs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWT0wOyBZPDE2OyBZKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWT4+MikrNCooWD4+Mik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tZXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKHBCU1tZXSA9PSA0KSAmJiAoWSA+IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKCAocEJTW1ldID09IDQpICYmIChwQlNbWV4zXSAhPSA0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzW1ldID4gMjUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1tJXSwKKyAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQlNbSV0sCisgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjNTlkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCkBAIC0wLDAgKzEsMTkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9HZXRWTENJbmZvLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCisgKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCisgKiBzdHJ1Y3R1cmUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCisgKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCisgKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCisgKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAorICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCisgKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCisgKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCisgKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAorICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCisgKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAorICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCisgKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKKwljb25zdCBPTVhfUzE2KgkJICAgIHBTcmNDb2VmZiwKKwljb25zdCBPTVhfVTgqCQkJICAgIHBTY2FuTWF0cml4LAorCU9NWF9VOAkJCSAgICBiQUMsCisJT01YX1UzMgkJCSAgICBNYXhOdW1Db2VmLAorCU9NWFZDTTRQMTBWTENJbmZvKglwRHN0VkxDSW5mbworKQoreworICAgIE9NWF9JTlQgICAgIGksIE1pbkluZGV4OworICAgIE9NWF9TMzIgICAgIFZhbHVlOworICAgIE9NWF9VMzIgICAgIE1hc2sgPSA0LCBSdW5CZWZvcmU7CisgICAgT01YX1MxNiAgICAgKnBMZXZlbDsKKyAgICBPTVhfVTggICAgICAqcFJ1bjsKKyAgICBPTVhfUzE2ICAgICBCdWYgWzE2XTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0NvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNjYW5NYXRyaXggPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFZMQ0luZm8gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoTWF4TnVtQ29lZiA+IDE2LCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIEluaXRpYWxpemUgUkxFIEluZm8gc3RydWN0dXJlICovCisgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVzID0gMDsKKyAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyA9IDA7CisgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMgPSAwOworICAgIHBEc3RWTENJbmZvLT51VG90YWxaZXJvcyA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHBEc3RWTENJbmZvLT5pTGV2ZWxzIFtpXSA9IDA7CisgICAgICAgIHBEc3RWTENJbmZvLT51UnVucyBbaV0gPSAwOworICAgIH0KKyAgICAKKyAgICBNaW5JbmRleCA9IChiQUMgPT0gMCAmJiBNYXhOdW1Db2VmID09IDE1KSA/IDEgOiAwOworICAgIGZvciAoaSA9IE1pbkluZGV4OyBpIDwgKE1heE51bUNvZWYgKyBNaW5JbmRleCk7IGkrKykKKyAgICB7ICAgICAgICAKKyAgICAgICAgLyogU2NhbiAqLworICAgICAgICBCdWYgW2kgLSBNaW5JbmRleF0gPSBwU3JjQ29lZmYgW3BTY2FuTWF0cml4IFtpXV07CisgICAgfQorCisgICAgLyogc2tpcCB6ZXJvcyBhdCB0aGUgZW5kICovCisgICAgaSA9IE1heE51bUNvZWYgLSAxOworICAgIHdoaWxlICghQnVmIFtpXSAmJiBpID49IDApCisgICAgeworICAgICAgICBpLS07CisgICAgfQorICAgIAorICAgIGlmIChpIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIC8qIEZpbGwgUkxFIEluZm8gc3RydWN0dXJlICovCisgICAgcExldmVsID0gcERzdFZMQ0luZm8tPmlMZXZlbHM7CisgICAgcFJ1biA9IHBEc3RWTENJbmZvLT51UnVuczsKKyAgICBSdW5CZWZvcmUgPSAwOworCisgICAgLyogSGFuZGxlIGZpcnN0IG5vbiB6ZXJvIHNlcGFyYXRlICovCisgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMrKzsKKyAgICBWYWx1ZSA9IEJ1ZiBbaV07CisgICAgaWYgKFZhbHVlID09IDEgfHwgVmFsdWUgPT0gLTEpCisgICAgeworICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMrKzsKKyAgICAgICAgCisgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAorICAgICAgICAgICAgVmFsdWUgPT0gLTEgPyBNYXNrIDogMDsKKyAgICAgICAgTWFzayA+Pj0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gKFZhbHVlID4gMCA/IDEgOiAtMSk7CisgICAgICAgICpwTGV2ZWwrKyA9IFZhbHVlOworICAgICAgICBNYXNrID0gMDsKKyAgICB9CisKKyAgICAvKiBSZW1haW5pbmcgbm9uIHplcm8gKi8KKyAgICB3aGlsZSAoLS1pID49IDApCisgICAgeworICAgICAgICBWYWx1ZSA9IEJ1ZiBbaV07CisgICAgICAgIGlmIChWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMrKzsKKworICAgICAgICAgICAgLyogTWFzayBiZWNvbWVzIHplcm8gYWZ0ZXIgZW50ZXJpbmcgKi8KKyAgICAgICAgICAgIGlmIChNYXNrICYmCisgICAgICAgICAgICAgICAgKFZhbHVlID09IDEgfHwgCisgICAgICAgICAgICAgICAgIFZhbHVlID09IC0xKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMrKzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyB8PSAKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEgPyBNYXNrIDogMDsKKyAgICAgICAgICAgICAgICBNYXNrID4+PSAxOworICAgICAgICAgICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7CisgICAgICAgICAgICAgICAgUnVuQmVmb3JlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiAzIHRyYWlsaW5nIG9uZXMgYXJlIG5vdCBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoTWFzaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7CisgICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKKyAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zKys7CisgICAgICAgICAgICBSdW5CZWZvcmUrKzsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qIFVwZGF0ZSBsYXN0IHJ1biAqLworICAgIGlmIChSdW5CZWZvcmUpCisgICAgeworICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjRkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jaworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKKyAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGguIAorICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjLAorICAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX1MzMiBkc3RTdGVwLAorICAgICBPTVhfUzMyIGR4LAorICAgICBPTVhfUzMyIGR5LAorICAgICBPTVhTaXplIHJvaQorICkKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHkgPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggIT0gMikgJiYgKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSAyKSAmJiAocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAyKSAmJiBhcm1Ob3QyQnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKKyAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGJlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEhhbGYgaG9yaXpvbnRhbCBsdW1hIGludGVycG9sYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAorICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAorICogICAgICAgICAgICAoLTEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAorICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdExlZnQsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0UmlnaHQsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsgICAgCisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RSaWdodCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDQpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA4KSAmJiAKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gMTYpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZigoaVdpZHRoICE9IDE2KSAmJiAoaVdpZHRoICE9IDgpJiYgKGlXaWR0aCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAorICAgICAgICBwU3JjIC0gMSwgICAgIAorICAgICAgICBpU3JjU3RlcCwgCisgICAgICAgIHBEc3RMZWZ0LCAgICAgCisgICAgICAgIGlEc3RTdGVwLCAKKyAgICAgICAgaVdpZHRoLCAgIAorICAgICAgICBpSGVpZ2h0KTsKKworICAgIGlmIChSZXRWYWx1ZSAhPSBPTVhfU3RzX05vRXJyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJldFZhbHVlOworICAgIH0KKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgICAgIHBTcmMsICAgICAKKyAgICAgICAgaVNyY1N0ZXAsIAorICAgICAgICBwRHN0UmlnaHQsICAgICAKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsICAgCisgICAgICAgIGlIZWlnaHQpOworCisgICAgcmV0dXJuIFJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjBmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCisgKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworIE9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCisgICAgIGNvbnN0IE9NWF9VOCogICAgcFNyYywgCisgICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsIAorICAgICBPTVhfVTgqICAgIHBEc3RVcCwgCisgICAgIE9NWF9VOCogICAgcERzdERvd24sIAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsIAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFVwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3REb3duID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0VXApICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0VXApICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAorICAgICAgICBwU3JjIC0gaVNyY1N0ZXAsIAorICAgICAgICBpU3JjU3RlcCwgCisgICAgICAgIHBEc3RVcCwKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsIAorICAgICAgICBpSGVpZ2h0KTsKKyAgICAKKyAgICBpZiAoUmV0VmFsdWUgIT0gT01YX1N0c19Ob0VycikKKyAgICB7CisgICAgICAgIHJldHVybiBSZXRWYWx1ZTsKKyAgICB9CisKKyAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKKyAgICAgICAgcFNyYywgCisgICAgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgcERzdERvd24sCisgICAgICAgIGlEc3RTdGVwLCAKKyAgICAgICAgaVdpZHRoLCAKKyAgICAgICAgaUhlaWdodCk7CisgICAgCisgICAgcmV0dXJuIFJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzMzczNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiAKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAorICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAorICogICBkc3RTdGVwIC1kZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGggCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCisgICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgZHgsCisgICAgIE9NWF9TMzIgZHksCisgICAgIE9NWFNpemUgcm9pICAgICAgICAKKyApCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpICYmIChyb2kud2lkdGggIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSAmJiAocm9pLmhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAxNikgJiYgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikgCisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hIAorICAgICAgICAocFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiYTAzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDICAKKyAqIGNvZWZmaWNpZW50cyBhbmQgcXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDKAorCWNvbnN0IE9NWF9TMTYqIAlwU3JjLAorCU9NWF9TMTYqCXBEc3QsCisJT01YX1UzMgkJaVFQCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBtWzJdWzJdOworICAgIE9NWF9TMzIgICAgIFFQZXIsIFYwMCwgVmFsdWU7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogSW52IEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgMngyIGJsb2NrICovCisgICAgbVswXVswXSA9IHBTcmNbMF0gKyBwU3JjWzFdICsgIHBTcmNbMl0gKyBwU3JjWzNdOworICAgIG1bMF1bMV0gPSBwU3JjWzBdIC0gcFNyY1sxXSArICBwU3JjWzJdIC0gcFNyY1szXTsKKyAgICBtWzFdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gLSAgcFNyY1syXSAtIHBTcmNbM107CisgICAgbVsxXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdIC0gIHBTcmNbMl0gKyBwU3JjWzNdOworCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgLyogU2NhbGluZyAqLworICAgIFFQZXIgPSBpUVAgLyA2OworICAgIFYwMCA9IGFybVZDTTRQMTBfVk1hdHJpeCBbaVFQICUgNl1bMF07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQZXIgPCAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gKG1bal1baV0gKiBWMDApID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPDwgKFFQZXIgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcERzdFtqICogMiArIGldID0gKE9NWF9TMTYpIFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMTIwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDKAkKKwljb25zdCBPTVhfUzE2KiAJcFNyYywKKwlPTVhfUzE2KglwRHN0LAorCU9NWF9VMzIJCWlRUAorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgbTFbNF1bNF0sIG0yWzRdWzRdLCBWYWx1ZTsKKyAgICBPTVhfUzMyICAgICBRUGVyLCBWOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIEludiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIERDIEx1bWEgNHg0IGJsb2NrICovCisgICAgLyogSG9yaXpvbnRhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBqID0gaSAqIDQ7CisgICAgICAgIAorICAgICAgICBtMVtpXVswXSA9IHBTcmNbaiArIDBdICsgcFNyY1tqICsgMl07IC8qIGErYyAqLworICAgICAgICBtMVtpXVsxXSA9IHBTcmNbaiArIDFdICsgcFNyY1tqICsgM107IC8qIGIrZCAqLworICAgICAgICBtMVtpXVsyXSA9IHBTcmNbaiArIDBdIC0gcFNyY1tqICsgMl07IC8qIGEtYyAqLworICAgICAgICBtMVtpXVszXSA9IHBTcmNbaiArIDFdIC0gcFNyY1tqICsgM107IC8qIGItZCAqLworCisgICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLworICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KKyAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCisgICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLworCisgICAgfQorCisgICAgLyogVmVydGljYWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOworICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07CisgICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKKyAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOworCisgICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKKyAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOworICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07CisgICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKKyAgICB9CisKKyAgICAKKyAgICAvKiBTY2FsaW5nICovCisgICAgUVBlciA9IGlRUCAvIDY7CisgICAgViA9IGFybVZDTTRQMTBfVk1hdHJpeCBbaVFQICUgNl1bMF07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQZXIgPCAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gKG0yW2pdW2ldICogViArICgxIDw8ICgxIC0gUVBlcikpKSA+PiAoMiAtIFFQZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gbTJbal1baV0gKiBWICogKDEgPDwgKFFQZXIgLSAyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBEc3RbaiAqIDQgKyBpXSA9IChPTVhfUzE2KSBWYWx1ZTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDM5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW52ZXJzZSBpbnRlZ2VyIDR4NCB0cmFuc2Zvcm0KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCisgKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCisgKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAorICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBtYXRyaXguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQoCisJY29uc3QgT01YX1U4KiAJcFNyY1ByZWQsIAorCWNvbnN0IE9NWF9TMTYqIAlwRGVxdWFudENvZWZmLCAKKwlPTVhfVTgqIAlwRHN0UmVjb24sCisJT01YX1UzMiAJaVNyY1ByZWRTdGVwLCAKKwlPTVhfVTMyCQlpRHN0UmVjb25TdGVwLCAKKwlPTVhfVTgJCWJBQworKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MxNiAgICAgSW5bMTZdLCBPdXRbMTZdOworICAgIE9NWF9TMzIgICAgIFZhbHVlOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1ByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERlcXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERlcXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RSZWNvbiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJlY29uKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAgfHwgaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaURzdFJlY29uU3RlcCA9PSAwIHx8IGlEc3RSZWNvblN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGlmIChiQUMpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSW5baV0gPSBwRGVxdWFudENvZWZmIFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBDb3B5IERDICovCisgICAgICAgIEluWzBdID0gcERlcXVhbnRDb2VmZiBbMF07CisgICAgCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBJbltpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KKyAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChPdXQsIEluKTsgICAgCisgICAgCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFkZCBwcmVkaXRpb24gKi8KKyAgICAgICAgICAgIFZhbHVlID0gKE9NWF9TMzIpIE91dCBbaiAqIDQgKyBpXSArIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFNhdHVyYXRlIFZhbHVlIHRvIE9NWF9VOCAqLworICAgICAgICAgICAgVmFsdWUgPSBhcm1DbGlwICgwLCAyNTUsIFZhbHVlKTsKKworICAgICAgICAgICAgcERzdFJlY29uW2ogKiBpRHN0UmVjb25TdGVwICsgaV0gPSAoT01YX1U4KSBWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzYTVjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKKyAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAorICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVNb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCisgICAgKQoreworICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighcFNpemUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgICAgICAgIAorICAgICpwU2l6ZSA9IChPTVhfSU5UKSBzaXplb2YoQVJNVkNNNFAxMF9NRVNwZWMpOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlY2M4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKQEAgLTAsMCArMSw5MiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTUVJbml0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAorICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAorICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCisgKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAorICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCisgKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAorICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKKyAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQoCisgICAgICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVNb2RlLAorICAgICAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICAgICAgdm9pZCAqcE1FU3BlYworICAgICAgICkKK3sKKyAgICBBUk1WQ000UDEwX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMTBfTUVTcGVjICopIHBNRVNwZWM7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFwTUVTcGVjLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmIAorICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYgPD0gMCkgfHwgCisgICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDggPD0gMCkgfHwgCisgICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQgPD0gMCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU4eDggPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU4eDg7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ibG9ja1NwbGl0RW5hYmxlNHg0ID0gcE1FUGFyYW1zLT5ibG9ja1NwbGl0RW5hYmxlNHg0OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlNlYXJjaEVuYWJsZSAgICA9IHBNRVBhcmFtcy0+aGFsZlNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnF1YXJ0ZXJTZWFyY2hFbmFibGUgPSBwTUVQYXJhbXMtPnF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5pbnRyYUVuYWJsZTR4NCAgICAgID0gcE1FUGFyYW1zLT5pbnRyYUVuYWJsZTR4NDsgICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UxNngxNiAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNjsgICAKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4ICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U0eDQgICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQ7CisgICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkYmYzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKQEAgLTAsMCArMSwxODkyIEBACisvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIE1CIGxldmVsIG1vdGlvbiBlc3RpbWF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9GUkFNRVMgICAgICgxNSkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF80eDRfU0FECQkoMHhmZmZmKQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX01PREVfVkFMVUUgICAgICgweGZmZmZmZmZmKQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX01PREVTICAgICAgICAgICgxNikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01CX0JMT0NLX1NJWkUgICAgICAoMTYpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NRURJQU4oYSxiLGMpICAgICAgKGE+Yj9hPmM/Yj5jP2I6YzphOmI+Yz9hPmM/YTpjOmIpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9TSElGVF9RUCAgICAgICAgICAgKDEyKQorCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOICAgICAgKDApCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfTCAgICAgICAgICAgKDEpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfVSAgICAgICAgICAgKDIpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfVVIgICAgICAgICAgKDMpCisKKyNkZWZpbmUgQVJNX1ZDTTRQMTBfTUJfQkxPQ0tfU0laRSAgICAgICAoMTYpCisjZGVmaW5lIEFSTV9WQ000UDEwX0JMT0NLX1NJWkUgICAgICAgICAgKDQpCisjZGVmaW5lIEFSTV9WQ000UDEwX01BWF9DT1NUICAgICAgICAgICAgKDEgPDwgMzApCisjZGVmaW5lICBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLICAgICAgKC0yKQorCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIENhbGN1bGF0ZSBTQUQgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBNQiBlbmNvZGluZyBtb2RlIGFuZCB1cGRhdGUgCisgKiBwRHN0QmxvY2tTQUQgcGFyYW1ldGVyLiBUaGVzZSBTQUQgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIDR4NCBibG9ja3MgYXQKKyAqIGEgdGltZSBhbmQgaW4gdGhlIHNjYW4gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjTUJJbmZvICAgIC0gCisgKiBbaW5dIHBTcmNDdXJyQnVmICAgLSAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgICAtIAorICogW2luXSBwU3JjUmVmQnVmTGlzdC0gCisgKiBbaW5dIFNyY1JlZlN0ZXAgICAgLSAKKyAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIAorICogW2luXSBTcmNSZWNTdGVwICAgIC0gCisgKiBbaW5dIHBSZWZSZWN0ICAgICAgLSAKKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAtIAorICogW2luXSBMYW1iZGEgICAgICAgIC0gCisgKiBbaW5dIHBNRVNwZWMgICAgICAgLSAKKyAqIFtpbl0gcE1CSW50ZXIgICAgICAtIAorICogW2luXSBwTUJJbnRyYSAgICAgIC0gCisgKiBbb3V0XSBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIDE2IGVsZW1lbnQgYXJyYXkgZm9yIFNBRCBjb3JyZXNwb25kaW5nIHRvIDR4NCBibG9ja3MKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FEKAorCU9NWFZDTTRQMTBNQkluZm8gKnBTcmNNQkluZm8sIAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAorCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCisJT01YX1MzMiBTcmNSZWZTdGVwLAorCWNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwgCisJT01YX1MzMiBTcmNSZWNTdGVwLAorCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorCU9NWF9VMTYgKnBEc3RCbG9ja1NBRCkKK3sKKwlPTVhfSU5UCQlJbnZhbGlkU0FEID0gMDsKKwlPTVhfSU5UCQlpOworCisJT01YX1U4CQlCdWZmZXIgWzE2KjE2ICsgMTVdOworCU9NWF9VOAkJKnBUZW1wRHN0QnVmOworCU9NWF9TMzIJCVRlbXBEc3RTdGVwOworCU9NWF9VOAkJKnBUZW1wUmVmQnVmOworCU9NWF9TMzIJCVRlbXBSZWZTdGVwOyAKKworCS8qIFRlbXBvcmFyeSBidWZmZXIgdG8gc3RvcmUgdGhlIHByZWRpY3RlZCBtYiBjb2VmZmljaWVudHMgKi8KKwlwVGVtcERzdEJ1ZiA9IGFybUFsaWduVG8xNkJ5dGVzKEJ1ZmZlcik7CisJVGVtcERzdFN0ZXAgPSAxNjsKKworCS8qIFVwZGF0ZSBwRHN0QmxvY2tTQUQgaWYgTUIgaXMgYSB2YWxpZCB0eXBlICovCisJaWYgKHBTcmNNQkluZm8pCisJeworCSAgICBPTVhfVTMyICAgICBXaWR0aD0wLCBIZWlnaHQ9MCwgTWF4WFBhcnQsIE1heFlQYXJ0LE1heFN1YlhQYXJ0LE1heFN1YllQYXJ0OworCSAgICAKKwkJLyogRGVwZW5kaW5nIG9uIHR5cGUgb2YgTUIsIGRvIHByZWRpY3Rpb24gYW5kIGZpbGwgdGVtcCBidWZmZXIgKi8KKwkJc3dpdGNoIChwU3JjTUJJbmZvLT5tYlR5cGUpCisJCXsKKwkJY2FzZSBPTVhfVkNfUF8xNngxNjoKKwkJCQlXaWR0aCA9IDE2OworCQkJCUhlaWdodCA9IDE2OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19QXzE2eDg6CisJCQkJV2lkdGggPSAxNjsKKwkJCQlIZWlnaHQgPSA4OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19QXzh4MTY6CisJCQkJV2lkdGggPSA4OworCQkJCUhlaWdodCA9IDE2OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19QXzh4ODoKKwkJCQlXaWR0aCA9IDg7CisJCQkJSGVpZ2h0ID0gODsKKwkJCQlicmVhazsKKwkJY2FzZSBPTVhfVkNfSU5UUkFfNHg0OgorCQkJeworCQkJCS8qIENyZWF0ZSBwcmVkaWN0ZWQgTUIgSW50cmE0eDQgbW9kZSAqLworCQkJCU9NWF9TMzIgICAgIFByZWRJbnRyYTR4NE1vZGUgWzVdWzldOworCQkJCU9NWF9TMzIJCXgsIHksIEJsb2NrOHg4LCBCbG9jazR4NCwgQmxvY2tYLCBCbG9ja1k7CisJCQkJT01YX1U4ICAgICAgcFNyY1lCdWZmIFsoMTYqMykqKDE2KjIpXTsKKwkJCQlPTVhfVTgJCSpwU3JjWTsKKwkJCQlPTVhfUzMyICAgICBTdGVwU3JjWTsKKwkJCQlPTVhfUzMyCQlhdmFpbGFiaWxpdHk7CisKKwkJCQlmb3IgKHkgPSAwOyB5IDwgNTsgeSsrKQorCQkJCXsKKwkJCQkJZm9yICh4ID0gMDsgeCA8IDk7IHgrKykKKwkJCQkJeworCQkJCQkJLyogCisJCQkJCQkgKiBJbml0aWFsaXplIHdpdGggdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSywgdG8gbWVhbiB0aGlzIAorCQkJCQkJICogNHg0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgCisJCQkJCQkgKi8KKwkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIFJlcGxhY2UgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB2YWx1ZSB3aXRoIGF2YWlsYWJsZSBNQnMgdmFsdWVzKi8KKwkJCQlmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGIwLCBiMSwgYjIsIGIzICovCisJCQkJCWlmIChwTUJJbnRyYVsxXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgMV0gPSAKKwkJCQkJCQlwTUJJbnRyYVsxXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07ICAgICAgICAgICAgCisJCQkJCX0KKwkJCSAgICAgICAgCisJCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBkMCwgZDEsIGQyLCBkMyAqLworCQkJCQlpZiAocE1CSW50cmFbM10gIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDVdID0gCisJCQkJCQkJcE1CSW50cmFbM10tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOworCQkJCQl9CisJCQkJfQorCQkgICAgCisJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGMzICovCisJCQkJaWYgKHBNQkludHJhWzJdICE9IE5VTEwpCisJCQkJeworCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVswXSA9IHBNQkludHJhWzJdLT5wSW50cmE0eDRQcmVkTW9kZVsxNV07CisJCQkJfQorCQkgICAgCisJCQkJZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKwkJCQl7CisJCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBhMCwgYTEsIGEyLCBhMyAqLworCQkJCQlpZiAocE1CSW50cmFbMF0gIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeSArIDFdWzBdID0gCisJCQkJCQkJcE1CSW50cmFbMF0tPnBJbnRyYTR4NFByZWRNb2RlW3kqNCArIDNdOworCQkJCQl9CisJCQkJfQorCQkgICAgICAgIAorCQkJCS8qCisJCQkJICogVXBkYXRlIG5laWdoYm91cmluZyBQcmVkIG1vZGUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgorCQkJCSAqIHByZWRpY3Rpb24gb2YgSW50cmE0eDQgbW9kZXMuCisJCQkJICovCisJCQkgICAgCisJCQkJcFNyY1kgPSBwU3JjWUJ1ZmY7CisJCQkJU3RlcFNyY1kgPSAxNiAqIDM7CisJCQkJZm9yICh5ID0gMDsgeSA8ICgxNiAqIDIpOyB5KyspCisJCQkJeworCQkJCQlmb3IgKHggPSAwOyB4IDwgKDE2ICogMyk7IHgrKykKKwkJCQkJeworCQkJCQkJcFNyY1kgW1N0ZXBTcmNZICogeSArIHhdID0gCisJCQkJCQkJcFNyY1JlY0J1ZiBbU3JjUmVjU3RlcCAqICh5IC0gMTYpICsgeCAtIDE2XTsKKwkJCQkJfQorCQkJCX0KKworCQkgICAgCisJCQkJLyogZm9yIGVhY2ggOHg4IGJsb2NrICovCisJCQkJZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKKwkJCQl7CisJCQkJCS8qIGZvciBlYWNoIDR4NCBibG9jayBpbnNpZGUgOHg4IGJsb2NrICovCisJCQkJCWZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCisJCQkJCXsKKwkJCQkJCS8qIEdldCBibG9jayBjb3JkaW5hdGVzIGZyb20gOHg4IGJsb2NrIGluZGV4IGFuZCA0eDQgYmxvY2sgaW5kZXggKi8KKwkJCQkJCUJsb2NrWCA9ICgoQmxvY2s4eDggJiAxKSA8PCAxKSArIChCbG9jazR4NCAmIDEpOworCQkJCQkJQmxvY2tZID0gKChCbG9jazh4OCA+PiAxKSA8PCAxKSArIChCbG9jazR4NCA+PiAxKTsKKwkJCQkJICAgIAorCQkJCQkJLyogQWRkIG9mZnNldCB0byBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IE1CIGluIHRoZSBhcnJheSBwSW50cmE0eDRQcmVkTW9kZSAqLworCQkJCQkJeCA9IEJsb2NrWCArIDE7CisJCQkJCQl5ID0gQmxvY2tZICsgMTsKKworCQkJCQkJYXZhaWxhYmlsaXR5ID0gMDsKKworCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIEJsb2NrICovCisJCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisJCQkJCQl7CisJCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCisJCQkJCQl9CisKKwkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgQmxvY2sgKi8KKwkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5IC0gMV1beF0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKwkJCQkJCXsKKwkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCisJCQkJCQl9CisKKwkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgTEVGVCBCbG9jayAqLworCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3kgLSAxXVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKwkJCQkJCXsKKwkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBwU3JjTUJJbmZvLT5wSW50cmE0eDRQcmVkTW9kZVtCbG9ja1kqNCtCbG9ja1hdOworCQkJCQkJeCA9IEJsb2NrWCAqIDQ7CisJCQkJCQl5ID0gQmxvY2tZICogNDsKKworCQkJCQkJcFNyY1kgPSBwU3JjWUJ1ZmYgKyAxNiAqIFN0ZXBTcmNZICsgMTYgKyB5ICogU3RlcFNyY1kgKyB4OworCisJCQkJCQlvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCisJCQkJCQkJIHBTcmNZIC0gMSwKKwkJCQkJCQkgcFNyY1kgLSBTdGVwU3JjWSwKKwkJCQkJCQkgcFNyY1kgLSBTdGVwU3JjWSAtIDEsCisJCQkJCQkJIHBUZW1wRHN0QnVmICsgeCArIHkgKiBUZW1wRHN0U3RlcCwKKwkJCQkJCQkgU3RlcFNyY1ksCisJCQkJCQkJIFRlbXBEc3RTdGVwLAorCQkJCQkJCSBwU3JjTUJJbmZvLT5wSW50cmE0eDRQcmVkTW9kZVtCbG9ja1kqNCtCbG9ja1hdLAorCQkJCQkJCSBhdmFpbGFiaWxpdHkpOworCisJCQkJCQlmb3IgKEJsb2NrWT0wO0Jsb2NrWTw0O0Jsb2NrWSsrKQorCQkJCQkJeworCQkJCQkJCWZvcihCbG9ja1g9MDtCbG9ja1g8NDtCbG9ja1grKykKKwkJCQkJCQl7CisJCQkJCQkJCXBTcmNZIFtCbG9ja1kgKiBTdGVwU3JjWSArIEJsb2NrWF0gPSAKKwkJCQkJCQkJCShPTVhfVTgpKCoocFRlbXBEc3RCdWYgKyB4ICsgeSAqIFRlbXBEc3RTdGVwICsgQmxvY2tZICogVGVtcERzdFN0ZXAgKyBCbG9ja1gpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBPTVhfVkNfSU5UUkFfMTZ4MTY6CisJCQl7CisJCQkJT01YX1UzMiAgICAgTUJQb3NYID0gcEN1cnJQb2ludFBvcy0+eCA+PiA0OyAgICAgICAgCisJCQkJT01YX1UzMiAgICAgTUJQb3NZID0gcEN1cnJQb2ludFBvcy0+eSA+PiA0OyAgICAgICAgCisJCQkJT01YX1UzMgkJYXZhaWxhYmlsaXR5ID0gMDsKKworCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBNQiAqLworCQkJCWlmICgoTUJQb3NYICE9IDApICYmIChwTUJJbnRyYSBbMF0gIT0gMCB8fCBwTUJJbnRlciBbMF0gIT0gMCkpCisJCQkJeworCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKKwkJCQl9CisKKwkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQIE1CICovCisJCQkJaWYgKChNQlBvc1kgIT0gMCkgJiYgKHBNQkludHJhIFsxXSAhPSAwIHx8IHBNQkludGVyIFsxXSAhPSAwKSkKKwkJCQl7CisJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKKwkJCQl9CisKKwkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQLUxFRlQgTUIgKi8KKwkJCQlpZiAoKE1CUG9zWCA+IDApICYmIChNQlBvc1kgPiAwKSAmJiAKKwkJCQkJKHBNQkludHJhIFsyXSAhPSAwIHx8IHBNQkludGVyIFsyXSAhPSAwKSkKKwkJCQl7CisJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAorCQkJCX0KKworCQkJCW9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAorCQkJCQkJcFNyY1JlY0J1ZiAtIDEsIAorCQkJCQkJcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAsIAorCQkJCQkJcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAgLSAxLCAKKwkJCQkJCXBUZW1wRHN0QnVmLCAKKwkJCQkJCVNyY1JlY1N0ZXAsIAorCQkJCQkJVGVtcERzdFN0ZXAsIAorCQkJCQkJcFNyY01CSW5mby0+SW50cmExNngxNlByZWRNb2RlLCAKKwkJCQkJCWF2YWlsYWJpbGl0eSk7CisJCQkJCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBPTVhfVkNfSU5URVJfU0tJUDoKKwkJY2FzZSBPTVhfVkNfUFJFRjBfOHg4OgorCQljYXNlIE9NWF9WQ19JTlRSQV9QQ006CisJCWRlZmF1bHQ6CisJCQkvKiBUaGVzZSBjYXNlcyB3aWxsIHVwZGF0ZSBwRHN0QmxvY2tTQUQgd2l0aCBNQVggdmFsdWUgKi8KKwkJCUludmFsaWRTQUQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJTlRFUiBNQiAqLworCQlpZiAoKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF8xNngxNikgfHwKKwkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfOHgxNikgfHwKKwkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfMTZ4OCkgfHwKKwkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfOHg4KSkKKwkJeworICAgICAgICAJY29uc3QgT01YX1U4CQkqcFRlbXBTcmNCdWY7CisgICAgICAgIAlPTVhfUzMyCQlUZW1wU3JjU3RlcDsKKyAgICAgICAgCU9NWF9TMzIJCW12eCxtdnk7CisgICAgICAgIAlPTVhfVTMyCQlQYXJ0WCwgUGFydFksIFN1YlBhcnRYLCBTdWJQYXJ0WTsKKyAgICAgICAgCQorCQkJVGVtcFNyY1N0ZXAgPSBTcmNSZWZTdGVwOworCisJCQlNYXhYUGFydCA9IDE2L1dpZHRoOworCQkJTWF4WVBhcnQgPSAxNi9IZWlnaHQ7CisKKworCQkJZm9yIChQYXJ0WSA9IDA7IFBhcnRZIDwgTWF4WVBhcnQ7IFBhcnRZKyspCisJCQl7CisJCQkJZm9yIChQYXJ0WCA9IDA7IFBhcnRYIDwgTWF4WFBhcnQ7IFBhcnRYKyspCisJCQkJeworCisJCQkJCXBUZW1wU3JjQnVmID0gcFNyY1JlZkJ1Zkxpc3RbcFNyY01CSW5mby0+cFJlZkwwSWR4W1BhcnRZICogMiArIFBhcnRYXV07CisKKwkJCQkJaWYgKE1heFhQYXJ0ID09IDIgJiYgTWF4WVBhcnQgPT0gMikKKwkJCQkJeworICAgICAgICAJCQkJc3dpdGNoIChwU3JjTUJJbmZvLT5zdWJNQlR5cGVbUGFydFkqMitQYXJ0WF0pCisgICAgICAgIAkJCQl7CisgICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfOHg4OgorCQkJCQkJCQlXaWR0aCA9IDg7CisJCQkJCQkJCUhlaWdodCA9IDg7CisgICAgICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzh4NDoKKwkJCQkJCQkJV2lkdGggPSA4OworCQkJCQkJCQlIZWlnaHQgPSA0OworICAgICAgICAgICAgCQkJCSAgICBicmVhazsKKyAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF80eDg6CisJCQkJCQkJCVdpZHRoID0gNDsKKwkJCQkJCQkJSGVpZ2h0ID0gODsKKyAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfNHg0OgorCQkJCQkJCQlXaWR0aCA9IDQ7CisJCQkJCQkJCUhlaWdodCA9IDQ7CisgICAgICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJICAgIGRlZmF1bHQ6CisJCQkJCQkJCS8qIERlZmF1bHQgKi8KKwkJCQkJCQkJV2lkdGggPSA0OworCQkJCQkJCQlIZWlnaHQgPSA0OworICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJfQorCQkJCQkKKyAgICAJCQkJICAgIE1heFN1YlhQYXJ0ID0gOC9XaWR0aDsKKyAgICAJCQkJICAgIE1heFN1YllQYXJ0ID0gOC9IZWlnaHQ7CisKKwkJCQkJCWZvciAoU3ViUGFydFkgPSAwOyBTdWJQYXJ0WSA8IE1heFN1YllQYXJ0OyBTdWJQYXJ0WSsrKQorCQkJCQkJeworCQkJCQkJCWZvciAoU3ViUGFydFggPSAwOyBTdWJQYXJ0WCA8IE1heFN1YlhQYXJ0OyBTdWJQYXJ0WCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJbXZ4ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WSArIFN1YlBhcnRZXVsyKlBhcnRYICsgU3ViUGFydFhdLmR4OworCQkJCQkJCQltdnkgPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZICsgU3ViUGFydFldWzIqUGFydFggKyBTdWJQYXJ0WF0uZHk7CisJCQkJCQkJCWFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKwkJCQkJCQkJCXBUZW1wU3JjQnVmICsgKDgqUGFydFggKyA0KlN1YlBhcnRYICsgKG12eC80KSkgKyAoOCpQYXJ0WSArIDQqU3ViUGFydFkgKyAobXZ5LzQpKSAqIFRlbXBTcmNTdGVwLAorCQkJCQkJCQkJVGVtcFNyY1N0ZXAsCisJCQkJCQkJCQlwVGVtcERzdEJ1ZiArICg4KlBhcnRYICsgNCpTdWJQYXJ0WCkgKyAoOCpQYXJ0WSArIDQqU3ViUGFydFkpICogVGVtcERzdFN0ZXAsCisJCQkJCQkJCQlUZW1wRHN0U3RlcCwKKwkJCQkJCQkJCVdpZHRoLAorCQkJCQkJCQkJSGVpZ2h0LAorCQkJCQkJCQkJbXZ4ICYgMywKKwkJCQkJCQkJCW12eSAmIDMKKwkJCQkJCQkJCSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCisJCQkJCQltdnggPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZXVsyKlBhcnRYXS5keDsKKwkJCQkJCW12eSA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFldWzIqUGFydFhdLmR5OworCQkJCQkJYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorCQkJCQkJCXBUZW1wU3JjQnVmICsgKDgqUGFydFggKyAobXZ4LzQpKSArICg4KlBhcnRZICsgKG12eS80KSkgKiBUZW1wU3JjU3RlcCwKKwkJCQkJCQlUZW1wU3JjU3RlcCwKKwkJCQkJCQlwVGVtcERzdEJ1ZiArICg4KlBhcnRYKSArICg4KlBhcnRZKSAqIFRlbXBEc3RTdGVwLAorCQkJCQkJCVRlbXBEc3RTdGVwLAorCQkJCQkJCVdpZHRoLAorCQkJCQkJCUhlaWdodCwKKwkJCQkJCQltdnggJiAzLAorCQkJCQkJCW12eSAmIDMKKwkJCQkJCQkpOworCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJSW52YWxpZFNBRCA9IDE7CisJfQorCisJLyogQ2FsY3VsYXRlIFNBRCBmcm9tIHByZWRpY3RlZCBidWZmZXIgKi8KKwlpZiAoIUludmFsaWRTQUQpCisJeworCSAgICBPTVhfVTMyICAgICB4OHg4LCB5OHg4LCB4NHg0LCB5NHg0LCBCbG9jazh4OCwgQmxvY2s0eDQ7CisJICAgIE9NWF9TMzIgICAgIFNBRDsKKwkgICAgCisJCXBUZW1wUmVmQnVmID0gcFRlbXBEc3RCdWY7CisJCVRlbXBSZWZTdGVwID0gMTY7CisKKwkJLyogU0FEIGZvciBlYWNoIDR4NCBibG9jayBpbiBzY2FuIG9yZGVyICovCisJCWZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCisJCXsKKwkJCXg4eDggPSA4KihCbG9jazh4OCAmIDEpOworCQkJeTh4OCA9IDgqKEJsb2NrOHg4ID4+IDEpOworCQkJZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKKwkJCXsKKwkJCQl4NHg0ID0gNCooQmxvY2s0eDQgJiAxKTsKKwkJCQl5NHg0ID0gNCooQmxvY2s0eDQgPj4gMSk7CisKKwkJCQlhcm1WQ0NPTU1fU0FEKAkKKwkJCQkJcFNyY0N1cnJCdWYgKyAoeDh4OCArIHg0eDQpICsgKHk4eDggKyB5NHg0KSAqIFNyY0N1cnJTdGVwLCAKKwkJCQkJU3JjQ3VyclN0ZXAsCisJCQkJCXBUZW1wUmVmQnVmICsgKHg4eDggKyB4NHg0KSArICh5OHg4ICsgeTR4NCkgKiBUZW1wUmVmU3RlcCwKKwkJCQkJVGVtcFJlZlN0ZXAsCisgICAgCQkJCSZTQUQsCisgICAgCQkJCTQsIC8qIEhlaWdodCAqLworICAgIAkJCQk0KTsgLyogV2lkdGggKi8KKyAgICAgICAgICAgICAgICAqKHBEc3RCbG9ja1NBRCArIDQgKiBCbG9jazh4OCArIEJsb2NrNHg0KSA9IChTQUQgPCAweDdmZmYpID8gKE9NWF9VMTYpIFNBRCA6IEFSTV9WQ000UDEwX01BWF9NT0RFX1ZBTFVFOyAgIAkJCSAgICAKKyAJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyogRmlsbCBTQURzIHdpdGggbWF4IHZhbHVlcyBhbmQgcmV0dXJuKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCXBEc3RCbG9ja1NBRCBbaV0gPSBBUk1fVkNNNFAxMF9NQVhfNHg0X1NBRDsKKwkJfQorCX0KKwlyZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBJbnRyYSA0eDQgTW9kZSBkZWNpc2lvbiBieSBjYWxjdWxhdGluZyBjb3N0IGZvciBhbGwgcG9zc2libGUgbW9kZXMgYW5kCisgKiBjaG9vc2luZyB0aGUgYmVzdCBtb2RlCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGN1cnJlbnQgTWFjcm9ibG9jaworICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBvZiB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZgorICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdGhlIE9NWFZDTTRQMTBNQkluZm8gd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgIGZpZWxkIHBJbnRyYTR4NFByZWRNb2RlIG9mIHRoZSBjdXJyZW50IGJsb2NrLgorICogW2luXSBCbG9jazh4OCAgICAtIEluZGV4IDh4OCBibG9jayBpbiB3aGljaCBjdXJyZW50IDR4NCBibG9jayBiZWxvbmdzCisgKiBbaW5dIEJsb2NrNHg0ICAgIC0gSW5kZXggb2YgY3VycmVudCA0eDQgYmxvY2sKKyAqIFtpbi9vdXRdIHBQcmVkSW50cmE0eDRTcmNZIC0gUG9pbnRlciB0byBjdXJyZW50IGJsb2NrIGxvY2F0aW9uIGluIGJ1ZmZlciAKKyAqICAgICAgICAgICAgICAgICAgICB3aXRoIHJlY29uc3RydWN0ZWQgdmFsdWVzLiBUaGlzIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhpcworICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGggYmVzdCBtb2RlIHByZWRpY3RlZCB2YWx1ZXMgCisgKiBbaW5dIFN0ZXBQcmVkSW50cmE0eDRTcmNZICAtIFN0ZXAgc2l6ZSBvZiB0aGUgcG9pbnRlciBwUHJlZEludHJhNHg0U3JjWQorICogW2luXSBwSW50cmE0eDRQcmVkTW9kZSAgICAgLSBBcnJheSBvZiBJbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciB0aGUgTUIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgTUIgbW9kZXMgc3RhcnRzIGF0IFsxLDFdLgorICogW2luXSBwQmVzdENvc3QgICAtIENvc3QgZm9yIHRoZSBCZXN0IEludHJhIDR4NCBtb2RlCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbiAoCisgICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1MzMiBCbG9jazh4OCwKKyAgICBPTVhfUzMyIEJsb2NrNHg0LAorICAgIE9NWF9VOCAgKnBQcmVkSW50cmE0eDRTcmNZLAorICAgIE9NWF9TMzIgU3RlcFByZWRJbnRyYTR4NFNyY1ksCisgICAgT01YX1MzMiBwSW50cmE0eDRQcmVkTW9kZSBbXVs5XSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKykKK3sKKyAgICBPTVhfUzMyICAgICBpLCBqLCB4LCB5LCBCbG9ja1gsIEJsb2NrWSwgbW9kZTsKKyAgICBPTVhfUzMyICAgICBDb3N0LCBCZXN0Q29zdDsKKyAgICBPTVhfVTggICAgICAqcFNyY1k7CisgICAgT01YX1MzMiAgICAgU3RlcFNyY1k7CisgICAgT01YX1MzMiAgICAgYXZhaWxhYmlsaXR5ID0gMDsKKyAgICBPTVhfVTggICAgICBwUHJlZEJsb2NrIFs0KjRdOworICAgIE9NWFJlc3VsdCAgIFJldCA9IE9NWF9TdHNfRXJyOworCisgICAgLyogR2V0IGJsb2NrIGNvcmRpbmF0ZXMgZnJvbSA4eDggYmxvY2sgaW5kZXggYW5kIDR4NCBibG9jayBpbmRleCAqLworICAgIEJsb2NrWCA9ICgoQmxvY2s4eDggJiAxKSA8PCAxKSArIChCbG9jazR4NCAmIDEpOworICAgIEJsb2NrWSA9ICgoQmxvY2s4eDggPj4gMSkgPDwgMSkgKyAoQmxvY2s0eDQgPj4gMSk7CisgICAgCisgICAgLyogQWRkIG9mZnNldCB0byBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IE1CIGluIHRoZSBhcnJheSBwSW50cmE0eDRQcmVkTW9kZSAqLworICAgIHggPSBCbG9ja1ggKyAxOworICAgIHkgPSBCbG9ja1kgKyAxOworCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIEJsb2NrICovCisgICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5XVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKyAgICB7CisgICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgQmxvY2sgKi8KKyAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3kgLSAxXVt4XSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgTEVGVCBCbG9jayAqLworICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeSAtIDFdW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgcFNyY1kgPSBwUHJlZEludHJhNHg0U3JjWSArIAorICAgICAgICAgICAgU3RlcFByZWRJbnRyYTR4NFNyY1kgKiAoQmxvY2tZIDw8IDIpICsgCisgICAgICAgICAgICAoQmxvY2tYIDw8IDIpOworICAgICAgICAgICAgCisgICAgU3RlcFNyY1kgPSBTdGVwUHJlZEludHJhNHg0U3JjWTsKKyAgICAgICAgICAgICAgCisgICAgeCA9IEJsb2NrWCAqIDQ7CisgICAgeSA9IEJsb2NrWSAqIDQ7CisKKyAgICBDb3N0ID0gQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICAKKyAgICAvKiBHbyB0aHJvdWdoIGVhY2ggbW9kZSBmb3IgbWluaW0gY29zdCAqLworICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCA5OyBtb2RlKyspCisgICAgeworICAgICAgICBSZXQgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCisgICAgICAgICAgICAgcFNyY1kgLSAxLAorICAgICAgICAgICAgIHBTcmNZIC0gU3RlcFNyY1ksCisgICAgICAgICAgICAgcFNyY1kgLSBTdGVwU3JjWSAtIDEsCisgICAgICAgICAgICAgcFByZWRCbG9jaywKKyAgICAgICAgICAgICBTdGVwU3JjWSwKKyAgICAgICAgICAgICA0LAorICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZSwKKyAgICAgICAgICAgICBhdmFpbGFiaWxpdHkpOworICAgICAgICAgICAgIAorICAgICAgICBpZiAoUmV0ID09IE9NWF9TdHNfTm9FcnIpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoICAgIAorICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmICsgKHkgKiBTcmNDdXJyU3RlcCkgKyB4LAorICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAorICAgICAgICAgICAgICAgIHBQcmVkQmxvY2ssCisgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAmQ29zdCwKKyAgICAgICAgICAgICAgICA0LAorICAgICAgICAgICAgICAgIDQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoQ29zdCA8IEJlc3RDb3N0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJlc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwSW50cmE0eDRQcmVkTW9kZSBbQmxvY2tZICsgMV1bQmxvY2tYICsgMV0gPSAKKyAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wSW50cmE0eDRQcmVkTW9kZSBbQmxvY2tZICogNCArIEJsb2NrWF0gPSAKKyAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNZIFtTdGVwU3JjWSAqIGogKyBpXSA9IHBQcmVkQmxvY2sgWzQgKiBqICsgaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcEJlc3RDb3N0ID0gQmVzdENvc3Q7CisgICAgcmV0dXJuOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgVGhpcyBmdW5jdGlvbiB3aWxsIGRvIHRoZSBNViBQcmVkaWN0aW9uIGZvciBJbnRlciBNQnMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBCbG9ja1N0YXJ0WCAtIFN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzIGluIGN1cnJlbnQgQmxvY2sKKyAqIFtpbl0gQmxvY2tTdGFydFkgLSBTdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscyBpbiBjdXJyZW50IEJsb2NrCisgKiBbaW5dIEJsb2NrU2l6ZVggIC0gV2lkdGggb2YgY3VycmVudCBibG9jaworICogW2luXSBCbG9ja1NpemVZICAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIFJlZkZyYW1lICAgIC0gSW5kZXggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgcHJlZGljdGlvbgorICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gUmVmIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgorICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCisgKiBbb3V0XSBwTVZQcmVkICAgIC0gUG9pbnRlciB0byBwcmVkaWN0ZWQgTVZzCisgKiBSZW1hcmtzOgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yKAorICAgIE9NWF9VMzIgQmxvY2tTdGFydFgsIAorICAgIE9NWF9VMzIgQmxvY2tTdGFydFksCisgICAgT01YX1UzMiBCbG9ja1NpemV4LAorICAgIE9NWF9VMzIgQmxvY2tTaXpleSwKKyAgICBPTVhfUzMyIFJlZkZyYW1lLAorICAgIE9NWF9TMzIgcFJlZkZyQXJyW11bNl0sIAorICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFycltdWzEyXSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZAorKQoreworICAgIE9NWF9TMzIgICAgIFJGcmFtZUw7ICAgICAgIC8qIExlZnQgKi8KKyAgICBPTVhfUzMyICAgICBSRnJhbWVVOyAgICAgICAvKiBVcCAqLworICAgIE9NWF9TMzIgICAgIFJGcmFtZVVSOyAgICAgIC8qIFVwLVJpZ2h0ICovCisKKyAgICBPTVhfUzMyICAgICBCbG9ja1gsIEJsb2NrWSwgQmxvY2tYRnIsIEJsb2NrWUZyLCBNVlByZWRUeXBlOworICAgIE9NWF9TMzIgICAgIEJsb2NrWFBsdXNPZmYsIEJsb2NrWFBsdXNPZmZGciwgQmxvY2tYTWluMUZyLCBCbG9ja1lNaW4xRnI7CisgICAgCisgICAgQmxvY2tYID0gNCArIChCbG9ja1N0YXJ0WCA+PiAyKTsKKyAgICBCbG9ja1kgPSA0ICsgKEJsb2NrU3RhcnRZID4+IDIpOyAKKyAgICBCbG9ja1hQbHVzT2ZmID0gQmxvY2tYICsgKEJsb2NrU2l6ZXggPj4gMik7CisgICAgCisgICAgQmxvY2tYRnIgPSBCbG9ja1ggPj4gMTsgIAorICAgIEJsb2NrWUZyID0gQmxvY2tZID4+IDE7ICAKKyAgICBCbG9ja1hNaW4xRnIgPSAoQmxvY2tYIC0gMSkgPj4gMTsgIAorICAgIEJsb2NrWU1pbjFGciA9IChCbG9ja1kgLSAxKSA+PiAxOyAgCisgICAgQmxvY2tYUGx1c09mZkZyID0gQmxvY2tYUGx1c09mZiA+PiAxOworICAgIAorICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOOworCisgICAgUkZyYW1lTCA9IHBSZWZGckFyciBbQmxvY2tZRnJdW0Jsb2NrWE1pbjFGcl07CisgICAgUkZyYW1lVSA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hGcl07CisgICAgUkZyYW1lVVIgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXTsKKworICAgIGlmIChSRnJhbWVVUiA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgUkZyYW1lVVIgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYTWluMUZyXTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBQcmVkaWN0aW9uIGlmIG9ubHkgb25lIG9mIHRoZSBuZWlnaGJvcnMgdXNlcyB0aGUgcmVmZXJlbmNlIGZyYW1lCisgICAgICogd2UgYXJlIGNoZWNraW5nCisgICAgICovCisgIAorICAgIGlmIChSRnJhbWVMID09IFJlZkZyYW1lICYmIFJGcmFtZVUgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgIT0gUmVmRnJhbWUpCisgICAgeworICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7CisgICAgfQorICAgIGVsc2UgaWYoUkZyYW1lTCAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVID09IFJlZkZyYW1lICYmIFJGcmFtZVVSICE9IFJlZkZyYW1lKQorICAgIHsKKyAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VOworICAgIH0KKyAgICBlbHNlIGlmKFJGcmFtZUwgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVSAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVUiA9PSBSZWZGcmFtZSkKKyAgICB7CisgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVVI7CisgICAgfQorCisgICAgLyogRGlyZWN0aW9uYWwgcHJlZGljdGlvbnMgICovCisgICAgZWxzZSBpZihCbG9ja1NpemV4ID09IDggJiYgQmxvY2tTaXpleSA9PSAxNikKKyAgICB7CisgICAgICAgIGlmKEJsb2NrU3RhcnRYID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFJGcmFtZUwgPT0gUmVmRnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJGcmFtZVVSID09IFJlZkZyYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihCbG9ja1NpemV4ID09IDE2ICYmIEJsb2NrU2l6ZXkgPT0gOCkKKyAgICB7CisgICAgICAgIGlmKEJsb2NrU3RhcnRZID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFJGcmFtZVUgPT0gUmVmRnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUkZyYW1lTCA9PSBSZWZGcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKE1WUHJlZFR5cGUpCisgICAgeworICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTjoKKyAgICAgICAgaWYgKCEocFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWE1pbjFGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB8fCAKKyAgICAgICAgICAgICAgcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWEZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHx8IAorICAgICAgICAgICAgICBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHg7CisgICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gCisgICAgICAgICAgICAgICAgQVJNX1ZDTTRQMTBfTUVESUFOKHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keCwgCisgICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR4LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR4KTsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gCisgICAgICAgICAgICAgICAgQVJNX1ZDTTRQMTBfTUVESUFOKHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keSwgCisgICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR5LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR5KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX0w6CisgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4OworICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfVToKKyAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHg7CisgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9VUjoKKyAgICAgICAgaWYgKHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keDsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1ggLSAxXS5keDsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1ggLSAxXS5keTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBHZXRzIGJlc3QgTVYgZm9yIHRoZSBjdXJyZW50IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlZlkgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgorICogW2luXSBuU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCisgKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCisgKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCisgKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luXSBuTGFtZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcEJlc3RDb3N0ICAtIE1pbmltdW0gY29zdCBmb3IgZW5jb2RpbmcgY3VycmVudCBibG9jayAKKyAqIFtvdXRdIHBCZXN0TVYgICAgLSBNViBjb3JyZXNwb25kaW5nIHRvIGJlc3QgY29zdAorICogW2luXSBCbG9ja1N0YXJ0WCAtIEJsb2NrIHN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzCisgKiBbaW5dIEJsb2NrU3RhcnRZIC0gQmxvY2sgc3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gQmxvY2tTaXplWCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIEJsb2NrU2l6ZVkgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gUmVmRnJhbWUgICAgLSBJbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KKyAqIFtpbl0gcE1WUHJlZCAgICAgLSBQb2ludGVyIHRvIE1WIHByZWRpY3RlZCBmcm9tIG5laWdoYm91ciBNVnMKKyAqIFJlbWFya3M6CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0CisgKgorICovCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2goCisgICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwgCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkKiBwTUVTcGVjLCAKKworICAgIE9NWF9TMzIgbkxhbWRhLAorICAgIE9NWF9TMzIqIHBCZXN0Q29zdCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCisgICAgCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WCwgCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WSwKKyAgICBPTVhfVTMyIEJsb2NrU2l6ZVgsCisgICAgT01YX1UzMiBCbG9ja1NpemVZLAorICAgIE9NWF9TMzIgUmVmRnJhbWUsCisgICAgT01YX1MzMiBwUmVmRnJBcnIgW11bNl0sIAorICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFyciBbXVsxMl0sCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQKKyAgICkKK3sKKworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgTVZDYWxjdWxhdGVkLCBNVkNhbmRpZGF0ZTsKKyAgICBPTVhfUzMyICAgICAgICAgICAgIENvc3Q7CisgICAgT01YUmVzdWx0ICAgICAgICAgICBSZXRWYWx1ZTsKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUVQYXJhbXM7ICAgIAorCU9NWFZDTTRQMkNvb3JkaW5hdGUgQ3VyckJsb2NrUG9zOworCisgICAgLyogR2V0IFByZWRpY3RlZCBNb3Rpb24gVmVjdG9ycyAqLworICAgIGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yICgKKyAgICAgICAgQmxvY2tTdGFydFgsIAorICAgICAgICBCbG9ja1N0YXJ0WSwKKyAgICAgICAgQmxvY2tTaXplWCwgCisgICAgICAgIEJsb2NrU2l6ZVksCisgICAgICAgIFJlZkZyYW1lLAorICAgICAgICBwUmVmRnJBcnIsICAgCisgICAgICAgIHBNVkFyciwgICAgICAKKyAgICAgICAgcE1WUHJlZCk7CisKKyAgICAvKiBJbml0aWFsaXplIGNhbmRpZGF0ZSBNViAqLworICAgIE1WQ2FuZGlkYXRlLmR4ID0gMDsKKyAgICBNVkNhbmRpZGF0ZS5keSA9IDA7CisgICAgCisgICAgQ3VyckJsb2NrUG9zLnggPSBwQ3VyclBvaW50UG9zLT54ICsgQmxvY2tTdGFydFg7CisgICAgQ3VyckJsb2NrUG9zLnkgPSBwQ3VyclBvaW50UG9zLT55ICsgQmxvY2tTdGFydFk7CisKKyAgICAvKiBCbG9jayBNYXRjaCBJbnRlZ2VyICovCisgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCisgICAgICAgIHBTcmNDdXJyQnVmLCAKKyAgICAgICAgU3JjQ3VyclN0ZXAsIAorICAgICAgICBwU3JjUmVmWSwgCisgICAgICAgIG5TcmNSZWZTdGVwLCAKKyAgICAgICAgcFJlZlJlY3QsIAorICAgICAgICAmQ3VyckJsb2NrUG9zLCAKKyAgICAgICAgQmxvY2tTaXplWCwgCisgICAgICAgIEJsb2NrU2l6ZVksIAorICAgICAgICBuTGFtZGEsIAorICAgICAgICBwTVZQcmVkLCAKKyAgICAgICAgJk1WQ2FuZGlkYXRlLCAKKyAgICAgICAgJk1WQ2FsY3VsYXRlZCwgCisgICAgICAgICZDb3N0LCAKKyAgICAgICAgcE1FU3BlYyk7CisgICAgCisgICAgLyogdXBkYXRlZCBCZXN0TVYqLworICAgIC8qKnBCZXN0Q29zdCA9IENvc3Q7CisgICAgcEJlc3RNVi0+ZHggPSBNVkNhbGN1bGF0ZWQuZHg7CisgICAgcEJlc3RNVi0+ZHkgPSBNVkNhbGN1bGF0ZWQuZHk7Ki8KKworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKikgcE1FU3BlYzsKKyAgICAKKyAgICAvKiBCbG9jayBNYXRjaCBIYWxmIHBlbCAqLworICAgIGlmIChwTUVQYXJhbXMtPmhhbGZTZWFyY2hFbmFibGUpCisgICAgeworICAgICAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmKAorICAgICAgICAgICAgcFNyY0N1cnJCdWYsIAorICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAorICAgICAgICAgICAgcFNyY1JlZlksIAorICAgICAgICAgICAgblNyY1JlZlN0ZXAsIAorICAgICAgICAgICAgQmxvY2tTaXplWCwgCisgICAgICAgICAgICBCbG9ja1NpemVZLCAKKyAgICAgICAgICAgIG5MYW1kYSwgCisgICAgICAgICAgICBwTVZQcmVkLCAKKyAgICAgICAgICAgICZNVkNhbGN1bGF0ZWQsICAgICAgICAvKiBpbnB1dC9vdXRwdXQqLworICAgICAgICAgICAgJkNvc3QpOworICAgIH0KKworICAgIC8qIEJsb2NrIE1hdGNoIFF1YXJ0ZXIgcGVsICovCisgICAgaWYgKHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZSkKKyAgICB7CisgICAgICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIoCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgCisgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgICAgICBwU3JjUmVmWSwgCisgICAgICAgICAgICBuU3JjUmVmU3RlcCwgCisgICAgICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgICAgIEJsb2NrU2l6ZVksIAorICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgIHBNVlByZWQsIAorICAgICAgICAgICAgJk1WQ2FsY3VsYXRlZCwgCisgICAgICAgICAgICAmQ29zdCk7CisgICAgfQorCisgICAgLyogdXBkYXRlZCBCZXN0IENvc3QgYW5kIEJlc3QgTVYgKi8KKyAgICAqcEJlc3RDb3N0ID0gQ29zdDsKKyAgICBwQmVzdE1WLT5keCA9IE1WQ2FsY3VsYXRlZC5keDsKKyAgICBwQmVzdE1WLT5keSA9IE1WQ2FsY3VsYXRlZC5keTsKKworICAgIC8qCisgICAgICogU2tpcCBNQiBjb3N0IGNhbGN1bGF0aW9ucyBvZiAxNngxNiBpbnRlciBtb2RlCisgICAgICovCisgICAgcmV0dXJuIFJldFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1BhcnRpdGlvbk1FCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBHZXRzIGJlc3QgY29zdCBmb3IgdGhlIGN1cnJlbnQgcGFydGl0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QgICAgLSBQb2ludGVyIHRvIExpc3Qgb2YgcmVmIGJ1ZmZlciBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgorICogW2luXSBuU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCisgKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCisgKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCisgKiBbaW5dIFBhcnRXaWR0aCAgIC0gV2lkdGggb2YgY3VycmVudCBwYXJ0aXRpb24KKyAqIFtpbl0gUGFydEhlaWdodCAgLSBIZWlnaHQgb2YgY3VycmVudCBwYXJ0aXRpb24KKyAqIFtpbl0gQmxvY2tXaWR0aCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIEJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gUGFydFN0YXJ0WCAgLSBQYXJ0aXRpb24gc3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gUGFydFN0YXJ0WSAgLSBQYXJ0aXRpb24gc3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgorICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgcHJlZGljdGlvbgorICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50ZXIgTUIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQKKyAqCisgKi8KK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCisgICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCisJT01YX1MzMiBTcmNSZWZTdGVwLAorCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgdm9pZCogcE1FU3BlYywgCisKKyAgICBPTVhfUzMyIFBhcnRXaWR0aCwKKyAgICBPTVhfUzMyIFBhcnRIZWlnaHQsCisgICAgT01YX1MzMiBCbG9ja1dpZHRoLAorICAgIE9NWF9TMzIgQmxvY2tIZWlnaHQsCisgICAgT01YX1MzMiBQYXJ0U3RhcnRYLCAKKyAgICBPTVhfUzMyIFBhcnRTdGFydFksCisKKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnIgW11bMTJdLAorICAgIE9NWF9TMzIgcFJlZkZyQXJyIFtdWzZdLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRBcnIgW11bNF0sCisKKyAgICBPTVhfUzMyIExhbWJkYSwKKyAgICBPTVhfUzMyICpwQ29zdAorKQoreworICAgIE9NWF9VMzIgICAgIHgsIHksIGksIGosIHJlZiwgT2ZmWCwgT2ZmWSwgT2ZmU3JjLCBPZmZSZWY7CisgICAgT01YX1MzMiAgICAgQmxvY2tDb3N0LCBQYXJ0aXRpb25Db3N0LCBCZXN0Q29zdDsKKyAgICBPTVhfUzMyICAgICBCZXN0UmVmRnJhbWU9MDsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIEJlc3RNViBbNF1bNF07CisgICAgT01YVkNNb3Rpb25WZWN0b3IgICBCZXN0TVZQcmVkIFs0XVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIE1WUHJlZDsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIERzdE1WOworCisgICAgQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICAKKyAgICBmb3IgKHJlZiA9IDA7IHJlZiA8IEFSTV9WQ000UDEwX01BWF9GUkFNRVM7IHJlZisrKQorICAgIHsKKyAgICAgICAgaWYgKHBTcmNSZWZCdWZMaXN0IFtyZWZdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgCS8qIE5vIHJlZmVyZW5jZSBmcmFtZSwgY29udGludWUgKi8KKyAgICAgICAgCWNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgUGFydGl0aW9uQ29zdCA9IDA7CisgICAgICAgIAorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgUGFydEhlaWdodDsgeSArPSBCbG9ja0hlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IFBhcnRXaWR0aDsgeCArPSBCbG9ja1dpZHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCU9mZlNyYyA9IFNyY0N1cnJTdGVwICogKFBhcnRTdGFydFkgKyB5KSArIFBhcnRTdGFydFggKyB4OworICAgICAgICAgICAgCU9mZlJlZiA9IFNyY1JlZlN0ZXAgKiAoUGFydFN0YXJ0WSArIHkpICsgUGFydFN0YXJ0WCArIHg7CisgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaCAoCisgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmICsgT2ZmU3JjLCAKKyAgICAgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAorICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCBbcmVmXSArIE9mZlJlZiwgCisgICAgICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsIAorICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgcE1FU3BlYywgCisKKyAgICAgICAgICAgICAgICAgICAgTGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAmQmxvY2tDb3N0LCAKKyAgICAgICAgICAgICAgICAgICAgJkRzdE1WLAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgeCArIFBhcnRTdGFydFgsIAorICAgICAgICAgICAgICAgICAgICB5ICsgUGFydFN0YXJ0WSwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgcFJlZkZyQXJyLCAKKyAgICAgICAgICAgICAgICAgICAgcE1WQXJyLAorICAgICAgICAgICAgICAgICAgICAmTVZQcmVkKTsKKworICAgICAgICAgICAgICAgIFBhcnRpdGlvbkNvc3QgKz0gQmxvY2tDb3N0OworCQkJCQorCQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHgpID4+IDI7CisJCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSkgPj4gMjsKKwkJCQkKKwkgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDIpOyBqKyspCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMik7IGkrKykKKwkgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHggPSBEc3RNVi5keDsKKwkgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR5ID0gRHN0TVYuZHk7CisJICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR4ID0gTVZQcmVkLmR4OworCSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keSA9IE1WUHJlZC5keTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKworCQkJCXBSZWZGckFyciBbMiArIChPZmZZID4+IDEpXVsyICsgKE9mZlggPj4gMSldID0gcmVmOworCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMyk7IGorKykKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAzKTsgaSsrKQorCSAgICAgICAgICAgICAgICB7CisJCQkgICAgICAgICAgICBwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKSArIGpdWzIgKyAoT2ZmWCA+PiAxKSArIGldID0gcmVmOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCQkvKgorCQkgKiBJZiBQYXJ0aXRpb25Db3N0IGlzIGxlc3MgZm9yIHRoaXMgcmVmZXJlbmNlIGZyYW1lLCBtb3Rpb24gdmVjdG9ycyBuZWVkcyB0byBiZSBiYWNrZWR1cAorCQkgKi8KKyAgICAgICAgaWYgKFBhcnRpdGlvbkNvc3QgPD0gQmVzdENvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJlc3RDb3N0ID0gUGFydGl0aW9uQ29zdDsgICAgICAgICAgICAKKyAgICAgICAgICAgIEJlc3RSZWZGcmFtZSA9IHJlZjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IChQYXJ0SGVpZ2h0L0Jsb2NrSGVpZ2h0KTsgeSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAoUGFydFdpZHRoL0Jsb2NrV2lkdGgpOyB4KyspCisgICAgICAgICAgICAgICAgeworCQkJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4ICogQmxvY2tXaWR0aCkgPj4gMjsKKwkJCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSAqIEJsb2NrSGVpZ2h0KSA+PiAyOworCQkJCQorICAgICAgICAgICAgICAgICAgICBCZXN0TVZbeV1beF0uZHggPSBwTVZBcnIgWzQgKyBPZmZZXVs0ICsgT2ZmWF0uZHg7CisgICAgICAgICAgICAgICAgICAgIEJlc3RNVlt5XVt4XS5keSA9IHBNVkFyciBbNCArIE9mZlldWzQgKyBPZmZYXS5keTsKKyAgICAgICAgICAgICAgICAgICAgQmVzdE1WUHJlZFt5XVt4XS5keCA9IHBNVlByZWRBcnIgW09mZlldW09mZlhdLmR4OworICAgICAgICAgICAgICAgICAgICBCZXN0TVZQcmVkW3ldW3hdLmR5ID0gcE1WUHJlZEFyciBbT2ZmWV1bT2ZmWF0uZHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKwkvKgorCSAqIENvcHkgYmFjayBiZXN0IHJlZmVyZW5jZSBmcmFtZSwgbW90aW9uIHZlY3RvcnMgYW5kIGNvc3QuCisJICovCisgICAgZm9yICh5ID0gMDsgeSA8IChQYXJ0SGVpZ2h0L0Jsb2NrSGVpZ2h0KTsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IChQYXJ0V2lkdGgvQmxvY2tXaWR0aCk7IHgrKykKKyAgICAgICAgeworCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCAqIEJsb2NrV2lkdGgpID4+IDI7CisJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5ICogQmxvY2tIZWlnaHQpID4+IDI7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMik7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMik7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR4ID0gQmVzdE1WW3ldW3hdLmR4OworICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keSA9IEJlc3RNVlt5XVt4XS5keTsKKyAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keCA9IEJlc3RNVlByZWRbeV1beF0uZHg7CisgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHkgPSBCZXN0TVZQcmVkW3ldW3hdLmR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAzKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAzKTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSkgKyBqXVsyICsgKE9mZlggPj4gMSkgKyBpXSA9IEJlc3RSZWZGcmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKwkqcENvc3QgPSBCZXN0Q29zdDsKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSU5URVIgTUIgdHlwZSBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIHN0cmF0ZWd5IGZyb20gCisgKiB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIElTTy9JRUMgMTQ0OTYtMTAuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAorICogW2luXSBwU3JjUmVjQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWNvbnN0cnVjdGVkIE1CIAorICogW2luXSBTcmNSZWNTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVjQnVmIAorICogW2luXSBuTUJQb3NYICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBYIGF4aXMKKyAqIFtpbl0gbk1CUG9zWSAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWSBheGlzCisgKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luXSBwTUJJbnRyYSAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgorICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKKyAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50cmExNngxNgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKgorICovCisKK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVjQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UzMiAqcENvc3QpCit7CisgICAgT01YX1U4ICAgICAgUHJlZEJ1ZiBbMTYqMTYgKyAxNl07CisgICAgT01YX1U4ICAgICAgKnBQcmVkOworICAgIE9NWF9TMzIgICAgIG1vZGU7CisgICAgT01YX1MzMiAgICAgQ29zdDsKKyAgICBPTVhfUzMyICAgICBhdmFpbGFiaWxpdHkgPSAwOworICAgIE9NWFJlc3VsdCAgIFJldDsKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlICAgIEludHJhTW9kZTE2eDE2IFs0XSA9IAorICAgICAgICB7T01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IsIAorICAgICAgICBPTVhfVkNfMTZYMTZfREMsIE9NWF9WQ18xNlgxNl9QTEFORX07ICAgICAgICAKKyAgICBPTVhfVTMyICAgICBNQlBvc1ggPSBwQ3VyclBvaW50UG9zLT54ID4+IDQ7ICAgICAgICAKKyAgICBPTVhfVTMyICAgICBNQlBvc1kgPSBwQ3VyclBvaW50UG9zLT55ID4+IDQ7ICAgICAgICAKKworCXBQcmVkID0gYXJtQWxpZ25UbzE2Qnl0ZXMoUHJlZEJ1Zik7CisgICAgCisJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIE1CICovCisgICAgaWYgKChNQlBvc1ggIT0gMCkgJiYgKHBNQkludHJhIFswXSAhPSAwIHx8IHBNQkludGVyIFswXSAhPSAwKSkKKyAgICB7CisgICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAgTUIgKi8KKyAgICBpZiAoKE1CUG9zWSAhPSAwKSAmJiAocE1CSW50cmEgWzFdICE9IDAgfHwgcE1CSW50ZXIgWzFdICE9IDApKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAtTEVGVCBNQiAqLworICAgIGlmICgoTUJQb3NYID4gMCkgJiYgKE1CUG9zWSA+IDApICYmIAorICAgICAgICAocE1CSW50cmEgWzJdICE9IDAgfHwgcE1CSW50ZXIgWzJdICE9IDApKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgKnBDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7CisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDQ7IG1vZGUrKykKKyAgICB7CisgICAgICAgIFJldCA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAorICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSAxLCAKKyAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCwgCisgICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAgLSAxLCAKKyAgICAgICAgICAgICAgICBwUHJlZCwgCisgICAgICAgICAgICAgICAgU3JjUmVjU3RlcCwgCisgICAgICAgICAgICAgICAgMTYsIAorICAgICAgICAgICAgICAgIEludHJhTW9kZTE2eDE2IFttb2RlXSwgCisgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5KTsKKyAgICAgICAgaWYgKFJldCA9PSBPTVhfU3RzX05vRXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCggICAgCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFByZWQsCisgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgJkNvc3QsCisgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgMTYpOworICAgICAgICAgICAgaWYgKENvc3QgPCAqcENvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5JbnRyYTE2eDE2UHJlZE1vZGUgPSBJbnRyYU1vZGUxNngxNiBbbW9kZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJbnRyYSA0eDQgTUIgdHlwZSBhbmQgc2VsZWN0cworICogdGhlIGJlc3Qgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAorICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCisgKiBbaW5dIHBTcmNSZWNCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlY29uc3RydWN0ZWQgTUIgCisgKiBbaW5dIFNyY1JlY1N0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWNCdWYgCisgKiBbaW5dIG5NQlBvc1ggICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFggYXhpcworICogW2luXSBuTUJQb3NZICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBZIGF4aXMKKyAqIFtpbl0gcE1CSW50cmEgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKKyAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludHJhNHg0CisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVjQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9VMzIgKnBDb3N0KQoreworICAgIE9NWF9TMzIgICAgIHgsIHksIEJsb2NrNHg0LCBCbG9jazh4ODsKKyAgICBPTVhfUzMyICAgICBDb3N0OworCisgICAgLyoKKyAgICAgKiBQcmVkSW50cmE0eDRNb2RlIHdpbGwgc3RvcmUgcHJlZGljdGlvbiBtb2RlcyBvZiA0eDQgYmxvY2tzLiAKKyAgICAgKiBNb2RlcyBmb3IgY3VycmVudCBNQiBzdGFydHMgYXQgaW5kZXggWzFdWzFdLiAgIAorICAgICAqIE1vZGVzIG9mIG5pZ2hib3VyaW5nIE1CJ3Mgd2lsbCBiZSBhcyBzaG93biBiZWxvdworICAgICAqIEEgdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyBmb3IgYW55IGJsb2NrIGluIHRoaXMgYXJyYXkgbWVhbnMgCisgICAgICogdGhhdCBibG9jayBpcyBub3QgYXZhaWxhYmxlIGZvciBwcmVkaWN0aW9uLgorICAgICAqCisgICAgICogYzMgYjAgYjEgYjIgYjMgZDAgZDEgZDIgZDMKKyAgICAgKiBhMCB4eCB4eCB4eCB4eCAtICAtICAtICAtCisgICAgICogYTEgeHggeHggeHggeHggLSAgLSAgLSAgLQorICAgICAqIGEyIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KKyAgICAgKiBhMyB4eCB4eCB4eCB4eCAtICAtICAtICAtCisgICAgICoKKyAgICAgKi8KKyAgICBPTVhfUzMyICAgICBQcmVkSW50cmE0eDRNb2RlIFs1XVs5XTsKKworICAgIC8qCisgICAgICogcFNyY1kgc3RvcmVzIHJlLWNvbnN0cnVzdGVkIHNvdXJjZSBhcnJheSBvZiBzaXplIDNNQiBYIDJNQiBhcyBiZWxvdworICAgICAqCisgICAgICogTUIxMSBNQjEyIE1CMTMgCisgICAgICogTUIyMSBNQjIyIE1CMjMKKyAgICAgKgorICAgICAqIFRoaXMgYXJyYXkgd2lsbCBiZSB1c2VkIGZvciBsb2NhbCByZWNvbnN0cnVjdGlvbiBvZiA0eDQgYmxvY2tzIAorICAgICAqIHdpdGggYmVzdCBwcmVkaWN0aW9uIG1vZGUgd2l0aGluIGFuIE1CCisgICAgICovICAgIAorICAgIE9NWF9VOCAgICAgIHBTcmNZIFsoMTYqMykqKDE2KjIpXTsKKyAgICBPTVhfUzMyICAgICBTdGVwU3JjWTsKKyAgICAKKyAgICAvKiBpbml0ICovCisgICAgKnBDb3N0ID0gMDsKKworICAgIGZvciAoeSA9IDA7IHkgPCA1OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAqIEluaXRpYWxpemUgd2l0aCB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLLCB0byBtZWFuIHRoaXMgCisgICAgICAgICAgICAgKiA0eDQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVwbGFjZSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHZhbHVlIHdpdGggYXZhaWxhYmxlIE1CcyB2YWx1ZXMqLworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgeworICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYjAsIGIxLCBiMiwgYjMgKi8KKyAgICAgICAgaWYgKHBNQkludHJhWzFdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyAxXSA9IAorICAgICAgICAgICAgICAgIHBNQkludHJhWzFdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGQwLCBkMSwgZDIsIGQzICovCisgICAgICAgIGlmIChwTUJJbnRyYVszXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgNV0gPSAKKyAgICAgICAgICAgICAgICBwTUJJbnRyYVszXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogU3RvcmUgdmFsdWVzIG9mIGMzICovCisgICAgaWYgKHBNQkludHJhWzJdICE9IE5VTEwpCisgICAgeworICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVswXSA9IHBNQkludHJhWzJdLT5wSW50cmE0eDRQcmVkTW9kZVsxNV07CisgICAgfQorICAgIAorICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgeworICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYTAsIGExLCBhMiwgYTMgKi8KKyAgICAgICAgaWYgKHBNQkludHJhWzBdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgW3kgKyAxXVswXSA9IAorICAgICAgICAgICAgICAgIHBNQkludHJhWzBdLT5wSW50cmE0eDRQcmVkTW9kZVt5KjQgKyAzXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIFByZWQgbW9kZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCisgICAgICogcHJlZGljdGlvbiBvZiBJbnRyYTR4NCBtb2Rlcy4KKyAgICAgKi8KKyAgICAKKyAgICBTdGVwU3JjWSA9IDE2ICogMzsKKyAgICBmb3IgKHkgPSAwOyB5IDwgKDE2ICogMik7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAoMTYgKiAzKTsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjWSBbU3RlcFNyY1kgKiB5ICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIFtTcmNSZWNTdGVwICogKHkgLSAxNikgKyB4IC0gMTZdOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIGZvciBlYWNoIDh4OCBibG9jayAqLworICAgIGZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCisgICAgeworICAgICAgICAvKiBmb3IgZWFjaCA0eDQgYmxvY2sgaW5zaWRlIDh4OCBibG9jayAqLworICAgICAgICBmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbiAoCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKKyAgICAgICAgICAgICAgICBCbG9jazh4OCwgCisgICAgICAgICAgICAgICAgQmxvY2s0eDQsCisgICAgICAgICAgICAgICAgcFNyY1kgKyAxNiAqIFN0ZXBTcmNZICsgMTYsCisgICAgICAgICAgICAgICAgU3RlcFNyY1ksCisgICAgICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSwgCisgICAgICAgICAgICAgICAgJkNvc3QpOworCisgICAgICAgICAgICAqcENvc3QgKz0gQ29zdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlck1FTUIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJTlRFUiBNQiB0eXBlIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gc3RyYXRlZ3kgZnJvbSAKKyAqIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgSVNPL0lFQyAxNDQ5Ni0xMC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAorICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCisgKiBbaW5dIHBTcmNSZWZCdWZMaXN0ICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKKyAqIFtpbl0gU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCisgKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCisgKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCisgKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwRHN0Q29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRlciBNQgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKgorICovCisKK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlck1FTUIoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgCisJT01YX1MzMiBTcmNDdXJyU3RlcCwgCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKwlPTVhfVTMyIExhbWJkYSwKKwl2b2lkICpwTUVTcGVjLAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisJT01YX1UzMiAqcERzdENvc3QpCit7CisgICAgT01YX1MzMiAgICAgaSwgaiwgeCwgeSwgbW9kZTsKKyAgICBPTVhfVTMyICAgICBCbG9jazh4OCwgWFBlck1CLCBZUGVyTUIsIEJsb2NrMngsIEJsb2NrMnk7CisgICAgT01YX1MzMiAgICAgUGFydFN0YXJ0WCA9IDAsIFBhcnRTdGFydFkgPSAwOworICAgIE9NWF9TMzIgICAgIFBhcnRXaWR0aCA9IDgsIFBhcnRIZWlnaHQgPSA4LCBCbG9ja1dpZHRoID0gNCwgQmxvY2tIZWlnaHQgPSA0OworICAgIGNvbnN0IE9NWF9VMzIgICAgIEJsa1N6IFs0XVsyXSA9IHt7NCw0fSwgezQsOH0sIHs4LDR9fTsKKyAgICBjb25zdCBPTVhfVTMyICAgICBQYXJ0U3ogWzRdWzJdID0ge3s4LDh9LCB7OCwxNn0sIHsxNiw4fSwgezE2LDE2fX07CisgICAgY29uc3QgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlICAgICAKKyAgICAgICAgICAgICAgICBNb2RlU3ViTUJUeXBlNHg0IFtdID0ge09NWF9WQ19TVUJfUF80eDQsIE9NWF9WQ19TVUJfUF80eDgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1NVQl9QXzh4NCwgT01YX1ZDX1NVQl9QXzh4OH07CisgICAgY29uc3QgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlCisgICAgICAgICAgICAgICAgTW9kZU1CVHlwZSBbXSA9IHtPTVhfVkNfUF84eDgsIE9NWF9WQ19QXzh4MTYsIE9NWF9WQ19QXzE2eDgsIE9NWF9WQ19QXzE2eDE2fTsKKyAgICAKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUJPcHRpb25zOworICAgIC8qCisgICAgICogUmVmRnJBcnIgYW5kICBNVkFyciB3aWxsIGJlIHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIG9mIFJlZmVyZW5jZSBmcmFtZSBpbmRleCBhbmQgTVZzCisgICAgICogSXQgd2lsbCBzdG9yZSBSZWZJbmRleCBhbmQgTVZzIG9mIDYgTUJzIGFzIHNob3duIGJlbG93CisgICAgICogCisgICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKKyAgICAgKiAgICAgfFRwLUx0IHxUb3AgICB8VHAtUiAgfAorICAgICAqICAgICB8IE1CICAgfCBNQiAgIHwgTUIgICB8CisgICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKKyAgICAgKiAgICAgfExlZnQgIHwgQ3VyciB8ICAgICAgfAorICAgICAqICAgICB8IE1CICAgfCBNQiAgIHwgICAgICB8CisgICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKKyAgICAgKi8KKyAgICBPTVhfUzMyICAgICBSZWZGckFyciBbNF1bNl07IAorICAgIE9NWFZDTW90aW9uVmVjdG9yIE1WQXJyIFs4XVsxMl07CisgICAgT01YVkNNb3Rpb25WZWN0b3IgTVZQcmVkQXJyIFs0XVs0XTsKKyAgICAKKyAgICAvKgorICAgICAqIEluZGV4VG9Mb2Mgd2lsbCB0cmFuc2xhdGUgcE1CSW50ZXIgaW5kZXggaW50byBzcGFjaWFsIGFycmFuZ2VtZW50IG9mIE1CcworICAgICAqLworICAgIE9NWF9TMzIgICAgIEluZGV4VG9Mb2MgW10gPSB7MiwxLDMsMH07CisgICAgT01YX1UzMiAgICAgcGFydCwgTWF4UGFydDsKKyAgICBPTVhfUzMyICAgICBDb3N0LCBNb3Rpb25Db3N0OHg4IFs0XSwgTUJDb3N0LCBCZXN0Q29zdDsKKworICAgIC8qCisgICAgICogVXBkYXRlIG5laWdoYm91cmluZyBNViBhcnJheSBhbmQgUmVmIGZyYW1lIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKKyAgICAgKiBwcmVkaWN0aW9uIG9mIE1WcyBhbmQgUmVmIGZyYW1lcy4KKyAgICAgKi8KKworICAgIC8qIFNldCBjb3N0IHRvIGEgaGlnaCB2YWx1ZSAqLworICAgIENvc3QgPSBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIAorICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTI7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDMgKiAoeSA+PiAyKSArICh4ID4+IDIpOworICAgICAgICAgICAgaWYgKCh5IDwgNCB8fCB4IDwgNCkgJiYgKHBNQkludGVyW0luZGV4VG9Mb2NbaV1dICE9IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keCA9IAorICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cE1WMFt5ICUgNF1beCAlIDRdLmR4OworICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keSA9IAorICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cE1WMFt5ICUgNF1beCAlIDRdLmR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keCA9IDA7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDMgKiAoeSA+PiAxKSArICh4ID4+IDEpOworICAgICAgICAgICAgaWYgKCh5IDwgMiB8fCB4IDwgMikgJiYgKHBNQkludGVyW0luZGV4VG9Mb2NbaV1dICE9IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlZkZyQXJyIFt5XVt4XSA9IAorICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cFJlZkwwSWR4IFsoeSAlIDIpICogMiArICh4ICUgMildOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlZkZyQXJyIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgIAorCisgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WUHJlZEFyciBbeV1beF0uZHggPSAwOworICAgICAgICAgICAgTVZQcmVkQXJyIFt5XVt4XS5keSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBNb3Rpb24gRXN0aW1hdGlvbiBmb3IgOHg4IE1CIFBhcnRpdGlvbiAKKyAgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBNb3Rpb25Db3N0OHg4IFtpXSA9IDA7CisgICAgfSAgICAgICAgCisgICAgCisgICAgcE1CT3B0aW9ucyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBpZiAocE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTh4OCA9PSAxICYmIAorICAgICAgICBwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlNHg0ID09IDEpCisgICAgeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfUF84eDg7CisKKyAgICAgICAgUGFydFdpZHRoID0gUGFydFN6IFswXVswXTsKKyAgICAgICAgUGFydEhlaWdodCA9IFBhcnRTeiBbMF1bMV07CisgICAgICAgIAorICAgICAgICAvKiBGb3IgZWFjaCA4eDggcGFydGl0aW9ucyAqLworICAgICAgICBmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJ0U3RhcnRYID0gKEJsb2NrOHg4ICUgMikgPDwgMzsKKyAgICAgICAgICAgIFBhcnRTdGFydFkgPSAoQmxvY2s4eDggLyAyKSA8PCAzOworCisgICAgICAgICAgICBCbG9jazJ4ID0gKEJsb2NrOHg4ICYgMSkgPDwgMTsKKyAgICAgICAgICAgIEJsb2NrMnkgPSAoQmxvY2s4eDggPj4gMSkgPDwgMTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICAgICAgICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCAzOyBtb2RlKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCA9IEJsa1N6IFttb2RlXVswXTsKKyAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCA9IEJsa1N6IFttb2RlXVsxXTsKKworICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAorICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKKyAgICAgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAorICAgICAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgcE1FU3BlYywKKworICAgICAgICAgICAgICAgICAgICBQYXJ0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIFBhcnRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBQYXJ0U3RhcnRYLAorICAgICAgICAgICAgICAgICAgICBQYXJ0U3RhcnRZLAorCisgICAgICAgICAgICAgICAgICAgIE1WQXJyLAorICAgICAgICAgICAgICAgICAgICBSZWZGckFyciwKKyAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyLAorCisgICAgICAgICAgICAgICAgICAgIExhbWJkYSwKKyAgICAgICAgICAgICAgICAgICAgJkNvc3QpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoQ29zdCA8PSBCZXN0Q29zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCisgICAgICAgICAgICAgICAgICAgIEJlc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBNQkN1cnIgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnN1Yk1CVHlwZSBbQmxvY2s4eDhdID0gTW9kZVN1Yk1CVHlwZTR4NCBbbW9kZV07CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wUmVmTDBJZHggW0Jsb2NrOHg4XSA9IFJlZkZyQXJyIFsyICsgKFBhcnRTdGFydFkgPj4gMyldWzIgKyAoUGFydFN0YXJ0WCA+PiAzKV07CisKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBNVjAgYW5kIHBNVlByZWQgb2YgTUJDdXJyIHN0cnVjdCAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkFyciBbNCArIEJsb2NrMnkgKyBqXVs0ICsgQmxvY2syeCArIGldLmR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkFyciBbNCArIEJsb2NrMnkgKyBqXVs0ICsgQmxvY2syeCArIGldLmR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KKyAgICAgICAgICAgIE1vdGlvbkNvc3Q4eDggW0Jsb2NrOHg4XSA9IEJlc3RDb3N0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBDb3N0IGZvciBtYlR5cGUgT01YX1ZDX1BfOHg4ICovCisgICAgICAgIEJlc3RDb3N0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQmVzdENvc3QgKz0gTW90aW9uQ29zdDh4OCBbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2V0IHN1YiBNQiB0eXBlIHRvIDh4OCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5zdWJNQlR5cGUgW2ldID0gT01YX1ZDX1NVQl9QXzh4ODsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTW90aW9uIEVzdGltYXRpb24gZm9yIDh4OCwgOHgxNiwgMTZ4OCBhbmQgMTZ4MTYgTUIgUGFydGl0aW9uCisgICAgICogSWYgcE1CT3B0aW9ucy0+Yjh4OEJsb2NrU3BsaXRFbmFibGUgaXMgMCwgZG8gb25seSAxNngxNiBNRSAobW9kZSAzKQorICAgICAqLworICAgIGZvciAobW9kZSA9IChwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlOHg4ID09IDEgPyAwIDogMyk7IG1vZGUgPCA0OyBtb2RlKyspCisgICAgeworICAgICAgICBCbG9ja1dpZHRoID0gUGFydFdpZHRoID0gUGFydFN6IFttb2RlXVswXTsKKyAgICAgICAgQmxvY2tIZWlnaHQgPSBQYXJ0SGVpZ2h0ID0gUGFydFN6IFttb2RlXVsxXTsKKyAgICAgICAgCisgICAgICAgIFhQZXJNQiA9IDE2IC8gUGFydFdpZHRoOworICAgICAgICBZUGVyTUIgPSAxNiAvIFBhcnRIZWlnaHQ7CisgICAgICAgIE1heFBhcnQgPSBYUGVyTUIgKiBZUGVyTUI7CisgICAgICAgIAorICAgICAgICBNQkNvc3QgPSAwOworICAgICAgICAKKyAgICAgICAgLyogcGFydCBzaXplIDQsIDIsIDIgYW5kIDEgY29ycmVzcG9uZGluZyB0byA4eDgsIDh4MTYsIDE2eDggYW5kIDE2eDE2IE1CICovCisgICAgICAgIGZvciAocGFydCA9IDA7IHBhcnQgPCBNYXhQYXJ0OyBwYXJ0KyspCisgICAgICAgIHsKKyAgICAgICAgCVBhcnRTdGFydFggPSAocGFydCAlIFhQZXJNQikgKiBQYXJ0V2lkdGg7CisgICAgICAgIAlQYXJ0U3RhcnRZID0gKHBhcnQgLyBYUGVyTUIpICogUGFydEhlaWdodDsKKyAgICAgICAgCQorICAgICAgICAgICAgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCisgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgIHBNRVNwZWMsCisKKyAgICAgICAgICAgICAgICBQYXJ0V2lkdGgsCisgICAgICAgICAgICAgICAgUGFydEhlaWdodCwKKyAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgIFBhcnRTdGFydFgsCisgICAgICAgICAgICAgICAgUGFydFN0YXJ0WSwKKworICAgICAgICAgICAgICAgIE1WQXJyLAorICAgICAgICAgICAgICAgIFJlZkZyQXJyLAorICAgICAgICAgICAgICAgIE1WUHJlZEFyciwKKworICAgICAgICAgICAgICAgIExhbWJkYSwKKyAgICAgICAgICAgICAgICAmQ29zdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTUJDb3N0ICs9IENvc3Q7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTUJDb3N0IDw9IEJlc3RDb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLworICAgICAgICAgICAgQmVzdENvc3QgPSBNQkNvc3Q7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBtYlR5cGUgb2YgTUJDdXJyIHN0cnVjdCAqLworICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gTW9kZU1CVHlwZSBbbW9kZV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBwTVYwIGFuZCBwTVZQcmVkIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW2pdW2ldLmR4ID0gTVZBcnIgWzQral1bNCtpXS5keDsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbal1baV0uZHkgPSBNVkFyciBbNCtqXVs0K2ldLmR5OworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtqXVtpXS5keCA9IE1WUHJlZEFyciBbal1baV0uZHg7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW2pdW2ldLmR5ID0gTVZQcmVkQXJyIFtqXVtpXS5keTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wUmVmTDBJZHggW2oqMitpXSA9IFJlZkZyQXJyIFsyK2pdWzIraV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgQmVzdCBDb3N0ICovCisgICAgKnBEc3RDb3N0ID0gQmVzdENvc3Q7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclsxXSAKKyAqICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgCisgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIAorICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRSQS4gcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbMV0gCisgKiAgICAgICAgICAgIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIAorICogICAgICAgICAgICB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIAorICogICAgICAgICAgICBpbmZvcm1hdGlvbiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKKyAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAorICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAorICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogTWJUeXBlIAorICogICAgICAgICAgICBzdWJNQlR5cGVbNF0gcE1WMFs0XVs0XSBwTVZQcmVkWzRdWzRdIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgSW50cmExNngxNlByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKKyAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAorICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworIAorT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CKCAgICAgICAgICAgICAgICAgICAgCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJT01YX1MzMiBTcmNDdXJyU3RlcCwgCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLCAKKwlPTVhfUzMyIFNyY1JlY1N0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKwlPTVhfVTMyIExhbWJkYSwKKwl2b2lkICpwTUVTcGVjLAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKKwljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorCU9NWF9JTlQgKnBEc3RDb3N0LAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRCkKK3sKKyAgICBPTVhfVTMyICAgICBDb3N0LCBpLCBJbnRyYUZsYWcgPSAxOworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNRVBhcmFtczsgCisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmTGlzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVjQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocE1FU3BlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwTUJJbnRlciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwTUJJbnRyYSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TUJDdXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKFNyY1JlZlN0ZXAgPD0gMCB8fCBTcmNSZWZTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKFNyY1JlY1N0ZXAgPD0gMCB8fCBTcmNSZWNTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKFNyY0N1cnJTdGVwIDw9IDAgfHwgU3JjQ3VyclN0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKSAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNSZWNCdWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTOyBpKyspCisgICAgeworICAgICAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmTGlzdCBbaV0gIT0gTlVMTCAmJgorICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjUmVmQnVmTGlzdCBbaV0pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiBjdXJyZW50IE1CIG5lZWRzIElOVEVSIGNvc3QgY2FsY3VsYXRpb25zICovCisgICAgICAgIGlmIChwU3JjUmVmQnVmTGlzdCBbaV0gIT0gTlVMTCAmJiBJbnRyYUZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgSW50cmFGbGFnID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRHN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIC8qCisgICAgICogSW50ZXIgY29zdCBjYWxjdWxhdGlvbnMgCisgICAgICovCisKKyAgICAgLyogY2hlY2sgdGhpcyBNQiBjYW4gYmUgSW50ZXIgKi8KKyAgICBpZiAoSW50cmFGbGFnICE9IDEpCisgICAgeworICAgICAgICAgYXJtVkNNNFAxMF9JbnRlck1FTUIoCisgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCisgICAgICAgICAgICAgU3JjUmVmU3RlcCwKKyAgICAgICAgICAgICBwUmVmUmVjdCwgICAgCisgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICBMYW1iZGEsCisgICAgICAgICAgICAgcE1FU3BlYywKKyAgICAgICAgICAgICBwTUJJbnRlciwKKyAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAgICAgICZDb3N0CisgICAgICAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgICpwRHN0Q29zdCA9IENvc3Q7CisgICAgfSAgICAgCisKKyAgICBwTUVQYXJhbXMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopcE1FU3BlYzsKKyAgICAKKyAgICBpZiAocE1FUGFyYW1zLT5pbnRyYUVuYWJsZTR4NCA9PSAxKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSW50cmEgNHg0IGNvc3QgY2FsY3VsYXRpb25zCisgICAgICAgICAqLworICAgICAgICBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbigKKyAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAorICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICBwU3JjUmVjQnVmLCAgIAorICAgICAgICAgICAgU3JjUmVjU3RlcCwKKyAgICAgICAgICAgIHBNQkludHJhLAorICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKKyAgICAgICAgICAgICZDb3N0CisgICAgICAgICAgICApOworCisgICAgICAgIGlmIChDb3N0IDw9ICpwRHN0Q29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQV80eDQ7CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvc3QgZm9yIEludHJhIDE2eDE2IG1vZGUKKyAgICAgKi8KKworICAgIGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24oCisgICAgICAgIHBTcmNDdXJyQnVmLCAgIAorICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgcFNyY1JlY0J1ZiwgICAKKyAgICAgICAgU3JjUmVjU3RlcCwKKyAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgcE1CSW50ZXIsCisgICAgICAgIHBNQkludHJhLAorICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAmQ29zdAorICAgICAgICApOworCisgICAgaWYgKENvc3QgPD0gKnBEc3RDb3N0KQorICAgIHsKKyAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBXzE2eDE2OworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHBEc3RCbG9ja1NBRCB0byBtYXggdmFsdWUKKyAgICAgKi8KKwlhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FEKAlwU3JjRHN0TUJDdXJyLCAKKyAgICAgICAgcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAlTcmNDdXJyU3RlcCwgCisgICAgCXBTcmNSZWZCdWZMaXN0LAorICAgIAlTcmNSZWZTdGVwLAorICAgIAlwU3JjUmVjQnVmLCAKKyAgICAJU3JjUmVjU3RlcCwKKyAgICAJcFJlZlJlY3QsCisgICAgCXBDdXJyUG9pbnRQb3MsCisgICAgCXBNQkludGVyLCAKKyAgICAJcE1CSW50cmEsCisgICAgCXBEc3RCbG9ja1NBRCk7CisKKworCXJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmNhNzgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBDaHJvbWEgOHg4IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIHVwcGVyIGJsb2NrIGhhcyBwcmlvcml0eQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ1VwNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKykKK3sKKyAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCisgICAgeworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBpZiAoQ291bnQ9PTApCisgICAgeworICAgICAgICBTdW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOworICAgIH0KKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgbGVmdCBibG9jayBoYXMgcHJpb3JpdHkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKykKK3sKKyAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICB7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBpZiAoQ291bnQ9PTApCisgICAgeworICAgICAgICBTdW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOworICAgIH0KKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCisgKiAgICAgICAgICAgIDAuLjcpLiAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAorICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKKyAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBOb3RlOiAKKyAqICAgICAgICAgICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogICAgICAgICAgICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiAgICAgICAgICAgICAgIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgCisgKiAgICAgICAgICAgICAgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKyApCit7CisgICAgaW50IHgsIHksIFN1bTsKKyAgICBpbnQgSCwgViwgYSwgYiwgYzsKKworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgOCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9IT1IgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ19DSFJPTUFfUExBTkUsICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKworICAgIHN3aXRjaCAocHJlZE1vZGUpCisgICAgeworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9EQzoKKyAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQsICAgICAgICAgICAgcFNyY0Fib3ZlLCAgIHBEc3QsICAgICAgICAgICAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUrNCwgcERzdCs0LCAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KCAgIHBTcmNMZWZ0KzQqbGVmdFN0ZXAsIHBTcmNBYm92ZSwgICBwRHN0KzQqZHN0U3RlcCwgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKKyAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlKzQsIHBEc3QrNCs0KmRzdFN0ZXAsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9IT1I6CisgICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ19DSFJPTUFfVkVSVDoKKyAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjQWJvdmVbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ19DSFJPTUFfUExBTkU6CisgICAgICAgIEggPSA0KihwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKKyAgICAgICAgZm9yICh4PTI7IHg+PTA7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzQreF0gLSBwU3JjQWJvdmVbMi14XSk7CisgICAgICAgIH0KKyAgICAgICAgViA9IDQqKHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7CisgICAgICAgIGZvciAoeT0yOyB5Pj0wOyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg0K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WygyLXkpKmxlZnRTdGVwXSk7CisgICAgICAgIH0KKyAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXSk7CisgICAgICAgIGIgPSAoMTcqSCsxNik+PjU7CisgICAgICAgIGMgPSAoMTcqVisxNik+PjU7CisgICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC0zKSArIGMqKHktMykgKyAxNik+PjU7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGNiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCAxNngxNiBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCisgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKKyAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCisgKiAgICAgICAgICAgIDAuLjE1KSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAorICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKKyAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiBOb3RlOiAKKyAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LCAKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwgCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LCAKKyAgICBPTVhfVTgqIHBEc3QsIAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsIAorICAgIE9NWF9JTlQgZHN0U3RlcCwgCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwgCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkpCit7CisgICAgaW50IHgseSxTdW0sQ291bnQ7CisgICAgaW50IEgsVixhLGIsYzsKKworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCAxNiwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCAlIDE2KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDE2KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0Fib3ZlKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgICAgIAorICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X0hPUiAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDXzE2WDE2X1BMQU5FLCAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgc3dpdGNoIChwcmVkTW9kZSkKKyAgICB7CisgICAgY2FzZSBPTVhfVkNfMTZYMTZfVkVSVDoKKyAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzE2WDE2X0hPUjoKKyAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfMTZYMTZfREM6CisgICAgICAgIC8qIFRoaXMgY2FuIGFsd2F5cyBiZSB1c2VkIGV2ZW4gaWYgbm8gYmxvY2tzIGF2YWlsYWJsZSAqLworICAgICAgICBTdW0gPSAwOworICAgICAgICBDb3VudCA9IDA7CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENvdW50PT0wKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gPSAxMjg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQ291bnQ9PTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSA9IChTdW0gKyA4KSA+PiA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogQ291bnQgPSAyICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSA9IChTdW0gKyAxNikgPj4gNTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ18xNlgxNl9QTEFORToKKyAgICAgICAgSCA9IDgqKHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKKyAgICAgICAgZm9yICh4PTY7IHg+PTA7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzgreF0gLSBwU3JjQWJvdmVbNi14XSk7CisgICAgICAgIH0KKyAgICAgICAgViA9IDgqKHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0pOworICAgICAgICBmb3IgKHk9NjsgeT49MDsgeS0tKQorICAgICAgICB7CisgICAgICAgICAgICBWICs9ICh5KzEpKihwU3JjTGVmdFsoOCt5KSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsoNi15KSpsZWZ0U3RlcF0pOworICAgICAgICB9CisgICAgICAgIGEgPSAxNioocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSk7CisgICAgICAgIGIgPSAoNSpIKzMyKT4+NjsKKyAgICAgICAgYyA9ICg1KlYrMzIpPj42OworICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC03KSArIGMqKHktNykgKyAxNik+PjU7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE4MjEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKQEAgLTAsMCArMSwzMzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCisgKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCisgKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAorICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAorICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorICkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBPTVhfVTggcFRtcFsxMF07CisKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA0KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgNCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCA8IDQpLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZFUlQgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IT1IgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19ETCAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZMICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IVSAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDXzRYNF9IVSwgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIAorICAgIC8qIE5vdGU6IFRoaXMgY29kZSBtdXN0IG5vdCByZWFkIHRoZSBwU3JjIGFycmF5cyB1bmxlc3MgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBibG9jayBpcyBtYXJrZWQgYXMgYXZhaWxhYmxlLiBJZiB0aGUgYmxvY2sgaXMgbm90IGF2YWliYWJsZSB0aGVuIHBTcmMKKyAgICAgKiBtYXkgbm90IGJlIGEgdmFsaWQgcG9pbnRlci4KKyAgICAgKgorICAgICAqIE5vdGU6IFRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSB3ZSByZWZlciB0byB0aGUgbmVpZ2hib3VyaW5nIHBpeGVscworICAgICAqIGluIHZhcmlhYmxlcyBuYW1lZCBhcyBiZWxvdzoKKyAgICAgKgorICAgICAqICAgIFVMIFUwIFUxIFUyIFUzIFU0IFU1IFU2IFU3CisgICAgICogICAgTDAgeHggeHggeHggeHgKKyAgICAgKiAgICBMMSB4eCB4eCB4eCB4eAorICAgICAqICAgIEwyIHh4IHh4IHh4IHh4CisgICAgICogICAgTDMgeHggeHggeHggeHgKKyAgICAgKi8KKyAgICAgCisjZGVmaW5lIFVMIHBTcmNBYm92ZUxlZnRbMF0KKyNkZWZpbmUgVTAgcFNyY0Fib3ZlWzBdCisjZGVmaW5lIFUxIHBTcmNBYm92ZVsxXQorI2RlZmluZSBVMiBwU3JjQWJvdmVbMl0KKyNkZWZpbmUgVTMgcFNyY0Fib3ZlWzNdCisjZGVmaW5lIFU0IHBTcmNBYm92ZVs0XQorI2RlZmluZSBVNSBwU3JjQWJvdmVbNV0KKyNkZWZpbmUgVTYgcFNyY0Fib3ZlWzZdCisjZGVmaW5lIFU3IHBTcmNBYm92ZVs3XQorI2RlZmluZSBMMCBwU3JjTGVmdFswKmxlZnRTdGVwXQorI2RlZmluZSBMMSBwU3JjTGVmdFsxKmxlZnRTdGVwXQorI2RlZmluZSBMMiBwU3JjTGVmdFsyKmxlZnRTdGVwXQorI2RlZmluZSBMMyBwU3JjTGVmdFszKmxlZnRTdGVwXQorCisgICAgc3dpdGNoIChwcmVkTW9kZSkKKyAgICB7CisgICAgY2FzZSBPTVhfVkNfNFg0X1ZFUlQ6CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMF0gPSBVMDsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzFdID0gVTE7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCsyXSA9IFUyOworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArM10gPSBVMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9IT1I6CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFswKmRzdFN0ZXAreF0gPSBMMDsKKyAgICAgICAgICAgIHBEc3RbMSpkc3RTdGVwK3hdID0gTDE7CisgICAgICAgICAgICBwRHN0WzIqZHN0U3RlcCt4XSA9IEwyOworICAgICAgICAgICAgcERzdFszKmRzdFN0ZXAreF0gPSBMMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIE9NWF9WQ180WDRfREM6CisgICAgICAgIC8qIFRoaXMgY2FuIGFsd2F5cyBiZSB1c2VkIGV2ZW4gaWYgbm8gYmxvY2tzIGF2YWlsYWJsZSAqLworICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KHBTcmNMZWZ0LCBwU3JjQWJvdmUsIHBEc3QsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgY2FzZSBPTVhfVkNfNFg0X0RJQUdfREw6CisgICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfUklHSFQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTIgKyAyKlUzICsgVTQgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUzICsgMipVNCArIFU1ICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVNCArIDIqVTUgKyBVNiArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTUgKyAyKlU2ICsgVTcgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFU2ICsgMypVNyAgICAgICsgMik+PjIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMiArIDMqVTMgICAgICArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbM10gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbNF0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbNV0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbNl0gPSBVMzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbeCt5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9ESUFHX0RSOiAgICAgICAgCisgICAgICAgIC8qIHgteSA9IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVTCArIDIqTDAgKyBMMSArIDIpPj4yKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMCArIDIqVUwgKyBMMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVMSArIDIqVTAgKyBVTCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDIqVTEgKyBVMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMyArIDIqVTIgKyBVMSArIDIpPj4yKTsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMreC15XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9WUjoKKyAgICAgICAgLyogelZSPTJ4LXkgPSAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2CisgICAgICAgICAqIHgtKHk+PjEpID0gLTEsIC0xLCAgMCwgMCwgMSwgMSwgMiwgMiwgMywgMworICAgICAgICAgKiB5ICAgICAgICA9ICAzLCAgMiwgID8sID8sID8sID8sID8sID8sIDEsIDAKKyAgICAgICAgICovCisgICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDIgKyAyKkwxICsgTDAgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDEgKyAyKkwwICsgVUwgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoTDAgKyAyKlVMICsgVTAgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVUwgKyBVMCArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVTCArIDIqVTAgKyBVMSArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMCArIFUxICsgMSk+PjEpOworICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOworICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKFUxICsgVTIgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoVTIgKyBVMyArIDEpPj4xKTsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMrMip4LXldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0hEOgorICAgICAgICAvKiB6SEQ9MnkteCA9IC0zIC0yIC0xICAwICAxICAyICAzICA0ICA1ICA2CisgICAgICAgICAqIHktKHg+PjEpID0gLTEgLTEgIDAgIDAgIDEgIDEgIDIgIDIgIDMgIDMKKyAgICAgICAgICogeCAgICAgICAgPSAgMyAgMiAgICAgICAgICAgICAgICAgICAgMSAgMAorICAgICAgICAgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMiArIDIqVTEgKyBVMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMSArIDIqVTAgKyBVTCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMCArIDIqVUwgKyBMMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVTCArIEwwICsgMSk+PjEpOworICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFVMICsgMipMMCArIEwxICsgMik+PjIpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKEwwICsgTDEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoTDEgKyBMMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChMMiArIEwzICsgMSk+PjEpOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMysyKnkteF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ180WDRfVkw6CisgICAgICAgIC8qIE5vdGU6IHgrKHk+PjEpID0gKDIqeCt5KT4+MQorICAgICAgICAgKiAyeCt5ID0gMCAxIDIgMyA0IDUgNiA3IDggOQorICAgICAgICAgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMCArIFUxICsgMSk+PjEpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUxICsgVTIgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTIgKyBVMyArIDEpPj4xKTsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9SSUdIVCkKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDIqVTMgKyBVNCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTMgKyBVNCArIDEpPj4xKTsKKyAgICAgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoVTMgKyAyKlU0ICsgVTUgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKFU0ICsgVTUgKyAxKT4+MSk7CisgICAgICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKFU0ICsgMipVNSArIFU2ICsgMik+PjIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDMqVTMgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzZdID0gVTM7CisgICAgICAgICAgICBwVG1wWzddID0gVTM7CisgICAgICAgICAgICBwVG1wWzhdID0gVTM7CisgICAgICAgICAgICBwVG1wWzldID0gVTM7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzIqeCt5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9IVToKKyAgICAgICAgLyogekhVID0geCsyKnkgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMCArIEwxICsgMSk+PjEpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKEwxICsgTDIgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoTDIgKyBMMyArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChMMiArIDMqTDMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNl0gPSBMMzsKKyAgICAgICAgcFRtcFs3XSA9IEwzOworICAgICAgICBwVG1wWzhdID0gTDM7CisgICAgICAgIHBUbXBbOV0gPSBMMzsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wW3grMip5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODExNGVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcworICogb2YgMTZ4MTYgb3IgMTZ4OAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4KAorCWNvbnN0IE9NWF9VOCogCXBTcmMsCisgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgIE9NWF9VMzIgCWlTcmNTdGVwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCisgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCisgICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKKyAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzMzBiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCkBAIC0wLDAgKzEsODUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfNHguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiBvZiA0eDggb3IgNHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHgoIAorCSAgY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCSAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgICBPTVhfVTMyCWlSZWZTdGVwMCwKKyAgICAgIE9NWF9VMzIJaVJlZlN0ZXAxLAorICAgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICAgIE9NWF9VMzIgICBpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKKyAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAorICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTljMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURRdWFyXzh4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcworICogb2YgOHgxNiBvciA4eDggb3IgOHg0CisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCggCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpICYmIAorICAgICAgICAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIAorCisgICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgorICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCisgICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyN2M0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRF80eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4KAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCisgICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWFlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBVERfNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcworICogCisgKi8KKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCisgKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCisgKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQoIAorCWNvbnN0IE9NWF9VOCoJCXBTcmNPcmcsCisJT01YX1UzMiAgICAgaVN0ZXBPcmcsICAgICAgICAgICAgICAgICAgICAgICAgIAorCWNvbnN0IE9NWF9VOCoJCXBTcmNSZWYsCisJT01YX1UzMgkJaVN0ZXBSZWYsCisJT01YX1UzMiogICAgcERzdFNBRAorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgU0FURCA9IDA7CisgICAgT01YX1MzMiAgICAgZCBbNF1bNF0sIG0xWzRdWzRdLCBtMls0XVs0XTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZCBbal1baV0gPSBwU3JjT3JnIFtqICogaVN0ZXBPcmcgKyBpXSAtIHBTcmNSZWYgW2ogKiBpU3RlcFJlZiArIGldOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSGFkYW1hcmQgVHJhbnNmb3IgZm9yIDR4NCBibG9jayAqLworCisgICAgLyogSG9yaXpvbnRhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBtMVtpXVswXSA9IGRbaV1bMF0gKyBkW2ldWzJdOyAvKiBhK2MgKi8KKyAgICAgICAgbTFbaV1bMV0gPSBkW2ldWzFdICsgZFtpXVszXTsgLyogYitkICovCisgICAgICAgIG0xW2ldWzJdID0gZFtpXVswXSAtIGRbaV1bMl07IC8qIGEtYyAqLworICAgICAgICBtMVtpXVszXSA9IGRbaV1bMV0gLSBkW2ldWzNdOyAvKiBiLWQgKi8KKworICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KKyAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCisgICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLworICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KKworICAgIH0KKworICAgIC8qIFZlcnRpY2FsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKKyAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOworICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07CisgICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKKworICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07CisgICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKKyAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOworICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07CisgICAgfQorICAgIAorICAgIC8qIGNhbGN1bGF0ZSBTQUQgZm9yIFRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTQVREICs9IGFybUFicyhtMiBbal1baV0pOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAqcERzdFNBRCA9IChTQVREICsgMSkgLyAyOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhNTY2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCisgKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCisgKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCisgKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAorICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCisgKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIDQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKKyAqICAgICAgICAgICAgb2YgNC4gCisgKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKKyAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCisgKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKKyAqICAgICAgICAgICAgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKKyAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKKyAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCisgT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorCSBjb25zdCBPTVhfVTgqCQlwU3JjT3JnLAorCSBjb25zdCBPTVhfVTgqCQlwU3JjUHJlZCwKKwkgT01YX1UzMgkJaVNyY09yZ1N0ZXAsCisJIE9NWF9VMzIJCWlTcmNQcmVkU3RlcCwKKwkgT01YX1MxNioJICAgIHBEc3RRdWFudENvZWZmLAorCSBPTVhfUzE2KiAJICAgIHBEc3REZVF1YW50Q29lZmYsCisJIE9NWF9TMTYqCSAgICBwRENDb2VmZiwKKwkgT01YX1M4KgkJcE51bUNvZWZmLAorCSBPTVhfVTMyCQluVGhyZXNoU0FELAorCSBPTVhfVTMyCQlpUVAsCisJIE9NWF9VOAkJICAgIGJJbnRyYQorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1M4ICAgICAgTnVtQ29lZmYgPSAwOworICAgIE9NWF9TMTYgICAgIEJ1ZlsxNl0sIG1bMTZdOworICAgIE9NWF9VMzIgICAgIFFCaXRzLCBRUHBlciwgUVBtb2QsIGY7CisgICAgT01YX1MzMiAgICAgVmFsdWUsIE1GLCBUaHJlc2hEQzsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisJYXJtUmV0QXJnRXJySWYocERzdERlUXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisJYXJtUmV0QXJnRXJySWYocERDQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1ByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKSAmJiAKKwkJCWFybU5vdDhCeXRlQWxpZ25lZChwRHN0RGVRdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGJJbnRyYSAhPSAwKSAmJiAoYkludHJhICE9IDEpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY09yZ1N0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlTcmNPcmdTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiAKKyAgICAgKiBaZXJvLUJsb2NrIEVhcmx5IGRldGVjdGlvbiB1c2luZyBuVGhyZXNoU0FEIHBhcmFtIAorICAgICAqLworCisgICAgUVBwZXIgPSBpUVAgLyA2OworICAgIFFQbW9kID0gaVFQICUgNjsgICAgCisgICAgUUJpdHMgPSAxNSArIFFQcGVyOworICAgIAorICAgIGYgPSAoMSA8PCBRQml0cykgLyAoYkludHJhID8gMyA6IDYpOworICAgIAorICAgIC8qIERvIFplcm8tQmxvY2sgRWFybHkgZGV0ZWN0aW9uIGlmIGVuYWJsZWQgKi8KKyAgICBpZiAoblRocmVzaFNBRCkKKyAgICB7CisgICAgICAgIFRocmVzaERDID0gKCgxIDw8IFFCaXRzKSAtIGYpIC8gYXJtVkNNNFAxMF9NRk1hdHJpeFtRUG1vZF1bMF07CisgICAgICAgIGlmIChuVGhyZXNoU0FEIDwgVGhyZXNoREMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBibG9jayB0byB6ZXJvICovCisgICAgICAgICAgICBpZiAocERDQ29lZmYgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcERDQ29lZmYgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRHN0UXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAwOyAgICAKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocE51bUNvZWZmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBOdW1Db2VmZiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAvKiBDYWxjdWxhdGUgZGlmZmVyZW5jZSAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBCdWYgW2ogKiA0ICsgaV0gPSAKKyAgICAgICAgICAgICAgICBwU3JjT3JnIFtqICogaVNyY09yZ1N0ZXAgKyBpXSAtIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KKyAgICBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0IChtLCBCdWYpOworCisgICAgaWYgKHBEQ0NvZWZmICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBDb3B5IHVucXVhbnRpemVkIERDIHZhbHVlIGludG8gcG9pbnRlciAqLworICAgICAgICAqcERDQ29lZmYgPSBtWzBdOworICAgIH0KKworICAgIC8qIFF1YW50aXphdGlvbiAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBNRiA9IGFybVZDTTRQMTBfTUZNYXRyaXhbUVBtb2RdW2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ogKiA0ICsgaV1dOworICAgICAgICAgICAgVmFsdWUgPSBhcm1BYnMobVtqICogNCArIGldKSAqIE1GICsgZjsKKyAgICAgICAgICAgIFZhbHVlID4+PSBRQml0czsKKyAgICAgICAgICAgIFZhbHVlID0gbVtqICogNCArIGldIDwgMCA/IC1WYWx1ZSA6IFZhbHVlOworICAgICAgICAgICAgQnVmWzQgKiBqICsgaV0gPSBwRHN0UXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IChPTVhfUzE2KVZhbHVlOworICAgICAgICAgICAgaWYgKChwTnVtQ29lZmYgIT0gTlVMTCkgJiYgVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTnVtQ29lZmYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE91dHB1dCBudW1iZXIgb2Ygbm9uLXplcm8gQ29lZmZzICovCisgICAgaWYgKHBOdW1Db2VmZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKnBOdW1Db2VmZiA9IE51bUNvZWZmOworICAgIH0KKyAgICAKKyAgICAvKiBSZXNpZHVhbCBJbnYgVHJhbnNmb3JtICovCisgICAgaWYgKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkKKyAgICB7ICAgIAorICAgICAgICAvKiBSZSBTY2FsZSAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0gW2ogKiA0ICsgaV0gID0gQnVmIFtqICogNCArIGldICogKDEgPDwgUVBwZXIpICoKKyAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9WTWF0cml4W1FQbW9kXVthcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtqICogNCArIGldXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChwRHN0RGVRdWFudENvZWZmLCBtKTsgICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMGU4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb246CisgKiBEZXF1YW50aXplIENocm9tYSAyeDIgREMgYmxvY2sKKyAqLworCitzdGF0aWMgdm9pZCBEZXF1YW50Q2hyb21hREMyeDIoCisgICAgIE9NWF9TMTYqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorKQoreworICAgIGludCBTaGlmdCA9IChRUC82KS0xIDsKKyAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07CisgICAgaW50IGksIFZhbHVlOworCisgICAgaWYgKFNoaWZ0ID49IDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPDwgU2hpZnQ7CisgICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpID4+IDE7CisgICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisgCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEludmVyc2UgVHJhbnNmb3JtIERDIDJ4MiBDb2VmZmljaWVudHMKKyAqLworCitzdGF0aWMgdm9pZCBJbnZUcmFuc2Zvcm1EQzJ4MihPTVhfUzE2KiBwRGF0YSkKK3sKKyAgICBpbnQgYzAwID0gcERhdGFbMF07CisgICAgaW50IGMwMSA9IHBEYXRhWzFdOworICAgIGludCBjMTAgPSBwRGF0YVsyXTsKKyAgICBpbnQgYzExID0gcERhdGFbM107CisKKyAgICBpbnQgZDAwID0gYzAwICsgYzAxOworICAgIGludCBkMDEgPSBjMDAgLSBjMDE7CisgICAgaW50IGQxMCA9IGMxMCArIGMxMTsKKyAgICBpbnQgZDExID0gYzEwIC0gYzExOworCisgICAgcERhdGFbMF0gPSAoT01YX1MxNikoZDAwICsgZDEwKTsKKyAgICBwRGF0YVsxXSA9IChPTVhfUzE2KShkMDEgKyBkMTEpOworICAgIHBEYXRhWzJdID0gKE9NWF9TMTYpKGQwMCAtIGQxMCk7CisgICAgcERhdGFbM10gPSAoT01YX1MxNikoZDAxIC0gZDExKTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKKyAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCisgKQoreworICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MihwcFNyYywgcERzdCk7CisgICAgSW52VHJhbnNmb3JtREMyeDIocERzdCk7CisgICAgRGVxdWFudENocm9tYURDMngyKHBEc3QsIFFQKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjOGJlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlcXVhbnRpemUgTHVtYSBEQyBibG9jaworICovCisKK3N0YXRpYyB2b2lkIERlcXVhbnRMdW1hREM0eDQoCisgICAgIE9NWF9TMTYqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorKQoreworICAgIGludCBTaGlmdCA9IChRUC82KS0yIDsKKyAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07CisgICAgaW50IGksIFJvdW5kLCBWYWx1ZTsKKworICAgIGlmIChTaGlmdCA+PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA8PCBTaGlmdDsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDs7CisgICAgICAgIFJvdW5kID0gMTw8KFNoaWZ0LTEpOworCisgICAgICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSArIFJvdW5kKSA+PiBTaGlmdDsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworIAorCisvKgorICogRGVzY3JpcHRpb246CisgKiBJbnZlcnNlIFRyYW5zZm9ybSBEQyA0eDQgQ29lZmZpY2llbnRzCisgKi8KK3N0YXRpYyB2b2lkIEludlRyYW5zZm9ybURDNHg0KE9NWF9TMTYqIHBEYXRhKQoreworICAgIGludCBpOworCisgICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKKyAgICB7CisgICAgICAgIGludCBjMCA9IHBEYXRhW2krMF07CisgICAgICAgIGludCBjMSA9IHBEYXRhW2krMV07CisgICAgICAgIGludCBjMiA9IHBEYXRhW2krMl07CisgICAgICAgIGludCBjMyA9IHBEYXRhW2krM107CisgICAgICAgIHBEYXRhW2krMF0gPSAoT01YX1MxNikoYzArYzErYzIrYzMpOworICAgICAgICBwRGF0YVtpKzFdID0gKE9NWF9TMTYpKGMwK2MxLWMyLWMzKTsKKyAgICAgICAgcERhdGFbaSsyXSA9IChPTVhfUzE2KShjMC1jMS1jMitjMyk7CisgICAgICAgIHBEYXRhW2krM10gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOworICAgIH0KKworICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKKyAgICAgICAgaW50IGMxID0gcERhdGFbaSs0XTsKKyAgICAgICAgaW50IGMyID0gcERhdGFbaSs4XTsKKyAgICAgICAgaW50IGMzID0gcERhdGFbaSsxMl07CisgICAgICAgIHBEYXRhW2krMF0gPSAoT01YX1MxNikoYzArYzErYzIrYzMpOworICAgICAgICBwRGF0YVtpKzRdID0gKE9NWF9TMTYpKGMwK2MxLWMyLWMzKTsKKyAgICAgICAgcERhdGFbaSs4XSA9IChPTVhfUzE2KShjMC1jMS1jMitjMyk7CisgICAgICAgIHBEYXRhW2krMTJdID0gKE9NWF9TMTYpKGMwLWMxK2MyLWMzKTsKKyAgICB9Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAorICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKKyAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorICkKK3sKKyAgICBhcm1SZXRBcmdFcnJJZihwcFNyYyAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBTcmMgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ICAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihRUDwwLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihRUD41MSwgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQocHBTcmMsIHBEc3QpOworICAgIC8qSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NChwRHN0LCBRUCk7Ki8KKyAgICBJbnZUcmFuc2Zvcm1EQzR4NChwRHN0KTsKKyAgICBEZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTQ0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAorICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDKAorCU9NWF9TMTYqIAlwU3JjRHN0LAorCU9NWF9VMzIJCWlRUCwKKwlPTVhfVTgJCWJJbnRyYQorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgbVsyXVsyXTsKKyAgICBPTVhfUzMyICAgICBWYWx1ZTsKKyAgICBPTVhfUzMyICAgICBRYml0c1BsdXNPbmUsIFR3b19mLCBNRjAwOworCisgICAgLyogQ2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgMngyIGJsb2NrICovCisgICAgbVswXVswXSA9IHBTcmNEc3RbMF0gKyBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gKyBwU3JjRHN0WzNdOworICAgIG1bMF1bMV0gPSBwU3JjRHN0WzBdIC0gcFNyY0RzdFsxXSArICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKKyAgICBtWzFdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSAtIHBTcmNEc3RbM107CisgICAgbVsxXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdIC0gIHBTcmNEc3RbMl0gKyBwU3JjRHN0WzNdOworCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgUWJpdHNQbHVzT25lID0gQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KTsgLypmbG9vciAoUVAvNikqLworICAgIE1GMDAgPSBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXTsKKworICAgIFR3b19mID0gKDEgPDwgUWJpdHNQbHVzT25lKSAvIChiSW50cmEgPyAzIDogNik7IC8qIDMtPklOVFJBLCA2LT5JTlRFUiAqLworCisgICAgLyogU2NhbGluZyAqLworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChhcm1BYnMobVtqXVtpXSkgKiBNRjAwICsgVHdvX2YpID4+IFFiaXRzUGx1c09uZTsKKyAgICAgICAgICAgIHBTcmNEc3RbaiAqIDIgKyBpXSA9IChPTVhfUzE2KSgobVtqXVtpXSA8IDApID8gLVZhbHVlIDogVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2NmN2YwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwpAQCAtMCwwICsxLDExOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgcXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQygKKwlPTVhfUzE2KiAJcFNyY0RzdCwKKwlPTVhfVTMyCQlpUVAKKykKK3sKKyAgICBPTVhfSU5UICAgICBpLCBqOworICAgIE9NWF9TMzIgICAgIG0xWzRdWzRdLCBtMls0XVs0XTsKKyAgICBPTVhfUzMyICAgICBWYWx1ZTsKKyAgICBPTVhfVTMyICAgICBRYml0c1BsdXNPbmUsIFR3b19mLCBNRjsKKworICAgIC8qIENoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciA0eDQgYmxvY2sgKi8KKyAgICAvKiBIb3Jpem9udGFsIEhhZGFtYXJkICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSBpICogNDsKKyAgICAgICAgCisgICAgICAgIG0xW2ldWzBdID0gcFNyY0RzdFtqICsgMF0gKyBwU3JjRHN0W2ogKyAyXTsgLyogYStjICovCisgICAgICAgIG0xW2ldWzFdID0gcFNyY0RzdFtqICsgMV0gKyBwU3JjRHN0W2ogKyAzXTsgLyogYitkICovCisgICAgICAgIG0xW2ldWzJdID0gcFNyY0RzdFtqICsgMF0gLSBwU3JjRHN0W2ogKyAyXTsgLyogYS1jICovCisgICAgICAgIG0xW2ldWzNdID0gcFNyY0RzdFtqICsgMV0gLSBwU3JjRHN0W2ogKyAzXTsgLyogYi1kICovCisKKyAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCisgICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLworICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KKyAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCisKKyAgICB9CisKKyAgICAvKiBWZXJ0aWNhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07CisgICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKKyAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOworICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07CisKKyAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOworICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07CisgICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKKyAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOworICAgIH0KKworICAgIAorICAgIC8qIFF1YW50aXphdGlvbiAqLworICAgIFFiaXRzUGx1c09uZSA9IEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNik7IC8qZmxvb3IgKFFQLzYpKi8KKyAgICBUd29fZiA9ICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzOyAvKiAzLT5JTlRSQSwgNi0+SU5URVIgKi8KKyAgICBNRiA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOworCisgICAgLyogU2NhbGluZyAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChhcm1BYnMoKG0yW2pdW2ldLyogKyAxKi8pIC8gMikgKiBNRiArIFR3b19mKSA+PiBRYml0c1BsdXNPbmU7CisgICAgICAgICAgICBwU3JjRHN0W2ogKiA0ICsgaV0gPSAoT01YX1MxNikoKG0yW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTViNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaApAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBEQ1QvSURDVCBtb2R1bGUKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWERDVFRBQl9IXworI2RlZmluZSBfT01YRENUVEFCX0hfCisKK2V4dGVybiBjb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdOworCisjZW5kaWYgLyogX09NWERDVFRBQl9IXyAqLworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCisgKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCisgKgorICovCisgCisjaWZuZGVmIF9PTVhIVUZGVEFCX0hfCisjZGVmaW5lIF9PTVhIVUZGVEFCX0hfCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSdW5JZHhbMTFdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMFs2OF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzddOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMVszNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTE1BWFsxNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxTE1BWFsyMV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUk1BWFsyN107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUk1BWFs4XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSdW5JZHhbMTJdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMFs1OV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUnVuSWR4WzNdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUk1BWFsxMl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUk1BWFszXTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMTRdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl07CisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWVkODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9IXworI2RlZmluZSBfT01YWklHWkFHVEFCX0hfCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFs2NF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTM5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKyAgICAgT01YX1U4IGZsYWcsCisgICAgIE9NWF9JTlQgKnBTdW1FcnIKKykKK3sKKyAgICBPTVhfSU5UIGRjU2NhbGVyLCBpOworICAgIE9NWF9TMTYgdGVtcFByZWQ7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIAorICAgIC8qIFNldCBEQyBzY2FsZXIgdmFsdWUgdG8gYXZvaWQgc29tZSBjb21waWxlcnMgZ2l2aW5nIGEgd2FybmluZy4gKi8KKyAgICBkY1NjYWxlcj0wOworICAgIAorICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCisgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQorICAgIHsKKyAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gOCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogY3VyUVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gOSAmJiBjdXJRUCA8PSAyNCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCArIDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogY3VyUVApIC0gMTY7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICB7CisgICAgICAgIGlmIChjdXJRUCA+PSAxICYmIGN1clFQIDw9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA1ICYmIGN1clFQIDw9IDI0KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IChjdXJRUCArIDEzKS8yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCAtIDY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFByZUFDUHJlZGljdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcFByZUFDUHJlZGljdFswXSA9IHByZWREaXI7CisgICAgfQorCisgICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQorICAgIHsKKyAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCisgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmUm93WzBdLCBkY1NjYWxlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEZbMF1bMF0vL2RjX3NjYWxlciAqLworICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyhwUHJlZEJ1ZkNvbFswXSwgZGNTY2FsZXIpOworICAgIH0KKworICAgIC8qIFVwZGF0aW5nIHRoZSBEQyB2YWx1ZSB0byB0aGUgcm93IGFuZCBjb2wgYnVmZmVyICovCisgICAgKihwUHJlZEJ1ZlJvdyAtIDgpID0gKnBQcmVkQnVmQ29sOworCisgICAgaWYgKGZsYWcpCisgICAgeworICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLworICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7CisKKyAgICAgICAgLyogUFFGID0gUUYgLSBGWzBdWzBdLy9kY19zY2FsZXIgKi8KKyAgICAgICAgcFNyY0RzdFswXSAtPSB0ZW1wUHJlZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUUYgPSBQUUYgKyBGWzBdWzBdLy9kY19zY2FsZXIgKi8KKyAgICAgICAgcFNyY0RzdFswXSArPSB0ZW1wUHJlZDsKKyAgICAgICAgCisgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgIHBTcmNEc3RbMF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFswXSk7CisKKyAgICAgICAgLyogQ2FsIGFuZCBzdG9yZSBGWzBdWzBdIGludG8gdGhlIGNvbCBidWZmZXIgKi8KKyAgICAgICAgKnBQcmVkQnVmQ29sID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOworICAgIH0KKworCisgICAgaWYgKEFDUHJlZEZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIGlmIChwcmVkRGlyID09IE9NWF9WQ19WRVJUSUNBTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFByZWRCdWZSb3dbaV0gKiBwcmVkUVAsIGN1clFQKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgICAgIC8qUFFGWFt2XVswXSA9IFFGWFt2XVswXSAtIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOworICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgIEFDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaV0gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKlFGWFt2XVswXSA9IFBRRlhbdl1bMF0gKyAoUUZBW3ZdWzBdICogUVBBKSAvLyBRUFggKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byB0aGUgcm93IGJ1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZSb3dbaV0gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDg7IGkgPCA2NDsgaSArPSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZkNvbFtpPj4zXSAqIHByZWRRUCwgY3VyUVApOworICAgICAgICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgICAgICAvKlBRRlhbMF1bdV0gPSBRRlhbMF1bdV0gLSAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSAtPSB0ZW1wUHJlZDsKKyAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIGFic29sdXRlIHZhbHVlcyBvZiBBQyBwcmVkaWN0aW9uIGVycm9yLCB0aGlzIGNhbgorICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZSBBQworICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICpwU3VtRXJyICs9IGFybUFicyhwU3JjRHN0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgLyogcFByZUFDUHJlZGljdFsxfjddIHN0b3JlIHRoZSBlcnJvciBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgQUMgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlQUNQcmVkaWN0W2k+PjNdID0gcFNyY0RzdFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypRRlhbMF1bdV0gPSBQUUZYWzBdW3VdICsgKFFGQVswXVt1XSAqIFFQQSkgLy8gUVBYICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gKz0gdGVtcFByZWQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY5YTMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispCit7CisgICAgT01YX0lOVCAgICAgb3V0ZXIsIGlubmVyLCBjb3VudCwgaW5kZXg7CisgICAgT01YX1MxNiAgICAgaGFsZlBlbFggPSAwLCBoYWxmUGVsWSA9IDAsIHgsIHk7CisgICAgT01YX0lOVCAgICAgY2FuZFNBRCwgcmVmU0FEID0gMDsKKyAgICBPTVhfSU5UICAgICBtaW5TQUQsIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7CisgICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZCdWY7CisgICAgT01YX1U4IHRlbXBQZWw7CisgICAgICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkgKyAocFNyY0RzdE1WLT5keC8yKTsKKworICAgIC8qIENvcHkgdGhlIGNhbmRpZGF0ZSB0byB0aGUgdGVtcG9yYXJ5IGxpbmVhciBhcnJheSAqLworICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsaW5kZXggPSAwOworICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7CisgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVmU0FEICs9IGFybUFicyAocFRlbXBTcmNSZWZCdWZbaW5kZXhdIC0gcFNyY0N1cnJCdWZbY291bnRdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCB0aGUgbWluU2FkIGFzIHJlZmVyZW5jZSBTQUQgKi8KKyAgICBtaW5TQUQgPSByZWZTQUQ7CisgICAgKnBEc3RTQUQgPSByZWZTQUQ7CisKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovCisgICAgZnJvbVggPSAxOworICAgIHRvWCAgID0gMTsKKyAgICBmcm9tWSA9IDE7CisgICAgdG9ZICAgPSAxOworICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54IC0gMSkgPCBwUmVmUmVjdC0+eCkKKyAgICB7CisgICAgICAgIGZyb21YID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eCArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHRvWCAgID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSAtIDEpIDwgcFJlZlJlY3QtPnkpCisgICAgeworICAgICAgICBmcm9tWSA9IDA7CisgICAgfQorCisgICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnkgKyBCbG9ja1NpemUgKyAxKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQorICAgIHsKKyAgICAgICAgdG9ZICAgPSAwOworICAgIH0KKworICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIHBvc2l0aW9uICovCisgICAgICAgICAgICBpZiAoIHggPT0gMCAmJiB5ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLworICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogKHBTcmNEc3RNVi0+ZHkvMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHBTcmNEc3RNVi0+ZHgvMik7CisKKyAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHRoZSBwaXhlbCBhbmQgY2FsY3VsYXRlIHRoZSBTQUQqLworICAgICAgICAgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCwgY2FuZFNBRCA9IDAsaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgb3V0ZXIrKywgaW5kZXggKz0gcmVmV2lkdGggLSBCbG9ja1NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLGluZGV4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wUGVsID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZltpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHhdICogYXJtQWJzKHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyByZWZXaWR0aCAqIHldICogYXJtQWJzKHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyByZWZXaWR0aCAqIHkgKyB4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJtQWJzKHgqeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcm1BYnMgKHgpICsgYXJtQWJzICh5KSAtIHJuZFZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvICgyICogKGFybUFicyAoeCkgKyBhcm1BYnMgKHkpKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQgKz0gYXJtQWJzICh0ZW1wUGVsIC0gcFNyY0N1cnJCdWZbY291bnRdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIGlmIChhcm1WQ000UDJfQ29tcGFyZU1WICh4LCB5LCBjYW5kU0FELCBoYWxmUGVsWCwgaGFsZlBlbFksIG1pblNBRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBEc3RTQUQgPSBjYW5kU0FEOworICAgICAgICAgICAgICAgIG1pblNBRCAgID0gY2FuZFNBRDsKKyAgICAgICAgICAgICAgICBoYWxmUGVsWCA9IHg7CisgICAgICAgICAgICAgICAgaGFsZlBlbFkgPSB5OworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHBTcmNEc3RNVi0+ZHggKz0gaGFsZlBlbFg7CisgICAgcFNyY0RzdE1WLT5keSArPSBoYWxmUGVsWTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZmUzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKKyAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKKyAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKKyAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCisgKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00CisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCisgKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgorICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCisgKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KKyAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispCit7CisKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKworICAgIE9NWF9JTlQgICAgIG91dGVyLCBpbm5lciwgY291bnQsaW5kZXg7CisgICAgT01YX0lOVCAgICAgY2FuZFNBRDsKKyAgICAvKigyNTYqMjU2ICsxKSB0aGlzIGlzIHRvIG1ha2UgdGhlIFNBRCBtYXggaW5pdGlhbGx5Ki8KKyAgICBPTVhfSU5UICAgICBtaW5TQUQgPSAweDEwMDAxLCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmQnVmOworICAgIE9NWF9TMTYgICAgIHgsIHk7CisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsKKyAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1FU3BlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgCisgICAgc2VhcmNoUmFuZ2UgPSAoKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYyktPnNlYXJjaFJhbmdlOworICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KKyAgICBmcm9tWCA9IHNlYXJjaFJhbmdlOworICAgIHRvWCAgID0gc2VhcmNoUmFuZ2U7CisgICAgZnJvbVkgPSBzZWFyY2hSYW5nZTsKKyAgICB0b1kgICA9IHNlYXJjaFJhbmdlOworCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gc2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPngpCisgICAgeworICAgICAgICBmcm9tWCA9ICBwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPng7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54ICsgQmxvY2tTaXplICsgc2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHRvWCAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eCkgLSBCbG9ja1NpemU7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gc2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPnkpCisgICAgeworICAgICAgICBmcm9tWSA9IHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eTsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgKyBCbG9ja1NpemUgKyBzZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKKyAgICB7CisgICAgICAgIHRvWSAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eSkgLSBCbG9ja1NpemU7CisgICAgfQorCisgICAgcERzdE1WLT5keCA9IC1mcm9tWDsKKyAgICBwRHN0TVYtPmR5ID0gLWZyb21ZOworICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIHkpICsgeDsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KKyAgICAgICAgICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMCwgY2FuZFNBRCA9IDA7CisgICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOworICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssIGluZGV4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYW5kU0FEICs9IGFybUFicyAocFRlbXBTcmNSZWZCdWZbaW5kZXhdIC0gcFNyY0N1cnJCdWZbY291bnRdKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIHBEc3RNVi0+ZHgvMiwgcERzdE1WLT5keS8yLCBtaW5TQUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwRHN0U0FEID0gY2FuZFNBRDsKKyAgICAgICAgICAgICAgICBtaW5TQUQgICA9IGNhbmRTQUQ7CisgICAgICAgICAgICAgICAgcERzdE1WLT5keCA9IHgqMjsKKyAgICAgICAgICAgICAgICBwRHN0TVYtPmR5ID0geSoyOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTg2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZXNjYXBlIG1vZGUgY2hlY2sgCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKgorICogICAgICAgICAgICAgICAgICAgICAgCisgKiBSZXR1cm4gVmFsdWU6CisgKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMworICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCisgKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKKyAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KKyAqCisgKi8KKworT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCisgICAgIE9NWF9VMzIgcnVuLAorICAgICBPTVhfVTMyIHJ1blBsdXMsCisgICAgIE9NWF9TMTYgbGV2ZWwsCisgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAorICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAorICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQorKQoreworICAgIE9NWF9VOCBlc2NhcGUgPSAwLCBmTW9kZSA9IDAsIGVudHJpZXM7CisgICAgCisgICAgbGV2ZWwgPSBhcm1BYnMgKGxldmVsKTsKKyAgICBsZXZlbFBsdXMgPSBhcm1BYnMgKGxldmVsUGx1cyk7CisgICAgCisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAorICAgICAgIE1vZGUgMCBjaGVjayAqLworICAgIGlmIChydW4gPD0gbWF4U3RvcmVSdW4pCisgICAgeworICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KKyAgICAgICAgICAgICAgICAgIC0gcFJ1bkluZGV4VGFibGVbcnVuXTsKKyAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgZW50cmllcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgZXNjYXBlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlc2NhcGUgPSAxOworICAgIH0KKyAgICBpZihlc2NhcGUgJiYgc2hvcnRWaWRlb0hlYWRlcikKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDA7CisgICAgICAgIGZNb2RlID0gNDsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsUGx1cyBhbmQgTGFzdCBjb21iaW5hdGlvbiAKKyAgICAgICBNb2RlIDEgY2hlY2sgKi8gICAgCisgICAgaWYgKGVzY2FwZSkKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDA7CisgICAgICAgIGZNb2RlID0gMTsKKyAgICAgICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKKyAgICAgICAgeworICAgICAgICAgICAgZW50cmllcyA9IHBSdW5JbmRleFRhYmxlW3J1biArIDFdCisgICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOworICAgICAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbnRyaWVzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbFBsdXMgPiBlbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IHdpdGggcnVuUGx1cywgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCisgICAgICAgTW9kZSAyIGNoZWNrICovICAgIAorICAgIGlmIChlc2NhcGUpCisgICAgeworICAgICAgICBlc2NhcGUgPSAwOworICAgICAgICBmTW9kZSA9IDI7CisgICAgICAgIGlmIChydW5QbHVzIDw9IG1heFN0b3JlUnVuKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuUGx1cyArIDFdCisgICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzXTsKKyAgICAgICAgICAgIGlmIChydW5QbHVzID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXNjYXBlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBzZWxlY3QgbW9kZSAzIC0tPiBGTEMgKi8KKyAgICBpZiAoZXNjYXBlKQorICAgIHsKKyAgICAgICAgZk1vZGUgPSAzOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZk1vZGU7Cit9CisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODg0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYwpAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NvbXBhcmVNVi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIGNvbXBhcmluZyBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIAorICogdGhlIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqLworICAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlIAorICogYmVzdCBNViBhbmQgU0FECisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgbXZYCQl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dCSAgICBtdlkJCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0JICAgIGNhbmRTQUQJQ2FuZGlkYXRlIFNBRAorICogW2luXQkgICAgYmVzdE1WWAl4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXQkgICAgYmVzdE1WWQl5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXQkgICAgYmVzdFNBRAliZXN0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdCAKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLCAKKyAgICBPTVhfUzE2IG12WSwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhfUzE2IGJlc3RNVlgsIAorICAgIE9NWF9TMTYgYmVzdE1WWSwgCisgICAgT01YX0lOVCBiZXN0U0FECispIAoreworICAgIGlmIChjYW5kU0FEIDwgYmVzdFNBRCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoY2FuZFNBRCA+IGJlc3RTQUQpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCisgICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8IChiZXN0TVZYKmJlc3RNVlgrYmVzdE1WWSpiZXN0TVZZKSApCisgICAgeworICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmNzEzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCkBAIC0wLDAgKzEsMTEyIEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EQ1RfVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBEQ1QvSURDVCBjb2VmZmljZW50IG1hdHJpeAorICoKKyAqLworCisjaWZuZGVmIF9PTVhEQ1RDT1NUQUJfQ18KKyNkZWZpbmUgX09NWERDVENPU1RBQl9DXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworY29uc3QgT01YX0Y2NCBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1s4XVs4XSA9Cit7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKKyAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjYyMCwgCisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3OTAsIAorICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAxMTQwLCAKKyAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDkyMCwgCisgICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxNTIgCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKKyAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwOTYsIAorICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKKyAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDM0MjAsIAorICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMTA5MAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAxMTQwLCAKKyAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDQ4NjAsIAorICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczODQwLCAKKyAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDEzOCwgCisgICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMyNjAsIAorICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNzMwIAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTUyLCAKKyAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAorICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMTA5MCwgCisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM2ODAsIAorICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNzMwLCAKKyAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAorICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTMzMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDA5NiwgCisgICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzNDIwLCAKKyAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMDkyMCwgCisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM4NDAsIAorICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjYyMCwgCisgICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ1MjgwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDA5ODAsIAorICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NTE3MCwgCisgICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzM0MCwgCisgICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDEzLCAKKyAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNTEwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjcwLCAKKyAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NTAwMCwgCisgICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQzODgsIAorICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzYyMCwgCisgICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUzMzAsIAorICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzIwMCwgCisgICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDA3NjAgCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKKyAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzI2MCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzI5MCwgCisgICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAwNzYwLCAKKyAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDc4MCwgCisgICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0Mjc3CisgICAgICAgIH0KK307CisKKyNlbmRpZiAvKl9PTVhEQ1RDT1NUQUJfQ18qLworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU3MmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlcgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4ICBzdGFydAorKQoreworICAgIE9NWF9VOCAgbGFzdCA9IDA7CisgICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIHN3aXRjaCAocHJlZERpcikKKyAgICB7CisgICAgICAgIGNhc2UgT01YX1ZDX05PTkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKKyAgICAgICAgeworICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX1ZDX1ZFUlRJQ0FMOgorICAgICAgICB7CisgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKwkJCSAgcERzdCwKKwkJCSAgc2hvcnRWaWRlb0hlYWRlciwKKwkJCSAgc3RhcnQsCisJCQkgICZsYXN0LAorCQkJICAxMCwKKwkJCSAgNjIsCisJCQkgICA3LAorCQkJICAyMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50cmFMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgaWYgKGxhc3QgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YjU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludHJhIGJsb2NrLgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgorICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4IHN0YXJ0CispCit7CisgICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFEY3RCbGtDb2VmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3RhcnQgPiAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZERpciA+IDIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwcmVkRGlyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9NWF9WQ19OT05FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBPTVhfVkNfVkVSVElDQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgMTQsCisgICAgICAgICAgICAgIDIwLAorICAgICAgICAgICAgICA5LAorICAgICAgICAgICAgICA2LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDAsCisJCQkgIGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMUxNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUk1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFSTUFYLAorICAgICAgICAgICAgICBwWmlnemFnVGFibGUKKyAgICAgICAgKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgICAgIAorICAgIH0gLyogUGF0dGVybiBjaGVjayBlbmRzKi8KKworICAgIHJldHVybiAoT01YX1N0c19Ob0Vycik7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M5NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBwdXR0aW5nIFZMQyBiaXRzCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispCit7CisgICAgT01YX0lOVCB0ZW1wSW5kZXg7CisJT01YX1UzMiB0ZW1wUnVuID0gcnVuLCBzaWduID0gMDsKKyAgICBPTVhfUzE2IHRlbXBMZXZlbCA9IGxldmVsOyAKKyAgICAKKyAgICAvKiBFc2NhcGUgc2VxdWVuY2UgYWRkaXRpb24gKi8KKyAgICBpZiAoZk1vZGUgPT0gMSkKKyAgICB7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDAsIDEpOworCQl0ZW1wTGV2ZWwgPSBsZXZlbFBsdXM7CisKKyAgICB9CisgICAgZWxzZSBpZihmTW9kZSA9PSAyKQorICAgIHsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMiwgMik7CisJCXRlbXBSdW4gPSBydW5QbHVzOworICAgIH0KKyAgICBlbHNlIGlmIChmTW9kZSA9PSAzKQorICAgIHsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgMik7CisgICAgfQorICAgIGVsc2UgaWYgKGZNb2RlID09IDQpCisgICAgeworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilsYXN0LCAxKTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHRlbXBSdW4sIDYpOworCQlpZigodGVtcExldmVsICE9IDApICYmICh0ZW1wTGV2ZWwgIT0gLTEyOCkpCisJCXsKKwkJICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJICAgKE9NWF9VMzIpIHRlbXBMZXZlbCwgOCk7CisJCX0KKwkJcmV0dXJuIE9NWF9TdHNfTm9FcnI7CQkKKyAgICB9CisgICAgCisgICAgaWYgKHRlbXBMZXZlbCA8IDApCisgICAgeworICAgICAgICBzaWduID0gMTsKKyAgICAgICAgdGVtcExldmVsID0gYXJtQWJzKHRlbXBMZXZlbCk7CisgICAgfQorICAgIC8qIFB1dHRpbmcgVkxDIGJpdHMgaW4gdGhlIHN0cmVhbSAqLworCWlmIChmTW9kZSA8IDMpCisJeworCQlpZiAodGVtcFJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKKwkJeworCQkJdGVtcEluZGV4ID0gcFJ1bkluZGV4VGFibGUgW21heFJ1bkZvck11bHRpcGxlRW50cmllcyArIDFdICsgCisJCQkJCQkodGVtcFJ1biAtIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAtIDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGVtcEluZGV4ID0gcFJ1bkluZGV4VGFibGUgW3RlbXBSdW5dICsgKHRlbXBMZXZlbCAtMSk7CisJCX0KKyAgICAKKwkJYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCQkJICBwVmxjVGFibGUgW3RlbXBJbmRleF0pOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpc2lnbiwgMSk7CisJfQorICAgIGVsc2UKKwl7CisJCWlmIChzaWduKQorCQl7CisJCQl0ZW1wTGV2ZWwgPSAtdGVtcExldmVsOworCQl9CisJCXRlbXBSdW4gID0gcnVuOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpbGFzdCwgMSk7CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCB0ZW1wUnVuLCA2KTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCSAgIChPTVhfVTMyKSB0ZW1wTGV2ZWwsIDEyKTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOworCX0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEyYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBnZXQgYml0cyBmcm9tIHRoZSBzdHJlYW0gCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKKyAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCisgKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKKyAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAorICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4CisgKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcworICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKyAgICBPTVhfVTMyIHN0b3JlUnVuLAorICAgIE9NWF9TMTYgKiBwRHN0LAorICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKKyAgICBPTVhfVTggIHNpZ24sCisgICAgT01YX1U4ICBsYXN0LAorICAgIE9NWF9VOCAgKiBwSW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispCit7CisgICAgLyogU3RvcmUgdGhlIHplcm8ncyBhcyBwZXIgdGhlIHJ1biBsZW5ndGggY291bnQgKi8KKyAgICBmb3IgKDtzdG9yZVJ1biA+IDA7IHN0b3JlUnVuLS0sICgqcEluZGV4KSsrKQorICAgIHsKKyAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKKyAgICB9CisgICAgLyogU3RvcmUgdGhlIGxldmVsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiovCisgICAgaWYgKHNpZ24gPT0gMSkKKyAgICB7CisgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IC1zdG9yZUxldmVsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSBzdG9yZUxldmVsOworICAgIH0KKyAgICAoKnBJbmRleCkrKzsKKworICAgIC8qIElmIGxhc3QgaXMgMSwgZmlsbCB0aGUgcmVtYWluaW5nIGVsbWVudHMgb2YgdGhlIGJ1ZmZlciB3aXRoIHplcm9zICovCisgICAgaWYgKGxhc3QgPT0gMSkKKyAgICB7CisgICAgICAgIHdoaWxlICgqcEluZGV4IDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IDA7CisgICAgICAgICAgICAoKnBJbmRleCkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzZjU5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9HZXRWTENCaXRzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGdldCBiaXRzIGZyb20gdGhlIHN0cmVhbSAKKyAqCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworIAorLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKQoreworICAgIE9NWF9VMzIgc3RvcmVSdW47CisgICAgT01YX1U4ICB0YWJJbmRleCwgbWFya2VyQml0OworICAgIE9NWF9TMTYgc3RvcmVMZXZlbDsKKyAgICBPTVhfVTE2IHVucGFja1JldEluZGV4OworCU9NWF9VOCAgaSwgZlR5cGUsIGVzY2FwZTsJCisJT01YX1U4ICBzaWduID0gMDsKKwkKKwkvKiBVbnBhY2tpbmcgdGhlIGJpdHN0cmVhbSBhbmQgUkxEICovCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCA2NDspCisgICAgeworCQllc2NhcGUgPSBhcm1Mb29rQWhlYWRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKKwkJaWYgKGVzY2FwZSAhPSAzKQorCQl7CQorCQkJZlR5cGUgPSAwOyAvKiBOb3QgaW4gZXNjYXBlIG1vZGUgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCWFybVNraXBCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNyk7CisJCQlpZihzaG9ydFZpZGVvSGVhZGVyKQorCQkJeworCQkJICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJCSAgc3RvcmVSdW4gPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA2KTsKKwkJCSAgc3RvcmVMZXZlbCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDgpOworCQkJICAKKwkJCSAgLyogUmVmIHRvIFRhYmxlIEItMTggKGMpIGluIE1QRUc0IFN0YW5kYXJkLSBGTEMgY29kZSBmb3IgICovCisJCQkgIC8qIExFVkVMIHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIDEsIHRoZSBzdG9yZUxldmVsIGlzICAqLworCQkJICAvKiBhIHNpZ25lZCB2YWx1ZSBhbmQgdGhlIHNpZ24gYW5kIHRoZSB1bnNpZ25lZCB2YWx1ZSBmb3IgKi8KKwkJCSAgLyogc3RvcmVMZXZlbCBuZWVkIHRvIGJlIGV4dHJhY3RlZCBhbmQgcGFzc2VkIHRvIGFybSAgICAgICovCisJCQkgIC8qIEZpbGxWTERCdWZmZXIgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJICAgICAKKwkJCSAgc2lnbiA9IChzdG9yZUxldmVsICYgMHg4MCk7CisJCQkgIGlmKHNpZ249PTB4ODApCisJCQkgIHsKKwkJCSAgCXN0b3JlTGV2ZWw9KHN0b3JlTGV2ZWxeMHhmZikrMTsJCQkgIAorCQkJICAJc2lnbj0xOworCQkJICAJCisJCQkgIH0KKwkJCSAgCisJCQkgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHNpZ24qc3RvcmVMZXZlbCA9PSAxMjggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCisJCQkgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOworCQkJICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKwkJCSAgICBzdG9yZVJ1biwKKwkJCSAgICBwRHN0LAorCQkJICAgIHN0b3JlTGV2ZWwsCisJCQkgICAgc2lnbiwKKwkJCSAgICAqcExhc3QsCisJCQkgICAgJmksCisJCQkgICAgcFppZ3phZ1RhYmxlKTsKKwkJCSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKwkJCSAgICAKKwkJCX0KKwkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKKwkJCXsKKwkJCQlpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkpCisJCQkJeworCQkJCQlmVHlwZSA9IDM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWZUeXBlID0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZlR5cGUgPSAxOworCQkJfQorCQl9CisKKwkgICAgaWYgKGZUeXBlIDwgMykKKwkgICAgeworCSAgICAgICAgdW5wYWNrUmV0SW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCQkJCQkJCQlwVmxjVGFibGVMMCk7CisJCQlpZiAodW5wYWNrUmV0SW5kZXggIT0gQVJNX05PX0NPREVCT09LX0lOREVYKQorCQkgICAgeworCQkJICAgIC8qIERlY29kZSBydW4gYW5kIGxldmVsIGZyb20gdGhlIGluZGV4ICovCisJCQkgICAgLyogbGFzdCA9IDAgKi8KKwkJCSAgICAqcExhc3QgPSAwOworCQkJICAgIGlmICh1bnBhY2tSZXRJbmRleCA+IG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApCisJCQkgICAgeworCQkJCSAgICBzdG9yZUxldmVsID0gMTsKKwkJCQkgICAgc3RvcmVSdW4gPSAodW5wYWNrUmV0SW5kZXggLSBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwKSAKKwkJCQkJCQkrIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDA7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJICAgIHRhYkluZGV4ID0gMTsKKwkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQorCQkJCSAgICB7CisJCQkJCSAgICB0YWJJbmRleCsrOworCQkJCSAgICB9CisJCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOworCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwwW3RhYkluZGV4IC0gMV0gKyAxOworCQkJICAgIH0KKwkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisJCQkKKwkJCSAgICBpZiAoZlR5cGUgPT0gMSkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7CisJCQkgICAgfQorCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCisJCQkgICAgeworCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwwW3N0b3JlTGV2ZWwtMV0gKyAxOworCQkJICAgIH0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCSAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKwkJCQkJCQkJCQkJcFZsY1RhYmxlTDEpOworCisJCQkgICAgYXJtUmV0RGF0YUVycklmKHVucGFja1JldEluZGV4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisJCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KKwkJCSAgICAvKiBsYXN0ID0gMSAqLworCQkJICAgICpwTGFzdCA9IDE7CisJCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAxOworCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEpIAorCQkJCQkJCSsgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDE7CisJCSAgICAgICAgfQorCQkgICAgICAgIGVsc2UKKwkJCSAgICB7CisJCQkJICAgIHRhYkluZGV4ID0gMTsKKwkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQorCQkJCSAgICB7CisJCQkJCSAgICB0YWJJbmRleCsrOworCQkJCSAgICB9CisJCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOworCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwxW3RhYkluZGV4IC0gMV0gKyAxOworCQkJICAgIH0KKwkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisKKwkJCSAgICBpZiAoZlR5cGUgPT0gMSkKKwkJCSAgICB7CisJCQkgICAgICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwxW3N0b3JlUnVuXSk7CQkJCQorCQkJICAgIH0KKwkJCSAgICBlbHNlIGlmIChmVHlwZSA9PSAyKQorCQkJICAgIHsKKwkJCQkgICAgc3RvcmVSdW4gPSBzdG9yZVJ1biArIHBSTUFYVGFibGVMMVtzdG9yZUxldmVsLTFdICsgMTsKKwkJCSAgICB9CisJCSAgICB9CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKKwkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorCQkJICAgIHN0b3JlUnVuLAorCQkJICAgIHBEc3QsCisJCQkgICAgc3RvcmVMZXZlbCwKKwkJCSAgICBzaWduLAorCQkJICAgICpwTGFzdCwKKwkJCSAgICAmaSwKKwkJCSAgICBwWmlnemFnVGFibGUpOwkJCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCSAgICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIHN0b3JlUnVuICA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOworCQkgICAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7CisJCSAgICBtYXJrZXJCaXQgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIGFybVJldERhdGFFcnJJZiggbWFya2VyQml0ID09IDAsIE9NWF9TdHNfRXJyKTsKKwkJICAgIHN0b3JlTGV2ZWwgID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMTIpOworCQkgICAgaWYgKHN0b3JlTGV2ZWwgJiAweDgwMCkKKwkJICAgIHsKKwkJCSAgICBzdG9yZUxldmVsIC09IDQwOTY7CisJCSAgICB9CQkJCisJCSAgICBhcm1SZXREYXRhRXJySWYoIHN0b3JlTGV2ZWwgPT0gMCB8fCBzdG9yZUxldmVsID09IC0yMDQ4ICwgT01YX1N0c19FcnIpOyAvKiBJbnZhbGlkIEZMQyAqLworCQkgICAgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisJCSAgICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKwkJCSAgICBzdG9yZVJ1biwKKwkJCSAgICBwRHN0LAorCQkJICAgIHN0b3JlTGV2ZWwsCisJCQkgICAgMCwgLyogU2lnbiBpcyBub3QgdXNlZCwgcHJlcHJvY2Vzc2luZyBkb25lICovCisJCQkgICAgKnBMYXN0LAorCQkJICAgICZpLAorCQkJICAgIHBaaWd6YWdUYWJsZSk7CisKKwkgICAgfQorICAgIH0gLyogRW5kIG9mIGZvcmxvb3AgZm9yIGkgKi8KKwlyZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIEZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdlOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKQEAgLTAsMCArMSw0OTUgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyogCisqICBGb3IgSW50cmEKKyogIGxhc3QgPSAwIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV0gPSAKK3sgCisgICAgMCwgMjcsIDM3LCA0MiwgNDYsIDQ5LCA1MiwgCisgICAgNTUsIDU4LCA2MCwgNjIKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAxNAorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XSA9IAoreworICAgICAgICB7MiwgICAgMn0sCisgICAgICAgIHszLCAgICA2fSwKKyAgICAgICAgezQsICAgIDE1fSwKKyAgICAgICAgezUsICAgIDEzfSwKKyAgICAgICAgezUsICAgIDEyfSwKKyAgICAgICAgezYsICAgIDIxfSwKKyAgICAgICAgezYsICAgIDE5fSwKKyAgICAgICAgezYsICAgIDE4fSwKKyAgICAgICAgezcsICAgIDIzfSwKKyAgICAgICAgezgsICAgIDMxfSwKKyAgICAgICAgezgsICAgIDMwfSwKKyAgICAgICAgezgsICAgIDI5fSwKKyAgICAgICAgezksICAgIDM3fSwKKyAgICAgICAgezksICAgIDM2fSwKKyAgICAgICAgezksICAgIDM1fSwKKyAgICAgICAgezksICAgIDMzfSwKKyAgICAgICAgezEwLCAgIDMzfSwKKyAgICAgICAgezEwLCAgIDMyfSwKKyAgICAgICAgezEwLCAgIDE1fSwKKyAgICAgICAgezEwLCAgIDE0fSwKKyAgICAgICAgezExLCAgICA3fSwKKyAgICAgICAgezExLCAgICA2fSwKKyAgICAgICAgezExLCAgIDMyfSwKKyAgICAgICAgezExLCAgIDMzfSwKKyAgICAgICAgezEyLCAgIDgwfSwKKyAgICAgICAgezEyLCAgIDgxfSwKKyAgICAgICAgezEyLCAgIDgyfSwKKyAgICAgICAgezQsICAgIDE0fSwKKyAgICAgICAgezYsICAgIDIwfSwKKyAgICAgICAgezcsICAgIDIyfSwKKyAgICAgICAgezgsICAgIDI4fSwKKyAgICAgICAgezksICAgIDMyfSwKKyAgICAgICAgezksICAgIDMxfSwKKyAgICAgICAgezEwLCAgIDEzfSwKKyAgICAgICAgezExLCAgIDM0fSwKKyAgICAgICAgezEyLCAgIDgzfSwKKyAgICAgICAgezEyLCAgIDg1fSwKKyAgICAgICAgezUsICAgIDExfSwKKyAgICAgICAgezcsICAgIDIxfSwKKyAgICAgICAgezksICAgIDMwfSwKKyAgICAgICAgezEwLCAgIDEyfSwKKyAgICAgICAgezEyLCAgIDg2fSwKKyAgICAgICAgezYsICAgIDE3fSwKKyAgICAgICAgezgsICAgIDI3fSwKKyAgICAgICAgezksICAgIDI5fSwKKyAgICAgICAgezEwLCAgIDExfSwKKyAgICAgICAgezYsICAgIDE2fSwKKyAgICAgICAgezksICAgIDM0fSwKKyAgICAgICAgezEwLCAgIDEwfSwKKyAgICAgICAgezYsICAgIDEzfSwKKyAgICAgICAgezksICAgIDI4fSwKKyAgICAgICAgezEwLCAgICA4fSwKKyAgICAgICAgezcsICAgIDE4fSwKKyAgICAgICAgezksICAgIDI3fSwKKyAgICAgICAgezEyLCAgIDg0fSwKKyAgICAgICAgezcsICAgIDIwfSwKKyAgICAgICAgezksICAgIDI2fSwKKyAgICAgICAgezEyLCAgIDg3fSwKKyAgICAgICAgezgsICAgIDI1fSwKKyAgICAgICAgezEwLCAgICA5fSwKKyAgICAgICAgezgsICAgIDI0fSwKKyAgICAgICAgezExLCAgIDM1fSwKKyAgICAgICAgezgsICAgIDIzfSwKKyAgICAgICAgezksICAgIDI1fSwKKyAgICAgICAgezksICAgIDI0fSwKKyAgICAgICAgezEwLCAgICA3fSwKKyAgICAgICAgezEyLCAgIDg4fSwKKyAgICAgICAgezAsICAgICAwfQorfTsKKworLyogCisqICBGb3IgSW50cmEKKyogIGxhc3QgPSAxIAorKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzhdID0gCit7CisgICAgMCwgIDgsIDExLCAxMywgMTUsIDE3LCAxOSwgMjEKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAyMAorKiAgKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XSA9IAoreworICAgICAgICB7NCwgICAgIDd9LAorICAgICAgICB7NiwgICAgMTJ9LAorICAgICAgICB7OCwgICAgMjJ9LAorICAgICAgICB7OSwgICAgMjN9LAorICAgICAgICB7MTAsICAgIDZ9LAorICAgICAgICB7MTEsICAgIDV9LAorICAgICAgICB7MTEsICAgIDR9LAorICAgICAgICB7MTIsICAgODl9LAorICAgICAgICB7NiwgICAgMTV9LAorICAgICAgICB7OSwgICAgMjJ9LAorICAgICAgICB7MTAsICAgIDV9LAorICAgICAgICB7NiwgICAgMTR9LAorICAgICAgICB7MTAsICAgIDR9LAorICAgICAgICB7NywgICAgMTd9LAorICAgICAgICB7MTEsICAgMzZ9LAorICAgICAgICB7NywgICAgMTZ9LAorICAgICAgICB7MTEsICAgMzd9LAorICAgICAgICB7NywgICAgMTl9LAorICAgICAgICB7MTIsICAgOTB9LAorICAgICAgICB7OCwgICAgMjF9LAorICAgICAgICB7MTIsICAgOTF9LAorICAgICAgICB7OCwgICAgMjB9LAorICAgICAgICB7OCwgICAgMTl9LAorICAgICAgICB7OCwgICAgMjZ9LAorICAgICAgICB7OSwgICAgMjF9LAorICAgICAgICB7OSwgICAgMjB9LAorICAgICAgICB7OSwgICAgMTl9LAorICAgICAgICB7OSwgICAgMTh9LAorICAgICAgICB7OSwgICAgMTd9LAorICAgICAgICB7MTEsICAgMzh9LAorICAgICAgICB7MTEsICAgMzl9LAorICAgICAgICB7MTIsICAgOTJ9LAorICAgICAgICB7MTIsICAgOTN9LAorICAgICAgICB7MTIsICAgOTR9LAorICAgICAgICB7MTIsICAgOTV9LCAgCisgICAgICAgIHswLCAgICAgMH0KK307CisKKy8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMExNQVhbMTVdID0gCit7CisgICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAorICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxCit9OworCisvKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKSovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXSA9IAoreworICAgIDgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJNQVhbMjddID0KK3sKKyAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJNQVhbOF0gPQoreworICAgMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCit9OworCisvKiAKKyogIEZvciBJbnRlcgorKiAgbGFzdCA9IDAgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUnVuSWR4WzEyXSA9IAoreyAKKyAgICAgMCwgIDEyLCAgMTgsICAyMiwgIDI1LCAgMjgsICAKKyAgICAzMSwgIDM0LCAgMzYsICAzOCwgIDQwLCAgNDIKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAyNgorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XSA9IAoreworICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7NCwgICAgMTV9LAorICAgICAgICB7NiwgICAgMjF9LAorICAgICAgICB7NywgICAgMjN9LAorICAgICAgICB7OCwgICAgMzF9LAorICAgICAgICB7OSwgICAgMzd9LAorICAgICAgICB7OSwgICAgMzZ9LAorICAgICAgICB7MTAsICAgMzN9LAorICAgICAgICB7MTAsICAgMzJ9LAorICAgICAgICB7MTEsICAgIDd9LAorICAgICAgICB7MTEsICAgIDZ9LAorICAgICAgICB7MTEsICAgMzJ9LAorICAgICAgICB7MywgICAgIDZ9LAorICAgICAgICB7NiwgICAgMjB9LAorICAgICAgICB7OCwgICAgMzB9LAorICAgICAgICB7MTAsICAgMTV9LAorICAgICAgICB7MTEsICAgMzN9LAorICAgICAgICB7MTIsICAgODB9LAorICAgICAgICB7NCwgICAgMTR9LAorICAgICAgICB7OCwgICAgMjl9LAorICAgICAgICB7MTAsICAgMTR9LAorICAgICAgICB7MTIsICAgODF9LAorICAgICAgICB7NSwgICAgMTN9LAorICAgICAgICB7OSwgICAgMzV9LAorICAgICAgICB7MTAsICAgMTN9LAorICAgICAgICB7NSwgICAgMTJ9LAorICAgICAgICB7OSwgICAgMzR9LAorICAgICAgICB7MTIsICAgODJ9LAorICAgICAgICB7NSwgICAgMTF9LAorICAgICAgICB7MTAsICAgMTJ9LAorICAgICAgICB7MTIsICAgODN9LAorICAgICAgICB7NiwgICAgMTl9LAorICAgICAgICB7MTAsICAgMTF9LAorICAgICAgICB7MTIsICAgODR9LAorICAgICAgICB7NiwgICAgMTh9LAorICAgICAgICB7MTAsICAgMTB9LAorICAgICAgICB7NiwgICAgMTd9LAorICAgICAgICB7MTAsICAgIDl9LAorICAgICAgICB7NiwgICAgMTZ9LAorICAgICAgICB7MTAsICAgIDh9LAorICAgICAgICB7NywgICAgMjJ9LAorICAgICAgICB7MTIsICAgODV9LAorICAgICAgICB7NywgICAgMjF9LAorICAgICAgICB7NywgICAgMjB9LAorICAgICAgICB7OCwgICAgMjh9LAorICAgICAgICB7OCwgICAgMjd9LAorICAgICAgICB7OSwgICAgMzN9LAorICAgICAgICB7OSwgICAgMzJ9LAorICAgICAgICB7OSwgICAgMzF9LAorICAgICAgICB7OSwgICAgMzB9LAorICAgICAgICB7OSwgICAgMjl9LAorICAgICAgICB7OSwgICAgMjh9LAorICAgICAgICB7OSwgICAgMjd9LAorICAgICAgICB7OSwgICAgMjZ9LAorICAgICAgICB7MTEsICAgMzR9LAorICAgICAgICB7MTEsICAgMzV9LAorICAgICAgICB7MTIsICAgODZ9LAorICAgICAgICB7MTIsICAgODd9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworIAorCisvKiAKKyogIEZvciBJbnRyYQorKiAgbGFzdCA9IDEgCisqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM10gPSAKK3sKKyAgICAwLCAzLCA1Cit9OworCisvKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAorKiAgZm9yIHJ1biA9IDAgdG8gNDAKKyogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZworKi8KK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV0gPSAKK3sKKyAgICAgICAgezQsICAgICA3fSwKKyAgICAgICAgezksICAgIDI1fSwKKyAgICAgICAgezExLCAgICA1fSwKKyAgICAgICAgezYsICAgIDE1fSwKKyAgICAgICAgezExLCAgICA0fSwKKyAgICAgICAgezYsICAgIDE0fSwKKyAgICAgICAgezYsICAgIDEzfSwKKyAgICAgICAgezYsICAgIDEyfSwKKyAgICAgICAgezcsICAgIDE5fSwKKyAgICAgICAgezcsICAgIDE4fSwKKyAgICAgICAgezcsICAgIDE3fSwKKyAgICAgICAgezcsICAgIDE2fSwKKyAgICAgICAgezgsICAgIDI2fSwKKyAgICAgICAgezgsICAgIDI1fSwKKyAgICAgICAgezgsICAgIDI0fSwKKyAgICAgICAgezgsICAgIDIzfSwKKyAgICAgICAgezgsICAgIDIyfSwKKyAgICAgICAgezgsICAgIDIxfSwKKyAgICAgICAgezgsICAgIDIwfSwKKyAgICAgICAgezgsICAgIDE5fSwKKyAgICAgICAgezksICAgIDI0fSwKKyAgICAgICAgezksICAgIDIzfSwKKyAgICAgICAgezksICAgIDIyfSwKKyAgICAgICAgezksICAgIDIxfSwKKyAgICAgICAgezksICAgIDIwfSwKKyAgICAgICAgezksICAgIDE5fSwKKyAgICAgICAgezksICAgIDE4fSwKKyAgICAgICAgezksICAgIDE3fSwKKyAgICAgICAgezEwLCAgICA3fSwKKyAgICAgICAgezEwLCAgICA2fSwKKyAgICAgICAgezEwLCAgICA1fSwKKyAgICAgICAgezEwLCAgICA0fSwKKyAgICAgICAgezExLCAgIDM2fSwKKyAgICAgICAgezExLCAgIDM3fSwKKyAgICAgICAgezExLCAgIDM4fSwKKyAgICAgICAgezExLCAgIDM5fSwKKyAgICAgICAgezEyLCAgIDg4fSwKKyAgICAgICAgezEyLCAgIDg5fSwKKyAgICAgICAgezEyLCAgIDkwfSwKKyAgICAgICAgezEyLCAgIDkxfSwKKyAgICAgICAgezEyLCAgIDkyfSwKKyAgICAgICAgezEyLCAgIDkzfSwKKyAgICAgICAgezEyLCAgIDk0fSwKKyAgICAgICAgezEyLCAgIDk1fSwKKyAgICAgICAgeyAwLCAgICAwfQorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN10gPSAKK3sKKyAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCisgICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLAorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV0gPSAKK3sKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJNQVhbMTJdID0gCit7CisgICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJNQVhbM10gPSAKK3sKKyAgIDQwLCAgMSwgIDAKK307CisKKy8qIAorKiAgRm9yIEludHJhIC0gTHVtaW5hbmNlCisqLworCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XSA9IAoreworICAgICAgICB7MywgICAgIDN9LAorICAgICAgICB7MiwgICAgIDN9LAorICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7MywgICAgIDJ9LAorICAgICAgICB7MywgICAgIDF9LAorICAgICAgICB7NCwgICAgIDF9LAorICAgICAgICB7NSwgICAgIDF9LAorICAgICAgICB7NiwgICAgIDF9LAorICAgICAgICB7NywgICAgIDF9LAorICAgICAgICB7OCwgICAgIDF9LAorICAgICAgICB7OSwgICAgIDF9LAorICAgICAgICB7MTAsICAgIDF9LAorICAgICAgICB7MTEsICAgIDF9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyogIEZvciBJbnRyYSAtIENocm9taW5hbmNlCisqLworIAorY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzE0XSA9IAoreworICAgICAgICB7MiwgICAgIDN9LAorICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7MiwgICAgIDF9LAorICAgICAgICB7MywgICAgIDF9LAorICAgICAgICB7NCwgICAgIDF9LAorICAgICAgICB7NSwgICAgIDF9LAorICAgICAgICB7NiwgICAgIDF9LAorICAgICAgICB7NywgICAgIDF9LAorICAgICAgICB7OCwgICAgIDF9LAorICAgICAgICB7OSwgICAgIDF9LAorICAgICAgICB7MTAsICAgIDF9LAorICAgICAgICB7MTEsICAgIDF9LAorICAgICAgICB7MTIsICAgIDF9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyAqICBNb3Rpb24gdmVjdG9yIGRlY29kaW5nIHRhYmxlCisgKi8KKyAKK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl0gPQoreworICAgICAgICB7MTMsICAgICA1fSwKKyAgICAgICAgezEzLCAgICAgN30sCisgICAgICAgIHsxMiwgICAgIDV9LAorICAgICAgICB7MTIsICAgICA3fSwKKyAgICAgICAgezEyLCAgICAgOX0sCisgICAgICAgIHsxMiwgICAgMTF9LAorICAgICAgICB7MTIsICAgIDEzfSwKKyAgICAgICAgezEyLCAgICAxNX0sCisgICAgICAgIHsxMSwgICAgIDl9LAorICAgICAgICB7MTEsICAgIDExfSwKKyAgICAgICAgezExLCAgICAxM30sCisgICAgICAgIHsxMSwgICAgMTV9LAorICAgICAgICB7MTEsICAgIDE3fSwKKyAgICAgICAgezExLCAgICAxOX0sCisgICAgICAgIHsxMSwgICAgMjF9LAorICAgICAgICB7MTEsICAgIDIzfSwKKyAgICAgICAgezExLCAgICAyNX0sCisgICAgICAgIHsxMSwgICAgMjd9LAorICAgICAgICB7MTEsICAgIDI5fSwKKyAgICAgICAgezExLCAgICAzMX0sCisgICAgICAgIHsxMSwgICAgMzN9LAorICAgICAgICB7MTEsICAgIDM1fSwKKyAgICAgICAgezEwLCAgICAxOX0sCisgICAgICAgIHsxMCwgICAgMjF9LAorICAgICAgICB7MTAsICAgIDIzfSwKKyAgICAgICAgezgsICAgICAgN30sCisgICAgICAgIHs4LCAgICAgIDl9LAorICAgICAgICB7OCwgICAgIDExfSwKKyAgICAgICAgezcsICAgICAgN30sCisgICAgICAgIHs1LCAgICAgIDN9LAorICAgICAgICB7NCwgICAgICAzfSwKKyAgICAgICAgezMsICAgICAgM30sCisgICAgICAgIHsxLCAgICAgIDF9LAorICAgICAgICB7MywgICAgICAyfSwKKyAgICAgICAgezQsICAgICAgMn0sCisgICAgICAgIHs1LCAgICAgIDJ9LAorICAgICAgICB7NywgICAgICA2fSwKKyAgICAgICAgezgsICAgICAxMH0sCisgICAgICAgIHs4LCAgICAgIDh9LAorICAgICAgICB7OCwgICAgICA2fSwKKyAgICAgICAgezEwLCAgICAyMn0sCisgICAgICAgIHsxMCwgICAgMjB9LAorICAgICAgICB7MTAsICAgIDE4fSwKKyAgICAgICAgezExLCAgICAzNH0sCisgICAgICAgIHsxMSwgICAgMzJ9LAorICAgICAgICB7MTEsICAgIDMwfSwKKyAgICAgICAgezExLCAgICAyOH0sCisgICAgICAgIHsxMSwgICAgMjZ9LAorICAgICAgICB7MTEsICAgIDI0fSwKKyAgICAgICAgezExLCAgICAyMn0sCisgICAgICAgIHsxMSwgICAgMjB9LAorICAgICAgICB7MTEsICAgIDE4fSwKKyAgICAgICAgezExLCAgICAxNn0sCisgICAgICAgIHsxMSwgICAgMTR9LAorICAgICAgICB7MTEsICAgIDEyfSwKKyAgICAgICAgezExLCAgICAxMH0sCisgICAgICAgIHsxMSwgICAgIDh9LAorICAgICAgICB7MTIsICAgIDE0fSwKKyAgICAgICAgezEyLCAgICAxMn0sCisgICAgICAgIHsxMiwgICAgMTB9LAorICAgICAgICB7MTIsICAgICA4fSwKKyAgICAgICAgezEyLCAgICAgNn0sCisgICAgICAgIHsxMiwgICAgIDR9LAorICAgICAgICB7MTMsICAgICA2fSwKKyAgICAgICAgezEzLCAgICAgNH0sCisgICAgICAgIHsgMCwgICAgIDB9Cit9OworCisvKiBFbmQgb2YgZmlsZSAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWVmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfUHV0VkxDQml0cy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBwdXQgYml0cyB0byBiaXRzdHJlYW0gCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisKKyAKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAorICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispCit7CisKKyAgICBPTVhfVTMyIHN0b3JlUnVuID0gMCwgcnVuLCBzdG9yZVJ1blBsdXM7CisgICAgT01YX1U4ICBsYXN0ID0gMCwgZmlyc3QgPSAxLCBmTW9kZTsKKyAgICBPTVhfUzE2IGxldmVsLCBzdG9yZUxldmVsID0gMCwgc3RvcmVMZXZlbFBsdXM7CisgICAgT01YX0lOVCBpOworICAgIAorICAgICAgICAvKiBSTEUgZW5jb2RpbmcgYW5kIHBhY2tpbmcgdGhlIGJpdHMgaW50byB0aGUgc3RyZWFtcyAqLworICAgICAgICBmb3IgKGkgPSBzdGFydCwgcnVuPTA7IGkgPCA2NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsZXZlbCAgID0gcFFEY3RCbGtDb2VmW3BaaWd6YWdUYWJsZVtpXV07CisKKyAgICAgICAgICAgIC8qIENvdW50aW5nIHRoZSBydW4gKi8KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBGb3VuZCBhIG5vbi16ZXJvIGNvZWZmICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKKyAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMFthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZNb2RlID0gYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLCAKKwkJCQkJCQkJCSAgc3RvcmVSdW5QbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAorCQkJCQkJCQkJICBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgc3RvcmVSdW4gICA9IHJ1bjsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8qIGVuZCBvZiBmb3IgbG9vcCBmb3IgNjQgZWxlbWVudHMgKi8KKworICAgICAgICAvKiB3cml0aW5nIHRoZSBsYXN0IGVsZW1lbnQgKi8KKyAgICAgICAgbGFzdCA9IDE7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSBpbiB0aGUgVkxDIHRhYmxlICovCisgICAgICAgIHN0b3JlTGV2ZWxQbHVzID0gYXJtU2lnbkNoZWNrKHN0b3JlTGV2ZWwpICogCisgICAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwxW3J1bl0pOworICAgICAgICBzdG9yZVJ1blBsdXMgPSBzdG9yZVJ1biAtIAorICAgICAgICAgICAgICAgICAgICAgIChwUk1BWFRhYmxlTDFbYXJtQWJzKHN0b3JlTGV2ZWwpIC0gMV0gKyAxKTsKKyAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSk7CisgICAgICAgIAorICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAorCQkJCQkJICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kZSwKKwkJCQkJCSAgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwxKTsKKwlyZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2QwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKykKK3sKKyAgICBPTVhfVTggIGJsb2NrRENMZWZ0OworICAgIE9NWF9VOCAgYmxvY2tEQ1RvcDsKKyAgICBPTVhfVTggIGJsb2NrRENUb3BMZWZ0OworCisgICAgaWYgKGJsb2NrSW5kZXggPT0gMykKKyAgICB7CisgICAgICAgIGJsb2NrRENUb3AgPSAqKHBDb2VmQnVmQ29sIC0gOCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJsb2NrRENUb3AgPSAqcENvZWZCdWZSb3c7CisgICAgfQorICAgIGJsb2NrRENMZWZ0ID0gKnBDb2VmQnVmQ29sOworICAgIGJsb2NrRENUb3BMZWZ0ID0gKihwQ29lZkJ1ZlJvdyAtIDgpOworCisgICAgaWYgKGFybUFicyhibG9ja0RDTGVmdCAtIGJsb2NrRENUb3BMZWZ0KSA8IGFybUFicyhibG9ja0RDVG9wTGVmdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYmxvY2tEQ1RvcCkpCisgICAgeworICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19WRVJUSUNBTDsKKyAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlsxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnByZWREaXIgPSBPTVhfVkNfSE9SSVpPTlRBTDsKKyAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlswXTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0N2M2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpAQCAtMCwwICsxLDU4IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XSA9IAoreworICAgICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKKyAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCisgICAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAgIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwgCisgICAgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAorICAgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCisgICAgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCit9OworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICAxLCAgMiwgIDMsICA4LCAgOSwgMTYsIDE3LAorICAgIDEwLCAxMSwgIDQsICA1LCAgNiwgIDcsIDE1LCAxNCwKKyAgICAxMywgMTIsIDE5LCAxOCwgMjQsIDI1LCAzMiwgMzMsCisgICAgMjYsIDI3LCAyMCwgMjEsIDIyLCAyMywgMjgsIDI5LAorICAgIDMwLCAzMSwgMzQsIDM1LCA0MCwgNDEsIDQ4LCA0OSwKKyAgICA0MiwgNDMsIDM2LCAzNywgMzgsIDM5LCA0NCwgNDUsIAorICAgIDQ2LCA0NywgNTAsIDUxLCA1NiwgNTcsIDU4LCA1OSwKKyAgICA1MiwgNTMsIDU0LCA1NSwgNjAsIDYxLCA2MiwgNjMKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICA4LCAxNiwgMjQsICAxLCAgOSwgIDIsIDEwLAorICAgICAxNywgMjUsIDMyLCA0MCwgNDgsIDU2LCA1NywgNDksCisgICAgIDQxLCAzMywgMjYsIDE4LCAgMywgMTEsICA0LCAxMiwKKyAgICAgMTksIDI3LCAzNCwgNDIsIDUwLCA1OCwgMzUsIDQzLAorICAgICA1MSwgNTksIDIwLCAyOCwgIDUsIDEzLCAgNiwgMTQsCisgICAgIDIxLCAyOSwgMzYsIDQ0LCA1MiwgNjAsIDM3LCA0NSwgCisgICAgIDUzLCA2MSwgMjIsIDMwLCAgNywgMTUsIDIzLCAzMSwKKyAgICAgMzgsIDQ2LCA1NCwgNjIsIDM5LCA0NywgNTUsIDYzCit9OworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworCisgICAgLyogRm9yIGEgYmxvY2tzaXplIG9mIDE2eDE2ICovCisgICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCAgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOworCisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTk2ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiA4eDggKi8KKyAgICBPTVhfVTggQmxvY2tTaXplID0gODsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTRlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCisgKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAorICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAorICogICAgICAgICAgICAtNC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisKKyAgIE9NWF9VOCBCbG9ja1NpemUgPSAxNjsKKyAgIAorICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKKyAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgIHJldHVybiAoIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIHBTcmNSZWZCdWYsCisgICAgIHJlZldpZHRoLAorICAgICBwUmVmUmVjdCwKKyAgICAgcFNyY0N1cnJCdWYsCisgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgIHBTcmNQcmVNViwKKyAgICAgcFNyY1ByZVNBRCwKKyAgICAgcE1FU3BlYywKKyAgICAgcERzdE1WLAorICAgICBwRHN0U0FELAorICAgICBCbG9ja1NpemUpCisgICAgICk7CisKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2U2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQKKykKK3sKKyAgIE9NWF9VOCBCbG9ja1NpemUgPSA4OworICAgCisgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgCisgICByZXR1cm4gKCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBwU3JjUmVmQnVmLAorICAgICByZWZXaWR0aCwKKyAgICAgcFJlZlJlY3QsCisgICAgIHBTcmNDdXJyQnVmLAorICAgICBwQ3VyclBvaW50UG9zLAorICAgICBwU3JjUHJlTVYsCisgICAgIHBTcmNQcmVTQUQsCisgICAgIHBNRVNwZWMsCisgICAgIHBEc3RNViwKKyAgICAgcERzdFNBRCwKKyAgICAgQmxvY2tTaXplKQorICAgICApOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzdhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RDVDh4OGJsay5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIDh4OCBibG9jayBEQ1QKKyAqIAorICovCisgCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0RDVF9UYWJsZS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoY29uc3QgT01YX1MxNiAqcFNyYywgT01YX1MxNiAqcERzdCkKK3sKKyAgICBPTVhfSU5UIHgsIHksIHUsIHY7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworCisgICAgZm9yICh1ID0gMDsgdSA8IDg7IHUrKykKKyAgICB7CisgICAgICAgIGZvciAodiA9IDA7IHYgPCA4OyB2KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9GNjQgc3VtID0gMC4wOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBTcmNbKHggKiA4KSArIHldICoKKyAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeF1bdV0gKgorICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0Wyh1ICogOCkgKyB2XT0gYXJtUm91bmRGbG9hdFRvUzE2IChzdW0pOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmN2JhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTE1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKKyAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAorICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCisgKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCisgKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKKyAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgUVAgPD0gMC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLworICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIFFQKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXIsIGksIGosIGNvdW50OworICAgIE9NWF9JTlQgIHByZWRRUDsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocENvZWZCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRUEJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChjdXJRUCA8PSAwKSB8fCAoY3VyUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYmxvY2tJbmRleCA8IDApIHx8IChibG9ja0luZGV4ID4gNSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3RlcCAlIDgpICE9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICBhcm1SZXRBcmdFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChBQ1ByZWRGbGFnID09IDApCisgICAgeworICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKKyAgICB9CisKKyAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KKyAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOworICAgIH0KKyAgICAKKworICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgaWYgKGludHJhRENWTEMgPT0gMSkKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICB2aWRlb0NvbXApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgY3VyUVAsCisgICAgIHZpZGVvQ29tcCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKKyAgICAgICBpdCB0byAwIHRvIDI1NSAqLworICAgIGZvciAoaiA9IDAsIGNvdW50ID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpXSA9IGFybUNsaXAgKDAsIDI1NSwgcFRlbXBCdWYyW2NvdW50XSk7CisgICAgICAgIH0KKyAgICAgICAgcERzdCArPSBzdGVwOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE1OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCkBAIC0wLDAgKzEsMjQzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBkZWNvZGluZyBNViBhbmQgcGFkZGluZyB0aGUgc2FtZQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKKyAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKKyAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCisgKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCisgKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKKyAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAorICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKKyAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAorICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAorICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAorICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBzeW50YXggCisgKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCisgKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KKyAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCisgKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJSaWdodE1CLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBEc3RNVkN1ck1CLAorICAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCisgKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVlByZWRNRVsxMl07CisgICAgT01YX0lOVCBpQmxrLCBpLCBjb3VudCA9IDE7CisgICAgT01YX1MzMiBtdkhvclJlc2lkdWFsID0gMSwgbXZWZXJSZXNpZHVhbCA9IDEsIG12SG9yRGF0YSwgbXZWZXJEYXRhOworICAgIE9NWF9TOCBzY2FsZUZhY3RvciwgaW5kZXg7CisgICAgT01YX1MxNiBoaWdoLCBsb3csIHJhbmdlOworCisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZDdXJNQiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoZmNvZGVGb3J3YXJkIDwgMSkgfHwgKGZjb2RlRm9yd2FyZCA+IDcpKSwgXAorICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3RNVkN1ck1CKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRSQSkgfHwKKyAgICAgICAgKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkFfUSkKKyAgICAgICApCisgICAgeworICAgICAgICAvKiBBbGwgTVYncyBhcmUgemVybyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keCA9IDA7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICB9CisKKyAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0VikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0Vl9RKSkKKyAgICB7CisgICAgICAgIGNvdW50ID0gNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSAxOworICAgIH0KKworICAgIC8qIENhbGN1bGF0aW5nIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgICBzY2FsZUZhY3RvciA9IDEgPDwgKGZjb2RlRm9yd2FyZCAtMSk7CisgICAgaGlnaCA9ICAoIDMyICogc2NhbGVGYWN0b3IpIC0gMTsKKyAgICBsb3cgPSAgICggKC0zMikgKiBzY2FsZUZhY3Rvcik7CisgICAgcmFuZ2UgPSAoIDY0ICogc2NhbGVGYWN0b3IpOworCisgICAgLyogSHVmZm1hbiBkZWNvZGluZyBhbmQgTVYgcmVjb25zdHJ1Y3Rpb24gKi8KKyAgICBmb3IgKGlCbGsgPSAwOyBpQmxrIDwgY291bnQ7IGlCbGsrKykKKyAgICB7CisKKyAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyB0byBnZXQgSG9yaXpvbnRhbCBkYXRhIGFuZCByZXNpZHVhbCAqLworICAgICAgICBpbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRCk7CisgICAgICAgIGFybVJldERhdGFFcnJJZihpbmRleCA9PSAtMSwgT01YX1N0c19FcnIpOworCisgICAgICAgIG12SG9yRGF0YSA9IGluZGV4IC0gMzI7CisKKyAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAobXZIb3JEYXRhICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtdkhvclJlc2lkdWFsID0gKE9NWF9TMzIpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIChmY29kZUZvcndhcmQgLTEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgdG8gZ2V0IFZlcnRpY2FsIGRhdGEgYW5kIHJlc2lkdWFsICovCisgICAgICAgIGluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKGluZGV4ID09IC0xLCBPTVhfU3RzX0Vycik7CisKKyAgICAgICAgbXZWZXJEYXRhID0gaW5kZXggLSAzMjsKKworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChtdlZlckRhdGEgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoT01YX1MzMikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGRpZmZlcnRpYWwgTVYgKi8KKyAgICAgICAgaWYgKCAoc2NhbGVGYWN0b3IgPT0gMSkgfHwgKG12SG9yRGF0YSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keCA9IG12SG9yRGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keCA9ICgoYXJtQWJzKG12SG9yRGF0YSkgLSAxKSAqIGZjb2RlRm9yd2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIG12SG9yUmVzaWR1YWwgKyAxOworICAgICAgICAgICAgaWYgKG12SG9yRGF0YSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmZk1WLmR4ID0gLWRpZmZNVi5keDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggKHNjYWxlRmFjdG9yID09IDEpIHx8IChtdlZlckRhdGEgPT0gMCkgKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSBtdlZlckRhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSAoKGFybUFicyhtdlZlckRhdGEpIC0gMSkgKiBmY29kZUZvcndhcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBtdlZlclJlc2lkdWFsICsgMTsKKyAgICAgICAgICAgIGlmIChtdlZlckRhdGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZmZNVi5keSA9IC1kaWZmTVYuZHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CLAorICAgICAgICAgICAgcFNyY01WTGVmdE1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKKyAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgICAgICAgICZwRHN0TVZDdXJNQltpQmxrXSwKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FLAorICAgICAgICAgICAgaUJsayk7CisKKyAgICAgICAgLyogQWRkaW5nIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0ZWQgTVYgdG8gcmVjb25zdHJ1Y3QgTVYgKi8KKyAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggKz0gZGlmZk1WLmR4OworICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSBkaWZmTVYuZHk7CisKKyAgICAgICAgLyogQ2hlY2tpbmcgdGhlIHJhbmdlIGFuZCBrZWVwaW5nIGl0IHdpdGhpbiB0aGUgbGltaXRzICovCisgICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHggPCBsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHggPiBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCAtPSByYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHkgPCBsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHkgPiBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSAtPSByYW5nZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBwRHN0TVZDdXJNQlsxXSA9IHBEc3RNVkN1ck1CWzBdOworICAgICAgICBwRHN0TVZDdXJNQlsyXSA9IHBEc3RNVkN1ck1CWzBdOworICAgICAgICBwRHN0TVZDdXJNQlszXSA9IHBEc3RNVkN1ck1CWzBdOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE4ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCisgKiBmb3IgaW50ZXIgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICBPTVhfVTggIGxhc3Qsc3RhcnQgPSAwOworICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKwkJCSAgcERzdCwKKwkJCSAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgc3RhcnQsCisJCQkgICZsYXN0LAorCQkJICAxMSwKKwkJCSAgNDIsCisJCQkgICAyLAorCQkJICAgNSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgaWYgKGxhc3QgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTkzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCisgKiBmb3IgaW50cmEgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKKyAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKKyAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCisgKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKKyAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKKyAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAorICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCisgKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KKworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCBzdGFydCA9IDA7CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgcHBCaXRTdHJlYW0sCisgICAgIHBCaXRPZmZzZXQsCisgICAgIHBEc3QsCisgICAgIHByZWREaXIsCisgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlMDBkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispCit7CisgICAgLyogRHVtbXkgaW5pdGlsYWl6YXRpb24gdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCisgICAgT01YX1M4ICBEQ1ZhbHVlU2l6ZSA9IDA7CisgICAgT01YX1UxNiBwb3dPZlNpemUsIGZldGNoRENiaXRzOworICAgIE9NWF9VOCBzdGFydCA9IDE7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIEluc2VydCB0aGUgY29kZSBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KKyAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgeworICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleCk7CisgICAgfQorICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCisgICAgeworICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4KTsKKyAgICB9CisgICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID09IC0xLCBPTVhfU3RzX0Vycik7CisgICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID4gMTIsIE9NWF9TdHNfRXJyKTsKKworCisgICAgaWYgKERDVmFsdWVTaXplID09IDApCisgICAgeworICAgICAgICBwRHN0WzBdID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmV0Y2hEQ2JpdHMgPSAoT01YX1UxNikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVmFsdWVTaXplKTsKKworICAgICAgICBpZiAoIChmZXRjaERDYml0cyA+PiAoRENWYWx1ZVNpemUgLSAxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsdWxhdGUgcG93ICovCisgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgIHBEc3RbMF0gPSAgKE9NWF9TMTYpIChmZXRjaERDYml0cyBeIChwb3dPZlNpemUgLSAxKSk7CisgICAgICAgICAgICBwRHN0WzBdID0gLXBEc3RbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0WzBdID0gZmV0Y2hEQ2JpdHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQorICAgICAgICB7CisgICAgICAgICAgICAvKiByZWFkaW5nIGFuZCBjaGVja2luZyB0aGUgbWFya2VyIGJpdCovCisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpID09IDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgIHByZWREaXIsCisgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgICBzdGFydCk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjJiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZU1WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHJlZGljdGluZyBNViBvZiBNQgorICoKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKKyAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKKyAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKKyAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCisgKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCisgKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCisgKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCisgKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCisgKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBNVkN1ck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZCwgZGlmZk1WOworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKKyAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gd2FybmluZyAqLworICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOworICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCwgbXZWZXJSZXNpZHVhbCwgbXZIb3JEYXRhLCBtdlZlckRhdGE7CisgICAgT01YX1U4IHNjYWxlRmFjdG9yLCBpbmRleDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCisgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8CisgICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCisgICAgICAgKQorICAgIHsKKyAgICAgICAgLyogTm8gY2FuZGlkYXRlIHZlY3RvcnMgaGVuY2UgbWFrZSB0aGVtIHplcm8gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR4ID0gMDsKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSA0OworICAgIH0KKyAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBjb3VudCA9IDE7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLworICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKKworICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQorICAgIHsKKworICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICAgICAgICAgIHBNVkN1ck1CLAorICAgICAgICAgICAgcFNyY01WTGVmdE1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKKyAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgICAgICAgICZkc3RNVlByZWQsCisgICAgICAgICAgICBkc3RNVlByZWRNRSwKKyAgICAgICAgICAgIGlCbGsgKTsKKworICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVyZW50aWFsIG1vdGlvbiB2ZWN0b3IgKGRpZmZNVikgKi8KKyAgICAgICAgZGlmZk1WLmR4ID0gcE1WQ3VyTUJbaUJsa10uZHggLSBkc3RNVlByZWQuZHg7CisgICAgICAgIGRpZmZNVi5keSA9IHBNVkN1ck1CW2lCbGtdLmR5IC0gZHN0TVZQcmVkLmR5OworCisgICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBtdl9kYXRhIGFuZCBtdl9yZXNpZHVhbCBmb3IgSG9yaXphbnRhbCBNViAqLworICAgICAgICBpZiAoZGlmZk1WLmR4ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAwOworICAgICAgICAgICAgbXZIb3JEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHgpIC0gMSkgJSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIG12SG9yRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR4KSAtIG12SG9yUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7CisgICAgICAgICAgICBpZiAoZGlmZk1WLmR4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdkhvckRhdGEgPSAtbXZIb3JEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBWZXJ0aWNhbCBNViAqLworICAgICAgICBpZiAoZGlmZk1WLmR5ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAwOworICAgICAgICAgICAgbXZWZXJEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHkpIC0gMSkgJSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIG12VmVyRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR5KSAtIG12VmVyUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7CisgICAgICAgICAgICBpZiAoZGlmZk1WLmR5IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdlZlckRhdGEgPSAtbXZWZXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSHVmZm1hbiBlbmNvZGluZyAqLworCisgICAgICAgIC8qIFRoZSBpbmRleCBpcyBhY3R1YWxseSBjYWxjdWxhdGUgYXMKKyAgICAgICAgICAgaW5kZXggPSAoKGZsb2F0KSAobXZIb3JEYXRhLzIpICsgMTYpICogMiwKKyAgICAgICAgICAgbWVhbmluZyB0aGUgTVYgZGF0YSBpcyBoYWxmZWQgYW5kIHRoZW4gbm9ybWFsaXplZAorICAgICAgICAgICB0byBiZWdpbiB3aXRoIHplcm8gYW5kIHRoZW4gZG91YmxlZCB0byB0YWtlIGNhcmUgb2YgaW5kZXhpbmcKKyAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgcGFydCBpbmNsdWRlZCAqLworICAgICAgICBpbmRleCA9IG12SG9yRGF0YSArIDMyOworICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRFtpbmRleF0pOworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChkaWZmTVYuZHggIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVBhY2tCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgbXZIb3JSZXNpZHVhbCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcworICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdlZlckRhdGEvMikgKyAxNikgKiAyLAorICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCisgICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZworICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCisgICAgICAgIGluZGV4ID0gbXZWZXJEYXRhICsgMzI7CisgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7CisgICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdlZlclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjNzNlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludGVyIGJsb2NrLgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAorICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcGF0dGVybiwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgT01YX1U4IHN0YXJ0ID0gMDsKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgMjYsCisgICAgICAgICAgICAgIDQwLAorICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlCisgICAgICAgICk7CisgICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDc5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCBzdGFydCA9IDA7CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgcHBCaXRTdHJlYW0sCisgICAgIHBCaXRPZmZzZXQsCisgICAgIHBRRGN0QmxrQ29lZiwKKyAgICAgcHJlZERpciwKKyAgICAgcGF0dGVybiwKKyAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgc3RhcnQpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YWNkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispCit7CisgICAgT01YX1MxNiBkY1ZhbHVlLCBwb3dPZlNpemU7CisgICAgT01YX1U4ICBEQ1ZhbHVlU2l6ZSwgc3RhcnQgPSAxOworICAgIE9NWF9VMTYgYWJzRENWYWx1ZTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCh2aWRlb0NvbXAgIT0gT01YX1ZDX0xVTUlOQU5DRSkgJiYgKHZpZGVvQ29tcCAhPSBPTVhfVkNfQ0hST01JTkFOQ0UpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gT01YX1ZDX05PTkUpICYmIChwcmVkRGlyICE9IE9NWF9WQ19IT1JJWk9OVEFMKSAmJiAocHJlZERpciAhPSBPTVhfVkNfVkVSVElDQUwpICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgZGNWYWx1ZSA9IHBRRGN0QmxrQ29lZlswXTsKKyAgICAgICAgYWJzRENWYWx1ZSA9IGFybUFicyhkY1ZhbHVlKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBzaXplICovCisgICAgICAgIERDVmFsdWVTaXplID0gYXJtTG9nU2l6ZSAoYWJzRENWYWx1ZSk7CisgICAgICAgIGFic0RDVmFsdWUgPSBhcm1BYnMoZGNWYWx1ZSk7CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBjb2RlIGludG8gdGhlIGJpdHN0cmVhbSAqLworICAgICAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgICAgIHsKKworICAgICAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4W0RDVmFsdWVTaXplXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICAgICAgeworCisgICAgICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFtEQ1ZhbHVlU2l6ZV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkaXRpb25hbCBjb2RlIGdlbmVyYXRpb24gaW4gY2FzZSBvZiBuZWdhdGl2ZQorICAgICAgICAgICBkYyB2YWx1ZSB0aGUgYWRkaXRpb25hbCAqLworICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGNWYWx1ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY2FsdWxhdGUgMiBwb3cgKi8KKyAgICAgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBhYnNEQ1ZhbHVlID0gIGFic0RDVmFsdWUgXiAocG93T2ZTaXplIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpYWJzRENWYWx1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRENWYWx1ZVNpemUpOworCisgICAgICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICAgIHByZWREaXIsCisgICAgICAgICAgICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNmZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCgKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNNVkN1ck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjEsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMiwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzLAorICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBEc3RNVlByZWRNRSwKKyAgICAgT01YX0lOVCBpQmxrCisgKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIENhbmRNVjsKKwljb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjE7CisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYyOworICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMzsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKwlhcm1SZXRBcmdFcnJJZihpQmxrIT0wICYmIHBTcmNNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsayA8IDApIHx8IChpQmxrID4gMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsgCisKKyAgICBDYW5kTVYuZHggPSBDYW5kTVYuZHkgPSAwOworCS8qIEJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgZXh0cmFjdCB0aGUgbW90aW9uIHZlY3RvcnMgYW5kCisgICAgICAgdGhlIHRyYW5wZXJhbmN5IHN0YXR1cyAqLworICAgCisgICAgCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZSB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwgKi8KKyAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjMgPSAmQ2FuZE1WOworCisgICAgCisgICAgc3dpdGNoIChpQmxrKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJICAgIHBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzFdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMiA9ICZwU3JjQ2FuZE1WMlsyXTsKKwkJCX0KKwkJCWlmKHBTcmNDYW5kTVYzICE9IE5VTEwpCisgICAgICAgICAgICB7CisJCQkJcENhbmRNVjMgPSAmcFNyY0NhbmRNVjNbMl07CisJCQl9CisJCQlpZiAoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMiA9PSBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMSA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjEgPSBwQ2FuZE1WMyA9IHBDYW5kTVYyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigocFNyY0NhbmRNVjIgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDYW5kTVYyID0gcENhbmRNVjMgPSBwQ2FuZE1WMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMF07CisJCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzNdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKKwkJCX0KKwkJCWlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzNdOworCQkJfQorCQkJcENhbmRNVjIgPSAmcFNyY01WQ3VyTUJbMF07CisJCQlwQ2FuZE1WMyA9ICZwU3JjTVZDdXJNQlsxXTsKKwkJCWJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMl07CisJCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKKwkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOworCQkJYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MgKi8KKyAgICBwRHN0TVZQcmVkLT5keCA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR4LCBwQ2FuZE1WMi0+ZHgsIHBDYW5kTVYzLT5keCk7CisgICAgcERzdE1WUHJlZC0+ZHkgPSBhcm1NZWRpYW5PZjMgKHBDYW5kTVYxLT5keSwgcENhbmRNVjItPmR5LCBwQ2FuZE1WMy0+ZHkpOworICAgICAgICAKKyAgICBpZiAocERzdE1WUHJlZE1FICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCB0aGVzZSBjYW4gYmUgdXNlZAorICAgICAgICAgICBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgcERzdE1WUHJlZE1FWzBdLmR4ID0gcENhbmRNVjEtPmR4OworICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHkgPSBwQ2FuZE1WMS0+ZHk7CisgICAgICAgIHBEc3RNVlByZWRNRVsxXS5keCA9IHBDYW5kTVYyLT5keDsKKyAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR5ID0gcENhbmRNVjItPmR5OworICAgICAgICBwRHN0TVZQcmVkTUVbMl0uZHggPSBwQ2FuZE1WMy0+ZHg7CisgICAgICAgIHBEc3RNVlByZWRNRVsyXS5keSA9IHBDYW5kTVYzLT5keTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4NmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgSURDVAorICogCisgKi8KKworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCit7CisgICAgT01YX0lOVCB4LCB5LCB1LCB2OworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKKyAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh1ICogOCkgKyB2XSAqCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IChPTVhfUzE2KSBmbG9vcihzdW0gKyAwLjUpOworCisgICAgICAgICAgICAvKiBTYXR1cmF0ZSB0byBbLTI1NiwgMjU1XSAqLworICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0gPSBhcm1DbGlwICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2ZhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwpAQCAtMCwwICsxLDM1NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2suYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAorICogaW50ZXJwb2xhdGlvbgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9IYWxmUGVsVmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBoYWxmIHBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgdmVydGljYWwgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCisgKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKKyAqICAgICAgICAgICAgICAgICAgb2YgOC4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOworICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxWZXIoCisgICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsIAorICAgICAgT01YX1U4ICpwRHN0LAorICAgICAgT01YX0lOVCBybmRWYWwpCit7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKKyAgT01YX0lOVCB5LCB4OworICAKKyAgcFRlbXBTcmMxID0gcFNyYzsgIAorICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKKyAgc3JjU3RlcCAtPSA4OworICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICB7CisgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICB7CisgICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKKyAgICB9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxIb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBob3Jpem9udGFsIAorICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLCBzdWJjbGF1c2UgNy42LjIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcworICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCisgKiAgICAgICAgICAgICAgICAgIG9mIDguCisgKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgorICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsSG9yKAorICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICAgT01YX0lOVCBzcmNTdGVwLCAKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgcm5kVmFsKQoreworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7CisgIE9NWF9JTlQgeSwgeDsKKyAgCisgIHBUZW1wU3JjMSA9IHBTcmM7CisgIHBUZW1wU3JjMiA9IHBUZW1wU3JjMSArIDE7CisKKyAgc3JjU3RlcCAtPSA4OworICBmb3IgKHk9MDsgeTw4OyB5KyspCisgIHsKKyAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgeworICAgICAgKnBEc3QrKyA9ICgoKnBUZW1wU3JjMSsrICsgKnBUZW1wU3JjMisrKSArIDEgLSBybmRWYWwpID4+IDE7CisgICAgfQorICAgIHBUZW1wU3JjMSArPSBzcmNTdGVwOworICAgIHBUZW1wU3JjMiArPSBzcmNTdGVwOworICB9Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBib3RoIAorICogaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLAorICogc3ViY2xhdXNlIDcuNi4yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7CisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlckhvcigKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIHJuZFZhbCkKK3sKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMzsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzQ7CisgIE9NWF9JTlQgeSwgeDsKKworICBwVGVtcFNyYzEgPSBwU3JjOworICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKKyAgcFRlbXBTcmMzID0gcFNyYyArIDE7CisgIHBUZW1wU3JjNCA9IHBTcmMgKyBzcmNTdGVwICsgMTsKKworICBzcmNTdGVwIC09IDg7CisgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgeworICAgIGZvciAoeD0wOyB4PDg7IHgrKykKKwl7CisJICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKysgKyAqcFRlbXBTcmMzKysgKyAqcFRlbXBTcmM0KyspICsgCisJICAgICAgICAgICAgICAgICAgMiAtIHJuZFZhbCkgPj4gMjsKKwl9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMzICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmM0ICs9IHNyY1N0ZXA7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgY29weSB0aGUgcmVzdWx0IHRvIHRoZSBjdXJyZW50IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqIFtpbl0gcHJlZGljdFR5cGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjEuMi4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgICAgICAgICAgICAgICAgSWYgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzCisgKiAgICAgICAgICAgICAgICAgIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLgorICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcygKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIGRzdFN0ZXApCit7CisgICAgT01YX1U4IHgseSxjb3VudCxpbmRleDsKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKyxpbmRleCArPSAoc3JjU3RlcCAtOCksIGNvdW50ICs9IChkc3RTdGVwIC0gOCkpCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrLGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1tpbmRleF07CisgICAgICAgIH0gICAgICAgCisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIElOVEVSIGJsb2NrIGJ5IHN1bW1pbmcgdGhlIG1vdGlvbiBjb21wZW5zYXRpb24gcmVzdWx0cworICogYW5kIHRoZSByZXN1bHRzIG9mIHRoZSBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIChwcmVkaWN0aW9uIHJlc2lkdWFscykuCisgKiBPdXRwdXQgaW50ZW5zaXRpZXMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBwU3JjUmVzaWR1ZSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uCisgKiAgICAgICAgICAgICAgICAgIHJlc2lkdWFscy4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCx0aGVuIG5vIHByZWRpY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLgorICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKKyAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCisgICAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgZHN0U3RlcCkKK3sKKyAgICAgIAorICBPTVhfVTggeCx5OworICBPTVhfSU5UIHRlbXA7CisgIAorICBmb3IoeSA9IDA7IHkgPCA4OyB5KyspCisgIHsKKyAgICBmb3IoeCA9IDA7IHggPCA4OyB4KyspCisgICAgeworICAgICAgdGVtcCA9IHBTcmNbeF0gKyBwU3JjUmVzaWR1ZVt4XTsgICAgICAgICAKKyAgICAgIHBEc3RbeF0gPSBhcm1DbGlwKDAsMjU1LHRlbXApOworICAgIH0KKyAgICBwRHN0ICs9IGRzdFN0ZXA7CisgICAgcFNyYyArPSA4OworICAgIHBTcmNSZXNpZHVlICs9IDg7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAorICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCisgKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCisgKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCisgKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCisgKiAgICAgICAgICAgIDYuMi4xLjIuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKKyAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCisgKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jaygKKwkJY29uc3QgT01YX1U4ICpwU3JjLAorCQlPTVhfSU5UIHNyY1N0ZXAsCisJCWNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorCQlPTVhfVTggKnBEc3QsIAorCQlPTVhfSU5UIGRzdFN0ZXAsCisJCU9NWF9JTlQgcHJlZGljdFR5cGUsCisJCU9NWF9JTlQgcm5kVmFsKQoreworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIE9NWF9VOCBwVGVtcERzdFs2NF07CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVzaWR1ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKGRzdFN0ZXAgJSA4KSB8fCAoc3JjU3RlcCAlIDgpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgocHJlZGljdFR5cGUgIT0gT01YX1ZDX0lOVEVHRVJfUElYRUwpICYmCisgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9YKSAmJgorICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1hZKQorICAgICAgICAgICAgICAgICAgICksT01YX1N0c19CYWRBcmdFcnIpOyAKKyAgICBhcm1SZXRBcmdFcnJJZigoKHJuZFZhbCAhPSAwKSAmJiAocm5kVmFsICE9IDEpKSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgc3dpdGNoKHByZWRpY3RUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBPTVhfVkNfSU5URUdFUl9QSVhFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcyhwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsSG9yKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9ZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSGFsZlBlbFZlcihwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYocFNyY1Jlc2lkdWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKCYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwKTsgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZXNpZHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNTFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FTW9kZSwgCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywgCisgICAgT01YX1UzMiAqcFNpemUKKyAgICkKK3sKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBTaXplLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1FUGFyYW1zLT5zZWFyY2hSYW5nZSA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDJfTUVTcGVjKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTllNzFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NRUluaXQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKKyAgICB2b2lkICpwTUVTcGVjCisgICApCit7CisgICAgQVJNVkNNNFAyX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMl9NRVNwZWMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoRW5hYmxlOHg4ICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlBlbFNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlICAgICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOyAgICAgICAgCisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ybmRWYWwgICAgICAgICAgICAgID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTQ5MDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBtb3Rpb24gc2VhcmNoIDE2eDE2IG1hY3JvYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2CisgKgorICogRGVzY3JpcHRpb246CisgKiAxNngxNiBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LgorICogSWYgaGFsZiBwZWwgc2VhcmNoIGlzIGVuYWJsZWQgaXQgYWxzbyBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2CisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCisgKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKiAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBjb25zdCBPTVhfSU5UIHNyY1JlZlN0ZXAsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgT01YX0lOVCBybmRWYWw7CisgICAgCisgICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgCisgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNigKKyAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgcFJlZlJlY3QsCisgICAgICAgIHBTcmNDdXJyQnVmLAorICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICBwU3JjUHJlTVYsCisgICAgICAgIHBTcmNQcmVTQUQsCisgICAgICAgIHBNRVBhcmFtcywKKyAgICAgICAgcERzdE1WLAorICAgICAgICBwRHN0U0FEKTsKKyAgICAKKyAgICBpZiAocE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlKQorICAgIHsKKyAgICAgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKKyAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgcFJlZlJlY3QsCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICBwRHN0TVYsCisgICAgICAgICAgICBwRHN0U0FEKTsKKyAgICB9CisgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4CisgKgorICogRGVzY3JpcHRpb246CisgKiA4eDggYmxvY2sgbWF0Y2ggd3JhcHBlciBmdW5jdGlvbiwgY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguCisgKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4CisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCisgKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKiAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCBzcmNSZWZTdGVwLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgIE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMgPSAoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjOworICAgIE9NWF9JTlQgcm5kVmFsOworICAgIAorICAgIHJuZFZhbCA9IHBNRVBhcmFtcy0+cm5kVmFsOworICAgIAorICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4KAorICAgICAgICBwU3JjUmVmQnVmLAorICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgIHBTcmNQcmVNViwKKyAgICAgICAgcFNyY1ByZVNBRCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgIHBEc3RTQUQpOworICAgIAorICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCisgICAgeworICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKKyAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgcFJlZlJlY3QsCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICBwRHN0U0FEKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKKyAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAorICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCisgKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAorICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCisgKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKKyAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKKyAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKKyAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCisgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKKyAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCisgKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKKyAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAorICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKKyAqICAgICAgICAgICAgaWdub3JlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAorICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKKyAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKKyAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKKyAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCisgKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKKyAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKykKK3sKKyAKKyAgICBPTVhfSU5UIGludHJhU0FELCBhdmVyYWdlLCBjb3VudCwgaW5kZXgsIHgsIHk7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVYxNngxNjsKKyAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQxNngxNjsKKyAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQ4eDg7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgICpwTUVQYXJhbXM7IAorCU9NWFZDTTRQMkNvb3JkaW5hdGUgVGVtcEN1cnJQb2ludFBvczsgCisgICAgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFRlbXBDdXJyUG9pbnRQb3M7IAorICAgIE9NWF9VOCBhVGVtcFNyY0N1cnJCdWZbMjcxXTsKKyAgICBPTVhfVTggKnBUZW1wU3JjQ3VyckJ1ZjsKKyAgICBPTVhfVTggKnBEc3Q7CisgICAgT01YX1U4IGFEc3RbNzFdOworICAgIE9NWF9TMzIgZHN0U3RlcCA9IDg7CisgICAgT01YX0lOVCBwcmVkaWN0VHlwZTsKKwlPTVhfUzMyIFNhZDsKKyAgICBjb25zdCBPTVhfVTggKnBUZW1wU3JjUmVmQnVmOworICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjJbNF07CisgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzWzRdOworICAgICAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZkJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKHNyY0N1cnJTdGVwICUgMTYpIHx8IChzcmNSZWZTdGVwICUgMTYpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIAorICAgIHBUZW1wQ3VyclBvaW50UG9zID0gJihUZW1wQ3VyclBvaW50UG9zKTsKKyAgICBwVGVtcFNyY0N1cnJCdWYgPSBhcm1BbGlnblRvMTZCeXRlcyhhVGVtcFNyY0N1cnJCdWYpOworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggPSBwQ3VyclBvaW50UG9zLT54OworICAgIHBUZW1wQ3VyclBvaW50UG9zLT55ID0gcEN1cnJQb2ludFBvcy0+eTsKKyAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI7CisgICAgCisgICAgLyogUHJlcGFyaW5nIGEgbGluZWFyIGJ1ZmZlciBmb3IgYmxvY2sgbWF0Y2ggKi8KKyAgICBmb3IgKHkgPSAwLCBpbmRleCA9IGNvdW50ID0gMDsgeSA8IDE2OyB5KyssIGluZGV4ICs9IHNyY0N1cnJTdGVwIC0gMTYpCisgICAgeworICAgICAgICBmb3IoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWZbY291bnRdID0gcFNyY0N1cnJCdWZbaW5kZXhdOworICAgICAgICB9CisgICAgfQorICAgIGZvcih5ID0gMCwgaW5kZXggPSAwOyB5IDwgMjsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgMjsgeCsrLGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzBdICE9IE5VTEwpICYmIChwTUJJbmZvWzBdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxW2luZGV4XSA9ICYocE1CSW5mb1swXS0+cE1WMFt5XVt4XSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzFdICE9IE5VTEwpICYmIChwTUJJbmZvWzFdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9ICYocE1CSW5mb1sxXS0+cE1WMFt5XVt4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMltpbmRleF0gPSBOVUxMOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzNdICE9IE5VTEwpICYmIChwTUJJbmZvWzNdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9ICYocE1CSW5mb1szXS0+cE1WMFt5XVt4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1tpbmRleF0gPSBOVUxMOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkvKiBDYWxjdWxhdGluZyBTQUQgYXQgTVYoMCwwKSAqLworCWFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAorCQkJCQkgIDE2LAorCQkJCQkgIHBTcmNSZWZCdWYsCisJCQkJCSAgc3JjUmVmU3RlcCwKKwkJCQkJICAmU2FkLAorCQkJCQkgIDE2LAorCQkJCQkgIDE2KTsKKwkqcERzdFNBRCA9IFNhZDsKKworICAgIC8qIE1vZGUgZGVjaXNpb24gZm9yIE5PVF9DT0RFRCBNQiAqLworCWlmKCpwRHN0U0FEID09IDApCisJeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gMDsKKyAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IDA7CisgICAgICAgICpwRHN0U0FEICAgPSAwOworCQlyZXR1cm4gT01YX1N0c19Ob0VycjsKKwl9CisKKyAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKKyAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbMF0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzBdLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1swXSwKKyAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgIC8qIEludGVyIDEgTVYgKi8KKyAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKKyAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgcFJlZlJlY3QsCisgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwKKyAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICAmZHN0TVYxNngxNiwKKyAgICAgICAgJmRzdFNBRDE2eDE2KTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIGFsbCB3aXRoIDEgTVYgdmFsdWVzICovCisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7IAorICAgIAorICAgICpwRHN0U0FEICAgPSBkc3RTQUQxNngxNjsgICAgICAgCisgICAgCisgICAgaWYgKHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4KQorICAgIHsKKyAgICAgICAgLyogSW50ZXIgNE1WICovCisgICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVswXSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSBkc3RTQUQ4eDg7CisgICAgICAgICpwRHN0U0FEID0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IDg7CisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMV0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzFdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgCisgICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwRHN0QmxvY2tTQURbMV0gPSBkc3RTQUQ4eDg7CisgICAgICAgICpwRHN0U0FEICs9IGRzdFNBRDh4ODsKKyAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggLT0gODsKKyAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgKz0gODsKKyAgICAgICAgcFNyY1JlZkJ1ZiArPSAoc3JjUmVmU3RlcCAqIDgpIC0gODsKKyAgICAgICAgCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsyXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMl0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzJdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzBdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IDg7CisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVszXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbM10sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzNdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzFdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OyAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNraW5nIGlmIDRNViBpcyBlcXVhbCB0byAxTVYgKi8KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2VsZWN0IHRoZSA0IE1WICovCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI0VjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiBmaW5kaW5nIHRoZSBlcnJvciBpbiBpbnRyYSBtb2RlICovCisgICAgZm9yIChjb3VudCA9IDAsIGF2ZXJhZ2UgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCisgICAgeworICAgICAgICBhdmVyYWdlID0gYXZlcmFnZSArIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF07CisgICAgfQorICAgIGF2ZXJhZ2UgPSBhdmVyYWdlLzI1NjsKKyAgICAKKwlpbnRyYVNBRCA9IDA7CisKKyAgICAvKiBJbnRyYSBTQUQgY2FsY3VsYXRpb24gKi8KKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTYgOyBjb3VudCsrKQorICAgIHsKKyAgICAgICAgaW50cmFTQUQgKz0gYXJtQWJzICgocFRlbXBTcmNDdXJyQnVmW2NvdW50XSkgLSAoYXZlcmFnZSkpOworICAgIH0KKyAgICAKKwkvKiBVc2luZyB0aGUgTVBFRzQgVk0gZm9ybXVsYSBmb3IgaW50cmEvaW50ZXIgbW9kZSBkZWNpc2lvbiAKKwkgICBWYXIgPCAoU0FEIC0gMipOQikgd2hlcmUgTkIgPSBOXjIgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMKKwkgICBvZiB0aGUgbWFjcm9ibG9jay4qLworCisgICAgaWYgKGludHJhU0FEIDw9ICgqcERzdFNBRCAtIDUxMikpCisgICAgeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkE7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKKyAgICAgICAgKnBEc3RTQUQgICA9IGludHJhU0FEOworICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSAweEZGRkY7CisgICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IDB4RkZGRjsKKyAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gMHhGRkZGOworICAgICAgICBwRHN0QmxvY2tTQURbM10gPSAweEZGRkY7CisgICAgfQorCisgICAgaWYocFNyY0RzdE1CQ3Vyci0+bWJUeXBlID09IE9NWF9WQ19JTlRFUikKKyAgICB7CisgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAoc3JjUmVmU3RlcCAqIGRzdE1WMTZ4MTYuZHkpICsgZHN0TVYxNngxNi5keDsKKyAgICAKKyAgICAgIGlmKChkc3RNVjE2eDE2LmR4ICYgMHgxKSAmJiAoZHN0TVYxNngxNi5keSAmIDB4MSkpCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWFk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGRzdE1WMTZ4MTYuZHggJiAweDEpCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keSAmIDB4MSkKKyAgICAgIHsKKyAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9ZOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19JTlRFR0VSX1BJWEVMOworICAgICAgfQorICAgICAgCisgICAgICBwRHN0ID0gYXJtQWxpZ25UbzhCeXRlcygmKGFEc3RbMF0pKTsKKyAgICAgIC8qIENhbGN1bGF0aW5nIEJsb2NrIFNBRCBhdCBNVihkc3RNVjE2eDE2LmR4LGRzdE1WMTZ4MTYuZHkpICovCisJICAvKiBCbG9jayAwICovCisgICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKyAgICAKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCisgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICBwRHN0QmxvY2tTQURbMF0gPSBTYWQ7CisgICAKKyAgICAgIC8qIEJsb2NrIDEgKi8KKyAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsJCQkJCSAgCisKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzFdID0gU2FkOworCQorICAgICAgLyogQmxvY2sgMiAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKworICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICA4KTsKKyAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IFNhZDsKKworCSAgLyogQmxvY2sgMyAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7CisKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgKDE2KjgpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzNdID0gU2FkOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEzZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKQEAgLTAsMCArMSwxMjEgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9TMTYuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIG1vZHVsZXMgZm9yIEFDIERDIHByZWRpY3Rpb24KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAorICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCisgKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKKyAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAorICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAorICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAorICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAorICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KKyAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorICkKK3sKKyAgICBPTVhfVTggZmxhZzsKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQID4gMzEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPiAzMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZsYWcgPSAwOworICAgIHJldHVybiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgICAgIHBTcmNEc3QsCisgICAgICAgIE5VTEwsCisgICAgICAgIHBQcmVkQnVmUm93LAorICAgICAgICBwUHJlZEJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wLAorICAgICAgICBmbGFnLAorICAgICAgICBOVUxMKTsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NGY3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIFF1YW50aXphdGlvbgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9VOCBRUCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UIGNvZWZmQ291bnQ7CisgICAgT01YX0lOVCBmU2lnbjsKKyAgICBPTVhfSU5UIG1heENscEFDID0gMCwgbWluQ2xwQUMgPSAwOworICAgIE9NWF9JTlQgbWF4Q2xwREMgPSAwLCBtaW5DbHBEQyA9IDA7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLworICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIAorICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgIHsKKyAgICAgICBtYXhDbHBEQyA9IDI1NDsKKyAgICAgICBtaW5DbHBEQyA9IDE7CisgICAgICAgbWF4Q2xwQUMgPSAxMjc7CisgICAgICAgbWluQ2xwQUMgPSAtMTI3OyAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1heENscERDID0gMjA0NzsKKyAgICAgICAgbWluQ2xwREMgPSAtMjA0NzsKKyAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OworICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAorICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCisgICAgZm9yIChjb2VmZkNvdW50ID0gMDsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCisgICAgeworICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoUVAvMikpLygyICogUVApOworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IGZTaWduOworICAgICAgICAKKyAgICAgICAgLyogQ2xpcCAqLworICAgICAgICBpZiAoY29lZmZDb3VudCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQorICAgICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwREMsIG1heENscERDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9CisgICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBBQywgbWF4Q2xwQUMsIHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgUXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDYuMS4zLjguIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1U4IFFQLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLworICAgIE9NWF9JTlQgZGNTY2FsZXIgPSAwLCBjb2VmZkNvdW50LGZTaWduOworICAgIE9NWF9JTlQgbWF4Q2xwQUMsIG1pbkNscEFDOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPj0gMTApKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgIC8qIE9uZSBhcmd1bWVudCBjaGVjayBpcyBkZWxheWVkIHVudGlsIHdlIGhhdmUgYXNjZXJ0YWluZWQgdGhhdCAgKi8KKyAgIC8qIHBRTWF0cml4IGlzIG5vdCBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIAorICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgIHsKKyAgICAgICAgbWF4Q2xwQUMgPSAxMjc7CisgICAgICAgIG1pbkNscEFDID0gLTEyNzsKKyAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOworICAgIAorICAgICAgICAvKiBDbGlwIGJldHdlZW4gMSBhbmQgMjU0ICovCisgICAgICAgIHBTcmNEc3RbMF0gPSAoT01YX1MxNikgYXJtQ2xpcCAoMSwgMjU0LCBwU3JjRHN0WzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OworICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAorICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLworICAgICAgICBpZiAoKGJsb2NrSW5kZXggIDwgNCkgfHwgKGJsb2NrSW5kZXggID4gNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIFFQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gOSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQICsgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogUVApIC0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYmxvY2tJbmRleCA8IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IChRUCArIDEzKS8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgLSA2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOworICAgIH0KKyAgICAKKyAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCisgICAgZm9yIChjb2VmZkNvdW50ID0gMTsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCisgICAgeworICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkvKDIgKiBRUCk7CisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gZlNpZ247CisKKyAgICAgICAgLyogQ2xpcCAqLworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscEFDLCBtYXhDbHBBQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBkZTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKQEAgLTAsMCArMSw5NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciBpbnZlcnNlIFF1YW50aXphdGlvbgorICogCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAKKwkgKQoreworCisgICAgT01YX0lOVCBjb2VmZkNvdW50LCBTaWduOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAwOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KKyAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICAgICAgICAKKyAgICAgICAgLyogUXVhbnRpemUgdGhlIGNvZWZmICovCisgICAgICAgIGlmIChRUCAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUVAgLSAxOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIGludmVyc2UgUXVhbnRpemF0aW9uCisgKiAKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisKKyAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KKyAgICBPTVhfSU5UIGRjU2NhbGVyID0gMCwgY29lZmZDb3VudCwgU2lnbjsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKHZpZGVvQ29tcCAhPSBPTVhfVkNfTFVNSU5BTkNFKSAmJiAodmlkZW9Db21wICE9IE9NWF9WQ19DSFJPTUlOQU5DRSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KKyAgICAKKyAgICAvKiBsaW5lYXIgaW50cmEgREMgbW9kZSAqLworICAgIGlmKHNob3J0VmlkZW9IZWFkZXIpCisgICAgeworICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgfQorICAgIC8qIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlICovCisgICAgZWxzZQorICAgIHsKKyAgICAKKyAgICAgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBRUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDkgJiYgUVAgPD0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCArIDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoMiAqIFFQKSAtIDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogRGVxdWFudCB0aGUgREMgdmFsdWUsIHRoaXMgYXBwbGllcyB0byBib3RoIHRoZSBtZXRob2RzICovCisgICAgcFNyY0RzdFswXSA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKKworICAgIC8qIFNhdHVyYXRlICovCisgICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKKworICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KKyAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisKKyAgICAgICAgaWYgKFFQICYgMHgxKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVAgLSAxOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisKKyAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBjNTliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludGVyIHRleHR1cmUgZGF0YQorICogCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIoCisgICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfUzE2ICogcFJlYywKKyAgICAgT01YX1U4IFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkIAorICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmZmVyWzcyXTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZmZlcjsKKyAgICBPTVhfSU5UIGk7CisgICAgICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWZmZXIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmZmVyKTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBvbXhWQ000UDJfRENUOHg4YmxrIChwU3JjLCBwRHN0KTsKKyAgICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAorICAgICBwRHN0LAorICAgICBRUCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICB7CisgICAgICAgIHBUZW1wQnVmZmVyW2ldID0gcERzdFtpXTsKKyAgICB9CisKKyAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZmZlciwKKyAgICAgUVApOworICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZmZlciwgcFJlYyk7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ0NGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludHJhIHRleHR1cmUgZGF0YQorICogCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCisgKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCisgKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAorICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAorICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKKyAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAorICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCisgKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAorICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKKyAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKKyAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKKyAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKKyAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKKyAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKKyAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCisgKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAorICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCisgKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKKyAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKKyAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKKyAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCisgKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKKyAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAorICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCisgKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKKyAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCisgKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAorICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCisgKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCisgKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAorICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAorICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAorICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKKyAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgIHBTcmMsIHBSZWMuICAKKyAqCisgKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4ICogcFJlYywKKyAgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfVTggY3VyUXAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2IHRlbXBCdWYzWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjIsKnBUZW1wQnVmMzsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YX1U4ICBmbGFnOworICAgIE9NWF9JTlQgeCwgeSwgY291bnQsIHByZWREaXI7CisgICAgT01YX0lOVCBwcmVkUVAsIEFDUHJlZEZsYWc7CisgICAgCisKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKKyAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7CisgICAgcFRlbXBCdWYzID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjMpOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZUFDUHJlZGljdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFN1bUVyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFwQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoZHN0U3RlcCA8PSAwKSB8fAorICAgICAgICAgICAgICAgIChkc3RTdGVwICYgNykgfHwgKHNyY1N0ZXAgJiA3KQorICAgICAgICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA5KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtUmV0QXJnRXJySWYoKGN1clFwIDw9IDApIHx8IChjdXJRcCA+PTMyKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisKKyAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLworICAgIGlmIChibG9ja0luZGV4IDw9IDMpCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7CisgICAgfQorICAgIC8qIENvbnZlcnRpbmcgZnJvbSAyLWQgdG8gMS1kIGJ1ZmZlciAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvcih4PSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFNyY1soeSpzcmNTdGVwKSArIHhdOworICAgICAgICB9CisgICAgfQorCisgICAgb214VkNNNFAyX0RDVDh4OGJsayAgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAorICAgICAgICBwVGVtcEJ1ZjIsCisgICAgICAgIGN1clFwLAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKworICAgIC8qIENvbnZlcnRpbmcgZnJvbSAxLUQgdG8gMi1EIGJ1ZmZlciAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc3RvcmluZyB0ZW1wYnVmMiB0byB0ZW1wYnVmMSAqLworICAgICAgICAgICAgcFRlbXBCdWYxW2NvdW50XSA9IHBUZW1wQnVmMltjb3VudF07CisgICAgICAgICAgICBwRHN0Wyh5KmRzdFN0ZXApICsgeF0gPSBwVGVtcEJ1ZjJbY291bnRdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQUMgYW5kIERDIHByZWRpY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcFByZWRCdWZSb3csCisgICAgICAgIHBQcmVkQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFwQnVmKTsKKworICAgIGFybVJldERhdGFFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZsYWcgPSAxOworICAgIGlmICgqcFN1bUVyciA8IDApCisgICAgeworICAgICAgICBBQ1ByZWRGbGFnID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQUNQcmVkRmxhZyA9IDE7CisgICAgfQorCisgICAgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICAgICBwVGVtcEJ1ZjIsCisgICAgICAgIHBQcmVBQ1ByZWRpY3QsCisgICAgICAgIHBQcmVkQnVmUm93LAorICAgICAgICBwUHJlZEJ1ZkNvbCwKKyAgICAgICAgY3VyUXAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wLAorICAgICAgICBmbGFnLAorICAgICAgICBwU3VtRXJyKTsKKworICAgIC8qIFJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIGRhdGEgKi8KKyAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIGN1clFwLAorICAgICAgICB2aWRlb0NvbXAsCisgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMyk7CisgICAgZm9yKGNvdW50ID0gMDsgY291bnQgPCA2NDsgY291bnQrKykKKyAgICB7CisgICAgICAgIHBSZWNbY291bnRdID0gYXJtTWF4KDAscFRlbXBCdWYzW2NvdW50XSk7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjZjJlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENIRUNLX01FTU9SWV9VU0FHRSBwcmludHMgYW5kIHN1bXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY2FsbHMgdG8KKyAqIEgyNjRTd0RlY01hbGxvYygpICovCisvKiAjZGVmaW5lIENIRUNLX01FTU9SWV9VU0FHRSAqLworCisvKiBfTk9fT1VUIGRpc2FibGVzIG91dHB1dCBmaWxlIHdyaXRpbmcgKi8KKy8qICNkZWZpbmUgX05PX09VVCAqLworCisvKiBEZWJ1ZyBwcmludHMgKi8KKyNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKKworLyogQ1ZTIHRhZyBuYW1lIGZvciBpZGVudGlmaWNhdGlvbiAqLworY29uc3QgY2hhciB0YWdOYW1lWzI1Nl0gPSAiJE5hbWU6IEZJUlNUX0FORFJPSURfQ09QWVJJR0hUICQiOworCit2b2lkIFdyaXRlT3V0cHV0KGNoYXIgKmZpbGVuYW1lLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOwordTMyIE5leHRQYWNrZXQodTggKipwU3RybSk7Cit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpOworCisvKiBHbG9iYWwgdmFyaWFibGVzIGZvciBzdHJlYW0gaGFuZGxpbmcgKi8KK3U4ICpzdHJlYW1TdG9wID0gTlVMTDsKK3UzMiBwYWNrZXRpemUgPSAwOwordTMyIG5hbFVuaXRTdHJlYW0gPSAwOworRklMRSAqZm91dHB1dCA9IE5VTEw7CisKKyNpZmRlZiBTT0NfREVTSUdORVIKKworLy8gSW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZGVmaW5lZCBpbiBJbml0Q2FjaGUucworZXh0ZXJuIHZvaWQgY2FjaGVfaW5pdCh2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICAkU3ViJCRtYWluCisKKyAgICBQdXJwb3NlOgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBDIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24gYW5kCisgICAgICAgIGJlZm9yZSBtYWluLiBJdHMgcHVycG9zZSBpcyB0byBkbyBhbnkgZnVydGhlciBpbml0aWFsaXNhdGlvbiBiZWZvcmUgdGhlCisgICAgICAgIGFwcGxpY2F0aW9uIHN0YXJ0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50ICRTdWIkJG1haW4oY2hhciBhcmdjLCBjaGFyICogYXJndltdKQoreworICBjYWNoZV9pbml0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIHNvbWUgZXh0cmEgc2V0dXAgd29yayBzZXR0aW5nIHVwIGNhY2hlcworICByZXR1cm4gJFN1cGVyJCRtYWluKGFyZ2MsIGFyZ3YpOyAvLyBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIG1haW4gZnVuY3Rpb24gb2YgZGVjb2RlciB0ZXN0YmVuY2guIFByb3ZpZGVzIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKKyAgICAgICAgd2l0aCBmaWxlIEkvTyBmb3IgSC4yNjQgZGVjb2Rlci4gUHJpbnRzIG91dCB0aGUgdXNhZ2UgaW5mb3JtYXRpb24KKyAgICAgICAgd2hlbiBleGVjdXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCisgICAgdTMyIGksIHRtcDsKKyAgICB1MzIgbWF4TnVtUGljcyA9IDA7CisgICAgdTggKmJ5dGVTdHJtU3RhcnQ7CisgICAgdTggKmltYWdlRGF0YTsKKyAgICB1OCAqdG1wSW1hZ2UgPSBOVUxMOworICAgIHUzMiBzdHJtTGVuOworICAgIHUzMiBwaWNTaXplOworICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKKyAgICBIMjY0U3dEZWNSZXQgcmV0OworICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OworICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7CisgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOworICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKKyAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIGRlY1ZlcjsKKyAgICB1MzIgcGljRGVjb2RlTnVtYmVyOworICAgIHUzMiBwaWNEaXNwbGF5TnVtYmVyOworICAgIHUzMiBudW1FcnJvcnMgPSAwOworICAgIHUzMiBjcm9wRGlzcGxheSA9IDA7CisgICAgdTMyIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMDsKKworICAgIEZJTEUgKmZpbnB1dDsKKworICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICIiOworCisgICAgLyogUHJpbnQgQVBJIHZlcnNpb24gbnVtYmVyICovCisgICAgZGVjVmVyID0gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbigpOworICAgIERFQlVHKCgiSC4yNjQgRGVjb2RlciBBUEkgdiVkLiVkXG4iLCBkZWNWZXIubWFqb3IsIGRlY1Zlci5taW5vcikpOworCisgICAgLyogUHJpbnQgdGFnIG5hbWUgaWYgJy1UJyBhcmd1bWVudCBwcmVzZW50ICovCisgICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCisgICAgeworICAgICAgICBERUJVRygoIiVzXG4iLCB0YWdOYW1lKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQorICAgICAqIGluZm9ybWF0aW9uIG91dCAqLworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIERFQlVHKCgKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUuaDI2NFxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pKTsKKyAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2Vsc2UKKyAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0X3d4eHhoeXl5Lnl1dilcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKKyNlbmRpZgorICAgICAgICBERUJVRygoIlx0LVAgcGFja2V0LWJ5LXBhY2tldCBtb2RlXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtVSBOQUwgdW5pdCBzdHJlYW0gbW9kZVxuIikpOworICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOworICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisgICAgZm9yIChpID0gMTsgaSA8ICh1MzIpKGFyZ2MtMSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFja2V0aXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItVSIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYWxVbml0U3RyZWFtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVIiKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nLCBmaWxlIG5hbWUgZ2l2ZW4gYnkgdXNlci4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy0xXSwicmIiKTsKKyAgICBpZiAoZmlucHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBPUEVOIElOUFVUIEZJTEVcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIHNpemUgb2YgdGhlIGlucHV0IGZpbGUgLT4gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgKi8KKyAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOworICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgcmV3aW5kKGZpbnB1dCk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIuIGlmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCisgICAgYnl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOworICAgIGlmIChieXRlU3RybVN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIGZyb20gZmlsZSB0byBidWZmZXIgYW5kIGNsb3NlIGlucHV0IGZpbGUgKi8KKyAgICBmcmVhZChieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLworICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKKyAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICB7CisgICAgICAgIERFQlVHKCgiREVDT0RFUiBJTklUSUFMSVpBVElPTiBGQUlMRURcbiIpKTsKKyAgICAgICAgZnJlZShieXRlU3RybVN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCisgICAgc3RyZWFtU3RvcCA9IGJ5dGVTdHJtU3RhcnQgKyBzdHJtTGVuOworICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OworICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgLyogZ2V0IHBvaW50ZXIgdG8gbmV4dCBwYWNrZXQgYW5kIHRoZSBzaXplIG9mIHBhY2tldAorICAgICAqIChmb3IgcGFja2V0aXplIG9yIG5hbFVuaXRTdHJlYW0gbW9kZXMpICovCisgICAgaWYgKCAodG1wID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSkpICE9IDAgKQorICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gdG1wOworCisgICAgcGljRGVjb2RlTnVtYmVyID0gcGljRGlzcGxheU51bWJlciA9IDE7CisgICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFBpY3R1cmUgSUQgaXMgdGhlIHBpY3R1cmUgbnVtYmVyIGluIGRlY29kaW5nIG9yZGVyICovCisgICAgICAgIGRlY0lucHV0LnBpY0lkID0gcGljRGVjb2RlTnVtYmVyOworCisgICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7CisKKyAgICAgICAgc3dpdGNoKHJldCkKKyAgICAgICAgeworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgICAgICAvKiBTdHJlYW0gaGVhZGVycyB3ZXJlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkCisgICAgICAgICAgICAgICAgICogLT4gc3RyZWFtIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCisKKyAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgREVCVUcoKCJQcm9maWxlICVkXG4iLCBkZWNJbmZvLnByb2ZpbGUpKTsKKworICAgICAgICAgICAgICAgIERFQlVHKCgiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCkpOworCisgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJDcm9wcGluZyBwYXJhbXM6ICglZCwgJWQpICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBDcm9wcGVkIGZyYW1lIHNpemUgaW4gcGxhbmFyIFlVViA0OjI6MCAqLworICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ2UgPSBtYWxsb2MocGljU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBJbWFnZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIG91dHB1dCBmcmFtZSBzaXplIGluIHBsYW5hciBZVVYgNDoyOjAgKi8KKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8ucGljV2lkdGggKiBkZWNJbmZvLnBpY0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBERUJVRygoInZpZGVvUmFuZ2UgJWQsIG1hdHJpeENvZWZmaWNpZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5mby52aWRlb1JhbmdlLCBkZWNJbmZvLm1hdHJpeENvZWZmaWNpZW50cykpOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKworICAgICAgICAgICAgICAgIC8qIElmIC1PIG9wdGlvbiBub3QgdXNlZCwgZ2VuZXJhdGUgZGVmYXVsdCBmaWxlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAob3V0RmlsZU5hbWVbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRGaWxlTmFtZSwgIm91dF93JWRoJWQueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6CisgICAgICAgICAgICAgICAgLyogUGljdHVyZSBpcyByZWFkeSBhbmQgbW9yZSBkYXRhIHJlbWFpbnMgaW4gaW5wdXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICogLT4gdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKKworICAgICAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wSW1hZ2UscGljU2l6ZSkgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYXQKKyAgICAgICAgICAgICAgICAgKiBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgY2FzZSAqLworCisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pOworCisgICAgICAgICAgICAgICAgLyogSWYgZW5vdWdoIHBpY3R1cmVzIGRlY29kZWQgLT4gZm9yY2UgZGVjb2RpbmcgdG8gZW5kCisgICAgICAgICAgICAgICAgICogYnkgc2V0dGluZyB0aGF0IG5vIG1vcmUgc3RyZWFtIGlzIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIHBpY0RlY29kZU51bWJlciA9PSBtYXhOdW1QaWNzKQorICAgICAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gMDsKKworICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBkZWNvZGluZyBudW1iZXIgZm9yIGV2ZXJ5IGRlY29kZWQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgIHBpY0RlY29kZU51bWJlcisrOworCisgICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQorICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcworICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLworICAgICAgICAgICAgICAgIHdoaWxlICggSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDApID09CisgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBERUJVRygoIlBJQyAlZCwgdHlwZSAlcyIsIHBpY0Rpc3BsYXlOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNEaXNwbGF5TnVtYmVyICE9IGRlY1BpY3R1cmUucGljSWQpCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgZGVjb2RlZCBwaWMgJWQiLCBkZWNQaWN0dXJlLnBpY0lkKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNQaWN0dXJlLm5ick9mRXJyTUJzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgY29uY2VhbGVkICVkXG4iLCBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGRpc3BsYXkgbnVtYmVyIGZvciBldmVyeSBkaXNwbGF5ZWQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgICAgICBwaWNEaXNwbGF5TnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxkZWNJbmZvKSBhbHdheXMgaW5pdGlhbGl6ZWQgaWYgcGljdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICogYXZhaWxhYmxlIGZvciBkaXNwbGF5ICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgb3V0cHV0IHBpY3R1cmUgdG8gZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjSW5mby5jcm9wUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIHRtcEltYWdlLCBwaWNTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCBpbWFnZURhdGEsIHBpY1NpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgorICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6CisgICAgICAgICAgICAgICAgLyogSW5wdXQgc3RyZWFtIHdhcyBkZWNvZGVkIGJ1dCBubyBwaWN0dXJlIGlzIHJlYWR5CisgICAgICAgICAgICAgICAgICogLT4gR2V0IG1vcmUgZGF0YSAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERUJVRygoIkZBVEFMIEVSUk9SXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIH0KKyAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLworICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKKworICAgIC8qIGlmIG91dHB1dCBpbiBkaXNwbGF5IG9yZGVyIGlzIHByZWZlcnJlZCwgdGhlIGRlY29kZXIgc2hhbGwgYmUgZm9yY2VkCisgICAgICogdG8gb3V0cHV0IHBpY3R1cmVzIHJlbWFpbmluZyBpbiBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBVc2UgZnVuY3Rpb24KKyAgICAgKiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24KKyAgICAgKiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMgYXJlIHJlYWR5IGZvciBkaXNwbGF5LiBTZWNvbmQgcGFyYW1ldGVyCisgICAgICogZm9yIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gJzEnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBlbmQgb2YgdGhlCisgICAgICogc3RyZWFtIGFuZCBhbGwgcGljdHVyZXMgc2hhbGwgYmUgb3V0cHV0ICovCisgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICB7CisgICAgICAgIERFQlVHKCgiUElDICVkLCB0eXBlICVzIiwgcGljRGlzcGxheU51bWJlciwKKyAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIpKTsKKyAgICAgICAgaWYgKHBpY0Rpc3BsYXlOdW1iZXIgIT0gZGVjUGljdHVyZS5waWNJZCkKKyAgICAgICAgICAgIERFQlVHKCgiLCBkZWNvZGVkIHBpYyAlZCIsIGRlY1BpY3R1cmUucGljSWQpKTsKKyAgICAgICAgaWYgKGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiLCBjb25jZWFsZWQgJWRcbiIsIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBERUJVRygoIlxuIikpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICBudW1FcnJvcnMgKz0gZGVjUGljdHVyZS5uYnJPZkVyck1CczsKKworICAgICAgICAvKiBJbmNyZW1lbnQgZGlzcGxheSBudW1iZXIgZm9yIGV2ZXJ5IGRpc3BsYXllZCBwaWN0dXJlICovCisgICAgICAgIHBpY0Rpc3BsYXlOdW1iZXIrKzsKKworICAgICAgICAvKiBXcml0ZSBvdXRwdXQgcGljdHVyZSB0byBmaWxlICovCisgICAgICAgIGltYWdlRGF0YSA9ICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKKyAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0LAorICAgICAgICAgICAgICAgICZkZWNJbmZvLmNyb3BQYXJhbXMpOworICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIGltYWdlRGF0YSwgcGljU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOworCisgICAgaWYgKGZvdXRwdXQpCisgICAgICAgIGZjbG9zZShmb3V0cHV0KTsKKworICAgIC8qIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOworICAgIGZyZWUodG1wSW1hZ2UpOworCisgICAgREVCVUcoKCJPdXRwdXQgZmlsZTogJXNcbiIsIG91dEZpbGVOYW1lKSk7CisKKyAgICBERUJVRygoIkRFQ09ESU5HIERPTkVcbiIpKTsKKyAgICBpZiAobnVtRXJyb3JzIHx8IHBpY0RlY29kZU51bWJlciA9PSAxKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJFUlJPUlMgRk9VTkRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUuIFNpemUgb2YgdGhlCisgICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChjaGFyICpmaWxlbmFtZSwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQoreworCisgICAgLyogZm91dHB1dCBpcyBnbG9iYWwgZmlsZSBwb2ludGVyICovCisgICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcsIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGRlZmluZS4KKyAgICAgICAgICogSWYgZmlsZSBvcGVuIGZhaWxzIC0+IGV4aXQgKi8KKyAgICAgICAgaWYgKHN0cmNtcChmaWxlbmFtZSwgIm5vbmUiKSAhPSAwKQorICAgICAgICB7CisjaWYgIWRlZmluZWQoX05PX09VVCkKKyAgICAgICAgICAgIGZvdXRwdXQgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgICAgICAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIE9QRU4gT1VUUFVUIEZJTEVcbiIpKTsKKyAgICAgICAgICAgICAgICBleGl0KDEwMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3V0cHV0ICYmIGRhdGEpCisgICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmb3V0cHV0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IE5leHRQYWNrZXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIEdldCB0aGUgcG9pbnRlciB0byBzdGFydCBvZiBuZXh0IHBhY2tldCBpbiBpbnB1dCBzdHJlYW0uIFVzZXMKKyAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyAncGFja2V0aXplJyBhbmQgJ25hbFVuaXRTdHJlYW0nIHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgZGVjb2RlciBpbnB1dCBzdHJlYW0gbW9kZSBhbmQgJ3N0cmVhbVN0b3AnIHRvIGRldGVybWluZSB0aGUgZW5kCisgICAgICAgIG9mIHN0cmVhbS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0cmVhbSBtb2RlczoKKyAgICAgICAgICAgIGRlZmF1bHQgLSB0aGUgd2hvbGUgc3RyZWFtIGF0IG9uY2UKKyAgICAgICAgICAgIHBhY2tldGl6ZSAtIGEgc2luZ2xlIE5BTC11bml0IHdpdGggc3RhcnQgY29kZSBwcmVmaXgKKyAgICAgICAgICAgIG5hbFVuaXRTdHJlYW0gLSBhIHNpbmdsZSBOQUwtdW5pdCB3aXRob3V0IHN0YXJ0IGNvZGUgcHJlZml4CisKKyAgICAgICAgcFN0cm0gc3RvcmVzIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHByZXZpb3VzIGRlY29kZXIgaW5wdXQgYW5kIGlzCisgICAgICAgIHJlcGxhY2VkIHdpdGggcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjb2RlciBpbnB1dC4KKworICAgICAgICBSZXR1cm5zIHRoZSBwYWNrZXQgc2l6ZSBpbiBieXRlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIE5leHRQYWNrZXQodTggKipwU3RybSkKK3sKKworICAgIHUzMiBpbmRleDsKKyAgICB1MzIgbWF4SW5kZXg7CisgICAgdTMyIHplcm9Db3VudDsKKyAgICB1OCAqc3RyZWFtOworICAgIHU4IGJ5dGU7CisgICAgc3RhdGljIHUzMiBwcmV2SW5kZXg9MDsKKworICAgIC8qIEZvciBkZWZhdWx0IHN0cmVhbSBtb2RlIGFsbCB0aGUgc3RyZWFtIGlzIGluIGZpcnN0IHBhY2tldCAqLworICAgIGlmICghcGFja2V0aXplICYmICFuYWxVbml0U3RyZWFtKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGluZGV4ID0gMDsKKyAgICBzdHJlYW0gPSAqcFN0cm0gKyBwcmV2SW5kZXg7CisgICAgbWF4SW5kZXggPSAodTMyKShzdHJlYW1TdG9wIC0gc3RyZWFtKTsKKworICAgIGlmIChtYXhJbmRleCA9PSAwKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICAvKiBsZWFkaW5nIHplcm9zIG9mIGZpcnN0IE5BTCB1bml0ICovCisgICAgZG8KKyAgICB7CisgICAgICAgIGJ5dGUgPSBzdHJlYW1baW5kZXgrK107CisgICAgfSB3aGlsZSAoYnl0ZSAhPSAxICYmIGluZGV4IDwgbWF4SW5kZXgpOworCisgICAgLyogaW52YWxpZCBzdGFydCBjb2RlIHByZWZpeCAqLworICAgIGlmIChpbmRleCA9PSBtYXhJbmRleCB8fCBpbmRleCA8IDMpCisgICAgeworICAgICAgICBERUJVRygoIklOVkFMSUQgQllURSBTVFJFQU1cbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIC8qIG5hbFVuaXRTdHJlYW0gaXMgd2l0aG91dCBzdGFydCBjb2RlIHByZWZpeCAqLworICAgIGlmIChuYWxVbml0U3RyZWFtKQorICAgIHsKKyAgICAgICAgc3RyZWFtICs9IGluZGV4OworICAgICAgICBtYXhJbmRleCAtPSBpbmRleDsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAvKiBTZWFyY2ggc3RyZWFtIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4ICovCisgICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYnl0ZSA9IHN0cmVhbVtpbmRleCsrXTsKKyAgICAgICAgaWYgKCFieXRlKQorICAgICAgICAgICAgemVyb0NvdW50Kys7CisKKyAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3RhcnQgY29kZSBwcmVmaXggaGFzIHR3byB6ZXJvcworICAgICAgICAgICAgICogVGhpcmQgemVybyBpcyBhc3N1bWVkIHRvIGJlIGxlYWRpbmcgemVybyBvZiBuZXh0IHBhY2tldAorICAgICAgICAgICAgICogRm91cnRoIGFuZCBtb3JlIHplcm9zIGFyZSBhc3N1bWVkIHRvIGJlIHRyYWlsaW5nIHplcm9zIG9mIHRoaXMKKyAgICAgICAgICAgICAqIHBhY2tldCAqLworICAgICAgICAgICAgaWYgKHplcm9Db3VudCA+IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXggLT0gNDsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgLT0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCAtPSB6ZXJvQ291bnQrMTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYnl0ZSkKKyAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAgICAgaWYgKGluZGV4ID09IG1heEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogU3RvcmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KKyAgICAqcFN0cm0gPSBzdHJlYW07CisgICAgcHJldkluZGV4ID0gaW5kZXg7CisKKyAgICAvKiBuYWxVbml0U3RyZWFtIGlzIHdpdGhvdXQgdHJhaWxpbmcgemVyb3MgKi8KKyAgICBpZiAobmFsVW5pdFN0cmVhbSkKKyAgICAgICAgaW5kZXggLT0gemVyb0NvdW50OworCisgICAgcmV0dXJuKGluZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogQ3JvcFBpY3R1cmUKKworICAgIFB1cnBvc2U6CisgICAgICAgIFBlcmZvcm0gY3JvcHBpbmcgZm9yIHBpY3R1cmUuIElucHV0IHBpY3R1cmUgcEluSW1hZ2Ugd2l0aCBkaW1lbnNpb25zCisgICAgICAgIHBpY1dpZHRoIHggcGljSGVpZ2h0IGlzIGNyb3BwZWQgd2l0aCBwQ3JvcFBhcmFtcyBhbmQgdGhlIHJlc3VsdGluZworICAgICAgICBwaWN0dXJlIGlzIHN0b3JlZCBpbiBwT3V0SW1hZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpCit7CisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgb3V0V2lkdGgsIG91dEhlaWdodDsKKyAgICB1OCAqcE91dCwgKnBJbjsKKworICAgIGlmIChwT3V0SW1hZ2UgPT0gTlVMTCB8fCBwSW5JbWFnZSA9PSBOVUxMIHx8IHBDcm9wUGFyYW1zID09IE5VTEwgfHwKKyAgICAgICAgIXBpY1dpZHRoIHx8ICFwaWNIZWlnaHQpCisgICAgeworICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIGlmICggKChwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoKSA+CisgICAgICAgICAgIHBpY1dpZHRoICkgfHwKKyAgICAgICAgICgocENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodCkgPgorICAgICAgICAgICBwaWNIZWlnaHQgKSApCisgICAgeworICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIG91dFdpZHRoID0gcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aDsKKyAgICBvdXRIZWlnaHQgPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodDsKKworICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBsdW1hICovCisgICAgcEluID0gcEluSW1hZ2UgKyBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldDsKKyAgICBwT3V0ID0gcE91dEltYWdlOworCisgICAgLyogQ29weSBsdW1hIHBpeGVsIHZhbHVlcyAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGggLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICBvdXRXaWR0aCA+Pj0gMTsKKyAgICBvdXRIZWlnaHQgPj49IDE7CisKKyAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgY2IgKi8KKyAgICBwSW4gPSBwSW5JbWFnZSArIHBpY1dpZHRoKnBpY0hlaWdodCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKKworICAgIC8qIENvcHkgY2IgcGl4ZWwgdmFsdWVzICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGNyICovCisgICAgcEluID0gcEluSW1hZ2UgKyA1KnBpY1dpZHRoKnBpY0hlaWdodC80ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogQ29weSBjciBwaXhlbCB2YWx1ZXMgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICByZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY1RyYWNlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhcHBlbmRzCisgICAgICAgIHRyYWNlIG1lc3NhZ2VzIHRvIGZpbGUgbmFtZWQgJ2RlY19hcGkudHJjJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKQoreworICAgIEZJTEUgKmZwOworCisgICAgZnAgPSBmb3BlbigiZGVjX2FwaS50cmMiLCAiYXQiKTsKKworICAgIGlmICghZnApCisgICAgICAgIHJldHVybjsKKworICAgIGZ3cml0ZShzdHJpbmcsIDEsIHN0cmxlbihzdHJpbmcpLCBmcCk7CisgICAgZndyaXRlKCJcbiIsIDEsMSwgZnApOworCisgICAgZmNsb3NlKGZwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNYWxsb2MKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWFsbG9jIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWFsbG9jIGZvciBhbGxvY2F0aW9uIG9mIG1lbW9yeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkKK3sKKworI2lmIGRlZmluZWQoQ0hFQ0tfTUVNT1JZX1VTQUdFKQorICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGVjb2RlciBoYXMgdG8gZnJlZSBhbmQgcmVhbGxvY2F0ZSBzb21lIG9mIHRoZSBidWZmZXJzCisgICAgICogdGhlIHRvdGFsIHZhbHVlIHdpbGwgYmUgaW52YWxpZCAqLworICAgIHN0YXRpYyB1MzIgbnVtQnl0ZXMgPSAwOworICAgIG51bUJ5dGVzICs9IHNpemU7CisgICAgREVCVUcoKCJBbGxvY2F0ZWQgJWQgYnl0ZXMsIHRvdGFsICVkXG4iLCBzaXplLCBudW1CeXRlcykpOworI2VuZGlmCisKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKK3sKKyAgICBmcmVlKHB0cik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCit7CisgICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQoreworICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFkYzc1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIG1haW4gZnVuY3Rpb24uIEFzc3VtaW5nIHRoYXQgZXhlY3V0YWJsZSBpcyBuYW1lZCAnZGVjb2RlcicgdGhlIHVzYWdlCisgICAgICAgIGlzIGFzIGZvbGxvd3MKKworICAgICAgICAgICAgZGVjb2RlciBpbnB1dEZpbGVOYW1lCisKKyAgICAgICAgLCB3aGVyZSBpbnB1dEZpbGVOYW1lIHNoYWxsIGJlIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIGgyNjQgc3RyZWFtCisgICAgICAgIGRhdGEuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisKKyAgICB1OCAqYnl0ZVN0cm1TdGFydDsKKyAgICB1OCAqYnl0ZVN0cm07CisgICAgdTMyIHN0cm1MZW47CisgICAgdTMyIHBpY1NpemU7CisgICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIHUzMiBwaWNOdW1iZXI7CisKKyAgICBGSUxFICpmaW5wdXQ7CisgICAgRklMRSAqZm91dHB1dDsKKworICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQorICAgICAqIGluZm9ybWF0aW9uIG91dCAqLworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIHByaW50ZiggIlVzYWdlOiAlcyBmaWxlLmgyNjRcbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogb3BlbiBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZywgb3V0cHV0IGZpbGUgbmFtZWQgb3V0Lnl1di4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZvdXRwdXQgPSBmb3Blbigib3V0Lnl1diIsICJ3YiIpOworICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBPUEVOIE9VVFBVVCBGSUxFXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZywgZmlsZSBuYW1lIGdpdmVuIGJ5IHVzZXIuIElmIGZpbGUgb3BlbgorICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KKyAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtMV0sICJyYiIpOworICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiVU5BQkxFIFRPIE9QRU4gSU5QVVQgRklMRVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBzaXplIG9mIHRoZSBpbnB1dCBmaWxlIC0+IGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzICovCisgICAgZnNlZWsoZmlucHV0LCAwTCwgU0VFS19FTkQpOworICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgcmV3aW5kKGZpbnB1dCk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIsIGV4aXQgaWYgdW5zdWNjZXNzZnVsICovCisgICAgYnl0ZVN0cm0gPSBieXRlU3RybVN0YXJ0ID0gKHU4ICopSDI2NFN3RGVjTWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7CisgICAgaWYgKGJ5dGVTdHJtID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gZnJvbSBmaWxlIHRvIGJ1ZmZlciBhbmQgY2xvc2UgaW5wdXQgZmlsZSAqLworICAgIGZyZWFkKGJ5dGVTdHJtLCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLworICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIDApOworICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJERUNPREVSIElOSVRJQUxJWkFUSU9OIEZBSUxFRFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSAqLworICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OworICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgcGljTnVtYmVyID0gMDsKKworICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIHN0YXJ0IHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCisgICAgICogVGhlIGRlY29kaW5nIHRpbWUgc2hvdWxkIGJlIG1lYXN1cmVkIG92ZXIgc2V2ZXJhbCBmcmFtZXMgYW5kIGFmdGVyCisgICAgICogdGhhdCBhdmVyYWdlIGZwcyAoZnJhbWVzL3NlY29uZCkgY2FuIGJlIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBzdGFydFRpbWUgPSBHZXRUaW1lKCk7CisgICAgICoKKyAgICAgKiBUbyBwcmV2ZW50IGNhbGN1bGF0aW5nIGZpbGUgSS9PIGxhdGVuc2llcyBhcyBhIGRlY29kaW5nIHRpbWUsCisgICAgICogY29tbWVudCBvdXQgV3JpdGVPdXRwdXQgZnVuY3Rpb24gY2FsbC4gQWxzbyBwcmludHMgdG8gc3Rkb3V0IG1pZ2h0CisgICAgICogY29uc3VtZSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGN5Y2xlcyBkdXJpbmcgbWVhc3VyZW1lbnQgKi8KKworICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBjYWxsIEFQSSBmdW5jdGlvbiB0byBwZXJmb3JtIGRlY29kaW5nICovCisgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNJbnN0LCAmZGVjSW5wdXQsICZkZWNPdXRwdXQpOworCisgICAgICAgIHN3aXRjaChyZXQpCisgICAgICAgIHsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6CisKKyAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIGRpbWVuc2lvbnMgYXJlIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCisgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNJbnN0LCAmZGVjSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgc2l6ZSBpbiBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0OworICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIFlDYkNyIDQ6MjowIHBpY3R1cmUgaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIDE2LWJpdCBSR0IgcGljdHVyZSBpbiBieXRlcworICAgICAgICAgICAgICAgICAqIHBpY1NpemUgPSAoZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0KSAqIDI7ICovCisKKyAgICAgICAgICAgICAgICBwcmludGYoIldpZHRoICVkIEhlaWdodCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOworCisgICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQorICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcworICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLworICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMCkgPT0KKyAgICAgICAgICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsgcGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgKiBpbiBSR0ItZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLworCisgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBwaWNTaXplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRDoKKyAgICAgICAgICAgICAgICAvKiBldmFsdWF0aW9uIHZlcnNpb24gb2YgdGhlIGRlY29kZXIgaGFzIGxpbWl0ZWQgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgKiBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIkVWQUxVQVRJT04gTElNSVQgUkVBQ0hFRFxuIik7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJVTlJFQ09WRVJBQkxFIEVSUk9SXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLworICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKKworZW5kOgorCisgICAgLyogaWYgb3V0cHV0IGluIGRpc3BsYXkgb3JkZXIgaXMgcHJlZmVycmVkLCB0aGUgZGVjb2RlciBzaGFsbCBiZSBmb3JjZWQKKyAgICAgKiB0byBvdXRwdXQgcGljdHVyZXMgcmVtYWluaW5nIGluIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIFVzZSBmdW5jdGlvbgorICAgICAqIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbgorICAgICAqIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcyBhcmUgcmVhZHkgZm9yIGRpc3BsYXkuIFNlY29uZCBwYXJhbWV0ZXIKKyAgICAgKiBmb3IgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAnMScgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gYW5kIGFsbCBwaWN0dXJlcyBzaGFsbCBiZSBvdXRwdXQgKi8KKyAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDEpID09CisgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZKSB7CisKKyAgICAgICAgcGljTnVtYmVyKys7CisKKyAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAorICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKKyAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQorICAgICAgICAgKiBpbiBSR0ItZm9ybWF0CisgICAgICAgICAqCisgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLworCisgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBpY1NpemUpOworICAgIH0KKworICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIGVuZCB0aW1lIChpbiBzZWNvbmRzKSBoZXJlLgorICAgICAqCisgICAgICogZW5kVGltZSA9IEdldFRpbWUoKTsKKyAgICAgKgorICAgICAqIE5vdyB0aGUgcGVyZm9ybWFuY2UgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgZnJhbWVzIHBlciBzZWNvbmQ6CisgICAgICogZnBzID0gcGljTnVtYmVyIC8gKGVuZFRpbWUgLSBzdGFydFRpbWUpOyAqLworCisKKyAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOworCisgICAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgICBmY2xvc2UoZm91dHB1dCk7CisKKyAgICAvKiBmcmVlIGJ5dGUgc3RyZWFtIGJ1ZmZlciAqLworICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7CisKKyAgICByZXR1cm4gMDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIFdyaXRlT3V0cHV0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBXcml0ZSBwaWN0dXJlIHBvaW50ZWQgYnkgZGF0YSB0byBmaWxlIHBvaW50ZWQgYnkgZmlkLiBTaXplIG9mIHRoZQorICAgICAgICBwaWN0dXJlIGluIHBpeGVscyBpcyBpbmRpY2F0ZWQgYnkgcGljU2l6ZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCit7CisgICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZpZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjVHJhY2UgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMKKyAgICAgICAgdHJhY2UgbWVzc2FnZXMgdG8gZmlsZSBuYW1lZCAnZGVjX2FwaS50cmMnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYworCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNYWxsb2MgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtYWxsb2MgZm9yIGFsbG9jYXRpb24gb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNGcmVlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSBmb3IgZnJlZWluZyBvZiBtZW1vcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtY3B5IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5IHRvIGNvcHkgc3JjIHRvIGRlc3QuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbXNldCBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbXNldCB0byBzZXQgY29udGVudCBvZiBtZW1vcnkgYXJlYSBwb2ludGVkIGJ5IHB0ci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCit7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBIMjY0U3dEZWNJbml0CisgICAgICAgICAgSDI2NFN3RGVjR2V0SW5mbworICAgICAgICAgIEgyNjRTd0RlY1JlbGVhc2UKKyAgICAgICAgICBIMjY0U3dEZWNEZWNvZGUKKyAgICAgICAgICBIMjY0U3dEZWNHZXRBUElWZXJzaW9uCisgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFZlcnNpb24gSW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgSDI2NFNXREVDX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBIMjY0U1dERUNfTUlOT1JfVkVSU0lPTiAzCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0gyNjRERUNfVFJBQ0UgICAgICAgICAgIFRyYWNlIEgyNjQgRGVjb2RlciBBUEkgZnVuY3Rpb24gY2FsbHMuCitIMjY0REVDX0VWQUxVQVRJT04gICAgICBDb21waWxlIGV2YWx1YXRpb24gdmVyc2lvbiwgcmVzdHJpY3RzIG51bWJlciBvZiBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGRlY29kZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBERUNfQVBJX1RSQyhzdHIpICAgIEgyNjRTd0RlY1RyYWNlKHN0cikKKyNlbHNlCisjZGVmaW5lIERFQ19BUElfVFJDKHN0cikKKyNlbmRpZgorCisjaWZkZWYgSDI2NERFQ19FVkFMVUFUSU9OCisjZGVmaW5lIEgyNjRERUNfRVZBTFVBVElPTl9MSU1JVCAgIDUwMAorI2VuZGlmCisKK3ZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKSB7Cit9CisKK3ZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkgeworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpIHsKKyAgICBmcmVlKHB0cik7Cit9CisKK3ZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KSB7CisgICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOworfQorCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KSB7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0luaXQoKQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBJbml0aWFsaXplIGRlY29kZXIgc29mdHdhcmUuIEZ1bmN0aW9uIHJlc2VydmVzIG1lbW9yeSBmb3IgdGhlCisgICAgICAgICAgICBkZWNvZGVyIGluc3RhbmNlIGFuZCBjYWxscyBoMjY0YnNkSW5pdCB0byBpbml0aWFsaXplIHRoZQorICAgICAgICAgICAgaW5zdGFuY2UgZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcgIGZsYWcgdG8gaW5kaWNhdGUgZGVjb2RlciB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cnkgdG8gcHJvdmlkZSBvdXRwdXQgcGljdHVyZXMgaW4gZGlzcGxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciwgc2F2ZXMgbWVtb3J5CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRlY0luc3QgICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBpbnN0YW5jZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgaW5zdGFuY2UKKyAgICAgICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCAgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSIGludmFsaWQgcGFyYW1ldGVycworICAgICAgICAgICAgSDI2NFNXREVDX01FTV9GQUlMICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZykKK3sKKyAgICB1MzIgcnYgPSAwOworCisgICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIik7CisKKyAgICAvKiBjaGVjayB0aGF0IHJpZ2h0IHNoaWZ0IG9uIG5lZ2F0aXZlIG51bWJlcnMgaXMgcGVyZm9ybWVkIHNpZ25lZCAqLworICAgIC8qbGludCAtc2F2ZSAtZSogZm9sbG93aW5nIGNoZWNrIGNhdXNlcyBtdWx0aXBsZSBsaW50IG1lc3NhZ2VzICovCisgICAgaWYgKCAoKC0xKT4+MSkgIT0gKC0xKSApCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IFJpZ2h0IHNoaWZ0IGlzIG5vdCBzaWduZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19JTklURkFJTCk7CisgICAgfQorICAgIC8qbGludCAtcmVzdG9yZSAqLworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKUgyNjRTd0RlY01hbGxvYyhzaXplb2YoZGVjQ29udGFpbmVyX3QpKTsKKworICAgIGlmIChwRGVjQ29udCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjSW5pdCMgZGVjSW5zdCAlcCBub091dHB1dFJlb3JkZXJpbmcgJWQiLAorICAgICAgICAgICAgKHZvaWQqKWRlY0luc3QsIG5vT3V0cHV0UmVvcmRlcmluZyk7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIHJ2ID0gaDI2NGJzZEluaXQoJnBEZWNDb250LT5zdG9yYWdlLCBub091dHB1dFJlb3JkZXJpbmcpOworICAgIGlmIChydiAhPSBIQU5UUk9fT0spCisgICAgeworICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKHBEZWNDb250KTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKKyAgICB9CisKKyAgICBwRGVjQ29udC0+ZGVjU3RhdCAgPSBJTklUSUFMSVpFRDsKKyAgICBwRGVjQ29udC0+cGljTnVtYmVyID0gMDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNJbml0IyBPSzogcmV0dXJuICVwIiwgKHZvaWQqKXBEZWNDb250KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgKmRlY0luc3QgPSAoZGVjQ29udGFpbmVyX3QgKilwRGVjQ29udDsKKworICAgIHJldHVybihIMjY0U1dERUNfT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjR2V0SW5mbygpCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgcmVhZCBhY2Nlc3MgdG8gZGVjb2RlciBpbmZvcm1hdGlvbi4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVmb3JlIEgyNjRTd0RlY0RlY29kZSBmdW5jdGlvbiBoYXMKKyAgICAgICAgICAgIGluZGljYXRlZCB0aGF0IGhlYWRlcnMgYXJlIHJlYWR5LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcERlY0luZm8gICAgcG9pbnRlciB0byBpbmZvIHN0cnVjdCB3aGVyZSBkYXRhIGlzIHdyaXR0ZW4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZICBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHlldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsIEgyNjRTd0RlY0luZm8gKnBEZWNJbmZvKQoreworCisgICAgc3RvcmFnZV90ICpwU3RvcmFnZTsKKworICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjSW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIEVSUk9SOiBkZWNJbnN0IG9yIHBEZWNJbmZvIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIHBTdG9yYWdlID0gJigoKGRlY0NvbnRhaW5lcl90ICopZGVjSW5zdCktPnN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgPT0gTlVMTCB8fCBwU3RvcmFnZS0+YWN0aXZlUHBzID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgRVJST1I6IEhlYWRlcnMgbm90IGRlY29kZWQgeWV0Iik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfSERSU19OT1RfUkRZKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZigoKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0KS0+c3RyLAorICAgICAgICAiSDI2NFN3RGVjR2V0SW5mbyMgZGVjSW5zdCAlcCAgcERlY0luZm8gJXAiLCBkZWNJbnN0LCAodm9pZCopcERlY0luZm8pOworICAgIERFQ19BUElfVFJDKCgoZGVjQ29udGFpbmVyX3QqKWRlY0luc3QpLT5zdHIpOworI2VuZGlmCisKKyAgICAvKiBoMjY0YnNkUGljV2lkdGggYW5kIC1IZWlnaHQgcmV0dXJuIGRpbWVuc2lvbnMgaW4gbWFjcm9ibG9jayB1bml0cywKKyAgICAgKiBwaWNXaWR0aCBhbmQgLUhlaWdodCBpbiBwaXhlbHMgKi8KKyAgICBwRGVjSW5mby0+cGljV2lkdGggICAgICAgID0gaDI2NGJzZFBpY1dpZHRoKHBTdG9yYWdlKSA8PCA0OworICAgIHBEZWNJbmZvLT5waWNIZWlnaHQgICAgICAgPSBoMjY0YnNkUGljSGVpZ2h0KHBTdG9yYWdlKSA8PCA0OworICAgIHBEZWNJbmZvLT52aWRlb1JhbmdlICAgICAgPSBoMjY0YnNkVmlkZW9SYW5nZShwU3RvcmFnZSk7CisgICAgcERlY0luZm8tPm1hdHJpeENvZWZmaWNpZW50cyA9IGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMocFN0b3JhZ2UpOworCisgICAgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHBTdG9yYWdlLAorICAgICAgICAmcERlY0luZm8tPmNyb3BwaW5nRmxhZywKKyAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKKyAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpOworCisgICAgLyogc2FtcGxlIGFzcGVjdCByYXRpbyAqLworICAgIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJIZWlnaHQpOworCisgICAgLyogcHJvZmlsZSAqLworICAgIHBEZWNJbmZvLT5wcm9maWxlID0gaDI2NGJzZFByb2ZpbGUocFN0b3JhZ2UpOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIE9LIik7CisKKyAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY1JlbGVhc2UoKQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZWxlYXNlIHRoZSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBjYWxscyBoMjY0YnNkU2h1dERvd24gdG8KKyAgICAgICAgICAgIHJlbGVhc2UgaW5zdGFuY2UgZGF0YSBhbmQgZnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZQorICAgICAgICAgICAgaW5zdGFuY2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGVjSW5zdCAgICAgRGVjb2RlciBpbnN0YW5jZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCkKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKworICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCopZGVjSW5zdDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNSZWxlYXNlIyBkZWNJbnN0ICVwIixkZWNJbnN0KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgaDI2NGJzZFNodXRkb3duKCZwRGVjQ29udC0+c3RvcmFnZSk7CisKKyAgICBIMjY0U3dEZWNGcmVlKHBEZWNDb250KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0RlY29kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc3RyZWFtIGRhdGEuIENhbGxzIGgyNjRic2REZWNvZGUgdG8gZG8gdGhlIGFjdHVhbCBkZWNvZGluZy4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKKyAgICAgICAgICAgIHBJbnB1dCAgICAgIHBvaW50ZXIgdG8gaW5wdXQgc3RydWN0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBPdXRwdXQgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHN0cnVjdAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEICAgZGVjb2RlciBpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQgeWV0CisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisKKyAgICAgICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCAgICBzdHJlYW0gYnVmZmVyIGRlY29kZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSAgIGhlYWRlcnMgZGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSAgICAgICAgICAgICAgICAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgICAgICAgICAgICAgICAgICBzZXJpb3VzIGVycm9yIGluIGRlY29kaW5nLCBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgcGFyYW1ldGVyIHNldHMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZWNvZGUgcGljdHVyZSBkYXRhCisgICAgICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gdmVyc2lvbiBpcyB1c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IG51bWJlciBvZiBmcmFtZXMgcmVhY2hlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwgSDI2NFN3RGVjSW5wdXQgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY091dHB1dCAqcE91dHB1dCkKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKyAgICB1MzIgc3RybUxlbjsKKyAgICB1MzIgbnVtUmVhZEJ5dGVzOworICAgIHU4ICp0bXBTdHJlYW07CisgICAgdTMyIGRlY1Jlc3VsdCA9IDA7CisgICAgSDI2NFN3RGVjUmV0IHJldHVyblZhbHVlID0gSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMiKTsKKworICAgIC8qIENoZWNrIHRoYXQgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycyBhcmUgdmFsaWQgKi8KKyAgICBpZiAocElucHV0ID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IHBJbnB1dCBvciBwT3V0cHV0IGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIGlmICgocElucHV0LT5wU3RyZWFtID09IE5VTEwpIHx8IChwSW5wdXQtPmRhdGFMZW4gPT0gMCkpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKWRlY0luc3Q7CisKKyAgICAvKiBDaGVjayBpZiBkZWNvZGVyIGlzIGluIGFuIGluY29ycmVjdCBtb2RlICovCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjQ29udC0+ZGVjU3RhdCA9PSBVTklOSVRJQUxJWkVEKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IERlY29kZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX0VWQUxVQVRJT04KKyAgICBpZiAocERlY0NvbnQtPnBpY051bWJlciA+PSBIMjY0REVDX0VWQUxVQVRJT05fTElNSVQpCisgICAgICAgIHJldHVybihIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCk7CisjZW5kaWYKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNEZWNvZGUjIGRlY0luc3QgJXAgIHBJbnB1dCAlcCAgcE91dHB1dCAlcCIsCisgICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcElucHV0LCAodm9pZCopcE91dHB1dCk7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyAgID0gTlVMTDsKKworICAgIG51bVJlYWRCeXRlcyA9IDA7CisgICAgc3RybUxlbiA9IHBJbnB1dC0+ZGF0YUxlbjsKKyAgICB0bXBTdHJlYW0gPSBwSW5wdXQtPnBTdHJlYW07CisgICAgcERlY0NvbnQtPnN0b3JhZ2UuaW50cmFDb25jZWFsbWVudEZsYWcgPSBwSW5wdXQtPmludHJhQ29uY2VhbG1lbnRNZXRob2Q7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogUmV0dXJuIEhEUlNfUkRZIGFmdGVyIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLworICAgICAgICBpZiAocERlY0NvbnQtPmRlY1N0YXQgPT0gTkVXX0hFQURFUlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY1Jlc3VsdCA9IEgyNjRCU0RfSERSU19SRFk7CisgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IElOSVRJQUxJWkVEOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogQ29udGludWUgZGVjb2Rpbmcgbm9ybWFsbHkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGVjUmVzdWx0ID0gaDI2NGJzZERlY29kZSgmcERlY0NvbnQtPnN0b3JhZ2UsIHRtcFN0cmVhbSwgc3RybUxlbiwKKyAgICAgICAgICAgICAgICBwSW5wdXQtPnBpY0lkLCAmbnVtUmVhZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICB0bXBTdHJlYW0gKz0gbnVtUmVhZEJ5dGVzOworICAgICAgICAvKiBjaGVjayBpZiB0b28gbWFueSBieXRlcyBhcmUgcmVhZCBmcm9tIHN0cmVhbSAqLworICAgICAgICBpZiAoIChpMzIpKHN0cm1MZW4gLSBudW1SZWFkQnl0ZXMpID49IDAgKQorICAgICAgICAgICAgc3RybUxlbiAtPSBudW1SZWFkQnl0ZXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cm1MZW4gPSAwOworCisgICAgICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyA9IHRtcFN0cmVhbTsKKworICAgICAgICBzd2l0Y2ggKGRlY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX0hEUlNfUkRZOgorCisgICAgICAgICAgICAgICAgaWYocERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5mbHVzaGVkICYmCisgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5udW1PdXQgIT0KKyAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPm91dEluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IGZpcnN0IGFsbCBEUEIgc3RvcmVkIHBpY3R1cmVzCisgICAgICAgICAgICAgICAgICAgICAqIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLworICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPmZsdXNoZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IE5FV19IRUFERVJTOworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOworICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BJQ19SRFk6CisgICAgICAgICAgICAgICAgcERlY0NvbnQtPnBpY051bWJlcisrOworCisgICAgICAgICAgICAgICAgaWYgKHN0cm1MZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk7CisKKyAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBpZiAoICFoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cygmcERlY0NvbnQtPnN0b3JhZ2UpICYmCisgICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfU1RSTV9FUlI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX01FTUFMTE9DX0VSUk9SOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfTUVNRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoc3RybUxlbik7CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjRGVjb2RlIyBPSzogRGVjUmVzdWx0ICVkIiwKKyAgICAgICAgICAgIHJldHVyblZhbHVlKTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuKHJldHVyblZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0dldEFQSVZlcnNpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmV0dXJuIHZlcnNpb24gaW5mb3JtYXRpb24gb2YgdGhlIEFQSQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBBUEkgdmVyc2lvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24oKQoreworICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gdmVyOworCisgICAgdmVyLm1ham9yID0gSDI2NFNXREVDX01BSk9SX1ZFUlNJT047CisgICAgdmVyLm1pbm9yID0gSDI2NFNXREVDX01JTk9SX1ZFUlNJT047CisKKyAgICByZXR1cm4odmVyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNOZXh0UGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIgaWYgYW55IGF2YWlsYWJsZS4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UuCisgICAgICAgICAgICBmbHVzaEJ1ZmZlciBmb3JjZSBvdXRwdXQgb2YgYWxsIGJ1ZmZlcmVkIHBpY3R1cmVzCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgcE91dHB1dCAgICAgcG9pbnRlciB0byBvdXRwdXQgc3RydWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgICAgIG5vIHBpY3R1cmVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheQorICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgICAgICAgcGljdHVyZSBhdmFpbGFibGUgZm9yIGRpc3BsYXkKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgIGludmFsaWQgcGFyYW1ldGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjTmV4dFBpY3R1cmUoSDI2NFN3RGVjSW5zdCBkZWNJbnN0LAorICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsIHUzMiBmbHVzaEJ1ZmZlcikKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKyAgICB1MzIgbnVtRXJyTWJzLCBpc0lkclBpYywgcGljSWQ7CisgICAgdTMyICpwT3V0UGljOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIEVSUk9SOiBkZWNJbnN0IG9yIHBPdXRwdXQgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7CisgICAgfQorCisgICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QqKWRlY0luc3Q7CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIGRlY0luc3QgJXAgcE91dHB1dCAlcCAlcyAlZCIsCisgICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcE91dHB1dCwgImZsdXNoQnVmZmVyIiwgZmx1c2hCdWZmZXIpOworICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOworI2VuZGlmCisKKyAgICBpZiAoZmx1c2hCdWZmZXIpCisgICAgICAgIGgyNjRic2RGbHVzaEJ1ZmZlcigmcERlY0NvbnQtPnN0b3JhZ2UpOworCisgICAgcE91dFBpYyA9ICh1MzIqKWgyNjRic2ROZXh0T3V0cHV0UGljdHVyZSgmcERlY0NvbnQtPnN0b3JhZ2UsICZwaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0lkclBpYywgJm51bUVyck1icyk7CisKKyAgICBpZiAocE91dFBpYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19PSyIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE91dHB1dC0+cE91dHB1dFBpY3R1cmUgPSBwT3V0UGljOworICAgICAgICBwT3V0cHV0LT5waWNJZCAgICAgICAgICA9IHBpY0lkOworICAgICAgICBwT3V0cHV0LT5pc0lkclBpY3R1cmUgICA9IGlzSWRyUGljOworICAgICAgICBwT3V0cHV0LT5uYnJPZkVyck1CcyAgICA9IG51bUVyck1iczsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19QSUNfUkRZIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUElDX1JEWSk7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjE3MGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBDVlMgdGFnIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uICovCitjb25zdCBjaGFyIHRhZ05hbWVbMjU2XSA9ICIkTmFtZTogRklSU1RfQU5EUk9JRF9DT1BZUklHSFQgJCI7CisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIERFQlVHKGFyZ3YpIHByaW50ZiBhcmd2CisKKy8qIF9OT19PVVQgZGlzYWJsZXMgb3V0cHV0IGZpbGUgd3JpdGluZyAqLworI2lmZGVmIF9fYXJtCisjZGVmaW5lIF9OT19PVVQKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7CisKK3UzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCisgICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcyk7CisKK3ZvaWQgQ3JvcFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAorICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIEZJTEUgKmZvdXRwdXQ7CisgICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdOworICAgIHU4ICpieXRlU3RybVN0YXJ0OworICAgIHUzMiBwaWNOdW1iZXI7Cit9IERlY29kZXI7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworICAgIGkzMiBpbnN0Q291bnQsIGluc3RSdW5uaW5nOworICAgIGkzMiBpOworICAgIHUzMiBtYXhOdW1QaWNzOworICAgIHUzMiBzdHJtTGVuOworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgdTMyIG51bUVycm9ycyA9IDA7CisgICAgdTMyIGNyb3BEaXNwbGF5ID0gMDsKKyAgICB1MzIgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAwOworICAgIEZJTEUgKmZpbnB1dDsKKyAgICBEZWNvZGVyICoqZGVjb2RlcjsKKyAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl0gPSAib3V0Lnl1diI7CisKKworICAgIGlmICggYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItVCIpID09IDAgKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgdGFnTmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIERFQlVHKCgKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUxLjI2NCBbZmlsZTIuMjY0XSAuLiBbZmlsZU4uMjY0XVxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pKTsKKyAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2Vsc2UKKyAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0Lnl1dilcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKKyNlbmRpZgorICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOworICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIGluc3RDb3VudCA9IGFyZ2MgLSAxOworCisgICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisgICAgbWF4TnVtUGljcyA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IChhcmdjLTEpOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1OIiwgMikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heE51bVBpY3MgPSAodTMyKWF0b2koYXJndltpXSsyKTsKKyAgICAgICAgICAgIGluc3RDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUiIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDE7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnN0Q291bnQgPCAxKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJObyBpbnB1dCBmaWxlc1xuIikpOworICAgICAgICBleGl0KDEwMCk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBtdWx0aXBsZSBkZWNvZGVyIGluc3RhbmNlcworICAgICAqIG9uZSBpbnN0YW5jZSBmb3IgZXZlcnkgc3RyZWFtIGZpbGUgKi8KKyAgICBkZWNvZGVyID0gKERlY29kZXIgKiopbWFsbG9jKHNpemVvZihEZWNvZGVyKikqKHUzMilpbnN0Q291bnQpOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIC8qIHByZXBhcmUgZWFjaCBkZWNvZGVyIGluc3RhbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgZGVjb2RlcltpXSA9IChEZWNvZGVyICopY2FsbG9jKDEsIHNpemVvZihEZWNvZGVyKSk7CisKKyAgICAgICAgLyogb3BlbiBpbnB1dCBmaWxlICovCisgICAgICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0sInJiIik7CisgICAgICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIDwlcz5cbiIsIGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0pKTsKKyAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIERFQlVHKCgiUmVhZGluZyBpbnB1dCBmaWxlWyVkXSAlc1xuIiwgaSwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOworCisgICAgICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIHRvIGJ1ZmZlciAqLworICAgICAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOworICAgICAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOworICAgICAgICByZXdpbmQoZmlucHV0KTsKKyAgICAgICAgZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOworICAgICAgICBpZiAoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBmcmVhZChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgICAgICBmY2xvc2UoZmlucHV0KTsKKworICAgICAgICAvKiBvcGVuIG91dHB1dCBmaWxlICovCisgICAgICAgIGlmIChzdHJjbXAob3V0RmlsZU5hbWUsICJub25lIikgIT0gMCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoX05PX09VVCkKKyAgICAgICAgICAgIGRlY29kZXJbaV0tPmZvdXRwdXQgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICIlcyVpIiwgb3V0RmlsZU5hbWUsIGkpOworICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IGZvcGVuKGRlY29kZXJbaV0tPm91dEZpbGVOYW1lLCAid2IiKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZVxuIikpOworICAgICAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmKGRlY29kZXJbaV0tPmRlY0luc3QpLCBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyk7CisKKyAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiSW5pdCBmYWlsZWQgJWRcbiIsIHJldCkpOworICAgICAgICAgICAgZXhpdCgxMDApOworICAgICAgICB9CisKKyAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9IGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQ7CisgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKKworICAgIH0KKworICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBkZWNvZGUgb25jZSB1c2luZyBlYWNoIGluc3RhbmNlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY091dHB1dCkpOworCisgICAgICAgICAgICBzd2l0Y2gocmV0KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNvZGVyW2ldLT5kZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIENyb3BwaW5nIHBhcmFtczogKCVkLCAlZCkgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBXaWR0aCAlZCBIZWlnaHQgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5waWNIZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIHZpZGVvUmFuZ2UgJWQsIG1hdHJpY0NvZWZmaWNpZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPmRlY0luZm8udmlkZW9SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ubWF0cml4Q29lZmZpY2llbnRzKSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3M7CisgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX1BJQ19SRFkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAwKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUVycm9ycyArPSBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLm5ick9mRXJyTUJzOworCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWF4TnVtUGljcyAmJiBkZWNvZGVyW2ldLT5waWNOdW1iZXIgPT0gbWF4TnVtUGljcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fRVJSOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BBUkFNX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBGQVRBTCBFUlJPUlxuIiwgaSkpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIGFueSBvZiB0aGUgaW5zdGFuY2VzIGlzIHN0aWxsIHJ1bm5pbmcgKD1oYXMgbW9yZSBkYXRhKSAqLworICAgICAgICBpbnN0UnVubmluZyA9IGluc3RDb3VudDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIGluc3RSdW5uaW5nLS07CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKGluc3RSdW5uaW5nKTsKKworCisgICAgLyogZ2V0IGxhc3QgZnJhbWVzIGFuZCBjbG9zZSBlYWNoIGluc3RhbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNQaWN0dXJlKSwgMSkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY29kZXJbaV0tPnBpY051bWJlcisrOworCisgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAorICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKKyAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQorICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgIH0KKworICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY29kZXJbaV0tPmRlY0luc3QpOworCisgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0KQorICAgICAgICAgICAgZmNsb3NlKGRlY29kZXJbaV0tPmZvdXRwdXQpOworCisgICAgICAgIGZyZWUoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCk7CisKKyAgICAgICAgZnJlZShkZWNvZGVyW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGRlY29kZXIpOworCisgICAgaWYgKG51bUVycm9ycykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZm91dHB1dCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAorICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKQoreworICAgIHU4ICp0bXBJbWFnZSA9IE5VTEw7CisgICAgdTMyIHRtcCwgcGljU2l6ZTsKKworICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLT5jcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0V2lkdGggKgorICAgICAgICAgICAgICAgICAgZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0OworICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICB0bXBJbWFnZSA9IG1hbGxvYyhwaWNTaXplKTsKKyAgICAgICAgaWYgKHRtcEltYWdlID09IE5VTEwpCisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgZGVjSW5mby0+cGljV2lkdGgsIGRlY0luZm8tPnBpY0hlaWdodCwKKyAgICAgICAgICAgICYoZGVjSW5mby0+Y3JvcFBhcmFtcykpOworICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICBmcmVlKHRtcEltYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8tPnBpY1dpZHRoICogZGVjSW5mby0+cGljSGVpZ2h0OworICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCBpbWFnZURhdGEsIHBpY1NpemUpOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKK3sKKyAgICBpZiAoZmlkKQorICAgICAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKK3sKKyAgICBmcmVlKHB0cik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQoreworICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBDcm9wUGljdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKKyAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKQoreworCisgICAgdTMyIGksIGo7CisgICAgdTMyIG91dFdpZHRoLCBvdXRIZWlnaHQ7CisgICAgdTggKnBPdXQsICpwSW47CisKKyAgICBpZiAocE91dEltYWdlID09IE5VTEwgfHwgcEluSW1hZ2UgPT0gTlVMTCB8fCBwQ3JvcFBhcmFtcyA9PSBOVUxMIHx8CisgICAgICAgICFwaWNXaWR0aCB8fCAhcGljSGVpZ2h0KQorICAgIHsKKyAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLworICAgICAgICBmcmVlKHBPdXRJbWFnZSk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBpZiAoICgocENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aCkgPgorICAgICAgICAgICBwaWNXaWR0aCApIHx8CisgICAgICAgICAoKHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQpID4KKyAgICAgICAgICAgcGljSGVpZ2h0ICkgKQorICAgIHsKKyAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLworICAgICAgICBmcmVlKHBPdXRJbWFnZSk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBvdXRXaWR0aCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGg7CisgICAgb3V0SGVpZ2h0ID0gcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQ7CisKKyAgICBwSW4gPSBwSW5JbWFnZSArIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0OworICAgIHBPdXQgPSBwT3V0SW1hZ2U7CisKKyAgICAvKiBsdW1hICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aCAtIG91dFdpZHRoOworICAgIH0KKworICAgIG91dFdpZHRoID4+PSAxOworICAgIG91dEhlaWdodCA+Pj0gMTsKKworICAgIHBJbiA9IHBJbkltYWdlICsgcGljV2lkdGgqcGljSGVpZ2h0ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogY2IgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICBwSW4gPSBwSW5JbWFnZSArIDUqcGljV2lkdGgqcGljSGVpZ2h0LzQgKworICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7CisKKyAgICAvKiBjciAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOworICAgIH0KKworICAgIHJldHVybiAoMCk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzRhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKQEAgLTAsMCArMSwyOTggQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiAgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKK3B0ckEgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2Jsb2NrICAgUk4gMQorCit4MCAgICAgIFJOIDIKK2NvdW50ICAgUk4gMgorCit5MCAgICAgIFJOIDMKK3ZhbFggICAgUk4gMworCit3aWR0aCAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit0bXA3ICAgIFJOIDUKKworY2hyUFcgICBSTiA2Cit0bXA4ICAgIFJOIDYKKwordG1wMSAgICBSTiA3CitjaHJQSCAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK3RtcDUgICAgUk4gMTEKKwordG1wNiAgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit4RnJhYyAgIFJOIDE0CisKKzsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKKworaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweGM0CisKKyAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDYsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXA2ID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzEgICAgICAgICAgOy8vIHRtcDYgPSB4MCArIGNocm9tYVBhcnRXaWR0aCArIDEKKyAgICBDTVAgICAgIHRtcDYsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXA2ID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQ01QICAgICB0bXA2LCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbAorCitkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wOCwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDggPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIE1PViAgICAgdG1wMiwgdG1wOCAgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wOCxjaHJQSCx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKKyAgICBNTEEgICAgIGJsb2NrLCBjaHJQSCwgdG1wOCwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUEgpKihjaHJvbWFQVysxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIGNoclBILCBbc3AsICMweGZjXSAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIHRtcDgsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIHRtcDgKKyAgICBTVUIgICAgIGNoclBXLCBjaHJQVywgIzEKKworc2tpcF9maWxsCisgICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCisgICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geEZyYWMKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKKyAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYworCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKKworICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKKyAgICBQS0hCVCAgIHZhbFgsIHZhbFgsIHhGcmFjLCBMU0wgIzE2ICA7Ly8gfHhGcmFjfHZhbFggfAorICAgIE1PViAgICAgdmFsWCwgdmFsWCwgTFNMICMzICAgICAgICAgIDsvLyBtdWx0aXBseSBieSA4IGluIGFkdmFuY2UKKyAgICBNT1YgICAgIGMzMiwgIzMyCisKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ2IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisKK2xvb3AxX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4CisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKK2xvb3AxX3gKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKKworICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgorICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgorCisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgorICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgorCisgICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisKKyAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0CisgICAgQkdFICAgICBsb29wMV95CisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENyCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCisgICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKyAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQorICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMworICAgIEFERCAgICAgbWIsIG1iLCAjNjQKKworICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitsb29wMl95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQorCitsb29wMl94CisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA0LCBbcHRyQV0sICMxCisKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDEsIHRtcDMsIExTTCAjMTYKKyAgICBQS0hCVCAgIHRtcDYsIHRtcDIsIHRtcDQsIExTTCAjMTYKKworICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQorCisgICAgU01MQUQgICB0bXA1LCB0bXA1LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA2LCB0bXA2LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBQS0hCVCAgIHRtcDcsIHRtcDMsIHRtcDEsIExTTCAjMTYKKyAgICBQS0hCVCAgIHRtcDgsIHRtcDQsIHRtcDIsIExTTCAjMTYKKworICAgIFNNTEFEICAgdG1wNywgdG1wNywgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wOCwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKworICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA2LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCisKKyAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKKyAgICBCQ1MgICAgIGxvb3AyX3gKKworICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2CisgICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKKyAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKKyAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKKyAgICBTVUIgICAgIHB0ckEsIHB0ckEsICMxCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQyMGFkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwpAQCAtMCwwICsxLDMzOSBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIAorOy0tICAgICAgICAgICAgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworCis7Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCitwdHJBICAgIFJOIDAKKworbWIgICAgICBSTiAxCitibG9jayAgIFJOIDEKKworeDAgICAgICBSTiAyCitjb3VudCAgIFJOIDIKKworeTAgICAgICBSTiAzCit2YWxZICAgIFJOIDMKKword2lkdGggICBSTiA0CisKK3RtcDQgICAgUk4gNQoraGVpZ2h0ICBSTiA1CisKK3RtcDEgICAgUk4gNgorCit0bXAyICAgIFJOIDcKKwordG1wMyAgICBSTiA4CisKK3ZhbFggICAgUk4gOQorCit0bXA1ICAgIFJOIDEwCitjaHJQVyAgIFJOIDEwCisKK3RtcDYgICAgUk4gMTEKK2NoclBIICAgUk4gMTEKKworeEZyYWMgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit5RnJhYyAgIFJOIDE0CisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDgKKzsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwYworCitoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKKworICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAorICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHhGcmFjCisgICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorCisgICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aCsxCisgICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAorICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCisgICAgQ01QICAgICB0bXAxLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbAorCitkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMGNdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wMywgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDMgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIEFERCAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIEFERCAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAorICAgIE1MQSAgICAgYmxvY2ssIHRtcDIsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKzEpKihjaHJvbWFQSCsxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIHRtcDIsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIHRtcDEKKworc2tpcF9maWxsCisgICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCisgICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDRdICAgICA7Ly8geUZyYWMKKyAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0KKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKKyAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYworICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8CisgICAgTU9WICAgICBjMzIsICMzMgorCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENiCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorCitsb29wMV95CisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0KKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKKyAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAorCisgICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCisgICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCisKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Citsb29wMV94CisgICAgOy8vIGZpcnN0CisgICAgTERSQiAgICB0bXAyLCBbcHRyQSwgIzFdIQorICAgIExEUkIgICAgdG1wNCwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjMTYgICA7Ly8gfHQ0fHQyfAorICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMxNiAgIDsvLyB8dDZ8dDR8CisKKyAgICBTTVVBRCAgIHRtcDIsIHRtcDIsIHZhbFkgICAgICAgICAgICA7Ly8gdDI9KHQyKnZhbFkgKyB0NCp5RnJhYykKKyAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDU9dDEqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgeEZyYWMsIHRtcDUgICAgIDsvLyB0NT10Mip4RnJhYyt0NQorCisgICAgU01VQUQgICB0bXA0LCB0bXA0LCB2YWxZICAgICAgICAgICAgOy8vIHQ0PSh0NCp2YWxZICsgdDYqeUZyYWMpCisgICAgTUxBICAgICB0bXA2LCB0bXAzLCB2YWxYLCBjMzIgICAgICAgOy8vIHQzPXQzKnZhbFgrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHhGcmFjLCB0bXA2ICAgICA7Ly8gdDY9dDQqeEZyYWMrdDYKKworICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKworICAgIDsvLyBzZWNvbmQKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1CisKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ3IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCisgICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgorICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCisgICAgQUREICAgICBtYiwgbWIsICM2NAorCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4CisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24KK2xvb3AyX3kKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQorICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAorICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8CisKKyAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKworICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AyX3gKKyAgICA7Ly8gZmlyc3QKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKKworICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCisgICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1CisKKyAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgOy8vIHNlY29uZCAKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1CisKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDJfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AyX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKKyAgICBMRE1GRCAgIHNwISx7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOWRmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucwpAQCAtMCwwICsxLDI4OCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorcHRyQSAgICBSTiAwCisKK21iICAgICAgUk4gMQorYmxvY2sgICBSTiAxCisKK3gwICAgICAgUk4gMgorY291bnQgICBSTiAyCisKK3kwICAgICAgUk4gMwordmFsWSAgICBSTiAzCisKK3dpZHRoICAgUk4gNAorCitoZWlnaHQgIFJOIDUKK3RtcDcgICAgUk4gNQorCitjaHJQVyAgIFJOIDYKK3RtcDggICAgUk4gNgorCit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK3RtcDUgICAgUk4gMTEKK2NoclBIICAgUk4gMTEKKwordG1wNiAgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit5RnJhYyAgIFJOIDE0CisKKzsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHlGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKKworaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweGM0CisKKyAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDEsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIENNUCAgICAgdG1wMSwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDEsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodCArIDEKKyAgICBDTVAgICAgIHRtcDEsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAxLCBjaHJQSCwgIzEgICAgICAgICA7Ly8gdG1wMSA9IGNocm9tYVBhcnRIZWlnaHQrMQorICAgIE1PViAgICAgdG1wMiwgY2hyUFcgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsY2hyUFcsdG1wMSx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBMRFIgICAgIHgwLCBbc3AsICMweGNjXQorICAgIExEUiAgICAgeTAsIFtzcCwgIzB4ZDBdCisgICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisgICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LGNoclBXLHRtcDEsdG1wMn0KKyAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jaworICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCisgICAgTUxBICAgICBibG9jaywgY2hyUFcsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKSooY2hyb21hUEgrMSkKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIE1PViAgICAgeDAsICMwICAgICAgICAgICAgICAgICAgOy8vIHgwID0gMAorICAgIE1PViAgICAgeTAsICMwICAgICAgICAgICAgICAgICAgOy8vIHkwID0gMAorICAgIFNUUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgU1RSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBBREQgICAgIHJlZiwgc3AsICMweDFjICAgICAgICAgIDsvLyByZWYgPSBibG9jaworICAgIFNUUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgorCisgICAgU1RSICAgICB0bXAxLCBbc3AsICMweGZjXSAgICAgICA7Ly8gaGVpZ2h0CisgICAgU1RSICAgICBjaHJQVywgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNT1YgICAgIHdpZHRoLCBjaHJQVworCitza2lwX2ZpbGwKKyAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKKyAgICBMRFIgICAgIHlGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB5RnJhYworICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAorICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8CisgICAgTU9WICAgICB2YWxZLCB2YWxZLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQorICAgIE1PViAgICAgYzMyLCAjMzIKKworCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIDsvLyBDYgorICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KKworbG9vcDFfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AxX3gKKyAgICA7Ly8gUHJvY2VzcyAyeDIgYmxvY2sKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAxIGNvbAorICAgIExEUkIgICAgdG1wMSwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMSBjb2wKKworICAgIExEUkIgICAgdG1wNSwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDYsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDIgY29sCisgICAgTERSQiAgICB0bXA0LCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAyIGNvbAorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICAgOy8vIHxCfEF8CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHxDfEJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzE2ICAgOy8vIHxCfEF8CisKKyAgICBTTUxBRCAgIHRtcDcsIHRtcDIsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcDYsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBTTUxBRCAgIHRtcDIsIHRtcDEsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDgsIHRtcDUsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDQsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDIsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA4LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKKworCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kgCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENyCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCisgICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKyAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQorICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMworICAgIEFERCAgICAgbWIsIG1iLCAjNjQKKworICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitsb29wMl95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorbG9vcDJfeAorICAgIDsvLyBQcm9jZXNzIDJ4MiBibG9jaworICAgIExEUkIgICAgdG1wMiwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMSBjb2wKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAxIGNvbAorCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAyIGNvbAorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDIgY29sCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDMsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKworICAgIFNNTEFEICAgdG1wNywgdG1wMiwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wNiwgTFNMICMxNiAgIDsvLyB8Q3xCfAorICAgIFNNTEFEICAgdG1wMiwgdG1wMSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wNSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wNSwgdG1wNCwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wMiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMl94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM5NjhiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucwpAQCAtMCwwICsxLDI1MSBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZiBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3kwICAgICAgUk4gMworeF8yXzAgICBSTiAzCisKK3dpZHRoICAgUk4gNAoreF8zXzEgICBSTiA0CisKK2hlaWdodCAgUk4gNQoreF82XzQgICBSTiA1CisKK3BhcnRXICAgUk4gNgoreF83XzUgICBSTiA2CisKK3BhcnRIICAgUk4gNwordG1wMSAgICBSTiA3CisKK3RtcDIgICAgUk4gOAorCit0bXAzICAgIFJOIDkKKwordG1wNCAgICBSTiAxMAorCittdWx0XzIwXzAxICBSTiAxMQorbXVsdF8yMF9tNSAgUk4gMTIKKworcGx1czE2ICBSTiAxNAorCisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgorCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB0bXA0LCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQ01QICAgICB0bXAyLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKKyAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSB3aWR0aAorICAgIE1PViAgICAgY291bnQsIHdpZHRoCisgICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOworICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKKyAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKKworCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgorICAgIE1PViAgICAgcGx1czE2LCAjMTYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorbG9vcF95CisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKworbG9vcF94CisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKKyAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNDICAgICBuZXh0X3kKKworICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKworICAgIFNNTEFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgorCisgICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyCisgICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0CisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyCisgICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181CisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMgorICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0CisKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQorICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQorICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisgICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAorICAgIEJDUyAgICAgbG9vcF94CisKK25leHRfeQorICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmIDsvLyArd2lkdGgKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDMsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTI0M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCkBAIC0wLDAgKzEsMjczIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKKworbWIgICAgICBSTiAxCitidWZmICAgIFJOIDEKKworY291bnQgICBSTiAyCit4MCAgICAgIFJOIDIKKworeTAgICAgICBSTiAzCit4XzJfMCAgIFJOIDMKKword2lkdGggICBSTiA0Cit4XzNfMSAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKKworcGFydFcgICBSTiA2Cit4XzdfNSAgIFJOIDYKKworcGFydEggICBSTiA3Cit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK211bHRfMjBfMDEgIFJOIDExCisKK211bHRfMjBfbTUgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKKworCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB0bXA0LCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQ01QICAgICB0bXAyLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKKyAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSB3aWR0aAorICAgIE1PViAgICAgY291bnQsIHdpZHRoCisgICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOworICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKKyAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKKworCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgorICAgIE1PViAgICAgcGx1czE2LCAjMTYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorbG9vcF95CisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKworbG9vcF94CisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIExEUiAgICAgdG1wNCwgW3NwLCAjMHgyMjhdCisgICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgorICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKKyAgICBTVUIgICAgIHRtcDQsIHRtcDQsICMxMAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIExEUiAgICAgdG1wMywgW3JlZiwgdG1wNF0KKyAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAorCis7Ly8gcXVhcnRlciBwZWwgcG9zaXRpb24KKyAgICBMRFIgICAgIHRtcDIsID0gMHg4MDgwODA4MAorICAgIE1WTiAgICAgdG1wMywgdG1wMworICAgIFVIU1VCOCAgdG1wMSwgdG1wMSwgdG1wMworICAgIEVPUiAgICAgdG1wMSwgdG1wMSwgdG1wMgorICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKKworICAgIEJDQyAgICAgbmV4dF95CisKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMgorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMgorICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDEKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDIKKyAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzCisgICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNAorCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCisgICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisKKzsvLyBxdWFydGVyIHBlbAorICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCisgICAgTVZOICAgICB0bXAzLCB0bXAzCisgICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCisgICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCisKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNTICAgICBsb29wX3gKKworbmV4dF95CisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCxzcCwjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWM3OWIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKQEAgLTAsMCArMSw1MzYgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIgCis7LS0gICAgICAgICAgICBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3kwICAgICAgUk4gMworeF8yXzAgICBSTiAzCityZXMgICAgIFJOIDMKKworeF8zXzEgICBSTiA0Cit0bXAxICAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKK3RtcDIgICAgUk4gNQorCitwYXJ0VyAgIFJOIDYKK3hfN181ICAgUk4gNgordG1wMyAgICBSTiA2CisKK3BhcnRIICAgUk4gNwordG1wNCAgICBSTiA3CisKK3RtcDUgICAgUk4gOAorCit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAorCittdWx0XzIwXzAxICBSTiAxMQordG1wYiAgICAgICAgUk4gMTEKKworbXVsdF8yMF9tNSAgUk4gMTIKK3dpZHRoICAgICAgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKKworOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoCis7Ly8KKzsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMKKzsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLgorOy8vCis7Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzAKKzsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLgorOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDEKKzsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01Cis7Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMAorOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxCisKKworaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgorICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0CisKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBBREQgICAgIHRtcGEsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgIzUgICAgICAgICAgOy8vICh4MCtwYXJ0Vys1KQorICAgIENNUCAgICAgdG1wYSwgd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wNSwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQorICAgIEFERCAgICAgdG1wNSwgdG1wNSwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQorICAgIENNUCAgICAgdG1wNSwgaGVpZ2h0CisgICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCisKKworZG9fZmlsbAorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyB0bXA1ID0gcGFydEggKyA1CisgICAgQUREICAgICB0bXBhLCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wYSA9IHBhcnRXICsgNQorICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHRtcGF9ICAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgrNQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQrNQorICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBMRFIgICAgIHRtcDYsIFtzcCwjMHgyMjhdICAgICAgIDsvLyBob3JWZXJPZmZzZXQKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgorICAgIE1MQSAgICAgdG1wNSwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wNSAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4MWU0XSAgICAgICA7Ly8gc3RvcmUgInJlZiIgZm9yIHZlcnRpY2FsIGZpbHRlcmluZworICAgIEFORCAgICAgdG1wNiwgdG1wNiwgIzIgICAgICAgICAgOy8vIGNhbGN1bGF0ZSByZWYgZm9yIGhvcml6b250YWwgZmlsdGVyCisgICAgTU9WICAgICB0bXBhLCAjMgorICAgIEFERCAgICAgdG1wNiwgdG1wYSwgdG1wNiwgTFNSICMxCisgICAgTUxBICAgICByZWYsIHRtcDYsIHdpZHRoLCByZWYKKyAgICBBREQgICAgIHJlZiwgcmVmLCAjOCAgICAgICAgICAgIDsvLyByZWYgPSByZWYrOAorCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIHdpZHRoCisgICAgTU9WICAgICBjb3VudCwgd2lkdGgKKyAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7CisgICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOworICAgIEFERCAgICAgdG1wNSwgcGFydEgsIHBhcnRXLCBMU0wgIzQKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNSwgTFNMICMxNgorCisKKyAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMSAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQiAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKKyAgICBNT1YgICAgIHBsdXMxNiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gY29uc3RhbnQgZm9yIGFkZAorICAgIEFORCAgICAgdG1wNCwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKKyAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNCwgTFNMICM4ICA7Ly8gcGFydEgtMSB0byBsb3dlciBwYXJ0IG9mIHRvcCBieXRlCisKKzsvLyBIT1JJWk9OVEFMIFBBUlQKKworbG9vcF95X2hvcgorICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0KKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICAgOy8vIHBhcnRXLTEgdG8gdXBwZXIgcGFydCBvZiB0b3AgYnl0ZQorICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorCitsb29wX3hfaG9yCisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXA2LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXA1LCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXBhLCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0CisgICAgU01MQVRCICB0bXA2LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNgorICAgIFNNTEFEICAgdG1wNSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDUKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcGEsIHhfNl80LCBtdWx0XzIwX201LCB0bXBhCisKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisgICAgU01MQURYICB0bXA2LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNgorICAgIFNNTEFEWCAgdG1wNSwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDUKKyAgICBTTUxBRFggIHRtcGEsIHhfN181LCBtdWx0XzIwX201LCB0bXBhCisKKyAgICBTTUxBQkIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA0CisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDUsIHhfN181LCBtdWx0XzIwX201LCB0bXA1CisgICAgU01MQURYICB0bXA2LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNgorICAgIFNNTEFCQiAgdG1wYSwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcGEKKworICAgIE1PViAgICAgdG1wNSwgdG1wNSwgQVNSICM1CisgICAgTU9WICAgICB0bXA0LCB0bXA0LCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcGEsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wNSwgIzgsIHRtcDUKKyAgICBVU0FUMTYgIHRtcDQsICM4LCB0bXA0CisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0CisgICAgQkNDICAgICBuZXh0X3lfaG9yCisKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDYsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDUsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcGEsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBVEIgIHRtcDYsIHhfN181LCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQUQgICB0bXA1LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNQorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wYSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBRFggIHRtcDYsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQURYICB0bXA1LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNQorICAgIFNNTEFEWCAgdG1wYSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDQKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorICAgIFNNTEFCQiAgdG1wNSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDUKKyAgICBTTUxBRFggIHRtcDYsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA2CisgICAgU01MQUJCICB0bXBhLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wYQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDQsIHRtcDQsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wYSwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjKDE2LTUpCisgICAgVVNBVDE2ICB0bXA1LCAjOCwgdG1wNQorICAgIFVTQVQxNiAgdG1wNCwgIzgsIHRtcDQKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKKyAgICBPUlIgICAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjOAorICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQKKyAgICBCQ1MgICAgIGxvb3BfeF9ob3IKKworbmV4dF95X2hvcgorICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgICAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgICAgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDYsIExTUiAjMjAgICAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wNiwgTFNSICMyMCAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkgIDsvLyBkZWNyZW1lbnQgY291bnRlciAocGFydFcpCisgICAgQkdFICAgICBsb29wX3lfaG9yCisKKworCis7Ly8gVkVSVElDQUwgUEFSVAorOy8vCis7Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgorOy8vCis7Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCis7Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCis7Ly8gaW4gZWFjaCByb3VuZC4KKzsvLworOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAorOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAorOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAorOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAorOy8vICAgICAgICAgICAuLgorOy8vICAgICAgICAgICAuLgorOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgorOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgorOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgorOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgorCis7Ly8gQXBwcm9hY2ggdG8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0byBxdWFydGVyIHBlbCBwb3NpdGlvbi4KKzsvLyA0IGJ5dGVzIGFyZSBwcm9jZXNzZWQgcGFyYWxsZWwKKzsvLworOy8vIGFsZ29yaXRobSAoYStiKzEpLzIuIFJvdWRpbmcgdXB3YXJkcyArMSBjYW4gYmUgYWNoaWV2ZWQgYnkgCis7Ly8gbmVnYXRpbmcgc2Vjb25kIG9wZXJhbmQgdG8gZ2V0IG9uZSdzIGNvbXBsZW1lbnQgKGluc3RlYWQgb2YgMidzKQorOy8vIGFuZCB1c2luZyBzdWJ0cmFjdGlvbiwgRU9SIGlzIHVzZWQgdG8gY29ycmVjdCBzaWduLgorOy8vCis7Ly8gTVZOICAgICBiLCBiCis7Ly8gVUhTVUI4ICBhLCBhLCBiCis7Ly8gRU9SICAgICBhLCBhLCAweDgwODA4MDgwCisKKworICAgIExEUiAgICAgcmVmLCBbc3AsICMweDFlNF0gICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcGEsIFtzcCwgIzB4MjI4XSAgICAgICAgICA7Ly8gaG9yVmVyT2Zmc2V0CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICAgICAgOy8vIG1iCisgICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHgyMThdICAgICAgICAgOy8vIHdpZHRoCisgICAgQUREICAgICByZWYsIHJlZiwgIzIgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBjb3JyZWN0IHBvc2l0aW9uCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCAjMQorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcGEKKyAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwICAgICAgICA7Ly8gKzE2IHRvIGxvd2VyIGFuZCB1cHBlcmYgaGFsZndvcmRzCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGICAgOy8vIHBhcnRXaWR0aC0xCisKKyAgICBBTkQgICAgIHRtcGEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcGEsIExTTCAjOAorCitsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICA7Ly8gcGFydFdpZHRoLTEKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMgCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wMSwgW21iXQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisgICAgTVZOICAgICB0bXAxLCB0bXAxCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKworICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCisgICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKworICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCisKKworICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAorICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAorICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAorICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAorICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAorICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAyLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDIsIHRtcDIKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAzLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDMsIHRtcDMKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAzICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMywgW3JlZl0gICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDUsIFttYl0KKyAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAorICAgIE1WTiAgICAgdG1wNSwgdG1wNQorCisgICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDUgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOCAgICAgICAgOy8vIGRlY3JlbWVudCB4IGxvb3AgY291bnRlcgorCisgICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCisgICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOworICAgIEFERCAgICAgcmVmLCByZWYsICM0ICAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCisKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKKworICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIG1iLCBtYiwgIzY0ICAgICAgICAgICAgICAgICA7Ly8gc2V0IENhcnJ5PTAKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXA2LCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgbWIsIG1iLCB0bXA2LCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4QyA8PCAyNCAgICA7Ly8gZGVjcmVtZW50IHkgbG9vcCBjb3VudGVyCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3AsIHNwLCAjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgxYWVkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCkBAIC0wLDAgKzEsMTYzIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorOw0KKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCis7DQorOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKzsNCis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorOy0tDQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gaG9yaXpvbnRhbCBwYXJ0IG9mIA0KKzstLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZCBmdW5jdGlvbnMNCis7LS0NCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKw0KKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQ0KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQ0KKyAgICBFTFNFDQorICAgICAgICBSRVFVSVJFOA0KKyAgICAgICAgUFJFU0VSVkU4DQorICAgIEVORElGDQorDQorICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQ0KKw0KKw0KKzsvLyBSZWdpc3RlciBhbGxvY2F0aW9uDQorDQorcmVmICAgICBSTiAwICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gcmVmZXJlbmNlIGltYWdlDQorbWIgICAgICBSTiAxICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gaW50ZXJwb2xhdGVkIG1iDQorY291bnQgICBSTiAyICAgIDsvLyBiaXQtcGFja2VkIHdpZHRoIGFuZCBjb3VudCB2YWx1ZXMNCisNCit4XzJfMCAgIFJOIDQNCit4XzNfMSAgIFJOIDUNCit4XzZfNCAgIFJOIDYNCit4XzdfNSAgIFJOIDcNCisNCit0bXAxICAgIFJOIDgNCit0bXAyICAgIFJOIDkNCit0bXAzICAgIFJOIDEwDQordG1wNCAgICBSTiAxMQ0KKw0KK211bHRfMjBfMDEgIFJOIDEyICAgOy8vIFsyMCwgIDFdDQorbXVsdF8yMF9tNSAgUk4gMTQgICA7Ly8gWzIwLCAtNV0NCisNCisNCisgICAgICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUGFydA0KKw0KKzsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaA0KKzsvLw0KKzsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMNCis7Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4NCis7Ly8NCis7Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzANCis7Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4NCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQ0KKzsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01DQorOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjANCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDENCisNCisNCitoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQorICAgIFNUTUZEICAgc3AhLCB7cjQtcjExLCBscn0NCisNCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyDQorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpDQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQ0KKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQ0KKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTENCisgICAgOy8vIFsxNTowMF0gd2lkdGgNCisNCisNCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDENCisgICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkINCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQorbG9vcF95DQorICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0NCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjMTINCisgICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQ0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4DQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQorDQorbG9vcF94DQorICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgNCisNCisgICAgU01VQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201DQorICAgIFNNVUxUQiAgdG1wMywgeF8yXzAsIG11bHRfMjBfMDENCisgICAgU01VTFRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMQ0KKw0KKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQNCisgICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNA0KKw0KKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDENCisgICAgU01MQUJCICB0bXAyLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMg0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KKyAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzDQorICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQNCisNCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQorICAgIEJDQyAgICAgbmV4dF95DQorDQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCisNCisgICAgU01VQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201DQorICAgIFNNVUxUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDENCisgICAgU01VTFRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMQ0KKw0KKyAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQNCisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNA0KKw0KKyAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDENCisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMg0KKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQ0KKyAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzDQorICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQNCisNCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQorICAgIEJDUyAgICAgbG9vcF94DQorDQorbmV4dF95DQorICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQ0KKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgIDsvLyArd2lkdGgNCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMxNiAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xDQorICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjApDQorICAgIEJHRSAgICAgbG9vcF95DQorDQorICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30NCisNCisgICAgRU5EDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0NGZjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKQEAgLTAsMCArMSwzNDcgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCityZXMgICAgIFJOIDMKK3kwICAgICAgUk4gMworCit0bXAxICAgIFJOIDQKKwordG1wMiAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMyAgICBSTiA2CitwYXJ0VyAgIFJOIDYKKwordG1wNCAgICBSTiA3CitwYXJ0SCAgIFJOIDcKKwordG1wNSAgICBSTiA4Cit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAordG1wYiAgICBSTiAxMQord2lkdGggICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCisKKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKK2gyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDUsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAorICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1CisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisKKyAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjMTYgICAgOy8vIHxwYXJ0SHxwYXJ0V3wKKyAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDAwMQorICAgIFNTVUIxNiAgY291bnQsIGNvdW50LCB0bXA1OyAgICAgOy8vIHxwYXJ0SC0xfHBhcnRXLTF8CisgICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAorCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgOy8vIHBhcnRXaWR0aAorCisKK2xvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzI0ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGgKKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQorCisgICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aAorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAzLCBbcmVmXQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKyAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0CisKKyAgICBCQ1MgICAgIGxvb3BfeAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7CisgICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICB0bXAyLCB0bXAxLCAjMSAgICAgICAgICAgICAgOy8vIHBhcnRXaWR0aAorICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCisgICAgQUREICAgICBtYiwgbWIsICM2NDsKKyAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI2NmM4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwpAQCAtMCwwICsxLDM3NCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCityZXMgICAgIFJOIDMKK3kwICAgICAgUk4gMworCit0bXAxICAgIFJOIDQKKwordG1wMiAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMyAgICBSTiA2CitwYXJ0VyAgIFJOIDYKKwordG1wNCAgICBSTiA3CitwYXJ0SCAgIFJOIDcKKwordG1wNSAgICBSTiA4Cit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAordG1wYiAgICBSTiAxMQord2lkdGggICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCisKKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKK2gyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDUsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAorICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1CisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisKKyAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjOCAgICA7Ly8gfHh4fHh4fHBhcnRIfHBhcnRXfAorICAgIExEUiAgICAgdG1wNSwgPSAweDAwMDEwMTAwCisgICAgUlNCICAgICBjb3VudCwgdG1wNSwgY291bnQsIExTTCAjOCAgICAgIDsvLyB8eHh8cGFydEgtMXxwYXJ0Vy0xfHh4fAorICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHgyMjhdICAgICAgOy8vIHZlck9mZnNldAorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyICAgICAgOy8vIHx4eHxwYXJ0SC0xfHBhcnRXLTF8dmVyT2Zmc2V0fAorICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAKKworICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDBGRjAwIDsvLyBwYXJ0V2lkdGgKKworCitsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMxNiAgOy8vIHBhcnRXaWR0aC0xIHRvIHRvcCBieXRlCisKK2xvb3BfeAorICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAorICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAorICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAorICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAorICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzIAorICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKworICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBNT1ZTICAgIHRtcDEsIGNvdW50LCBMU0wgIzMxICAgICAgICA7Ly8gdXBkYXRlIGZsYWdzICh2ZXJPZmZzZXQpCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAxLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDEgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQorCisKKyAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisgICAgTVZORVEgICB0bXAyLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAorICAgIE1WTk5FICAgdG1wMiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDMsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAzLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDMgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAzLCBbcmVmXSAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisgICAgTVZORVEgICB0bXA1LCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAorICAgIE1WTk5FICAgdG1wNSwgdG1wMSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKKworICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXA1ICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorCisgICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgorICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjQgICAgICAgIDsvLyAocGFydFdpZHRoLTEpIC09IDQ7CisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKyAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAorIAorICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzI1Mjw8MTYgICAgICA7Ly8gKHBhcnRIZWlnaHQtMSkgLT0gNDsKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwRkYwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBNT1YgICAgIHRtcDIsICMxCisgICAgQUREICAgICB0bXAyLCB0bXAyLCB0bXAxLCBMU1IgIzggICAgOy8vIHBhcnRXaWR0aAorICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCisgICAgQUREICAgICBtYiwgbWIsICM2NDsKKyAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGQ4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdApAQCAtMCwwICsxLDE1IEBACitlY2hvIG9mZgorc2V0IEFTTUZMQUdTPSAtY2hlY2tyZWdsaXN0IC1DUFUgQVJNMTEzNiAtUHJlRGVmaW5lICJIMjY0REVDX1dJTkFTTSBTRVRMIHtUUlVFfSIKK3NldCBBU009IkQ6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOFxWQ1xjZVxiaW5ceDg2X2FybVxhcm1hc20iCitlY2hvIG9uCisKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKKworcmVtICVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCityZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTE2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKQEAgLTAsMCArMSw2NiBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkQ2xlYXJNYkxheWVyCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCitwTWJMYXllciAgICBSTiAgMAorc2l6ZSAgICAgICAgUk4gIDEKK3BUbXAgICAgICAgIFJOICAyCitzdGVwICAgICAgICBSTiAgMworCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKK3FaZXJvICAgUU4gIFEwLlU4CisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgorOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsKKzsgICAgICAgIElucHV0czoKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7Cis7ICAgICAgICBSZXR1cm5zOgorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RDbGVhck1iTGF5ZXIKKworICAgIFZNT1YgICAgcVplcm8sICMwCisgICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2CisgICAgTU9WICAgICBzdGVwLCAjMzIKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorCitsb29wCisgICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAorICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0CisgICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCisgICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAorICAgIFZTVDEgICAgcVplcm8sIFtwVG1wXSwgc3RlcAorICAgIEJDUyAgICAgbG9vcAorCisgICAgQlggICAgICBscgorICAgIEVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZDczZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zCkBAIC0wLDAgKzEsNDkgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCit2YWx1ZSAgICBSTiAgMAorCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQorICAgIEJYICAgICAgbHIKKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmFjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucwpAQCAtMCwwICsxLDE4MCBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkRmlsbFJvdzcKKworOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKKworcmVmICAgICBSTiAwCitmaWxsICAgIFJOIDEKK2xlZnQgICAgUk4gMgordG1wMiAgICBSTiAyCitjZW50ZXIgIFJOIDMKK3JpZ2h0ICAgUk4gNAordG1wMSAgICBSTiA1CisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworcVRtcDAgICBRTiAgUTAuVTgKK3FUbXAxICAgUU4gIFExLlU4CitkVG1wMCAgIEROICBEMC5VOAorZFRtcDEgICBETiAgRDEuVTgKK2RUbXAyICAgRE4gIEQyLlU4CitkVG1wMyAgIEROICBEMy5VOAorCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3Cis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZEZpbGxSb3c3CisgICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKKyAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KKyAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgorICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQorCitsb29wX2xlZnQKKyAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKKyAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQorICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKKworc3dpdGNoX2NlbnRlcgorICAgICAgICBBU1IgICAgICB0bXAyLGNlbnRlciwjMgorICAgICAgICBDTVAgICAgICB0bXAyLCM5CisgICAgICAgIEFERENDICAgIHBjLHBjLHRtcDIsTFNMICMyCisgICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCisgICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCisgICAgICAgIEIgICAgICAgIGNhc2VfMQorICAgICAgICBCICAgICAgICBjYXNlXzIKKyAgICAgICAgQiAgICAgICAgY2FzZV8zCisgICAgICAgIEIgICAgICAgIGNhc2VfNAorICAgICAgICBCICAgICAgICBjYXNlXzUKKyAgICAgICAgQiAgICAgICAgY2FzZV82CisgICAgICAgIEIgICAgICAgIGNhc2VfNworICAgICAgICBCICAgICAgICBjYXNlXzgKKztjYXNlXzgKKzsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV83Cis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfNgorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAorO2Nhc2VfNQorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAorO2Nhc2VfNAorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMworOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMgorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMQorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorCitjYXNlXzgKKyAgICAgICAgVkxEMSAgICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIFZTVDEgICAgcVRtcDEsIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV83CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV82CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV81CisgICAgICAgIFZMRDEgICAgcVRtcDAsIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBxVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzQKKyAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfMworICAgICAgICBWTEQxICAgIGRUbXAwLCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzEyCisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAgZFRtcDAsIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8yCisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CitjYXNlXzEKKyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0CisgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKKworbG9vcF9jZW50ZXIKKyAgICAgICAgQ01QICAgICAgY2VudGVyLCAjMAorICAgICAgICBMRFJCTkUgICB0bXAyLCBbcmVmXSwgIzEKKyAgICAgICAgU1VCTkUgICAgY2VudGVyLCBjZW50ZXIsICMxCisgICAgICAgIFNUUkJORSAgIHRtcDIsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQ01QICAgICAgcmlnaHQsIzAKKyAgICAgICAgUE9QRVEgICAge3I0LXI2LHBjfQorICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmLCMtMV0KKworbG9vcF9yaWdodAorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAorCisgICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMzNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCkBAIC0wLDAgKzEsODIgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZEZsdXNoQml0cworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworcFN0cm1EYXRhICAgICAgIFJOICAwCitudW1CaXRzICAgICAgICAgUk4gIDEKK3JlYWRCaXRzICAgICAgICBSTiAgMgorc3RybUJ1ZmZTaXplICAgIFJOICAzCitwU3RybUJ1ZmZTdGFydCAgUk4gIDEKK3BTdHJtQ3VyclBvcyAgICBSTiAgMgorYml0UG9zSW5Xb3JkICAgIFJOICAxCisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsKKzsgICAgICAgIElucHV0czoKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7Cis7ICAgICAgICBSZXR1cm5zOgorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RGbHVzaEJpdHMKKzsvLyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisKKyAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCisKKyAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCisgICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3CisKKyAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCisKKyAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCisKKyAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCisKKyAgICBCSEkgZW5kX29mX3N0cmVhbQorCisgICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKKyAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQorICAgIE1PViByMCwgIzAKKyAgICBCWCAgbHIKKzsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9CisKK2VuZF9vZl9zdHJlYW0KKyAgICBNVk4gcjAsICMwCisgICAgQlggIGxyCis7Ly8gICAgUE9QICAgICAge3I0LXI2LHBjfQorCisgICAgRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTA3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMKQEAgLTAsMCArMSwxNTIgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworaW1hZ2UgICBSTiAgMAorZGF0YSAgICBSTiAgMQord2lkdGggICBSTiAgMgorbHVtYSAgICBSTiAgMworY2IgICAgICBSTiAgNAorY3IgICAgICBSTiAgNQorY3dpZHRoICBSTiAgNgorCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKK3FSb3cwICAgUU4gIFEwLlU4CitxUm93MSAgIFFOICBRMS5VOAorcVJvdzIgICBRTiAgUTIuVTgKK3FSb3czICAgUU4gIFEzLlU4CitxUm93NCAgIFFOICBRNC5VOAorcVJvdzUgICBRTiAgUTUuVTgKK3FSb3c2ICAgUU4gIFE2LlU4CitxUm93NyAgIFFOICBRNy5VOAorcVJvdzggICBRTiAgUTguVTgKK3FSb3c5ICAgUU4gIFE5LlU4CitxUm93MTAgIFFOICBRMTAuVTgKK3FSb3cxMSAgUU4gIFExMS5VOAorcVJvdzEyICBRTiAgUTEyLlU4CitxUm93MTMgIFFOICBRMTMuVTgKK3FSb3cxNCAgUU4gIFExNC5VOAorcVJvdzE1ICBRTiAgUTE1LlU4CisKK2RSb3cwICAgRE4gIEQwLlU4CitkUm93MSAgIEROICBEMS5VOAorZFJvdzIgICBETiAgRDIuVTgKK2RSb3czICAgRE4gIEQzLlU4CitkUm93NCAgIEROICBENC5VOAorZFJvdzUgICBETiAgRDUuVTgKK2RSb3c2ICAgRE4gIEQ2LlU4CitkUm93NyAgIEROICBENy5VOAorZFJvdzggICBETiAgRDguVTgKK2RSb3c5ICAgRE4gIEQ5LlU4CitkUm93MTAgIEROICBEMTAuVTgKK2RSb3cxMSAgRE4gIEQxMS5VOAorZFJvdzEyICBETiAgRDEyLlU4CitkUm93MTMgIEROICBEMTMuVTgKK2RSb3cxNCAgRE4gIEQxNC5VOAorZFJvdzE1ICBETiAgRDE1LlU4CisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKzsgICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgorOworOyAgICAgICAgSW5wdXRzOgorOyAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKKzsgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCis7Cis7ICAgICAgICBPdXRwdXRzOgorOyAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCis7Cis7ICAgICAgICBSZXR1cm5zOgorOyAgICAgICAgICAgIG5vbmUKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisgICAgUFVTSCAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICB7cTQtcTd9CisKKyAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQorICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQorICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCisgICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KKworCis7ICAgV3JpdGUgbHVtYQorICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKKyAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCisgICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQorICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzF9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93Mn0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTAsIHFSb3cxMX0sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzEyLCBxUm93MTN9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzV9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWFAMTI4XSwgd2lkdGgKKworICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEgO2NiIHJvd3MgMCwxLDIsMworICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hIDtjYiByb3dzIDQsNSw2LDcKKyAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdISA7Y3Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEgO2NyIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzB9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93OH0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzF9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93OX0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzJ9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTB9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3czfSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzExfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93NH0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMn0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQorICAgIFZTVDEgICAge2RSb3c1fSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEzfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzZ9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTR9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93N30sIFtjYkA2NF0KKyAgICBWU1QxICAgIHtkUm93MTV9LCBbY3JANjRdCisKKyAgICBWUE9QICAgIHtxNC1xN30KKyAgICBQT1AgICAgIHtyNC1yNixwY30KKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzlmNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpAQCAtMCwwICsxLDQxIEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisKKworCisgICAgLm1hY3JvIFJFUVVJUkU4CisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVuZG0KKworICAgIC5tYWNybyBQUkVTRVJWRTgKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKyAgICAuZW5kbQorCisKKyAgICAubWFjcm8gZnVuY3Rpb24gbmFtZSwgZXhwb3J0PTAKKy5pZiBcZXhwb3J0CisgICAgLmdsb2JhbCBcbmFtZQorLmVuZGlmCisgICAgLnR5cGUgICBcbmFtZSwgJWZ1bmN0aW9uCisgICAgLmZ1bmMgICBcbmFtZQorXG5hbWU6CisgICAgLmVuZG0KKworICAgIC5tYWNybyBlbmRmdW5jdGlvbgorICAgIC5lbmRmdW5jCisgICAgLmVuZG0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhOTQwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKQEAgLTAsMCArMSw2OCBAQAorQAorQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AKK0AgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AKK0AgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AKKworI2luY2x1ZGUgImFzbV9jb21tb24uUyIKKworICAgIHByZXNlcnZlOAorCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHBNYkxheWVyICAgIHIwCisjZGVmaW5lIHNpemUgICAgICAgIHIxCisjZGVmaW5lIHBUbXAgICAgICAgIHIyCisjZGVmaW5lIHN0ZXAgICAgICAgIHIzCisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKyNkZWZpbmUgcVplcm8gICBRMC5VOAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDbGVhck1iTGF5ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorCisgICAgICAgIElucHV0czoKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RDbGVhck1iTGF5ZXIsIGV4cG9ydD0xCisKKyAgICBWTU9WICAgIHFaZXJvLCAjMAorICAgIEFERCAgICAgcFRtcCwgcE1iTGF5ZXIsICMxNgorICAgIE1PViAgICAgc3RlcCwgIzMyCisgICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKKworbG9vcDoKKyAgICBWU1QxICAgIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorICAgIFZTVDEgICAge3FaZXJvfSwgW3BUbXBdLCBzdGVwCisgICAgVlNUMSAgICB7cVplcm99LCBbcE1iTGF5ZXJdLCBzdGVwCisgICAgVlNUMSAgICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKKyAgICBCQ1MgICAgIGxvb3AKKworICAgIEJYICAgICAgbHIKKworZW5kZnVuY3Rpb24KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI1M2QwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TCkBAIC0wLDAgKzEsNDggQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisgICAgLmFybQorICAgIC50ZXh0CisKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHZhbHVlICAgIHIwCisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKworICAgICAgICBJbnB1dHM6CisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmdW5jdGlvbiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MsIGV4cG9ydD0xCisKKyAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQorICAgIEJYICAgICAgbHIKKworZW5kZnVuY3Rpb24KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKQEAgLTAsMCArMSwxNDMgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICBwcmVzZXJ2ZTgKKworICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIHJlZiAgICAgcjAKKyNkZWZpbmUgZmlsbCAgICByMQorI2RlZmluZSBsZWZ0ICAgIHIyCisjZGVmaW5lIHRtcDIgICAgcjIKKyNkZWZpbmUgY2VudGVyICByMworI2RlZmluZSByaWdodCAgIHI0CisjZGVmaW5lIHRtcDEgICAgcjUKKworLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KKworI2RlZmluZSBxVG1wMCAgICAgUTAuVTgKKyNkZWZpbmUgcVRtcDEgICAgIFExLlU4CisjZGVmaW5lIGRUbXAwICAgICBEMC5VOAorI2RlZmluZSBkVG1wMSAgICAgRDEuVTgKKyNkZWZpbmUgZFRtcDIgICAgIEQyLlU4CisjZGVmaW5lIGRUbXAzICAgICBEMy5VOAorCisvKgordm9pZCBoMjY0YnNkRmlsbFJvdzcoY29uc3QgdTggKiByZWYsIHU4ICogZmlsbCwgaTMyIGxlZnQsIGkzMiBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICBpMzIgcmlnaHQpOworKi8KKworZnVuY3Rpb24gaDI2NGJzZEZpbGxSb3c3LCBleHBvcnQ9MQorCisgICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKKyAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KKyAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgorICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQorCitsb29wX2xlZnQ6CisgICAgICAgIFNVQlMgICAgIGxlZnQsIGxlZnQsICMxCisgICAgICAgIFNUUkIgICAgIHRtcDEsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9sZWZ0CisKK3N3aXRjaF9jZW50ZXI6CisgICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCisgICAgICAgIENNUCAgICAgIHRtcDIsIzkKKyAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgY2FzZV8xCisgICAgICAgIEIgICAgICAgIGNhc2VfMgorICAgICAgICBCICAgICAgICBjYXNlXzMKKyAgICAgICAgQiAgICAgICAgY2FzZV80CisgICAgICAgIEIgICAgICAgIGNhc2VfNQorICAgICAgICBCICAgICAgICBjYXNlXzYKKyAgICAgICAgQiAgICAgICAgY2FzZV83CisgICAgICAgIEIgICAgICAgIGNhc2VfOAorCitjYXNlXzg6CisgICAgICAgIFZMRDEgICAge3FUbXAwLCBxVG1wMX0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMzIKKyAgICAgICAgVlNUMSAgICB7cVRtcDB9LCBbZmlsbF0hCisgICAgICAgIFZTVDEgICAge3FUbXAxfSwgW2ZpbGxdIQorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzc6CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV82OgorICAgICAgICBWTEQxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjQKKyAgICAgICAgVlNUMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfNToKKyAgICAgICAgVkxEMSAgICB7cVRtcDB9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzIwCisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAge3FUbXAwfSwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzQ6CisgICAgICAgIFZMRDEgICAge3FUbXAwfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgorICAgICAgICBWU1QxICAgIHtxVG1wMH0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8zOgorICAgICAgICBWTEQxICAgIHtkVG1wMH0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBkVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzI6CisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CitjYXNlXzE6CisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CisKK2xvb3BfY2VudGVyOgorICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCisgICAgICAgIEJFUSAgICAgIGp1bXAKKyAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZl0sICMxCisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjMQorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIEJORSAgICAgIGxvb3BfY2VudGVyCitqdW1wOgorICAgICAgICBDTVAgICAgICByaWdodCwjMAorICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9CisgICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQorCitsb29wX3JpZ2h0OgorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAorCisgICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KKworZW5kZnVuY3Rpb24KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YzMTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpAQCAtMCwwICsxLDc4IEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisKKyAgICAuYXJtCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHBTdHJtRGF0YSAgICAgICByMAorI2RlZmluZSBudW1CaXRzICAgICAgICAgcjEKKyNkZWZpbmUgcmVhZEJpdHMgICAgICAgIHIyCisjZGVmaW5lIHN0cm1CdWZmU2l6ZSAgICByMworI2RlZmluZSBwU3RybUJ1ZmZTdGFydCAgcjEKKyNkZWZpbmUgcFN0cm1DdXJyUG9zICAgIHIyCisjZGVmaW5lIGJpdFBvc0luV29yZCAgICByMQorCisvKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisKKyAgICAgICAgSW5wdXRzOgorCisgICAgICAgIE91dHB1dHM6CisKKyAgICAgICAgUmV0dXJuczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Z1bmN0aW9uIGgyNjRic2RGbHVzaEJpdHMsIGV4cG9ydD0xCisKKyAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCisKKyAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCisgICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3CisKKyAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCisKKyAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCisKKyAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCisKKyAgICBCSEkgZW5kX29mX3N0cmVhbQorCisgICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKKyAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQorICAgIE1PViByMCwgIzAKKyAgICBCWCAgbHIKKworZW5kX29mX3N0cmVhbToKKyAgICBNVk4gcjAsICMwCisgICAgQlggIGxyCisKK2VuZGZ1bmN0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1ZDU2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKQEAgLTAsMCArMSwxNTcgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICByZXF1aXJlOAorICAgIHByZXNlcnZlOAorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworI2RlZmluZSBpbWFnZSAgIHIwCisjZGVmaW5lIGRhdGEgICAgcjEKKyNkZWZpbmUgd2lkdGggICByMgorI2RlZmluZSBsdW1hICAgIHIzCisjZGVmaW5lIGNiICAgICAgcjQKKyNkZWZpbmUgY3IgICAgICByNQorI2RlZmluZSBjd2lkdGggIHI2CisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKyNkZWZpbmUgcVJvdzAgICAgIFEwLlU4CisjZGVmaW5lIHFSb3cxICAgICBRMS5VOAorI2RlZmluZSBxUm93MiAgICAgUTIuVTgKKyNkZWZpbmUgcVJvdzMgICAgIFEzLlU4CisjZGVmaW5lIHFSb3c0ICAgICBRNC5VOAorI2RlZmluZSBxUm93NSAgICAgUTUuVTgKKyNkZWZpbmUgcVJvdzYgICAgIFE2LlU4CisjZGVmaW5lIHFSb3c3ICAgICBRNy5VOAorI2RlZmluZSBxUm93OCAgICAgUTguVTgKKyNkZWZpbmUgcVJvdzkgICAgIFE5LlU4CisjZGVmaW5lIHFSb3cxMCAgICBRMTAuVTgKKyNkZWZpbmUgcVJvdzExICAgIFExMS5VOAorI2RlZmluZSBxUm93MTIgICAgUTEyLlU4CisjZGVmaW5lIHFSb3cxMyAgICBRMTMuVTgKKyNkZWZpbmUgcVJvdzE0ICAgIFExNC5VOAorI2RlZmluZSBxUm93MTUgICAgUTE1LlU4CisKKyNkZWZpbmUgZFJvdzAgICAgIEQwLlU4CisjZGVmaW5lIGRSb3cxICAgICBEMS5VOAorI2RlZmluZSBkUm93MiAgICAgRDIuVTgKKyNkZWZpbmUgZFJvdzMgICAgIEQzLlU4CisjZGVmaW5lIGRSb3c0ICAgICBENC5VOAorI2RlZmluZSBkUm93NSAgICAgRDUuVTgKKyNkZWZpbmUgZFJvdzYgICAgIEQ2LlU4CisjZGVmaW5lIGRSb3c3ICAgICBENy5VOAorI2RlZmluZSBkUm93OCAgICAgRDguVTgKKyNkZWZpbmUgZFJvdzkgICAgIEQ5LlU4CisjZGVmaW5lIGRSb3cxMCAgICBEMTAuVTgKKyNkZWZpbmUgZFJvdzExICAgIEQxMS5VOAorI2RlZmluZSBkUm93MTIgICAgRDEyLlU4CisjZGVmaW5lIGRSb3cxMyAgICBEMTMuVTgKKyNkZWZpbmUgZFJvdzE0ICAgIEQxNC5VOAorI2RlZmluZSBkUm93MTUgICAgRDE1LlU4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RXcml0ZU1hY3JvYmxvY2ssIGV4cG9ydD0xCisgICAgUFVTSCAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICB7cTQtcTd9CisKKyAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQorICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQorICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCisgICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KKworCitAICAgV3JpdGUgbHVtYQorICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKKyAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCisgICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQorICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cxfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cyfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzEwLCBxUm93MTF9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzR9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTIsIHFSb3cxM30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisKKyAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hIDsvL2NiIHJvd3MgMCwxLDIsMworICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdISA7Ly9jYiByb3dzIDQsNSw2LDcKKyAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEgOy8vY3Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hIDsvL2NyIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cwfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c4fSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cxfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c5fSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cyfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMH0sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93M30sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTF9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzR9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEyfSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQorICAgIFZTVDEgICAge2RSb3c1fSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxM30sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93Nn0sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTR9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzd9LCBbY2IsOjY0XQorICAgIFZTVDEgICAge2RSb3cxNX0sIFtjciw6NjRdCisKKyAgICBWUE9QICAgIHtxNC1xN30KKyAgICBQT1AgICAgIHtyNC1yNixwY30KK0AgICAgQlggICAgICBscgorCisgICAgLmVuZGZ1bmMKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI3N2Y4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRXh0cmFjdE5hbFVuaXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgQllURV9TVFJFQU1fRVJST1IgIDB4RkZGRkZGRkYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogRXh0cmFjdE5hbFVuaXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRXh0cmFjdHMgb25lIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtIGJ1ZmZlci4gUmVtb3ZlcworICAgICAgICAgICAgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgaWYgcHJlc2VudC4gVGhlIG9yaWdpbmFsIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIGlzIHVzZWQgZGlyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBtb2RpZmllZCBpZiBlbXVsYXRpb24gcHJldmVudGlvbgorICAgICAgICAgICAgYnl0ZXMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgU3RyZWFtIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gZWl0aGVyIGV4YWN0bHkgb25lIE5BTCB1bml0CisgICAgICAgICAgICBhbmQgbm90aGluZyBlbHNlLCBvciBvbmUgb3IgbW9yZSBOQUwgdW5pdHMgZW1iZWRkZWQgaW4gYnl0ZQorICAgICAgICAgICAgc3RyZWFtIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIEFubmV4IEIgb2YgdGhlIHN0YW5kYXJkLiBGdW5jdGlvbgorICAgICAgICAgICAgZGV0ZWN0cyB3aGljaCBvbmUgaXMgdXNlZCBiYXNlZCBvbiB0aGUgZmlyc3QgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwQnl0ZVN0cmVhbSAgICAgcG9pbnRlciB0byBieXRlIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHN0cmVhbSBidWZmZXIgKGluIGJ5dGVzKQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgc3RyZWFtIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzICJjb25zdW1lZCIgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGVycm9yIGluIGJ5dGUgc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdTMyICpyZWFkQnl0ZXMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKyAgICB1MzIgYnl0ZUNvdW50LGluaXRCeXRlQ291bnQ7CisgICAgdTMyIHplcm9Db3VudDsKKyAgICB1OCAgYnl0ZTsKKyAgICB1MzIgaGFzRW11bGF0aW9uID0gSEFOVFJPX0ZBTFNFOworICAgIHUzMiBpbnZhbGlkU3RyZWFtID0gSEFOVFJPX0ZBTFNFOworICAgIHU4ICpyZWFkUHRyLCAqd3JpdGVQdHI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwQnl0ZVN0cmVhbSk7CisgICAgQVNTRVJUKGxlbik7CisgICAgQVNTRVJUKGxlbiA8IEJZVEVfU1RSRUFNX0VSUk9SKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworICAgIC8qIGJ5dGUgc3RyZWFtIGZvcm1hdCBpZiBzdGFydHMgd2l0aCAweDAwMDAwMSBvciAweDAwMDAwMCAqLworICAgIGlmIChsZW4gPiAzICYmIHBCeXRlU3RyZWFtWzBdID09IDB4MDAgJiYgcEJ5dGVTdHJlYW1bMV0gPT0gMHgwMCAmJgorICAgICAgICAocEJ5dGVTdHJlYW1bMl0mMHhGRSkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8qIHNlYXJjaCBmb3IgTkFMIHVuaXQgc3RhcnQgcG9pbnQsIGkuZS4gcG9pbnQgYWZ0ZXIgZmlyc3Qgc3RhcnQgY29kZQorICAgICAgICAgKiBwcmVmaXggaW4gdGhlIHN0cmVhbSAqLworICAgICAgICB6ZXJvQ291bnQgPSBieXRlQ291bnQgPSAyOworICAgICAgICByZWFkUHRyID0gcEJ5dGVTdHJlYW0gKyAyOworICAgICAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlID0gKnJlYWRQdHIrKzsKKyAgICAgICAgICAgIGJ5dGVDb3VudCsrOworCisgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBzdGFydCBjb2RlIHByZWZpeCBmb3VuZCAtPiBlcnJvciAqLworICAgICAgICAgICAgICAgICpyZWFkQnl0ZXMgPSBsZW47CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7CisgICAgICAgICAgICBlbHNlIGlmICgoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbml0Qnl0ZUNvdW50ID0gYnl0ZUNvdW50OworCisgICAgICAgIC8qIGRldGVybWluZSBzaXplIG9mIHRoZSBOQUwgdW5pdC4gU2VhcmNoIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4CisgICAgICAgICAqIG9yIGVuZCBvZiBzdHJlYW0gYW5kIGlnbm9yZSBwb3NzaWJsZSB0cmFpbGluZyB6ZXJvIGJ5dGVzICovCisgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOworICAgICAgICAgICAgYnl0ZUNvdW50Kys7CisgICAgICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7CisKKyAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMykgJiYgKHplcm9Db3VudCA9PSAyKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudCAtIDE7CisgICAgICAgICAgICAgICAgemVyb0NvdW50IC09IE1JTih6ZXJvQ291bnQsIDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemVyb0NvdW50ID49IDMpCisgICAgICAgICAgICAgICAgICAgIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGJ5dGVDb3VudCAtIGluaXRCeXRlQ291bnQgLSB6ZXJvQ291bnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzZXBhcmF0ZSBOQUwgdW5pdHMgYXMgaW5wdXQgLT4ganVzdCBzZXQgc3RyZWFtIHBhcmFtcyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluaXRCeXRlQ291bnQgPSAwOworICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGxlbjsKKyAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgfQorCisgICAgcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCAgICA9IHBCeXRlU3RyZWFtICsgaW5pdEJ5dGVDb3VudDsKKyAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAgICAgID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKKyAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCAgICAgID0gMDsKKyAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgID0gMDsKKworICAgIC8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiAqLworICAgICpyZWFkQnl0ZXMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSArIGluaXRCeXRlQ291bnQgKyB6ZXJvQ291bnQ7CisKKyAgICBpZiAoaW52YWxpZFN0cmVhbSkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiByZW1vdmUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgYmVmb3JlIHJic3AgcHJvY2Vzc2luZyAqLworICAgIGlmIChoYXNFbXVsYXRpb24pCisgICAgeworICAgICAgICB0bXAgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZTsKKyAgICAgICAgcmVhZFB0ciA9IHdyaXRlUHRyID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKKyAgICAgICAgemVyb0NvdW50ID0gMDsKKyAgICAgICAgZm9yIChpID0gdG1wOyBpLS07KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHplcm9Db3VudCA9PSAyKSAmJiAoKnJlYWRQdHIgPT0gMHgwMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSBzaGFsbCBiZSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICogZm9sbG93aW5nIGJ5dGVzOiAweDAwLCAweDAxLCAweDAyLCAweDAzLiBUaGlzIGltcGxpZXMgdGhhdAorICAgICAgICAgICAgICAgICAqIGVtdWxhdGlvbiBwcmV2ZW50aW9uIDB4MDMgYnl0ZSBzaGFsbCBub3QgYmUgdGhlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJlYW0uICovCisgICAgICAgICAgICAgICAgaWYgKCAoaSA9PSAwKSB8fCAoKihyZWFkUHRyKzEpID4gMHgwMykgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3Qgd3JpdGUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSAqLworICAgICAgICAgICAgICAgIHJlYWRQdHIrKzsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5BTCB1bml0IHNoYWxsIG5vdCBjb250YWluIGJ5dGUgc2VxdWVuY2VzIDB4MDAwMDAwLAorICAgICAgICAgICAgICAgICAqIDB4MDAwMDAxIG9yIDB4MDAwMDAyICovCisgICAgICAgICAgICAgICAgaWYgKCAoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA8PSAweDAyKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAgICAgICAgIGlmICgqcmVhZFB0ciA9PSAwKQorICAgICAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICAqd3JpdGVQdHIrKyA9ICpyZWFkUHRyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAocmVhZFB0ciAtIHdyaXRlUHRyKSBpbmRpY2F0ZXMgbnVtYmVyIG9mICJyZW1vdmVkIiBlbXVsYXRpb24KKyAgICAgICAgICogcHJldmVudGlvbiBieXRlcyAtPiBzdWJ0cmFjdCBmcm9tIHN0cmVhbSBidWZmZXIgc2l6ZSAqLworICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAtPSAodTMyKShyZWFkUHRyIC0gd3JpdGVQdHIpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZhZWM3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQllURV9TVFJFQU1fSAorI2RlZmluZSBIMjY0U1dERUNfQllURV9TVFJFQU1fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdTMyICpyZWFkQnl0ZXMpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTFkNzhiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCkBAIC0wLDAgKzEsOTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRGVjb2RlQ29lZmZUb2tlbgorICAgICAgICAgIERlY29kZUxldmVsUHJlZml4CisgICAgICAgICAgRGVjb2RlVG90YWxaZXJvcworICAgICAgICAgIERlY29kZVJ1bkJlZm9yZQorICAgICAgICAgIERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY2F2bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRm9sbG93aW5nIGRlc2NyaXB0aW9ucyB1c2UgdGVybSAiaW5mb3JtYXRpb24gZmllbGQiIHRvIHJlcHJlc2VudCBjb21iaW5hdGlvbgorICogb2YgY2VydGFpbiBkZWNvZGVkIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZQorICogbGVuZ3RoIGNvZGUgd29yZC4gRm9yIGV4YW1wbGUsIHRvdGFsX3plcm9zIGluZm9ybWF0aW9uIGZpZWxkIGNvbnNpc3RzIG9mCisgKiA0IGJpdHMgc3ltYm9sIHZhbHVlIChiaXRzIFs0LDddKSBhbG9uZyB3aXRoIGZvdXIgYml0cyB0byByZXByZXNlbnQgbGVuZ3RoCisgKiBvZiB0aGUgVkxDIGNvZGUgd29yZCAoYml0cyBbMCwzXSkgKi8KKworLyogbWFjcm8gdG8gb2J0YWluIGxlbmd0aCBvZiB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gZmllbGQsIGJpdHMgWzAsNF0gICovCisjZGVmaW5lIExFTkdUSF9UQyh2bGMpICgodmxjKSAmIDB4MUYpCisvKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzAsM10gKi8KKyNkZWZpbmUgTEVOR1RIKHZsYykgKCh2bGMpICYgMHhGKQorLyogbWFjcm8gdG8gb2J0YWluIGNvZGUgd29yZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzQsN10gKi8KKyNkZWZpbmUgSU5GTyh2bGMpICgoKHZsYykgPj4gNCkgJiAweEYpICAvKiA0IE1TQiBiaXRzIGNvbnRhaW4gaW5mb3JtYXRpb24gKi8KKy8qIG1hY3JvIHRvIG9idGFpbiB0cmFpbGluZyBvbmVzIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCisgKiBiaXRzIFs1LDEwXSAqLworI2RlZmluZSBUUkFJTElOR19PTkVTKGNvZWZmVG9rZW4pICgoY29lZmZUb2tlbj4+NSkgJiAweDNGKQorLyogbWFjcm8gdG8gb2J0YWluIHRvdGFsIGNvZWZmIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCisgKiBiaXRzIFsxMSwxNV0gKi8KKyNkZWZpbmUgVE9UQUxfQ09FRkYoY29lZmZUb2tlbikgKCgoY29lZmZUb2tlbikgPj4gMTEpICYgMHgxRikKKworI2RlZmluZSBWTENfTk9UX0ZPVU5EIDB4RkZGRkZGRkVVCisKKy8qIFZMQyB0YWJsZXMgZm9yIGNvZWZmX3Rva2VuLiBCZWNhdXNlIG9mIGxvbmcgY29kZXMgKG1heC4gMTYgYml0cykgc29tZSBvZiB0aGUKKyAqIHRhYmxlcyBoYXZlIGJlZW4gc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBzZXBhcmF0ZSB0YWJsZXMuIEVhY2ggYXJyYXkvdGFibGUKKyAqIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzUgYml0cyBmb3IgdG90LmNvZWZmLl0gWzYgYml0cyBmb3IgdHIub25lc10gWzUgYml0cyBmb3IgVkxDIGxlbmd0aF0KKyAqIElmIHRoZXJlIGlzIGEgMHgwMDAwIHZhbHVlLCBpdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vdCBjb3JyZXNwb25kaW5nIFZMQworICogY29kZXdvcmQgZm9yIHRoYXQgaW5kZXguICovCisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMFszMl0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyMDY2LDB4MTAyNiwweDA4MDYsMHgxODY1LDB4MTg2NSwKKyAgICAweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLAorICAgIDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsCisgICAgMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDEwIGJpdHMsIDAgPD0gbkMgPCAyICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzFbNDhdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQwNmEsMHgzMDRhLDB4MjgyYSwweDIwMGEsCisgICAgMHgzODY5LDB4Mzg2OSwweDI4NDksMHgyODQ5LDB4MjAyOSwweDIwMjksMHgxODA5LDB4MTgwOSwKKyAgICAweDMwNjgsMHgzMDY4LDB4MzA2OCwweDMwNjgsMHgyMDQ4LDB4MjA0OCwweDIwNDgsMHgyMDQ4LAorICAgIDB4MTgyOCwweDE4MjgsMHgxODI4LDB4MTgyOCwweDEwMDgsMHgxMDA4LDB4MTAwOCwweDEwMDgsCisgICAgMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywKKyAgICAweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3fTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTQgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMls1Nl0gPSB7CisgICAgMHg2MDZlLDB4NTg0ZSwweDUwMmUsMHg1MDBlLDB4NTg2ZSwweDUwNGUsMHg0ODJlLDB4NDgwZSwKKyAgICAweDQwMGQsMHg0MDBkLDB4NDg0ZCwweDQ4NGQsMHg0MDJkLDB4NDAyZCwweDM4MGQsMHgzODBkLAorICAgIDB4NTA2ZCwweDUwNmQsMHg0MDRkLDB4NDA0ZCwweDM4MmQsMHgzODJkLDB4MzAwZCwweDMwMGQsCisgICAgMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwKKyAgICAweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLAorICAgIDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsCisgICAgMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDE2IGJpdHMsIDAgPD0gbkMgPCAyICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzNbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHg2ODJmLDB4NjgyZiwweDgwMTAsMHg4MDUwLDB4ODAzMCwweDc4MTAsCisgICAgMHg4MDcwLDB4Nzg1MCwweDc4MzAsMHg3MDEwLDB4Nzg3MCwweDcwNTAsMHg3MDMwLDB4NjgxMCwKKyAgICAweDcwNmYsMHg3MDZmLDB4Njg0ZiwweDY4NGYsMHg2MDJmLDB4NjAyZiwweDYwMGYsMHg2MDBmLAorICAgIDB4Njg2ZiwweDY4NmYsMHg2MDRmLDB4NjA0ZiwweDU4MmYsMHg1ODJmLDB4NTgwZiwweDU4MGZ9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzBbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDM4NjYsMHgyMDQ2LDB4MjAyNiwweDEwMDYsCisgICAgMHgzMDY2LDB4MTg0NiwweDE4MjYsMHgwODA2LDB4Mjg2NSwweDI4NjUsMHgxMDI1LDB4MTAyNSwKKyAgICAweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LAorICAgIDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDN9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA5IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzFbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQ4NjksMHgzODQ5LDB4MzgyOSwweDMwMDksCisgICAgMHgyODA4LDB4MjgwOCwweDMwNDgsMHgzMDQ4LDB4MzAyOCwweDMwMjgsMHgyMDA4LDB4MjAwOCwKKyAgICAweDQwNjcsMHg0MDY3LDB4NDA2NywweDQwNjcsMHgyODQ3LDB4Mjg0NywweDI4NDcsMHgyODQ3LAorICAgIDB4MjgyNywweDI4MjcsMHgyODI3LDB4MjgyNywweDE4MDcsMHgxODA3LDB4MTgwNywweDE4MDd9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAxNCBiaXRzLCAyIDw9IG5DIDwgNCAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8yWzEyOF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDc4NmQsMHg3ODZkLDB4ODA2ZSwweDgwNGUsMHg4MDJlLDB4ODAwZSwKKyAgICAweDc4MmUsMHg3ODBlLDB4Nzg0ZSwweDcwMmUsMHg3MDRkLDB4NzA0ZCwweDcwMGQsMHg3MDBkLAorICAgIDB4NzA2ZCwweDcwNmQsMHg2ODRkLDB4Njg0ZCwweDY4MmQsMHg2ODJkLDB4NjgwZCwweDY4MGQsCisgICAgMHg2ODZkLDB4Njg2ZCwweDYwNGQsMHg2MDRkLDB4NjAyZCwweDYwMmQsMHg2MDBkLDB4NjAwZCwKKyAgICAweDU4MGMsMHg1ODBjLDB4NTgwYywweDU4MGMsMHg1ODRjLDB4NTg0YywweDU4NGMsMHg1ODRjLAorICAgIDB4NTgyYywweDU4MmMsMHg1ODJjLDB4NTgyYywweDUwMGMsMHg1MDBjLDB4NTAwYywweDUwMGMsCisgICAgMHg2MDZjLDB4NjA2YywweDYwNmMsMHg2MDZjLDB4NTA0YywweDUwNGMsMHg1MDRjLDB4NTA0YywKKyAgICAweDUwMmMsMHg1MDJjLDB4NTAyYywweDUwMmMsMHg0ODBjLDB4NDgwYywweDQ4MGMsMHg0ODBjLAorICAgIDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsCisgICAgMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwKKyAgICAweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLAorICAgIDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsCisgICAgMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwKKyAgICAweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLAorICAgIDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsCisgICAgMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgNCA8PSBuQyA8IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMFs2NF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwKKyAgICAweDE4MDYsMHgzODQ2LDB4MzgyNiwweDEwMDYsMHg0ODY2LDB4MzA0NiwweDMwMjYsMHgwODA2LAorICAgIDB4MjgyNSwweDI4MjUsMHgyODQ1LDB4Mjg0NSwweDIwMjUsMHgyMDI1LDB4MjA0NSwweDIwNDUsCisgICAgMHgxODI1LDB4MTgyNSwweDQwNjUsMHg0MDY1LDB4MTg0NSwweDE4NDUsMHgxMDI1LDB4MTAyNSwKKyAgICAweDM4NjQsMHgzODY0LDB4Mzg2NCwweDM4NjQsMHgzMDY0LDB4MzA2NCwweDMwNjQsMHgzMDY0LAorICAgIDB4Mjg2NCwweDI4NjQsMHgyODY0LDB4Mjg2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsCisgICAgMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTA0NCwweDEwNDQsMHgxMDQ0LDB4MTA0NCwKKyAgICAweDA4MjQsMHgwODI0LDB4MDgyNCwweDA4MjQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0fTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTAgYml0cywgNCA8PSBuQyA8IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMVsxMjhdID0geworICAgIDB4MDAwMCwweDgwMGEsMHg4MDZhLDB4ODA0YSwweDgwMmEsMHg3ODBhLDB4Nzg2YSwweDc4NGEsCisgICAgMHg3ODJhLDB4NzAwYSwweDcwNmEsMHg3MDRhLDB4NzAyYSwweDY4MGEsMHg2ODI5LDB4NjgyOSwKKyAgICAweDYwMDksMHg2MDA5LDB4Njg0OSwweDY4NDksMHg2MDI5LDB4NjAyOSwweDU4MDksMHg1ODA5LAorICAgIDB4Njg2OSwweDY4NjksMHg2MDQ5LDB4NjA0OSwweDU4MjksMHg1ODI5LDB4NTAwOSwweDUwMDksCisgICAgMHg2MDY4LDB4NjA2OCwweDYwNjgsMHg2MDY4LDB4NTg0OCwweDU4NDgsMHg1ODQ4LDB4NTg0OCwKKyAgICAweDUwMjgsMHg1MDI4LDB4NTAyOCwweDUwMjgsMHg0ODA4LDB4NDgwOCwweDQ4MDgsMHg0ODA4LAorICAgIDB4NTg2OCwweDU4NjgsMHg1ODY4LDB4NTg2OCwweDUwNDgsMHg1MDQ4LDB4NTA0OCwweDUwNDgsCisgICAgMHg0ODI4LDB4NDgyOCwweDQ4MjgsMHg0ODI4LDB4NDAwOCwweDQwMDgsMHg0MDA4LDB4NDAwOCwKKyAgICAweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LAorICAgIDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsCisgICAgMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywKKyAgICAweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LAorICAgIDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsCisgICAgMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywKKyAgICAweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LAorICAgIDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDd9OworCisvKiBmaXhlZCA2IGJpdCBsZW5ndGggVkxDLCBuQyA8PSA4ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW44WzY0XSA9IHsKKyAgICAweDA4MDYsMHgwODI2LDB4MDAwMCwweDAwMDYsMHgxMDA2LDB4MTAyNiwweDEwNDYsMHgwMDAwLAorICAgIDB4MTgwNiwweDE4MjYsMHgxODQ2LDB4MTg2NiwweDIwMDYsMHgyMDI2LDB4MjA0NiwweDIwNjYsCisgICAgMHgyODA2LDB4MjgyNiwweDI4NDYsMHgyODY2LDB4MzAwNiwweDMwMjYsMHgzMDQ2LDB4MzA2NiwKKyAgICAweDM4MDYsMHgzODI2LDB4Mzg0NiwweDM4NjYsMHg0MDA2LDB4NDAyNiwweDQwNDYsMHg0MDY2LAorICAgIDB4NDgwNiwweDQ4MjYsMHg0ODQ2LDB4NDg2NiwweDUwMDYsMHg1MDI2LDB4NTA0NiwweDUwNjYsCisgICAgMHg1ODA2LDB4NTgyNiwweDU4NDYsMHg1ODY2LDB4NjAwNiwweDYwMjYsMHg2MDQ2LDB4NjA2NiwKKyAgICAweDY4MDYsMHg2ODI2LDB4Njg0NiwweDY4NjYsMHg3MDA2LDB4NzAyNiwweDcwNDYsMHg3MDY2LAorICAgIDB4NzgwNiwweDc4MjYsMHg3ODQ2LDB4Nzg2NiwweDgwMDYsMHg4MDI2LDB4ODA0NiwweDgwNjZ9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAzIGJpdHMsIG5DID09IC0xICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW5NaW51czFfMFs4XSA9IHsKKyAgICAweDAwMDAsMHgxMDQzLDB4MDAwMiwweDAwMDIsMHgwODIxLDB4MDgyMSwweDA4MjEsMHgwODIxfTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gOCBiaXRzLCBuQyA9PSAtMSAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuTWludXMxXzFbMzJdID0geworICAgIDB4MjA2NywweDIwNjcsMHgyMDQ4LDB4MjAyOCwweDE4NDcsMHgxODQ3LDB4MTgyNywweDE4MjcsCisgICAgMHgyMDA2LDB4MjAwNiwweDIwMDYsMHgyMDA2LDB4MTgwNiwweDE4MDYsMHgxODA2LDB4MTgwNiwKKyAgICAweDEwMDYsMHgxMDA2LDB4MTAwNiwweDEwMDYsMHgxODY2LDB4MTg2NiwweDE4NjYsMHgxODY2LAorICAgIDB4MTAyNiwweDEwMjYsMHgxMDI2LDB4MTAyNiwweDA4MDYsMHgwODA2LDB4MDgwNiwweDA4MDZ9OworCisvKiBWTEMgdGFibGVzIGZvciB0b3RhbF96ZXJvcy4gT25lIHRhYmxlIGNvbnRhaW5pbmcgbG9uZ2VyIGNvZGUsIHRvdGFsWmVyb3NfMSwKKyAqIGhhcyBiZWVuIGJyb2tlbiBpbnRvIHR3byBzZXBhcmF0ZSB0YWJsZXMuIFRhYmxlIGVsZW1lbnRzIGhhdmUgdGhlCisgKiBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzQgYml0cyBmb3IgaW5mb10gWzQgYml0cyBmb3IgVkxDIGxlbmd0aF0gKi8KKworLyogVkxDIGxlbmd0aHMgdXAgdG8gNSBiaXRzICovCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xXzBbMzJdID0geworICAgIDB4MDAsMHgwMCwweDY1LDB4NTUsMHg0NCwweDQ0LDB4MzQsMHgzNCwKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MTMsMHgxMywweDEzLDB4MTMsCisgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMX07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDkgYml0cyAqLworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMV8xWzMyXSA9IHsKKyAgICAweDAwLDB4ZjksMHhlOSwweGQ5LDB4YzgsMHhjOCwweGI4LDB4YjgsCisgICAgMHhhNywweGE3LDB4YTcsMHhhNywweDk3LDB4OTcsMHg5NywweDk3LAorICAgIDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwKKyAgICAweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzZ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18yWzY0XSA9IHsKKyAgICAweGU2LDB4ZDYsMHhjNiwweGI2LDB4YTUsMHhhNSwweDk1LDB4OTUsCisgICAgMHg4NCwweDg0LDB4ODQsMHg4NCwweDc0LDB4NzQsMHg3NCwweDc0LAorICAgIDB4NjQsMHg2NCwweDY0LDB4NjQsMHg1NCwweDU0LDB4NTQsMHg1NCwKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKKyAgICAweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsCisgICAgMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfM1s2NF0gPSB7CisgICAgMHhkNiwweGI2LDB4YzUsMHhjNSwweGE1LDB4YTUsMHg5NSwweDk1LAorICAgIDB4ODQsMHg4NCwweDg0LDB4ODQsMHg1NCwweDU0LDB4NTQsMHg1NCwKKyAgICAweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDQsMHgwNCwweDA0LDB4MDQsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisgICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzRbMzJdID0geworICAgIDB4YzUsMHhiNSwweGE1LDB4MDUsMHg5NCwweDk0LDB4NzQsMHg3NCwKKyAgICAweDM0LDB4MzQsMHgyNCwweDI0LDB4ODMsMHg4MywweDgzLDB4ODMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgxMywweDEzLDB4MTMsMHgxM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzVbMzJdID0geworICAgIDB4YjUsMHg5NSwweGE0LDB4YTQsMHg4NCwweDg0LDB4MjQsMHgyNCwKKyAgICAweDE0LDB4MTQsMHgwNCwweDA0LDB4NzMsMHg3MywweDczLDB4NzMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgzMywweDMzLDB4MzMsMHgzM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzZbNjRdID0geworICAgIDB4YTYsMHgwNiwweDE1LDB4MTUsMHg4NCwweDg0LDB4ODQsMHg4NCwKKyAgICAweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAorICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjN9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc183WzY0XSA9IHsKKyAgICAweDk2LDB4MDYsMHgxNSwweDE1LDB4NzQsMHg3NCwweDc0LDB4NzQsCisgICAgMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCisgICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfOFs2NF0gPSB7CisgICAgMHg4NiwweDA2LDB4MjUsMHgyNSwweDE0LDB4MTQsMHgxNCwweDE0LAorICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKKyAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAorICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0Mn07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzlbNjRdID0geworICAgIDB4MTYsMHgwNiwweDc1LDB4NzUsMHgyNCwweDI0LDB4MjQsMHgyNCwKKyAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLAorICAgIDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAorICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwKKyAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzJ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMFszMl0gPSB7CisgICAgMHgxNSwweDA1LDB4NjQsMHg2NCwweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTFbMTZdID0geworICAgIDB4MDQsMHgxNCwweDIzLDB4MjMsMHgzMywweDMzLDB4NTMsMHg1MywKKyAgICAweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDF9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMlsxNl0gPSB7CisgICAgMHgwNCwweDE0LDB4NDMsMHg0MywweDIyLDB4MjIsMHgyMiwweDIyLAorICAgIDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEzWzhdID0gezB4MDMsMHgxMywweDMyLDB4MzIsMHgyMSwweDIxLDB4MjEsMHgyMX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzE0WzRdID0gezB4MDIsMHgxMiwweDIxLDB4MjF9OworCisvKiBWTEMgdGFibGVzIGZvciBydW5fYmVmb3JlLiBUYWJsZSBlbGVtZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzQgYml0cyBmb3IgaW5mb10gWzRiaXRzIGZvciBWTEMgbGVuZ3RoXQorICovCisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNls4XSA9IHsweDEzLDB4MjMsMHg0MywweDMzLDB4NjMsMHg1MywweDAyLDB4MDJ9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzVbOF0gPSB7MHg1MywweDQzLDB4MzMsMHgyMywweDEyLDB4MTIsMHgwMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV80WzhdID0gezB4NDMsMHgzMywweDIyLDB4MjIsMHgxMiwweDEyLDB4MDIsMHgwMn07CisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfM1s0XSA9IHsweDMyLDB4MjIsMHgxMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8yWzRdID0gezB4MjIsMHgxMiwweDAxLDB4MDF9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzFbMl0gPSB7MHgxMSwweDAxfTsKKworLyogZm9sbG93aW5nIGZvdXIgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBzdHJlYW0gYnVmZmVyICJjYWNoZSIgaW4gdGhlIENBVkxDCisgKiBkZWNvZGluZyBmdW5jdGlvbiAqLworCisvKiBtYWNybyB0byBpbml0aWFsaXplIHN0cmVhbSBidWZmZXIgY2FjaGUsIGZpbGxzIHRoZSBidWZmZXIgKDMyIGJpdHMpICovCisjZGVmaW5lIEJVRkZFUl9JTklUKHZhbHVlLCBiaXRzKSBcCit7IFwKKyAgICBiaXRzID0gMzI7IFwKKyAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKK30KKworLyogbWFjcm8gdG8gcmVhZCBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyLCBiaXRzIHdpbGwgYmUgd3JpdHRlbiB0bworICogb3V0VmFsLiBSZWZpbGxzIHRoZSBidWZmZXIgaWYgbm90IGVub3VnaCBiaXRzIGxlZnQgKi8KKyNkZWZpbmUgQlVGRkVSX1NIT1codmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoreyBcCisgICAgaWYgKGJpdHMgPCAobnVtQml0cykpIFwKKyAgICB7IFwKKyAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItYml0cykgPT0gRU5EX09GX1NUUkVBTSkgXAorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCisgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorICAgICAgICBiaXRzID0gMzI7IFwKKyAgICB9IFwKKyAgICAob3V0VmFsKSA9IHZhbHVlID4+ICgzMiAtIChudW1CaXRzKSk7IFwKK30KKworLyogbWFjcm8gdG8gZmx1c2ggbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBCVUZGRVJfRkxVU0godmFsdWUsIGJpdHMsIG51bUJpdHMpIFwKK3sgXAorICAgIHZhbHVlIDw8PSAobnVtQml0cyk7IFwKKyAgICBiaXRzIC09IChudW1CaXRzKTsgXAorfQorCisvKiBtYWNybyB0byByZWFkIGFuZCBmbHVzaCAgbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgYml0cyB3aWxsIGJlIHdyaXR0ZW4KKyAqIHRvIG91dFZhbC4gUmVmaWxscyB0aGUgYnVmZmVyIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0ICovCisjZGVmaW5lIEJVRkZFUl9HRVQodmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoreyBcCisgICAgaWYgKGJpdHMgPCAobnVtQml0cykpIFwKKyAgICB7IFwKKyAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItYml0cykgPT0gRU5EX09GX1NUUkVBTSkgXAorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCisgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorICAgICAgICBiaXRzID0gMzI7IFwKKyAgICB9IFwKKyAgICAob3V0VmFsKSA9IHZhbHVlID4+ICgzMiAtIChudW1CaXRzKSk7IFwKKyAgICB2YWx1ZSA8PD0gKG51bUJpdHMpOyBcCisgICAgYml0cyAtPSAobnVtQml0cyk7IFwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUNvZWZmVG9rZW4odTMyIGJpdHMsIHUzMiBuYyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlTGV2ZWxQcmVmaXgodTMyIGJpdHMpOworCitzdGF0aWMgdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLHUzMiB6ZXJvc0xlZnQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUNvZWZmVG9rZW4KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBjb2VmZl90b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCAxNiBzdHJlYW0gYml0cworICAgICAgICAgIHUzMiBuYyAgICAgICAgICAgICAgICAgICAgbkMsIHNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoMTEgYml0cyBmb3IgdmFsdWUsIDUgYml0cyBmb3IgbGVuZ3RoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YWx1ZTsKKworLyogQ29kZSAqLworCisgICAgLyogc3RhbmRhcmQgZGVmaW5lcyB0aGF0IG5jIGZvciBkZWNvZGluZyBvZiBjaHJvbWEgZGMgY29lZmZpY2llbnRzIGlzIC0xLAorICAgICAqIHJlcHJlc2VudGVkIGJ5IHUzMiBoZXJlIC0+IC0xIG1hcHMgdG8gMl4zMiAtIDEgKi8KKyAgICBBU1NFUlQobmMgPD0gMTYgfHwgbmMgPT0gKHUzMikoLTEpKTsKKworICAgIGlmIChuYyA8IDIpCisgICAgeworICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMDAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwQzAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8wW2JpdHMgPj4gMTBdOworICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDEwMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMVtiaXRzID4+IDZdOworICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDAyMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMlsoYml0cz4+MiktOF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfM1tiaXRzXTsKKyAgICB9CisgICAgZWxzZSBpZiAobmMgPCA0KQorICAgIHsKKyAgICAgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IGJpdHMgJiAweDQwMDAgPyAweDAwMDIgOiAweDA4MjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDApCisgICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzBbYml0cyA+PiAxMF07CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8xW2JpdHMgPj4gN107CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMltiaXRzPj4yXTsKKyAgICB9CisgICAgZWxzZSBpZiAobmMgPCA4KQorICAgIHsKKyAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8wW2JpdHMgPj4gMTBdOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8xW2JpdHM+PjZdOworICAgIH0KKyAgICBlbHNlIGlmIChuYyA8PSAxNikKKyAgICB7CisgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjhbYml0cz4+MTBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW5NaW51czFfMFtiaXRzID4+IDEzXTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8xW2JpdHM+PjhdOworICAgIH0KKworICAgIHJldHVybih2YWx1ZSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVMZXZlbFByZWZpeAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICB1MzIgIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBvciBWTENfTk9UX0ZPVU5ECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgbnVtWmVyb3M7CisKKy8qIENvZGUgKi8KKworICAgIGlmIChiaXRzID49IDB4ODAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAwOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwKQorICAgICAgICBudW1aZXJvcyA9IDE7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDApCisgICAgICAgIG51bVplcm9zID0gMjsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAzOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwODAwKQorICAgICAgICBudW1aZXJvcyA9IDQ7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDA0MDApCisgICAgICAgIG51bVplcm9zID0gNTsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDIwMCkKKyAgICAgICAgbnVtWmVyb3MgPSA2OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQorICAgICAgICBudW1aZXJvcyA9IDc7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwODApCisgICAgICAgIG51bVplcm9zID0gODsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDA0MCkKKyAgICAgICAgbnVtWmVyb3MgPSA5OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQorICAgICAgICBudW1aZXJvcyA9IDEwOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDEwKQorICAgICAgICBudW1aZXJvcyA9IDExOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA4KQorICAgICAgICBudW1aZXJvcyA9IDEyOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA0KQorICAgICAgICBudW1aZXJvcyA9IDEzOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAyKQorICAgICAgICBudW1aZXJvcyA9IDE0OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAxKQorICAgICAgICBudW1aZXJvcyA9IDE1OworICAgIGVsc2UgLyogbW9yZSB0aGFuIDE1IHplcm9zIGVuY291bnRlcmVkIHdoaWNoIGlzIGFuIGVycm9yICovCisgICAgICAgIHJldHVybihWTENfTk9UX0ZPVU5EKTsKKworICAgIHJldHVybihudW1aZXJvcyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVUb3RhbFplcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCA5IHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIHRvdGFsQ29lZmYgICAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciB0aGUgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlY29kZWQKKyAgICAgICAgICB1MzIgaXNDaHJvbWFEQyAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBjaHJvbWEgREMgYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdmFsdWUgPSAweDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0b3RhbENvZWZmKTsKKworICAgIGlmICghaXNDaHJvbWFEQykKKyAgICB7CisgICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgMTYpOworICAgICAgICBzd2l0Y2ggKHRvdGFsQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8wW2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzFfMVtiaXRzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18yW2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfM1tiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzRbYml0cyA+PiA0XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc181W2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNltiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzdbYml0cyA+PiAzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc184W2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfOVtiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMFtiaXRzID4+IDRdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMVtiaXRzID4+IDVdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMltiaXRzID4+IDVdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xM1tiaXRzID4+IDZdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xNFtiaXRzID4+IDddOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1ICovCisgICAgICAgICAgICAgICAgdmFsdWUgPSAoYml0cyA+PiA4KSA/IDB4MTEgOiAweDAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgNCk7CisgICAgICAgIGJpdHMgPj49IDY7CisgICAgICAgIGlmIChiaXRzID4gMykKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG90YWxDb2VmZiA9PSAzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsQ29lZmYgPT0gMikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MjI7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MzM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4odmFsdWUpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUnVuQmVmb3JlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcnVuX2JlZm9yZSBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDExIHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIHplcm9zTGVmdCAgICAgICAgICAgICBudW1iZXIgb2YgemVyb3MgbGVmdCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJ1bkJlZm9yZSh1MzIgYml0cywgdTMyIHplcm9zTGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdmFsdWUgPSAweDA7CisKKy8qIENvZGUgKi8KKworICAgIHN3aXRjaCAoemVyb3NMZWZ0KQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfMVtiaXRzPj4xMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8yW2JpdHM+PjldOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfM1tiaXRzPj45XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzRbYml0cz4+OF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV81W2JpdHM+PjhdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNltiaXRzPj44XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYml0cyA+PSAweDEwMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoNy0oYml0cz4+OCkpPDw0KSsweDM7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4ODApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDc0OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHg4NTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4OTY7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGE3OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDgpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGI4OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGM5OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGRBOworICAgICAgICAgICAgZWxzZSBpZiAoYml0cykKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZUI7CisgICAgICAgICAgICBpZiAoSU5GTyh2YWx1ZSkgPiB6ZXJvc0xlZnQpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKHZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG9uZSBDQVZMQyBjb2RlZCBibG9jay4gVGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICAgIHN5bnRheCBlbGVtZW50cyByZXNpZHVhbF9ibG9ja19jYXZsYygpIGluIHRoZSBzdGFuZGFyZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgbmMgICAgICAgICAgICAgICAgICAgIG5DIHZhbHVlCisgICAgICAgICAgbWF4TnVtQ29lZmYgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHJlc2lkdWFsIGNvZWZmaWNpZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgY29lZmZMZXZlbCAgICAgICAgICAgIHN0b3JlcyBkZWNvZGVkIGNvZWZmaWNpZW50IGxldmVscworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbnVtQ29lZmZzICAgICAgICAgICAgIG9uIGJpdHMgWzQsMTFdIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICBjb2VmZk1hcCAgICAgICAgICAgICAgb24gYml0cyBbMTYsMzFdIGlmIHN1Y2Nlc3NmdWwsIHRoaXMgaXMgYml0IG1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBlYWNoIGJpdCBpbmRpY2F0ZXMgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgd2FzIHplcm8gKDApIG9yIG5vbi16ZXJvICgxKQorICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBpMzIgKmNvZWZmTGV2ZWwsCisgIGkzMiBuYywKKyAgdTMyIG1heE51bUNvZWZmKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXAsIHRvdGFsQ29lZmYsIHRyYWlsaW5nT25lcywgc3VmZml4TGVuZ3RoLCBsZXZlbFByZWZpeDsKKyAgICB1MzIgbGV2ZWxTdWZmaXgsIHplcm9zTGVmdCwgYml0OworICAgIGkzMiBsZXZlbFsxNl07CisgICAgdTMyIHJ1blsxNl07CisgICAgLyogc3RyZWFtICJjYWNoZSIgKi8KKyAgICB1MzIgYnVmZmVyVmFsdWU7CisgICAgdTMyIGJ1ZmZlckJpdHM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChjb2VmZkxldmVsKTsKKyAgICBBU1NFUlQobmMgPiAtMik7CisgICAgQVNTRVJUKG1heE51bUNvZWZmID09IDQgfHwgbWF4TnVtQ29lZmYgPT0gMTUgfHwgbWF4TnVtQ29lZmYgPT0gMTYpOworICAgIEFTU0VSVChWTENfTk9UX0ZPVU5EICE9IEVORF9PRl9TVFJFQU0pOworCisgICAgLyogYXNzdW1lIHRoYXQgY29lZmZMZXZlbCBhcnJheSBoYXMgYmVlbiAiY2xlYW5lZCIgYnkgY2FsbGVyICovCisKKyAgICBCVUZGRVJfSU5JVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cyk7CisKKyAgICAvKmxpbnQgLWU3NzQgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gYWx3YXlzIGZhbHNlIGNvbXBhcmlzb24gKi8KKyAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCAxNik7CisgICAgLypsaW50ICtlNzc0ICovCisgICAgdG1wID0gRGVjb2RlQ29lZmZUb2tlbihiaXQsICh1MzIpbmMpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEhfVEModG1wKSk7CisKKyAgICB0b3RhbENvZWZmID0gVE9UQUxfQ09FRkYodG1wKTsKKyAgICBpZiAodG90YWxDb2VmZiA+IG1heE51bUNvZWZmKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgdHJhaWxpbmdPbmVzID0gVFJBSUxJTkdfT05FUyh0bXApOworCisgICAgaWYgKHRvdGFsQ29lZmYgIT0gMCkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICAvKiBub256ZXJvIGNvZWZmaWNpZW50czogKy8tIDEgKi8KKyAgICAgICAgaWYgKHRyYWlsaW5nT25lcykKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCB0cmFpbGluZ09uZXMpOworICAgICAgICAgICAgdG1wID0gMSA8PCAodHJhaWxpbmdPbmVzIC0gMSk7CisgICAgICAgICAgICBmb3IgKDsgdG1wOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSBiaXQgJiB0bXAgPyAtMSA6IDE7CisgICAgICAgICAgICAgICAgdG1wID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogb3RoZXIgbGV2ZWxzICovCisgICAgICAgIGlmICh0b3RhbENvZWZmID4gMTAgJiYgdHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDA7CisKKyAgICAgICAgZm9yICg7IGkgPCB0b3RhbENvZWZmOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKKyAgICAgICAgICAgIGxldmVsUHJlZml4ID0gRGVjb2RlTGV2ZWxQcmVmaXgoYml0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA9PSBWTENfTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxQcmVmaXgrMSk7CisKKyAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA8IDE0KQorICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsUHJlZml4ID09IDE0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aCA/IHN1ZmZpeExlbmd0aCA6IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2V0dGluZyBzdWZmaXhMZW5ndGggdG8gMSBoZXJlIGNvcnJlc3BvbmRzIHRvIGFkZGluZyAxNQorICAgICAgICAgICAgICAgICAqIHRvIGxldmVsQ29kZSB2YWx1ZSBpZiBsZXZlbFByZWZpeCA9PSAxNSBhbmQKKyAgICAgICAgICAgICAgICAgKiBzdWZmaXhMZW5ndGggPT0gMCAqLworICAgICAgICAgICAgICAgIGlmICghc3VmZml4TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOworICAgICAgICAgICAgICAgIHRtcCA9IDEyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoKQorICAgICAgICAgICAgICAgIGxldmVsUHJlZml4IDw8PSBzdWZmaXhMZW5ndGg7CisKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxTdWZmaXgsIHRtcCk7CisgICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggKz0gbGV2ZWxTdWZmaXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IGxldmVsUHJlZml4OworCisgICAgICAgICAgICBpZiAoaSA9PSB0cmFpbGluZ09uZXMgJiYgdHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKworICAgICAgICAgICAgbGV2ZWxbaV0gPSAodG1wKzIpPj4xOworCisgICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKKworICAgICAgICAgICAgaWYgKChsZXZlbFtpXSA+ICgzIDw8IChzdWZmaXhMZW5ndGggLSAxKSkpICYmIHN1ZmZpeExlbmd0aCA8IDYpCisgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoKys7CisKKyAgICAgICAgICAgIGlmICh0bXAgJiAweDEpCisgICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSAtbGV2ZWxbaV07CisgICAgICAgIH0KKworICAgICAgICAvKiB6ZXJvIHJ1bnMgKi8KKyAgICAgICAgaWYgKHRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCw5KTsKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IERlY29kZVRvdGFsWmVyb3MoYml0LCB0b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG1heE51bUNvZWZmID09IDQpKTsKKyAgICAgICAgICAgIGlmICghemVyb3NMZWZ0KQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHplcm9zTGVmdCkpOworICAgICAgICAgICAgemVyb3NMZWZ0ID0gSU5GTyh6ZXJvc0xlZnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ29lZmYgLSAxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6ZXJvc0xlZnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsMTEpOworICAgICAgICAgICAgICAgIHRtcCA9IERlY29kZVJ1bkJlZm9yZShiaXQsIHplcm9zTGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSCh0bXApKTsKKyAgICAgICAgICAgICAgICBydW5baV0gPSBJTkZPKHRtcCk7CisgICAgICAgICAgICAgICAgemVyb3NMZWZ0IC09IHJ1bltpXSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bltpXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21iaW5pbmcgbGV2ZWwgYW5kIHJ1biwgbGV2ZWxTdWZmaXggdmFyaWFibGUgdXNlZCB0byBob2xkIGNvZWZmTWFwLAorICAgICAgICAgKiBpLmUuIGJpdCBtYXAgaW5kaWNhdGluZyB3aGljaCBjb2VmZmljaWVudHMgaGFkIG5vbi16ZXJvIHZhbHVlLiAqLworCisgICAgICAgIC8qbGludCAtZXN5bSg3NzEsbGV2ZWwscnVuKSBsZXZlbCBhbmQgcnVuIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgdG1wID0gemVyb3NMZWZ0OworICAgICAgICBjb2VmZkxldmVsW3RtcF0gPSBsZXZlbFt0b3RhbENvZWZmLTFdOworICAgICAgICBsZXZlbFN1ZmZpeCA9IDEgPDwgdG1wOworICAgICAgICBmb3IgKGkgPSB0b3RhbENvZWZmLTE7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCArPSBydW5baV07CisgICAgICAgICAgICBsZXZlbFN1ZmZpeCB8PSAxIDw8IHRtcDsKKyAgICAgICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW2ldOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsZXZlbFN1ZmZpeCA9IDA7CisKKyAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyLWJ1ZmZlckJpdHMpICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcmV0dXJuKCh0b3RhbENvZWZmIDw8IDQpIHwgKGxldmVsU3VmZml4IDw8IDE2KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAzNTNkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQ0FWTENfSAorI2RlZmluZSBIMjY0U1dERUNfQ0FWTENfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgaTMyICpjb2VmZkxldmVsLAorICBpMzIgbmMsCisgIHUzMiBtYXhOdW1Db2VmZik7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NBVkxDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiYWJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19DRkdfSAorI2RlZmluZSBIMjY0U1dERUNfQ0ZHX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9OVU1fUkVGX1BJQ1MgMTYKKyNkZWZpbmUgTUFYX05VTV9TTElDRV9HUk9VUFMgOAorI2RlZmluZSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTIDMyCisjZGVmaW5lIE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgMjU2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NGR19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5M2ZiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCkBAIC0wLDAgKzEsNjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZENvbmNlYWwKKyAgICAgICAgICBDb25jZWFsTWIKKyAgICAgICAgICBUcmFuc2Zvcm0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC1lNzAyIGRpc2FibGUgbGludCB3YXJuaW5nIG9uIHJpZ2h0IHNoaWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKKyAgICB1MzIgc2xpY2VUeXBlLCB1OCAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbmNlYWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVyZm9ybSBlcnJvciBjb25jZWFsbWVudCBmb3IgYSBwaWN0dXJlLiBUd28gdHlwZXMgb2YgY29uY2VhbG1lbnQKKyAgICAgICAgICAgIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBzbGljZVR5cGU6CisgICAgICAgICAgICAgICAgMSkgY29weSBmcm9tIHByZXZpb3VzIHBpY3R1cmUgZm9yIFAtc2xpY2VzLgorICAgICAgICAgICAgICAgIDIpIGNvbmNlYWxtZW50IGZyb20gbmVpZ2hib3VyIHBpeGVscyBmb3IgSS1zbGljZXMKKworICAgICAgICAgICAgSS10eXBlIGNvbmNlYWxtZW50IGlzIGJhc2VkIG9uIGlkZWFzIHByZXNlbnRlZCBieSBKYXJubyBUdWxra2kuCisgICAgICAgICAgICBUaGUgY29uY2VhbG1lbnQgYWxnb3JpdGhtIGRldGVybWluZXMgZnJlcXVlbmN5IGRvbWFpbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgIGZyb20gdGhlIG5laWdoYm91ciBwaXhlbHMsIGFwcGxpZXMgaW50ZWdlciB0cmFuc2Zvcm0gKHRoZSBzYW1lCisgICAgICAgICAgICB0cmFuc2Zvcm0gdXNlZCBpbiB0aGUgcmVzaWR1YWwgcHJvY2Vzc2luZykgYW5kIHVzZXMgdGhlIHJlc3VsdHMgYXMKKyAgICAgICAgICAgIHBpeGVsIHZhbHVlcyBmb3IgY29uY2VhbGVkIG1hY3JvYmxvY2tzLiBUcmFuc2Zvcm0gcHJvZHVjZXMgNHg0CisgICAgICAgICAgICBhcnJheSBhbmQgb25lIHBpeGVsIHZhbHVlIGhhcyB0byBiZSB1c2VkIGZvciA0eDQgbHVtYSBibG9ja3MgYW5kCisgICAgICAgICAgICAyeDIgY2hyb21hIGJsb2Nrcy4KKworICAgICAgICAgICAgU2ltaWxhciBjb25jZWFsbWVudCBpcyBwZXJmb3JtZWQgZm9yIHdob2xlIHBpY3R1cmUgKHRoZSBjaG9pc2UKKyAgICAgICAgICAgIG9mIHRoZSB0eXBlIGlzIGJhc2VkIG9uIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgc2xpY2UgaGVhZGVyIG9mCisgICAgICAgICAgICB0aGUgcGljdHVyZSBidXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbikuIEl0IGlzCisgICAgICAgICAgICBhY2tub3dsZWRnZWQgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gd3JvbmcgdHlwZSBvZiBjb25jZWFsbWVudAorICAgICAgICAgICAgd2hlbiBhIHBpY3R1cmUgY29udGFpbnMgYm90aCB0eXBlcyBvZiBzbGljZXMuIEhvd2V2ZXIsCisgICAgICAgICAgICBkZXRlcm1pbmF0aW9uIG9mIHNsaWNlIHR5cGUgbWFjcm9ibG9jay1ieS1tYWNyb2Jsb2NrIGNhbm5vdAorICAgICAgICAgICAgYmUgZG9uZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtub3cgdG8gd2hpY2gKKyAgICAgICAgICAgIHNsaWNlIGVhY2ggY29ycnVwdGVkIChub3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQpIG1hY3JvYmxvY2sKKyAgICAgICAgICAgIGJlbG9uZ3MuCisKKyAgICAgICAgICAgIFRoZSBlcnJvciBjb25jZWFsbWVudCBpcyBzdGFydGVkIGJ5IHNlYXJjaGluZyB0aGUgZmlyc3QgcHJvcG9lcmx5CisgICAgICAgICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgYW5kIGNvbmNlYWxpbmcgdGhlIHJvdyBjb250YWluaW5nIHRoZSBtYWNyb2Jsb2NrCisgICAgICAgICAgICBpbiBxdWVzdGlvbi4gQWZ0ZXIgdGhhdCBhbGwgbWFjcm9ibG9ja3MgYWJvdmUgdGhlIHJvdyBpbiBxdWVzdGlvbgorICAgICAgICAgICAgYXJlIGNvbmNlYWxlZC4gRmluYWxseSBjb25jZWFsbWVudCBvZiByb3dzIGJlbG93IGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICAgIFRoZSBvcmRlciBvZiBjb25jZWFsbWVudCBmb3IgNHg0IHBpY3R1cmUgd2hlcmUgbWFjcm9ibG9jayA5IGlzIHRoZQorICAgICAgICAgICAgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBvbmUgaXMgYXMgZm9sbG93cyAocHJvcGVybHkgZGVjb2RlZAorICAgICAgICAgICAgbWFjcm9ibG9ja3MgbWFya2VkIHdpdGggJ3gnLCBudW1iZXJzIGluZGljYXRpbmcgdGhlIG9yZGVyIG9mCisgICAgICAgICAgICBjb25jZWFsbWVudCk6CisKKyAgICAgICAgICAgICAgIDQgIDYgIDggMTAKKyAgICAgICAgICAgICAgIDMgIDUgIDcgIDkKKyAgICAgICAgICAgICAgIDEgIHggIHggIDIKKyAgICAgICAgICAgICAgMTEgMTIgMTMgMTQKKworICAgICAgICAgICAgSWYgYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBwaWN0dXJlIGFyZSBsb3N0LCB0aGUgY29uY2VhbG1lbnQgaXMKKyAgICAgICAgICAgIGNvcHkgb2YgcHJldmlvdXMgcGljdHVyZSBmb3IgUC10eXBlIGFuZCBzZXR0aW5nIHRoZSBpbWFnZSB0bworICAgICAgICAgICAgY29uc3RhbnQgZ3JheSAocGl4ZWwgdmFsdWUgMTI4KSBmb3IgSS10eXBlLgorCisgICAgICAgICAgICBDb25jZWFsbWVudCBzZXRzIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGNvbmNlYWxlZAorICAgICAgICAgICAgbWFjcm9ibG9ja3MgdG8gdmFsdWUgNDAgYW5kIG1hY3JvYmxvY2sgdHlwZSB0byBpbnRyYSB0byBlbmFibGUKKyAgICAgICAgICAgIGRlYmxvY2tpbmcgZmlsdGVyIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIGNvbmNlYWxlZCBhcmVhcy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBpbWFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHNsaWNlVHlwZSAgICAgICB0eXBlIG9mIHRoZSBzbGljZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgY29uY2VhbGVkIG1hY3JvYmxvY2tzIHdpbGwgYmUgd3JpdHRlbiBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiByb3csIGNvbDsKKyAgICB1MzIgd2lkdGgsIGhlaWdodDsKKyAgICB1OCAqcmVmRGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqbWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKGN1cnJJbWFnZSk7CisKKyAgICBERUJVRygoIkNvbmNlYWxpbmcgJXMgc2xpY2VcbiIsIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSA/CisgICAgICAgICAgICAiaW50cmEiIDogImludGVyIikpOworCisgICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworICAgIHJlZkRhdGEgPSBOVUxMOworICAgIC8qIHVzZSByZWZlcmVuY2UgcGljdHVyZSB3aXRoIHNtYWxsZXN0IGF2YWlsYWJsZSBpbmRleCAqLworICAgIGlmIChJU19QX1NMSUNFKHNsaWNlVHlwZSkgfHwgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyAhPSAwKSkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICByZWZEYXRhID0gaDI2NGJzZEdldFJlZlBpY0RhdGEocFN0b3JhZ2UtPmRwYiwgaSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaSA+PSAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSB3aGlsZSAocmVmRGF0YSA9PSBOVUxMKTsKKyAgICB9CisKKyAgICBpID0gcm93ID0gY29sID0gMDsKKyAgICAvKiBmaW5kIGZpcnN0IHByb3Blcmx5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBzdGFydCBwb2ludCBmb3IgY29uY2VhbG1lbnQgKi8KKyAgICB3aGlsZSAoaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMgJiYgIXBTdG9yYWdlLT5tYltpXS5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgaSsrOworICAgICAgICBjb2wrKzsKKyAgICAgICAgaWYgKGNvbCA9PSB3aWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogd2hvbGUgcGljdHVyZSBsb3N0IC0+IGNvcHkgcHJldmlvdXMgb3Igc2V0IGdyZXkgKi8KKyAgICBpZiAoaSA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgIHsKKyAgICAgICAgaWYgKCAoSVNfSV9TTElDRShzbGljZVR5cGUpICYmIChwU3RvcmFnZS0+aW50cmFDb25jZWFsbWVudEZsYWcgPT0gMCkpIHx8CisgICAgICAgICAgICAgcmVmRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGN1cnJJbWFnZS0+ZGF0YSwgMTI4LCB3aWR0aCpoZWlnaHQqMzg0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KGN1cnJJbWFnZS0+ZGF0YSwgcmVmRGF0YSwgd2lkdGgqaGVpZ2h0KjM4NCk7CisKKyAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyA9IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7CisKKyAgICAgICAgLyogbm8gZmlsdGVyaW5nIGlmIHdob2xlIHBpY3R1cmUgY29uY2VhbGVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCisgICAgICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAxOworCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworICAgIC8qIHN0YXJ0IGZyb20gdGhlIHJvdyBjb250YWluaW5nIHRoZSBmaXJzdCBjb3JyZWN0IG1hY3JvYmxvY2ssIGNvbmNlYWwgdGhlCisgICAgICogcm93IGluIHF1ZXN0aW9uLCBhbGwgcm93cyBhYm92ZSB0aGF0IHJvdyBhbmQgdGhlbiBjb250aW51ZSBkb3dud2FyZHMgKi8KKyAgICBtYiA9IHBTdG9yYWdlLT5tYiArIHJvdyAqIHdpZHRoOworICAgIGZvciAoaiA9IGNvbDsgai0tOykKKyAgICB7CisgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7CisgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICB9CisgICAgZm9yIChqID0gY29sICsgMTsgaiA8IHdpZHRoOyBqKyspCisgICAgeworICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOworICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIHByZXZpb3VzIHJvdyhzKSBjb3VsZCBub3QgYmUgY29uY2VhbGVkIC0+IGNvbmNlYWwgdGhlbSBub3cgKi8KKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSByb3cgLSAxOworICAgICAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpKndpZHRoICsgajsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iLCBjdXJySW1hZ2UsIGksIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7CisgICAgICAgICAgICAgICAgbWItPmRlY29kZWQgPSAxOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICAgICAgICAgICAgICBtYiAtPSB3aWR0aDsKKyAgICAgICAgICAgIH0gd2hpbGUoaS0tKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHByb2Nlc3Mgcm93cyBiZWxvdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jayAqLworICAgIGZvciAoaSA9IHJvdyArIDE7IGkgPCBoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgaSAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IENvbmNlYWxNYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBvbmUgbWFjcm9ibG9jaywgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBwaWN0dXJlIGluZGljYXRlZCBieSByb3cgYW5kIGNvbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKKyAgICB1MzIgc2xpY2VUeXBlLCB1OCAqcmVmRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgY29tcDsKKyAgICB1MzIgaG9yLCB2ZXI7CisgICAgdTMyIG1iTnVtOworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIHU4ICptYlBvczsKKyAgICB1OCBkYXRhWzM4NF07CisgICAgdTggKnBEYXRhOworICAgIGkzMiB0bXA7CisgICAgaTMyIGZpcnN0UGhhc2VbMTZdOworICAgIGkzMiAqcFRtcDsKKyAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBpMzIgYVs0XSwgYls0XSwgbFs0XSwgcls0XTsKKyAgICB1MzIgQSwgQiwgTCwgUjsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKKyAgICB1OCAqcEZpbGw7CisjZW5kaWYKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVCghcE1iLT5kZWNvZGVkKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKyAgICBBU1NFUlQoY29sIDwgY3VyckltYWdlLT53aWR0aCk7CisgICAgQVNTRVJUKHJvdyA8IGN1cnJJbWFnZS0+aGVpZ2h0KTsKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICBwRmlsbCA9IEFMSUdOKGZpbGxCdWZmLCAxNik7CisjZW5kaWYKKyAgICB3aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7CisgICAgbWJOdW0gPSByb3cgKiB3aWR0aCArIGNvbDsKKworICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGN1cnJJbWFnZSwgbWJOdW0pOworCisgICAgbWJQb3MgPSBjdXJySW1hZ2UtPmRhdGEgKyByb3cgKiAxNiAqIHdpZHRoICogMTYgKyBjb2wgKiAxNjsKKyAgICBBID0gQiA9IEwgPSBSID0gSEFOVFJPX0ZBTFNFOworCisgICAgLyogc2V0IHFwWSB0byA0MCB0byBlbmFibGUgc29tZSBmaWx0ZXJpbmcgaW4gZGVibG9ja2luZyAoc3RldHNvbiB2YWx1ZSkgKi8KKyAgICBwTWItPnFwWSA9IDQwOworICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAwOworICAgIC8qIG1iVHlwZSBzZXQgdG8gaW50cmEgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgZGVzcGl0ZSB0aGUgdmFsdWVzIG9mIG90aGVyCisgICAgICogYm91bmRhcnkgc3RyZW5ndGggZGV0ZXJtaW5hdGlvbiBmaWVsZHMgKi8KKyAgICBwTWItPm1iVHlwZSA9IElfNHg0OworICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IDA7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gMDsKKyAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSAwOworCisgICAgaWYgKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSkKKyAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXZfdCBtdiA9IHswLDB9OworICAgICAgICBpbWFnZV90IHJlZkltYWdlOworICAgICAgICByZWZJbWFnZS53aWR0aCA9IHdpZHRoOworICAgICAgICByZWZJbWFnZS5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHJlZkltYWdlLmRhdGEgPSByZWZEYXRhOworICAgICAgICBpZiAocmVmSW1hZ2UuZGF0YSkKKyAgICAgICAgeworI2lmbmRlZiBIMjY0REVDX09NWERMCisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgJm12LCAmcmVmSW1hZ2UsIGNvbCoxNiwgcm93KjE2LAorICAgICAgICAgICAgICAgIDAsIDAsIDE2LCAxNik7CisjZWxzZQorICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsICZtdiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAoKHJvdyoxNikgKyAoKGNvbCoxNik8PDE2KSksCisgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTAsIHBGaWxsKTsKKyNlbmRpZgorICAgICAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOworCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9CisKKyAgICBIMjY0U3dEZWNNZW1zZXQoZmlyc3RQaGFzZSwgMCwgc2l6ZW9mKGZpcnN0UGhhc2UpKTsKKworICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KKyAgICBqID0gMDsKKyAgICBob3IgPSB2ZXIgPSAwOworICAgIGlmIChyb3cgJiYgKHBNYi13aWR0aCktPmRlY29kZWQpCisgICAgeworICAgICAgICBBID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgLSB3aWR0aCoxNjsKKyAgICAgICAgYVswXSA9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOworICAgICAgICBhWzFdID0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7CisgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKKyAgICAgICAgYVszXSA9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOworICAgICAgICBqKys7CisgICAgICAgIGhvcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGFbMF0gKyBhWzFdICsgYVsyXSArIGFbM107CisgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYVswXSArIGFbMV0gLSBhWzJdIC0gYVszXTsKKyAgICB9CisgICAgaWYgKChyb3cgIT0gaGVpZ2h0IC0gMSkgJiYgKHBNYit3aWR0aCktPmRlY29kZWQpCisgICAgeworICAgICAgICBCID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgKyAxNip3aWR0aCoxNjsKKyAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOworICAgICAgICBiWzFdID0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7CisgICAgICAgIGJbMl0gPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsKKyAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOworICAgICAgICBqKys7CisgICAgICAgIGhvcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107CisgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYlswXSArIGJbMV0gLSBiWzJdIC0gYlszXTsKKyAgICB9CisgICAgaWYgKGNvbCAmJiAocE1iLTEpLT5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgTCA9IEhBTlRST19UUlVFOworICAgICAgICBwRGF0YSA9IG1iUG9zIC0gMTsKKyAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFswXSArPSBwRGF0YVszMip3aWR0aF07IGxbMF0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFsxXSA9IHBEYXRhWzBdOyBsWzFdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFsxXSArPSBwRGF0YVszMip3aWR0aF07IGxbMV0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFsyXSA9IHBEYXRhWzBdOyBsWzJdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFsyXSArPSBwRGF0YVszMip3aWR0aF07IGxbMl0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFszXSArPSBwRGF0YVszMip3aWR0aF07IGxbM10gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBqKys7CisgICAgICAgIHZlcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107CisgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gbFswXSArIGxbMV0gLSBsWzJdIC0gbFszXTsKKyAgICB9CisgICAgaWYgKChjb2wgIT0gd2lkdGggLSAxKSAmJiAocE1iKzEpLT5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgUiA9IEhBTlRST19UUlVFOworICAgICAgICBwRGF0YSA9IG1iUG9zICsgMTY7CisgICAgICAgIHJbMF0gPSBwRGF0YVswXTsgclswXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMF0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzBdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbMV0gPSBwRGF0YVswXTsgclsxXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMV0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzFdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMl0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzJdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbM10gPSBwRGF0YVswXTsgclszXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbM10gKz0gcERhdGFbMzIqd2lkdGhdOyByWzNdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgaisrOworICAgICAgICB2ZXIrKzsKKyAgICAgICAgZmlyc3RQaGFzZVswXSArPSByWzBdICsgclsxXSArIHJbMl0gKyByWzNdOworICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107CisgICAgfQorCisgICAgLyogYXQgbGVhc3Qgb25lIHByb3Blcmx5IGRlY29kZWQgbmVpZ2hib3VyIGF2YWlsYWJsZSAqLworICAgIEFTU0VSVChqKTsKKworICAgIC8qbGludCAtZXN5bSg2NDQsbCxyLGEsYikgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYWJvdmUgKi8KKyAgICBpZiAoIWhvciAmJiBMICYmIFIpCisgICAgICAgIGZpcnN0UGhhc2VbMV0gPSAobFswXStsWzFdK2xbMl0rbFszXS1yWzBdLXJbMV0tclsyXS1yWzNdKSA+PiA1OworICAgIGVsc2UgaWYgKGhvcikKKyAgICAgICAgZmlyc3RQaGFzZVsxXSA+Pj0gKDMraG9yKTsKKworICAgIGlmICghdmVyICYmIEEgJiYgQikKKyAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDU7CisgICAgZWxzZSBpZiAodmVyKQorICAgICAgICBmaXJzdFBoYXNlWzRdID4+PSAoMyt2ZXIpOworCisgICAgc3dpdGNoIChqKQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj42ICovCisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID0gKDIxICogZmlyc3RQaGFzZVswXSkgPj4gMTA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiA0ICovCisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKworICAgIFRyYW5zZm9ybShmaXJzdFBoYXNlKTsKKworICAgIGZvciAoaSA9IDAsIHBEYXRhID0gZGF0YSwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCAyNTY7KQorICAgIHsKKyAgICAgICAgdG1wID0gcFRtcFsoaSAmIDB4Rik+PjJdOworICAgICAgICAvKmxpbnQgLWU3MzQgQ0xJUDEgbWFjcm8gcmVzdWx0cyBpbiB2YWx1ZSB0aGF0IGZpdHMgaW50byA4IGJpdHMgKi8KKyAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOworICAgICAgICAvKmxpbnQgK2U3MzQgKi8KKworICAgICAgICBpKys7CisgICAgICAgIGlmICghKGkgJiAweDNGKSkKKyAgICAgICAgICAgIHBUbXAgKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgY29tcG9uZW50cyAqLworICAgIG1iUG9zID0gY3VyckltYWdlLT5kYXRhICsgd2lkdGggKiBoZWlnaHQgKiAyNTYgKworICAgICAgIHJvdyAqIDggKiB3aWR0aCAqIDggKyBjb2wgKiA4OworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCAyOyBjb21wKyspCisgICAgeworCisgICAgICAgIEgyNjRTd0RlY01lbXNldChmaXJzdFBoYXNlLCAwLCBzaXplb2YoZmlyc3RQaGFzZSkpOworCisgICAgICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KKyAgICAgICAgaiA9IDA7CisgICAgICAgIGhvciA9IHZlciA9IDA7CisgICAgICAgIGlmIChBKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YSA9IG1iUG9zIC0gd2lkdGgqODsKKyAgICAgICAgICAgIGFbMF0gPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbMV0gPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbM10gPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGhvcisrOworICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBhWzBdICsgYVsxXSArIGFbMl0gKyBhWzNdOworICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBhWzBdICsgYVsxXSAtIGFbMl0gLSBhWzNdOworICAgICAgICB9CisgICAgICAgIGlmIChCKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YSA9IG1iUG9zICsgOCp3aWR0aCo4OworICAgICAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlsxXSA9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlsyXSA9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaG9yKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGJbMF0gKyBiWzFdIC0gYlsyXSAtIGJbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgLSAxOworICAgICAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICBsWzFdID0gcERhdGFbMF07IGxbMV0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIGxbMl0gPSBwRGF0YVswXTsgbFsyXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgdmVyKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IGxbMF0gKyBsWzFdIC0gbFsyXSAtIGxbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgKyA4OworICAgICAgICAgICAgclswXSA9IHBEYXRhWzBdOyByWzBdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICByWzFdID0gcERhdGFbMF07IHJbMV0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgclszXSA9IHBEYXRhWzBdOyByWzNdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgdmVyKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IHJbMF0gKyByWzFdICsgclsyXSArIHJbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFob3IgJiYgTCAmJiBSKQorICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSA9IChsWzBdK2xbMV0rbFsyXStsWzNdLXJbMF0tclsxXS1yWzJdLXJbM10pID4+IDQ7CisgICAgICAgIGVsc2UgaWYgKGhvcikKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gPj49ICgyK2hvcik7CisKKyAgICAgICAgaWYgKCF2ZXIgJiYgQSAmJiBCKQorICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDQ7CisgICAgICAgIGVsc2UgaWYgKHZlcikKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gPj49ICgyK3Zlcik7CisKKyAgICAgICAgc3dpdGNoIChqKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj41ICovCisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA9ICgyMSAqIGZpcnN0UGhhc2VbMF0pID4+IDk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIDQgKi8KKyAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA1OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBUcmFuc2Zvcm0oZmlyc3RQaGFzZSk7CisKKyAgICAgICAgcERhdGEgPSBkYXRhICsgMjU2ICsgY29tcCo2NDsKKyAgICAgICAgZm9yIChpID0gMCwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCA2NDspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IHBUbXBbKGkgJiAweDcpPj4xXTsKKyAgICAgICAgICAgIC8qbGludCAtZTczNCBDTElQMSBtYWNybyByZXN1bHRzIGluIHZhbHVlIHRoYXQgZml0cyBpbnRvIDggYml0cyAqLworICAgICAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOworICAgICAgICAgICAgLypsaW50ICtlNzM0ICovCisKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmICghKGkgJiAweEYpKQorICAgICAgICAgICAgICAgIHBUbXAgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluY3JlbWVudCBwb2ludGVycyBmb3IgY3IgKi8KKyAgICAgICAgbWJQb3MgKz0gd2lkdGggKiBoZWlnaHQgKiA2NDsKKyAgICB9CisKKyAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBUcmFuc2Zvcm0KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2ltcGxpZmllZCB0cmFuc2Zvcm0sIGFzc3VtaW5nIHRoYXQgb25seSBkYyBjb21wb25lbnQgYW5kIGxvd2VzdAorICAgICAgICAgICAgaG9yaXpvbnRhbCBhbmQgbG93ZXN0IHZlcnRpY2FsIGNvbXBvbmVudCBtYXkgYmUgbm9uLXplcm8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBUcmFuc2Zvcm0oaTMyICpkYXRhKQoreworCisgICAgdTMyIGNvbDsKKyAgICBpMzIgdG1wMCwgdG1wMTsKKworICAgIGlmICghZGF0YVsxXSAmJiAhZGF0YVs0XSkKKyAgICB7CisgICAgICAgIGRhdGFbMV0gID0gZGF0YVsyXSAgPSBkYXRhWzNdICA9IGRhdGFbNF0gID0gZGF0YVs1XSAgPQorICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KKyAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9IGRhdGFbMF07CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogZmlyc3QgaG9yaXpvbnRhbCB0cmFuc2Zvcm0gZm9yIHJvd3MgMCBhbmQgMSAqLworICAgIHRtcDAgPSBkYXRhWzBdOworICAgIHRtcDEgPSBkYXRhWzFdOworICAgIGRhdGFbMF0gPSB0bXAwICsgdG1wMTsKKyAgICBkYXRhWzFdID0gdG1wMCArICh0bXAxPj4xKTsKKyAgICBkYXRhWzJdID0gdG1wMCAtICh0bXAxPj4xKTsKKyAgICBkYXRhWzNdID0gdG1wMCAtIHRtcDE7CisKKyAgICB0bXAwID0gZGF0YVs0XTsKKyAgICBkYXRhWzVdID0gdG1wMDsKKyAgICBkYXRhWzZdID0gdG1wMDsKKyAgICBkYXRhWzddID0gdG1wMDsKKworICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgIHsKKyAgICAgICAgdG1wMCA9IGRhdGFbMF07CisgICAgICAgIHRtcDEgPSBkYXRhWzRdOworICAgICAgICBkYXRhWzBdID0gdG1wMCArIHRtcDE7CisgICAgICAgIGRhdGFbNF0gPSB0bXAwICsgKHRtcDE+PjEpOworICAgICAgICBkYXRhWzhdID0gdG1wMCAtICh0bXAxPj4xKTsKKyAgICAgICAgZGF0YVsxMl0gPSB0bXAwIC0gdG1wMTsKKyAgICB9CisKK30KKy8qbGludCArZTcwMiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTM0NjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NPTkNFQUxfSAorI2RlZmluZSBIMjY0U1dERUNfQ09OQ0VBTF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDb25jZWFsKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHNsaWNlVHlwZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NPTkNFQUxfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTliNzRhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NPTlRBSU5FUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19DT05UQUlORVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN0cmluZyBsZW5ndGggZm9yIHRyYWNpbmcgKi8KKyNkZWZpbmUgSDI2NERFQ19UUkFDRV9TVFJfTEVOIDEwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIElOSVRJQUxJWkVELAorICAgICAgICBORVdfSEVBREVSUworICAgIH0gZGVjU3RhdDsKKworICAgIHUzMiBwaWNOdW1iZXI7CisgICAgc3RvcmFnZV90IHN0b3JhZ2U7CisjaWZkZWYgSDI2NERFQ19UUkFDRQorICAgIGNoYXIgc3RyW0gyNjRERUNfVFJBQ0VfU1RSX0xFTl07CisjZW5kaWYKK30gZGVjQ29udGFpbmVyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDQ09OVEFJTkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjhjMWY3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKQEAgLTAsMCArMSwyNDE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEZpbHRlclBpY3R1cmUKKyAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZQorICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yTHVtYQorICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UKKyAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yQ2hyb21hCisgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoCisgICAgICAgICAgRWRnZUJvdW5kYXJ5U3RyZW5ndGgKKyAgICAgICAgICBHZXRCb3VuZGFyeVN0cmVuZ3RocworICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uTGVmdAorICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uVG9wCisgICAgICAgICAgR2V0TWJGaWx0ZXJpbmdGbGFncworICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcworICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCisgICAgICAgICAgRmlsdGVyTHVtYQorICAgICAgICAgIEZpbHRlckNocm9tYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqLworLypsaW50IC1lNzAxIC1lNzAyICovCisKKy8qIGFycmF5IG9mIGFscGhhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBjb25zdCB1OCBhbHBoYXNbNTJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCw0LDUsNiw3LDgsOSwxMCwKKyAgICAxMiwxMywxNSwxNywyMCwyMiwyNSwyOCwzMiwzNiw0MCw0NSw1MCw1Niw2Myw3MSw4MCw5MCwxMDEsMTEzLDEyNywxNDQsMTYyLAorICAgIDE4MiwyMDMsMjI2LDI1NSwyNTV9OworCisvKiBhcnJheSBvZiBiZXRhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBjb25zdCB1OCBiZXRhc1s1Ml0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMiwzLDMsMywzLDQsNCwKKyAgICA0LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOH07CisKKworCisjaWZuZGVmIEgyNjRERUNfT01YREwKKy8qIGFycmF5IG9mIHRjMCB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkLCBlYWNoIHRyaXBsZXQgY29ycmVzcG9uZHMgdG8gYQorICogY29sdW1uIGluIHRoZSB0YWJsZS4gSW5kZXhpbmcgZ29lcyBhcyB0YzBbaW5kZXhBXVtiUy0xXSAqLworc3RhdGljIGNvbnN0IHU4IHRjMFs1Ml1bM10gPSB7CisgICAgezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LAorICAgIHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSwKKyAgICB7MCwwLDB9LHswLDAsMX0sezAsMCwxfSx7MCwwLDF9LHswLDAsMX0sezAsMSwxfSx7MCwxLDF9LHsxLDEsMX0sCisgICAgezEsMSwxfSx7MSwxLDF9LHsxLDEsMX0sezEsMSwyfSx7MSwxLDJ9LHsxLDEsMn0sezEsMSwyfSx7MSwyLDN9LAorICAgIHsxLDIsM30sezIsMiwzfSx7MiwyLDR9LHsyLDMsNH0sezIsMyw0fSx7MywzLDV9LHszLDQsNn0sezMsNCw2fSwKKyAgICB7NCw1LDd9LHs0LDUsOH0sezQsNiw5fSx7NSw3LDEwfSx7Niw4LDExfSx7Niw4LDEzfSx7NywxMCwxNH0sezgsMTEsMTZ9LAorICAgIHs5LDEyLDE4fSx7MTAsMTMsMjB9LHsxMSwxNSwyM30sezEzLDE3LDI1fQorfTsKKyNlbHNlCisvKiBhcnJheSBvZiB0YzAgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCwgZWFjaCB0cmlwbGV0IGNvcnJlc3BvbmRzIHRvIGEKKyAqIGNvbHVtbiBpbiB0aGUgdGFibGUuIEluZGV4aW5nIGdvZXMgYXMgdGMwW2luZGV4QV1bYlNdICovCitzdGF0aWMgY29uc3QgdTggdGMwWzUyXVs1XSA9IHsKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDAsIDEsIDB9LAorICAgIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDEsIDEsIDB9LCB7MCwgMCwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwKKyAgICB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMiwgMH0sCisgICAgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDIsIDMsIDB9LAorICAgIHswLCAxLCAyLCAzLCAwfSwgezAsIDIsIDIsIDMsIDB9LCB7MCwgMiwgMiwgNCwgMH0sIHswLCAyLCAzLCA0LCAwfSwKKyAgICB7MCwgMiwgMywgNCwgMH0sIHswLCAzLCAzLCA1LCAwfSwgezAsIDMsIDQsIDYsIDB9LCB7MCwgMywgNCwgNiwgMH0sCisgICAgezAsIDQsIDUsIDcsIDB9LCB7MCwgNCwgNSwgOCwgMH0sIHswLCA0LCA2LCA5LCAwfSwgezAsIDUsIDcsIDEwLCAwfSwKKyAgICB7MCwgNiwgOCwgMTEsIDB9LCB7MCwgNiwgOCwgMTMsIDB9LCB7MCwgNywgMTAsIDE0LCAwfSwKKyAgICB7MCwgOCwgMTEsIDE2LCAwfSwgezAsIDksIDEyLCAxOCwgMH0sIHswLCAxMCwgMTMsIDIwLCAwfSwKKyAgICB7MCwgMTEsIDE1LCAyMywgMH0sIHswLCAxMywgMTcsIDI1LCAwfQorfTsKKyNlbmRpZgorCisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyogbWFwcGluZyBvZiByYXN0ZXIgc2NhbiBibG9jayBpbmRleCB0byA0eDQgYmxvY2sgaW5kZXggKi8KK3N0YXRpYyBjb25zdCB1MzIgbWI0eDRJbmRleFsxNl0gPQorICAgIHswLCAxLCA0LCA1LCAyLCAzLCA2LCA3LCA4LCA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1fTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHU4ICp0YzA7CisgICAgdTMyIGFscGhhOworICAgIHUzMiBiZXRhOworfSBlZGdlVGhyZXNob2xkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1MzIgdG9wOworICAgIHUzMiBsZWZ0OworfSBiU190OworCitlbnVtIHsgVE9QID0gMCwgTEVGVCA9IDEsIElOTkVSID0gMiB9OworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworI2RlZmluZSBGSUxURVJfTEVGVF9FREdFICAgIDB4MDQKKyNkZWZpbmUgRklMVEVSX1RPUF9FREdFICAgICAweDAyCisjZGVmaW5lIEZJTFRFUl9JTk5FUl9FREdFICAgMHgwMQorCisKKy8qIGNsaXBwaW5nIHRhYmxlIGRlZmluZWQgaW4gaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaTEsIHUzMiBpMik7CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAorICAgIHUzMiBpMSwgdTMyIGkyKTsKKyNlbHNlCitzdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aDIobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGkxLCB1MzIgaTIpOworc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMik7CitzdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpOworI2VuZGlmCisKK3N0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iU3RvcmFnZV90ICptYik7CisKK3N0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKTsKKworc3RhdGljIHUzMiBHZXRNYkZpbHRlcmluZ0ZsYWdzKG1iU3RvcmFnZV90ICptYik7CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorCitzdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgYlNfdCAqYnMsIHUzMiBmbGFncyk7CisKK3N0YXRpYyB2b2lkIEZpbHRlckx1bWEodTggKmRhdGEsIGJTX3QgKmJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgRmlsdGVyQ2hyb21hKHU4ICpjYiwgdTggKmNyLCBiU190ICpiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7CisKK3N0YXRpYyB2b2lkIEZpbHRlclZlckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIGkzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckx1bWEoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgICAgICAgaTMyIGltYWdlV2lkdGgpOworCitzdGF0aWMgdm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckNocm9tYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgaTMyIGltYWdlV2lkdGgpOworc3RhdGljIHZvaWQgRmlsdGVySG9yQ2hyb21hKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIG1iU3RvcmFnZV90ICptYiwKKyAgdTMyIGZpbHRlcmluZ0ZsYWdzKTsKKworc3RhdGljIHZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgbWJTdG9yYWdlX3QgKm1iLAorICB1MzIgZmlsdGVyaW5nRmxhZ3MsCisgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworCitzdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgdTggKCpicylbMTZdLCB1MzIgZmxhZ3MpOworCitzdGF0aWMgdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCisgICAgbWJTdG9yYWdlX3QgKm1iLAorICAgIHU4ICgqYWxwaGEpWzJdLAorICAgIHU4ICgqYmV0YSlbMl0sCisgICAgdTggKCp0aHJlc2hvbGQpWzE2XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzICk7CisKK3N0YXRpYyB2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJc1NsaWNlQm91bmRhcnlPbkxlZnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgb24gdGhlIGxlZnQgc2lkZQorICAgICAgICAgICAgb2YgYSBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIElzU2xpY2VCb3VuZGFyeU9uTGVmdChtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWIgJiYgbWItPm1iQSk7CisKKyAgICBpZiAobWItPnNsaWNlSWQgIT0gbWItPm1iQS0+c2xpY2VJZCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSXNTbGljZUJvdW5kYXJ5T25Ub3AKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgYWJvdmUgdGhlCisgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iICYmIG1iLT5tYkIpOworCisgICAgaWYgKG1iLT5zbGljZUlkICE9IG1iLT5tYkItPnNsaWNlSWQpCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldE1iRmlsdGVyaW5nRmxhZ3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBlZGdlcyBvZiBhIG1hY3JvYmxvY2sgaGFzIHRvIGJlCisgICAgICAgICAgZmlsdGVyZWQuIE91dHB1dCBpcyBhIGJpdC13aXNlIE9SIG9mIEZJTFRFUl9MRUZUX0VER0UsCisgICAgICAgICAgRklMVEVSX1RPUF9FREdFIGFuZCBGSUxURVJfSU5ORVJfRURHRSwgZGVwZW5kaW5nIG9uIHdoaWNoIGVkZ2VzCisgICAgICAgICAgc2hhbGwgYmUgZmlsdGVyZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgR2V0TWJGaWx0ZXJpbmdGbGFncyhtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iKTsKKworICAgIC8qIG5vdGhpbmcgd2lsbCBiZSBmaWx0ZXJlZCBpZiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9PSAxICovCisgICAgaWYgKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQorICAgIHsKKyAgICAgICAgZmxhZ3MgfD0gRklMVEVSX0lOTkVSX0VER0U7CisKKyAgICAgICAgLyogZmlsdGVyTGVmdE1iRWRnZUZsYWcsIGxlZnQgbWIgaXMgTUJfQSAqLworICAgICAgICBpZiAobWItPm1iQSAmJgorICAgICAgICAgICAgKChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMikgfHwKKyAgICAgICAgICAgICAhSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iKSkpCisgICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfTEVGVF9FREdFOworCisgICAgICAgIC8qIGZpbHRlclRvcE1iRWRnZUZsYWcgKi8KKyAgICAgICAgaWYgKG1iLT5tYkIgJiYKKyAgICAgICAgICAgICgobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDIpIHx8CisgICAgICAgICAgICAgIUlzU2xpY2VCb3VuZGFyeU9uVG9wKG1iKSkpCisgICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfVE9QX0VER0U7CisgICAgfQorCisgICAgcmV0dXJuKGZsYWdzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IElubmVyQm91bmRhcnlTdHJlbmd0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlIGlzIGNoZWNrZWQgYmVmb3JlIHRoaXMgaXMKKyAgICAgICAgICAgIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb24gaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGluZDEsIHUzMiBpbmQyKQoreworICAgIGkzMiB0bXAxLCB0bXAyOworICAgIGkzMiBtdjEsIG12MiwgbXYzLCBtdjQ7CisKKyAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmW2luZDFdOworICAgIHRtcDIgPSBtYjEtPnRvdGFsQ29lZmZbaW5kMl07CisgICAgbXYxID0gbWIxLT5tdltpbmQxXS5ob3I7CisgICAgbXYyID0gbWIxLT5tdltpbmQyXS5ob3I7CisgICAgbXYzID0gbWIxLT5tdltpbmQxXS52ZXI7CisgICAgbXY0ID0gbWIxLT5tdltpbmQyXS52ZXI7CisKKyAgICBpZiAodG1wMSB8fCB0bXAyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgaWYgKCAoQUJTKG12MSAtIG12MikgPj0gNCkgfHwgKEFCUyhtdjMgLSBtdjQpID49IDQpIHx8CisgICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gVGhlIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzCisgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGggYnV0IHdpdGhvdXQgY2hlY2tpbmcgdG90YWxDb2VmZi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpbmQxLCB1MzIgaW5kMikKK3sKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgIHRtcDEgPSBtYjEtPm12W2luZDFdLmhvcjsKKyAgICB0bXAyID0gbWIxLT5tdltpbmQyXS5ob3I7CisgICAgdG1wMyA9IG1iMS0+bXZbaW5kMV0udmVyOworICAgIHRtcDQgPSBtYjEtPm12W2luZDJdLnZlcjsKKworICAgIGlmICggKEFCUyh0bXAxIC0gdG1wMikgPj0gNCkgfHwgKEFCUyh0bXAzIC0gdG1wNCkgPj0gNCkgfHwKKyAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtIG9yCisgICAgICAgICAgICB0b3AtbW9zdCBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAorICAgIHUzMiBpbmQxLCB1MzIgaW5kMikKK3sKKworICAgIGlmIChtYjEtPnRvdGFsQ29lZmZbaW5kMV0gfHwgbWIyLT50b3RhbENvZWZmW2luZDJdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgaWYgKChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbaW5kMiA+PiAyXSkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbaW5kMV0uaG9yIC0gbWIyLT5tdltpbmQyXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12W2luZDFdLnZlciAtIG1iMi0+bXZbaW5kMl0udmVyKSA+PSA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvcgorICAgICAgICAgICAgdG9wLW1vc3QgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKKyAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKK3sKKyAgICB1MzIgdG9wQnMgPSAwOworICAgIHUzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZlswXTsKKyAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzEwXTsKKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzFdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTFdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICB0b3BCcyA9IDI8PDA7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlswXS5ob3IgLSBtYjItPm12WzEwXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzBdLnZlciAtIG1iMi0+bXZbMTBdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMCA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyA9IDE8PDA7CisgICAgfQorICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbNF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxNF07CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIHRvcEJzICs9IDI8PDg7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsxXS5ob3IgLSBtYjItPm12WzExXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzFdLnZlciAtIG1iMi0+bXZbMTFdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMSA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyArPSAxPDw4OworICAgIH0KKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzVdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICB0b3BCcyArPSAyPDwxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzRdLmhvciAtIG1iMi0+bXZbMTRdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNF0udmVyIC0gbWIyLT5tdlsxNF0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTQgPj4gMl0pKQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMTw8MTY7CisgICAgfQorICAgIGlmICh0bXAzIHx8IHRtcDQpCisgICAgeworICAgICAgICB0b3BCcyArPSAyPDwyNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzVdLmhvciAtIG1iMi0+bXZbMTVdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNV0udmVyIC0gbWIyLT5tdlsxNV0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMTw8MjQ7CisgICAgfQorCisgICAgcmV0dXJuIHRvcEJzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKK3sKKyAgICB1MzIgbGVmdEJzID0gMDsKKyAgICB1MzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbMF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZls1XTsKKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzJdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbN107CisKKyAgICBpZiAodG1wMSB8fCB0bXAyKQorICAgIHsKKyAgICAgICAgbGVmdEJzID0gMjw8MDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzBdLmhvciAtIG1iMi0+bXZbNV0uaG9yKSA+PSA0KSB8fAorICAgICAgICAgICAgIChBQlMobWIxLT5tdlswXS52ZXIgLSBtYjItPm12WzVdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkcls1ID4+IDJdKSkKKyAgICB7CisgICAgICAgIGxlZnRCcyA9IDE8PDA7CisgICAgfQorICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbOF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxM107CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDw4OworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMl0uaG9yIC0gbWIyLT5tdls3XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzJdLnZlciAtIG1iMi0+bXZbN10udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzcgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDg7CisgICAgfQorICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMTBdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICBsZWZ0QnMgKz0gMjw8MTY7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls4XS5ob3IgLSBtYjItPm12WzEzXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzhdLnZlciAtIG1iMi0+bXZbMTNdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzggPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzEzID4+IDJdKSkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAxPDwxNjsKKyAgICB9CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDwyNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzEwXS5ob3IgLSBtYjItPm12WzE1XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzEwXS52ZXIgLSBtYjItPm12WzE1XS52ZXIpID49IDQpIHx8CisgICAgICAgICAgICAgKG1iMS0+cmVmQWRkclsxMCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDI0OworICAgIH0KKworICAgIHJldHVybiBsZWZ0QnM7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsdGVyUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZyBmb3IgYSBwaWN0dXJlLiBGaWx0ZXIgZG9lcyBub3QgY29weQorICAgICAgICAgIHRoZSBvcmlnaW5hbCBwaWN0dXJlIGFueXdoZXJlIGJ1dCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGRpcmVjdGx5CisgICAgICAgICAgb24gdGhlIG9yaWdpbmFsIGltYWdlLiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcworICAgICAgICAgIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgb2YgdGhlCisgICAgICAgICAgZmlsdGVyZWQgbWFjcm9ibG9jaywgbWFjcm9ibG9jayBhYm92ZSBhbmQgbWFjcm9ibG9jayBvbiB0aGUgbGVmdCBvZgorICAgICAgICAgIHRoZSBmaWx0ZXJlZCBvbmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBpbWFnZSB0byBiZSBmaWx0ZXJlZAorICAgICAgICAgIG1iICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgc3RydWN0dXJlIG9mIHRoZSB0b3AtbGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayBvZiB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgaW1hZ2UgICAgICAgICBmaWx0ZXJlZCBpbWFnZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAorICBpbWFnZV90ICppbWFnZSwKKyAgbWJTdG9yYWdlX3QgKm1iKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBmbGFnczsKKyAgICB1MzIgcGljU2l6ZUluTWJzLCBtYlJvdywgbWJDb2w7CisgICAgdTMyIHBpY1dpZHRoSW5NYnM7CisgICAgdTggKmRhdGE7CisgICAgbWJTdG9yYWdlX3QgKnBNYjsKKyAgICBiU190IGJTWzE2XTsKKyAgICBlZGdlVGhyZXNob2xkX3QgdGhyZXNob2xkc1szXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQobWIpOworICAgIEFTU0VSVChpbWFnZS0+ZGF0YSk7CisgICAgQVNTRVJUKGltYWdlLT53aWR0aCk7CisgICAgQVNTRVJUKGltYWdlLT5oZWlnaHQpOworCisgICAgcGljV2lkdGhJbk1icyA9IGltYWdlLT53aWR0aDsKKyAgICBkYXRhID0gaW1hZ2UtPmRhdGE7CisgICAgcGljU2l6ZUluTWJzID0gcGljV2lkdGhJbk1icyAqIGltYWdlLT5oZWlnaHQ7CisKKyAgICBwTWIgPSBtYjsKKworICAgIGZvciAobWJSb3cgPSAwLCBtYkNvbCA9IDA7IG1iUm93IDwgaW1hZ2UtPmhlaWdodDsgcE1iKyspCisgICAgeworICAgICAgICBmbGFncyA9IEdldE1iRmlsdGVyaW5nRmxhZ3MocE1iKTsKKworICAgICAgICBpZiAoZmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldEJvdW5kYXJ5U3RyZW5ndGhzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgYW55IG9mCisgICAgICAgICAgICAgKiB0aGUgYlMgdmFsdWVzIGZvciB0aGUgbWFjcm9ibG9jayBiZWluZyBwcm9jZXNzZWQgd2FzIG5vbi16ZXJvICovCisgICAgICAgICAgICBpZiAoR2V0Qm91bmRhcnlTdHJlbmd0aHMocE1iLCBiUywgZmxhZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGx1bWEgKi8KKyAgICAgICAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHModGhyZXNob2xkcywgcE1iLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogMjU2ICsgbWJDb2wgKiAxNjsKKworICAgICAgICAgICAgICAgIEZpbHRlckx1bWEoKHU4KilkYXRhLCBiUywgdGhyZXNob2xkcywgcGljV2lkdGhJbk1icyoxNik7CisKKyAgICAgICAgICAgICAgICAvKiBjaHJvbWEgKi8KKyAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyh0aHJlc2hvbGRzLCBwTWIsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCisgICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OworCisgICAgICAgICAgICAgICAgRmlsdGVyQ2hyb21hKCh1OCopZGF0YSwgZGF0YSArIDY0KnBpY1NpemVJbk1icywgYlMsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzLCBwaWNXaWR0aEluTWJzKjgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYkNvbCsrOworICAgICAgICBpZiAobWJDb2wgPT0gcGljV2lkdGhJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgbWJDb2wgPSAwOworICAgICAgICAgICAgbWJSb3crKzsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlclZlckx1bWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgNC1waXhlbCBsdW1hIGVkZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlclZlckx1bWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIHUzMiB0bXBGbGFnOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyAmJiBiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07CisgICAgICAgIHRtcCA9IHRjOworICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGEgKz0gaW1hZ2VXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworCisgICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICAgICAgdG1wID0gdGM7CisgICAgICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSArPSBpbWFnZVdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcEZsYWcgPQorICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKKworICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHAxICsgcDAgKyBxMDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAodTgpKChwMiArIDIgKiB0bXAgKyBxMSArIDQpID4+IDMpOworICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkoKHAyICsgdG1wICsgMikgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLTNdID0gKHU4KSgoMiAqIGRhdGFbLTRdICsgMyAqIHAyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisKKyAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMCArIHEwICsgcTE7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAodTgpKChwMSArIDIgKiB0bXAgKyBxMiArIDQpID4+IDMpOworICAgICAgICAgICAgICAgICAgICBkYXRhWzFdID0gKHU4KSgodG1wICsgcTIgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSA9ICh1OCkoKDIgKiBkYXRhWzNdICsgMyAqIHEyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICh1OCkoKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckx1bWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgaG9yaXpvbnRhbCA0LXBpeGVsIGx1bWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JMdW1hRWRnZSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgaW1hZ2VXaWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjLCB0bXA7CisgICAgdTMyIGk7CisgICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPCA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKKyAgICB0bXAgPSB0YzsKKyAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGErKykKKyAgICB7CisgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKKyAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICB7CisgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAorICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gcDA7CisgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JMdW1hCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBhbGwgZm91ciBzdWNjZXNzaXZlIGhvcml6b250YWwgNC1waXhlbCBsdW1hIGVkZ2VzLiBUaGlzIGNhbgorICAgICAgICAgICAgYmUgZG9uZSB3aGVuIGJTIGlzIGVxdWFsIHRvIGFsbCBmb3VyIGVkZ2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JMdW1hKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIHUzMiB0bXBGbGFnOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07CisgICAgICAgIHRtcCA9IHRjOworICAgICAgICBmb3IgKGkgPSAxNjsgaTsgaS0tLCBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9IHAwOworICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE2OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcEZsYWcgPSAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDEgKyBwMCArIHEwOworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9ICh1OCkoKHAyICsgMiAqIHRtcCArIHExICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKChwMiArIHRtcCArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjNdID0gKHU4KSgoMiAqIGRhdGFbLWltYWdlV2lkdGgqNF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBwMiArIHRtcCArIDQpID4+IDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gKHU4KSgoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDIpOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDAgKyBxMCArIHExOworICAgICAgICAgICAgICAgICAgICBkYXRhWyAwXSA9ICh1OCkoKHAxICsgMiAqIHRtcCArIHEyICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKCh0bXAgKyBxMiArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGgqMl0gPSAodTgpKCgyICogZGF0YVtpbWFnZVdpZHRoKjNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBxMiArIHRtcCArIDQpID4+IDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJWZXJDaHJvbWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgMi1waXhlbCBjaHJvbWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiB3aWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjOworICAgIHU4IHAwLCBxMCwgcDEsIHExOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICB7CisgICAgICAgIGlmIChiUyA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOworICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOworICAgICAgICB9CisgICAgfQorICAgIGRhdGEgKz0gd2lkdGg7CisgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKKyAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKKyAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgeworICAgICAgICBpZiAoYlMgPCA0KQorICAgICAgICB7CisgICAgICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7CisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7CisgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisgICAgICAgICAgICBkYXRhWyAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYUVkZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIG9uZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRmlsdGVySG9yQ2hyb21hRWRnZSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YzsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPCA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7CisgICAgZm9yIChpID0gMjsgaTsgaS0tLCBkYXRhKyspCisgICAgeworICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKKyAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOworICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICB9CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGaWx0ZXIgYWxsIGZvdXIgc3VjY2Vzc2l2ZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2VzLiBUaGlzCisgICAgICAgICAgICBjYW4gYmUgZG9uZSBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGZvdXIgZWRnZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckhvckNocm9tYSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YzsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPD0gNCk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgaWYgKGJTIDwgNCkKKyAgICB7CisgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgZm9yIChpID0gODsgaTsgaS0tLCBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKKyAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07CisgICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Qm91bmRhcnlTdHJlbmd0aHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RocyBmb3IgYWxsIGVkZ2VzIG9mIGEKKyAgICAgICAgICAgIG1hY3JvYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgSEFOVFJPX1RSVUUgaWYgYW55IG9mIHRoZSBiUyB2YWx1ZXMgZm9yCisgICAgICAgICAgICB0aGUgbWFjcm9ibG9jayBoYWQgbm9uLXplcm8gdmFsdWUsIEhBTlRST19GQUxTRSBvdGhlcndpc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCBiU190ICpiUywgdTMyIGZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKKyAgICAgKiBub24temVybyAqLworICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQoZmxhZ3MpOworCisgICAgLyogdG9wIGVkZ2VzICovCisgICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkIpKQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSA0OworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgMCwgMTApOworICAgICAgICAgICAgYlNbMV0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDEsIDExKTsKKyAgICAgICAgICAgIGJTWzJdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCA0LCAxNCk7CisgICAgICAgICAgICBiU1szXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgNSwgMTUpOworICAgICAgICAgICAgaWYgKGJTWzBdLnRvcCB8fCBiU1sxXS50b3AgfHwgYlNbMl0udG9wIHx8IGJTWzNdLnRvcCkKKyAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSAwOworICAgIH0KKworICAgIC8qIGxlZnQgZWRnZXMgKi8KKyAgICBpZiAoZmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS5sZWZ0ID0gYlNbNF0ubGVmdCA9IGJTWzhdLmxlZnQgPSBiU1sxMl0ubGVmdCA9IDQ7CisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzBdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMCwgNSk7CisgICAgICAgICAgICBiU1s0XS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDIsIDcpOworICAgICAgICAgICAgYlNbOF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCA4LCAxMyk7CisgICAgICAgICAgICBiU1sxMl0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAxMCwgMTUpOworICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYKKyAgICAgICAgICAgICAgICAoYlNbMF0ubGVmdCB8fCBiU1s0XS5sZWZ0IHx8IGJTWzhdLmxlZnQgfHwgYlNbMTJdLmxlZnQpKQorICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJTWzBdLmxlZnQgPSBiU1s0XS5sZWZ0ID0gYlNbOF0ubGVmdCA9IGJTWzEyXS5sZWZ0ID0gMDsKKyAgICB9CisKKyAgICAvKiBpbm5lciBlZGdlcyAqLworICAgIGlmIChJU19JTlRSQV9NQigqbWIpKQorICAgIHsKKyAgICAgICAgYlNbNF0udG9wICA9IGJTWzVdLnRvcCAgPSBiU1s2XS50b3AgID0gYlNbN10udG9wICA9CisgICAgICAgIGJTWzhdLnRvcCAgPSBiU1s5XS50b3AgID0gYlNbMTBdLnRvcCA9IGJTWzExXS50b3AgPQorICAgICAgICBiU1sxMl0udG9wID0gYlNbMTNdLnRvcCA9IGJTWzE0XS50b3AgPSBiU1sxNV0udG9wID0gMzsKKworICAgICAgICBiU1sxXS5sZWZ0ICA9IGJTWzJdLmxlZnQgID0gYlNbM10ubGVmdCAgPQorICAgICAgICBiU1s1XS5sZWZ0ICA9IGJTWzZdLmxlZnQgID0gYlNbN10ubGVmdCAgPQorICAgICAgICBiU1s5XS5sZWZ0ICA9IGJTWzEwXS5sZWZ0ID0gYlNbMTFdLmxlZnQgPQorICAgICAgICBiU1sxM10ubGVmdCA9IGJTWzE0XS5sZWZ0ID0gYlNbMTVdLmxlZnQgPSAzOworICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogMTZ4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBvciBtb3Rpb24gdmVjdG9ycyBjYW5ub3QgZGlmZmVyLAorICAgICAgICAgKiBvbmx5IGNoZWNrIGlmIGVpdGhlciBvZiB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzICovCisgICAgICAgIGlmIChoMjY0YnNkTnVtTWJQYXJ0KG1iLT5tYlR5cGUpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s4XS50b3AgPSBtYi0+dG90YWxDb2VmZls4XSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0udG9wID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEwXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbN10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOworCisgICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls0XSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKKyAgICAgICAgfQorICAgICAgICAvKiAxNng4IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKKyAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSBob3Jpem9udGFsIGVkZ2UsIGZvciB0aGUgb3RoZXIgdG9wIGVkZ2VzIGl0IGlzCisgICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKKyAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCBsZWZ0IGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfMTZ4OCkKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKKyAgICAgICAgICAgIGJTWzldLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7CisgICAgICAgICAgICBiU1sxMF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7CisgICAgICAgICAgICBiU1sxMV0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzRdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOworICAgICAgICB9CisgICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzhdLnRvcCA9IG1iLT50b3RhbENvZWZmWzhdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS50b3AgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTFdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZls3XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNF0sIG1iNHg0SW5kZXhbMF0pOworICAgICAgICAgICAgYlNbNV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNV0sIG1iNHg0SW5kZXhbMV0pOworICAgICAgICAgICAgYlNbNl0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbMl0pOworICAgICAgICAgICAgYlNbN10udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbN10sIG1iNHg0SW5kZXhbM10pOworICAgICAgICAgICAgYlNbOF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOF0sIG1iNHg0SW5kZXhbNF0pOworICAgICAgICAgICAgYlNbOV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOV0sIG1iNHg0SW5kZXhbNV0pOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs2XSk7CisgICAgICAgICAgICBiU1sxMV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTFdLCBtYjR4NEluZGV4WzddKTsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMl0sIG1iNHg0SW5kZXhbOF0pOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEzXSwgbWI0eDRJbmRleFs5XSk7CisgICAgICAgICAgICBiU1sxNF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEwXSk7CisgICAgICAgICAgICBiU1sxNV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTVdLCBtYjR4NEluZGV4WzExXSk7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxXSwgbWI0eDRJbmRleFswXSk7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMl0sIG1iNHg0SW5kZXhbMV0pOworICAgICAgICAgICAgYlNbM10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzNdLCBtYjR4NEluZGV4WzJdKTsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs1XSwgbWI0eDRJbmRleFs0XSk7CisgICAgICAgICAgICBiU1s2XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbNV0pOworICAgICAgICAgICAgYlNbN10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzddLCBtYjR4NEluZGV4WzZdKTsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs5XSwgbWI0eDRJbmRleFs4XSk7CisgICAgICAgICAgICBiU1sxMF0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs5XSk7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzExXSwgbWI0eDRJbmRleFsxMF0pOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxM10sIG1iNHg0SW5kZXhbMTJdKTsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEzXSk7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE1XSwgbWI0eDRJbmRleFsxNF0pOworICAgICAgICB9CisgICAgICAgIGlmICghbm9uWmVyb0JzICYmCisgICAgICAgICAgICAoYlNbNF0udG9wIHx8IGJTWzVdLnRvcCB8fCBiU1s2XS50b3AgfHwgYlNbN10udG9wIHx8CisgICAgICAgICAgICAgYlNbOF0udG9wIHx8IGJTWzldLnRvcCB8fCBiU1sxMF0udG9wIHx8IGJTWzExXS50b3AgfHwKKyAgICAgICAgICAgICBiU1sxMl0udG9wIHx8IGJTWzEzXS50b3AgfHwgYlNbMTRdLnRvcCB8fCBiU1sxNV0udG9wIHx8CisgICAgICAgICAgICAgYlNbMV0ubGVmdCB8fCBiU1syXS5sZWZ0IHx8IGJTWzNdLmxlZnQgfHwKKyAgICAgICAgICAgICBiU1s1XS5sZWZ0IHx8IGJTWzZdLmxlZnQgfHwgYlNbN10ubGVmdCB8fAorICAgICAgICAgICAgIGJTWzldLmxlZnQgfHwgYlNbMTBdLmxlZnQgfHwgYlNbMTFdLmxlZnQgfHwKKyAgICAgICAgICAgICBiU1sxM10ubGVmdCB8fCBiU1sxNF0ubGVmdCB8fCBiU1sxNV0ubGVmdCkpCisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4obm9uWmVyb0JzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaW5kZXhBLCBpbmRleEI7CisgICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOworICAgIHRocmVzaG9sZHNbSU5ORVJdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgIHRocmVzaG9sZHNbSU5ORVJdLnRjMCA9IHRjMFtpbmRleEFdOworCisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCisgICAgICAgICAgICBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncywKKyAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGluZGV4QSwgaW5kZXhCOworICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgcXAgPSBtYi0+cXBZOworICAgIHFwID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKworICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgIHRocmVzaG9sZHNbSU5ORVJdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgdGhyZXNob2xkc1tJTk5FUl0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgdGhyZXNob2xkc1tJTk5FUl0udGMwID0gdGMwW2luZGV4QV07CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGMwW2luZGV4QV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckx1bWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jaworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJMdW1hKAorICB1OCAqZGF0YSwKKyAgYlNfdCAqYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YmxvY2s7CisgICAgYlNfdCAqdG1wOworICAgIHU4ICpwdHI7CisgICAgdTMyIG9mZnNldDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgcHRyID0gZGF0YTsKKyAgICB0bXAgPSBiUzsKKworICAgIG9mZnNldCAgPSBUT1A7CisKKyAgICAvKiBsb29wIGJsb2NrIHJvd3MsIHBlcmZvcm0gZmlsdGVyaW5nIGZvciBhbGwgdmVydGljYWwgZWRnZXMgb2YgdGhlIGJsb2NrCisgICAgICogcm93IGZpcnN0LCB0aGVuIGZpbHRlciBlYWNoIGhvcml6b250YWwgZWRnZSBvZiB0aGUgcm93ICovCisgICAgZm9yICh2YmxvY2sgPSA0OyB2YmxvY2stLTspCisgICAgeworICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCBvZiB0aGUgZm91cgorICAgICAgICAgKiBGaWx0ZXJWZXJMdW1hRWRnZSBoYW5kbGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hY3JvYmxvY2ssIG90aGVycworICAgICAgICAgKiBmaWx0ZXIgaW5uZXIgZWRnZXMgKi8KKyAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFsxXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFsyXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFszXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7CisKKyAgICAgICAgLyogaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSByb3cgLT4gcGVyZm9ybQorICAgICAgICAgKiBmaWx0ZXJpbmcgd2l0aCBGaWx0ZXJIb3JMdW1hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckx1bWFFZGdlIGZvcgorICAgICAgICAgKiBlYWNoIGVkZ2Ugc2VwYXJhdGVseS4gb2Zmc2V0IHZhcmlhYmxlIGluZGljYXRlcyB0b3AgbWFjcm9ibG9jayBlZGdlCisgICAgICAgICAqIG9uIHRoZSBmaXJzdCBsb29wIHJvdW5kLCBpbm5lciBlZGdlIGZvciB0aGUgb3RoZXIgcm91bmRzICovCisgICAgICAgIGlmICh0bXBbMF0udG9wID09IHRtcFsxXS50b3AgJiYgdG1wWzFdLnRvcCA9PSB0bXBbMl0udG9wICYmCisgICAgICAgICAgICB0bXBbMl0udG9wID09IHRtcFszXS50b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMgKyBvZmZzZXQsIChpMzIpd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFsxXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFsyXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFszXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBmb3VyIHBpeGVsIHJvd3MgYWhlYWQsIGkuZS4gbmV4dCByb3cgb2YgNHg0LWJsb2NrcyAqLworICAgICAgICBwdHIgKz0gd2lkdGgqNDsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgICAgIG9mZnNldCA9IElOTkVSOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJDaHJvbWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckNocm9tYSgKKyAgdTggKmRhdGFDYiwKKyAgdTggKmRhdGFDciwKKyAgYlNfdCAqYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YmxvY2s7CisgICAgYlNfdCAqdG1wOworICAgIHUzMiBvZmZzZXQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhQ2IpOworICAgIEFTU0VSVChkYXRhQ3IpOworICAgIEFTU0VSVChiUyk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgdG1wID0gYlM7CisgICAgb2Zmc2V0ID0gVE9QOworCisgICAgLyogbG9vcCBibG9jayByb3dzLCBwZXJmb3JtIGZpbHRlcmluZyBmb3IgYWxsIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBibG9jaworICAgICAqIHJvdyBmaXJzdCwgdGhlbiBmaWx0ZXIgZWFjaCBob3Jpem9udGFsIGVkZ2Ugb2YgdGhlIHJvdyAqLworICAgIGZvciAodmJsb2NrID0gMDsgdmJsb2NrIDwgMjsgdmJsb2NrKyspCisgICAgeworICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCB0d28gb2YgdGhlIGZvdXIKKyAgICAgICAgICogRmlsdGVyVmVyQ2hyb21hRWRnZSBjYWxscyBoYW5kbGUgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFjcm9ibG9jaywKKyAgICAgICAgICogb3RoZXJzIGZpbHRlciB0aGUgaW5uZXIgZWRnZS4gTm90ZSB0aGF0IGFzIGNocm9tYSB1c2VzIGJTIHZhbHVlcworICAgICAgICAgKiBkZXRlcm1pbmVkIGZvciBsdW1hIGVkZ2VzLCBlYWNoIGJTIGlzIHVzZWQgb25seSBmb3IgMiBwaXhlbHMgb2YKKyAgICAgICAgICogYSA0LXBpeGVsIGVkZ2UgKi8KKyAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYiwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFs0XS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoLCB0bXBbNF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCwgdG1wWzRdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULAorICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wWzJdLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrNCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwKKyAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFs2XS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoKzQsIHRtcFs2XS5sZWZ0LAorICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCs0LCB0bXBbNl0ubGVmdCwKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgcm93IC0+IHBlcmZvcm0KKyAgICAgICAgICogZmlsdGVyaW5nIHdpdGggRmlsdGVySG9yQ2hyb21hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckNocm9tYUVkZ2UKKyAgICAgICAgICogZm9yIGVhY2ggZWRnZSBzZXBhcmF0ZWx5LiBvZmZzZXQgdmFyaWFibGUgaW5kaWNhdGVzIHRvcCBtYWNyb2Jsb2NrCisgICAgICAgICAqIGVkZ2Ugb24gdGhlIGZpcnN0IGxvb3Agcm91bmQsIGlubmVyIGVkZ2UgZm9yIHRoZSBzZWNvbmQgKi8KKyAgICAgICAgaWYgKHRtcFswXS50b3AgPT0gdG1wWzFdLnRvcCAmJiB0bXBbMV0udG9wID09IHRtcFsyXS50b3AgJiYKKyAgICAgICAgICAgIHRtcFsyXS50b3AgPT0gdG1wWzNdLnRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEoZGF0YUNiLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRtcFswXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcFsxXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrMiwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzIsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bXBbMl0udG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcis0LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG1wWzNdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYis2LCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrNiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wICs9IDg7CisgICAgICAgIGRhdGFDYiArPSB3aWR0aCo0OworICAgICAgICBkYXRhQ3IgKz0gd2lkdGgqNDsKKyAgICAgICAgb2Zmc2V0ID0gSU5ORVI7CisgICAgfQorfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbHRlclBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcgZm9yIGEgcGljdHVyZS4gRmlsdGVyIGRvZXMgbm90IGNvcHkKKyAgICAgICAgICB0aGUgb3JpZ2luYWwgcGljdHVyZSBhbnl3aGVyZSBidXQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBkaXJlY3RseQorICAgICAgICAgIG9uIHRoZSBvcmlnaW5hbCBpbWFnZS4gUGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgZmlsdGVyaW5nIHByb2Nlc3MKKyAgICAgICAgICBhcmUgY29tcHV0ZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG9mIHRoZQorICAgICAgICAgIGZpbHRlcmVkIG1hY3JvYmxvY2ssIG1hY3JvYmxvY2sgYWJvdmUgYW5kIG1hY3JvYmxvY2sgb24gdGhlIGxlZnQgb2YKKyAgICAgICAgICB0aGUgZmlsdGVyZWQgb25lLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gaW1hZ2UgdG8gYmUgZmlsdGVyZWQKKyAgICAgICAgICBtYiAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgdG9wLWxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgb2YgdGhlIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgZmlsdGVyZWQgaW1hZ2Ugc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC0tZXs1NTB9IFN5bWJvbCBub3QgYWNjZXNzZWQgKi8KK3ZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCisgIGltYWdlX3QgKmltYWdlLAorICBtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzOworICAgIHUzMiBwaWNTaXplSW5NYnMsIG1iUm93LCBtYkNvbDsKKyAgICB1MzIgcGljV2lkdGhJbk1iczsKKyAgICB1OCAqZGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworICAgIHU4IGJTWzJdWzE2XTsKKyAgICB1OCB0aHJlc2hvbGRMdW1hWzJdWzE2XTsKKyAgICB1OCB0aHJlc2hvbGRDaHJvbWFbMl1bOF07CisgICAgdTggYWxwaGFbMl1bMl07CisgICAgdTggYmV0YVsyXVsyXTsKKyAgICBPTVhSZXN1bHQgcmVzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGltYWdlLT5kYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UtPndpZHRoKTsKKyAgICBBU1NFUlQoaW1hZ2UtPmhlaWdodCk7CisKKyAgICBwaWNXaWR0aEluTWJzID0gaW1hZ2UtPndpZHRoOworICAgIGRhdGEgPSBpbWFnZS0+ZGF0YTsKKyAgICBwaWNTaXplSW5NYnMgPSBwaWNXaWR0aEluTWJzICogaW1hZ2UtPmhlaWdodDsKKworICAgIHBNYiA9IG1iOworCisgICAgZm9yIChtYlJvdyA9IDAsIG1iQ29sID0gMDsgbWJSb3cgPCBpbWFnZS0+aGVpZ2h0OyBwTWIrKykKKyAgICB7CisgICAgICAgIGZsYWdzID0gR2V0TWJGaWx0ZXJpbmdGbGFncyhwTWIpOworCisgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgLyogR2V0Qm91bmRhcnlTdHJlbmd0aHMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZSBpZiBhbnkgb2YKKyAgICAgICAgICAgICAqIHRoZSBiUyB2YWx1ZXMgZm9yIHRoZSBtYWNyb2Jsb2NrIGJlaW5nIHByb2Nlc3NlZCB3YXMgbm9uLXplcm8gKi8KKyAgICAgICAgICAgIGlmIChHZXRCb3VuZGFyeVN0cmVuZ3RocyhwTWIsIGJTLCBmbGFncykpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAvKiBMdW1hICovCisgICAgICAgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKHBNYixhbHBoYSxiZXRhLHRocmVzaG9sZEx1bWEsYlMsZmxhZ3MpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDI1NiArIG1iQ29sICogMTY7CisKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZEx1bWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOworCisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyoxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkTHVtYSsxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7CisgICAgICAgICAgICAgICAgLyogQ2IgKi8KKyAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyhwTWIsIGFscGhhLCBiZXRhLCB0aHJlc2hvbGRDaHJvbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlMsIGZsYWdzLCBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCisgICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OworCisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOworICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hKzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKKyAgICAgICAgICAgICAgICAvKiBDciAqLworICAgICAgICAgICAgICAgIGRhdGEgKz0gKHBpY1NpemVJbk1icyAqIDY0KTsKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7CisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWErOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWJDb2wrKzsKKyAgICAgICAgaWYgKG1iQ29sID09IHBpY1dpZHRoSW5NYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iQ29sID0gMDsKKyAgICAgICAgICAgIG1iUm93Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRCb3VuZGFyeVN0cmVuZ3RocworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGhzIGZvciBhbGwgZWRnZXMgb2YgYQorICAgICAgICAgICAgbWFjcm9ibG9jay4gRnVuY3Rpb24gcmV0dXJucyBIQU5UUk9fVFJVRSBpZiBhbnkgb2YgdGhlIGJTIHZhbHVlcyBmb3IKKyAgICAgICAgICAgIHRoZSBtYWNyb2Jsb2NrIGhhZCBub24temVybyB2YWx1ZSwgSEFOVFJPX0ZBTFNFIG90aGVyd2lzZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIHU4ICgqYlMpWzE2XSwgdTMyIGZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKKyAgICAgKiBub24temVybyAqLworICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyICpwVG1wOworICAgIHUzMiB0bXAxLCB0bXAyLCBpc0ludHJhTWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQoZmxhZ3MpOworCisgICAgaXNJbnRyYU1iID0gSVNfSU5UUkFfTUIoKm1iKTsKKworICAgIC8qIHRvcCBlZGdlcyAqLworICAgIHBUbXAgPSAodTMyKikmYlNbMV1bMF07CisgICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKGlzSW50cmFNYiB8fCBJU19JTlRSQV9NQigqbWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYiwgbWItPm1iQik7CisgICAgICAgICAgICBpZiAoKnBUbXApCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBUbXAgPSAwOworICAgIH0KKworICAgIC8qIGxlZnQgZWRnZXMgKi8KKyAgICBwVG1wID0gKHUzMiopJmJTWzBdWzBdOworICAgIGlmIChmbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBpZiAoaXNJbnRyYU1iIHx8IElTX0lOVFJBX01CKCptYi0+bWJBKSkKKyAgICAgICAgeworICAgICAgICAgICAgLypiU1swXVswXSA9IGJTWzBdWzFdID0gYlNbMF1bMl0gPSBiU1swXVszXSA9IDQ7Ki8KKyAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWIsIG1iLT5tYkEpOworICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYgKnBUbXApCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBUbXAgPSAwOworICAgIH0KKworICAgIC8qIGlubmVyIGVkZ2VzICovCisgICAgaWYgKGlzSW50cmFNYikKKyAgICB7CisgICAgICAgIHBUbXArKzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgcFRtcCsrOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wID0gMHgwMzAzMDMwMzsKKworICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFRtcCA9ICh1MzIqKW1iLT50b3RhbENvZWZmOworCisgICAgICAgIC8qIDE2eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgb3IgbW90aW9uIHZlY3RvcnMgY2Fubm90IGRpZmZlciwKKyAgICAgICAgICogb25seSBjaGVjayBpZiBlaXRoZXIgb2YgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyAqLworICAgICAgICBpZiAoaDI2NGJzZE51bU1iUGFydChtYi0+bWJUeXBlKSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLworICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLworCisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCisKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OworCisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbOF07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMl07CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107CisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7CisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgYlNbMV1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxM107CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbN107CisgICAgICAgICAgICBiU1sxXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls0XTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsxXTsKKyAgICAgICAgICAgIGJTWzFdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07CisgICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogMTZ4OCBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50CisgICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgaG9yaXpvbnRhbCBlZGdlLCBmb3IgdGhlIG90aGVyIHRvcCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgbGVmdCBlZGdlcy4gKi8KKyAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzE2eDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCisgICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCisKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7CisgICAgICAgICAgICBiU1sxXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOworICAgICAgICAgICAgYlNbMV1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOworICAgICAgICAgICAgYlNbMV1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKKworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzRdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzFdOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07CisgICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLworICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLworICAgICAgICAgICAgdG1wMiA9ICpwVG1wOworICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLworICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KKworICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCisgICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLworICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KKworICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7CisgICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKKworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzhdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzJdOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzldOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMV1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbNl07CisgICAgICAgICAgICBiU1sxXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzEzXTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZls3XTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgYlNbMV1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMiwgMCk7CisgICAgICAgICAgICBiU1sxXVs1XSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDMsIDEpOworICAgICAgICAgICAgYlNbMF1bNF0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxLCAwKTsKKyAgICAgICAgICAgIGJTWzBdWzVdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMywgMik7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDYsIDQpOworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNywgNSk7CisgICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA1LCA0KTsKKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDcsIDYpOworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMCwgOCk7CisgICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMSwgOSk7CisgICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA5LCA4KTsKKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDExLCAxMCk7CisgICAgICAgICAgICB0bXAxID0gKnBUbXA7CisgICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNCwgMTIpOworICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTUsIDEzKTsKKyAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEzLCAxMik7CisgICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNSwgMTQpOworCisgICAgICAgICAgICBiU1sxXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOworICAgICAgICAgICAgYlNbMV1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKKyAgICAgICAgICAgIGJTWzFdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKKworICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7CisgICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworICAgICAgICB9CisgICAgICAgIHBUbXAgPSAodTMyKikmYlNbMF1bMF07CisgICAgICAgIGlmICghbm9uWmVyb0JzICYmIChwVG1wWzFdIHx8IHBUbXBbMl0gfHwgcFRtcFszXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFs1XSB8fCBwVG1wWzZdIHx8IHBUbXBbN10pICkKKyAgICAgICAgeworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4obm9uWmVyb0JzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgICBtYlN0b3JhZ2VfdCAqbWIsCisgICAgdTggKCphbHBoYSlbMl0sCisgICAgdTggKCpiZXRhKVsyXSwKKyAgICB1OCAoKnRocmVzaG9sZClbMTZdLAorICAgIHU4ICgqYnMpWzE2XSwKKyAgICB1MzIgZmlsdGVyaW5nRmxhZ3MgKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkKTsKKyAgICBBU1NFUlQoYnMpOworICAgIEFTU0VSVChiZXRhKTsKKyAgICBBU1NFUlQoYWxwaGEpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAvKiBJbnRlcm5hbCBlZGdlIHZhbHVlcyAqLworICAgIGFscGhhWzBdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgYmV0YVswXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07CisKKyAgICAvKiB2ZXJ0aWNhbCBzY2FuIG9yZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIHUzMiB0MSwgdDI7CisKKyAgICAgICAgdDEgPSBic1tpXVswXTsKKyAgICAgICAgdDIgPSBic1tpXVsxXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzJdOworICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bM107CisgICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs0XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzVdOworICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bNl07CisgICAgICAgIHRocmVzaG9sZFtpXVs1XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVs3XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzZdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzhdOworICAgICAgICB0aHJlc2hvbGRbaV1bN10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bOV07CisgICAgICAgIHRocmVzaG9sZFtpXVs4XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMF07CisgICAgICAgIHRocmVzaG9sZFtpXVs5XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxMV07CisgICAgICAgIHRocmVzaG9sZFtpXVsxMF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMl07CisgICAgICAgIHRocmVzaG9sZFtpXVsxMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxM107CisgICAgICAgIHRocmVzaG9sZFtpXVsxMl0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxNF07CisgICAgICAgIHRocmVzaG9sZFtpXVsxM10gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxNV07CisgICAgICAgIHRocmVzaG9sZFtpXVsxNF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdGhyZXNob2xkW2ldWzE1XSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgIH0KKworICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gcXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdDEgPSBic1sxXVswXTsKKyAgICAgICAgICAgIHQyID0gYnNbMV1bMV07CisgICAgICAgICAgICB0MyA9IGJzWzFdWzJdOworICAgICAgICAgICAgdDQgPSBic1sxXVszXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVswXSA9ICh0MSAmJiAodDEgPCA0KSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzFdID0gKHQyICYmICh0MiA8IDQpKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMl0gPSAodDMgJiYgKHQzIDwgNCkpID8gdGMwW2luZGV4QV1bdDNdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVszXSA9ICh0NCAmJiAodDQgPCA0KSkgPyB0YzBbaW5kZXhBXVt0NF0gOiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IHFwKQorICAgICAgICB7CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSAmJiAoYnNbMF1bMF0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdICYmIChic1swXVsxXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0gJiYgKGJzWzBdWzJdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSAmJiAoYnNbMF1bM10gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKKyAgICAgICAgICAgIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkKTsKKyAgICBBU1NFUlQoYnMpOworICAgIEFTU0VSVChiZXRhKTsKKyAgICBBU1NFUlQoYWxwaGEpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIHFwID0gbWItPnFwWTsKKyAgICBxcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICBhbHBoYVswXVsxXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzFdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGJldGFbMF1bMV0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMV1bMV0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIHUzMiB0MSwgdDI7CisKKyAgICAgICAgdDEgPSBic1tpXVswXTsKKyAgICAgICAgdDIgPSBic1tpXVsxXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzJdOworICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bM107CisgICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs4XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzldOworICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bMTBdOworICAgICAgICB0aHJlc2hvbGRbaV1bNV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bMTFdOworICAgICAgICB0aHJlc2hvbGRbaV1bNl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHRocmVzaG9sZFtpXVs3XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworCisgICAgICAgICAgICB0MSA9IGJzWzFdWzBdOworICAgICAgICAgICAgdDIgPSBic1sxXVsxXTsKKyAgICAgICAgICAgIHQzID0gYnNbMV1bMl07CisgICAgICAgICAgICB0NCA9IGJzWzFdWzNdOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzBdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVsyXSA9ICh0MykgPyB0YzBbaW5kZXhBXVt0M10gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzNdID0gKHQ0KSA/IHRjMFtpbmRleEFdW3Q0XSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworCisgICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0pID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOworICAgICAgICB9CisgICAgfQorCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qbGludCArZTcwMSArZTcwMiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTcxZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0RFQkxPQ0tJTkdfSAorI2RlZmluZSBIMjY0U1dERUNfREVCTE9DS0lOR19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAorICBpbWFnZV90ICppbWFnZSwKKyAgbWJTdG9yYWdlX3QgKm1iKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTY4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCkBAIC0wLDAgKzEsOTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEluaXQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlCisgICAgICAgICAgaDI2NGJzZFNodXRkb3duCisgICAgICAgICAgaDI2NGJzZEN1cnJlbnRJbWFnZQorICAgICAgICAgIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZQorICAgICAgICAgIGgyNjRic2RQaWNXaWR0aAorICAgICAgICAgIGgyNjRic2RQaWNIZWlnaHQKKyAgICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIKKyAgICAgICAgICBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cworICAgICAgICAgIGgyNjRic2RWaWRlb1JhbmdlCisgICAgICAgICAgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cworICAgICAgICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jb25jZWFsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGRlY29kZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIHRoZSBkZWNvZGVyIHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBwZXJmb3JtIHJlb3JkZXJpbmcgb2YgZGlzcGxheSBpbWFnZXMuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgc2l6ZTsKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBoMjY0YnNkSW5pdFN0b3JhZ2UocFN0b3JhZ2UpOworCisgICAgLyogYWxsb2NhdGUgbWJMYXllciB0byBiZSBuZXh0IG11bHRpcGxlIG9mIDY0IHRvIGVuYWJsZSB1c2Ugb2YKKyAgICAgKiBzcGVjaWZpYyBORU9OIG9wdGltaXplZCAibWVtc2V0IiBmb3IgY2xlYXJpbmcgdGhlIHN0cnVjdHVyZSAqLworICAgIHNpemUgPSAoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGOworCisgICAgcFN0b3JhZ2UtPm1iTGF5ZXIgPSAobWFjcm9ibG9ja0xheWVyX3QqKUgyNjRTd0RlY01hbGxvYyhzaXplKTsKKyAgICBpZiAoIXBTdG9yYWdlLT5tYkxheWVyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKworICAgIGlmIChub091dHB1dFJlb3JkZXJpbmcpCisgICAgICAgIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgPSBIQU5UUk9fVFJVRTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgYSBOQUwgdW5pdC4gVGhpcyBmdW5jdGlvbiBjYWxscyBvdGhlciBtb2R1bGVzIHRvIHBlcmZvcm0KKyAgICAgICAgICAgIHRhc2tzIGxpa2UKKyAgICAgICAgICAgICAgICAqIGV4dHJhY3QgYW5kIGRlY29kZSBOQUwgdW5pdCBmcm9tIHRoZSBieXRlIHN0cmVhbQorICAgICAgICAgICAgICAgICogZGVjb2RlIHBhcmFtZXRlciBzZXRzCisgICAgICAgICAgICAgICAgKiBkZWNvZGUgc2xpY2UgaGVhZGVyIGFuZCBzbGljZSBkYXRhCisgICAgICAgICAgICAgICAgKiBjb25jZWFsIGVycm9ycyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgICogcGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZworCisgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIHRvcCBsZXZlbCBjb250cm9sIGxvZ2ljIG9mIHRoZSBkZWNvZGVyLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGJ5dGVTdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBidWZmZXIgZ2l2ZW4gYnkgYXBwbGljYXRpb24KKyAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiBieXRlcworICAgICAgICAgICAgcGljSWQgICAgICAgICAgIGlkZW50aWZpZXIgZm9yIGEgcGljdHVyZSwgYXNzaWduZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcmVhZEJ5dGVzICAgICAgIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRCU0RfUkRZICAgICAgICAgICAgIGRlY29kaW5nIGZpbmlzaGVkLCBub3RoaW5nIHNwZWNpYWwKKyAgICAgICAgICAgIEgyNjRCU0RfUElDX1JEWSAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAorICAgICAgICAgICAgSDI2NEJTRF9IRFJTX1JEWSAgICAgICAgcGFyYW0gc2V0cyBhY3RpdmF0ZWQsIGluZm9ybWF0aW9uIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgZGltZW5zaW9ucyBldGMgY2FuIGJlIHJlYWQKKyAgICAgICAgICAgIEgyNjRCU0RfRVJST1IgICAgICAgICAgIGVycm9yIGluIGRlY29kaW5nCisgICAgICAgICAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiBzZXJpdXMgZXJyb3IgaW4gZGVjb2RpbmcsIGZhaWxlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgcGFyYW0gc2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKKyAgICB1MzIgKnJlYWRCeXRlcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBwcHNJZCwgc3BzSWQ7CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIG5hbFVuaXRfdCBuYWxVbml0OworICAgIHNlcVBhcmFtU2V0X3Qgc2VxUGFyYW1TZXQ7CisgICAgcGljUGFyYW1TZXRfdCBwaWNQYXJhbVNldDsKKyAgICBzdHJtRGF0YV90IHN0cm07CisgICAgdTMyIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyIHBpY1JlYWR5ID0gSEFOVFJPX0ZBTFNFOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChieXRlU3RybSk7CisgICAgQVNTRVJUKGxlbik7CisgICAgQVNTRVJUKHJlYWRCeXRlcyk7CisKKyAgICAvKiBpZiBwcmV2aW91cyBidWZmZXIgd2FzIG5vdCBmaW5pc2hlZCBhbmQgc2FtZSBwb2ludGVyIGdpdmVuIC0+IHNraXAgTkFMCisgICAgICogdW5pdCBleHRyYWN0aW9uICovCisgICAgaWYgKHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgJiYgYnl0ZVN0cm0gPT0gcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyKQorICAgIHsKKyAgICAgICAgc3RybSA9IHBTdG9yYWdlLT5zdHJtWzBdOworICAgICAgICBzdHJtLnBTdHJtQ3VyclBvcyA9IHN0cm0ucFN0cm1CdWZmU3RhcnQ7CisgICAgICAgIHN0cm0uc3RybUJ1ZmZSZWFkQml0cyA9IHN0cm0uYml0UG9zSW5Xb3JkID0gMDsKKyAgICAgICAgKnJlYWRCeXRlcyA9IHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEV4dHJhY3ROYWxVbml0KGJ5dGVTdHJtLCBsZW4sICZzdHJtLCByZWFkQnl0ZXMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJCWVRFX1NUUkVBTSIpOworICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICB9CisgICAgICAgIC8qIHN0b3JlIHN0cmVhbSAqLworICAgICAgICBwU3RvcmFnZS0+c3RybVswXSA9IHN0cm07CisgICAgICAgIHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZCA9ICpyZWFkQnl0ZXM7CisgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmUG9pbnRlciA9IGJ5dGVTdHJtOworICAgIH0KKyAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZU5hbFVuaXQoJnN0cm0sICZuYWxVbml0KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEVQUklOVCgiTkFMX1VOSVQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgIH0KKworICAgIC8qIERpc2NhcmQgdW5zcGVjaWZpZWQsIHJlc2VydmVkLCBTUFMgZXh0ZW5zaW9uIGFuZCBhdXhpbGlhcnkgcGljdHVyZSBzbGljZXMgKi8KKyAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IDAgfHwgbmFsVW5pdC5uYWxVbml0VHlwZSA+PSAxMykKKyAgICB7CisgICAgICAgIERFQlVHKCgiRElTQ0FSREVEIE5BTCAoVU5TUEVDSUZJRUQsIFJFR0lTVEVSRUQsIFNQUyBleHQgb3IgQVVYIHNsaWNlKVxuIikpOworICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKKyAgICAgICZzdHJtLAorICAgICAgJm5hbFVuaXQsCisgICAgICBwU3RvcmFnZSwKKyAgICAgICZhY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEVQUklOVCgiQUNDRVNTIFVOSVQgQk9VTkRBUlkgQ0hFQ0siKTsKKyAgICAgICAgaWYgKHRtcCA9PSBQQVJBTV9TRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgfQorCisgICAgaWYgKCBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICkKKyAgICB7CisgICAgICAgIERFQlVHKCgiQWNjZXNzIHVuaXQgYm91bmRhcnlcbiIpKTsKKyAgICAgICAgLyogY29uY2VhbCBpZiBwaWN0dXJlIHN0YXJ0ZWQgYW5kIHBhcmFtIHNldHMgYWN0aXZhdGVkICovCisgICAgICAgIGlmIChwU3RvcmFnZS0+cGljU3RhcnRlZCAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiQ09OQ0VBTElORy4uLiIpKTsKKworICAgICAgICAgICAgLyogcmV0dXJuIGVycm9yIGlmIHNlY29uZCBwaGFzZSBvZgorICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7CisgICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLCBQX1NMSUNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ29uY2VhbChwU3RvcmFnZSwgcFN0b3JhZ2UtPmN1cnJJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZVR5cGUpOworCisgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOworCisgICAgICAgICAgICAvKiBjdXJyZW50IE5BTCB1bml0IHNob3VsZCBiZSBkZWNvZGVkIG9uIG5leHQgYWN0aXZhdGlvbiAtPiBzZXQKKyAgICAgICAgICAgICAqIHJlYWRCeXRlcyB0byAwICovCisgICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIERFQlVHKCgiLi4uRE9ORVxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFwaWNSZWFkeSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobmFsVW5pdC5uYWxVbml0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOQUxfU0VRX1BBUkFNX1NFVDoKKyAgICAgICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoJnN0cm0sICZzZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNFUV9QQVJBTV9TRVQiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEZSRUUoc2VxUGFyYW1TZXQudnVpUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQocFN0b3JhZ2UsICZzZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFMX1BJQ19QQVJBTV9TRVQ6CisgICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgUEFSQU0gU0VUXG4iKSk7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KCZzdHJtLCAmcGljUGFyYW1TZXQpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQSUNfUEFSQU1fU0VUIik7CisgICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQucnVuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC50b3BMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ib3R0b21SaWdodCk7CisgICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQuc2xpY2VHcm91cElkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChwU3RvcmFnZSwgJnBpY1BhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0VfSURSOgorICAgICAgICAgICAgICAgIERFQlVHKCgiSURSICIpKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgTkFMX0NPREVEX1NMSUNFOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgSEVBREVSXG4iKSk7CisKKyAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBhbmQgc3RpbGwgZGVjb2Rpbmcgc2FtZSBvbGQKKyAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdW5pdCAtPiBubyBuZWVkIHRvIGRlY29kZSByZWR1bmRhbnQgc2xpY2VzICovCisgICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOworCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fVFJVRTsKKworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCAgICA9IHBpY0lkOworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKCZzdHJtLCAmcHBzSWQpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQodG1wID09IEhBTlRST19PSyk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIG9sZCBhY3RpdmVTcHNJZCBhbmQgcmV0dXJuIGhlYWRlcnMgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGlvbiBpZiBhY3RpdmVTcHMgY2hhbmdlcyAqLworICAgICAgICAgICAgICAgICAgICBzcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHBTdG9yYWdlLCBwcHNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBhcmFtIHNldCBhY3RpdmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcCA9PSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSDI2NEJTRF9NRU1BTExPQ19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqb2xkU1BTID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtU2V0X3QgKm5ld1NQUyA9IHBTdG9yYWdlLT5hY3RpdmVTcHM7CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwU3RvcmFnZS0+b2xkU3BzSWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFNQUyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPm9sZFNwc0lkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX1RSVUU7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmFsVW5pdC5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZygmbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm0sIG5ld1NQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsVW5pdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IEhBTlRST19OT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0bXAgIT0gSEFOVFJPX09LKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnICE9IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocFN0b3JhZ2UtPmRwYi0+bm9SZW9yZGVyaW5nKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+cGljV2lkdGhJbk1icyAhPSBuZXdTUFMtPnBpY1dpZHRoSW5NYnMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNIZWlnaHRJbk1icyAhPSBuZXdTUFMtPnBpY0hlaWdodEluTWJzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+bWF4RHBiU2l6ZSAhPSBuZXdTUFMtPm1heERwYlNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5kcGItPmZsdXNoZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm9sZFNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9IRFJTX1JEWSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCisgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcigmc3RybSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcywgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgJm5hbFVuaXQpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTTElDRV9IRUFERVIiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUocFN0b3JhZ2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlclsxXS5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0Lm5hbFJlZklkYyAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJHYXBzIGluIGZyYW1lIG51bSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHN0b3JlIHNsaWNlIGhlYWRlciB0byBzdG9yYWdlIGlmIHN1Y2Nlc3NmdWxseSBkZWNvZGVkICovCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdID0gcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZOYWxVbml0WzBdID0gbmFsVW5pdDsKKworICAgICAgICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOworCisgICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlJlb3JkZXJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgREFUQSwgRklSU1QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlKSk7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlRGF0YSgmc3RybSwgcFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc0VuZE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfU0VJOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0VJIE1FU1NBR0UsIE5PVCBERUNPREVEIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERFQlVHKCgiTk9UIElNUExFTUVOVEVEIFlFVCAlZFxuIixuYWxVbml0Lm5hbFVuaXRUeXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGljUmVhZHkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZShwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+bWIpOworCisgICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UocFN0b3JhZ2UpOworCisgICAgICAgIHBpY09yZGVyQ250ID0gaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBTdG9yYWdlLT5wb2MsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIsIHBTdG9yYWdlLT5wcmV2TmFsVW5pdCk7CisKKyAgICAgICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnByZXZOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwKKyAgICAgICAgICAgICAgICAgICAgJnBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCisgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBqdXN0IHN0b3JlIGZvciBwb3NzaWJsZSBkaXNwbGF5CisgICAgICAgICAgICAgKiByZW9yZGVyaW5nICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCisgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHJldHVybihIMjY0QlNEX1BJQ19SRFkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2h1dGRvd24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2h1dGRvd24gYSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yaWVzCisgICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIGluc3RhbmNlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldLT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ydW5MZW5ndGgpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT50b3BMZWZ0KTsKKyAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+Ym90dG9tUmlnaHQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5zbGljZUdyb3VwSWQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZSRUUocFN0b3JhZ2UtPm1iTGF5ZXIpOworICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKKyAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKKworICAgIGgyNjRic2RGcmVlRHBiKHBTdG9yYWdlLT5kcGIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBuZXh0IG91dHB1dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBpY0lkICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQorICAgICAgICAgICAgaXNJZHJQaWMgICAgSURSIGZsYWcgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQorICAgICAgICAgICAgbnVtRXJyTWJzICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBwaWN0dXJlIGRhdGEKKyAgICAgICAgICAgIE5VTEwgaWYgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKKyAgICB1MzIgKm51bUVyck1icykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBkcGJPdXRQaWN0dXJlX3QgKnBPdXQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBwT3V0ID0gaDI2NGJzZERwYk91dHB1dFBpY3R1cmUocFN0b3JhZ2UtPmRwYik7CisKKyAgICBpZiAocE91dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKnBpY0lkID0gcE91dC0+cGljSWQ7CisgICAgICAgICppc0lkclBpYyA9IHBPdXQtPmlzSWRyOworICAgICAgICAqbnVtRXJyTWJzID0gcE91dC0+bnVtRXJyTWJzOworICAgICAgICByZXR1cm4gKHBPdXQtPmRhdGEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQaWNXaWR0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwaWN0dXJlIHdpZHRoCisgICAgICAgICAgICAwIGlmIHBhcmFtZXRlcnMgc2V0cyBub3QgeWV0IGFjdGl2YXRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQaWNIZWlnaHQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGhlaWdodCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKKyAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCdWZmZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmx1c2ggdGhlIGRlY29kZWQgcGljdHVyZSBidWZmZXIsIHNlZSBkcGIuYyBmb3IgZGV0YWlscworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBwYXJhbWV0ZXIgc2V0IGNvbWJpbmF0aW9ucyAoU1BTL1BQUykgZXhpc3RzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgMSAgICAgICBhdCBsZWFzdCBvbmUgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBmb3VuZAorICAgICAgICAgICAgMCAgICAgICBubyB2YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb25zIGZvdW5kCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgcmV0dXJuKGgyNjRic2RWYWxpZFBhcmFtU2V0cyhwU3RvcmFnZSkgPT0gSEFOVFJPX09LID8gMSA6IDApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFZpZGVvUmFuZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAxICAgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGFuZCB2YWx1ZSBpcyAxCisgICAgICAgICAgICAwICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZykKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGVsc2UgLyogZGVmYXVsdCB2YWx1ZSBvZiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgaXMgMCAqLworICAgICAgICByZXR1cm4oMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgb2YgbWF0cml4X2NvZWZmaWNpZW50cyBpZiByZWNlaXZlZAorICAgICAgICAgICAgMiAgIG90aGVyd2lzZSAodGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQorICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzKTsKKyAgICBlbHNlIC8qIGRlZmF1bHQgdW5zcGVjaWZpZWQgKi8KKyAgICAgICAgcmV0dXJuKDIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaGgyNjRic2RDcm9wcGluZ1BhcmFtcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgY3JvcHBpbmcgcGFyYW1ldGVycyBvZiB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgY3JvcHBpbmdGbGFnICAgIGZsYWcgaW5kaWNhdGluZyBpZiBjcm9wcGluZyBwYXJhbXMgcHJlc2VudCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBoZXJlCisgICAgICAgICAgICBsZWZ0T2Zmc2V0ICAgICAgY3JvcHBpbmcgbGVmdCBvZmZzZXQgaW4gcGl4ZWxzIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICB3aWR0aCAgICAgICAgICAgd2lkdGggb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICB0b3BPZmZzZXQgICAgICAgY3JvcHBpbmcgdG9wIG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIGhlaWdodCAgICAgICAgICBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCisgICAgdTMyICpsZWZ0T2Zmc2V0LCB1MzIgKndpZHRoLCB1MzIgKnRvcE9mZnNldCwgdTMyICpoZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICAqY3JvcHBpbmdGbGFnID0gMTsKKyAgICAgICAgKmxlZnRPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wTGVmdE9mZnNldDsKKyAgICAgICAgKndpZHRoID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzIC0KKyAgICAgICAgICAgICAgICAgMiAqIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BSaWdodE9mZnNldCk7CisgICAgICAgICp0b3BPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0OworICAgICAgICAqaGVpZ2h0ID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyAtCisgICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFRvcE9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjcm9wcGluZ0ZsYWcgPSAwOworICAgICAgICAqbGVmdE9mZnNldCA9IDA7CisgICAgICAgICp3aWR0aCA9IDA7CisgICAgICAgICp0b3BPZmZzZXQgPSAwOworICAgICAgICAqaGVpZ2h0ID0gMDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFzcGVjdCByYXRpbyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHNhcldpZHRoICAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0CisgICAgICAgICAgICBzYXJIZWlnaHQgICBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgdyA9IDE7CisgICAgdTMyIGggPSAxOworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyApCisgICAgeworICAgICAgICBzd2l0Y2ggKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRDogIHcgPSAgIDA7IGggPSAgMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xXzE6ICAgICAgICAgIHcgPSAgIDE7IGggPSAgMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMl8xMTogICAgICAgIHcgPSAgMTI7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMF8xMTogICAgICAgIHcgPSAgMTA7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNl8xMTogICAgICAgIHcgPSAgMTY7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT180MF8zMzogICAgICAgIHcgPSAgNDA7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yNF8xMTogICAgICAgIHcgPSAgMjQ7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yMF8xMTogICAgICAgIHcgPSAgMjA7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18zMl8xMTogICAgICAgIHcgPSAgMzI7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT184MF8zMzogICAgICAgIHcgPSAgODA7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xOF8xMTogICAgICAgIHcgPSAgMTg7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNV8xMTogICAgICAgIHcgPSAgMTU7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT182NF8zMzogICAgICAgIHcgPSAgNjQ7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNjBfOTk6ICAgICAgIHcgPSAxNjA7IGggPSA5OTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVI6CisgICAgICAgICAgICAgICAgdyA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoOworICAgICAgICAgICAgICAgIGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKCh3ID09IDApIHx8IChoID09IDApKQorICAgICAgICAgICAgICAgICAgICB3ID0gaCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHcgPSAwOworICAgICAgICAgICAgICAgIGggPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IGFzcGVjdCByYXRpbyovCisgICAgKnNhcldpZHRoID0gdzsKKyAgICAqc2FySGVpZ2h0ID0gaDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9maWxlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBwcm9maWxlIGluZm9ybWF0aW9uIGZyb20gYWN0aXZlIFNQUworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcHJvZmlsZSAgIGN1cnJlbnQgcHJvZmlsZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5wcm9maWxlSWRjOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzY1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfREVDT0RFUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19ERUNPREVSX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGVkIHJldHVybiB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyAqLworZW51bSB7CisgICAgSDI2NEJTRF9SRFksCisgICAgSDI2NEJTRF9QSUNfUkRZLAorICAgIEgyNjRCU0RfSERSU19SRFksCisgICAgSDI2NEJTRF9FUlJPUiwKKyAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiwKKyAgICBIMjY0QlNEX01FTUFMTE9DX0VSUk9SCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbml0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpOwordTMyIGgyNjRic2REZWNvZGUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTggKmJ5dGVTdHJtLCB1MzIgbGVuLCB1MzIgcGljSWQsCisgICAgdTMyICpyZWFkQnl0ZXMpOwordm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKK3U4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKKyAgICB1MzIgKm51bUVyck1icyk7CisKK3UzMiBoMjY0YnNkUGljV2lkdGgoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZFBpY0hlaWdodChzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCisgICAgdTMyICpsZWZ0LCB1MzIgKndpZHRoLCB1MzIgKnRvcCwgdTMyICpoZWlnaHQpOwordm9pZCBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8oc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KTsKK3UzMiBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKwordm9pZCBoMjY0YnNkRmx1c2hCdWZmZXIoc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKK3UzMiBoMjY0YnNkUHJvZmlsZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDT0RFUl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTE3ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCkBAIC0wLDAgKzEsMTU4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIENvbXBhcmVQaWN0dXJlcworICAgICAgICAgIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAorICAgICAgICAgIE1tY29wMQorICAgICAgICAgIE1tY29wMgorICAgICAgICAgIE1tY29wMworICAgICAgICAgIE1tY29wNAorICAgICAgICAgIE1tY29wNQorICAgICAgICAgIE1tY29wNgorICAgICAgICAgIGgyNjRic2RNYXJrRGVjUmVmUGljCisgICAgICAgICAgaDI2NGJzZEdldFJlZlBpY0RhdGEKKyAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZQorICAgICAgICAgIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCisgICAgICAgICAgaDI2NGJzZEluaXREcGIKKyAgICAgICAgICBoMjY0YnNkUmVzZXREcGIKKyAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKKyAgICAgICAgICBGaW5kRHBiUGljCisgICAgICAgICAgU2V0UGljTnVtcworICAgICAgICAgIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtCisgICAgICAgICAgRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKKyAgICAgICAgICBPdXRwdXRQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKKyAgICAgICAgICBoMjY0YnNkRmx1c2hEcGIKKyAgICAgICAgICBoMjY0YnNkRnJlZURwYgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtYWNyb3MgdG8gZGV0ZXJtaW5lIHBpY3R1cmUgc3RhdHVzLiBOb3RlIHRoYXQgSVNfU0hPUlRfVEVSTSBtYWNybyByZXR1cm5zCisgKiB0cnVlIGFsc28gZm9yIG5vbi1leGlzdGluZyBwaWN0dXJlcyBiZWNhdXNlIG5vbi1leGlzdGluZyBwaWN0dXJlcyBhcmUKKyAqIHJlZ2FyZGVkIHNob3J0IHRlcm0gcGljdHVyZXMgYWNjb3JkaW5nIHRvIEguMjY0IHN0YW5kYXJkICovCisjZGVmaW5lIElTX1JFRkVSRU5DRShhKSAoKGEpLnN0YXR1cykKKyNkZWZpbmUgSVNfRVhJU1RJTkcoYSkgKChhKS5zdGF0dXMgPiBOT05fRVhJU1RJTkcpCisjZGVmaW5lIElTX1NIT1JUX1RFUk0oYSkgXAorICAgICgoYSkuc3RhdHVzID09IE5PTl9FWElTVElORyB8fCAoYSkuc3RhdHVzID09IFNIT1JUX1RFUk0pCisjZGVmaW5lIElTX0xPTkdfVEVSTShhKSAoKGEpLnN0YXR1cyA9PSBMT05HX1RFUk0pCisKKy8qIG1hY3JvIHRvIHNldCBhIHBpY3R1cmUgdW51c2VkIGZvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgU0VUX1VOVVNFRChhKSAoYSkuc3RhdHVzID0gVU5VU0VEOworCisjZGVmaW5lIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgMTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKTsKKworc3RhdGljIHUzMiBNbWNvcDEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcyk7CisKK3N0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pOworCitzdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAorICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KTsKKworc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KTsKKworc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdTMyIE1tY29wNihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCBpMzIgcGljT3JkZXJDbnQsCisgICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOworCitzdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKworc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pOworCitzdGF0aWMgdm9pZCBTZXRQaWNOdW1zKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyckZyYW1lTnVtKTsKKworc3RhdGljIGRwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdm9pZCBTaGVsbFNvcnQoZHBiUGljdHVyZV90ICpwUGljLCB1MzIgbnVtKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDb21wYXJlUGljdHVyZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY29tcGFyZSBkcGIgcGljdHVyZXMsIHVzZWQgYnkgdGhlIFNoZWxsU29ydCgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgT3JkZXIgb2YgdGhlIHBpY3R1cmVzIGFmdGVyIHNvcnRpbmcgc2hhbGwgYmUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAxKSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBsYXJnZXN0CisgICAgICAgICAgICAgICAgICAgcGljTnVtCisgICAgICAgICAgICAgICAgMikgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBzbWFsbGVzdAorICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtUGljTnVtCisgICAgICAgICAgICAgICAgMykgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UgYnV0IG5lZWRlZCBmb3IgZGlzcGxheQorICAgICAgICAgICAgICAgIDQpIG90aGVyIHBpY3R1cmVzCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIC0xICAgICAgcGljIDEgaXMgZ3JlYXRlciB0aGFuIHBpYyAyCisgICAgICAgICAgICAgMCAgICAgIGVxdWFsIGZyb20gY29tcGFyaXNvbiBwb2ludCBvZiB2aWV3CisgICAgICAgICAgICAgMSAgICAgIHBpYyAyIGlzIGdyZWF0ZXIgdGhlbiBwaWMgMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGRwYlBpY3R1cmVfdCAqcGljMSwgKnBpYzI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwdHIxKTsKKyAgICBBU1NFUlQocHRyMik7CisKKyAgICBwaWMxID0gKGRwYlBpY3R1cmVfdCopcHRyMTsKKyAgICBwaWMyID0gKGRwYlBpY3R1cmVfdCopcHRyMjsKKworICAgIC8qIGJvdGggYXJlIG5vbi1yZWZlcmVuY2UgcGljdHVyZXMsIGNoZWNrIGlmIG5lZWRlZCBmb3IgZGlzcGxheSAqLworICAgIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSAmJiAhSVNfUkVGRVJFTkNFKCpwaWMyKSkKKyAgICB7CisgICAgICAgIGlmIChwaWMxLT50b0JlRGlzcGxheWVkICYmICFwaWMyLT50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZSBpZiAoIXBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgcGljMi0+dG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiBvbmx5IHBpYyAxIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMyKSkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAvKiBvbmx5IHBpYyAyIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSkKKyAgICAgICAgcmV0dXJuKDEpOworICAgIC8qIGJvdGggYXJlIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAqLworICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpICYmIElTX1NIT1JUX1RFUk0oKnBpYzIpKQorICAgIHsKKyAgICAgICAgaWYgKHBpYzEtPnBpY051bSA+IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiBvbmx5IHBpYyAxIGlzIHNob3J0IHRlcm0gLT4gZ3JlYXRlciAqLworICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpKQorICAgICAgICByZXR1cm4oLTEpOworICAgIC8qIG9ubHkgcGljIDIgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCisgICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMikpCisgICAgICAgIHJldHVybigxKTsKKyAgICAvKiBib3RoIGFyZSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAoY29udGFpbnMgdGhlCisgICAgICogbG9uZ1Rlcm1QaWNOdW0gKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlIGlmIChwaWMxLT5waWNOdW0gPCBwaWMyLT5waWNOdW0pCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBiYXNlZCBvbgorICAgICAgICAgICAgcmVvcmRlcmluZyBjb21tYW5kcyByZWNlaXZlZCBpbiB0aGUgc2xpY2UgaGVhZGVyLiBTZWUgZGV0YWlscworICAgICAgICAgICAgb2YgdGhlIHByb2Nlc3MgaW4gdGhlIEguMjY0IHN0YW5kYXJkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgICAgICBwb2ludGVyIHRvIGRwYiBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgb3JkZXIgICAgICAgICAgIHBvaW50ZXIgdG8gcmVvcmRlcmluZyBjb21tYW5kcworICAgICAgICAgICAgY3VyckZyYW1lTnVtICAgIGN1cnJlbnQgZnJhbWUgbnVtYmVyCisgICAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2UgaW5kaWNlcyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgICdsaXN0JyBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIHJlb3JkZXJlZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpZiBub24tZXhpc3RpbmcgcGljdHVyZXMgcmVmZXJyZWQgdG8gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpvcmRlciwKKyAgdTMyIGN1cnJGcmFtZU51bSwKKyAgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgaywgcGljTnVtUHJlZCwgcmVmSWR4OworICAgIGkzMiBwaWNOdW0sIHBpY051bU5vV3JhcCwgaW5kZXg7CisgICAgdTMyIGlzU2hvcnRUZXJtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQob3JkZXIpOworICAgIEFTU0VSVChjdXJyRnJhbWVOdW0gPD0gZHBiLT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKG51bVJlZklkeEFjdGl2ZSA8PSBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFKTsKKworICAgIC8qIHNldCBkcGIgcGljdHVyZSBudW1iZXJzIGZvciBzb3J0aW5nICovCisgICAgU2V0UGljTnVtcyhkcGIsIGN1cnJGcmFtZU51bSk7CisKKyAgICBpZiAoIW9yZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisKKyAgICByZWZJZHggICAgID0gMDsKKyAgICBwaWNOdW1QcmVkID0gY3VyckZyYW1lTnVtOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPCAzKQorICAgIHsKKyAgICAgICAgLyogc2hvcnQgdGVybSAqLworICAgICAgICBpZiAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilwaWNOdW1QcmVkIC0gKGkzMilvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtOworICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPCAwKQorICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgKz0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCA9CisgICAgICAgICAgICAgICAgICAgIChpMzIpKHBpY051bVByZWQgKyBvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtKTsKKyAgICAgICAgICAgICAgICBpZiAocGljTnVtTm9XcmFwID49IChpMzIpZHBiLT5tYXhGcmFtZU51bSkKKyAgICAgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwIC09IChpMzIpZHBiLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpY051bVByZWQgPSAodTMyKXBpY051bU5vV3JhcDsKKyAgICAgICAgICAgIHBpY051bSA9IHBpY051bU5vV3JhcDsKKyAgICAgICAgICAgIGlmICgodTMyKXBpY051bU5vV3JhcCA+IGN1cnJGcmFtZU51bSkKKyAgICAgICAgICAgICAgICBwaWNOdW0gLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBsb25nIHRlcm0gKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwaWNOdW0gPSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmxvbmdUZXJtUGljTnVtOworICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICAvKiBmaW5kIGNvcnJlc3BvbmRpbmcgcGljdHVyZSBmcm9tIGRwYiAqLworICAgICAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIGlzU2hvcnRUZXJtKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCAhSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAvKiBzaGlmdCBwaWN0dXJlcyAqLworICAgICAgICBmb3IgKGogPSBudW1SZWZJZHhBY3RpdmU7IGogPiByZWZJZHg7IGotLSkKKyAgICAgICAgICAgIGRwYi0+bGlzdFtqXSA9IGRwYi0+bGlzdFtqLTFdOworICAgICAgICAvKiBwdXQgcGljdHVyZSBpbnRvIHRoZSBsaXN0ICovCisgICAgICAgIGRwYi0+bGlzdFtyZWZJZHgrK10gPSAmZHBiLT5idWZmZXJbaW5kZXhdOworICAgICAgICAvKiByZW1vdmUgbGF0ZXIgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBwaWN0dXJlICovCisgICAgICAgIGZvciAoaiA9IGsgPSByZWZJZHg7IGogPD0gbnVtUmVmSWR4QWN0aXZlOyBqKyspCisgICAgICAgICAgICBpZihkcGItPmxpc3Rbal0gIT0gJmRwYi0+YnVmZmVyW2luZGV4XSkKKyAgICAgICAgICAgICAgICBkcGItPmxpc3RbaysrXSA9IGRwYi0+bGlzdFtqXTsKKworICAgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIHNob3J0LXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgdW51c2VkIGZvcgorICAgICAgICAgICAgcmVmZXJlbmNlLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byAxCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGJ1ZmZlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOworCisgICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOworCisgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOworICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCisgICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDIKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGluZGV4OworCisvKiBDb2RlICovCisKKyAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCAoaTMyKWxvbmdUZXJtUGljTnVtLCBIQU5UUk9fRkFMU0UpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKKyAgICBkcGItPm51bVJlZkZyYW1lcy0tOworICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3AzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2luZyBhIGxvbmdUZXJtRnJhbWVJZHggdG8gYSBzaG9ydC10ZXJtIHJlZmVyZW5jZQorICAgICAgICAgICAgZnJhbWUgKGkuZS4gdG8gY2hhbmdlIGl0IHRvIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlKSwKKyAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDMKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgc2hvcnQtdGVybSBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG9yIGlzIGEgbm9uLWV4aXN0aW5nIHBpY3R1cmUsIG9yIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtRnJhbWVJZHggZ2l2ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcywKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgaW5kZXgsIHBpY051bTsKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisgICAgQVNTRVJUKGN1cnJQaWNOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKKyAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKKyAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQorICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOworCisgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICghSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZHBiLT5idWZmZXJbaW5kZXhdLnN0YXR1cyA9IExPTkdfVEVSTTsKKyAgICBkcGItPmJ1ZmZlcltpbmRleF0ucGljTnVtID0gKGkzMilsb25nVGVybUZyYW1lSWR4OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gc2V0IG1heExvbmdUZXJtRnJhbWVJZHgsCisgICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA0CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBtYXhMb25nVGVybUZyYW1lSWR4OworCisgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCisgICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCisgICAgICAgICAgKCAoKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPiBtYXhMb25nVGVybUZyYW1lSWR4KSB8fAorICAgICAgICAgICAgKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3A1CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIG1hcmsgYWxsIHJlZmVyZW5jZSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBhbmQKKyAgICAgICAgICAgIHNldCBtYXhMb25nVGVybUZyYW1lSWR4IHRvIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNS4gRnVuY3Rpb24gZmx1c2hlcworICAgICAgICAgICAgdGhlIGJ1ZmZlciBhbmQgcGxhY2VzIGFsbCBwaWN0dXJlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGRpc3BsYXkgaW50bworICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKElTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltpXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG91dHB1dCBhbGwgcGljdHVyZXMgKi8KKyAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKKyAgICAgICAgOworICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMDsKKyAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9IDA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE1tY29wNgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBhc3NpZ24gbG9uZ1Rlcm1GcmFtZUlkeCB0byB0aGUgY3VycmVudCBwaWN0dXJlLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGxvbmdUZXJtRnJhbWVJZHggb3Igbm8gcm9vbSBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBpZiAoIChkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPT0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMpIHx8CisgICAgICAgICAobG9uZ1Rlcm1GcmFtZUlkeCA+IGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCkgKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBjaGVjayBpZiBhIGxvbmcgdGVybSBwaWN0dXJlIHdpdGggdGhlIHNhbWUgbG9uZ1Rlcm1GcmFtZUlkeCBhbHJlYWR5CisgICAgICogZXhpc3QgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKKyAgICAgICAgICAodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBsb25nVGVybUZyYW1lSWR4KQorICAgICAgICB7CisgICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKKyAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQorICAgIHsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilsb25nVGVybUZyYW1lSWR4OworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBMT05HX1RFUk07CisgICAgICAgIGlmIChkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7CisgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20sIHJldHVybiBhbiBlcnJvciAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE1hcmtEZWNSZWZQaWMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuIFRoaXMKKyAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYm90aCBmb3IgcmVmZXJlbmNlIGFuZCBub24tcmVmZXJlbmNlCisgICAgICAgICAgICBwaWN0dXJlcy4gIE5vbi1yZWZlcmVuY2UgcGljdHVyZXMgc2hhbGwgaGF2ZSBtYXJrIHBvaW50ZXIgc2V0IHRvCisgICAgICAgICAgICBOVUxMLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIERQQiBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbWFyayAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIGNvbW1hbmRzCisgICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcGljdHVyZSB0byBiZSBwbGFjZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgZnJhbWVOdW0gICAgZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICAgICAgICAgIHBpY09yZGVyQ250IHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICAgICAgICAgIGlzSWRyICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgcGljdHVyZSBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUKKyAgICAgICAgICAgIGN1cnJlbnRQaWNJZCAgICBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBwaWN0dXJlLCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQorICAgICAgICAgICAgbnVtRXJyTWJzICAgICAgIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBtb2RpZmllZCwgcG9zc2libGUgb3V0cHV0IGZyYW1lcyBwbGFjZWQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgJ291dEJ1ZicKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgZmFpbHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE1hcmtEZWNSZWZQaWMoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICBkZWNSZWZQaWNNYXJraW5nX3QgKm1hcmssCisgIGltYWdlX3QgKmltYWdlLAorICB1MzIgZnJhbWVOdW0sCisgIGkzMiBwaWNPcmRlckNudCwKKyAgdTMyIGlzSWRyLAorICB1MzIgY3VycmVudFBpY0lkLAorICB1MzIgbnVtRXJyTWJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBzdGF0dXM7CisgICAgdTMyIG1hcmtlZEFzTG9uZ1Rlcm07CisgICAgdTMyIHRvQmVEaXNwbGF5ZWQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChtYXJrIHx8ICFpc0lkcik7CisgICAgQVNTRVJUKCFpc0lkciB8fCAoZnJhbWVOdW0gPT0gMCAmJiBwaWNPcmRlckNudCA9PSAwKSk7CisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBpZiAoaW1hZ2UtPmRhdGEgIT0gZHBiLT5jdXJyZW50T3V0LT5kYXRhKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJUUllJTkcgVE8gTUFSSyBOT04tQUxMT0NBVEVEIElNQUdFIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOworICAgIHN0YXR1cyA9IEhBTlRST19PSzsKKworICAgIHRvQmVEaXNwbGF5ZWQgPSBkcGItPm5vUmVvcmRlcmluZyA/IEhBTlRST19GQUxTRSA6IEhBTlRST19UUlVFOworCisgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBzdG9yZWQgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3NlcyAqLworICAgIGlmIChtYXJrID09IE5VTEwpCisgICAgeworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFVOVVNFRDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSA9IChpMzIpZnJhbWVOdW07CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKKyAgICAgICAgaWYgKCFkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKKyAgICB9CisgICAgLyogSURSIHBpY3R1cmUgKi8KKyAgICBlbHNlIGlmIChpc0lkcikKKyAgICB7CisKKyAgICAgICAgLyogaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gbm90IGNhbGxlZCBmb3IgSURSIHBpY3R1cmVzIC0+IGhhdmUgdG8KKyAgICAgICAgICogcmVzZXQgbnVtT3V0IGFuZCBvdXRJbmRleCBoZXJlICovCisgICAgICAgIGRwYi0+bnVtT3V0ID0gZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciAqLworICAgICAgICBNbWNvcDUoZHBiKTsKKyAgICAgICAgLyogaWYgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgd2FzIHNldCAtPiB0aGUgcGljdHVyZXMgcHJlY2VkaW5nIHRoZQorICAgICAgICAgKiBJRFIgcGljdHVyZSBzaGFsbCBub3QgYmUgb3V0cHV0IC0+IHNldCBvdXRwdXQgYnVmZmVyIGVtcHR5ICovCisgICAgICAgIGlmIChtYXJrLT5ub091dHB1dE9mUHJpb3JQaWNzRmxhZyB8fCBkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgeworICAgICAgICAgICAgZHBiLT5udW1PdXQgPSAwOworICAgICAgICAgICAgZHBiLT5vdXRJbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFyay0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IExPTkdfVEVSTTsKKyAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFNIT1JUX1RFUk07CisgICAgICAgICAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICAgICAgfQorICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtICA9IDA7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgID0gMDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IDA7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7CisgICAgICAgIGRwYi0+ZnVsbG5lc3MgPSAxOworICAgICAgICBkcGItPm51bVJlZkZyYW1lcyA9IDE7CisgICAgfQorICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgaWYgKG1hcmstPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDEoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMihkcGIsIG1hcmstPm9wZXJhdGlvbltpXS5sb25nVGVybVBpY051bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAgTW1jb3AzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5tYXhMb25nVGVybUZyYW1lSWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wNShkcGIpOworICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5sYXN0Q29udGFpbnNNbWNvNSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A2KAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogaW52YWxpZCBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGIpOworICAgICAgICB9CisgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSB3YXMgbm90IG1hcmtlZCBhcyBsb25nLXRlcm0gcmVmZXJlbmNlIGJ5CisgICAgICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uIDYgLT4gbWFyayBjdXJyZW50IGFzIHNob3J0CisgICAgICAgICAqIHRlcm0gYW5kIGluc2VydCBpdCBpbnRvIGRwYiAoaWYgdGhlcmUgaXMgcm9vbSkgKi8KKyAgICAgICAgaWYgKCFtYXJrZWRBc0xvbmdUZXJtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICA9IChpMzIpZnJhbWVOdW07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBTSE9SVF9URVJNOworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7CisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBubyByb29tICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRwYi0+Y3VycmVudE91dC0+aXNJZHIgPSBpc0lkcjsKKyAgICBkcGItPmN1cnJlbnRPdXQtPnBpY0lkID0gY3VycmVudFBpY0lkOworICAgIGRwYi0+Y3VycmVudE91dC0+bnVtRXJyTWJzID0gbnVtRXJyTWJzOworCisgICAgLyogZHBiIHdhcyBpbml0aWFsaXplZCB0byBub3QgdG8gcmVvcmRlciB0aGUgcGljdHVyZXMgLT4gb3V0cHV0IGN1cnJlbnQKKyAgICAgKiBwaWN0dXJlIGltbWVkaWF0ZWx5ICovCisgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGRwYi0+bnVtT3V0ID09IDApOworICAgICAgICBBU1NFUlQoZHBiLT5vdXRJbmRleCA9PSAwKTsKKyAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmRhdGEgID0gZHBiLT5jdXJyZW50T3V0LT5kYXRhOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uaXNJZHIgPSBkcGItPmN1cnJlbnRPdXQtPmlzSWRyOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSBkcGItPmN1cnJlbnRPdXQtPnBpY0lkOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ubnVtRXJyTWJzID0gZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnM7CisgICAgICAgIGRwYi0+bnVtT3V0Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIG91dHB1dCBwaWN0dXJlcyBpZiBidWZmZXIgZnVsbCAqLworICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+IGRwYi0+ZHBiU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IE91dHB1dFBpY3R1cmUoZHBiKTsKKyAgICAgICAgICAgIEFTU0VSVChpID09IEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzb3J0IGRwYiAqLworICAgIFNoZWxsU29ydChkcGItPmJ1ZmZlciwgZHBiLT5kcGJTaXplKzEpOworCisgICAgcmV0dXJuKHN0YXR1cyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0UmVmUGljRGF0YQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBnZXQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YSBmcm9tIHRoZSByZWZlcmVuY2UgcGljdHVyZQorICAgICAgICAgICAgbGlzdAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIGRlc2lyZWQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YQorICAgICAgICAgICAgTlVMTCBpZiBpbnZhbGlkIGluZGV4IG9yIG5vbi1leGlzdGluZyBwaWN0dXJlIHJlZmVycmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgaWYoaW5kZXggPiAxNiB8fCBkcGItPmxpc3RbaW5kZXhdID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBlbHNlIGlmKCFJU19FWElTVElORygqZHBiLT5saXN0W2luZGV4XSkpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihkcGItPmxpc3RbaW5kZXhdLT5kYXRhKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBpbWFnZS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgcmVhbGx5IGFsbG9jYXRlIGFueSBtZW1vcnkgYnV0IHJlc2VydmVzIG9uZSBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICBwb3NpdGlvbnMgZm9yIGRlY29kaW5nIG9mIGN1cnJlbnQgcGljdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG1lbW9yeSBhcmVhIGZvciB0aGUgaW1hZ2UKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1OCogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgICFJU19SRUZFUkVOQ0UoZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXSkgKTsKKyAgICBBU1NFUlQoZHBiLT5mdWxsbmVzcyA8PSAgZHBiLT5kcGJTaXplKTsKKworICAgIGRwYi0+Y3VycmVudE91dCA9IGRwYi0+YnVmZmVyICsgZHBiLT5kcGJTaXplOworCisgICAgcmV0dXJuKGRwYi0+Y3VycmVudE91dC0+ZGF0YSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHNsaWRpbmcgd2luZG93IHJlZmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIG5vIHNob3J0LXRlcm0gcmVmZXJlbmNlIGZyYW1lIGZvdW5kIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIG1hcmtlZCB1bnVzZWQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmRleCA9IC0xOworICAgICAgICBwaWNOdW0gPSAwOworICAgICAgICAvKiBmaW5kIHRoZSBvbGRlc3Qgc2hvcnQgdGVybSBwaWN0dXJlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQorICAgICAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQorICAgICAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5waWNOdW0gPCBwaWNOdW0gfHwgaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChpMzIpaTsKKyAgICAgICAgICAgICAgICAgICAgcGljTnVtID0gZHBiLT5idWZmZXJbaV0ucGljTnVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKKyAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBpbml0aWFsaXplIERQQi4gUmVzZXJ2ZXMgbWVtb3JpZXMgZm9yIHRoZSBidWZmZXIsCisgICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSBsaXN0IGFuZCBvdXRwdXQgYnVmZmVyLiBkcGJTaXplIGluZGljYXRlcworICAgICAgICAgICAgdGhlIG1heGltdW0gRFBCIHNpemUgaW5kaWNhdGVkIGJ5IHRoZSBsZXZlbElkYyBpbiB0aGUgc3RyZWFtLgorICAgICAgICAgICAgSWYgbm9SZW9yZGVyaW5nIGZsYWcgaXMgRkFMU0UgdGhlIERQQiBzdG9yZXMgZHBiU2l6ZSBwaWN0dXJlcworICAgICAgICAgICAgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3Nlcy4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICAgICAgICAgZmxhZyBpcyBUUlVFIHRoZSBEUEIgb25seSBzdG9yZXMgbWF4UmVmRnJhbWVzIHJlZmVyZW5jZSBwaWN0dXJlcworICAgICAgICAgICAgYW5kIG91dHB1dHMgYWxsIHRoZSBwaWN0dXJlcyBpbW1lZGlhdGVseS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBkcGJTaXplICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIChudW1iZXIgb2YgcGljdHVyZXMpCisgICAgICAgICAgICBtYXhSZWZGcmFtZXMgICAgbWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzCisgICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlcgorICAgICAgICAgICAgbm9SZW9yZGVyaW5nICAgIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBEUEIgZG9lcyBub3QgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmUgdG8gcmVvcmRlciBmcmFtZXMgZm9yIGRpc3BsYXkKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RvcmFnZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbWF4UmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gTUFYX05VTV9SRUZfUElDUyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBkcGJTaXplKTsKKyAgICBBU1NFUlQobWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChkcGJTaXplKTsKKworICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgIGRwYi0+bWF4UmVmRnJhbWVzICAgICAgICA9IE1BWChtYXhSZWZGcmFtZXMsIDEpOworICAgIGlmIChub1Jlb3JkZXJpbmcpCisgICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiLT5tYXhSZWZGcmFtZXM7CisgICAgZWxzZQorICAgICAgICBkcGItPmRwYlNpemUgICAgICAgICA9IGRwYlNpemU7CisgICAgZHBiLT5tYXhGcmFtZU51bSAgICAgICAgID0gbWF4RnJhbWVOdW07CisgICAgZHBiLT5ub1Jlb3JkZXJpbmcgICAgICAgID0gbm9SZW9yZGVyaW5nOworICAgIGRwYi0+ZnVsbG5lc3MgICAgICAgICAgICA9IDA7CisgICAgZHBiLT5udW1SZWZGcmFtZXMgICAgICAgID0gMDsKKyAgICBkcGItPnByZXZSZWZGcmFtZU51bSAgICAgPSAwOworCisgICAgQUxMT0NBVEUoZHBiLT5idWZmZXIsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QpOworICAgIGlmIChkcGItPmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIEgyNjRTd0RlY01lbXNldChkcGItPmJ1ZmZlciwgMCwKKyAgICAgICAgICAgIChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkqc2l6ZW9mKGRwYlBpY3R1cmVfdCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUgKyAxOyBpKyspCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSBuZWVkZWQgYW1vdW50IG9mIG1lbW9yeSwgd2hpY2ggaXM6CisgICAgICAgICAqIGltYWdlIHNpemUgKyAzMiArIDE1LCB3aGVyZSAzMiBjYW1lcyBmcm9tIHRoZSBmYWN0IHRoYXQgaW4gQVJNIE9wZW5NYXgKKyAgICAgICAgICogREwgaW1wbGVtZW50YXRpb24gRnVuY3Rpb25zIG1heSByZWFkIGJleW9uZCB0aGUgZW5kIG9mIGFuIGFycmF5LAorICAgICAgICAgKiBieSBhIG1heGltdW0gb2YgMzIgYnl0ZXMuIEFuZCArMTUgY2FtZXMgZm9yIHRoZSBuZWVkIHRvIGFsaWduIG1lbW9yeQorICAgICAgICAgKiB0byAxNi1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIEFMTE9DQVRFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAocGljU2l6ZUluTWJzKjM4NCArIDMyKzE1KSwgdTgpOworICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9IEFMSUdOKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAxNik7CisgICAgfQorCisgICAgQUxMT0NBVEUoZHBiLT5saXN0LCBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSwgZHBiUGljdHVyZV90Kik7CisgICAgQUxMT0NBVEUoZHBiLT5vdXRCdWYsIGRwYi0+ZHBiU2l6ZSsxLCBkcGJPdXRQaWN0dXJlX3QpOworCisgICAgaWYgKGRwYi0+bGlzdCA9PSBOVUxMIHx8IGRwYi0+b3V0QnVmID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQoZHBiLT5saXN0LCAwLAorICAgICAgICAgICAgKChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkgKiBzaXplb2YoZHBiUGljdHVyZV90KikpICk7CisKKyAgICBkcGItPm51bU91dCA9IGRwYi0+b3V0SW5kZXggPSAwOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXREcGIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcmVzZXQgRFBCLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBJRFIKKyAgICAgICAgICAgIHNsaWNlIChvdGhlciB0aGFuIHRoZSBmaXJzdCkgYWN0aXZhdGVzIG5ldyBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0LgorICAgICAgICAgICAgRnVuY3Rpb24gY2FsbHMgaDI2NGJzZEZyZWVEcGIgdG8gZnJlZSBvbGQgYWxsb2NhdGVkIG1lbW9yaWVzIGFuZAorICAgICAgICAgICAgaDI2NGJzZEluaXREcGIgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgRFBCLiBTYW1lIGlucHV0cywgb3V0cHV0cyBhbmQKKyAgICAgICAgICAgIHJldHVybnMgYXMgZm9yIGgyNjRic2RJbml0RHBiLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFJlc2V0RHBiKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgdTMyIHBpY1NpemVJbk1icywKKyAgdTMyIGRwYlNpemUsCisgIHUzMiBtYXhSZWZGcmFtZXMsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyIG5vUmVvcmRlcmluZykKK3sKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKKyAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOworICAgIEFTU0VSVChtYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKGRwYlNpemUpOworCisgICAgaDI2NGJzZEZyZWVEcGIoZHBiKTsKKworICAgIHJldHVybiBoMjY0YnNkSW5pdERwYihkcGIsIHBpY1NpemVJbk1icywgZHBiU2l6ZSwgbWF4UmVmRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGcmFtZU51bSwgbm9SZW9yZGVyaW5nKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0LiBGdW5jdGlvbiBqdXN0CisgICAgICAgICAgICBzZXRzIHBvaW50ZXJzIGluIHRoZSBsaXN0IGFjY29yZGluZyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gcGljdHVyZXMgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICAgICAgd2hhdCB0aGUgSC4yNjQgc3RhbmRhcmQgc2F5cyBhYm91dCBpbml0aWFsIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZHBiICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICdsaXN0JyBmaWVsZCBpbml0aWFsaXplZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKKyAgICAgICAgZHBiLT5saXN0W2ldID0gJmRwYi0+YnVmZmVyW2ldOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmluZERwYlBpYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIGEgcmVmZXJlbmNlIHBpY3R1cmUgZnJvbSB0aGUgYnVmZmVyLiBUaGUgcGljdHVyZQorICAgICAgICAgICAgdG8gYmUgZm91bmQgaXMgaWRlbnRpZmllZCBieSBwaWNOdW0gYW5kIGlzU2hvcnRUZXJtIGZsYWcuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwaWN0dXJlIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgIC0xIGlmIHRoZSBzcGVjaWZpZWQgcGljdHVyZSB3YXMgbm90IGZvdW5kIGluIHRoZSBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGkgPSAwOworICAgIHUzMiBmb3VuZCA9IEhBTlRST19GQUxTRTsKKworLyogQ29kZSAqLworCisgICAgaWYgKGlzU2hvcnRUZXJtKQorICAgIHsKKyAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQorICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFTU0VSVChwaWNOdW0gPj0gMCk7CisgICAgICAgIHdoaWxlIChpIDwgZHBiLT5tYXhSZWZGcmFtZXMgJiYgIWZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQorICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKQorICAgICAgICByZXR1cm4oKGkzMilpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigtMSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTZXRQaWNOdW1zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHNldCBwaWNOdW0gdmFsdWVzIGZvciBzaG9ydC10ZXJtIHBpY3R1cmVzIGluIHRoZQorICAgICAgICAgICAgYnVmZmVyLiBOdW1iZXJpbmcgb2YgcGljdHVyZXMgaXMgYmFzZWQgb24gZnJhbWUgbnVtYmVycyBhbmQgYXMKKyAgICAgICAgICAgIGZyYW1lIG51bWJlcnMgYXJlIG1vZHVsbyBtYXhGcmFtZU51bSAtPiBmcmFtZSBudW1iZXJzIG9mIG9sZGVyCisgICAgICAgICAgICBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgY3VyckZyYW1lTnVtLgorICAgICAgICAgICAgcGljTnVtcyB3aWxsIGJlIHNldCBzbyB0aGF0IGN1cnJlbnQgZnJhbWUgaGFzIHRoZSBsYXJnZXN0IHBpY051bQorICAgICAgICAgICAgYW5kIGFsbCB0aGUgc2hvcnQtdGVybSBmcmFtZXMgaW4gdGhlIGJ1ZmZlciB3aWxsIGdldCBzbWFsbGVyIHBpY051bQorICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZWlyICJkaXN0YW5jZSIgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24ga2luZCBvZiBtYXBzIHRoZSBtb2R1bG8gYXJpdGhtZXRpYyBiYWNrIHRvIG5vcm1hbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2V0UGljTnVtcyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJGcmFtZU51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgZnJhbWVOdW1XcmFwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKyAgICBBU1NFUlQoY3VyckZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZnJhbWVOdW0gPiBjdXJyRnJhbWVOdW0pCisgICAgICAgICAgICAgICAgZnJhbWVOdW1XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSAtIChpMzIpZHBiLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPSAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtOworICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID0gZnJhbWVOdW1XcmFwOworICAgICAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjaGVjayBnYXBzIGluIGZyYW1lX251bSBhbmQgZ2VuZXJhdGUgbm9uLWV4aXN0aW5nCisgICAgICAgICAgICAoc2hvcnQgdGVybSkgcmVmZXJlbmNlIHBpY3R1cmVzIGlmIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKyAgICAgICAgICAgIGJlIGNhbGxlZCBvbmx5IGZvciBub24tSURSIHBpY3R1cmVzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQorICAgICAgICAgICAgaXNSZWZQaWMgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IHBpY3R1cmUgaXMgYSByZWZlcmVuY2Ugb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1yZWZlcmVuY2UgcGljdHVyZQorICAgICAgICAgICAgZ2Fwc0FsbG93ZWQgRmxhZyB3aGljaCBpbmRpY2F0ZXMgYWN0aXZlIFNQUyBzdGFuY2Ugb24gd2hldGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgZ2FwcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBwb3NzaWJseSBtb2RpZmllZCBieSBpbnNlcnRpbmcgbm9uLWV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlcyB3aXRoIHNsaWRpbmcgd2luZG93IG1hcmtpbmcgcHJvY2VzcworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICBlcnJvciBpbiBzbGlkaW5nIHdpbmRvdyByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSBlcXVhbCB0byBwcmV2aW91cyByZWZlcmVuY2UgZnJhbWUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtOworICAgIHU4ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9IGRwYi0+ZHBiU2l6ZSk7CisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBkcGItPm51bU91dCA9IDA7CisgICAgZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICBpZighZ2Fwc0FsbG93ZWQpCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworCisgICAgaWYgKCAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pICYmCisgICAgICAgICAoZnJhbWVOdW0gIT0gKChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bSkpKQorICAgIHsKKworICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9IChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bTsKKworICAgICAgICAvKiBzdG9yZSBkYXRhIHBvaW50ZXIgb2YgbGFzdCBidWZmZXIgcG9zaXRpb24gdG8gYmUgdXNlZCBhcyBuZXh0CisgICAgICAgICAqICJhbGxvY2F0ZWQiIGRhdGEgcG9pbnRlciBpZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiBhZnRlciB0aGlzIHByb2Nlc3MKKyAgICAgICAgICogY29udGFpbnMgZGF0YSBwb2ludGVyIGxvY2F0ZWQgaW4gb3V0QnVmIChidWZmZXIgcGxhY2VkIGluIHRoZSBvdXRwdXQKKyAgICAgICAgICogc2hhbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjdXJyZW50IHBpY3R1cmUpICovCisgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgU2V0UGljTnVtcyhkcGIsIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtKTsKKworICAgICAgICAgICAgaWYgKFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCisgICAgICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+PSBkcGItPmRwYlNpemUpCisgICAgICAgICAgICB7CisjaWZkZWYgX0FTU0VSVF9VU0VECisgICAgICAgICAgICAgICAgQVNTRVJUKCFkcGItPm5vUmVvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgQVNTRVJUKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spOworI2Vsc2UKKyAgICAgICAgICAgICAgICBPdXRwdXRQaWN0dXJlKGRwYik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWRkIHRvIGVuZCBvZiBsaXN0ICovCisgICAgICAgICAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5zdGF0dXMgPSBOT05fRVhJU1RJTkc7CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmZyYW1lTnVtID0gdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnBpY051bSAgID0gKGkzMil1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKyAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKKworICAgICAgICAgICAgLyogc29ydCB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBTaGVsbFNvcnQoZHBiLT5idWZmZXIsIGRwYi0+ZHBiU2l6ZSsxKTsKKworICAgICAgICAgICAgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAodW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKyAxKSAlCisgICAgICAgICAgICAgICAgZHBiLT5tYXhGcmFtZU51bTsKKworICAgICAgICB9IHdoaWxlICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAhPSBmcmFtZU51bSk7CisKKyAgICAgICAgLyogcGljdHVyZXMgcGxhY2VkIGluIG91dHB1dCBidWZmZXIgLT4gY2hlY2sgdGhhdCAnZGF0YScgaW4KKyAgICAgICAgICogYnVmZmVyIHBvc2l0aW9uIGRwYlNpemUgaXMgbm90IGluIHRoZSBvdXRwdXQgYnVmZmVyICh0aGlzIHdpbGwgYmUKKyAgICAgICAgICogImFsbG9jYXRlZCIgYnkgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UpLiBJZiBpdCBpcyAtPiBleGNoYW5nZSBkYXRhCisgICAgICAgICAqIHBvaW50ZXIgd2l0aCB0aGUgb25lIHN0b3JlZCBpbiB0aGUgYmVnaW5uaW5nICovCisgICAgICAgIGlmIChkcGItPm51bU91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bU91dDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkcGItPm91dEJ1ZltpXS5kYXRhID09IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgYnVmZmVyIHBvc2l0aW9uIGNvbnRhaW5pbmcgZGF0YSBwb2ludGVyIHN0b3JlZCBpbgorICAgICAgICAgICAgICAgICAgICAgKiB0bXAgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZGF0YSA9PSB0bXApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGEgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGkgPCBkcGItPmRwYlNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZnJhbWVOdW0gZm9yIHJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBub3QgYmUgdGhlIHNhbWUgYXMgZm9yIHByZXZpb3VzCisgICAgICogcmVmZXJlbmNlIHBpY3R1cmUsIG90aGVyd2lzZSBhY2Nlc3NlcyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGNhbm5vdAorICAgICAqIGJlIHNvbHZlZCB1bmFtYmlndW91c2x5ICovCisgICAgZWxzZSBpZiAoaXNSZWZQaWMgJiYgZnJhbWVOdW0gPT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogc2F2ZSBjdXJyZW50IGZyYW1lX251bSBpbiBwcmV2UmVmRnJhbWVOdW0uIEZvciBub24tcmVmZXJlbmNlIGZyYW1lCisgICAgICogcHJldkZyYW1lTnVtIGlzIHNldCB0byBmcmFtZSBudW1iZXIgb2YgbGFzdCBub24tZXhpc3RpbmcgZnJhbWUgYWJvdmUgKi8KKyAgICBpZiAoaXNSZWZQaWMpCisgICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgZWxzZSBpZiAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCisgICAgeworICAgICAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9CisgICAgICAgICAgICAoZnJhbWVOdW0gKyBkcGItPm1heEZyYW1lTnVtIC0gMSkgJSBkcGItPm1heEZyYW1lTnVtOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmluZCBwaWN0dXJlIHdpdGggc21hbGxlc3QgcGljdHVyZSBvcmRlciBjb3VudC4gVGhpcworICAgICAgICAgICAgd2lsbCBiZSB0aGUgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2RwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIGRwYlBpY3R1cmVfdCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKworICAgIHBpY09yZGVyQ250ID0gMHg3RkZGRkZGRjsKKyAgICB0bXAgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8PSBkcGItPmRwYlNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkICYmCisgICAgICAgICAgICAoZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQgPCBwaWNPcmRlckNudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyICsgaTsKKyAgICAgICAgICAgIHBpY09yZGVyQ250ID0gZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4odG1wKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcHV0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG5vIHBpY3R1cmVzIHRvIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgZHBiUGljdHVyZV90ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGIpOworCisgICAgLyogbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkICovCisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSB0bXAtPmRhdGE7CisgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmlzSWRyID0gdG1wLT5pc0lkcjsKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSB0bXAtPnBpY0lkOworICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSB0bXAtPm51bUVyck1iczsKKyAgICBkcGItPm51bU91dCsrOworCisgICAgdG1wLT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgIGlmICghSVNfUkVGRVJFTkNFKCp0bXApKQorICAgIHsKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZ2V0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGZyb20gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgcG9pbnRlciB0byBvdXRwdXQgcGljdHVyZSBzdHJ1Y3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8KKyAgICAgICAgICAgIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+b3V0SW5kZXggPCBkcGItPm51bU91dCkKKyAgICAgICAgcmV0dXJuKGRwYi0+b3V0QnVmICsgZHBiLT5vdXRJbmRleCsrKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmbHVzaCB0aGUgRFBCLiBGdW5jdGlvbiBwdXRzIGFsbCBwaWN0dXJlcyBuZWVkZWQgZm9yCisgICAgICAgICAgICBkaXNwbGF5IGludG8gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgY2FsbGVkIGluCisgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gdG8gb2J0YWluIHBpY3R1cmVzIGJ1ZmZlcmVkIGZvciBkaXNwbGF5CisgICAgICAgICAgICByZS1vcmRlcmluZyBwdXJwb3Nlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKyAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiBidWZmZXIgbm90IHJlc2VydmVkICovCisgICAgaWYgKGRwYi0+YnVmZmVyKQorICAgIHsKKyAgICAgICAgZHBiLT5mbHVzaGVkID0gMTsKKyAgICAgICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLworICAgICAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKKyAgICAgICAgICAgIDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRnJlZURwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmcmVlIG1lbW9yaWVzIHJlc2VydmVkIGZvciB0aGUgRFBCLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKworICAgIGlmIChkcGItPmJ1ZmZlcikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUrMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGUkVFKGRwYi0+YnVmZmVyKTsKKyAgICBGUkVFKGRwYi0+bGlzdCk7CisgICAgRlJFRShkcGItPm91dEJ1Zik7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTaGVsbFNvcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU29ydCBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLiBGdW5jdGlvbiBpbXBsZW1lbnRzIFNoZWxsJ3MgbWV0aG9kLAorICAgICAgICAgICAgaS5lLiBkaW1pbmlzaGluZyBpbmNyZW1lbnQgc29ydC4gU2VlIGUuZy4gIk51bWVyaWNhbCBSZWNpcGVzIGluIEMiCisgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2hlbGxTb3J0KGRwYlBpY3R1cmVfdCAqcFBpYywgdTMyIG51bSkKK3sKKworICAgIHUzMiBpLCBqOworICAgIHUzMiBzdGVwOworICAgIGRwYlBpY3R1cmVfdCB0bXBQaWM7CisKKyAgICBzdGVwID0gNzsKKworICAgIHdoaWxlIChzdGVwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXBQaWMgPSBwUGljW2ldOworICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICB3aGlsZSAoaiA+PSBzdGVwICYmIENvbXBhcmVQaWN0dXJlcyhwUGljICsgaiAtIHN0ZXAsICZ0bXBQaWMpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUGljW2pdID0gcFBpY1tqLXN0ZXBdOworICAgICAgICAgICAgICAgIGogLT0gc3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBQaWNbal0gPSB0bXBQaWM7CisgICAgICAgIH0KKyAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlMjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfRFBCX0gKKyNkZWZpbmUgSDI2NFNXREVDX0RQQl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgc3RhdHVzIG9mIGJ1ZmZlcmVkIGltYWdlICovCit0eXBlZGVmIGVudW0geworICAgIFVOVVNFRCA9IDAsCisgICAgTk9OX0VYSVNUSU5HLAorICAgIFNIT1JUX1RFUk0sCisgICAgTE9OR19URVJNCit9IGRwYlBpY3R1cmVTdGF0dXNfZTsKKworLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIGJ1ZmZlcmVkIHBpY3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1OCAqZGF0YTsgICAgICAgICAgIC8qIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyIG9mIHBBbGxvY2F0ZWREYXRhICovCisgICAgdTggKnBBbGxvY2F0ZWREYXRhOyAvKiBhbGxvY2F0ZWQgcGljdHVyZSBwb2ludGVyOyAoc2l6ZSArIDE1KSBieXRlcyAqLworICAgIGkzMiBwaWNOdW07CisgICAgdTMyIGZyYW1lTnVtOworICAgIGkzMiBwaWNPcmRlckNudDsKKyAgICBkcGJQaWN0dXJlU3RhdHVzX2Ugc3RhdHVzOworICAgIHUzMiB0b0JlRGlzcGxheWVkOworICAgIHUzMiBwaWNJZDsKKyAgICB1MzIgbnVtRXJyTWJzOworICAgIHUzMiBpc0lkcjsKK30gZHBiUGljdHVyZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGRpc3BsYXkgaW1hZ2Ugb3V0cHV0IGZyb20gdGhlIGJ1ZmZlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4ICpkYXRhOworICAgIHUzMiBwaWNJZDsKKyAgICB1MzIgbnVtRXJyTWJzOworICAgIHUzMiBpc0lkcjsKK30gZHBiT3V0UGljdHVyZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IERQQiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRwYlBpY3R1cmVfdCAqYnVmZmVyOworICAgIGRwYlBpY3R1cmVfdCAqKmxpc3Q7CisgICAgZHBiUGljdHVyZV90ICpjdXJyZW50T3V0OworICAgIGRwYk91dFBpY3R1cmVfdCAqb3V0QnVmOworICAgIHUzMiBudW1PdXQ7CisgICAgdTMyIG91dEluZGV4OworICAgIHUzMiBtYXhSZWZGcmFtZXM7CisgICAgdTMyIGRwYlNpemU7CisgICAgdTMyIG1heEZyYW1lTnVtOworICAgIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4OworICAgIHUzMiBudW1SZWZGcmFtZXM7CisgICAgdTMyIGZ1bGxuZXNzOworICAgIHUzMiBwcmV2UmVmRnJhbWVOdW07CisgICAgdTMyIGxhc3RDb250YWluc01tY281OworICAgIHUzMiBub1Jlb3JkZXJpbmc7CisgICAgdTMyIGZsdXNoZWQ7Cit9IGRwYlN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEluaXREcGIoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICB1MzIgcGljU2l6ZUluTWJzLAorICB1MzIgZHBiU2l6ZSwKKyAgdTMyIG51bVJlZkZyYW1lcywKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgbm9SZW9yZGVyaW5nKTsKKwordTMyIGgyNjRic2RSZXNldERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbnVtUmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpOworCit2b2lkIGgyNjRic2RJbml0UmVmUGljTGlzdChkcGJTdG9yYWdlX3QgKmRwYik7CisKK3U4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYik7CisKK3U4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KTsKKwordTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAorICB1MzIgY3VyckZyYW1lTnVtLAorICB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKKwordTMyIGgyNjRic2RNYXJrRGVjUmVmUGljKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgZGVjUmVmUGljTWFya2luZ190ICptYXJrLAorICBpbWFnZV90ICppbWFnZSwKKyAgdTMyIGZyYW1lTnVtLAorICBpMzIgcGljT3JkZXJDbnQsCisgIHUzMiBpc0lkciwKKyAgdTMyIHBpY0lkLAorICB1MzIgbnVtRXJyTWJzKTsKKwordTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpOworCitkcGJPdXRQaWN0dXJlX3QqIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKwordm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpOworCit2b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfRFBCX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjkyODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisgICAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHgtIGFuZCB5LWNvb3JkaW5hdGVzIGZvciBlYWNoIGJsb2NrLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbXTsKK2V4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVtdOworCisvKiBjbGlwcGluZyB0YWJsZSwgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLworZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordm9pZCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlX3QgKmltYWdlLCB1OCAqZGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgd2lkdGg7CisgICAgdTMyICpsdW0sICpjYiwgKmNyOworICAgIHUzMiAqcHRyOworICAgIHUzMiB0bXAxLCB0bXAyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoISgodTMyKWRhdGEmMHgzKSk7CisKKyAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKKworICAgIC8qbGludCAtc2F2ZSAtZTgyNiBsdW0sIGNiIGFuZCBjciB1c2VkIHRvIGNvcHkgNCBieXRlcyBhdCB0aGUgdGltZSwgZGlzYWJsZQorICAgICAqICJhcmVhIHRvbyBzbWFsbCIgaW5mbyBtZXNzYWdlICovCisgICAgbHVtID0gKHUzMiopaW1hZ2UtPmx1bWE7CisgICAgY2IgPSAodTMyKilpbWFnZS0+Y2I7CisgICAgY3IgPSAodTMyKilpbWFnZS0+Y3I7CisgICAgQVNTRVJUKCEoKHUzMilsdW0mMHgzKSk7CisgICAgQVNTRVJUKCEoKHUzMiljYiYweDMpKTsKKyAgICBBU1NFUlQoISgodTMyKWNyJjB4MykpOworCisgICAgcHRyID0gKHUzMiopZGF0YTsKKworICAgIHdpZHRoICo9IDQ7CisgICAgZm9yIChpID0gMTY7IGkgOyBpLS0pCisgICAgeworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqbHVtKysgPSB0bXAxOworICAgICAgICAqbHVtKysgPSB0bXAyOworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqbHVtKysgPSB0bXAxOworICAgICAgICAqbHVtKysgPSB0bXAyOworICAgICAgICBsdW0gKz0gd2lkdGgtNDsKKyAgICB9CisKKyAgICB3aWR0aCA+Pj0gMTsKKyAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpwdHIrKzsKKyAgICAgICAgdG1wMiA9ICpwdHIrKzsKKyAgICAgICAgKmNiKysgPSB0bXAxOworICAgICAgICAqY2IrKyA9IHRtcDI7CisgICAgICAgIGNiICs9IHdpZHRoLTI7CisgICAgfQorCisgICAgZm9yIChpID0gODsgaSA7IGktLSkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHRyKys7CisgICAgICAgIHRtcDIgPSAqcHRyKys7CisgICAgICAgICpjcisrID0gdG1wMTsKKyAgICAgICAgKmNyKysgPSB0bXAyOworICAgICAgICBjciArPSB3aWR0aC0yOworICAgIH0KKworfQorI2VuZGlmCisjaWZuZGVmIEgyNjRERUNfT01YREwKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBQcmVkaWN0aW9uIGZvciB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgYW5kIHRoZSByZXNpZHVhbCBhcmUgZ2l2ZW4gc2VwYXJhdGVseSBhbmQgd2lsbCBiZSBjb21iaW5lZCB3aGlsZQorICAgICAgICAgICAgd3JpdGluZyB0aGUgZGF0YSB0byB0aGUgaW1hZ2UKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBkYXRhLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKKyAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgcmVzaWR1YWwgICAgcG9pbnRlciB0byByZXNpZHVhbCBkYXRhLCAxNiAxNi1lbGVtZW50IGFycmF5cyBmb3IgbHVtYQorICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgNCAxNi1lbGVtZW50IGFycmF5cyBmb3IgYm90aCBjaHJvbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgaW1hZ2UgICAgICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTggKmRhdGEsCisgICAgICAgIGkzMiByZXNpZHVhbFtdWzE2XSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgcGljV2lkdGgsIHBpY1NpemU7CisgICAgdTggKmx1bSwgKmNiLCAqY3I7CisgICAgdTggKmltYWdlQmxvY2s7CisgICAgdTggKnRtcDsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgdTMyIGJsb2NrOworICAgIHUzMiB4LCB5OworICAgIGkzMiAqcFJlczsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKKworICAgIC8qIEltYWdlIHNpemUgaW4gbWFjcm9ibG9ja3MgKi8KKyAgICBwaWNXaWR0aCA9IGltYWdlLT53aWR0aDsKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBpbWFnZS0+aGVpZ2h0OworICAgIHJvdyA9IG1iTnVtIC8gcGljV2lkdGg7CisgICAgY29sID0gbWJOdW0gJSBwaWNXaWR0aDsKKworICAgIC8qIE91dHB1dCBtYWNyb2Jsb2NrIHBvc2l0aW9uIGluIG91dHB1dCBwaWN0dXJlICovCisgICAgbHVtID0gKGltYWdlLT5kYXRhICsgcm93ICogcGljV2lkdGggKiAyNTYgKyBjb2wgKiAxNik7CisgICAgY2IgPSAoaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogcGljV2lkdGggKiA2NCArIGNvbCAqIDgpOworICAgIGNyID0gKGNiICsgcGljU2l6ZSAqIDY0KTsKKworICAgIHBpY1dpZHRoICo9IDE2OworCisgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTY7IGJsb2NrKyspCisgICAgeworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja107CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrXTsKKworICAgICAgICBwUmVzID0gcmVzaWR1YWxbYmxvY2tdOworCisgICAgICAgIEFTU0VSVChwUmVzKTsKKworICAgICAgICB0bXAgPSBkYXRhICsgeSoxNiArIHg7CisgICAgICAgIGltYWdlQmxvY2sgPSBsdW0gKyB5KnBpY1dpZHRoICsgeDsKKworICAgICAgICBBU1NFUlQoISgodTMyKXRtcCYweDMpKTsKKyAgICAgICAgQVNTRVJUKCEoKHUzMilpbWFnZUJsb2NrJjB4MykpOworCisgICAgICAgIGlmIChJU19SRVNJRFVBTF9FTVBUWShwUmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLypsaW50IC1lODI2ICovCisgICAgICAgICAgICBpMzIgKmluMzIgPSAoaTMyKil0bXA7CisgICAgICAgICAgICBpMzIgKm91dDMyID0gKGkzMiopaW1hZ2VCbG9jazsKKworICAgICAgICAgICAgLyogUmVzaWR1YWwgaXMgemVybyA9PiBjb3B5IHByZWRpY3Rpb24gYmxvY2sgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDQ7CisgICAgICAgICAgICB0bXAyID0gKmluMzI7ICBpbjMyICs9IDQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgKm91dDMyID0gdG1wMjsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBSQU5HRV9DSEVDS19BUlJBWShwUmVzLCAtNTEyLCA1MTEsIDE2KTsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGltYWdlID0gcHJlZGljdGlvbiArIHJlc2lkdWFsCisgICAgICAgICAgICAgKiBQcm9jZXNzIGZvdXIgcGl4ZWxzIGluIGEgbG9vcCAqLworICAgICAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMF07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcFsxXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzBdID0gKHU4KXRtcDE7CisgICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFsyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzFdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcFszXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzJdID0gKHU4KXRtcDE7CisgICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgICAgICAgICAgdG1wICs9IDE2OworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwaWNXaWR0aCAvPSAyOworCisgICAgZm9yIChibG9jayA9IDE2OyBibG9jayA8PSAyMzsgYmxvY2srKykKKyAgICB7CisgICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrICYgMHgzXTsKKyAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2sgJiAweDNdOworCisgICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107CisKKyAgICAgICAgQVNTRVJUKHBSZXMpOworCisgICAgICAgIHRtcCA9IGRhdGEgKyAyNTY7CisgICAgICAgIGltYWdlQmxvY2sgPSBjYjsKKworICAgICAgICBpZiAoYmxvY2sgPj0gMjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGltYWdlQmxvY2sgPSBjcjsKKyAgICAgICAgICAgIHRtcCArPSA2NDsKKyAgICAgICAgfQorCisgICAgICAgIHRtcCArPSB5KjggKyB4OworICAgICAgICBpbWFnZUJsb2NrICs9IHkqcGljV2lkdGggKyB4OworCisgICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOworICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7CisKKyAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KKyAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKKyAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOworCisgICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gMjsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gMjsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOworICAgICAgICAgICAgdG1wMiA9ICppbjMyOworICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOworCisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOworICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gODsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzNdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9jayArPSBwaWNXaWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDdjMThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19JTUFHRV9ICisjZGVmaW5lIEgyNjRTV0RFQ19JTUFHRV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHU4ICpkYXRhOworICAgIHUzMiB3aWR0aDsKKyAgICB1MzIgaGVpZ2h0OworICAgIC8qIGN1cnJlbnQgTUIncyBjb21wb25lbnRzICovCisgICAgdTggKmx1bWE7CisgICAgdTggKmNiOworICAgIHU4ICpjcjsKK30gaW1hZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKKworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKKyAgICBpMzIgcmVzaWR1YWxbXVsxNl0pOworI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lNQUdFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE4MWM0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKQEAgLTAsMCArMSwxMDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEludGVyUHJlZGljdGlvbgorICAgICAgICAgIE12UHJlZGljdGlvbjE2eDE2CisgICAgICAgICAgTXZQcmVkaWN0aW9uMTZ4OAorICAgICAgICAgIE12UHJlZGljdGlvbjh4MTYKKyAgICAgICAgICBNdlByZWRpY3Rpb244eDgKKyAgICAgICAgICBNdlByZWRpY3Rpb24KKyAgICAgICAgICBNZWRpYW5GaWx0ZXIKKyAgICAgICAgICBHZXRJbnRlck5laWdoYm91cgorICAgICAgICAgIEdldFByZWRpY3Rpb25NdgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGF2YWlsYWJsZTsKKyAgICB1MzIgcmVmSW5kZXg7CisgICAgbXZfdCBtdjsKK30gaW50ZXJOZWlnaGJvdXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb24xNng4KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDgobWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYik7CitzdGF0aWMgdTMyIE12UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLAorICAgIHUzMiBtYlBhcnRJZHgsIHUzMiBzdWJNYlBhcnRJZHgpOworc3RhdGljIGkzMiBNZWRpYW5GaWx0ZXIoaTMyIGEsIGkzMiBiLCBpMzIgYyk7CisKK3N0YXRpYyB2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAorICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCk7CitzdGF0aWMgdm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCk7CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDV9LCB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsNX0sIHtNQl9DVVJSLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw1fSwge01CX0NVUlIsMH0sIHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9IH0gfSwKKworICAgIHsgeyB7TUJfQSwxM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsMTN9LCB7TUJfQSwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwge01CX0NVUlIsMTB9IH0gfSwKKworICAgIHsgeyB7TUJfQ1VSUiw5fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfQ1VSUiwxMX0sIHtNQl9DVVJSLDE0fSB9IH0gfTsKKworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKKyAgICB7IHsge01CX0IsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0NVUlIsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMH0sIHtNQl9CLDExfSwge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9IH0gfSwKKworICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQ1VSUiw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQiwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDE0fSwge01CX0IsMTV9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsNX0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSwge01CX0NVUlIsMTN9IH0gfSB9OworCitzdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9DX1NVQl9QQVJUWzRdWzRdWzRdID0geworICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfTkEsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9OQSw0fSB9IH0sCisKKyAgICB7IHsge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNX0sIHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTV9LCB7TUJfQywxMH0sIHtNQl9DVVJSLDV9LCB7TUJfTkEsMH0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0gfSB9LAorCisgICAgeyB7IHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfTkEsMn0sIHtNQl9OQSw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX0NVUlIsMTN9LCB7TUJfTkEsOH0gfSB9IH07CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9ELDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9CLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0QsMTV9LCB7TUJfQiwxMH0sIHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSB9IH0sCisKKyAgICB7IHsge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9IH0gfSwKKworICAgIHsgeyB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw3fSwge01CX0EsMTN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw3fSwge01CX0NVUlIsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSwge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSB9IH0gfTsKKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlclByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50ZXIgbWFjcm9ibG9jay4gUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisgICAgICAgICAgYW5kIHJlY29uc3RydWN0cyBwcmVkaWN0aW9uIG1hY3JvYmxvY2suIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoY3VyckltYWdlKQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIHBNYkxheWVyICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCisgICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCisgICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIGN1cnJJbWFnZSAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcHJlZGljdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICpjdXJySW1hZ2UsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiB4LCB5OworICAgIHUzMiBjb2xBbmRSb3c7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOworICAgIGltYWdlX3QgcmVmSW1hZ2U7CisgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKKyAgICB1OCAqcEZpbGw7CisgICAgdTMyIHRtcDsKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworICAgIC8qIDE2LWJ5dGUgYWxpZ25tZW50ICovCisgICAgcEZpbGwgPSBBTElHTihmaWxsQnVmZiwgMTYpOworCisgICAgLyogc2V0IHJvdyBiaXRzIDE1OjAgKi8KKyAgICBjb2xBbmRSb3cgPSBtYk51bSAvIGN1cnJJbWFnZS0+d2lkdGg7CisgICAgLypzZXQgY29sIHRvIGJpdHMgMzE6MTYgKi8KKyAgICBjb2xBbmRSb3cgKz0gKG1iTnVtIC0gY29sQW5kUm93ICogY3VyckltYWdlLT53aWR0aCkgPDwgMTY7CisgICAgY29sQW5kUm93IDw8PSA0OworCisgICAgcmVmSW1hZ2Uud2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIHJlZkltYWdlLmhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworCisgICAgc3dpdGNoIChwTWItPm1iVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgUF9Ta2lwOgorICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6CisgICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uMTZ4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDE2PDw4KSArIDE2OworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uMTZ4OChwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoMTY8PDgpICsgODsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworCisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzJdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICg4PDwxNikgKyAoMTY8PDgpICsgODsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzgsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHgxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoODw8OCkgKyAxNjsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsxXTsKKyAgICAgICAgICAgIHRtcCA9ICg4PDwyNCkgKyAoMDw8MTYpICsgKDg8PDgpICsgMTY7CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogUF84eDggYW5kIFBfOHg4cmVmMCAqLworICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDgocE1iLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyW2ldOworICAgICAgICAgICAgICAgIHN1YlBhcnRNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUocE1iTGF5ZXItPnN1Yk1iUHJlZC5zdWJNYlR5cGVbaV0pOworICAgICAgICAgICAgICAgIHggPSBpICYgMHgxID8gOCA6IDA7CisgICAgICAgICAgICAgICAgeSA9IGkgPCAyID8gMCA6IDg7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJQYXJ0TW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg4OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoKHkrNCk8PDE2KSArICg4PDw4KSArIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICgoeSs0KTw8MTYpICsgKDQ8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKCh5KzQpPDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzMsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzZXMgb25lIGludGVyIG1hY3JvYmxvY2suIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorICAgICAgICAgIGFuZCByZWNvbnN0cnVjdHMgcHJlZGljdGlvbiBtYWNyb2Jsb2NrLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKKyAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGN1cnJJbWFnZSkKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgICAgICAgICBwTWJMYXllciAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KKyAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIHByZWRpY3Rpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcworICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1OCAqZGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgeCwgeTsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOworICAgIGltYWdlX3QgcmVmSW1hZ2U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworICAgIHJvdyA9IG1iTnVtIC8gY3VyckltYWdlLT53aWR0aDsKKyAgICBjb2wgPSBtYk51bSAtIHJvdyAqIGN1cnJJbWFnZS0+d2lkdGg7CisgICAgcm93ICo9IDE2OworICAgIGNvbCAqPSAxNjsKKworICAgIHJlZkltYWdlLndpZHRoID0gY3VyckltYWdlLT53aWR0aDsKKyAgICByZWZJbWFnZS5oZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKKworICAgIHN3aXRjaCAocE1iLT5tYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfU2tpcDoKKyAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgorICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbjE2eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKKyAgICAgICAgICAgICAgICAxNiwgMTYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6CisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjE2eDgocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAorICAgICAgICAgICAgICAgIDE2LCA4KTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMl07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis4LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCA4LAorICAgICAgICAgICAgICAgIDE2LCA4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgorICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKKyAgICAgICAgICAgICAgICA4LCAxNik7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzFdOworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCwgJnJlZkltYWdlLCBjb2wsIHJvdywgOCwgMCwKKyAgICAgICAgICAgICAgICA4LCAxNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBQXzh4OCBhbmQgUF84eDhyZWYwICovCisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4OChwTWIsICZwTWJMYXllci0+c3ViTWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbaV07CisgICAgICAgICAgICAgICAgc3ViUGFydE1vZGUgPQorICAgICAgICAgICAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZShwTWJMYXllci0+c3ViTWJQcmVkLnN1Yk1iVHlwZVtpXSk7CisgICAgICAgICAgICAgICAgeCA9IGkgJiAweDEgPyA4IDogMDsKKyAgICAgICAgICAgICAgICB5ID0gaSA8IDIgPyAwIDogODsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YlBhcnRNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDg6CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgOCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA4LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgOCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA0LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSwgNCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDQsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5LCA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMywgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHkrNCwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCisgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisKKyAgICBpZiAocE1iLT5tYlR5cGUgIT0gUF9Ta2lwKQorICAgIHsKKyAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGN1cnJJbWFnZSwgbWJOdW0sIGRhdGEsCisgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgMTZ4MTYgcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIG12X3QgbXY7CisgICAgbXZfdCBtdlByZWQ7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisgICAgdTMyIHJlZkluZGV4OworICAgIHU4ICp0bXA7CisgICAgdTMyICp0bXBNdjEsICp0bXBNdjI7CisKKy8qIENvZGUgKi8KKworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworICAgIC8qbGludCAtLWUoNzQwKSAgVW51c3VhbCBwb2ludGVyIGNhc3QgKGluY29tcGF0aWJsZSBpbmRpcmVjdCB0eXBlcykgKi8KKyAgICB0bXBNdjEgPSAodTMyKikoJmFbMF0ubXYpOyAvKiB3ZSB0ZXN0IGp1c3QgdGhhdCBib3RoIE1WcyBhcmUgemVybyAqLworICAgIC8qbGludCAtLWUoNzQwKSAqLworICAgIHRtcE12MiA9ICh1MzIqKSgmYVsxXS5tdik7IC8qIGkuZS4gYVswXS5tdi5ob3IgPT0gMCAmJiBhWzBdLm12LnZlciA9PSAwICovCisgICAgaWYgKHBNYi0+bWJUeXBlID09IFBfU2tpcCAmJgorICAgICAgICAoIWFbMF0uYXZhaWxhYmxlIHx8ICFhWzFdLmF2YWlsYWJsZSB8fAorICAgICAgICAgKCBhWzBdLnJlZkluZGV4ID09IDAgJiYgKCh1MzIpKCp0bXBNdjEpID09IDApICkgfHwKKyAgICAgICAgICggYVsxXS5yZWZJbmRleCA9PSAwICYmICgodTMyKSgqdG1wTXYyKSA9PSAwKSApKSkKKyAgICB7CisgICAgICAgICAgICBtdi5ob3IgPSBtdi52ZXIgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICAgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgICAgIG12LnZlciArPSBtdlByZWQudmVyOworCisgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0KKyAgICAgICAgICogKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPQorICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7CisKKyAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uMTZ4OAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDE2eDggcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjE2eDgobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgbXZfdCBtdjsKKyAgICBtdl90IG12UHJlZDsKKyAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KKyAgICB1MzIgcmVmSW5kZXg7CisgICAgdTggKnRtcDsKKworLyogQ29kZSAqLworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworCisgICAgaWYgKGFbMV0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCisgICAgICAgIG12UHJlZCA9IGFbMV0ubXY7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICB9CisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLworICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9CisgICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9IG12OworICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzFdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFsxXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDEzKTsKKyAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBhWzFdLmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOworICAgICAgICBhWzFdLnJlZkluZGV4ID0gcE1iLT5yZWZQaWNbMF07CisgICAgICAgIGFbMV0ubXYgPSBwTWItPm12WzBdOworCisgICAgICAgIC8qIGMgaXMgbm90IGF2YWlsYWJsZSAqLworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhKzIsIDcpOworCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICB9CisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLworICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0KKyAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OworICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgOHgxNiBwYXJ0aXRpb24gbW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uOHgxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12OworICAgIG12X3QgbXZQcmVkOworICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLworICAgIHUzMiByZWZJbmRleDsKKyAgICB1OCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOworCisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisKKyAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxNCk7CisgICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPSBtdjsKKyAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKKworICAgIG12ID0gbWJQcmVkLT5tdmRMMFsxXTsKKyAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMV07CisKKyAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKKyAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxMSk7CisgICAgfQorICAgIGlmIChhWzJdLnJlZkluZGV4ID09IHJlZkluZGV4KQorICAgICAgICBtdlByZWQgPSBhWzJdLm12OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFbMF0uYXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGFbMF0ucmVmSW5kZXggPSBwTWItPnJlZlBpY1swXTsKKyAgICAgICAgYVswXS5tdiA9IHBNYi0+bXZbMF07CisKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxNCk7CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KKyAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OworICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDgKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciA4eDggcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjh4OChtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgbnVtU3ViTWJQYXJ0OworCisvKiBDb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbnVtU3ViTWJQYXJ0ID0gaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSk7CisgICAgICAgIHBNYi0+cmVmUGljW2ldID0gc3ViTWJQcmVkLT5yZWZJZHhMMFtpXTsKKyAgICAgICAgcE1iLT5yZWZBZGRyW2ldID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCBzdWJNYlByZWQtPnJlZklkeEwwW2ldKTsKKyAgICAgICAgaWYgKHBNYi0+cmVmQWRkcltpXSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtU3ViTWJQYXJ0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24ocE1iLCBzdWJNYlByZWQsIGksIGopICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3Igc3ViLXBhcnRpdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsIHUzMiBtYlBhcnRJZHgsCisgICAgdTMyIHN1Yk1iUGFydElkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12LCBtdlByZWQ7CisgICAgdTMyIHJlZkluZGV4OworICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJNYlBhcnRNb2RlOworICAgIGNvbnN0IG5laWdoYm91cl90ICpuOworICAgIG1iU3RvcmFnZV90ICpuTWI7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisKKy8qIENvZGUgKi8KKworICAgIG12ID0gc3ViTWJQcmVkLT5tdmRMMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF07CisgICAgc3ViTWJQYXJ0TW9kZSA9IGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iUHJlZC0+c3ViTWJUeXBlW21iUGFydElkeF0pOworICAgIHJlZkluZGV4ID0gc3ViTWJQcmVkLT5yZWZJZHhMMFttYlBhcnRJZHhdOworCisgICAgbiA9IE5fQV9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKKyAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGEsIG4tPmluZGV4KTsKKworICAgIG4gPSBOX0JfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzEsIG4tPmluZGV4KTsKKworICAgIG4gPSBOX0NfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKKworICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgeworICAgICAgICBuID0gTl9EX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKKyAgICB9CisKKyAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOworCisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBzd2l0Y2ggKHN1Yk1iUGFydE1vZGUpCisgICAgeworICAgICAgICBjYXNlIE1CX1NQXzh4ODoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHhdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMV0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyXSA9IG12OworICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDNdID0gbXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1CX1NQXzh4NDoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeCArIDFdID0gbXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHhdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4ICsgMl0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUJfU1BfNHg0OgorICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTWVkaWFuRmlsdGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1lZGlhbiBmaWx0ZXJpbmcgZm9yIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgTWVkaWFuRmlsdGVyKGkzMiBhLCBpMzIgYiwgaTMyIGMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIG1heCxtaW4sbWVkOworCisvKiBDb2RlICovCisKKyAgICBtYXggPSBtaW4gPSBtZWQgPSBhOworICAgIGlmIChiID4gbWF4KQorICAgIHsKKyAgICAgICAgbWF4ID0gYjsKKyAgICB9CisgICAgZWxzZSBpZiAoYiA8IG1pbikKKyAgICB7CisgICAgICAgIG1pbiA9IGI7CisgICAgfQorICAgIGlmIChjID4gbWF4KQorICAgIHsKKyAgICAgICAgbWVkID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChjIDwgbWluKQorICAgIHsKKyAgICAgICAgbWVkID0gbWluOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZWQgPSBjOworICAgIH0KKworICAgIHJldHVybihtZWQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEludGVyTmVpZ2hib3VyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhdmFpbGFiaWxpdHksIHJlZmVyZW5jZSBpbmRleCBhbmQgbW90aW9uIHZlY3RvciBvZiBhIG5laWdoYm91cgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAorICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCkKK3sKKworICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19GQUxTRTsKKyAgICBuLT5yZWZJbmRleCA9IDB4RkZGRkZGRkY7CisgICAgbi0+bXYuaG9yID0gbi0+bXYudmVyID0gMDsKKworICAgIGlmIChuTWIgJiYgKHNsaWNlSWQgPT0gbk1iLT5zbGljZUlkKSkKKyAgICB7CisgICAgICAgIHUzMiB0bXA7CisgICAgICAgIG12X3QgdG1wTXY7CisKKyAgICAgICAgdG1wID0gbk1iLT5tYlR5cGU7CisgICAgICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOworICAgICAgICAvKiBNYlBhcnRQcmVkTW9kZSAiaW5saW5lZCIgKi8KKyAgICAgICAgaWYgKHRtcCA8PSBQXzh4OHJlZjApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcE12ID0gbk1iLT5tdltpbmRleF07CisgICAgICAgICAgICB0bXAgPSBuTWItPnJlZlBpY1tpbmRleD4+Ml07CisgICAgICAgICAgICBuLT5yZWZJbmRleCA9IHRtcDsKKyAgICAgICAgICAgIG4tPm12ID0gdG1wTXY7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRQcmVkaWN0aW9uTXYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBiYXNlZCBvbiBuZWlnaGJvdXJzIEEsIEIgYW5kIEMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCkKK3sKKworICAgIGlmICggYVsxXS5hdmFpbGFibGUgfHwgYVsyXS5hdmFpbGFibGUgfHwgIWFbMF0uYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgdTMyIGlzQSwgaXNCLCBpc0M7CisgICAgICAgIGlzQSA9IChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICBpc0IgPSAoYVsxXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgaXNDID0gKGFbMl0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgaWYgKCgodTMyKWlzQSsodTMyKWlzQisodTMyKWlzQykgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbXYtPmhvciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYuaG9yLCBhWzFdLm12LmhvciwgYVsyXS5tdi5ob3IpOworICAgICAgICAgICAgbXYtPnZlciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYudmVyLCBhWzFdLm12LnZlciwgYVsyXS5tdi52ZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzQSkKKyAgICAgICAgICAgICptdiA9IGFbMF0ubXY7CisgICAgICAgIGVsc2UgaWYgKGlzQikKKyAgICAgICAgICAgICptdiA9IGFbMV0ubXY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICptdiA9IGFbMl0ubXY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICptdiA9IGFbMF0ubXY7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTRkZWUyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0gKKyNkZWZpbmUgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1ZWFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCkBAIC0wLDAgKzEsMTkzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbnRyYVByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscworICAgICAgICAgIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgorICAgICAgICAgIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uCisgICAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsCisgICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbgorICAgICAgICAgIEdldDR4NE5laWdoYm91clBlbHMKKyAgICAgICAgICBXcml0ZTR4NFRvMTZ4MTYKKyAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NERjUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbgorICAgICAgICAgIERldGVybWluZUludHJhNHg0UHJlZE1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDIgKi8KKworCisvKiB4LSBhbmQgeS1jb29yZGluYXRlcyBmb3IgZWFjaCBibG9jayAqLworY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbMTZdID0KKyAgICB7IDAsIDQsIDAsIDQsIDgsIDEyLCA4LCAxMiwgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyIH07Citjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVsxNl0gPQorICAgIHsgMCwgMCwgNCwgNCwgMCwgMCwgNCwgNCwgOCwgOCwgMTIsIDEyLCA4LCA4LCAxMiwgMTIgfTsKKworY29uc3QgdTggaDI2NGJzZENsaXBbMTI4MF0gPQoreworICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LAorICAgIDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLAorICAgIDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LAorICAgIDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLAorICAgIDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LAorICAgIDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LAorICAgIDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLAorICAgIDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKKyAgICAxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsCisgICAgMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LAorICAgIDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwKKyAgICAxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsCisgICAgMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LAorICAgIDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywKKyAgICAyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksCisgICAgMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUKK307CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBibG9ja051bSk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOworc3RhdGljIHZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBBLCB1MzIgQik7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBBLCB1MzIgQik7CitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKKworc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NERjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIEEsIHUzMiBCKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwordm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSk7CisKK3N0YXRpYyB2b2lkIFdyaXRlNHg0VG8xNngxNih1OCAqZGF0YSwgdTggKmRhdGE0eDQsIHUzMiBibG9ja051bSk7CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCitzdGF0aWMgdTMyIERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAorICAgIHUzMiBhdmFpbGFibGUsIG5laWdoYm91cl90ICpuQSwgbmVpZ2hib3VyX3QgKm5CLCB1MzIgaW5kZXgsCisgICAgbWJTdG9yYWdlX3QgKm5NYkEsIG1iU3RvcmFnZV90ICpuTWJCKTsKKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQKKyAgICAgICAgICByZXNpZHVhbCBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlCisgICAgICAgICAgc3RvcmVkIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisgICAgT01YUmVzdWx0IG9teFJlczsKKworLyogQ29kZSAqLworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocHRyKTsKKyAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKKworICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOworICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoIChwdHItMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsgKGF2YWlsYWJsZUE8PDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7CisgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKKyAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlIHN0b3JlZCBpbgorICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLiBUaGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaAorICAgICAgICAgIGJsb2NrIGlzIHN0b3JlZCBpbiAncE1iJyBzdHJ1Y3R1cmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnB0ciwgdTMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1MzIgYmxvY2spCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiBtb2RlOworICAgIG5laWdoYm91cl90IG5laWdoYm91ciwgbmVpZ2hib3VyQjsKKyAgICBtYlN0b3JhZ2VfdCAqbk1iLCAqbk1iMjsKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKKworICAgIE9NWFJlc3VsdCBvbXhSZXM7CisgICAgdTMyIHgsIHk7CisgICAgdTggKmwsICphLCAqYWw7CisvKiBDb2RlICovCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYkxheWVyKTsKKyAgICBBU1NFUlQocHRyKTsKKyAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOworCisgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2spOworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7CisgICAgbk1iMiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ckIubWIpOworICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYjItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCisgICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCisgICAgICAgICZuZWlnaGJvdXIsICZuZWlnaGJvdXJCLCBibG9jaywgbk1iLCBuTWIyKTsKKyAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7CisKKyAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKKyAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja107CisKKyAgICBpZiAoeSA9PSAwKQorICAgICAgICBhID0gcHRyIC0gd2lkdGggKyB4OworICAgIGVsc2UKKyAgICAgICAgYSA9IGRhdGEtMTY7CisKKyAgICBpZiAoeCA9PSAwKQorICAgICAgICBsID0gcHRyICsgeSAqIHdpZHRoIC0xOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGwgPSBkYXRhLTE7CisgICAgICAgIHdpZHRoID0gMTY7CisgICAgfQorCisgICAgaWYgKHggPT0gMCkKKyAgICAgICAgYWwgPSBsLXdpZHRoOworICAgIGVsc2UKKyAgICAgICAgYWwgPSBhLTE7CisKKyAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUM8PDYpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCisgICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICB1OCAqcHRyOworICAgIHUzMiB3aWR0aDsKKworLyogQ29kZSAqLworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBwdHIgPSBpbWFnZS0+Y2I7CisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGgqODsKKworICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCggKHB0ci0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGggLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKKyAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgIHJldHVybiBIQU5UUk9fTk9LOworCisgICAgLyogYWR2YW5jZSBwb2ludGVycyAqLworICAgIGRhdGEgKz0gNjQ7CisgICAgcHRyID0gaW1hZ2UtPmNyOworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50cmEgbWFjcm9ibG9jay4gUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiB1c2luZworICAgICAgICAgIHNwZWNpZmllZCBwcmVkaWN0aW9uIG1vZGUuIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoaW1hZ2UpCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCisgICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCisgICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgb3V0cHV0IG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBpbWFnZSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBpbnRyYSBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHBlbEFib3ZlIGFuZCBwZWxMZWZ0IGNvbnRhaW4gc2FtcGxlcyBhYm92ZSBhbmQgbGVmdCB0byB0aGUgY3VycmVudAorICAgICAqIG1hY3JvYmxvY2suIEFib3ZlIGFycmF5IGNvbnRhaW5zIGFsc28gc2FtcGxlIGFib3ZlLWxlZnQgdG8gdGhlIGN1cnJlbnQKKyAgICAgKiBtYiBhcyB3ZWxsIGFzIDQgc2FtcGxlcyBhYm92ZS1yaWdodCB0byB0aGUgY3VycmVudCBtYiAobGF0dGVyIG9ubHkgZm9yCisgICAgICogbHVtYSkgKi8KKyAgICAvKiBsdW1EICsgbHVtQiArIGx1bUMgKyBjYkQgKyBjYkIgKyBjckQgKyBjckIgKi8KKyAgICB1OCBwZWxBYm92ZVsxICsgMTYgKyA0ICsgMSArIDggKyAxICsgOF07CisgICAgLyogbHVtQSArIGNiQSArIGNyQSAqLworICAgIHU4IHBlbExlZnRbMTYgKyA4ICsgOF07CisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKKyAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpOworCisgICAgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2UsIHBlbEFib3ZlLCBwZWxMZWZ0LCBtYk51bSk7CisKKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAorICAgICAgICAgICAgcGVsQWJvdmUsIHBlbExlZnQsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXIsCisgICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAorICAgICAgICAgICAgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwrMTYsIHBlbEFib3ZlICsgMjEsIHBlbExlZnQgKyAxNiwKKyAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdHJhaW5lZEludHJhUHJlZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZSwgZGF0YSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBHZXQgcGl4ZWwgdmFsdWVzIGZyb20gbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGludG8gJ2Fib3ZlJworICAgICAgICAgIGFuZCAnbGVmdCcgYXJyYXlzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlX3QgKmltYWdlLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgbWJOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHdpZHRoLCBwaWNTaXplOworICAgIHU4ICpwdHIsICp0bXA7CisgICAgdTMyIHJvdywgY29sOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworCisgICAgaWYgKCFtYk51bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisgICAgcGljU2l6ZSA9IHdpZHRoICogaW1hZ2UtPmhlaWdodDsKKyAgICByb3cgPSBtYk51bSAvIHdpZHRoOworICAgIGNvbCA9IG1iTnVtIC0gcm93ICogd2lkdGg7CisKKyAgICB3aWR0aCAqPSAxNjsKKyAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggICsgY29sICogMTY7CisKKyAgICAvKiBub3RlIHRoYXQgbHVtYSBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkbyBub3QgbWFrZQorICAgICAqIHNlbnNlIHdoZW4gY3VycmVudCBtYiBpcyB0aGUgcmlnaHQtbW9zdCBtYiBpbiBhIHJvdy4gU2FtZSBhcHBsaWVzIHRvCisgICAgICogc2FtcGxlIGFib3ZlLWxlZnQgaWYgY29sIGlzIHplcm8uIEhvd2V2ZXIsIHVzYWdlIG9mIHBlbHMgaW4gcHJlZGljdGlvbgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkgbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpbiBhY3R1YWwgcHJlZGljdGlvbgorICAgICAqIHByb2Nlc3MgKi8KKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7CisgICAgICAgIGZvciAoaSA9IDIxOyBpLS07KQorICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7CisgICAgfQorCisgICAgaWYgKGNvbCkKKyAgICB7CisgICAgICAgIHB0ci0tOworICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgfQorCisgICAgd2lkdGggPj49IDE7CisgICAgcHRyID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogOCAqIHdpZHRoICArIGNvbCAqIDg7CisKKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7CisgICAgICAgIGZvciAoaSA9IDk7IGktLTspCisgICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKKyAgICAgICAgdG1wICs9IChwaWNTaXplICogNjQpIC0gOTsKKyAgICAgICAgZm9yIChpID0gOTsgaS0tOykKKyAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOworICAgIH0KKworICAgIGlmIChjb2wpCisgICAgeworICAgICAgICBwdHItLTsKKyAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgICAgIHB0ciArPSAocGljU2l6ZSAqIDY0KSAtIDggKiB3aWR0aDsKKyAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAorICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKKyAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKHJlc2lkdWFsKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKyAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKKworICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOworICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworCisgICAgc3dpdGNoKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6IC8qIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24oZGF0YSwgbGVmdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6IC8qIEludHJhXzE2eDE2X0RDICovCisgICAgICAgICAgICBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAzOiBJbnRyYV8xNngxNl9QbGFuZSAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogYWRkIHJlc2lkdWFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgaSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCisgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCisgICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgdTggKmFib3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYmxvY2s7CisgICAgdTMyIG1vZGU7CisgICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOworICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOworICAgIHU4IGFbMSArIDQgKyA0XSwgbFsxICsgNF07CisgICAgdTMyIGRhdGE0eDRbNF07CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUMsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobWJMYXllcik7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKKyAgICB7CisKKyAgICAgICAgQVNTRVJUKHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPCA5KTsKKworICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7CisgICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOworICAgICAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBuZWlnaGJvdXJCID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2spOworICAgICAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7CisgICAgICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCisgICAgICAgICAgICAodTMyKShhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpLAorICAgICAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOworICAgICAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7CisKKyAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MoYmxvY2spOworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgICAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUMgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVDID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgICAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscyhhLCBsLCBkYXRhLCBhYm92ZSwgbGVmdCwgYmxvY2spOworCisgICAgICAgIHN3aXRjaChtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhXzR4NF9WZXJ0aWNhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhXzR4NF9EQyAqLworICAgICAgICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBLCBhdmFpbGFibGVCKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhWzZdID0gYVs3XSA9IGFbOF0gPSBhWzRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogLyogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IC8qIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgOCBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFdyaXRlNHg0VG8xNngxNihkYXRhLCAodTgqKWRhdGE0eDQsIGJsb2NrKTsKKyAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsW2Jsb2NrXSwgYmxvY2spOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBjaHJvbWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAorICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgY29tcCwgYmxvY2s7CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBmb3IgKGNvbXAgPSAwLCBibG9jayA9IDE2OyBjb21wIDwgMjsgY29tcCsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHByZWRNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhX0Nocm9tYV9EQyAqLworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhX0Nocm9tYV9QbGFuZSAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKyspCisgICAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgcmVzaWR1YWxbaV0sIGJsb2NrKTsKKworICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCisgICAgICAgIGRhdGEgKz0gNjQ7CisgICAgICAgIGFib3ZlICs9IDk7CisgICAgICAgIGxlZnQgKz0gODsKKyAgICAgICAgcmVzaWR1YWwgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBZGRSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgQWRkIHJlc2lkdWFsIG9mIGEgYmxvY2sgaW50byBwcmVkaWN0aW9uIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgorICAgICAgICAgIFRoZSByZXN1bHQgKHJlc2lkdWFsICsgcHJlZGljdGlvbikgaXMgc3RvcmVkIGluICdkYXRhJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19PTVhETAordm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgeCwgeTsKKyAgICB1MzIgd2lkdGg7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgICAgdTggKnRtcDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2ICsgNCArIDQpOworCisgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocmVzaWR1YWwsIC01MTIsIDUxMSwgMTYpOworCisgICAgaWYgKGJsb2NrTnVtIDwgMTYpCisgICAgeworICAgICAgICB3aWR0aCA9IDE2OworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2lkdGggPSA4OworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bSAmIDB4M107CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtICYgMHgzXTsKKyAgICB9CisKKyAgICB0bXAgPSBkYXRhICsgeSp3aWR0aCArIHg7CisgICAgZm9yIChpID0gNDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpyZXNpZHVhbCsrOworICAgICAgICB0bXAyID0gdG1wWzBdOworICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDQgPSB0bXBbMV07CisKKyAgICAgICAgdG1wWzBdID0gY2xwW3RtcDEgKyB0bXAyXTsKKworICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDIgPSB0bXBbMl07CisKKyAgICAgICAgdG1wWzFdID0gY2xwW3RtcDMgKyB0bXA0XTsKKworICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDQgPSB0bXBbM107CisKKyAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOworICAgICAgICB0bXBbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgdG1wWzNdID0gKHU4KXRtcDM7CisKKyAgICAgICAgdG1wICs9IHdpZHRoOworICAgIH0KKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAqZGF0YSsrID0gYWJvdmVbal07CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpkYXRhKysgPSBsZWZ0W2ldOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmExNngxNkRjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBEQyBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNkRjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCisgICAgdTMyIGF2YWlsYWJsZUIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldICsgbGVmdFtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDE2KSA+PiA1OworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB0bXAgKz0gbGVmdFtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHRtcCArPSBhYm92ZVtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7CisgICAgfQorICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSAxMjg7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgZGF0YVtpXSA9ICh1OCl0bXA7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIGkzMiBhLCBiLCBjOworICAgIGkzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7CisKKyAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgYiArPSAoKGkzMilpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOworICAgIGIgPSAoNSAqIGIgKyAzMikgPj4gNjsKKworICAgIGZvciAoaSA9IDAsIGMgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOworICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KKyAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOworICAgIGMgPSAoNSAqIGMgKyAzMikgPj4gNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IChhICsgYiAqICgoaTMyKWogLSA3KSArIGMgKiAoKGkzMilpIC0gNykgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIGRhdGFbaSoxNitqXSA9ICh1OClDTElQMSh0bXApOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIERDIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYURjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCisgICAgdTMyIGF2YWlsYWJsZUIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHRtcDEsIHRtcDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIC8qIHkgPSAwLi4zICovCisgICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHRtcDEgPSBhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArCisgICAgICAgICAgICAgIGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM107CisgICAgICAgIHRtcDEgPSAodG1wMSArIDQpID4+IDM7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICAgICAgdG1wMiA9IHRtcDE7CisgICAgfQorICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKKyAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgIHsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgfQorCisgICAgLyogeSA9IDQuLi43ICovCisgICAgaWYgKGF2YWlsYWJsZUEpCisgICAgeworICAgICAgICB0bXAxID0gKGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN10gKyAyKSA+PiAyOworICAgICAgICBpZiAoYXZhaWxhYmxlQikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMiA9IGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsKKyAgICAgICAgICAgICAgICAgICBsZWZ0WzRdICsgbGVmdFs1XSArIGxlZnRbNl0gKyBsZWZ0WzddOworICAgICAgICAgICAgdG1wMiA9ICh0bXAyICsgNCkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXAyID0gdG1wMTsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHRtcDEgPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgICAgICB0bXAyID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wMSA9IHRtcDIgPSAxMjg7CisgICAgfQorCisgICAgQVNTRVJUKHRtcDEgPCAyNTYgJiYgdG1wMiA8IDI1Nik7CisgICAgZm9yIChpID0gNDsgaS0tOykKKyAgICB7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoaSA9IDg7IGktLTspCisgICAgeworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdCsrOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBmb3IgKGkgPSA4OyBpLS07ZGF0YSsrLyphYm92ZS09OCovKQorICAgIHsKKyAgICAgICAgZGF0YVswXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs4XSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVsxNl0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbMjRdID0gKmFib3ZlOworICAgICAgICBkYXRhWzMyXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs0MF0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbNDhdID0gKmFib3ZlOworICAgICAgICBkYXRhWzU2XSA9ICphYm92ZSsrOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBwbGFuZSBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgaTMyIGEsIGIsIGM7CisgICAgaTMyIHRtcDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGEgPSAxNiAqIChhYm92ZVs3XSArIGxlZnRbN10pOworCisgICAgYiA9IChhYm92ZVs0XSAtIGFib3ZlWzJdKSArIDIgKiAoYWJvdmVbNV0gLSBhYm92ZVsxXSkKKyAgICAgICAgKyAzICogKGFib3ZlWzZdIC0gYWJvdmVbMF0pICsgNCAqIChhYm92ZVs3XSAtIGFib3ZlWy0xXSk7CisgICAgYiA9ICgxNyAqIGIgKyAxNikgPj4gNTsKKworICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KKyAgICBjID0gKGxlZnRbNF0gLSBsZWZ0WzJdKSArIDIgKiAobGVmdFs1XSAtIGxlZnRbMV0pCisgICAgICAgICsgMyAqIChsZWZ0WzZdIC0gbGVmdFswXSkgKyA0ICogKGxlZnRbN10gLSBhYm92ZVstMV0pOworICAgIGMgPSAoMTcgKiBjICsgMTYpID4+IDU7CisKKyAgICAvKmEgKz0gMTY7Ki8KKyAgICBhID0gYSAtIDMgKiBjICsgMTY7CisgICAgZm9yIChpID0gODsgaS0tOyBhICs9IGMpCisgICAgeworICAgICAgICB0bXAgPSAoYSAtIDMgKiBiKTsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldDR4NE5laWdoYm91clBlbHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEdldCBuZWlnaGJvdXJpbmcgcGl4ZWxzIG9mIGEgNHg0IGJsb2NrIGludG8gJ2EnIGFuZCAnbCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBibG9ja051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeCwgeTsKKyAgICB1OCB0MSwgdDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChhKTsKKyAgICBBU1NFUlQobCk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07CisKKyAgICAvKiBBIGFuZCBEICovCisgICAgaWYgKHggPT0gMCkKKyAgICB7CisgICAgICAgIHQxID0gbGVmdFt5ICAgIF07CisgICAgICAgIHQyID0gbGVmdFt5ICsgMV07CisgICAgICAgIGxbMV0gPSB0MTsKKyAgICAgICAgbFsyXSA9IHQyOworICAgICAgICB0MSA9IGxlZnRbeSArIDJdOworICAgICAgICB0MiA9IGxlZnRbeSArIDNdOworICAgICAgICBsWzNdID0gdDE7CisgICAgICAgIGxbNF0gPSB0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdDEgPSBkYXRhW3kgKiAxNiArIHggLSAxICAgICBdOworICAgICAgICB0MiA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAxNl07CisgICAgICAgIGxbMV0gPSB0MTsKKyAgICAgICAgbFsyXSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAzMl07CisgICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDQ4XTsKKyAgICAgICAgbFszXSA9IHQxOworICAgICAgICBsWzRdID0gdDI7CisgICAgfQorCisgICAgLyogQiwgQyBhbmQgRCAqLworICAgIGlmICh5ID09IDApCisgICAgeworICAgICAgICB0MSA9IGFib3ZlW3ggICAgXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICAgIF07CisgICAgICAgIGxbMF0gPSB0MTsKKyAgICAgICAgYVswXSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyAxXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgMl07CisgICAgICAgIGFbMV0gPSB0MTsKKyAgICAgICAgYVsyXSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyAzXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgNF07CisgICAgICAgIGFbM10gPSB0MTsKKyAgICAgICAgYVs0XSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyA1XTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgNl07CisgICAgICAgIGFbNV0gPSB0MTsKKyAgICAgICAgYVs2XSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyA3XTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgOF07CisgICAgICAgIGFbN10gPSB0MTsKKyAgICAgICAgYVs4XSA9IHQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCAgICBdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDFdOworICAgICAgICBhWzFdID0gdDE7CisgICAgICAgIGFbMl0gPSB0MjsKKyAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAyXTsKKyAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAzXTsKKyAgICAgICAgYVszXSA9IHQxOworICAgICAgICBhWzRdID0gdDI7CisgICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNF07CisgICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNV07CisgICAgICAgIGFbNV0gPSB0MTsKKyAgICAgICAgYVs2XSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDZdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDddOworICAgICAgICBhWzddID0gdDE7CisgICAgICAgIGFbOF0gPSB0MjsKKworICAgICAgICBpZiAoeCA9PSAwKQorICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBsZWZ0W3ktMV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxbMF0gPSBhWzBdID0gZGF0YVsoeSAtIDEpICogMTYgKyB4IC0gMV07CisgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICB0MSA9IGFib3ZlWzBdOworICAgIHQyID0gYWJvdmVbMV07CisgICAgZGF0YVswXSA9IGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSB0MTsKKyAgICBkYXRhWzFdID0gZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IHQyOworICAgIHQxID0gYWJvdmVbMl07CisgICAgdDIgPSBhYm92ZVszXTsKKyAgICBkYXRhWzJdID0gZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSB0MTsKKyAgICBkYXRhWzNdID0gZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSB0MjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIHQxID0gbGVmdFswXTsKKyAgICB0MiA9IGxlZnRbMV07CisgICAgZGF0YVswXSA9IGRhdGFbMV0gPSBkYXRhWzJdID0gZGF0YVszXSA9IHQxOworICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPSB0MjsKKyAgICB0MSA9IGxlZnRbMl07CisgICAgdDIgPSBsZWZ0WzNdOworICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IHQxOworICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gdDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgREMgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKKyAgICB1MzIgYXZhaWxhYmxlQikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworICAgIHU4IHQxLCB0MiwgdDMsIHQ0OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKKyAgICAgICAgdG1wID0gdDEgKyB0MiArIHQzICsgdDQ7CisgICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKKyAgICAgICAgdG1wICs9IHQxICsgdDIgKyB0MyArIHQ0OworICAgICAgICB0bXAgPSAodG1wICsgNCkgPj4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQSkKKyAgICB7CisgICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKKyAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHQxID0gYWJvdmVbMF07IHQyID0gYWJvdmVbMV07IHQzID0gYWJvdmVbMl07IHQ0ID0gYWJvdmVbM107CisgICAgICAgIHRtcCA9ICh0MSArIHQyICsgdDMgKyB0NCArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wIDwgMjU2KTsKKyAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0KKyAgICBkYXRhWzRdID0gZGF0YVs1XSA9IGRhdGFbNl0gPSBkYXRhWzddID0KKyAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPQorICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gKHU4KXRtcDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGRpYWdvbmFsIGRvd24tbGVmdCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA5XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzExXSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICBkYXRhWzE0XSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVs2XSArIDMgKiBhYm92ZVs3XSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1yaWdodCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgNl0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgOV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCByaWdodCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChhYm92ZVstMV0gKyBhYm92ZVswXSArIDEpID4+IDE7CisgICAgZGF0YVsgNV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWzExXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVsyXSArIGFib3ZlWzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0Wy0xXSArIDIpID4+IDI7CisgICAgZGF0YVsxMl0gPSAobGVmdFsyXSArIDIgKiBsZWZ0WzFdICsgbGVmdFswXSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBkb3duIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGxlZnRbLTFdICsgbGVmdFswXSArIDEpID4+IDE7CisgICAgZGF0YVsgNl0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA1XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsxMV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDRdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEwXSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIDEpID4+IDE7CisgICAgZGF0YVsgOV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7CisgICAgZGF0YVsxNV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7CisgICAgZGF0YVsgOF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbMTRdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgbGVmdFszXSArIDEpID4+IDE7CisgICAgZGF0YVsgMV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7CisgICAgZGF0YVsgN10gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7CisgICAgZGF0YVsgMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVstMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMF0gKyAyKSA+PiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgbGVmdCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOworICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDVdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDddID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDldID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbMTBdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOworICAgIGRhdGFbMTFdID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyAxKSA+PiAxOworICAgIGRhdGFbMTJdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTVdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIHVwIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyAxXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7CisgICAgZGF0YVsgM10gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7CisgICAgZGF0YVsgNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDVdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA3XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTBdID0gbGVmdFszXTsKKyAgICBkYXRhWzExXSA9IGxlZnRbM107CisgICAgZGF0YVsxMl0gPSBsZWZ0WzNdOworICAgIGRhdGFbMTNdID0gbGVmdFszXTsKKyAgICBkYXRhWzE0XSA9IGxlZnRbM107CisgICAgZGF0YVsxNV0gPSBsZWZ0WzNdOworCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogV3JpdGU0eDRUbzE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBXcml0ZSBhIDR4NCBibG9jayAoZGF0YTR4NCkgaW50byBjb3JyZWN0IHBvc2l0aW9uCisgICAgICAgICAgaW4gMTZ4MTYgbWFjcm9ibG9jayAoZGF0YSkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgV3JpdGU0eDRUbzE2eDE2KHU4ICpkYXRhLCB1OCAqZGF0YTR4NCwgdTMyIGJsb2NrTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5OworICAgIHUzMiAqaW4zMiwgKm91dDMyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGRhdGE0eDQpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07CisKKyAgICBkYXRhICs9IHkqMTYreDsKKworICAgIEFTU0VSVCgoKHUzMilkYXRhJjB4MykgPT0gMCk7CisKKyAgICAvKmxpbnQgLS1lKDgyNikgKi8KKyAgICBvdXQzMiA9ICh1MzIgKilkYXRhOworICAgIC8qbGludCAtLWUoODI2KSAqLworICAgIGluMzIgPSAodTMyICopZGF0YTR4NDsKKworICAgIG91dDMyWzBdID0gKmluMzIrKzsKKyAgICBvdXQzMls0XSA9ICppbjMyKys7CisgICAgb3V0MzJbOF0gPSAqaW4zMisrOworICAgIG91dDMyWzEyXSA9ICppbjMyKys7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBvZiBhIGJsb2NrIGJhc2VkIG9uIHRoZQorICAgICAgICAgIG5laWdoYm91cmluZyBtYWNyb2Jsb2NrcyBhbmQgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gc3RyZWFtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgdTMyIGF2YWlsYWJsZSwgbmVpZ2hib3VyX3QgKm5BLCBuZWlnaGJvdXJfdCAqbkIsIHUzMiBpbmRleCwKKyAgICBtYlN0b3JhZ2VfdCAqbk1iQSwgbWJTdG9yYWdlX3QgKm5NYkIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIG1vZGUxLCBtb2RlMjsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworCisgICAgLyogZGMgb25seSBwcmVkaWN0aW9uPyAqLworICAgIGlmICghYXZhaWxhYmxlKQorICAgICAgICBtb2RlMSA9IDI7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE1iID0gbk1iQTsKKyAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYi0+aW50cmE0eDRQcmVkTW9kZVtuQS0+aW5kZXhdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1vZGUxID0gMjsKKworICAgICAgICBwTWIgPSBuTWJCOworICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUyID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25CLT5pbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbW9kZTIgPSAyOworCisgICAgICAgIG1vZGUxID0gTUlOKG1vZGUxLCBtb2RlMik7CisgICAgfQorCisgICAgaWYgKCFwTWJMYXllci0+bWJQcmVkLnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpbmRleF0pCisgICAgeworICAgICAgICBpZiAocE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSA8IG1vZGUxKQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF0gKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKG1vZGUxKTsKK30KKworCisvKmxpbnQgK2U3MDIgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjUyYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSAorI2RlZmluZSBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit1MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKTsKKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Cit1MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCisgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKwordTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7CisKK3ZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSk7CisKKyNlbHNlCisKK3UzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcEltYWdlLCB1MzIgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jayk7CisKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHU4ICpwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCisjZW5kaWYKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiM2U3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCkBAIC0wLDAgKzEsMTQ0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIKKyAgICAgICAgICBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUKKyAgICAgICAgICBoMjY0YnNkTnVtTWJQYXJ0CisgICAgICAgICAgaDI2NGJzZE51bVN1Yk1iUGFydAorICAgICAgICAgIERlY29kZU1iUHJlZAorICAgICAgICAgIERlY29kZVN1Yk1iUHJlZAorICAgICAgICAgIERlY29kZVJlc2lkdWFsCisgICAgICAgICAgRGV0ZXJtaW5lTmMKKyAgICAgICAgICBDYnBJbnRyYTE2eDE2CisgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNgorICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCisgICAgICAgICAgUHJvY2Vzc1Jlc2lkdWFsCisgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgiCisKKyNpZmRlZiBIMjY0REVDX09NWERMCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybVZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyBjb25zdCB1MzIgY2hyb21hSW5kZXhbOF0gPSB7IDI1NiwgMjYwLCAyODgsIDI5MiwgMzIwLCAzMjQsIDM1MiwgMzU2IH07CitzdGF0aWMgY29uc3QgdTMyIGx1bWFJbmRleFsxNl0gPSB7ICAgMCwgICA0LCAgNjQsICA2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgMTIsICA3MiwgIDc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDEzMiwgMTkyLCAxOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNiwgMTQwLCAyMDAsIDIwNCB9OworI2VuZGlmCisvKiBtYXBwaW5nIG9mIGRjIGNvZWZmaWNpZW50cyBhcnJheSB0byBsdW1hIGJsb2NrcyAqLworc3RhdGljIGNvbnN0IHUzMiBkY0NvZWZmSW5kZXhbMTZdID0KKyAgICB7MCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBtYlByZWRfdCAqcE1iUHJlZCwKKyAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOworc3RhdGljIHUzMiBEZWNvZGVTdWJNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdWJNYlByZWRfdCAqcFN1Yk1iUHJlZCwKKyAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOworc3RhdGljIHUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKKyAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybik7CisKKyNpZmRlZiBIMjY0REVDX09NWERMCitzdGF0aWMgdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpOworI2Vsc2UKK3N0YXRpYyB1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIGkxNiAqcFRvdGFsQ29lZmYpOworI2VuZGlmCisKK3N0YXRpYyB1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpOworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyB1MzIgUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsIGNvbnN0IHU4ICoqcFNyYywgaW1hZ2VfdCAqaW1hZ2UpOworc3RhdGljIHUzMiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGNvbnN0IHU4ICoqcFNyYyApOworc3RhdGljIHUzMiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdCB1OCAqKnBTcmMsIGltYWdlX3QgKmltYWdlKTsKKworCisjZWxzZQorc3RhdGljIHUzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgcE1iICAgICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgc2xpY2VUeXBlICAgICAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBzbGljZQorICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSAgIG1heGltdW0gcmVmZXJlbmNlIGluZGV4CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBwTWJMYXllciAgICAgICAgICBzdG9yZXMgdGhlIG1hY3JvYmxvY2sgZGF0YSBwYXJzZWQgZnJvbSBzdHJlYW0KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisgICAgbWJQYXJ0UHJlZE1vZGVfZSBwYXJ0TW9kZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworI2lmZGVmIEgyNjRERUNfTkVPTgorICAgIGgyNjRic2RDbGVhck1iTGF5ZXIocE1iTGF5ZXIsICgoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGKSk7CisjZWxzZQorICAgIEgyNjRTd0RlY01lbXNldChwTWJMYXllciwgMCwgc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSk7CisjZW5kaWYKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisKKyAgICBpZiAoSVNfSV9TTElDRShzbGljZVR5cGUpKQorICAgIHsKKyAgICAgICAgaWYgKCh2YWx1ZSArIDYpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyA2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCh2YWx1ZSArIDEpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyAxKTsKKyAgICB9CisKKyAgICBpZiAocE1iTGF5ZXItPm1iVHlwZSA9PSBJX1BDTSkKKyAgICB7CisgICAgICAgIGkzMiAqbGV2ZWw7CisgICAgICAgIHdoaWxlKCAhaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHBjbV9hbGlnbm1lbnRfemVyb19iaXQgKi8KKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldmVsID0gcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsWzBdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzg0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICpsZXZlbCsrID0gKGkzMil2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJ0TW9kZSA9IGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWJMYXllci0+bWJUeXBlKTsKKyAgICAgICAgaWYgKCAocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVEVSKSAmJgorICAgICAgICAgICAgIChoMjY0YnNkTnVtTWJQYXJ0KHBNYkxheWVyLT5tYlR5cGUpID09IDQpICkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gRGVjb2RlU3ViTWJQcmVkKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5zdWJNYlByZWQsCisgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgbnVtUmVmSWR4QWN0aXZlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IERlY29kZU1iUHJlZChwU3RybURhdGEsICZwTWJMYXllci0+bWJQcmVkLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIG51bVJlZklkeEFjdGl2ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICBpZiAocGFydE1vZGUgIT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQocFN0cm1EYXRhLCAmdmFsdWUsCisgICAgICAgICAgICAgICAgKHUzMikocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuID0gQ2JwSW50cmExNngxNihwTWJMYXllci0+bWJUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuIHx8CisgICAgICAgICAgICAgKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCAoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkgKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBNYkxheWVyLT5tYlFwRGVsdGEgPSBpdG1wOworCisgICAgICAgICAgICB0bXAgPSBEZWNvZGVSZXNpZHVhbChwU3RybURhdGEsICZwTWJMYXllci0+cmVzaWR1YWwsIHBNYiwKKyAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4pOworCisgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPQorICAgICAgICAgICAgICAgICh1MzIpKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zIC0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCkgKiA4ICsKKyAgICAgICAgICAgICAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RNYlBhcnRQcmVkTW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgcHJlZGljdGlvbiBtb2RlIG9mIGEgbWFjcm9ibG9jayB0eXBlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK21iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iVHlwZSA8PSAzMSk7CisKKyAgICBpZiAoKG1iVHlwZSA8PSBQXzh4OHJlZjApKQorICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVEVSKTsKKyAgICBlbHNlIGlmIChtYlR5cGUgPT0gSV80eDQpCisgICAgICAgIHJldHVybihQUkVEX01PREVfSU5UUkE0eDQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRSQTE2eDE2KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROdW1NYlBhcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIGFtb3VudCBvZiBtYWNyb2Jsb2NrIHBhcnRpdGlvbnMgaW4gYSBtYWNyb2Jsb2NrIHR5cGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2ROdW1NYlBhcnQobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKKworICAgIHN3aXRjaCAobWJUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgorICAgICAgICBjYXNlIFBfU2tpcDoKKyAgICAgICAgICAgIHJldHVybigxKTsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6CisgICAgICAgICAgICByZXR1cm4oMik7CisKKyAgICAgICAgLyogUF84eDggb3IgUF84eDhyZWYwICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oNCk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE51bVN1Yk1iUGFydAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgYW1vdW50IG9mIHN1Yi1wYXJ0aXRpb25zIGluIGEgc3ViLW1hY3JvYmxvY2sgdHlwZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChzdWJNYlR5cGUgPD0gUF9MMF80eDQpOworCisgICAgc3dpdGNoIChzdWJNYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfTDBfOHg4OgorICAgICAgICAgICAgcmV0dXJuKDEpOworCisgICAgICAgIGNhc2UgUF9MMF84eDQ6CisgICAgICAgIGNhc2UgUF9MMF80eDg6CisgICAgICAgICAgICByZXR1cm4oMik7CisKKyAgICAgICAgLyogUF9MMF80eDQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybig0KTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVNYlByZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlCisgICAgICAgICAgaW4gJ3BNYlByZWQnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbWJQcmVkX3QgKnBNYlByZWQsIG1iVHlwZV9lIG1iVHlwZSwKKyAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIGosIHZhbHVlOworICAgIGkzMiBpdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocE1iUHJlZCk7CisKKyAgICBzd2l0Y2ggKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpKQorICAgIHsKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5URVI6IC8qIFBSRURfTU9ERV9JTlRFUiAqLworICAgICAgICAgICAgaWYgKG51bVJlZklkeEFjdGl2ZSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaDI2NGJzZE51bU1iUGFydChtYlR5cGUpLCBqID0gMDsgaS0tOyAgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChwU3RybURhdGEsICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPj0gbnVtUmVmSWR4QWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnJlZklkeEwwW2pdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZSksIGogPSAwOyBpLS07ICBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0uaG9yID0gKGkxNilpdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0udmVyID0gKGkxNilpdG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkE0eDQ6CisgICAgICAgICAgICBmb3IgKGl0bXAgPSAwLCBpID0gMDsgaXRtcCA8IDI7IGl0bXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgICAgICAgICAgdG1wID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA4OyBqLS07IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAmIDB4ODAwMDAwMDAgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICghcE1iUHJlZC0+cHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5yZW1JbnRyYTR4NFByZWRNb2RlW2ldID0gdmFsdWU+PjI5OworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKyAzKnRtcCkgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkExNngxNjoKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcE1iUHJlZC0+aW50cmFDaHJvbWFQcmVkTW9kZSA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJNYlByZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIHN1Yi1tYWNyb2Jsb2NrIHByZWRpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZAorICAgICAgICAgIHN0b3JlIGluICdwTWJQcmVkJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVN1Yk1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHN1Yk1iUHJlZF90ICpwU3ViTWJQcmVkLAorICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqLCB2YWx1ZTsKKyAgICBpMzIgaXRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdWJNYlByZWQpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID4gMykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldID0gKHN1Yk1iVHlwZV9lKXZhbHVlOworICAgIH0KKworICAgIGlmICggKG51bVJlZklkeEFjdGl2ZSA+IDEpICYmIChtYlR5cGUgIT0gUF84eDhyZWYwKSApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHBTdHJtRGF0YSwgJnZhbHVlLAorICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID49IG51bVJlZklkeEFjdGl2ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5yZWZJZHhMMFtpXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICBmb3IgKHZhbHVlID0gaDI2NGJzZE51bVN1Yk1iUGFydChwU3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0pOworICAgICAgICAgICAgIHZhbHVlLS07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFN1Yk1iUHJlZC0+bXZkTDBbaV1bal0uaG9yID0gKGkxNilpdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5tdmRMMFtpXVtqXS52ZXIgPSAoaTE2KWl0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisjaWZkZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgcmVzaWR1YWwgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZSBpbiAncFJlc2lkdWFsJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAorICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiBibG9ja0NvZGVkOworICAgIHUzMiBibG9ja0luZGV4OworICAgIHUzMiBpczE2eDE2OworICAgIE9NWF9JTlQgbmM7CisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICBPTVhfVTggKnBQb3NDb2VmQnVmOworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVzaWR1YWwpOworCisgICAgcFBvc0NvZWZCdWYgPSBwUmVzaWR1YWwtPnBvc0NvZWZCdWY7CisKKyAgICAvKiBsdW1hIERDIGlzIGF0IGluZGV4IDI0ICovCisgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIDAsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAxNik7CisjZWxzZQorICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAxNik7CisjZW5kaWYKKyAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpczE2eDE2ID0gSEFOVFJPX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19GQUxTRTsKKworICAgIGZvciAoaSA9IDQsIGJsb2NrSW5kZXggPSAwOyBpLS07KQorICAgIHsKKyAgICAgICAgLyogbHVtYSBjYnAgaW4gYml0cyAwLTMgKi8KKyAgICAgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgxOworICAgICAgICBjb2RlZEJsb2NrUGF0dGVybiA+Pj0gMTsKKyAgICAgICAgaWYgKGJsb2NrQ29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGotLTsgYmxvY2tJbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLGJsb2NrSW5kZXgscFJlc2lkdWFsLT50b3RhbENvZWZmKTsKKyAgICAgICAgICAgICAgICBpZiAoaXMxNngxNikKKyAgICAgICAgICAgICAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworI2lmbmRlZiBIMjY0REVDX05FT04KKyAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBibG9ja0luZGV4ICs9IDQ7CisgICAgfQorCisgICAgLyogY2hyb21hIERDIGJsb2NrIGFyZSBhdCBpbmRpY2VzIDI1IGFuZCAyNiAqLworICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MzsKKyAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSwKKyAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOworI2Vsc2UKKyAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICA0KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSwKKyAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOworI2Vsc2UKKyAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICA0KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogY2hyb21hIEFDICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgyOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gODsgaS0tO2Jsb2NrSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAxNSk7CisjZWxzZQorICAgICAgICAgICAgb214UmVzID0gIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAgICAgMTUpOworI2VuZGlmCisgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIHJlc2lkdWFsIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUgaW4gJ3BSZXNpZHVhbCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKKyAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgdG1wOworICAgIGkzMiBuYzsKKyAgICB1MzIgYmxvY2tDb2RlZDsKKyAgICB1MzIgYmxvY2tJbmRleDsKKyAgICB1MzIgaXMxNngxNjsKKyAgICBpMzIgKCpsZXZlbClbMTZdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFJlc2lkdWFsKTsKKworICAgIGxldmVsID0gcFJlc2lkdWFsLT5sZXZlbDsKKworICAgIC8qIGx1bWEgREMgaXMgYXQgaW5kZXggMjQgKi8KKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgeworICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCAwLCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjRdLCBuYywgMTYpOworICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBmb3IgKGkgPSA0LCBibG9ja0luZGV4ID0gMDsgaS0tOykKKyAgICB7CisgICAgICAgIC8qIGx1bWEgY2JwIGluIGJpdHMgMC0zICovCisgICAgICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MTsKKyAgICAgICAgY29kZWRCbG9ja1BhdHRlcm4gPj49IDE7CisgICAgICAgIGlmIChibG9ja0NvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSA0OyBqLS07IGJsb2NrSW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgIGlmIChpczE2eDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7CisgICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0sIG5jLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgYmxvY2sgYXJlIGF0IGluZGljZXMgMjUgYW5kIDI2ICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgzOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSwgLTEsIDQpOworICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSs0LCAtMSwgNCk7CisgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgIH0KKworICAgIC8qIGNocm9tYSBBQyAqLworICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MjsKKyAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDg7IGktLTtibG9ja0luZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7CisgICAgICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiA0KSAmIDB4RkY7CisgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiAxNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGV0ZXJtaW5lTmMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIG5DIG9mIGEgYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgSDI2NERFQ19PTVhETAordTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpCisjZWxzZQordTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCBpMTYgKnBUb3RhbENvZWZmKQorI2VuZGlmCit7CisvKmxpbnQgLWU3MDIgKi8KKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKyAgICBpMzIgbjsKKyAgICBjb25zdCBuZWlnaGJvdXJfdCAqbmVpZ2hib3VyQSwgKm5laWdoYm91ckI7CisgICAgdTggbmVpZ2hib3VyQWluZGV4LCBuZWlnaGJvdXJCaW5kZXg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOworCisgICAgLyogaWYgbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgdG8gY3VycmVudCBtYWNyb2Jsb2NrIHRvdGFsQ29lZmYgYXJyYXkKKyAgICAgKiBtYlN0b3JhZ2UgaGFzIG5vdCBiZWVuIHNldC91cGRhdGVkIHlldCAtPiB1c2UgcFRvdGFsQ29lZmYgKi8KKyAgICBuZWlnaGJvdXJBID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9ja0luZGV4KTsKKyAgICBuZWlnaGJvdXJCID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9ja0luZGV4KTsKKyAgICBuZWlnaGJvdXJBaW5kZXggPSBuZWlnaGJvdXJBLT5pbmRleDsKKyAgICBuZWlnaGJvdXJCaW5kZXggPSBuZWlnaGJvdXJCLT5pbmRleDsKKyAgICBpZiAobmVpZ2hib3VyQS0+bWIgPT0gTUJfQ1VSUiAmJiBuZWlnaGJvdXJCLT5tYiA9PSBNQl9DVVJSKQorICAgIHsKKyAgICAgICAgbiA9IChwVG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsKKyAgICAgICAgICAgICBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSk+PjE7CisgICAgfQorICAgIGVsc2UgaWYgKG5laWdoYm91ckEtPm1iID09IE1CX0NVUlIpCisgICAgeworICAgICAgICBuID0gcFRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XTsKKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobmVpZ2hib3VyQi0+bWIgPT0gTUJfQ1VSUikKKyAgICB7CisgICAgICAgIG4gPSBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdOworICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQS0+dG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsgMSkgPj4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuID0gdG1wID0gMDsKKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IHBNYi0+bWJBLT50b3RhbENvZWZmW25laWdoYm91ckFpbmRleF07CisgICAgICAgICAgICB0bXAgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKCh1MzIpbik7CisvKmxpbnQgK2U3MDIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDYnBJbnRyYTE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBjb2RlZCBibG9jayBwYXR0ZXJuIGZvciBpbnRyYSAxNngxNiBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGNicDsKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWJUeXBlID49IElfMTZ4MTZfMF8wXzAgJiYgbWJUeXBlIDw9IElfMTZ4MTZfM18yXzEpOworCisgICAgaWYgKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8xKQorICAgICAgICBjYnAgPSAxNTsKKyAgICBlbHNlCisgICAgICAgIGNicCA9IDA7CisKKyAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCisgICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLworICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCkgPj4gMjsKKyAgICBpZiAodG1wID4gMikKKyAgICAgICAgdG1wIC09IDM7CisKKyAgICBjYnAgKz0gdG1wIDw8IDQ7CisKKyAgICByZXR1cm4oY2JwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIHByZWRpY3Rpb24gbW9kZSBmb3IgaW50cmEgMTZ4MTYgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMCAmJiBtYlR5cGUgPD0gSV8xNngxNl8zXzJfMSk7CisKKyAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCisgICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLworICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCk7CisKKyAgICByZXR1cm4odG1wICYgMHgzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBEZWNvZGUgb25lIG1hY3JvYmxvY2sgYW5kIHdyaXRlIGludG8gb3V0cHV0IGltYWdlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIG1iTGF5ZXIgICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKKyAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgorICAgICAgICAgIHFwWSAgICAgICAgICAgcG9pbnRlciB0byBzbGljZSBRUAorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIGRlY29kZWQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gb3V0cHV0IGltYWdlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1hY3JvYmxvY2sgZGVjb2RpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAorICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisgICAgbWJUeXBlX2UgbWJUeXBlOworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICBjb25zdCB1OCAqcFNyYzsKKyNlbmRpZgorLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKyAgICBBU1NFUlQocXBZICYmICpxcFkgPCA1Mik7CisgICAgQVNTRVJUKG1iTnVtIDwgY3VyckltYWdlLT53aWR0aCpjdXJySW1hZ2UtPmhlaWdodCk7CisKKyAgICBtYlR5cGUgPSBwTWJMYXllci0+bWJUeXBlOworICAgIHBNYi0+bWJUeXBlID0gbWJUeXBlOworCisgICAgcE1iLT5kZWNvZGVkKys7CisKKyAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhjdXJySW1hZ2UsIG1iTnVtKTsKKworICAgIGlmIChtYlR5cGUgPT0gSV9QQ00pCisgICAgeworICAgICAgICB1OCAqcERhdGEgPSAodTgqKWRhdGE7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICB1OCAqdG90ID0gcE1iLT50b3RhbENvZWZmOworI2Vsc2UKKyAgICAgICAgaTE2ICp0b3QgPSBwTWItPnRvdGFsQ29lZmY7CisjZW5kaWYKKyAgICAgICAgaTMyICpsZXYgPSBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWxbMF07CisKKyAgICAgICAgcE1iLT5xcFkgPSAwOworCisgICAgICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKKyAgICAgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKKyAgICAgICAgICAgICAgICAqdG90KysgPSAxNjsKKyAgICAgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgKnRvdCsrID0gMTY7CisgICAgICAgICAgICBmb3IgKHRtcCA9IDE2OyB0bXAtLTspCisgICAgICAgICAgICAgICAgKnBEYXRhKysgPSAodTgpKCpsZXYrKyk7CisgICAgICAgIH0KKyAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsICh1OCopZGF0YSk7CisKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGRwYiwgbWJOdW0sCisgICAgICAgICAgICAgICAgY3VyckltYWdlLCAodTgqKWRhdGEpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChtYlR5cGUgIT0gUF9Ta2lwKQorICAgICAgICB7CisgICAgICAgICAgICBIMjY0U3dEZWNNZW1jcHkocE1iLT50b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC50b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBxcFkgKi8KKyAgICAgICAgICAgIGlmIChwTWJMYXllci0+bWJRcERlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpxcFkgPSAqcXBZICsgcE1iTGF5ZXItPm1iUXBEZWx0YTsKKyAgICAgICAgICAgICAgICBpZiAoKnFwWSA8IDApICpxcFkgKz0gNTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKnFwWSA+PSA1MikgKnFwWSAtPSA1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYi0+cXBZID0gKHUzMikqcXBZOworCisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICAgICAgcFNyYyA9IHBNYkxheWVyLT5yZXNpZHVhbC5wb3NDb2VmQnVmOworCisgICAgICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9NWFJlc3VsdCByZXM7CisgICAgICAgICAgICAgICAgdTggKnA7CisgICAgICAgICAgICAgICAgdTggKnRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICgqdG90YWxDb2VmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsIHAsIDAsIHAsIDE2LCAxNiwgKnFwWSwgKnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckltYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJbWFnZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKHBNYiwgZGF0YSwgJnBTcmMpOworCisjZWxzZQorICAgICAgICAgICAgdG1wID0gUHJvY2Vzc1Jlc2lkdWFsKHBNYiwgcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC5jb2VmZk1hcCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChwTWItPnRvdGFsQ29lZmYsIDAsIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7CisgICAgICAgICAgICBwTWItPnFwWSA9ICh1MzIpKnFwWTsKKyAgICAgICAgfQorI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICAgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KKyAgICAgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKKyNlbHNlCisgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYVByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgY3VyckltYWdlLCBtYk51bSwKKyAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsICh1OCopZGF0YSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludGVyUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBkcGIsIG1iTnVtLAorICAgICAgICAgICAgICAgIGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKworI2lmZGVmIEgyNjRERUNfT01YREwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgY2hyb21hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBjb25zdCB1OCAqKnBTcmMgKQoreworICAgIHUzMiBpOworICAgIHUzMiBjaHJvbWFRcDsKKyAgICBpMTYgKnBEYzsKKyAgICBpMTYgZGNbNCArIDRdID0gezAsMCwwLDAsMCwwLDAsMH07CisgICAgdTggKnRvdGFsQ29lZmY7CisgICAgT01YUmVzdWx0IHJlc3VsdDsKKyAgICB1OCAqcDsKKworICAgIC8qIGNocm9tYSBEQyBwcm9jZXNzaW5nLiBGaXJzdCBjaHJvbWEgZGMgYmxvY2sgaXMgYmxvY2sgd2l0aCBpbmRleCAyNSAqLworICAgIGNocm9tYVFwID0KKyAgICAgICAgaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilwTWItPnFwWSArIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCldOworCisgICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNV0pCisgICAgeworICAgICAgICBwRGMgPSBkYzsKKyAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKKyAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNl0pCisgICAgeworICAgICAgICBwRGMgPSBkYys0OworICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAorICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgcERjLAorICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXApOworICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgIH0KKworICAgIHBEYyA9IGRjOworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmYgKyAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwRGMrKywgdG90YWxDb2VmZisrKQorICAgIHsKKyAgICAgICAgLyogY2hyb21hIHByZWRpY3Rpb24gKi8KKyAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBkYXRhICsgY2hyb21hSW5kZXhbaV07CisgICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICBwRGMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXAsCisgICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBsdW1hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4KiogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3QgKmltYWdlKQoreworICAgIHUzMiBpOworICAgIGkxNiAqcERjOworICAgIGkxNiBkY1sxNl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTggKnRvdGFsQ29lZmY7CisgICAgT01YUmVzdWx0IHJlc3VsdDsKKyAgICB1OCAqcDsKKworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisKKyAgICBpZiAodG90YWxDb2VmZlsyNF0pCisgICAgeworICAgICAgICBwRGMgPSBkYzsKKyAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgfQorICAgIC8qIEludHJhIDE2eDE2IHByZWQgKi8KKyAgICBpZiAoaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKHBNYiwgZGF0YSwgaW1hZ2UtPmx1bWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKKyAgICB7CisgICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOworICAgICAgICBwRGMgPSAmZGNbZGNDb2VmZkluZGV4W2ldXTsKKyAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAorICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKKyAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICBpbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgbHVtYSB3aXRoCisgICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICoqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV90ICppbWFnZSkKK3sKKyAgICB1MzIgaTsKKyAgICB1OCAqdG90YWxDb2VmZjsKKyAgICBPTVhSZXN1bHQgcmVzdWx0OworICAgIHU4ICpwOworCisgICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCisgICAgeworICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKKyAgICAgICAgaWYgKGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24ocE1iLCBwLCBtYkxheWVyLCBpbWFnZS0+bHVtYSwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCwgaSkgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmICgqdG90YWxDb2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAorICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKKyAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICBtYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwKKyAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4gSEFOVFJPX09LOworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc1Jlc2lkdWFsCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIG9uZSBtYWNyb2Jsb2NrIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqY29lZmZNYXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIGNocm9tYVFwOworICAgIGkzMiAoKmJsb2NrRGF0YSlbMTZdOworICAgIGkzMiAoKmJsb2NrRGMpWzE2XTsKKyAgICBpMTYgKnRvdGFsQ29lZmY7CisgICAgaTMyICpjaHJvbWFEYzsKKyAgICBjb25zdCB1MzIgKmRjQ29lZmZJZHg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChyZXNpZHVhbExldmVsKTsKKworICAgIC8qIHNldCBwb2ludGVycyB0byBEQyBjb2VmZmljaWVudCBibG9ja3MgKi8KKyAgICBibG9ja0RjID0gcmVzaWR1YWxMZXZlbCArIDI0OworCisgICAgYmxvY2tEYXRhID0gcmVzaWR1YWxMZXZlbDsKKyAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOworICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgaWYgKHRvdGFsQ29lZmZbMjRdKQorICAgICAgICB7CisgICAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYygqYmxvY2tEYywgcE1iLT5xcFkpOworICAgICAgICB9CisgICAgICAgIGRjQ29lZmZJZHggPSBkY0NvZWZmSW5kZXg7CisKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IGRjIGNvZWZmaWNpZW50IG9mIGx1bWEgYmxvY2sgKi8KKyAgICAgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICgqYmxvY2tEYylbKmRjQ29lZmZJZHgrK107CisgICAgICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAxLCAqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCp0b3RhbENvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAwLCAqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgcHJvY2Vzc2luZy4gRmlyc3QgY2hyb21hIGRjIGJsb2NrIGlzIGJsb2NrIHdpdGggaW5kZXggMjUgKi8KKyAgICBjaHJvbWFRcCA9CisgICAgICAgIGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcE1iLT5xcFkgKyBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICBpZiAocE1iLT50b3RhbENvZWZmWzI1XSB8fCBwTWItPnRvdGFsQ29lZmZbMjZdKQorICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKHJlc2lkdWFsTGV2ZWxbMjVdLCBjaHJvbWFRcCk7CisgICAgY2hyb21hRGMgPSByZXNpZHVhbExldmVsWzI1XTsKKyAgICBmb3IgKGkgPSA4OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCisgICAgeworICAgICAgICAvKiBzZXQgZGMgY29lZmZpY2llbnQgb2YgY2hyb21hIGJsb2NrICovCisgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICpjaHJvbWFEYysrOworICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBjaHJvbWFRcCwgMSwqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3ViTWJQYXJ0TW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgbWFjcm9ibG9jaydzIHN1Yi1wYXJ0aXRpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHN1Yk1iVHlwZSA8IDQpOworCisgICAgcmV0dXJuKChzdWJNYlBhcnRNb2RlX2Upc3ViTWJUeXBlKTsKKworfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyYmMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSAorI2RlZmluZSBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgYSBtYiBpcyBhbiBpbnRyYSBtYiAqLworI2RlZmluZSBJU19JTlRSQV9NQihhKSAoKGEpLm1iVHlwZSA+IDUpCisKKy8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIElfUENNIG1iICovCisjZGVmaW5lIElTX0lfUENNX01CKGEpICgoYSkubWJUeXBlID09IDMxKQorCit0eXBlZGVmIGVudW0geworICAgIFBfU2tpcCAgICAgICAgICA9IDAsCisgICAgUF9MMF8xNngxNiAgICAgID0gMSwKKyAgICBQX0wwX0wwXzE2eDggICAgPSAyLAorICAgIFBfTDBfTDBfOHgxNiAgICA9IDMsCisgICAgUF84eDggICAgICAgICAgID0gNCwKKyAgICBQXzh4OHJlZjAgICAgICAgPSA1LAorICAgIElfNHg0ICAgICAgICAgICA9IDYsCisgICAgSV8xNngxNl8wXzBfMCAgID0gNywKKyAgICBJXzE2eDE2XzFfMF8wICAgPSA4LAorICAgIElfMTZ4MTZfMl8wXzAgICA9IDksCisgICAgSV8xNngxNl8zXzBfMCAgID0gMTAsCisgICAgSV8xNngxNl8wXzFfMCAgID0gMTEsCisgICAgSV8xNngxNl8xXzFfMCAgID0gMTIsCisgICAgSV8xNngxNl8yXzFfMCAgID0gMTMsCisgICAgSV8xNngxNl8zXzFfMCAgID0gMTQsCisgICAgSV8xNngxNl8wXzJfMCAgID0gMTUsCisgICAgSV8xNngxNl8xXzJfMCAgID0gMTYsCisgICAgSV8xNngxNl8yXzJfMCAgID0gMTcsCisgICAgSV8xNngxNl8zXzJfMCAgID0gMTgsCisgICAgSV8xNngxNl8wXzBfMSAgID0gMTksCisgICAgSV8xNngxNl8xXzBfMSAgID0gMjAsCisgICAgSV8xNngxNl8yXzBfMSAgID0gMjEsCisgICAgSV8xNngxNl8zXzBfMSAgID0gMjIsCisgICAgSV8xNngxNl8wXzFfMSAgID0gMjMsCisgICAgSV8xNngxNl8xXzFfMSAgID0gMjQsCisgICAgSV8xNngxNl8yXzFfMSAgID0gMjUsCisgICAgSV8xNngxNl8zXzFfMSAgID0gMjYsCisgICAgSV8xNngxNl8wXzJfMSAgID0gMjcsCisgICAgSV8xNngxNl8xXzJfMSAgID0gMjgsCisgICAgSV8xNngxNl8yXzJfMSAgID0gMjksCisgICAgSV8xNngxNl8zXzJfMSAgID0gMzAsCisgICAgSV9QQ00gICAgICAgICAgID0gMzEKK30gbWJUeXBlX2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUF9MMF84eDggPSAwLAorICAgIFBfTDBfOHg0ID0gMSwKKyAgICBQX0wwXzR4OCA9IDIsCisgICAgUF9MMF80eDQgPSAzCit9IHN1Yk1iVHlwZV9lOworCit0eXBlZGVmIGVudW0geworICAgIE1CX1BfMTZ4MTYgPSAwLAorICAgIE1CX1BfMTZ4OCwKKyAgICBNQl9QXzh4MTYsCisgICAgTUJfUF84eDgKK30gbWJQYXJ0TW9kZV9lOworCit0eXBlZGVmIGVudW0geworICAgIE1CX1NQXzh4OCA9IDAsCisgICAgTUJfU1BfOHg0LAorICAgIE1CX1NQXzR4OCwKKyAgICBNQl9TUF80eDQKK30gc3ViTWJQYXJ0TW9kZV9lOworCit0eXBlZGVmIGVudW0geworICAgIFBSRURfTU9ERV9JTlRSQTR4NCA9IDAsCisgICAgUFJFRF9NT0RFX0lOVFJBMTZ4MTYgICwKKyAgICBQUkVEX01PREVfSU5URVIKK30gbWJQYXJ0UHJlZE1vZGVfZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE12UHJlZGljdGlvbjE2eDE2IGFzc3VtZXMgdGhhdCBNVnMgYXJlIDE2Yml0cyAqLworICAgIGkxNiBob3I7CisgICAgaTE2IHZlcjsKK30gbXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJldkludHJhNHg0UHJlZE1vZGVGbGFnWzE2XTsKKyAgICB1MzIgcmVtSW50cmE0eDRQcmVkTW9kZVsxNl07CisgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGU7CisgICAgdTMyIHJlZklkeEwwWzRdOworICAgIG12X3QgbXZkTDBbNF07Cit9IG1iUHJlZF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZVs0XTsKKyAgICB1MzIgcmVmSWR4TDBbNF07CisgICAgbXZfdCBtdmRMMFs0XVs0XTsKK30gc3ViTWJQcmVkX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgIHU4IHBvc0NvZWZCdWZbMjcqMTYqM107CisgICAgdTggdG90YWxDb2VmZlsyN107CisjZWxzZQorICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKKyNlbmRpZgorICAgIGkzMiBsZXZlbFsyNl1bMTZdOworICAgIHUzMiBjb2VmZk1hcFsyNF07Cit9IHJlc2lkdWFsX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWJUeXBlX2UgbWJUeXBlOworICAgIHUzMiBjb2RlZEJsb2NrUGF0dGVybjsKKyAgICBpMzIgbWJRcERlbHRhOworICAgIG1iUHJlZF90IG1iUHJlZDsKKyAgICBzdWJNYlByZWRfdCBzdWJNYlByZWQ7CisgICAgcmVzaWR1YWxfdCByZXNpZHVhbDsKK30gbWFjcm9ibG9ja0xheWVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1iU3RvcmFnZQoreworICAgIG1iVHlwZV9lIG1iVHlwZTsKKyAgICB1MzIgc2xpY2VJZDsKKyAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7CisgICAgaTMyIGZpbHRlck9mZnNldEE7CisgICAgaTMyIGZpbHRlck9mZnNldEI7CisgICAgdTMyIHFwWTsKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggdG90YWxDb2VmZlsyN107CisjZWxzZQorICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKKyNlbmRpZgorICAgIHU4IGludHJhNHg0UHJlZE1vZGVbMTZdOworICAgIHUzMiByZWZQaWNbNF07CisgICAgdTgqIHJlZkFkZHJbNF07CisgICAgbXZfdCBtdlsxNl07CisgICAgdTMyIGRlY29kZWQ7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJBOworICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQjsKKyAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkM7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJEOworfSBtYlN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpOworCit1MzIgaDI2NGJzZE51bU1iUGFydChtYlR5cGVfZSBtYlR5cGUpOwordTMyIGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKKworc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgaW1hZ2VfdCAqY3VyckltYWdlLCBkcGJTdG9yYWdlX3QgKmRwYiwgaTMyICpxcFksIHUzMiBtYk51bSwKKyAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCB1OCogZGF0YSk7CisKK3UzMiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSk7CisKK21iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSk7CisjaWZkZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZENsZWFyTWJMYXllcihtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIHUzMiBzaXplKTsKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0ggKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NGM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVOYWxVbml0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTmFsVW5pdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwTmFsVW5pdCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IDApOworCisgICAgLyogZm9yYmlkZGVuX3plcm9fYml0IChub3QgY2hlY2tlZCB0byBiZSB6ZXJvLCBlcnJvcnMgaWdub3JlZCkgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIC8qIEFzc3VtaW5nIHRoYXQgTkFMIHVuaXQgc3RhcnRzIGZyb20gYnl0ZSBib3VuZGFyeSCtPiBkb24ndCBoYXZlIHRvIGNoZWNrCisgICAgICogZm9sbG93aW5nIDcgYml0cyBmb3IgRU5EX09GX1NUUkVBTSAqLworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICBwTmFsVW5pdC0+bmFsUmVmSWRjID0gdG1wOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPSAobmFsVW5pdFR5cGVfZSl0bXA7CisKKyAgICAvKiBkYXRhIHBhcnRpdGlvbmluZyBOQUwgdW5pdHMgbm90IHN1cHBvcnRlZCAqLworICAgIGlmICggKHRtcCA9PSAyKSB8fCAodG1wID09IDMpIHx8ICh0bXAgPT0gNCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIG5vdCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLworICAgIGlmICggKCAodG1wID09IE5BTF9TRVFfUEFSQU1fU0VUKSB8fCAodG1wID09IE5BTF9QSUNfUEFSQU1fU0VUKSB8fAorICAgICAgICAgICAodG1wID09IE5BTF9DT0RFRF9TTElDRV9JRFIpICkgJiYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLworICAgIGVsc2UgaWYgKCAoICh0bXAgPT0gTkFMX1NFSSkgfHwgKHRtcCA9PSBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSKSB8fAorICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0VORF9PRl9TRVFVRU5DRSkgfHwgKHRtcCA9PSBOQUxfRU5EX09GX1NUUkVBTSkgfHwKKyAgICAgICAgICAgICAgICAodG1wID09IE5BTF9GSUxMRVJfREFUQSkgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKSApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODk1N2JmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19OQUxfVU5JVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19OQUxfVU5JVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgTkFMIHVuaXQgcG9pbnRlZCBieSBwTmFsVW5pdCBjb250YWlucyBhbiBJRFIgc2xpY2UgKi8KKyNkZWZpbmUgSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSBcCisgICAgKChwTmFsVW5pdCktPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBOQUxfQ09ERURfU0xJQ0UgPSAxLAorICAgIE5BTF9DT0RFRF9TTElDRV9JRFIgPSA1LAorICAgIE5BTF9TRUkgPSA2LAorICAgIE5BTF9TRVFfUEFSQU1fU0VUID0gNywKKyAgICBOQUxfUElDX1BBUkFNX1NFVCA9IDgsCisgICAgTkFMX0FDQ0VTU19VTklUX0RFTElNSVRFUiA9IDksCisgICAgTkFMX0VORF9PRl9TRVFVRU5DRSA9IDEwLAorICAgIE5BTF9FTkRfT0ZfU1RSRUFNID0gMTEsCisgICAgTkFMX0ZJTExFUl9EQVRBID0gMTIsCisgICAgTkFMX01BWF9UWVBFX1ZBTFVFID0gMzEKK30gbmFsVW5pdFR5cGVfZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlOworICAgIHUzMiBuYWxSZWZJZGM7Cit9IG5hbFVuaXRfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkFMX1VOSVRfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2U1ZWVmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCisgICAgICAgICAgaDI2NGJzZEdldE5laWdoYm91ck1iCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQorICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKKyAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvbGxvd2luZyBmb3VyIHRhYmxlcyBpbmRpY2F0ZSBuZWlnaGJvdXJzIG9mIGVhY2ggYmxvY2sgb2YgYSBtYWNyb2Jsb2NrLgorICogRmlyc3QgMTYgdmFsdWVzIGFyZSBmb3IgbHVtYSBibG9ja3MsIG5leHQgNCB2YWx1ZXMgZm9yIENiIGFuZCBsYXN0IDQKKyAqIHZhbHVlcyBmb3IgQ3IuIEVsZW1lbnRzIG9mIHRoZSB0YWJsZSBpbmRpY2F0ZSB0byB3aGljaCBtYWNyb2Jsb2NrIHRoZQorICogbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgYW5kIHRoZSBpbmRleCBvZiB0aGUgbmVpZ2hib3VyIGJsb2NrIGluIHF1ZXN0aW9uLgorICogSW5kZXhpbmcgb2YgdGhlIGJsb2NrcyBnb2VzIGFzIGZvbGxvd3MKKyAqCisgKiAgICAgICAgICBZICAgICAgICAgICAgIENiICAgICAgIENyCisgKiAgICAgIDAgIDEgIDQgIDUgICAgICAxNiAxNyAgICAyMCAyMQorICogICAgICAyICAzICA2ICA3ICAgICAgMTggMTkgICAgMjIgMjMKKyAqICAgICAgOCAgOSAxMiAxMworICogICAgIDEwIDExIDE0IDE1CisgKi8KKworLyogbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfNHg0QlsyNF0gPSB7CisgICAge01CX0EsNX0sICAgIHtNQl9DVVJSLDB9LCB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sCisgICAge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sCisgICAge01CX0EsMTN9LCAgIHtNQl9DVVJSLDh9LCB7TUJfQSwxNX0sICAge01CX0NVUlIsMTB9LAorICAgIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0se01CX0NVUlIsMTF9LHtNQl9DVVJSLDE0fSwKKyAgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LHtNQl9BLDE5fSwgICB7TUJfQ1VSUiwxOH0sCisgICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSx7TUJfQSwyM30sICAge01CX0NVUlIsMjJ9IH07CisKKy8qIGFib3ZlIG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl80eDRCWzI0XSA9IHsKKyAgICB7TUJfQiwxMH0sICAge01CX0IsMTF9LCAgIHtNQl9DVVJSLDB9LCB7TUJfQ1VSUiwxfSwKKyAgICB7TUJfQiwxNH0sICAge01CX0IsMTV9LCAgIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiw1fSwKKyAgICB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSwKKyAgICB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxM30sCisgICAge01CX0IsMTh9LCAgIHtNQl9CLDE5fSwgICB7TUJfQ1VSUiwxNn0se01CX0NVUlIsMTd9LAorICAgIHtNQl9CLDIyfSwgICB7TUJfQiwyM30sICAge01CX0NVUlIsMjB9LHtNQl9DVVJSLDIxfSB9OworCisvKiBhYm92ZS1yaWdodCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0NfNHg0QlsyNF0gPSB7CisgICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX05BLDR9LAorICAgIHtNQl9CLDE1fSwgICB7TUJfQywxMH0sICAge01CX0NVUlIsNX0sIHtNQl9OQSwwfSwKKyAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMTJ9LAorICAgIHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sICAge01CX0NVUlIsMTN9LHtNQl9OQSw4fSwKKyAgICB7TUJfQiwxOX0sICAge01CX0MsMTh9LCAgIHtNQl9DVVJSLDE3fSx7TUJfTkEsMTZ9LAorICAgIHtNQl9CLDIzfSwgICB7TUJfQywyMn0sICAge01CX0NVUlIsMjF9LHtNQl9OQSwyMH0gfTsKKworLyogYWJvdmUtbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfNHg0QlsyNF0gPSB7CisgICAge01CX0QsMTV9LCAgIHtNQl9CLDEwfSwgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sCisgICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sCisgICAge01CX0EsN30sICAgIHtNQl9DVVJSLDJ9LCB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sCisgICAge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LAorICAgIHtNQl9ELDE5fSwgICB7TUJfQiwxOH0sICAge01CX0EsMTd9LCAgIHtNQl9DVVJSLDE2fSwKKyAgICB7TUJfRCwyM30sICAge01CX0IsMjJ9LCAgIHtNQl9BLDIxfSwgICB7TUJfQ1VSUiwyMH0gfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgbWFjcm9ibG9jayBuZWlnaGJvdXJzLiBGdW5jdGlvbiBzZXRzIG5laWdoYm91cgorICAgICAgICAgICAgbWFjcm9ibG9jayBwb2ludGVycyBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8KKyAgICAgICAgICAgIG1hY3JvYmxvY2tzIG9uIHRoZSBsZWZ0LCBhYm92ZSwgYWJvdmUtcmlnaHQgYW5kIGFib3ZlLWxlZnQuCisgICAgICAgICAgICBQb2ludGVycyBhcmUgc2V0IE5VTEwgaWYgdGhlIG5laWdoYm91ciBkb2VzIG5vdCBmaXQgaW50byB0aGUKKyAgICAgICAgICAgIHBpY3R1cmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcGljV2lkdGggICAgICAgIHdpZHRoIG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbm8gbmVlZCB0byBjbGFyaWZ5CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBNYlN0b3JhZ2UgICAgICBuZWlnaGJvdXIgcG9pbnRlcnMgb2YgZWFjaCBtYlN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKG1iU3RvcmFnZV90ICpwTWJTdG9yYWdlLCB1MzIgcGljV2lkdGgsCisgICAgdTMyIHBpY1NpemVJbk1icykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgcm93LCBjb2w7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWJTdG9yYWdlKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNXaWR0aCA8PSBwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVCgoKHBpY1NpemVJbk1icyAvIHBpY1dpZHRoKSAqIHBpY1dpZHRoKSA9PSBwaWNTaXplSW5NYnMpOworCisgICAgcm93ID0gY29sID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplSW5NYnM7IGkrKykKKyAgICB7CisKKyAgICAgICAgaWYgKGNvbCkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gcE1iU3RvcmFnZSArIGkgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQSA9IE5VTEw7CisKKyAgICAgICAgaWYgKHJvdykKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJCID0gcE1iU3RvcmFnZSArIGkgLSBwaWNXaWR0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBOVUxMOworCisgICAgICAgIGlmIChyb3cgJiYgKGNvbCA8IHBpY1dpZHRoIC0gMSkpCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQyA9IHBNYlN0b3JhZ2UgKyBpIC0gKHBpY1dpZHRoIC0gMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gTlVMTDsKKworICAgICAgICBpZiAocm93ICYmIGNvbCkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJEID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBOVUxMOworCisgICAgICAgIGNvbCsrOworICAgICAgICBpZiAoY29sID09IHBpY1dpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICAgICAgcm93Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2suCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSBvZiB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgbmVpZ2hib3VyIGlzIHdhbnRlZAorICAgICAgICAgICAgbmVpZ2hib3VyICAgaW5kaWNhdGVzIHdoaWNoIG5laWdoYm91ciBpcyB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBtYWNyb2Jsb2NrCisgICAgICAgICAgICBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworbWJTdG9yYWdlX3QqIGgyNjRic2RHZXROZWlnaGJvdXJNYihtYlN0b3JhZ2VfdCAqcE1iLCBuZWlnaGJvdXJNYl9lIG5laWdoYm91cikKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKChuZWlnaGJvdXIgPD0gTUJfQ1VSUikgfHwgKG5laWdoYm91ciA9PSBNQl9OQSkpOworCisgICAgaWYgKG5laWdoYm91ciA9PSBNQl9BKQorICAgICAgICByZXR1cm4ocE1iLT5tYkEpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9CKQorICAgICAgICByZXR1cm4ocE1iLT5tYkIpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DKQorICAgICAgICByZXR1cm4ocE1iLT5tYkMpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9EKQorICAgICAgICByZXR1cm4ocE1iLT5tYkQpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DVVJSKQorICAgICAgICByZXR1cm4ocE1iKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCisgICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICByZXR1cm4oTl9BXzR4NEIrYmxvY2tJbmRleCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhYm92ZSBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KKyAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IodTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0JfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlLXJpZ2h0ICBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIKKyAgICAgICAgICAgIHRvIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0ModTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0NfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlLWxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCisgICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICByZXR1cm4oTl9EXzR4NEIrYmxvY2tJbmRleCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgbmVpZ2hib3VyIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlLiBOZWlnaGJvdXIgbWFjcm9ibG9jaworICAgICAgICAgICAgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgaWYgaXQgaXMgd2l0aGluIHRoZSBwaWN0dXJlIGFuZCBiZWxvbmdzCisgICAgICAgICAgICB0byB0aGUgc2FtZSBzbGljZSBhcyB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgICAgcE5laWdoYm91ciAgcG9pbnRlciB0byB0aGUgbmVpZ2hib3VyIG1hY3JvYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUUlVFICAgIG5laWdoYm91ciBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIEZBTFNFICAgbmVpZ2hib3VyIGlzIG5vdCBhdmFpbGFibGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIGlmICggKHBOZWlnaGJvdXIgPT0gTlVMTCkgfHwgKHBNYi0+c2xpY2VJZCAhPSBwTmVpZ2hib3VyLT5zbGljZUlkKSApCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmNlMGFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX05FSUdIQk9VUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19ORUlHSEJPVVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisgICAgTUJfQSA9IDAsCisgICAgTUJfQiwKKyAgICBNQl9DLAorICAgIE1CX0QsCisgICAgTUJfQ1VSUiwKKyAgICBNQl9OQSA9IDB4RkYKK30gbmVpZ2hib3VyTWJfZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG5laWdoYm91ck1iX2UgICBtYjsKKyAgICB1OCAgICAgICAgICAgICBpbmRleDsKK30gbmVpZ2hib3VyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhtYlN0b3JhZ2VfdCAqcE1iU3RvcmFnZSwgdTMyIHBpY1dpZHRoLAorICAgIHUzMiBwaWNTaXplSW5NYnMpOworCittYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKTsKKwordTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cik7CisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIyMzM1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19vcmRlcl9jbnQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVQaWNPcmRlckNudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIGEgcGljdHVyZS4gRnVuY3Rpb24gaW1wbGVtZW50cworICAgICAgICAgICAgY29tcHV0YXRpb24gb2YgYWxsIFBPQyB0eXBlcyAoMCwgMSBhbmQgMiksIHR5cGUgaXMgb2J0YWluZWQgZnJvbQorICAgICAgICAgICAgc3BzLiBTZWUgc3RhbmRhcmQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBQT0MgdHlwZXMgYW5kIGhvdyBQT0MgaXMKKyAgICAgICAgICAgIGNvbXB1dGVkIGZvciBlYWNoIHR5cGUuCisKKyAgICAgICAgICAgIEZ1bmN0aW9uIHJldHVybnMgdGhlIG1pbmltdW0gb2YgdG9wIGZpZWxkIGFuZCBib3R0b20gZmllbGQgcGljCisgICAgICAgICAgICBvcmRlciBjb3VudHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcG9jICAgICAgICAgcG9pbnRlciB0byBwcmV2aW91cyByZXN1bHRzCisgICAgICAgICAgICBzcHMgICAgICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHNsaWNIZWFkZXIgIHBvaW50ZXIgdG8gY3VycmVudCBzbGljZSBoZWFkZXIsIGZyYW1lIG51bWJlciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHBhcmFtcyBuZWVkZWQgZm9yIFBPQyBjb21wdXRhdGlvbgorICAgICAgICAgICAgcE5hbFVuaXQgICAgcG9pbnRlciB0byBjdXJyZW50IE5BTCB1bml0IHN0cnVjdHJ1ZSwgZnVuY3Rpb24gbmVlZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGtub3cgaWYgdGhpcyBpcyBhbiBJRFIgcGljdHVyZSBhbmQgYWxzbyBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBhIHJlZmVyZW5jZSBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBvYyAgICAgICAgIHJlc3VsdHMgc3RvcmVkIGhlcmUgZm9yIGNvbXB1dGF0aW9uIG9mIG5leHQgUE9DCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaTMyIGgyNjRic2REZWNvZGVQaWNPcmRlckNudChwb2NTdG9yYWdlX3QgKnBvYywgc2VxUGFyYW1TZXRfdCAqc3BzLAorICAgIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgcGljT3JkZXJDbnQ7CisgICAgdTMyIGZyYW1lTnVtT2Zmc2V0LCBhYnNGcmFtZU51bSwgcGljT3JkZXJDbnRDeWNsZUNudDsKKyAgICB1MzIgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7CisgICAgaTMyIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlOworICAgIHUzMiBjb250YWluc01tY281OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocG9jKTsKKyAgICBBU1NFUlQoc3BzKTsKKyAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKKyAgICBBU1NFUlQocE5hbFVuaXQpOworICAgIEFTU0VSVChzcHMtPnBpY09yZGVyQ250VHlwZSA8PSAyKTsKKworI2lmIDAKKyAgICAvKiBKYW5TYTogSSBkb24ndCB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeSwgZG9uJ3Qgc2VlIGFueSByZWFzb24gdG8KKyAgICAgKiBpbmNyZW1lbnQgcHJldkZyYW1lTnVtIG9uZSBieSBvbmUgaW5zdGVhZCBvZiBvbmUgYmlnIGluY3JlbWVudC4KKyAgICAgKiBIb3dldmVyLCBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCB0aGlzIHNob3VsZCBiZSBkb25lIC0+IGlmIHNvbWVvbmUKKyAgICAgKiBmaWd1cmVzIG91dCBhbnkgY2FzZSB3aGVuIHRoZSBvdXRjb21lIHdvdWxkIGJlIGRpZmZlcmVudCBmb3Igc3RlcCBieQorICAgICAqIHN0ZXAgaW5jcmVtZW50LCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgc2hvdWxkIGJlIGVuYWJsZWQgKi8KKworICAgIC8qIGlmIHRoZXJlIHdhcyBhIGdhcCBpbiBmcmFtZSBudW1iZXJpbmcgYW5kIHBpY09yZGVyQ250VHlwZSBpcyAxIG9yIDIgLT4KKyAgICAgKiAiY29tcHV0ZSIgcGljIG9yZGVyIGNvdW50cyBmb3Igbm9uLWV4aXN0aW5nIGZyYW1lcy4gVGhlc2UgYXJlIG5vdAorICAgICAqIGFjdHVhbGx5IGNvbXB1dGVkLCBidXQgcHJvY2VzcyBuZWVkcyB0byBiZSBkb25lIHRvIHVwZGF0ZSB0aGUKKyAgICAgKiBwcmV2RnJhbWVOdW0gYW5kIHByZXZGcmFtZU51bU9mZnNldCAqLworICAgIGlmICggc3BzLT5waWNPcmRlckNudFR5cGUgPiAwICYmCisgICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9IHBvYy0+cHJldkZyYW1lTnVtICYmCisgICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9ICgocG9jLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW0pKQorICAgIHsKKworICAgICAgICAvKiB1c2UgdmFyaWFibGUgaSBmb3IgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKi8KKyAgICAgICAgaSA9IChwb2MtPnByZXZGcmFtZU51bSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisKKyAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IGk7CisKKyAgICAgICAgICAgIGkgPSAoaSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKKworICAgICAgICB9IHdoaWxlIChpICE9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pOworICAgIH0KKyNlbmRpZgorCisgICAgLyogY2hlY2sgaWYgY3VycmVudCBzbGljZSBpbmNsdWRlcyBtbWNvIGVxdWFsIHRvIDUgKi8KKyAgICBjb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOworICAgIGlmIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcuYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCisgICAgeworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCisgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24gPT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChzcHMtPnBpY09yZGVyQ250VHlwZSkKKyAgICB7CisKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogc2V0IHByZXZQaWNPcmRlckNudCB2YWx1ZXMgZm9yIElEUiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOworICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29tcHV0ZSBwaWNPcmRlckNudE1zYiAoc3RvcmVkIGluIHBpY09yZGVyQ250IHZhcmlhYmxlKSAqLworICAgICAgICAgICAgaWYgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA8IHBvYy0+cHJldlBpY09yZGVyQ250THNiKSAmJgorICAgICAgICAgICAgICAgICgocG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgLSBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiKSA+PQorICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiICsKKyAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPiBwb2MtPnByZXZQaWNPcmRlckNudExzYikgJiYKKyAgICAgICAgICAgICAgICAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgLSBwb2MtPnByZXZQaWNPcmRlckNudExzYikgPgorICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiIC0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2I7CisKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHByZXZQaWNPcmRlckNudE1zYiBpcyBmcm9tIHByZXZpb3VzCisgICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgLT4gcmVwbGFjZSBvbGQgdmFsdWUgb25seSBpZiBjdXJyZW50IGZyYW1lIGlzCisgICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjKQorICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gcGljT3JkZXJDbnQ7CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgdG9wIGZpZWxkIG9yZGVyIGNudCAoc3RvcmVkIGluIHBpY09yZGVyQ250KSAqLworICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiOworCisgICAgICAgICAgICAvKiBpZiBkZWx0YSBmb3IgYm90dG9tIGZpZWxkIGlzIG5lZ2F0aXZlIC0+IGJvdHRvbSB3aWxsIGJlIHRoZQorICAgICAgICAgICAgICogbWluaW11bSBwaWMgb3JkZXIgY291bnQgKi8KKyAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPCAwKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKKworICAgICAgICAgICAgLyogc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgcHJldlBpY09yZGVyQ250THNiIGlzIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAtPiByZXBsYWNlIG9sZCB2YWx1ZSBvbmx5IGlmIGN1cnJlbnQgZnJhbWUgaXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaWYgY3VycmVudCBmcmFtZSBjb250YWlucyBtbWNvNSAtPiBtb2RpZnkgdmFsdWVzIHRvIGJlCisgICAgICAgICAgICAgICAgICogc3RvcmVkICovCisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zTW1jbzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8qIHByZXZQaWNPcmRlckNudExzYiBzaG91bGQgYmUgdGhlIHRvcCBmaWVsZCBwaWNPcmRlckNudAorICAgICAgICAgICAgICAgICAgICAgKiBpZiBwcmV2aW91cyBmcmFtZSBpbmNsdWRlZCBtbWNvNS4gVG9wIGZpZWxkIHBpY09yZGVyQ250CisgICAgICAgICAgICAgICAgICAgICAqIGZvciBmcmFtZXMgY29udGFpbmluZyBtbWNvNSBpcyBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcGljT3JkZXJDbnQgZnJvbSBvcmlnaW5hbCB0b3AgZmllbGQgb3JkZXIgY291bnQgLT4KKyAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgaXMgemVybyBpZiB0b3AgZmllbGQgd2FzIHRoZSBtaW5pbXVtLCBpLmUuIGRlbHRhCisgICAgICAgICAgICAgICAgICAgICAqIGZvciBib3R0b20gd2FzIHBvc2l0aXZlLCBvdGhlcndpc2UgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICogLWRlbHRhUGljT3JkZXJDbnRCb3R0b20gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoLXBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMSAoaW4gdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBzdGFuZGFyZCkgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OworCisgICAgICAgICAgICAvKiBzdGVwIDIgKi8KKyAgICAgICAgICAgIGlmIChzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKKyAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IDA7CisKKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDAgJiYgYWJzRnJhbWVOdW0gPiAwKQorICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtIC09IDE7CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMyAqLworICAgICAgICAgICAgaWYgKGFic0ZyYW1lTnVtID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudEN5Y2xlQ250ID0KKyAgICAgICAgICAgICAgICAgICAgKGFic0ZyYW1lTnVtIC0gMSkvc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7CisgICAgICAgICAgICAgICAgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgPQorICAgICAgICAgICAgICAgICAgICAoYWJzRnJhbWVOdW0gLSAxKSVzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RlcCA0ICovCisgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSArPSBzcHMtPm9mZnNldEZvclJlZkZyYW1lW2ldOworCisgICAgICAgICAgICAvKiBzdGVwIDUgKHBpY09yZGVyQ250IHVzZWQgdG8gc3RvcmUgZXhwZWN0ZWRQaWNPcmRlckNudCkgKi8KKyAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQscGljT3JkZXJDbnRDeWNsZUNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCisgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlKSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgICAgIGlmIChhYnNGcmFtZU51bSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY09yZGVyQ250Q3ljbGVDbnQgKiBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworCisgICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yTm9uUmVmUGljOworCisgICAgICAgICAgICAvKiBzdGVwIDYgKHBpY09yZGVyQ250IGlzIHRvcCBmaWVsZCBvcmRlciBjbnQgaWYgZGVsdGEgZm9yIGJvdHRvbQorICAgICAgICAgICAgICogaXMgcG9zaXRpdmUsIG90aGVyd2lzZSBpdCBpcyBib3R0b20gZmllbGQgb3JkZXIgY250KSAqLworICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdOworCisgICAgICAgICAgICBpZiAoIChzcHMtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKworICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0pIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKKyAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgY29udGFpbnMgbW1jbzUgLT4gc2V0IHByZXZGcmFtZU51bU9mZnNldCBhbmQKKyAgICAgICAgICAgICAqIHByZXZGcmFtZU51bSB0byAwIGZvciBjb21wdXRhdGlvbiBvZiBwaWNPcmRlckNudCBvZiBuZXh0CisgICAgICAgICAgICAgKiBmcmFtZSwgb3RoZXJ3aXNlIHN0b3JlIGZyYW1lTnVtIGFuZCBmcmFtZU51bU9mZnNldCB0byBwb2MKKyAgICAgICAgICAgICAqIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgaWYgKCFjb250YWluc01tY281KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IDA7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAyICovCisgICAgICAgICAgICAvKiBkZXJpdmUgZnJhbWVOdW1PZmZzZXQgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OworCisgICAgICAgICAgICAvKiBkZXJpdmUgcGljT3JkZXJDbnQgKHR5cGUgMiBoYXMgc2FtZSB2YWx1ZSBmb3IgdG9wIGFuZCBib3R0b20KKyAgICAgICAgICAgICAqIGZpZWxkIG9yZGVyIGNudHMpICovCisgICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKSAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKTsKKworICAgICAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIGNvbnRhaW5zIG1tY281IC0+IHNldCBwcmV2RnJhbWVOdW1PZmZzZXQgYW5kCisgICAgICAgICAgICAgKiBwcmV2RnJhbWVOdW0gdG8gMCBmb3IgY29tcHV0YXRpb24gb2YgcGljT3JkZXJDbnQgb2YgbmV4dAorICAgICAgICAgICAgICogZnJhbWUsIG90aGVyd2lzZSBzdG9yZSBmcmFtZU51bSBhbmQgZnJhbWVOdW1PZmZzZXQgdG8gcG9jCisgICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGlmICghY29udGFpbnNNbWNvNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgLypsaW50IC1lc3ltKDY0NCxwaWNPcmRlckNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCisgICAgcmV0dXJuKHBpY09yZGVyQ250KTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTc0MWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSAorI2RlZmluZSBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBpbmZvcm1hdGlvbiBjb21wdXRlZCBmb3IgcHJldmlvdXMgcGljdHVyZSwgbmVlZGVkIGZvcgorICogUE9DIGNvbXB1dGF0aW9uIG9mIGEgcGljdHVyZS4gVHdvIGZpcnN0IGZpZWxkcyBmb3IgUE9DIHR5cGUgMCwgbGFzdCB0d28KKyAqIGZvciB0eXBlcyAxIGFuZCAyICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7CisgICAgaTMyIHByZXZQaWNPcmRlckNudE1zYjsKKyAgICB1MzIgcHJldkZyYW1lTnVtOworICAgIHUzMiBwcmV2RnJhbWVOdW1PZmZzZXQ7Cit9IHBvY1N0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBvY1N0b3JhZ2VfdCAqcG9jLCBzZXFQYXJhbVNldF90ICpzcHMsCisgICAgc2xpY2VIZWFkZXJfdCAqc2xpY2VIZWFkZXIsIG5hbFVuaXRfdCAqcE5hbFVuaXQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA0ZGVhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGxvb2t1cCB0YWJsZSBmb3IgY2VpbChsb2cyKG51bVNsaWNlR3JvdXBzKSksIGkuZS4gbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvCisgKiByZXByZXNlbnQgcmFuZ2UgWzAsIG51bVNsaWNlR3JvdXBzKQorICoKKyAqIE5PVEU6IGlmIE1BWF9OVU1fU0xJQ0VfR1JPVVBTIGlzIGhpZ2hlciB0aGFuIDggdGhpcyB0YWJsZSBoYXMgdG8gYmUgcmVzaXplZAorICogYWNjb3JkaW5nbHkgKi8KK3N0YXRpYyBjb25zdCB1MzIgQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1s4XSA9IHsxLCAxLCAyLCAyLCAzLCAzLCAzLCAzfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgorCisgICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgorICAgICAgICAgICAgICAgIC0gcnVuIGxlbmd0aHMgaWYgc2xpY2UgZ3JvdXAgbWFwIHR5cGUgaXMgMAorICAgICAgICAgICAgICAgIC0gdG9wLWxlZnQgYW5kIGJvdHRvbS1yaWdodCBhcnJheXMgaWYgbWFwIHR5cGUgaXMgMgorICAgICAgICAgICAgICAgIC0gZm9yIHNsaWNlIGdyb3VwIGlkcyBpZiBtYXAgdHlwZSBpcyA2CisKKyAgICAgICAgICAgIFZhbGlkaXR5IG9mIHNvbWUgb2YgdGhlIHNsaWNlIGdyb3VwIG1hcHBpbmcgaW5mb3JtYXRpb24gZGVwZW5kcworICAgICAgICAgICAgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgd2hpY2ggYXJlIG5vdCBrbm93biBoZXJlLiBUaGVyZWZvcmUgdGhlCisgICAgICAgICAgICB2YWxpZGl0eSBoYXMgdG8gYmUgY2hlY2tlZCBhZnRlcndhcmRzLCBjdXJyZW50bHkgaW4gdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgc2V0IGFjdGl2YXRpb24gcGhhc2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOworCisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFBpY1BhcmFtU2V0LCAwLCBzaXplb2YocGljUGFyYW1TZXRfdCkpOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcsIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBFUFJJTlQoImVudHJvcHlfY29kaW5nX21vZGVfZmxhZyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAvKiBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPSB2YWx1ZSArIDE7CisgICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiBNQVhfTlVNX1NMSUNFX0dST1VQUykKKyAgICB7CisgICAgICAgIEVQUklOVCgibnVtX3NsaWNlX2dyb3Vwc19taW51czEiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGRlY29kZSBzbGljZSBncm91cCBtYXBwaW5nIGluZm9ybWF0aW9uIGlmIG1vcmUgdGhhbiBvbmUgc2xpY2UgZ3JvdXBzICovCisgICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPiA2KQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX21hcF90eXBlIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aCwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLCB1MzIpOworICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ydW5MZW5ndGhbaV0gPSB2YWx1ZSsxOworICAgICAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlcyBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+dG9wTGVmdCwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMSwgdTMyKTsKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHQsCisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDEsIHUzMik7CisgICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT50b3BMZWZ0ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+dG9wTGVmdFtpXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHRbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZXMgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDMpIHx8CisgICAgICAgICAgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA0KSB8fAorICAgICAgICAgICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNSkgKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgPQorICAgICAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUgPSB2YWx1ZSArIDE7CisgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZSBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMgPSB2YWx1ZSArIDE7CisKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkLAorICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMsIHUzMik7CisgICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCByYW5nZQorICAgICAgICAgICAgICogWzAsIG51bVNsaWNlR3JvdXBzKSAqLworICAgICAgICAgICAgdG1wID0gQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1twUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLTFdOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkW2ldID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0bXApOworICAgICAgICAgICAgICAgIGlmICggcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWRbaV0gPj0KKyAgICAgICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9pZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+IDMxKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZSA9IHZhbHVlICsgMTsKKworICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAodmFsdWUgPiAzMSkKKyAgICB7CisgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogd2VpZ2h0ZWRfcHJlZF9mbGFnLCB0aGlzIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBFUFJJTlQoIndlaWdodGVkX3ByZWRfZmxhZyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogd2VpZ2h0ZWRfYmlwcmVkX2lkYyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7CisgICAgaWYgKHRtcCA+IDIpCisgICAgeworICAgICAgICBFUFJJTlQoIndlaWdodGVkX2JpcHJlZF9pZGMiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAoKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfaW5pdF9xcF9taW51czI2Iik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFBpY1BhcmFtU2V0LT5waWNJbml0UXAgPSAodTMyKShpdG1wICsgMjYpOworCisgICAgLyogcGljX2luaXRfcXNfbWludXMyNiAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICgoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19pbml0X3FzX21pbnVzMjYiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICgoaXRtcCA8IC0xMikgfHwgKGl0bXAgPiAxMikpCisgICAgeworICAgICAgICBFUFJJTlQoImNocm9tYV9xcF9pbmRleF9vZmZzZXQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICBwUGljUGFyYW1TZXQtPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBpdG1wOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGljUGFyYW1TZXQtPmRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBQaWNQYXJhbVNldC0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOworCisgICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzMjg2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgUFBTIGluZm9ybWF0aW9uIGRlY29kZWQgZnJvbSB0aGUgc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwaWNQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7CisgICAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWc7CisgICAgdTMyIG51bVNsaWNlR3JvdXBzOworICAgIHUzMiBzbGljZUdyb3VwTWFwVHlwZTsKKyAgICB1MzIgKnJ1bkxlbmd0aDsKKyAgICB1MzIgKnRvcExlZnQ7CisgICAgdTMyICpib3R0b21SaWdodDsKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgIHUzMiBwaWNTaXplSW5NYXBVbml0czsKKyAgICB1MzIgKnNsaWNlR3JvdXBJZDsKKyAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7CisgICAgdTMyIHBpY0luaXRRcDsKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKKyAgICB1MzIgZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZzsKKyAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnOworICAgIHUzMiByZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZzsKK30gcGljUGFyYW1TZXRfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTQ4Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKQEAgLTAsMCArMSwyMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisjaWZkZWYgSDI2NERFQ19PTVhETAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKKyAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDEgLWU3MDIgKi8KKworLyogTHVtYSBmcmFjdGlvbmFsLXNhbXBsZSBwb3NpdGlvbnMKKyAqCisgKiAgRyBhIGIgYyBICisgKiAgZCBlIGYgZworICogIGggaSBqIGsgbQorICogIG4gcCBxIHIKKyAqICBNICAgcyAgIE4KKyAqCisgKiAgRywgSCwgTSBhbmQgTiBhcmUgaW50ZWdlciBzYW1wbGUgcG9zaXRpb25zCisgKiAgYS1zIGFyZSBmcmFjdGlvbmFsIHNhbXBsZXMgdGhhdCBuZWVkIHRvIGJlIGludGVycG9sYXRlZC4KKyAqLworI2lmbmRlZiBIMjY0REVDX09NWERMCitzdGF0aWMgY29uc3QgdTMyIGx1bWFGcmFjUG9zWzRdWzRdID0geworICAvKiBHICBkICBoICBuICAgIGEgIGUgIGkgIHAgICAgYiAgZiAgaiAgIHEgICAgIGMgICBnICAgayAgIHIgKi8KKyAgICB7MCwgMSwgMiwgM30sIHs0LCA1LCA2LCA3fSwgezgsIDksIDEwLCAxMX0sIHsxMiwgMTMsIDE0LCAxNX19OworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyogY2xpcHBpbmcgdGFibGUsIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KK2V4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4KKyAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCisgICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bworICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwUmVmICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBDYiB0b3AtbGVmdCBjb3JuZXIKKyAgICAgICAgICB4MCAgICAgICAgICAgICAgICBpbnRlZ2VyIHgtY29vcmRpbmF0ZSBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHkwICAgICAgICAgICAgICAgIGludGVnZXIgeS1jb29yZGluYXRlIGZvciBwcmVkaWN0aW9uCisgICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKKyAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKKyAgICAgICAgICB4RnJhYyAgICAgICAgICAgICBob3Jpem9udGFsIGZyYWN0aW9uIGZvciBwcmVkaWN0aW9uIGluIDEvOCBwaXhlbHMKKyAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggICB3aWR0aCBvZiB0aGUgcHJlZGljdGVkIHBhcnQgaW4gcGl4ZWxzCisgICAgICAgICAgY2hyb21hUGFydEhlaWdodCAgaGVpZ2h0IG9mIHRoZSBwcmVkaWN0ZWQgcGFydCBpbiBwaXhlbHMKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBwcmVkUGFydENocm9tYSAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19BUk0xMQordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCisgIHU4ICpwUmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIGMsIHZhbDsKKyAgICB1OCAqcHRyQSwgKmNicjsKKyAgICB1MzIgY29tcDsKKyAgICB1OCBibG9ja1s5KjgqMl07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOworICAgIEFTU0VSVCh4RnJhYyA8IDgpOworICAgIEFTU0VSVChwUmVmKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCArIDEsIGNocm9tYVBhcnRIZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEpOworICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSpjaHJvbWFQYXJ0SGVpZ2h0LAorICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxLAorICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSk7CisKKyAgICAgICAgcFJlZiA9IGJsb2NrOworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGgrMTsKKyAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodDsKKyAgICB9CisKKyAgICB2YWwgPSA4IC0geEZyYWM7CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgcHRyQSA9IHBSZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKKyAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7CisKKyAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgICAgICAgKiBiaWxpbmVhciBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDEgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wNCA9ICpwdHJBKys7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHhGcmFjICogdG1wMykgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB4RnJhYyAqIHRtcDQpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKKyAgICAgICAgICAgICAgICB0bXAxID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwdHJBOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDMgKyB4RnJhYyAqIHRtcDEpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXA0ICsgeEZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIHZlcnRpY2FsIGRpcmVjdGlvbi4KKyAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCisgICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bworICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAorICB1OCAqcFJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeUZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCBjLCB2YWw7CisgICAgdTggKnB0ckEsICpjYnI7CisgICAgdTMyIGNvbXA7CisgICAgdTggYmxvY2tbOSo4KjJdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICBBU1NFUlQoeUZyYWMgPCA4KTsKKyAgICBBU1NFUlQocFJlZik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQrMSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGgpOworICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgY2hyb21hUGFydFdpZHRoKihjaHJvbWFQYXJ0SGVpZ2h0KzEpLAorICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsCisgICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoKTsKKworICAgICAgICBwUmVmID0gYmxvY2s7CisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodCsxOworICAgIH0KKworICAgIHZhbCA9IDggLSB5RnJhYzsKKworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQorICAgIHsKKworICAgICAgICBwdHJBID0gcFJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOworICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKKworICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOworICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGFuZAorICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbi4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAorICB1OCAqcmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCkKK3sKKyAgICB1OCBibG9ja1s5KjkqMl07CisgICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHZhbFgsIHZhbFksIHBsdXMzMiA9IDMyOworICAgIHUzMiBjb21wOworICAgIHU4ICpwdHJBLCAqY2JyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICBBU1NFUlQoeEZyYWMgPCA4KTsKKyAgICBBU1NFUlQoeUZyYWMgPCA4KTsKKyAgICBBU1NFUlQocmVmKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0KzEgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggKyAxLCBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoICsgMSk7CisgICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSooY2hyb21hUGFydEhlaWdodCsxKSwKKyAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSwKKyAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKKworICAgICAgICByZWYgPSBibG9jazsKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoKzE7CisgICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQrMTsKKyAgICB9CisKKyAgICB2YWxYID0gOCAtIHhGcmFjOworICAgIHZhbFkgPSA4IC0geUZyYWM7CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgcHRyQSA9IHJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOworICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKKworICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9ICpwdHJBOworICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgdG1wNSA9IHB0ckFbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAxICo9IHZhbFk7CisgICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKKyAgICAgICAgICAgIHRtcDMgKj0gdmFsWTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNSAqIHlGcmFjOworICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDIgPSAqKytwdHJBOworICAgICAgICAgICAgICAgIHRtcDQgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXA2ID0gcHRyQVt3aWR0aCoyXTsKKyAgICAgICAgICAgICAgICB0bXAyICo9IHZhbFk7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA0ICogeUZyYWM7CisgICAgICAgICAgICAgICAgdG1wNCAqPSB2YWxZOworICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wNiAqIHlGcmFjOworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAxICogdmFsWCArIHBsdXMzMjsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wMyAqIHZhbFggKyBwbHVzMzI7CisgICAgICAgICAgICAgICAgdG1wMSArPSB0bXAyICogeEZyYWM7CisgICAgICAgICAgICAgICAgdG1wMSA+Pj0gNjsKKyAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDQgKiB4RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAzID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCl0bXAzOworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCl0bXAxOworCisgICAgICAgICAgICAgICAgdG1wMSA9ICorK3B0ckE7CisgICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDUgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDEgKj0gdmFsWTsKKyAgICAgICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAzICo9IHZhbFk7CisgICAgICAgICAgICAgICAgdG1wMyArPSB0bXA1ICogeUZyYWM7CisgICAgICAgICAgICAgICAgdG1wMiA9IHRtcDIgKiB2YWxYICsgcGx1czMyOworICAgICAgICAgICAgICAgIHRtcDQgPSB0bXA0ICogdmFsWCArIHBsdXMzMjsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDEgKiB4RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAyID4+PSA2OworICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMyAqIHhGcmFjOworICAgICAgICAgICAgICAgIHRtcDQgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KXRtcDQ7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KXRtcDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJlZGljdENocm9tYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVG9wIGxldmVsIGNocm9tYSBwcmVkaWN0aW9uIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gVGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIFByZWRpY3RDaHJvbWEoCisgIHU4ICptYlBhcnRDaHJvbWEsCisgIHUzMiB4QUwsCisgIHUzMiB5QUwsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4RnJhYywgeUZyYWMsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodDsKKyAgICBpMzIgeEludCwgeUludDsKKyAgICB1OCAqcmVmOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobXYpOworICAgIEFTU0VSVChyZWZQaWMpOworICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOworICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKKyAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOworCisgICAgd2lkdGggID0gOCAqIHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gOCAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgeEludCA9ICh4QUwgPj4gMSkgKyAobXYtPmhvciA+PiAzKTsKKyAgICB5SW50ID0gKHlBTCA+PiAxKSArIChtdi0+dmVyID4+IDMpOworICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKKyAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7CisKKyAgICBjaHJvbWFQYXJ0V2lkdGggID0gcGFydFdpZHRoID4+IDE7CisgICAgY2hyb21hUGFydEhlaWdodCA9IHBhcnRIZWlnaHQgPj4gMTsKKyAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICBpZiAoeEZyYWMgJiYgeUZyYWMpCisgICAgeworICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgeEZyYWMsIHlGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOworICAgIH0KKyAgICBlbHNlIGlmICh4RnJhYykKKyAgICB7CisgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCB4RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoeUZyYWMpCisgICAgeworICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgeUZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOworICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEgKyA4KjgsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOworICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdoJworICAgICAgICAgIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKKyAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAorICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfQVJNMTEKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCkKK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgaSwgajsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB1OCAqcHRyQywgKnB0clY7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoOworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgcHRyQyA9IHJlZiArIHdpZHRoOworICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKKworICAgIC8qIDQgcGl4ZWxzIHBlciBpdGVyYXRpb24sIGludGVycG9sYXRlIHVzaW5nIDUgdmVydGljYWwgc2FtcGxlcyAqLworICAgIGZvciAoaSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyBpOyBpLS0pCisgICAgeworICAgICAgICAvKiBoMSA9ICgxNiArIEEgKyAxNihHK00pICsgNChHK00pIC0gNChDK1IpIC0gKEMrUikgKyBUKSA+PiA1ICovCisgICAgICAgIGZvciAoaiA9IHBhcnRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+NV07CisgICAgICAgICAgICB0bXAxICs9IDE2OworICAgICAgICAgICAgbWJbNDhdID0gKHU4KXRtcDI7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+NV07CisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgbWJbMzJdID0gKHU4KXRtcDE7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDY7CisKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OworICAgICAgICAgICAgcHRyQysrOworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnZCcKKyAgICAgICAgICBvciAnbicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQorICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0CisgICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBkLCAxIGZvciBwaXhlbCBuICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIGksIGo7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdTggKnB0ckMsICpwdHJWLCAqcHRySW50OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7CisKKyAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgTSBvciBSICovCisgICAgcHRySW50ID0gcHRyQyArICgyK3Zlck9mZnNldCkqd2lkdGg7CisKKyAgICAvKiA0IHBpeGVscyBwZXIgaXRlcmF0aW9uCisgICAgICogaW50ZXJwb2xhdGUgdXNpbmcgNSB2ZXJ0aWNhbCBzYW1wbGVzIGFuZCBhdmVyYWdlIGJldHdlZW4KKyAgICAgKiBpbnRlcnBvbGF0ZWQgdmFsdWUgYW5kIGludGVnZXIgc2FtcGxlIHZhbHVlICovCisgICAgZm9yIChpID0gKHBhcnRIZWlnaHQgPj4gMik7IGk7IGktLSkKKyAgICB7CisgICAgICAgIC8qIGgxID0gKDE2ICsgQSArIDE2KEcrTSkgKyA0KEcrTSkgLSA0KEMrUikgLSAoQytSKSArIFQpID4+IDUgKi8KKyAgICAgICAgZm9yIChqID0gcGFydFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj41XTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAxICs9IDE2OworICAgICAgICAgICAgdG1wMisrOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjVdOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFt3aWR0aF07CisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wMSsrOworICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wMSArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQ7CisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNisrOworICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFstKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXA1Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgICAgIHB0ckludCsrOworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBwdHJJbnQgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnYicKKyAgICAgICAgICBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTggKnB0cko7CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKyAgICBBU1NFUlQoKHBhcnRXaWR0aCYweDMpID09IDApOworICAgIEFTU0VSVCgocGFydEhlaWdodCYweDMpID09IDApOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA0ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wMyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdhJworICAgICAgICAgIG9yICdjJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JPZmZzZXQpIC8qIDAgZm9yIHBpeGVsIGEsIDEgZm9yIHBpeGVsIGMgKi8KK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1OCAqcHRySjsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQorICAgICAgICAgICAgICAgIHRtcDYgKz0gdG1wNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXA2ICs9IHRtcDM7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDYgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgdG1wNCArPSAxNjsKKyAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQorICAgICAgICAgICAgICAgIHRtcDUgKz0gdG1wMzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXA1ICs9IHRtcDI7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07CisgICAgICAgICAgICB0bXAzICs9IDE2OworICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCisgICAgICAgICAgICAgICAgdG1wNCArPSB0bXAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMTsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNCArIDEpID4+IDEpOworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07CisgICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKKyAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG1wMyArPSB0bXA2OworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgMSkgPj4gMSk7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCisgICAgICAgICAgcG9zaXRpb24gJ2UnLCAnZycsICdwJyBvciAncicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seQorICAgICAgICAgIGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQKKyAgICAgICAgICB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yVmVyT2Zmc2V0KSAvKiAwIGZvciBwaXhlbCBlLCAxIGZvciBwaXhlbCBnLAorICAgICAgICAgICAgICAgICAgICAgICAyIGZvciBwaXhlbCBwLCAzIGZvciBwaXhlbCByICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTggKnB0ckMsICpwdHJKLCAqcHRyVjsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKKyAgICB9CisKKyAgICAvKiBSZWYgcG9pbnRzIHRvIEcgKyAoLTIsIC0yKSAqLworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgLyogcHRySiBwb2ludHMgdG8gZWl0aGVyIEogb3IgUSwgZGVwZW5kaW5nIG9uIHZlcnRpY2FsIG9mZnNldCAqLworICAgIHB0ckogPSByZWYgKyAoKChob3JWZXJPZmZzZXQgJiAweDIpID4+IDEpICsgMikgKiB3aWR0aCArIDU7CisKKyAgICAvKiBwdHJDIHBvaW50cyB0byBlaXRoZXIgQyBvciBELCBkZXBlbmRpbmcgb24gaG9yaXpvbnRhbCBvZmZzZXQgKi8KKyAgICBwdHJDID0gcmVmICsgd2lkdGggKyAyICsgKGhvclZlck9mZnNldCAmIDB4MSk7CisKKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKworICAgICAgICAvKiBIb3Jpem9udGFsIGludGVycG9sYXRpb24sIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA0ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wMyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOworICAgIH0KKworICAgIG1iIC09IDE2KnBhcnRIZWlnaHQ7CisgICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOworCisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIC8qIFZlcnRpY2FsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2luZywgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj41XTsKKyAgICAgICAgICAgIHRtcDIgPSBtYls0OF07CisgICAgICAgICAgICB0bXAxICs9IDE2OworICAgICAgICAgICAgdG1wNysrOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDE+PjVdOworICAgICAgICAgICAgdG1wMSA9IG1iWzMyXTsKKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICB0bXA3Kys7CisgICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXAxICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICB0bXA2ID0gbWJbMTZdOworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIHRtcDcrKzsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIHRtcDUgPSAqbWI7CisgICAgICAgICAgICB0bXA3Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIHB0ckMrKzsKKworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCisgICAgICAgICAgcG9zaXRpb24gJ2onIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgorICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKKyAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCkKK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBpMzIgKnB0ckMsICpwdHJWLCAqYjE7CisgICAgdTggICpwdHJKOworICAgIGkzMiB0YWJsZVsyMSoxNl07CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBiMSA9IHRhYmxlOworICAgIHB0ckogPSByZWYgKyA1OworCisgICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCisgICAgICogaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCisgICAgZm9yICh5ID0gcGFydEhlaWdodCArIDU7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgKmIxKysgPSB0bXA2OworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNDsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICAqYjErKyA9IHRtcDM7CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICBwdHJDID0gdGFibGUgKyBwYXJ0V2lkdGg7CisgICAgcHRyViA9IHB0ckMgKyA1KnBhcnRXaWR0aDsKKyAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgLyogNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVltwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj4xMF07CisgICAgICAgICAgICB0bXAxICs9IDUxMjsKKyAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCl0bXA3OworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAxPj4xMF07CisgICAgICAgICAgICB0bXA2ICs9IDUxMjsKKyAgICAgICAgICAgIG1iWzMyXSA9ICh1OCl0bXA3OworCisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDY+PjEwXTsKKyAgICAgICAgICAgIHRtcDUgKz0gNTEyOworICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDc7CisKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDU+PjEwXTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDc7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgIH0KKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyQyArPSAzKnBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSAzKnBhcnRXaWR0aDsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAorICAgICAgICAgIHBvc2l0aW9uICdmJyBvciAncScgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCisgICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAorICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBmLCAxIGZvciBwaXhlbCBxICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaTMyICpwdHJDLCAqcHRyViwgKnB0ckludCwgKmIxOworICAgIHU4ICAqcHRySjsKKyAgICBpMzIgdGFibGVbMjEqMTZdOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgYjEgPSB0YWJsZTsKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgorICAgICAqIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQgKyA1OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICAqYjErKyA9IHRtcDY7CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgKmIxKysgPSB0bXA1OworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgKmIxKysgPSB0bXA0OworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgICpiMSsrID0gdG1wMzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOworICAgIH0KKworICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnZSAqLworICAgIHB0ckMgPSB0YWJsZSArIHBhcnRXaWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqcGFydFdpZHRoOworICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBNIG9yIFIgKi8KKyAgICBwdHJJbnQgPSBwdHJDICsgKDIrdmVyT2Zmc2V0KSpwYXJ0V2lkdGg7CisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMilwYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMilwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wMiArPSA1MTI7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1twYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj4xMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKKyAgICAgICAgICAgIHRtcDEgKz0gNTEyOworICAgICAgICAgICAgdG1wMisrOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wNyArIHRtcDIpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFtwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj4xMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKKyAgICAgICAgICAgIHRtcDYgKz0gNTEyOworICAgICAgICAgICAgdG1wMSsrOworICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wNyArIHRtcDEpID4+IDEpOworCisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludDsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+MTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07CisgICAgICAgICAgICB0bXA1ICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDYrKzsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDcgKyB0bXA2KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+MTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07CisgICAgICAgICAgICB0bXA1Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDcgKyB0bXA1KSA+PiAxKTsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgICAgIHB0ckludCsrOworICAgICAgICB9CisgICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0ckMgKz0gMypwYXJ0V2lkdGg7CisgICAgICAgIHB0clYgKz0gMypwYXJ0V2lkdGg7CisgICAgICAgIHB0ckludCArPSAzKnBhcnRXaWR0aDsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAorICAgICAgICAgIHBvc2l0aW9uICdpJyBvciAnaycgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCisgICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAorICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBpLCAxIGZvciBwaXhlbCBrICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaTMyICpwdHJKLCAqcHRySW50LCAqaDE7CisgICAgdTggICpwdHJDLCAqcHRyVjsKKyAgICBpMzIgdGFibGVbMjEqMTZdOworICAgIGkzMiB0YWJsZVdpZHRoID0gKGkzMilwYXJ0V2lkdGgrNTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIGgxID0gdGFibGUgKyB0YWJsZVdpZHRoOworICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7CisKKyAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKKyAgICAgKiB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9ICh1MzIpdGFibGVXaWR0aDsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgaDFbdGFibGVXaWR0aCoyXSA9IHRtcDI7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIGgxW3RhYmxlV2lkdGhdID0gdG1wMTsKKworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgKmgxID0gdG1wNjsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgaDFbLXRhYmxlV2lkdGhdID0gdG1wNTsKKyAgICAgICAgICAgIGgxKys7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgIH0KKyAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKKyAgICAgICAgaDEgKz0gMyp0YWJsZVdpZHRoOworICAgIH0KKworICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdlICovCisgICAgcHRySiA9IHRhYmxlICsgNTsKKyAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgRyBvciBIICovCisgICAgcHRySW50ID0gdGFibGUgKyAyICsgaG9yT2Zmc2V0OworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoPj4yKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNiArPSA1MTI7CisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDYgPj4gMTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKKyAgICAgICAgICAgIHRtcDUgKz0gNTEyOworICAgICAgICAgICAgdG1wNisrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNSA+PiAxMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOworICAgICAgICAgICAgdG1wNCArPSA1MTI7CisgICAgICAgICAgICB0bXA1Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQgPj4gMTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKKyAgICAgICAgICAgIHRtcDMgKz0gNTEyOworICAgICAgICAgICAgdG1wNCsrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA0ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyA+PiAxMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOworICAgICAgICAgICAgdG1wMysrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSA1OworICAgICAgICBwdHJJbnQgKz0gNTsKKyAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KKyAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCisgICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0CisgICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKKyAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgorICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgeEEsCisgIHUzMiB5QSwKKyAgdTMyIHBhcnRYLAorICB1MzIgcGFydFksCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KQorCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHhGcmFjLCB5RnJhYywgd2lkdGgsIGhlaWdodDsKKyAgICBpMzIgeEludCwgeUludDsKKyAgICB1OCAqbHVtYVBhcnREYXRhOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKG12KTsKKyAgICBBU1NFUlQocGFydFdpZHRoKTsKKyAgICBBU1NFUlQocGFydEhlaWdodCk7CisgICAgQVNTRVJUKHJlZlBpYyk7CisgICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7CisgICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOworICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7CisKKyAgICAvKiBsdW1hICovCisgICAgbHVtYVBhcnREYXRhID0gZGF0YSArIDE2KnBhcnRZICsgcGFydFg7CisKKyAgICB4RnJhYyA9IG12LT5ob3IgJiAweDM7CisgICAgeUZyYWMgPSBtdi0+dmVyICYgMHgzOworCisgICAgd2lkdGggPSAxNiAqIHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gMTYgKiByZWZQaWMtPmhlaWdodDsKKworICAgIHhJbnQgPSAoaTMyKXhBICsgKGkzMilwYXJ0WCArIChtdi0+aG9yID4+IDIpOworICAgIHlJbnQgPSAoaTMyKXlBICsgKGkzMilwYXJ0WSArIChtdi0+dmVyID4+IDIpOworCisgICAgQVNTRVJUKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10gPCAxNik7CisKKyAgICBzd2l0Y2ggKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10pCisgICAgeworICAgICAgICBjYXNlIDA6IC8qIEcgKi8KKyAgICAgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQseUludCx3aWR0aCxoZWlnaHQscGFydFdpZHRoLHBhcnRIZWlnaHQsMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogZCAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogaCAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLyogbiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogLyogYSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTogLyogZSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAvKiBpICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8qIHAgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODogLyogYiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOTogLyogZiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLyogaiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTogLyogcSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjogLyogYyAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8qIGcgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6IC8qIGsgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMTUsIHIgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2hyb21hICovCisgICAgUHJlZGljdENocm9tYSgKKyAgICAgIGRhdGEgKyAxNioxNiArIChwYXJ0WT4+MSkqOCArIChwYXJ0WD4+MSksCisgICAgICB4QSArIHBhcnRYLAorICAgICAgeUEgKyBwYXJ0WSwKKyAgICAgIHBhcnRXaWR0aCwKKyAgICAgIHBhcnRIZWlnaHQsCisgICAgICBtdiwKKyAgICAgIHJlZlBpYyk7CisKK30KKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KKyAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCisgICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0CisgICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKKyAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgorICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC1lezU1MH0gU3ltYm9sICdyZXMnIG5vdCBhY2Nlc3NlZCAqLwordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgY29sQW5kUm93LAorICB1MzIgcGFydCwKKyAgdTggKnBGaWxsKQorCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHhGcmFjLCB5RnJhYzsKKyAgICB1MzIgd2lkdGgsIGhlaWdodDsKKyAgICBpMzIgeEludCwgeUludCwgeDAsIHkwOworICAgIHU4ICpwYXJ0RGF0YSwgKnJlZjsKKyAgICBPTVhTaXplIHJvaTsKKyAgICB1MzIgZmlsbFdpZHRoOworICAgIHUzMiBmaWxsSGVpZ2h0OworICAgIE9NWFJlc3VsdCByZXM7CisgICAgdTMyIHhBLCB5QTsKKyAgICB1MzIgcGFydFgsIHBhcnRZOworICAgIHUzMiBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobXYpOworICAgIEFTU0VSVChyZWZQaWMpOworICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOworICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKKyAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOworCisgICAgeEEgPSAoY29sQW5kUm93ICYgMHhGRkZGMDAwMCkgPj4gMTY7CisgICAgeUEgPSAoY29sQW5kUm93ICYgMHgwMDAwRkZGRik7CisKKyAgICBwYXJ0WCA9IChwYXJ0ICYgMHhGRjAwMDAwMCkgPj4gMjQ7CisgICAgcGFydFkgPSAocGFydCAmIDB4MDBGRjAwMDApID4+IDE2OworICAgIHBhcnRXaWR0aCA9IChwYXJ0ICYgMHgwMDAwRkYwMCkgPj4gODsKKyAgICBwYXJ0SGVpZ2h0ID0gKHBhcnQgJiAweDAwMDAwMEZGKTsKKworICAgIEFTU0VSVChwYXJ0V2lkdGgpOworICAgIEFTU0VSVChwYXJ0SGVpZ2h0KTsKKworICAgIC8qIGx1bWEgKi8KKyAgICBwYXJ0RGF0YSA9IGRhdGEgKyAxNipwYXJ0WSArIHBhcnRYOworCisgICAgeEZyYWMgPSBtdi0+aG9yICYgMHgzOworICAgIHlGcmFjID0gbXYtPnZlciAmIDB4MzsKKworICAgIHdpZHRoID0gMTYgKiByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IDE2ICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICB4SW50ID0gKGkzMil4QSArIChpMzIpcGFydFggKyAobXYtPmhvciA+PiAyKTsKKyAgICB5SW50ID0gKGkzMil5QSArIChpMzIpcGFydFkgKyAobXYtPnZlciA+PiAyKTsKKworICAgIHgwID0gKHhGcmFjKSA/IHhJbnQtMiA6IHhJbnQ7CisgICAgeTAgPSAoeUZyYWMpID8geUludC0yIDogeUludDsKKworICAgIGlmICh4RnJhYykKKyAgICB7CisgICAgICAgIGlmIChwYXJ0V2lkdGggPT0gMTYpCisgICAgICAgICAgICBmaWxsV2lkdGggPSAzMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmlsbFdpZHRoID0gMTY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZmlsbFdpZHRoID0gKHBhcnRXaWR0aCoyKTsKKyAgICBpZiAoeUZyYWMpCisgICAgICAgIGZpbGxIZWlnaHQgPSBwYXJ0SGVpZ2h0KzU7CisgICAgZWxzZQorICAgICAgICBmaWxsSGVpZ2h0ID0gcGFydEhlaWdodDsKKworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2ZpbGxXaWR0aCA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtmaWxsSGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCAodTgqKXBGaWxsLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgZmlsbFdpZHRoLCBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSBwRmlsbDsKKyAgICAgICAgd2lkdGggPSBmaWxsV2lkdGg7CisgICAgICAgIGlmICh5RnJhYykKKyAgICAgICAgICAgIHJlZiArPSAyKndpZHRoOworICAgICAgICBpZiAoeEZyYWMpCisgICAgICAgICAgICByZWYgKz0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLworICAgICAgICByZWYgPSByZWZQaWMtPmRhdGEgKyB5SW50KndpZHRoICsgeEludDsKKyAgICB9CisgICAgLyogTHVtYSBpbnRlcnBvbGF0aW9uICovCisgICAgcm9pLndpZHRoID0gKGkzMilwYXJ0V2lkdGg7CisgICAgcm9pLmhlaWdodCA9IChpMzIpcGFydEhlaWdodDsKKworICAgIHJlcyA9IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hKHJlZiwgKGkzMil3aWR0aCwgcGFydERhdGEsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpeEZyYWMsIChpMzIpeUZyYWMsIHJvaSk7CisgICAgQVNTRVJUKHJlcyA9PSAwKTsKKworICAgIC8qIENocm9tYSAqLworICAgIHdpZHRoICA9IDggKiByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IDggKiByZWZQaWMtPmhlaWdodDsKKworICAgIHgwID0gKCh4QSArIHBhcnRYKSA+PiAxKSArIChtdi0+aG9yID4+IDMpOworICAgIHkwID0gKCh5QSArIHBhcnRZKSA+PiAxKSArIChtdi0+dmVyID4+IDMpOworICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKKyAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7CisKKyAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICByb2kud2lkdGggPSAoaTMyKShwYXJ0V2lkdGggPj4gMSk7CisgICAgZmlsbFdpZHRoID0gKChwYXJ0V2lkdGggPj4gMSkgKyA4KSAmIH4weDc7CisgICAgcm9pLmhlaWdodCA9IChpMzIpKHBhcnRIZWlnaHQgPj4gMSk7CisgICAgZmlsbEhlaWdodCA9IChwYXJ0SGVpZ2h0ID4+IDEpICsgMTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtmaWxsV2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArZmlsbEhlaWdodCA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGZpbGxXaWR0aCwgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKKyAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwgKyBmaWxsV2lkdGgqZmlsbEhlaWdodCwKKyAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgZmlsbFdpZHRoLAorICAgICAgICAgICAgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKKworICAgICAgICByZWYgPSBwRmlsbDsKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHdpZHRoID0gZmlsbFdpZHRoOworICAgICAgICBoZWlnaHQgPSBmaWxsSGVpZ2h0OworICAgIH0KKworICAgIHBhcnREYXRhID0gZGF0YSArIDE2KjE2ICsgKHBhcnRZPj4xKSo4ICsgKHBhcnRYPj4xKTsKKworICAgIC8qIENocm9tYSBpbnRlcnBvbGF0aW9uICovCisgICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLworICAgIHJlZiArPSB5MCAqIHdpZHRoICsgeDA7CisgICAgcmVzID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEocmVmLCB3aWR0aCwgcGFydERhdGEsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMilyb2kud2lkdGgsICh1MzIpcm9pLmhlaWdodCwgeEZyYWMsIHlGcmFjKTsKKyAgICBBU1NFUlQocmVzID09IDApOworICAgIHBhcnREYXRhICs9IDggKiA4OworICAgIHJlZiArPSBoZWlnaHQgKiB3aWR0aDsKKyAgICByZXMgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYShyZWYsIHdpZHRoLCBwYXJ0RGF0YSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJvaS53aWR0aCwgKHUzMilyb2kuaGVpZ2h0LCB4RnJhYywgeUZyYWMpOworICAgIEFTU0VSVChyZXMgPT0gMCk7CisKK30KKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbGxSb3cxCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgaW4gYSAnbm9ybWFsJyBjYXNlIHdoZW4gbm8KKyAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWNlc3NhcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIEZpbGxSb3cxKAorICB1OCAqcmVmLAorICB1OCAqZmlsbCwKKyAgaTMyIGxlZnQsCisgIGkzMiBjZW50ZXIsCisgIGkzMiByaWdodCkKK3sKKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChmaWxsKTsKKworICAgIEgyNjRTd0RlY01lbWNweShmaWxsLCByZWYsICh1MzIpY2VudGVyKTsKKworICAgIC8qbGludCAtZSg3MTUpICovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbFJvdzcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJvdyBvZiByZWZlcmVuY2UgcGVscyB3aGVuIGhvcml6b250YWwgY29vcmRpbmF0ZQorICAgICAgICAgIGlzIHBhcnRseSBuZWdhdGl2ZSBvciBwYXJ0bHkgZ3JlYXRlciB0aGFuIHJlZmVyZW5jZSBwaWN0dXJlIHdpZHRoCisgICAgICAgICAgKG92ZXJmaWxsaW5nIHNvbWUgcGVscyBvbiBsZWZ0IGFuZC9vciByaWdodCBlZGdlKS4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHJlZiAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBzYW1wbGVzCisgICAgICAgICAgbGVmdCAgICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gb3ZlcmZpbGwgb24gbGVmdC1lZGdlCisgICAgICAgICAgY2VudGVyICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gY29weQorICAgICAgICAgIHJpZ2h0ICAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIG92ZXJmaWxsIG9uIHJpZ2h0LWVkZ2UKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBmaWxsICAgICAgcG9pbnRlciB3aGVyZSBzYW1wbGVzIGFyZSBzdG9yZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit2b2lkIGgyNjRic2RGaWxsUm93NygKKyAgdTggKnJlZiwKKyAgdTggKmZpbGwsCisgIGkzMiBsZWZ0LAorICBpMzIgY2VudGVyLAorICBpMzIgcmlnaHQpCit7CisgICAgdTggdG1wOworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKGZpbGwpOworCisgICAgaWYgKGxlZnQpCisgICAgICAgIHRtcCA9ICpyZWY7CisKKyAgICBmb3IgKCA7IGxlZnQ7IGxlZnQtLSkKKyAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXApICB0bXAgaXMgaW5pdGlhbGl6ZWQgaWYgdXNlZCAqLworICAgICAgICAqZmlsbCsrID0gdG1wOworCisgICAgZm9yICggOyBjZW50ZXI7IGNlbnRlci0tKQorICAgICAgICAqZmlsbCsrID0gKnJlZisrOworCisgICAgaWYgKHJpZ2h0KQorICAgICAgICB0bXAgPSByZWZbLTFdOworCisgICAgZm9yICggOyByaWdodDsgcmlnaHQtLSkKKyAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXApICB0bXAgaXMgaW5pdGlhbGl6ZWQgaWYgdXNlZCAqLworICAgICAgICAqZmlsbCsrID0gdG1wOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGaWxsQmxvY2sKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGJsb2NrIG9mIHJlZmVyZW5jZSBwZWxzLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWVkZWQgb3Igbm90IGFuZCByZXBlYXRlZGx5IGNhbGxzIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICAgZnVuY3Rpb24gKGJ5IHVzaW5nIGEgZnVuY3Rpb24gcG9pbnRlcikgdGhhdCBmaWxscyBvbmUgcm93IHRoZSBibG9jay4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHJlZiAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lCisgICAgICAgICAgeDAgICAgICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBibG9jaworICAgICAgICAgIHkwICAgICAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgYmxvY2sKKyAgICAgICAgICB3aWR0aCAgICAgICAgICAgICB3aWR0aCBvZiByZWZlcmVuY2UgZnJhbWUKKyAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgcmVmZXJlbmNlIGZyYW1lCisgICAgICAgICAgYmxvY2tXaWR0aCAgICAgICAgd2lkdGggb2YgYmxvY2sKKyAgICAgICAgICBibG9ja0hlaWdodCAgICAgICBoZWlnaHQgb2YgYmxvY2sKKyAgICAgICAgICBmaWxsU2Nhbkxlbmd0aCAgICBsZW5ndGggb2YgYSBsaW5lIGluIG91dHB1dCBhcnJheSAocGl4ZWxzKQorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGZpbGwgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYXJyYXkgd2hlcmUgb3V0cHV0IGJsb2NrIGlzIHdyaXR0ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRmlsbEJsb2NrKAorICB1OCAqcmVmLAorICB1OCAqZmlsbCwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIGJsb2NrV2lkdGgsCisgIHUzMiBibG9ja0hlaWdodCwKKyAgdTMyIGZpbGxTY2FuTGVuZ3RoKQorCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIHhzdG9wLCB5c3RvcDsKKyAgICB2b2lkICgqZnApKHU4KiwgdTgqLCBpMzIsIGkzMiwgaTMyKTsKKyAgICBpMzIgbGVmdCwgeCwgcmlnaHQ7CisgICAgaTMyIHRvcCwgeSwgYm90dG9tOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQoZmlsbCk7CisgICAgQVNTRVJUKHdpZHRoKTsKKyAgICBBU1NFUlQoaGVpZ2h0KTsKKyAgICBBU1NFUlQoZmlsbCk7CisgICAgQVNTRVJUKGJsb2NrV2lkdGgpOworICAgIEFTU0VSVChibG9ja0hlaWdodCk7CisKKyAgICB4c3RvcCA9IHgwICsgKGkzMilibG9ja1dpZHRoOworICAgIHlzdG9wID0geTAgKyAoaTMyKWJsb2NrSGVpZ2h0OworCisgICAgLyogQ2hvb3NlIGNvcnJlY3QgZnVuY3Rpb24gd2hldGhlciBvdmVyZmlsbGluZyBvbiBsZWZ0LWVkZ2Ugb3IgcmlnaHQtZWRnZQorICAgICAqIGlzIG5lZWRlZCBvciBub3QgKi8KKyAgICBpZiAoeDAgPj0gMCAmJiB4c3RvcCA8PSAoaTMyKXdpZHRoKQorICAgICAgICBmcCA9IEZpbGxSb3cxOworICAgIGVsc2UKKyAgICAgICAgZnAgPSBoMjY0YnNkRmlsbFJvdzc7CisKKyAgICBpZiAoeXN0b3AgPCAwKQorICAgICAgICB5MCA9IC0oaTMyKWJsb2NrSGVpZ2h0OworCisgICAgaWYgKHhzdG9wIDwgMCkKKyAgICAgICAgeDAgPSAtKGkzMilibG9ja1dpZHRoOworCisgICAgaWYgKHkwID4gKGkzMiloZWlnaHQpCisgICAgICAgIHkwID0gKGkzMiloZWlnaHQ7CisKKyAgICBpZiAoeDAgPiAoaTMyKXdpZHRoKQorICAgICAgICB4MCA9IChpMzIpd2lkdGg7CisKKyAgICB4c3RvcCA9IHgwICsgKGkzMilibG9ja1dpZHRoOworICAgIHlzdG9wID0geTAgKyAoaTMyKWJsb2NrSGVpZ2h0OworCisgICAgaWYgKHgwID4gMCkKKyAgICAgICAgcmVmICs9IHgwOworCisgICAgaWYgKHkwID4gMCkKKyAgICAgICAgcmVmICs9IHkwICogKGkzMil3aWR0aDsKKworICAgIGxlZnQgPSB4MCA8IDAgPyAteDAgOiAwOworICAgIHJpZ2h0ID0geHN0b3AgPiAoaTMyKXdpZHRoID8geHN0b3AgLSAoaTMyKXdpZHRoIDogMDsKKyAgICB4ID0gKGkzMilibG9ja1dpZHRoIC0gbGVmdCAtIHJpZ2h0OworCisgICAgdG9wID0geTAgPCAwID8gLXkwIDogMDsKKyAgICBib3R0b20gPSB5c3RvcCA+IChpMzIpaGVpZ2h0ID8geXN0b3AgLSAoaTMyKWhlaWdodCA6IDA7CisgICAgeSA9IChpMzIpYmxvY2tIZWlnaHQgLSB0b3AgLSBib3R0b207CisKKyAgICAvKiBUb3Atb3ZlcmZpbGxpbmcgKi8KKyAgICBmb3IgKCA7IHRvcDsgdG9wLS0gKQorICAgIHsKKyAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7CisgICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7CisgICAgfQorCisgICAgLyogTGluZXMgaW5zaWRlIHJlZmVyZW5jZSBpbWFnZSAqLworICAgIGZvciAoIDsgeTsgeS0tICkKKyAgICB7CisgICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOworICAgICAgICByZWYgKz0gd2lkdGg7CisgICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7CisgICAgfQorCisgICAgcmVmIC09IHdpZHRoOworCisgICAgLyogQm90dG9tLW92ZXJmaWxsaW5nICovCisgICAgZm9yICggOyBib3R0b207IGJvdHRvbS0tICkKKyAgICB7CisgICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOworICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOworICAgIH0KK30KKworLypsaW50ICtlNzAxICtlNzAyICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTFhMTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSAorI2RlZmluZSBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19PTVhETAordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgeEEsCisgIHUzMiB5QSwKKyAgdTMyIHBhcnRYLAorICB1MzIgcGFydFksCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KTsKKyNlbHNlCit2b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKKyAgdTggKmRhdGEsCisgIG12X3QgKm12LAorICBpbWFnZV90ICpyZWZQaWMsCisgIHUzMiBjb2xBbmRSb3csLyogcGFja2FnZWQgZGF0YSB8IGNvbHVtbiAgICB8IHJvdyAgICAgICAgICAgICAgICB8Ki8KKyAgdTMyIHBhcnQsICAgICAvKiBwYWNrYWdlZCBkYXRhIHxwYXJ0WHxwYXJ0WXxwYXJ0V2lkdGh8cGFydEhlaWdodHwqLworICB1OCAqcEZpbGwpOworI2VuZGlmCisKK3ZvaWQgaDI2NGJzZEZpbGxCbG9jaygKKyAgdTggKiByZWYsCisgIHU4ICogZmlsbCwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIGJsb2NrV2lkdGgsCisgIHUzMiBibG9ja0hlaWdodCwKKyAgdTMyIGZpbGxTY2FuTGVuZ3RoKTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCisgIHU4ICpwUmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcigKKyAgdTggKnBSZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAorICB1OCAqcmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIHZlck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvclZlck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIHZlck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvck9mZnNldCk7CisKKwordm9pZCBoMjY0YnNkRmlsbFJvdzcoCisgIHU4ICpyZWYsCisgIHU4ICpmaWxsLAorICBpMzIgbGVmdCwKKyAgaTMyIGNlbnRlciwKKyAgaTMyIHJpZ2h0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDc1NmM0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYwpAQCAtMCwwICsxLDE2OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQorICAgICAgICAgIERlY29kZUJ1ZmZlcmluZ1BlcmlvZAorICAgICAgICAgIERlY29kZVBpY3R1cmVUaW1pbmcKKyAgICAgICAgICBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCisgICAgICAgICAgRGVjb2RlRmlsbGVyUGF5bG9hZAorICAgICAgICAgIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUKKyAgICAgICAgICBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZAorICAgICAgICAgIERlY29kZVJlY292ZXJ5UG9pbnQKKyAgICAgICAgICBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbgorICAgICAgICAgIERlY29kZVNwYXJlUGljCisgICAgICAgICAgRGVjb2RlU2NlbmVJbmZvCisgICAgICAgICAgRGVjb2RlU3ViU2VxSW5mbworICAgICAgICAgIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCisgICAgICAgICAgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCisgICAgICAgICAgRGVjb2RlRnVsbEZyYW1lRnJlZXplCisgICAgICAgICAgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QKKyAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKKyAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kCisgICAgICAgICAgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0CisgICAgICAgICAgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zZWkuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgdTMyIG51bUNsb2NrVFNbOV0gPSB7MSwxLDEsMiwyLDMsMywyLDN9Oworc3RhdGljIGNvbnN0IHUzMiBjZWlsTG9nMk51bVNsaWNlR3JvdXBzWzldID0gezAsMSwxLDIsMiwzLDMsMywzfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKKyAgdTMyIGNwYkNudCwKKyAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAorICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKKyAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAorICB1MzIgdGltZU9mZnNldExlbmd0aCwKKyAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAorICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpOworCitzdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpOworCitzdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpOworCitzdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90ICpwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKKyAgdTMyIHBheWxvYWRTaXplKTsKKworc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90ICpwVXNlckRhdGFVbnJlZ2lzdGVyZWQsCisgIHUzMiBwYXlsb2FkU2l6ZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUmVjb3ZlcnlQb2ludCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZWNvdmVyeVBvaW50X3QgKnBSZWNvdmVyeVBvaW50KTsKKworc3RhdGljIHUzMiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90ICpwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCisgIHUzMiBudW1SZWZGcmFtZXMpOworCitzdGF0aWMgdTMyIERlY29kZVNwYXJlUGljKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVNwYXJlUGljX3QgKnBTcGFyZVBpYywKKyAgdTMyIHBpY1NpemVJbk1hcFVuaXRzKTsKKworc3RhdGljIHUzMiBEZWNvZGVTY2VuZUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU2NlbmVJbmZvX3QgKnBTY2VuZUluZm8pOworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOworCitzdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlGdWxsRnJhbWVGcmVlemVfdCAqcEZ1bGxGcmFtZUZyZWV6ZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCAqcEZ1bGxGcmFtZVNuYXBzaG90KTsKKworc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOworCitzdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7CisKK3N0YXRpYyB1MzIgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90ICpwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAorICB1MzIgbnVtU2xpY2VHcm91cHMpOworCitzdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKKyAgdTMyIHBheWxvYWRTaXplKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHBheWxvYWRUeXBlLCBwYXlsb2FkU2l6ZSwgc3RhdHVzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlaU1lc3NhZ2UpOworCisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFNlaU1lc3NhZ2UsIDAsIHNpemVvZihzZWlNZXNzYWdlX3QpKTsKKworICAgIGRvCisgICAgeworICAgICAgICBwYXlsb2FkVHlwZSA9IDA7CisgICAgICAgIHdoaWxlKCh0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpKSA9PSAweEZGKQorICAgICAgICB7CisgICAgICAgICAgICBwYXlsb2FkVHlwZSArPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwYXlsb2FkVHlwZSArPSB0bXA7CisKKyAgICAgICAgcGF5bG9hZFNpemUgPSAwOworICAgICAgICB3aGlsZSgodG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KSkgPT0gMHhGRikKKyAgICAgICAgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gMjU1OworICAgICAgICB9CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcGF5bG9hZFNpemUgKz0gdG1wOworCisgICAgICAgIHBTZWlNZXNzYWdlLT5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlOworCisgICAgICAgIHN3aXRjaCAocGF5bG9hZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmJ1ZmZlcmluZ1BlcmlvZCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJDbnQsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBpY3R1cmVUaW1pbmcoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBpY1RpbWluZywKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgIHRpbWVPZmZzZXRMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPworICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBhblNjYW5SZWN0YW5nbGUoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBhblNjYW5SZWN0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZpbGxlclBheWxvYWQocFN0cm1EYXRhLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT51c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAorICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnVzZXJEYXRhVW5yZWdpc3RlcmVkLAorICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUmVjb3ZlcnlQb2ludCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cmVjb3ZlcnlQb2ludCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTcGFyZVBpYygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3BhcmVQaWMsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVNjZW5lSW5mbygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c2NlbmVJbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFJbmZvKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFJbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZUZyZWV6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTQ6IC8qIFRoaXMgU0VJIGRvZXMgbm90IGNvbnRhaW4gZGF0YSwgd2hhdCB0byBkbyA/Pz8gKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZVNuYXBzaG90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPm1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKKyAgICAgICAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHN0YXR1cyk7CisKKyAgICAgICAgd2hpbGUgKCFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAxKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHdoaWxlICghaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChoMjY0YnNkTW9yZVJic3BEYXRhKHBTdHJtRGF0YSkpOworCisgICAgcmV0dXJuKGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSkpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlQnVmZmVyaW5nUGVyaW9kCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKKyAgdTMyIGNwYkNudCwKKyAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAorICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocEJ1ZmZlcmluZ1BlcmlvZCk7CisgICAgQVNTRVJUKGNwYkNudCk7CisgICAgQVNTRVJUKGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkID4gMzEpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGlmIChuYWxIcmRCcFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwYkNudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmNsSHJkQnBQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGJDbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVBpY3R1cmVUaW1pbmcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKKyAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAorICB1MzIgdGltZU9mZnNldExlbmd0aCwKKyAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAorICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKyAgICBpMzIgaXRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQaWNUaW1pbmcpOworCisKKyAgICBpZiAoY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGNwYlJlbW92YWxEZWxheUxlbmd0aCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFBpY1RpbWluZy0+Y3BiUmVtb3ZhbERlbGF5ID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgZHBiT3V0cHV0RGVsYXlMZW5ndGgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBQaWNUaW1pbmctPmRwYk91dHB1dERlbGF5ID0gdG1wOworICAgIH0KKworICAgIGlmIChwaWNTdHJ1Y3RQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgaWYgKHRtcCA+IDgpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBQaWNUaW1pbmctPnBpY1N0cnVjdCA9IHRtcDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2xvY2tUU1twUGljVGltaW5nLT5waWNTdHJ1Y3RdOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFBpY1RpbWluZy0+Y2xvY2tUaW1lU3RhbXBGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5jbG9ja1RpbWVTdGFtcEZsYWdbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jdFR5cGVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm51aXRGaWVsZEJhc2VkRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID4gNikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmNvdW50aW5nVHlwZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZnVsbFRpbWVTdGFtcEZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZGlzY29udGludWl0eUZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y250RHJvcHBlZEZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bkZyYW1lc1tpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5mdWxsVGltZVN0YW1wRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzVmFsdWVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNWYWx1ZVtpXSA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc1ZhbHVlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5taW51dGVzRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+aG91cnNGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gMjMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzVmFsdWVbaV0gPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aW1lT2Zmc2V0TGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0aW1lT2Zmc2V0TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBpdG1wID0gKGkzMil0bXA7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyAiY29udmVydHMiIHRpbWVPZmZzZXRMZW5ndGgtYml0IHNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgKiBpbnRlZ2VyIGludG8gaTMyICovCisgICAgICAgICAgICAgICAgICAgIC8qbGludCAtc2F2ZSAtZTcwMSAtZTcwMiAqLworICAgICAgICAgICAgICAgICAgICBpdG1wIDw8PSAoMzIgLSB0aW1lT2Zmc2V0TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaXRtcCA+Pj0gKDMyIC0gdGltZU9mZnNldExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8qbGludCAtcmVzdG9yZSAqLworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT50aW1lT2Zmc2V0W2ldID0gaXRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnRpbWVPZmZzZXRbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQYW5TY2FuUmVjdGFuZ2xlKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RDYW5jZWxGbGFnID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmICghcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Q2FuY2VsRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250ID4gMikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQrKzsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RMZWZ0T2Zmc2V0W2ldKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJpZ2h0T2Zmc2V0W2ldKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFRvcE9mZnNldFtpXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RCb3R0b21PZmZzZXRbaV0pOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMTYzODQpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCA+IDEgJiYKKyAgICAgICAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVGaWxsZXJQYXlsb2FkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworCisgICAgaWYgKHBheWxvYWRTaXplKQorICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKiBwYXlsb2FkU2l6ZSkgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCAqcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCisgIHUzMiBwYXlsb2FkU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUpOworICAgIEFTU0VSVChwYXlsb2FkU2l6ZSk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlID0gdG1wOworCisgICAgaWYgKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGUgIT0gMHhGRikKKyAgICAgICAgaSA9IDE7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZSA9IHRtcDsKKyAgICAgICAgaSA9IDI7CisgICAgfQorCisgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgQUxMT0NBVEUocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZSxwYXlsb2FkU2l6ZS1pLHU4KTsKKyAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemUgLSBpOworICAgIGlmIChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBqID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlW2pdID0gKHU4KXRtcDsKKyAgICAgICAgaSsrOworICAgICAgICBqKys7CisgICAgfSB3aGlsZSAoaSA8IHBheWxvYWRTaXplKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCAqcFVzZXJEYXRhVW5yZWdpc3RlcmVkLAorICB1MzIgcGF5bG9hZFNpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBVc2VyRGF0YVVucmVnaXN0ZXJlZCk7CisKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnV1aWRJc29JZWMxMTU3OFtpXSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICBBTExPQ0FURShwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGUsIHBheWxvYWRTaXplIC0gMTYsIHU4KTsKKyAgICBpZiAocFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplIC0gMTY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemUgLSAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGVbaV0gPSAodTgpdG1wOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVjb3ZlcnlQb2ludAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVSZWNvdmVyeVBvaW50KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVJlY292ZXJ5UG9pbnRfdCAqcFJlY292ZXJ5UG9pbnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBSZWNvdmVyeVBvaW50KTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBSZWNvdmVyeVBvaW50LT5yZWNvdmVyeUZyYW1lQ250KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBSZWNvdmVyeVBvaW50LT5leGFjdE1hdGNoRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBSZWNvdmVyeVBvaW50LT5icm9rZW5MaW5rRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICh0bXAgPiAyKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFJlY292ZXJ5UG9pbnQtPmNoYW5naW5nU2xpY2VHcm91cElkYyA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCAqcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAorICB1MzIgbnVtUmVmRnJhbWVzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24pOworCisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+b3JpZ2luYWxJZHJGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5vcmlnaW5hbEZyYW1lTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnIGFzc3VtZWQgYWx3YXlzIHRydWUgc28gc29tZSBmaWVsZCByZWxhdGVkIHN5bnRheAorICAgICAqIGVsZW1lbnRzIGFyZSBza2lwcGVkLCBzZWUgSC4yNjQgc3RhbmRhcmQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjUmVmUGljTWFya2luZyhwU3RybURhdGEsCisgICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5kZWNSZWZQaWNNYXJraW5nLCBOQUxfU0VJLCBudW1SZWZGcmFtZXMpOworCisgICAgcmV0dXJuKHRtcCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTcGFyZVBpYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVTcGFyZVBpYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTcGFyZVBpY190ICpwU3BhcmVQaWMsCisgIHUzMiBwaWNTaXplSW5NYXBVbml0cykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqLCBtYXBVbml0Q250OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNwYXJlUGljKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTcGFyZVBpYy0+dGFyZ2V0RnJhbWVOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgLyogZG8gbm90IGFjY2VwdCBmaWVsZHMgKi8KKyAgICBpZiAocFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNwYXJlUGljLT5udW1TcGFyZVBpY3MrKzsKKyAgICBpZiAocFNwYXJlUGljLT5udW1TcGFyZVBpY3MgPiBNQVhfTlVNX1NQQVJFX1BJQ1MpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU3BhcmVQaWMtPm51bVNwYXJlUGljczsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFNwYXJlUGljLT5kZWx0YVNwYXJlRnJhbWVOdW1baV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPiAyKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICAgICAgICAgIEFMTE9DQVRFKHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSwgcGljU2l6ZUluTWFwVW5pdHMsIHUzMik7CisgICAgICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaWNTaXplSW5NYXBVbml0czsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldW2pdID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgICAgICAgICBBTExPQ0FURShwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0sIHBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOworICAgICAgICAgICAgaWYgKHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKGogPSAwLCBtYXBVbml0Q250ID0gMDsgbWFwVW5pdENudCA8IHBpY1NpemVJbk1hcFVuaXRzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV1bal0pOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBtYXBVbml0Q250ICs9IHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXVtqXSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgcmVzdCB0byBudWxsICovCisgICAgZm9yIChpID0gcFNwYXJlUGljLT5udW1TcGFyZVBpY3M7IGkgPCBNQVhfTlVNX1NQQVJFX1BJQ1M7IGkrKykKKyAgICB7CisgICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9IE5VTEw7CisgICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTY2VuZUluZm8KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlU2NlbmVJbmZvKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVNjZW5lSW5mb190ICpwU2NlbmVJbmZvKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2NlbmVJbmZvKTsKKworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2NlbmVJbmZvLT5zY2VuZUluZm9QcmVzZW50RmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVJbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFNjZW5lSW5mby0+c2NlbmVJZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlID4gNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBTY2VuZUluZm8tPnNlY29uZFNjZW5lSWQpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxSW5mbworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1YlNlcUluZm8pOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUxheWVyTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFMYXllck51bSA+IDI1NSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTdWJTZXFJbmZvLT5zdWJTZXFJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxSWQgPiA2NTUzNSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxSW5mby0+Zmlyc3RSZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPmxlYWRpbmdOb25SZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPmxhc3RQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzKys7CisgICAgaWYgKHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tpXSA9CisgICAgICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUJpdFJhdGVbaV0gPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlW2ldID0gdG1wOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUNoYXJhY3RlcmlzdGljcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1YlNlcUNoYXJhY3RlcmlzdGljcyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0gPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCA+IDY1NTM1KQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmR1cmF0aW9uRmxhZyA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5kdXJhdGlvbkZsYWcpCisgICAgeworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFEdXJhdGlvbiA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VSYXRlRmxhZyA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlUmF0ZUZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmFjY3VyYXRlU3RhdGlzdGljc0ZsYWcgPQorICAgICAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlQml0UmF0ZSA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlID0gdG1wOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMgPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2VxczsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxTGF5ZXJOdW1baV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcUlkW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcURpcmVjdGlvbltpXSA9IHRtcDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZUZyZWV6ZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRnVsbEZyYW1lRnJlZXplX3QgKnBGdWxsRnJhbWVGcmVlemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBGdWxsRnJhbWVGcmVlemUpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBGdWxsRnJhbWVGcmVlemUtPmZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2QpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocEZ1bGxGcmFtZUZyZWV6ZS0+ZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZCA+IDE2Mzg0KQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZVNuYXBzaG90CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgKnBGdWxsRnJhbWVTbmFwc2hvdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocEZ1bGxGcmFtZVNuYXBzaG90KTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBGdWxsRnJhbWVTbmFwc2hvdC0+c25hcFNob3RJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMrKzsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZC0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCAqcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQpOworICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA8IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCsrOworICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0ID4gbnVtU2xpY2VHcm91cHMpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0OyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsCisgICAgICAgICAgICBjZWlsTG9nMk51bVNsaWNlR3JvdXBzW251bVNsaWNlR3JvdXBzXSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID0gdG1wOworICAgICAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID4KKyAgICAgICAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0LTEpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5leGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnID0KKyAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RGbGFnID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0SWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKKyAgdTMyIHBheWxvYWRTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVzZXJ2ZWRTZWlNZXNzYWdlKTsKKworCisgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgQUxMT0NBVEUocFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGUscGF5bG9hZFNpemUsdTgpOworICAgIGlmIChwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgcFJlc2VydmVkU2VpTWVzc2FnZS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSw4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZVtpXSA9ICh1OCl0bXA7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmZTU0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0VJX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NFSV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNQVhfUEFOX1NDQU5fQ05UIDMyCisjZGVmaW5lIE1BWF9OVU1fU1BBUkVfUElDUyAxNgorI2RlZmluZSBNQVhfTlVNX0NMT0NLX1RTIDMKKyNkZWZpbmUgTUFYX05VTV9TVUJfU0VRX0xBWUVSUyAyNTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheVtNQVhfQ1BCX0NOVF07CisgICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbTUFYX0NQQl9DTlRdOworfSBzZWlCdWZmZXJpbmdQZXJpb2RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgY3BiUmVtb3ZhbERlbGF5OworICAgIHUzMiBkcGJPdXRwdXREZWxheTsKKyAgICB1MzIgcGljU3RydWN0OworICAgIHUzMiBjbG9ja1RpbWVTdGFtcEZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGNsb2NrVGltZVN0YW1wW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBjdFR5cGVbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIG51aXRGaWVsZEJhc2VkRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgY291bnRpbmdUeXBlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBmdWxsVGltZVN0YW1wRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgZGlzY29udGludWl0eUZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGNudERyb3BwZWRGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBuRnJhbWVzW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBzZWNvbmRzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgc2Vjb25kc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBtaW51dGVzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgbWludXRlc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBob3Vyc0ZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGhvdXJzVmFsdWVbTUFYX05VTV9DTE9DS19UU107CisgICAgaTMyIHRpbWVPZmZzZXRbTUFYX05VTV9DTE9DS19UU107Cit9IHNlaVBpY1RpbWluZ190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwYW5TY2FuUmVjdElkOworICAgIHUzMiBwYW5TY2FuUmVjdENhbmNlbEZsYWc7CisgICAgdTMyIHBhblNjYW5DbnQ7CisgICAgaTMyIHBhblNjYW5SZWN0TGVmdE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKKyAgICBpMzIgcGFuU2NhblJlY3RSaWdodE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKKyAgICBpMzIgcGFuU2NhblJlY3RUb3BPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07CisgICAgaTMyIHBhblNjYW5SZWN0Qm90dG9tT2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOworICAgIHUzMiBwYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2Q7Cit9IHNlaVBhblNjYW5SZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGl0dVRUMzVDb3VudHJ5Q29kZTsKKyAgICB1MzIgaXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZTsKKyAgICB1OCAqaXR1VFQzNVBheWxvYWRCeXRlOworICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Cit9IHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgdXVpZElzb0llYzExNTc4WzRdOworICAgIHU4ICp1c2VyRGF0YVBheWxvYWRCeXRlOworICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Cit9IHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHJlY292ZXJ5RnJhbWVDbnQ7CisgICAgdTMyIGV4YWN0TWF0Y2hGbGFnOworICAgIHUzMiBicm9rZW5MaW5rRmxhZzsKKyAgICB1MzIgY2hhbmdpbmdTbGljZUdyb3VwSWRjOworfSBzZWlSZWNvdmVyeVBvaW50X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG9yaWdpbmFsSWRyRmxhZzsKKyAgICB1MzIgb3JpZ2luYWxGcmFtZU51bTsKKyAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKK30gc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgdGFyZ2V0RnJhbWVOdW07CisgICAgdTMyIHNwYXJlRmllbGRGbGFnOworICAgIHUzMiB0YXJnZXRCb3R0b21GaWVsZEZsYWc7CisgICAgdTMyIG51bVNwYXJlUGljczsKKyAgICB1MzIgZGVsdGFTcGFyZUZyYW1lTnVtW01BWF9OVU1fU1BBUkVfUElDU107CisgICAgdTMyIHNwYXJlQm90dG9tRmllbGRGbGFnW01BWF9OVU1fU1BBUkVfUElDU107CisgICAgdTMyIHNwYXJlQXJlYUlkY1tNQVhfTlVNX1NQQVJFX1BJQ1NdOworICAgIHUzMiAqc3BhcmVVbml0RmxhZ1tNQVhfTlVNX1NQQVJFX1BJQ1NdOworICAgIHUzMiAqemVyb1J1bkxlbmd0aFtNQVhfTlVNX1NQQVJFX1BJQ1NdOworfSBzZWlTcGFyZVBpY190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzY2VuZUluZm9QcmVzZW50RmxhZzsKKyAgICB1MzIgc2NlbmVJZDsKKyAgICB1MzIgc2NlbmVUcmFuc2l0aW9uVHlwZTsKKyAgICB1MzIgc2Vjb25kU2NlbmVJZDsKK30gc2VpU2NlbmVJbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHN1YlNlcUxheWVyTnVtOworICAgIHUzMiBzdWJTZXFJZDsKKyAgICB1MzIgZmlyc3RSZWZQaWNGbGFnOworICAgIHUzMiBsZWFkaW5nTm9uUmVmUGljRmxhZzsKKyAgICB1MzIgbGFzdFBpY0ZsYWc7CisgICAgdTMyIHN1YlNlcUZyYW1lTnVtRmxhZzsKKyAgICB1MzIgc3ViU2VxRnJhbWVOdW07Cit9IHNlaVN1YlNlcUluZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgbnVtU3ViU2VxTGF5ZXJzOworICAgIHUzMiBhY2N1cmF0ZVN0YXRpc3RpY3NGbGFnW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworICAgIHUzMiBhdmVyYWdlQml0UmF0ZVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKKyAgICB1MzIgYXZlcmFnZUZyYW1lUmF0ZVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKK30gc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc3ViU2VxTGF5ZXJOdW07CisgICAgdTMyIHN1YlNlcUlkOworICAgIHUzMiBkdXJhdGlvbkZsYWc7CisgICAgdTMyIHN1YlNlcUR1cmF0aW9uOworICAgIHUzMiBhdmVyYWdlUmF0ZUZsYWc7CisgICAgdTMyIGFjY3VyYXRlU3RhdGlzdGljc0ZsYWc7CisgICAgdTMyIGF2ZXJhZ2VCaXRSYXRlOworICAgIHUzMiBhdmVyYWdlRnJhbWVSYXRlOworICAgIHUzMiBudW1SZWZlcmVuY2VkU3Vic2VxczsKKyAgICB1MzIgcmVmU3ViU2VxTGF5ZXJOdW1bTUFYX05VTV9TVUJfU0VRX0xBWUVSU107CisgICAgdTMyIHJlZlN1YlNlcUlkW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworICAgIHUzMiByZWZTdWJTZXFEaXJlY3Rpb25bTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Cit9IHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBmdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kOworfSBzZWlGdWxsRnJhbWVGcmVlemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc25hcFNob3RJZDsKK30gc2VpRnVsbEZyYW1lU25hcHNob3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQ7CisgICAgdTMyIG51bVJlZmluZW1lbnRTdGVwczsKK30gc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHByb2dyZXNzaXZlUmVmaW5lbWVudElkOworfSBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG51bVNsaWNlR3JvdXBzSW5TZXQ7CisgICAgdTMyIHNsaWNlR3JvdXBJZFtNQVhfTlVNX1NMSUNFX0dST1VQU107CisgICAgdTMyIGV4YWN0U2FtcGxlVmFsdWVNYXRjaEZsYWc7CisgICAgdTMyIHBhblNjYW5SZWN0RmxhZzsKKyAgICB1MzIgcGFuU2NhblJlY3RJZDsKK30gc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTggKnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlOworICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Cit9IHNlaVJlc2VydmVkU2VpTWVzc2FnZV90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwYXlsb2FkVHlwZTsKKyAgICBzZWlCdWZmZXJpbmdQZXJpb2RfdCBidWZmZXJpbmdQZXJpb2Q7CisgICAgc2VpUGljVGltaW5nX3QgcGljVGltaW5nOworICAgIHNlaVBhblNjYW5SZWN0X3QgcGFuU2NhblJlY3Q7CisgICAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90IHVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzU7CisgICAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCB1c2VyRGF0YVVucmVnaXN0ZXJlZDsKKyAgICBzZWlSZWNvdmVyeVBvaW50X3QgcmVjb3ZlcnlQb2ludDsKKyAgICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90IGRlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uOworICAgIHNlaVNwYXJlUGljX3Qgc3BhcmVQaWM7CisgICAgc2VpU2NlbmVJbmZvX3Qgc2NlbmVJbmZvOworICAgIHNlaVN1YlNlcUluZm9fdCBzdWJTZXFJbmZvOworICAgIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3Qgc3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3M7CisgICAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3Qgc3ViU2VxQ2hhcmFjdGVyaXN0aWNzOworICAgIHNlaUZ1bGxGcmFtZUZyZWV6ZV90IGZ1bGxGcmFtZUZyZWV6ZTsKKyAgICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90IGZ1bGxGcmFtZVNuYXBzaG90OworICAgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90IHByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydDsKKyAgICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZDsKKyAgICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCBtb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQ7CisgICAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgcmVzZXJ2ZWRTZWlNZXNzYWdlOworfSBzZWlNZXNzYWdlX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0VJX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxMDUxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKQEAgLTAsMCArMSw1NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQKKyAgICAgICAgICBHZXREcGJTaXplCisgICAgICAgICAgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZW51bWVyYXRpb24gdG8gaW5kaWNhdGUgaW52YWxpZCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgR2V0RHBiU2l6ZSBmdW5jdGlvbiAqLworZW51bSB7SU5WQUxJRF9EUEJfU0laRSA9IDB4N0ZGRkZGRkZ9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgR2V0RHBiU2l6ZSh1MzIgcGljU2l6ZUluTWJzLCB1MzIgbGV2ZWxJZGMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgRnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3Igb2Zmc2V0Rm9yUmVmRnJhbWUgYXJyYXkgaWYKKyAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQgdHlwZSBpcyAxIGFuZCBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUKKyAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIGludmFsaWQgaW5mb3JtYXRpb24gb3IgZW5kIG9mIHN0cmVhbQorICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFNlcVBhcmFtU2V0LCAwLCBzaXplb2Yoc2VxUGFyYW1TZXRfdCkpOworCisgICAgLyogcHJvZmlsZV9pZGMgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICh0bXAgIT0gNjYpCisgICAgeworICAgICAgICBERUJVRygoIk5PVCBCQVNFTElORSBQUk9GSUxFICVkXG4iLCB0bXApKTsKKyAgICB9CisgICAgcFNlcVBhcmFtU2V0LT5wcm9maWxlSWRjID0gdG1wOworCisgICAgLyogY29uc3RyYWluZWRfc2V0MF9mbGFnICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAvKiBjb25zdHJhaW5lZF9zZXQxX2ZsYWcgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIC8qIGNvbnN0cmFpbmVkX3NldDJfZmxhZyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHJlc2VydmVkX3plcm9fNWJpdHMsIHZhbHVlcyBvZiB0aGVzZSBiaXRzIHNoYWxsIGJlIGlnbm9yZWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2VxUGFyYW1TZXQtPmxldmVsSWRjID0gdG1wOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHZhbHVlID4gMTIpCisgICAgeworICAgICAgICBFUFJJTlQoImxvZzJfbWF4X2ZyYW1lX251bV9taW51czQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICAvKiBtYXhGcmFtZU51bSA9IDJeKGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KSAqLworICAgIHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPSAxIDw8ICh2YWx1ZSs0KTsKKworICAgIC8qIHZhbGlkIFBPQyB0eXBlcyBhcmUgMCwgMSBhbmQgMiAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+IDIpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19vcmRlcl9jbnRfdHlwZSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID0gdmFsdWU7CisKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCAqLworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAodmFsdWUgPiAxMikKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICAvKiBtYXhQaWNPcmRlckNudExzYiA9IDJeKGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpICovCisgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPSAxIDw8ICh2YWx1ZSs0KTsKKyAgICB9CisgICAgZWxzZSBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm9mZnNldEZvck5vblJlZlBpYyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlID4gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTk9URTogVGhpcyBoYXMgdG8gYmUgZnJlZWQgc29tZXdoZXJlISAqLworICAgICAgICAgICAgQUxMT0NBVEUocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlLCBpMzIpOworICAgICAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgKyBpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyA+IE1BWF9OVU1fUkVGX1BJQ1MpCisgICAgeworICAgICAgICBFUFJJTlQoIm51bV9yZWZfZnJhbWVzIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTZXFQYXJhbVNldC0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgPSB2YWx1ZSArIDE7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzID0gdmFsdWUgKyAxOworCisgICAgLyogZnJhbWVfbWJzX29ubHlfZmxhZywgc2hhbGwgYmUgMSBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKCF0bXApCisgICAgeworICAgICAgICBFUFJJTlQoImZyYW1lX21ic19vbmx5X2ZsYWciKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcHBpbmdGbGFnID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wTGVmdE9mZnNldCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BSaWdodE9mZnNldCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BUb3BPZmZzZXQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAvKiBjaGVjayB0aGF0IGZyYW1lIGNyb3BwaW5nIHBhcmFtcyBhcmUgdmFsaWQsIHBhcmFtZXRlcnMgc2hhbGwKKyAgICAgICAgICogc3BlY2lmeSBub24tbmVnYXRpdmUgYXJlYSB3aXRoaW4gdGhlIG9yaWdpbmFsIHBpY3R1cmUgKi8KKyAgICAgICAgaWYgKCAoIChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ID4KKyAgICAgICAgICAgICAgICggOCAqIChpMzIpcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzIC0KKyAgICAgICAgICAgICAgICAgKChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BSaWdodE9mZnNldCArIDEpICkgKSB8fAorICAgICAgICAgICAgICggKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFRvcE9mZnNldCA+CisgICAgICAgICAgICAgICAoIDggKiAoaTMyKXBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMgLQorICAgICAgICAgICAgICAgICAoKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCArIDEpICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiZnJhbWVfY3JvcHBpbmciKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIHRoYXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgbGV2ZWxJZGMgbWF0Y2ggKi8KKyAgICB0bXAgPSBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzOworICAgIHZhbHVlID0gR2V0RHBiU2l6ZSh0bXAsIHBTZXFQYXJhbVNldC0+bGV2ZWxJZGMpOworICAgIGlmICh2YWx1ZSA9PSBJTlZBTElEX0RQQl9TSVpFIHx8IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzID4gdmFsdWUpCisgICAgeworICAgICAgICBERUJVRygoIldBUk5JTkchIEludmFsaWQgRFBCIHNpemUgYmFzZWQgb24gU1BTIExldmVsIVxuIikpOworICAgICAgICBERUJVRygoIldBUk5JTkchIFVzaW5nIG51bV9yZWZfZnJhbWVzID0lZCBmb3IgRFBCIHNpemUhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpKTsKKyAgICAgICAgdmFsdWUgPSBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lczsKKyAgICB9CisgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplID0gdmFsdWU7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgLyogVlVJICovCisgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgQUxMT0NBVEUocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLCAxLCB2dWlQYXJhbWV0ZXJzX3QpOworICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhwU3RybURhdGEsCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAvKiBjaGVjayBudW1SZW9yZGVyRnJhbWVzIGFuZCBtYXhEZWNGcmFtZUJ1ZmZlcmluZyAqLworICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMgPgorICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nIHx8CisgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyA8CisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzIHx8CisgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyA+CisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNheXMgdGhhdCAidGhlIHNlcXVlbmNlIHNoYWxsIG5vdCByZXF1aXJlIGEgRFBCIHdpdGgKKyAgICAgICAgICAgICAqIHNpemUgb2YgbW9yZSB0aGFuIG1heCgxLCBtYXhEZWNGcmFtZUJ1ZmZlcmluZykgKi8KKyAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSA9CisgICAgICAgICAgICAgICAgTUFYKDEsIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKTsKKworICAgIC8qIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMgaW4gdHJhaWxpbmcgYml0cyBvZiBwYXJhbWV0ZXJzIHNldHMgKi8KKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldERwYlNpemUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHNpemUgb2YgdGhlIERQQiBpbiBmcmFtZXMuIFNpemUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBhbmQgTWF4RFBCIGZvciB0aGUgc3BlY2lmaWVkIGxldmVsLiBUaGVzZSBkZXRlcm1pbmUKKyAgICAgICAgICAgIGhvdyBtYW55IHBpY3R1cmVzIG1heSBmaXQgaW50byB0byB0aGUgYnVmZmVyLiBIb3dldmVyLCB0aGUgc2l6ZQorICAgICAgICAgICAgaXMgYWxzbyBsaW1pdGVkIHRvIGEgbWF4aW11bSBvZiAxNiBmcmFtZXMgYW5kIHRoZXJlZm9yZSBmdW5jdGlvbgorICAgICAgICAgICAgcmV0dXJucyB0aGUgbWluaW11bSBvZiB0aGUgZGV0ZXJtaW5lZCBzaXplIGFuZCAxNi4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGluIHRoZSBwaWN0dXJlCisgICAgICAgICAgICBsZXZlbElkYyAgICAgICAgaW5kaWNhdGVzIHRoZSBsZXZlbAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHNpemUgb2YgdGhlIERQQiBpbiBmcmFtZXMKKyAgICAgICAgICAgIElOVkFMSURfRFBCX1NJWkUgd2hlbiBpbnZhbGlkIGxldmVsSWRjIHNwZWNpZmllZCBvciBwaWNTaXplSW5NYnMKKyAgICAgICAgICAgIGlzIGhpZ2hlciB0aGFuIHN1cHBvcnRlZCBieSB0aGUgbGV2ZWwgaW4gcXVlc3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIEdldERwYlNpemUodTMyIHBpY1NpemVJbk1icywgdTMyIGxldmVsSWRjKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisgICAgdTMyIG1heFBpY1NpemVJbk1iczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisKKyAgICAvKiB1c2UgdG1wIGFzIHRoZSBzaXplIG9mIHRoZSBEUEIgaW4gYnl0ZXMsIGNvbXB1dGVzIGFzIDEwMjQgKiBNYXhEUEIKKyAgICAgKiAoZnJvbSB0YWJsZSBBLTEgaW4gQW5uZXggQSkgKi8KKyAgICBzd2l0Y2ggKGxldmVsSWRjKQorICAgIHsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIHRtcCA9IDE1MjA2NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDk5OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHRtcCA9IDM0NTYwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB0bXAgPSA5MTIzODQ7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgdG1wID0gOTEyMzg0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICB0bXAgPSAxODI0NzY4OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gNzkyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgIHRtcCA9IDMxMTA0MDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAxNjIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgIHRtcCA9IDMxMTA0MDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAxNjIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgIHRtcCA9IDY5MTIwMDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzNjAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIHRtcCA9IDc4NjQzMjA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA1MTIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgIHRtcCA9IDEyNTgyOTEyOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODE5MjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICB0bXAgPSAxMjU4MjkxMjsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDgxOTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgdG1wID0gMzQ4MTYqMzg0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODcwNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAvKiBzdGFuZGFyZCBzYXlzIDQyMzAxNDQwIGhlcmUsIGJ1dCBjb3JyaWdlbmR1bSAiY29ycmVjdHMiIHRoaXMgdG8KKyAgICAgICAgICAgICAqIDQyMzkzNjAwICovCisgICAgICAgICAgICB0bXAgPSA0MjM5MzYwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDIyMDgwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgIHRtcCA9IDcwNzc4ODgwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzY4NjQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKElOVkFMSURfRFBCX1NJWkUpOworICAgIH0KKworICAgIC8qIHRoaXMgaXMgbm90ICJjb3JyZWN0IiByZXR1cm4gdmFsdWUhIEhvd2V2ZXIsIGl0IHJlc3VsdHMgaW4gZXJyb3IgaW4KKyAgICAgKiBkZWNvZGluZyBhbmQgdGhpcyB3YXMgZWFzaWVzdCBwbGFjZSB0byBjaGVjayBwaWN0dXJlIHNpemUgKi8KKyAgICBpZiAocGljU2l6ZUluTWJzID4gbWF4UGljU2l6ZUluTWJzKQorICAgICAgICByZXR1cm4oSU5WQUxJRF9EUEJfU0laRSk7CisKKyAgICB0bXAgLz0gKHBpY1NpemVJbk1icyozODQpOworCisgICAgcmV0dXJuKE1JTih0bXAsIDE2KSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXBhcmUgdHdvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTcHMxICAgcG9pbnRlciB0byBhIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHBTcHMyICAgcG9pbnRlciB0byBhbm90aGVyIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgMCAgICAgICBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcmUgZXF1YWwKKyAgICAgICAgICAgIDEgICAgICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3BzMSk7CisgICAgQVNTRVJUKHBTcHMyKTsKKworICAgIC8qIGZpcnN0IGNvbXBhcmUgcGFyYW1ldGVycyB3aG9zZSBleGlzdGVuY2UgZG9lcyBub3QgZGVwZW5kIG9uIG90aGVyCisgICAgICogcGFyYW1ldGVycyBhbmQgb25seSBjb21wYXJlIHRoZSByZXN0IG9mIHRoZSBwYXJhbXMgaWYgdGhlc2UgYXJlIGVxdWFsICovCisgICAgaWYgKHBTcHMxLT5wcm9maWxlSWRjICAgICAgICA9PSBwU3BzMi0+cHJvZmlsZUlkYyAmJgorICAgICAgICBwU3BzMS0+bGV2ZWxJZGMgICAgICAgICAgPT0gcFNwczItPmxldmVsSWRjICYmCisgICAgICAgIHBTcHMxLT5tYXhGcmFtZU51bSAgICAgICA9PSBwU3BzMi0+bWF4RnJhbWVOdW0gJiYKKyAgICAgICAgcFNwczEtPnBpY09yZGVyQ250VHlwZSAgID09IHBTcHMyLT5waWNPcmRlckNudFR5cGUgJiYKKyAgICAgICAgcFNwczEtPm51bVJlZkZyYW1lcyAgICAgID09IHBTcHMyLT5udW1SZWZGcmFtZXMgJiYKKyAgICAgICAgcFNwczEtPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyA9PQorICAgICAgICAgICAgcFNwczItPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyAmJgorICAgICAgICBwU3BzMS0+cGljV2lkdGhJbk1icyAgICAgPT0gcFNwczItPnBpY1dpZHRoSW5NYnMgJiYKKyAgICAgICAgcFNwczEtPnBpY0hlaWdodEluTWJzICAgID09IHBTcHMyLT5waWNIZWlnaHRJbk1icyAmJgorICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wcGluZ0ZsYWcgPT0gcFNwczItPmZyYW1lQ3JvcHBpbmdGbGFnICYmCisgICAgICAgIHBTcHMxLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPT0gcFNwczItPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIGlmIChwU3BzMS0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3BzMS0+bWF4UGljT3JkZXJDbnRMc2IgIT0gcFNwczItPm1heFBpY09yZGVyQ250THNiKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBTcHMxLT5waWNPcmRlckNudFR5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTcHMxLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNwczItPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5vZmZzZXRGb3JOb25SZWZQaWMgIT0gcFNwczItPm9mZnNldEZvck5vblJlZlBpYyB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICE9CisgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkIHx8CisgICAgICAgICAgICAgICAgcFNwczEtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSAhPQorICAgICAgICAgICAgICAgICAgICBwU3BzMi0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3BzMS0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChwU3BzMS0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV0gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5vZmZzZXRGb3JSZWZGcmFtZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFNwczEtPmZyYW1lQ3JvcHBpbmdGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNwczEtPmZyYW1lQ3JvcExlZnRPZmZzZXQgICAhPSBwU3BzMi0+ZnJhbWVDcm9wTGVmdE9mZnNldCB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BSaWdodE9mZnNldCAgIT0gcFNwczItPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcFRvcE9mZnNldCAgICAhPSBwU3BzMi0+ZnJhbWVDcm9wVG9wT2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCAhPSBwU3BzMi0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxOGRmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlCisgKiBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHByb2ZpbGVJZGM7CisgICAgdTMyIGxldmVsSWRjOworICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgbWF4RnJhbWVOdW07CisgICAgdTMyIHBpY09yZGVyQ250VHlwZTsKKyAgICB1MzIgbWF4UGljT3JkZXJDbnRMc2I7CisgICAgdTMyIGRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZzsKKyAgICBpMzIgb2Zmc2V0Rm9yTm9uUmVmUGljOworICAgIGkzMiBvZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkOworICAgIHUzMiBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7CisgICAgaTMyICpvZmZzZXRGb3JSZWZGcmFtZTsKKyAgICB1MzIgbnVtUmVmRnJhbWVzOworICAgIHUzMiBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWc7CisgICAgdTMyIHBpY1dpZHRoSW5NYnM7CisgICAgdTMyIHBpY0hlaWdodEluTWJzOworICAgIHUzMiBmcmFtZUNyb3BwaW5nRmxhZzsKKyAgICB1MzIgZnJhbWVDcm9wTGVmdE9mZnNldDsKKyAgICB1MzIgZnJhbWVDcm9wUmlnaHRPZmZzZXQ7CisgICAgdTMyIGZyYW1lQ3JvcFRvcE9mZnNldDsKKyAgICB1MzIgZnJhbWVDcm9wQm90dG9tT2Zmc2V0OworICAgIHUzMiB2dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWc7CisgICAgdnVpUGFyYW1ldGVyc190ICp2dWlQYXJhbWV0ZXJzOworICAgIHUzMiBtYXhEcGJTaXplOworfSBzZXFQYXJhbVNldF90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7CisKK3UzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzI4OGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhCisgICAgICAgICAgU2V0TWJQYXJhbXMKKyAgICAgICAgICBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9kYXRhLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBTZXRNYlBhcmFtcyhtYlN0b3JhZ2VfdCAqcE1iLCBzbGljZUhlYWRlcl90ICpwU2xpY2UsIHUzMiBzbGljZUlkLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4xICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBvbmUgc2xpY2UuIEZ1bmN0aW9uIGRlY29kZXMgc3RyZWFtIGRhdGEsIGkuZS4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIGFuZCBwb3NzaWJsZSBza2lwX3J1biBmaWVsZHMuIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBjYWxsZWQgdG8gaGFuZGxlIGFsbCBvdGhlciBtYWNyb2Jsb2NrIHJlbGF0ZWQgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIE1hY3JvYmxvY2sgdG8gc2xpY2UgZ3JvdXAgbWFwcGluZyBpcyBjb25zaWRlcmVkIHdoZW4gbmV4dAorICAgICAgICAgICAgbWFjcm9ibG9jayB0byBwcm9jZXNzIGlzIGRldGVybWluZWQgKGgyNjRic2ROZXh0TWJBZGRyZXNzIGZ1bmN0aW9uKQorICAgICAgICAgICAgbWFwCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBwcm9jZXNzZWQgcGljdHVyZSwgbmVlZGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhIHByZWRpY3Rpb24gb2YgdGhlIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwU2xpY2VIZWFkZXIgICAgcG9pbnRlciB0byBzbGljZSBoZWFkZXIgb2YgdGhlIGN1cnJlbnQgc2xpY2UKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHByb2Nlc3NlZCBtYWNyb2Jsb2NrcyBhcmUgd3JpdHRlbiB0byBjdXJyZW50IGltYWdlCisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgbWJTdG9yYWdlIHN0cnVjdHVyZSBvZiBlYWNoIHByb2Nlc3NlZCBtYWNyb2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXBkYXRlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEsIHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCisgICAgaW1hZ2VfdCAqY3VyckltYWdlLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTggbWJEYXRhWzM4NCArIDE1ICsgMzJdOworICAgIHU4ICpkYXRhOworICAgIHUzMiB0bXA7CisgICAgdTMyIHNraXBSdW47CisgICAgdTMyIHByZXZTa2lwcGVkOworICAgIHUzMiBjdXJyTWJBZGRyOworICAgIHUzMiBtb3JlTWJzOworICAgIHUzMiBtYkNvdW50OworICAgIGkzMiBxcFk7CisgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKKworICAgIC8qIGVuc3VyZSAxNi1ieXRlIGFsaWdubWVudCAqLworICAgIGRhdGEgPSAodTgqKUFMSUdOKG1iRGF0YSwgMTYpOworCisgICAgbWJMYXllciA9IHBTdG9yYWdlLT5tYkxheWVyOworCisgICAgY3Vyck1iQWRkciA9IHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2U7CisgICAgc2tpcFJ1biA9IDA7CisgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICAvKiBpbmNyZW1lbnQgc2xpY2UgaW5kZXgsIHdpbGwgYmUgb25lIGZvciBkZWNvZGluZyBvZiB0aGUgZmlyc3Qgc2xpY2Ugb2YKKyAgICAgKiB0aGUgcGljdHVyZSAqLworICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCsrOworCisgICAgLyogbGFzdE1iQWRkciBzdG9yZXMgYWRkcmVzcyBvZiB0aGUgbWFjcm9ibG9jayB0aGF0IHdhcyBsYXN0IHN1Y2Nlc3NmdWxseQorICAgICAqIGRlY29kZWQsIG5lZWRlZCBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgPSAwOworCisgICAgbWJDb3VudCA9IDA7CisgICAgLyogaW5pdGlhbCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGUgc2xpY2UgaXMgb2J0YWluZWQgYXMgdGhlIHN1bSBvZgorICAgICAqIGluaXRpYWwgUVAgZm9yIHRoZSBwaWN0dXJlIGFuZCBzbGljZVFwRGVsdGEgZm9yIHRoZSBjdXJyZW50IHNsaWNlICovCisgICAgcXBZID0gKGkzMilwU3RvcmFnZS0+YWN0aXZlUHBzLT5waWNJbml0UXAgKyBwU2xpY2VIZWFkZXItPnNsaWNlUXBEZWx0YTsKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogcHJpbWFyeSBwaWN0dXJlIGFuZCBhbHJlYWR5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBlcnJvciAqLworICAgICAgICBpZiAoIXBTbGljZUhlYWRlci0+cmVkdW5kYW50UGljQ250ICYmIHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIlByaW1hcnkgYW5kIGFscmVhZHkgZGVjb2RlZCIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICAgICAgU2V0TWJQYXJhbXMocFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgcFNsaWNlSGVhZGVyLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkLCBwU3RvcmFnZS0+YWN0aXZlUHBzLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworICAgICAgICBpZiAoIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXByZXZTa2lwcGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZza2lwUnVuKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgLyogc2tpcF9ydW4gc2hhbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAqIG1hY3JvYmxvY2tzIGxlZnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2tpcFJ1biA+IChwU3RvcmFnZS0+cGljU2l6ZUluTWJzIC0gY3Vyck1iQWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoInNraXBfcnVuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNraXBSdW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoJm1iTGF5ZXItPm1iUHJlZCwgMCwgc2l6ZW9mKG1iUHJlZF90KSk7CisgICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgY3VycmVudCBtYWNyb2Jsb2NrIHNraXBwZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgbWJMYXllci0+bWJUeXBlID0gUF9Ta2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChza2lwUnVuKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlNraXBwaW5nIG1hY3JvYmxvY2sgJWRcbiIsIGN1cnJNYkFkZHIpKTsKKyAgICAgICAgICAgIHNraXBSdW4tLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihwU3RybURhdGEsIG1iTGF5ZXIsCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgcFNsaWNlSGVhZGVyLT5zbGljZVR5cGUsCisgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIm1hY3JvYmxvY2tfbGF5ZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIG1iTGF5ZXIsCisgICAgICAgICAgICBjdXJySW1hZ2UsIHBTdG9yYWdlLT5kcGIsICZxcFksIGN1cnJNYkFkZHIsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLT5jb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIGRhdGEpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJNQUNST19CTE9DSyIpOworICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbmNyZW1lbnQgbWFjcm9ibG9jayBjb3VudCBvbmx5IGZvciBtYWNyb2Jsb2NrcyB0aGF0IHdlcmUgZGVjb2RlZAorICAgICAgICAgKiBmb3IgdGhlIGZpcnN0IHRpbWUgKHJlZHVuZGFudCBzbGljZXMpICovCisgICAgICAgIGlmIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCA9PSAxKQorICAgICAgICAgICAgbWJDb3VudCsrOworCisgICAgICAgIC8qIGtlZXAgb24gcHJvY2Vzc2luZyBhcyBsb25nIGFzIHRoZXJlIGlzIHN0cmVhbSBkYXRhIGxlZnQgb3IKKyAgICAgICAgICogcHJvY2Vzc2luZyBvZiBtYWNyb2Jsb2NrcyB0byBiZSBza2lwcGVkIGJhc2VkIG9uIHRoZSBsYXN0IHNraXBSdW4gaXMKKyAgICAgICAgICogbm90IGZpbmlzaGVkICovCisgICAgICAgIG1vcmVNYnMgPSAoaDI2NGJzZE1vcmVSYnNwRGF0YShwU3RybURhdGEpIHx8IHNraXBSdW4pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAvKiBsYXN0TWJBZGRyIGlzIG9ubHkgdXBkYXRlZCBmb3IgaW50cmEgc2xpY2VzIChhbGwgbWFjcm9ibG9ja3Mgb2YKKyAgICAgICAgICogaW50ZXIgc2xpY2VzIHdpbGwgYmUgbG9zdCBpbiBjYXNlIG9mIGFuIGVycm9yKSAqLworICAgICAgICBpZiAoSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCisgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgPSBjdXJyTWJBZGRyOworCisgICAgICAgIGN1cnJNYkFkZHIgPSBoMjY0YnNkTmV4dE1iQWRkcmVzcyhwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIGN1cnJNYkFkZHIpOworICAgICAgICAvKiBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciBidXQgbm8gbW9yZSBtYWNyb2Jsb2NrcyBmb3IgY3VycmVudCBzbGljZQorICAgICAgICAgKiBncm91cCAtPiBlcnJvciAqLworICAgICAgICBpZiAobW9yZU1icyAmJiAhY3Vyck1iQWRkcikKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJOZXh0IG1iIGFkZHJlc3MiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAobW9yZU1icyk7CisKKyAgICBpZiAoKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyArIG1iQ291bnQpID4gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKKyAgICB7CisgICAgICAgIEVQUklOVCgiTnVtIGRlY29kZWQgbWJzIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgKz0gbWJDb3VudDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMiAgRnVuY3Rpb246IFNldE1iUGFyYW1zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFNldCBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgdGhhdCByZW1haW4gY29uc3RhbnQgZm9yIHRoaXMgc2xpY2UKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU2xpY2UgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgc2xpY2UgaGVhZGVyCisgICAgICAgICAgICBzbGljZUlkICAgICBpZCBvZiB0aGUgY3VycmVudCBzbGljZQorICAgICAgICAgICAgY2hyb21hUXBJbmRleE9mZnNldAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RydWN0dXJlIHdoaWNoIGlzIHVwZGF0ZWQKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNldE1iUGFyYW1zKG1iU3RvcmFnZV90ICpwTWIsIHNsaWNlSGVhZGVyX3QgKnBTbGljZSwgdTMyIHNsaWNlSWQsCisgICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiB0bXAxOworICAgIGkzMiB0bXAyLCB0bXAzOworCisvKiBDb2RlICovCisKKyAgICB0bXAxID0gcFNsaWNlLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKKyAgICB0bXAyID0gcFNsaWNlLT5zbGljZUFscGhhQzBPZmZzZXQ7CisgICAgdG1wMyA9IHBTbGljZS0+c2xpY2VCZXRhT2Zmc2V0OworICAgIHBNYi0+c2xpY2VJZCA9IHNsaWNlSWQ7CisgICAgcE1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IHRtcDE7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRBID0gdG1wMjsKKyAgICBwTWItPmZpbHRlck9mZnNldEIgPSB0bXAzOworICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCA9IGNocm9tYVFwSW5kZXhPZmZzZXQ7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4zICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1hcmsgbWFjcm9ibG9ja3Mgb2YgdGhlIHNsaWNlIGNvcnJ1cHRlZC4gSWYgbGFzdE1iQWRkciBpbiB0aGUgc2xpY2UKKyAgICAgICAgICAgIHN0b3JhZ2UgaXMgc2V0IC0+IHBpY1dpZGh0SW5NYnMgKG9yIGF0IGxlYXN0IDEwKSBtYWNyb2Jsb2NrcyBiYWNrCisgICAgICAgICAgICBmcm9tICB0aGUgbGFzdE1iQWRkciBhcmUgbWFya2VkIGNvcnJ1cHRlZC4gSG93ZXZlciwgaWYgbGFzdE1iQWRkcgorICAgICAgICAgICAgaXMgbm90IHNldCAtPiBhbGwgbWFjcm9ibG9ja3Mgb2YgdGhlIHNsaWNlIGFyZSBtYXJrZWQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZpcnN0TWJJblNsaWNlICBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIGluIHRoZSBzbGljZSwgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIHNsaWNlIHRvIGJlIG1hcmtlZCBjb3JydXB0ZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIG1iU3RvcmFnZSBmb3IgdGhlIGNvcnJ1cHRlZCBtYWNyb2Jsb2NrcyB1cGRhdGVkCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBmaXJzdE1iSW5TbGljZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworICAgIHUzMiBzbGljZUlkOworICAgIHUzMiBjdXJyTWJBZGRyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChmaXJzdE1iSW5TbGljZSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOworCisgICAgY3Vyck1iQWRkciA9IGZpcnN0TWJJblNsaWNlOworCisgICAgc2xpY2VJZCA9IHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZDsKKworICAgIC8qIERlY29kZVNsaWNlRGF0YSBzZXRzIGxhc3RNYkFkZHIgZm9yIEkgc2xpY2VzIC0+IGlmIGl0IHdhcyBzZXQsIGdvIGJhY2sKKyAgICAgKiBNQVgocGljV2lkdGhJbk1icywgMTApIG1hY3JvYmxvY2tzIGFuZCBzdGFydCBtYXJraW5nIGZyb20gdGhlcmUgKi8KKyAgICBpZiAocFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHBTdG9yYWdlLT5tYltwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHJdLnNsaWNlSWQgPT0gc2xpY2VJZCk7CisgICAgICAgIGkgPSBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgLSAxOworICAgICAgICB0bXAgPSAwOworICAgICAgICB3aGlsZSAoaSA+IGN1cnJNYkFkZHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+bWJbaV0uc2xpY2VJZCA9PSBzbGljZUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIGlmICh0bXAgPj0gTUFYKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsIDEwKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpLS07CisgICAgICAgIH0KKyAgICAgICAgY3Vyck1iQWRkciA9IGk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisKKyAgICAgICAgaWYgKCAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLnNsaWNlSWQgPT0gc2xpY2VJZCkgJiYKKyAgICAgICAgICAgICAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQpICkKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3Vyck1iQWRkciA9IGgyNjRic2ROZXh0TWJBZGRyZXNzKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgY3Vyck1iQWRkcik7CisKKyAgICB9IHdoaWxlIChjdXJyTWJBZGRyKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjNkNDllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0RBVEFfSAorI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfREFUQV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlcik7CisKK3ZvaWQgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgZmlyc3RNYkluU2xpY2UpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9EQVRBX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjYmI1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMKQEAgLTAsMCArMSw1ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBEZWNvZGVJbnRlcmxlYXZlZE1hcAorICAgICAgICAgIERlY29kZURpc3BlcnNlZE1hcAorICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcAorICAgICAgICAgIERlY29kZUJveE91dE1hcAorICAgICAgICAgIERlY29kZVJhc3RlclNjYW5NYXAKKyAgICAgICAgICBEZWNvZGVXaXBlTWFwCisgICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBEZWNvZGVJbnRlcmxlYXZlZE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyICpydW5MZW5ndGgsCisgIHUzMiBwaWNTaXplKTsKKworc3RhdGljIHZvaWQgRGVjb2RlRGlzcGVyc2VkTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCitzdGF0aWMgdm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqdG9wTGVmdCwKKyAgdTMyICpib3R0b21SaWdodCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KTsKKworc3RhdGljIHZvaWQgRGVjb2RlQm94T3V0TWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgdW5pdHNJblNsaWNlR3JvdXAwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCitzdGF0aWMgdm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgIHUzMiBwaWNTaXplKTsKKworc3RhdGljIHZvaWQgRGVjb2RlV2lwZU1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUludGVybGVhdmVkTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBpbnRlcmxlYXZlZCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQorICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgMC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCisgICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICAgICAgICAgICAgcnVuTGVuZ3RoICAgICAgIHJ1bl9sZW5ndGhbXSB2YWx1ZXMgZm9yIGVhY2ggc2xpY2UgZ3JvdXAKKyAgICAgICAgICAgIHBpY1NpemUgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlSW50ZXJsZWF2ZWRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqcnVuTGVuZ3RoLAorICB1MzIgcGljU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSxqLCBncm91cDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOworICAgIEFTU0VSVChydW5MZW5ndGgpOworCisgICAgaSA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG51bVNsaWNlR3JvdXBzICYmIGkgPCBwaWNTaXplOworICAgICAgICAgIGkgKz0gcnVuTGVuZ3RoW2dyb3VwKytdKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQocnVuTGVuZ3RoW2dyb3VwXSA8PSBwaWNTaXplKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW5MZW5ndGhbZ3JvdXBdICYmIGkgKyBqIDwgcGljU2l6ZTsgaisrKQorICAgICAgICAgICAgICAgIG1hcFtpK2pdID0gZ3JvdXA7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpIDwgcGljU2l6ZSk7CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZURpc3BlcnNlZE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgZGlzcGVyc2VkIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCisgICAgICAgICAgICBncm91cCBtYXAgdHlwZSAxLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVEaXNwZXJzZWRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgcGljU2l6ZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICBtYXBbaV0gPSAoKGkgJSBwaWNXaWR0aCkgKyAoKChpIC8gcGljV2lkdGgpICogbnVtU2xpY2VHcm91cHMpID4+IDEpKSAlCisgICAgICAgICAgICBudW1TbGljZUdyb3VwczsKKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBmb3JlZ3JvdW5kIHdpdGggbGVmdC1vdmVyIHNsaWNlIGdyb3VwIG1hcCB0eXBlLAorICAgICAgICAgICAgaS5lLiBzbGljZSBncm91cCBtYXAgdHlwZSAyLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICAgICAgICAgICAgdG9wTGVmdCAgICAgICAgICAgdG9wX2xlZnRbXSB2YWx1ZXMKKyAgICAgICAgICAgIGJvdHRvbVJpZ2h0ICAgICAgIGJvdHRvbV9yaWdodFtdIHZhbHVlcworICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqdG9wTGVmdCwKKyAgdTMyICpib3R0b21SaWdodCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLHkseCx5VG9wTGVmdCx5Qm90dG9tUmlnaHQseFRvcExlZnQseEJvdHRvbVJpZ2h0LCBwaWNTaXplOworICAgIHUzMiBncm91cDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOworICAgIEFTU0VSVCh0b3BMZWZ0KTsKKyAgICBBU1NFUlQoYm90dG9tUmlnaHQpOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICBtYXBbaV0gPSBudW1TbGljZUdyb3VwcyAtIDE7CisKKyAgICBmb3IgKGdyb3VwID0gbnVtU2xpY2VHcm91cHMgLSAxOyBncm91cC0tOyApCisgICAgeworICAgICAgICBBU1NFUlQoIHRvcExlZnRbZ3JvdXBdIDw9IGJvdHRvbVJpZ2h0W2dyb3VwXSAmJgorICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0W2dyb3VwXSA8IHBpY1NpemUgKTsKKyAgICAgICAgeVRvcExlZnQgPSB0b3BMZWZ0W2dyb3VwXSAvIHBpY1dpZHRoOworICAgICAgICB4VG9wTGVmdCA9IHRvcExlZnRbZ3JvdXBdICUgcGljV2lkdGg7CisgICAgICAgIHlCb3R0b21SaWdodCA9IGJvdHRvbVJpZ2h0W2dyb3VwXSAvIHBpY1dpZHRoOworICAgICAgICB4Qm90dG9tUmlnaHQgPSBib3R0b21SaWdodFtncm91cF0gJSBwaWNXaWR0aDsKKyAgICAgICAgQVNTRVJUKHhUb3BMZWZ0IDw9IHhCb3R0b21SaWdodCk7CisKKyAgICAgICAgZm9yICh5ID0geVRvcExlZnQ7IHkgPD0geUJvdHRvbVJpZ2h0OyB5KyspCisgICAgICAgICAgICBmb3IgKHggPSB4VG9wTGVmdDsgeCA8PSB4Qm90dG9tUmlnaHQ7IHgrKykKKyAgICAgICAgICAgICAgICBtYXBbIHkgKiBwaWNXaWR0aCArIHggXSA9IGdyb3VwOworICAgIH0KKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlQm94T3V0TWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBib3gtb3V0IHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwCisgICAgICAgICAgICBtYXAgdHlwZSAzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKKyAgICAgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCAgICAgICAgICAgICAgICBtYnMgb24gc2xpY2UgZ3JvdXAgMAorICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVCb3hPdXRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiB1bml0c0luU2xpY2VHcm91cDAsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaywgcGljU2l6ZTsKKyAgICBpMzIgeCwgeSwgeERpciwgeURpciwgbGVmdEJvdW5kLCB0b3BCb3VuZCwgcmlnaHRCb3VuZCwgYm90dG9tQm91bmQ7CisgICAgdTMyIG1hcFVuaXRWYWNhbnQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisgICAgQVNTRVJUKHVuaXRzSW5TbGljZUdyb3VwMCA8PSBwaWNTaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgIG1hcFtpXSA9IDE7CisKKyAgICB4ID0gKHBpY1dpZHRoIC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZykgPj4gMTsKKyAgICB5ID0gKHBpY0hlaWdodCAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcpID4+IDE7CisKKyAgICBsZWZ0Qm91bmQgPSB4OworICAgIHRvcEJvdW5kID0geTsKKworICAgIHJpZ2h0Qm91bmQgPSB4OworICAgIGJvdHRvbUJvdW5kID0geTsKKworICAgIHhEaXIgPSAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKKyAgICB5RGlyID0gKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKworICAgIGZvciAoayA9IDA7IGsgPCB1bml0c0luU2xpY2VHcm91cDA7IGsgKz0gbWFwVW5pdFZhY2FudCA/IDEgOiAwKQorICAgIHsKKyAgICAgICAgbWFwVW5pdFZhY2FudCA9IChtYXBbICh1MzIpeSAqIHBpY1dpZHRoICsgKHUzMil4IF0gPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIGlmIChtYXBVbml0VmFjYW50KQorICAgICAgICAgICAgbWFwWyAodTMyKXkgKiBwaWNXaWR0aCArICh1MzIpeCBdID0gMDsKKworICAgICAgICBpZiAoeERpciA9PSAtMSAmJiB4ID09IGxlZnRCb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgbGVmdEJvdW5kID0gTUFYKGxlZnRCb3VuZCAtIDEsIDApOworICAgICAgICAgICAgeCA9IGxlZnRCb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAwOworICAgICAgICAgICAgeURpciA9IDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh4RGlyID09IDEgJiYgeCA9PSByaWdodEJvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICByaWdodEJvdW5kID0gTUlOKHJpZ2h0Qm91bmQgKyAxLCAoaTMyKXBpY1dpZHRoIC0gMSk7CisgICAgICAgICAgICB4ID0gcmlnaHRCb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAwOworICAgICAgICAgICAgeURpciA9IDEgLSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh5RGlyID09IC0xICYmIHkgPT0gdG9wQm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvcEJvdW5kID0gTUFYKHRvcEJvdW5kIC0gMSwgMCk7CisgICAgICAgICAgICB5ID0gdG9wQm91bmQ7CisgICAgICAgICAgICB4RGlyID0gMSAtIDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworICAgICAgICAgICAgeURpciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeURpciA9PSAxICYmIHkgPT0gYm90dG9tQm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvdHRvbUJvdW5kID0gTUlOKGJvdHRvbUJvdW5kICsgMSwgKGkzMilwaWNIZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIHkgPSBib3R0b21Cb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7CisgICAgICAgICAgICB5RGlyID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0geERpcjsKKyAgICAgICAgICAgIHkgKz0geURpcjsKKyAgICAgICAgfQorICAgIH0KKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmFzdGVyU2Nhbk1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcmFzdGVyIHNjYW4gc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKKyAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZworICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgICAgICAgICAgICAgIG1icyBpbiB1cHBlckxlZnRHcm91cAorICAgICAgICAgICAgcGljU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgIHUzMiBwaWNTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQocGljU2l6ZSk7CisgICAgQVNTRVJUKHNpemVPZlVwcGVyTGVmdEdyb3VwIDw9IHBpY1NpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKKyAgICAgICAgaWYgKGkgPCBzaXplT2ZVcHBlckxlZnRHcm91cCkKKyAgICAgICAgICAgIG1hcFtpXSA9ICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hcFtpXSA9IDEgLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVXaXBlTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSB3aXBlIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwIG1hcAorICAgICAgICAgICAgdHlwZSA1LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKKyAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwICAgICAgICAgICAgICBtYnMgaW4gdXBwZXJMZWZ0R3JvdXAKKyAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlV2lwZU1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksaixrOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNIZWlnaHQpOworICAgIEFTU0VSVChzaXplT2ZVcHBlckxlZnRHcm91cCA8PSBwaWNXaWR0aCAqIHBpY0hlaWdodCk7CisKKyAgICBrID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgcGljV2lkdGg7IGorKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpY0hlaWdodDsgaSsrKQorICAgICAgICAgICAgaWYgKGsrKyA8IHNpemVPZlVwcGVyTGVmdEdyb3VwKQorICAgICAgICAgICAgICAgIG1hcFsgaSAqIHBpY1dpZHRoICsgaiBdID0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXBbIGkgKiBwaWNXaWR0aCArIGogXSA9IDEgLQorICAgICAgICAgICAgICAgICAgICAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgbWFjcm9ibG9jayB0byBzbGljZSBncm91cCBtYXAuIENvbnN0cnVjdGlvbgorICAgICAgICAgICAgb2YgZGlmZmVyZW50IHNsaWNlIGdyb3VwIG1hcCB0eXBlcyBpcyBoYW5kbGVkIGJ5IHNlcGFyYXRlCisgICAgICAgICAgICBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzIGhvdyBzbGljZSBncm91cAorICAgICAgICAgICAgbWFwcyBhcmUgY29tcHV0ZWQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcHBzICAgICAgICAgICAgICAgICAgICAgYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZUN5Y2xlICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAorICB1MzIgKm1hcCwKKyAgcGljUGFyYW1TZXRfdCAqcHBzLAorICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHBpY1NpemUsIHVuaXRzSW5TbGljZUdyb3VwMCA9IDAsIHNpemVPZlVwcGVyTGVmdEdyb3VwID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKHBwcyk7CisgICAgQVNTRVJUKHBpY1dpZHRoKTsKKyAgICBBU1NFUlQocGljSGVpZ2h0KTsKKyAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDcpOworCisgICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OworCisgICAgLyoganVzdCBvbmUgc2xpY2UgZ3JvdXAgLT4gYWxsIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBncm91cCAwICovCisgICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPT0gMSkKKyAgICB7CisgICAgICAgIEgyNjRTd0RlY01lbXNldChtYXAsIDAsIHBpY1NpemUgKiBzaXplb2YodTMyKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA+IDIgJiYgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDYpCisgICAgeworICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSAmJgorICAgICAgICAgICAgICAgcHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA8PSBwaWNTaXplKTsKKworICAgICAgICB1bml0c0luU2xpY2VHcm91cDAgPQorICAgICAgICAgICAgTUlOKHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSAqIHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUsIHBpY1NpemUpOworCisgICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDQgfHwgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA1KQorICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPSBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnID8KKyAgICAgICAgICAgICAgICAocGljU2l6ZSAtIHVuaXRzSW5TbGljZUdyb3VwMCkgOiB1bml0c0luU2xpY2VHcm91cDA7CisgICAgfQorCisgICAgc3dpdGNoIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgRGVjb2RlSW50ZXJsZWF2ZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLAorICAgICAgICAgICAgICBwcHMtPnJ1bkxlbmd0aCwgcGljU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBEZWNvZGVEaXNwZXJzZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLCBwaWNXaWR0aCwKKyAgICAgICAgICAgICAgcGljSGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsCisgICAgICAgICAgICAgIHBwcy0+dG9wTGVmdCwgcHBzLT5ib3R0b21SaWdodCwgcGljV2lkdGgsIHBpY0hlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBEZWNvZGVCb3hPdXRNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICAgICAgICAgICAgICB1bml0c0luU2xpY2VHcm91cDAsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgRGVjb2RlUmFzdGVyU2Nhbk1hcChtYXAsCisgICAgICAgICAgICAgIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICAgICAgICAgICAgICBwaWNTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERlY29kZVdpcGVNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICAgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCwgcGljV2lkdGgsIHBpY0hlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkW2ldIDwgcHBzLT5udW1TbGljZUdyb3Vwcyk7CisgICAgICAgICAgICAgICAgbWFwW2ldID0gcHBzLT5zbGljZUdyb3VwSWRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiY2I2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSAorI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAoCisgIHUzMiAqbWFwLAorICBwaWNQYXJhbVNldF90ICpwcHMsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2M2ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCkBAIC0wLDAgKzEsMTUxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcgorICAgICAgICAgIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKKyAgICAgICAgICBSZWZQaWNMaXN0UmVvcmRlcmluZworICAgICAgICAgIERlY1JlZlBpY01hcmtpbmcKKyAgICAgICAgICBDaGVja1Bwc0lkCisgICAgICAgICAgQ2hlY2tGcmFtZU51bQorICAgICAgICAgIENoZWNrSWRyUGljSWQKKyAgICAgICAgICBDaGVja1BpY09yZGVyQ250THNiCisgICAgICAgICAgQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCisgICAgICAgICAgQ2hlY2tEZWx0YVBpY09yZGVyQ250CisgICAgICAgICAgQ2hlY2tSZWR1bmRhbnRQaWNDbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICosIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKiwKKyAgICB1MzIsIHUzMik7CisKK3N0YXRpYyB1MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLAorICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7CisKK3N0YXRpYyB1MzIgRGVjUmVmUGljTWFya2luZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgZGVjUmVmUGljTWFya2luZ190ICpwRGVjUmVmUGljTWFya2luZywgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgICB1MzIgbnVtUmVmRnJhbWVzKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBzbGljZSBoZWFkZXIgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgcE5hbFVuaXQgICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBOQUwgdW5pdCBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAorICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAorICAgIG5hbFVuaXRfdCAqcE5hbFVuaXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisgICAgdTMyIHBpY1NpemVJbk1iczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTbGljZUhlYWRlcik7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisgICAgQVNTRVJUKCBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFIHx8CisgICAgICAgICAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiApOworCisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFNsaWNlSGVhZGVyLCAwLCBzaXplb2Yoc2xpY2VIZWFkZXJfdCkpOworCisgICAgcGljU2l6ZUluTWJzID0gcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1iczsKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlID0gdmFsdWU7CisgICAgaWYgKHZhbHVlID49IHBpY1NpemVJbk1icykKKyAgICB7CisgICAgICAgIEVQUklOVCgiZmlyc3RfbWJfaW5fc2xpY2UiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlID0gdmFsdWU7CisgICAgLyogc2xpY2UgdHlwZSBoYXMgdG8gYmUgZWl0aGVyIEkgb3IgUCBzbGljZS4gUCBzbGljZSBpcyBub3QgYWxsb3dlZCB3aGVuCisgICAgICogY3VycmVudCBOQUwgdW5pdCBpcyBhbiBJRFIgTkFMIHVuaXQgb3IgbnVtX3JlZl9mcmFtZXMgaXMgMCAqLworICAgIGlmICggIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpICYmCisgICAgICAgICAoICFJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSB8fAorICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpIHx8CisgICAgICAgICAgICFwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyApICkKKyAgICB7CisgICAgICAgIEVQUklOVCgic2xpY2VfdHlwZSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNsaWNlSGVhZGVyLT5waWNQYXJhbWV0ZXJTZXRJZCA9IHZhbHVlOworICAgIGlmIChwU2xpY2VIZWFkZXItPnBpY1BhcmFtZXRlclNldElkICE9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYgdG1wICE9IDApCisgICAgeworICAgICAgICBFUFJJTlQoImZyYW1lX251bSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gPSB0bXA7CisKKyAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBTbGljZUhlYWRlci0+aWRyUGljSWQgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHZhbHVlID4gNjU1MzUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiaWRyX3BpY19pZCIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGktLTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGkpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPSB0bXA7CisKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tID0gaXRtcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIHRoYXQgcGljT3JkZXJDbnQgZm9yIElEUiBwaWN0dXJlIHdpbGwgYmUgemVyby4gU2VlCisgICAgICAgICAqIERlY29kZVBpY09yZGVyQ250IGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGhlcmUgKi8KKyAgICAgICAgaWYgKCBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmCisgICAgICAgICAgICAgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA+CisgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYi8yKSB8fAorICAgICAgICAgICAgICAgIE1JTigoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IsCisgICAgICAgICAgICAgICAgICAgIChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiArCisgICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSkgIT0gMCApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkgJiYKKyAgICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyApCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0gPSBpdG1wOworCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSA9IGl0bXA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayB0aGF0IHBpY09yZGVyQ250IGZvciBJRFIgcGljdHVyZSB3aWxsIGJlIHplcm8uIFNlZQorICAgICAgICAgKiBEZWNvZGVQaWNPcmRlckNudCBmdW5jdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBoZXJlICovCisgICAgICAgIGlmICggSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJgorICAgICAgICAgICAgIE1JTihwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0sCisgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSArCisgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCisgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCA9IHZhbHVlOworICAgICAgICBpZiAodmFsdWUgPiAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgicmVkdW5kYW50X3BpY19jbnQiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWcgPSB0bXA7CisKKyAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+bnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPiAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlID0gdmFsdWUgKyAxOworICAgICAgICB9CisgICAgICAgIC8qIHNldCBudW1SZWZJZHhMMEFjdGl2ZSBmcm9tIHBpYyBwYXJhbSBzZXQgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiB2YWx1ZSAobWludXMxKSBpbiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgZXhjZWVkcyAxNSBpdCBzaG91bGQKKyAgICAgICAgICAgICAqIGhhdmUgYmVlbiBvdmVycmlkZGVuIGhlcmUgKi8KKyAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlID4gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyIpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUgPSBwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKElTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQorICAgIHsKKyAgICAgICAgdG1wID0gUmVmUGljTGlzdFJlb3JkZXJpbmcocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTbGljZUhlYWRlci0+cmVmUGljTGlzdFJlb3JkZXJpbmcsCisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlLAorICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgIT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IERlY1JlZlBpY01hcmtpbmcocFN0cm1EYXRhLCAmcFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLAorICAgICAgICAgICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlLCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgLyogZGVjb2RlIHNsaWNlUXBEZWx0YSBhbmQgY2hlY2sgdGhhdCBpbml0aWFsIFFQIGZvciB0aGUgc2xpY2Ugd2lsbCBiZSBvbgorICAgICAqIHRoZSByYW5nZSBbMCwgNTFdICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGEgPSBpdG1wOworICAgIGl0bXAgKz0gKGkzMilwUGljUGFyYW1TZXQtPnBpY0luaXRRcDsKKyAgICBpZiAoIChpdG1wIDwgMCkgfHwgKGl0bXAgPiA1MSkgKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzbGljZV9xcF9kZWx0YSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgaWYgKHBQaWNQYXJhbVNldC0+ZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPiAyKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoImRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBpZiAoIChpdG1wIDwgLTYpIHx8IChpdG1wID4gNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiIpOworICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUFscGhhQzBPZmZzZXQgPSBpdG1wICogMjsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgaWYgKCAoaXRtcCA8IC02KSB8fCAoaXRtcCA+IDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfYmV0YV9vZmZzZXRfZGl2MiIpOworICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUJldGFPZmZzZXQgPSBpdG1wICogMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKSAmJgorICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPj0gMykgJiYKKyAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlIDw9IDUpICkKKyAgICB7CisgICAgICAgIC8qIHNldCB0bXAgdG8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCisgICAgICAgICAqIGluIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgdG1wID0gTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyhwaWNTaXplSW5NYnMsCisgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKKyAgICAgICAgdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRtcCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSA9IHZhbHVlOworCisgICAgICAgIC8qIGNvcnJlc3BvbmRzIHRvIHRtcCA9IENlaWwocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUpICovCisgICAgICAgIHRtcCA9IChwaWNTaXplSW5NYnMgKyBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlIC0gMSkgLworICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUgPiB0bXApCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQKKyAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpbiB0aGUgc3RyZWFtLiBUaGUgc3RhbmRhcmQgc3RhdGVzIHRoYXQKKyAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpcyByZXByZXNlbnRlZCBieQorICAgICAgICAgICAgICAgIENlaWwoIExvZzIoIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkgKyAxKSApCisKKyAgICAgICAgICAgIGJpdHMuIERpdmlzaW9uICIvIiBpbiB0aGUgZXF1YXRpb24gaXMgbm9uLXRydW5jYXRpbmcgZGl2aXNpb24uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlUmF0ZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIG5lZWRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLCB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCxudW1CaXRzLG1hc2s7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVChzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7CisgICAgQVNTRVJUKHNsaWNlR3JvdXBDaGFuZ2VSYXRlIDw9IHBpY1NpemVJbk1icyk7CisKKyAgICAvKiBjb21wdXRlIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSArIDEpLCByb3VuZGVkIHVwICovCisgICAgaWYgKHBpY1NpemVJbk1icyAlIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKQorICAgICAgICB0bXAgPSAyICsgcGljU2l6ZUluTWJzL3NsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgIGVsc2UKKyAgICAgICAgdG1wID0gMSArIHBpY1NpemVJbk1icy9zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKKworICAgIG51bUJpdHMgPSAwOworICAgIG1hc2sgPSB+MFU7CisKKyAgICAvKiBzZXQgbnVtQml0cyB0byBwb3NpdGlvbiBvZiByaWdodC1tb3N0IG5vbi16ZXJvIGJpdCAqLworICAgIHdoaWxlICh0bXAgJiAobWFzazw8KytudW1CaXRzKSkKKyAgICAgICAgOworICAgIG51bUJpdHMtLTsKKworICAgIC8qIGFkZCBvbmUgbW9yZSBiaXQgaWYgdmFsdWUgZ3JlYXRlciB0aGFuIDJebnVtQml0cyAqLworICAgIGlmICh0bXAgJiAoKDE8PG51bUJpdHMpLTEpKQorICAgICAgICBudW1CaXRzKys7CisKKyAgICByZXR1cm4obnVtQml0cyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBSZWZQaWNMaXN0UmVvcmRlcmluZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCisgICAgICAgICAgICB0aGUgc3RyZWFtLiBNYXggbnVtYmVyIG9mIHJlb3JkZXJpbmcgY29tbWFuZHMgaXMgbnVtUmVmSWR4QWN0aXZlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbnVtUmVmSWR4QWN0aXZlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlIGluZGljZXMgdG8gYmUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNsaWNlCisgICAgICAgICAgICBtYXhQaWNOdW0gICAgICAgbWF4RnJhbWVOdW0gZnJvbSB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmcgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqcFJlZlBpY0xpc3RSZW9yZGVyaW5nLCB1MzIgbnVtUmVmSWR4QWN0aXZlLAorICAgIHUzMiBtYXhQaWNOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgdTMyIGNvbW1hbmQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVmUGljTGlzdFJlb3JkZXJpbmcpOworICAgIEFTU0VSVChudW1SZWZJZHhBY3RpdmUpOworICAgIEFTU0VSVChtYXhQaWNOdW0pOworCisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCA9IHRtcDsKKworICAgIGlmIChwUmVmUGljTGlzdFJlb3JkZXJpbmctPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQorICAgIHsKKyAgICAgICAgaSA9IDA7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiBudW1SZWZJZHhBY3RpdmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSByZW9yZGVyaW5nIGNvbW1hbmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29tbWFuZCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID4gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoInJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA9IGNvbW1hbmQ7CisKKyAgICAgICAgICAgIGlmICgoY29tbWFuZCA9PSAwKSB8fCAoY29tbWFuZCA9PSAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gbWF4UGljTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJhYnNfZGlmZl9waWNfbnVtX21pbnVzMSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtID0gdmFsdWUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0gd2hpbGUgKGNvbW1hbmQgIT0gMyk7CisKKyAgICAgICAgLyogdGhlcmUgc2hhbGwgYmUgYXQgbGVhc3Qgb25lIHJlb3JkZXJpbmcgY29tbWFuZCBpZgorICAgICAgICAgKiByZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCB3YXMgc2V0ICovCisgICAgICAgIGlmIChpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgicmVmX3BpY19saXN0X3Jlb3JkZXJpbmciKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjUmVmUGljTWFya2luZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCisgICAgICAgICAgICB0aGUgc3RyZWFtLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKyAgICAgICAgICAgIG51bVJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgZnJvbSB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZyAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY1JlZlBpY01hcmtpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIGRlY1JlZlBpY01hcmtpbmdfdCAqcERlY1JlZlBpY01hcmtpbmcsIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgICAgdTMyIG51bVJlZkZyYW1lcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZTsKKyAgICB1MzIgaTsKKyAgICB1MzIgb3BlcmF0aW9uOworICAgIC8qIHZhcmlhYmxlcyBmb3IgZXJyb3IgY2hlY2tpbmcgcHVycG9zZXMsIHN0b3JlIG51bWJlciBvZiBtZW1vcnkKKyAgICAgKiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgY2VydGFpbiB0eXBlICovCisgICAgdTMyIG51bTQgPSAwLCBudW01ID0gMCwgbnVtNiA9IDAsIG51bTF0bzMgPSAwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgfHwKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRSB8fAorICAgICAgICAgICAgbmFsVW5pdFR5cGUgPT0gTkFMX1NFSSApOworCisKKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZyA9IHRtcDsKKyAgICAgICAgaWYgKCFudW1SZWZGcmFtZXMgJiYgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWciKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZyA9IHRtcDsKKyAgICAgICAgaWYgKHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNlZSBleHBsYW5hdGlvbiBvZiB0aGUgTUFYX05VTV9NTUNfT1BFUkFUSU9OUyBpbgorICAgICAgICAgICAgICAgICAqIHNsaWNlX2hlYWRlci5oICovCisgICAgICAgICAgICAgICAgaWYgKGkgPiAoMiAqIG51bVJlZkZyYW1lcyArIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID4gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgibWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDEpIHx8IChvcGVyYXRpb24gPT0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDMpIHx8IChvcGVyYXRpb24gPT0gNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHNoYWxsIGJlIGluIHJhbmdlIFswLCBudW1SZWZGcmFtZXNdICovCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IG51bVJlZkZyYW1lcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvbmdUZXJtRnJhbWVJZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMb25nVGVybUZyYW1lSWR4ID0gdmFsdWUgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG51bTQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtNSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uICYmIG9wZXJhdGlvbiA8PSAzKQorICAgICAgICAgICAgICAgICAgICBudW0xdG8zKys7CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA2KQorICAgICAgICAgICAgICAgICAgICBudW02Kys7CisKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9IHdoaWxlIChvcGVyYXRpb24gIT0gMCk7CisKKyAgICAgICAgICAgIC8qIGVycm9yIGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAobnVtNCA+IDEgfHwgbnVtNSA+IDEgfHwgbnVtNiA+IDEgfHwgKG51bTF0bzMgJiYgbnVtNSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDaGVja1Bwc0lkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcGljX3BhcmFtZXRlcl9zZXRfaWQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgorICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKKyAgICAgICAgICAgIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwaWNQYXJhbVNldElkICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcGljUGFyYW1TZXRJZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAqcGljUGFyYW1TZXRJZCA9IHZhbHVlOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tGcmFtZU51bQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGZyYW1lX251bSBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90CisgICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCisgICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBtYXhGcmFtZU51bQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBmcmFtZU51bSAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tGcmFtZU51bSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiAqZnJhbWVOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQoZnJhbWVOdW0pOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAobWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAqZnJhbWVOdW0gPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0lkclBpY0lkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgaWRyX3BpY19pZCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90CisgICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCisgICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlciBmcm9tIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGlkclBpY0lkICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICppZHJQaWNJZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQobWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChpZHJQaWNJZCk7CisKKyAgICAvKiBuYWxVbml0VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDUgYmVjYXVzZSBvdGhlcndpc2UgaWRyUGljSWQgaXMgbm90CisgICAgICogcHJlc2VudCAqLworICAgIGlmIChuYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChtYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBpZHJfcGljX2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCBpZHJQaWNJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHBpY19vcmRlcl9jbnRfbHNiIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KKyAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCisgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCisgICAgICAgICAgICBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBpY09yZGVyQ250THNiICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICpwaWNPcmRlckNudExzYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocGljT3JkZXJDbnRMc2IpOworCisgICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMCAqLworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgKnBpY09yZGVyQ250THNiID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgorICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZQorICAgICAgICAgICAgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQorICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbSAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgaTMyICpkZWx0YVBpY09yZGVyQ250Qm90dG9tKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKKworICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDAgYW5kIHBpY09yZGVyUHJlc2VudEZsYWcgbXVzdCBiZSBUUlVFCisgICAgICogKi8KKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsIGRlbHRhUGljT3JkZXJDbnRCb3R0b20pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlcyBkZWx0YV9waWNfb3JkZXJfY250WzBdIGFuZCBkZWx0YV9waWNfb3JkZXJfY250WzFdCisgICAgICAgICAgICBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbQorICAgICAgICAgICAgcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlCisgICAgICAgICAgICB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgICAgICAgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgICAgICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisgICAgICAgICAgICBwaWNPcmRlclByZXNlbnRGbGFnICAgICBmbGFnIGluZGljYXRpbmcgaWYgZGVsdGFfcGljX29yZGVyX2NudFsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpbiB0aGUgc3RyZWFtCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnQgICAgICAgIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnLAorICBpMzIgKmRlbHRhUGljT3JkZXJDbnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKGRlbHRhUGljT3JkZXJDbnQpOworCisgICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMSBhbmQgZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIG11c3QKKyAgICAgKiBiZSBGQUxTRSAqLworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKTsKKyAgICBBU1NFUlQoIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLworICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFswXSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCisgICAgaWYgKHBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFsxXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiByZWR1bmRhbnRfcGljX2NudCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCisgICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQorICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZworICAgICAgICAgICAgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgUFBTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICByZWR1bmRhbnRQaWNDbnQgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcmVkdW5kYW50UGljQ250KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIGkzMiBpdmFsdWU7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisgICAgQVNTRVJUKHJlZHVuZGFudFBpY0NudCk7CisKKyAgICAvKiByZWR1bmRhbnRfcGljX2NudF9mbGFnIG11c3QgYmUgVFJVRSAqLworICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID4gMCB8fAorICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGktLTsKKworICAgICAgICAvKiBwaWNfb3JkZXJfY250X2xzYiAqLworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKKyAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKKyAgICB7CisgICAgICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWR1bmRhbnRfcGljX2NudCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgcmVkdW5kYW50UGljQ250KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgorICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzCisgICAgICAgICAgICB0aGUgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQorICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFBQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKmxpbnQgLWU3MTUgZGlzYWJsZSBsaW50IGluZm8gbmFsVW5pdFR5cGUgbm90IHJlZmVyZW5jZWQgKi8KK3UzMiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKHUzMiAqIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RybURhdGFfdCAqIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcVBhcmFtU2V0X3QgKiBwU2VxUGFyYW1TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWNQYXJhbVNldF90ICogcFBpY1BhcmFtU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSkKK3sKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgaTMyIGl2YWx1ZTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKyAgICBBU1NFUlQobm9PdXRwdXRPZlByaW9yUGljc0ZsYWcpOworCisgICAgLyogbXVzdCBiZSBJRFIgbHNpY2UgKi8KKyAgICBBU1NFUlQobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUik7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuICh0bXApOworCisgICAgLyogc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAodG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZShwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZih0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICBpZihwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZShwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGktLTsKKworICAgICAgICAvKiBza2lwIHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICAgICAgaWYodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworCisgICAgICAgIGlmKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKKyAgICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCisgICAgeworICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KKyAgICAgICAgaWYocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2tpcCByZWR1bmRhbnRfcGljX2NudCAqLworICAgIGlmKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisgICAgfQorCisgICAgKm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIDEpOworICAgIGlmKCpub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworCisgICAgcmV0dXJuIChIQU5UUk9fT0spOworCit9CisvKmxpbnQgK2U3MTUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTk4ODk4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSAorI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VudW0geworICAgIFBfU0xJQ0UgPSAwLAorICAgIElfU0xJQ0UgPSAyCit9OworCitlbnVtIHtOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUyA9IDB4RkZGRn07CisKKy8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBzbGljZSBpcyBhbiBpbnRlciBzbGljZSwgc2xpY2VUeXBlcyAwIGFuZCA1ICovCisjZGVmaW5lIElTX1BfU0xJQ0Uoc2xpY2VUeXBlKSAoKChzbGljZVR5cGUpID09IFBfU0xJQ0UpIHx8IFwKKyAgICAoKHNsaWNlVHlwZSkgPT0gUF9TTElDRSArIDUpKQorCisvKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgc2xpY2UgaXMgYW4gaW50cmEgc2xpY2UsIHNsaWNlVHlwZXMgMiBhbmQgNyAqLworI2RlZmluZSBJU19JX1NMSUNFKHNsaWNlVHlwZSkgKCgoc2xpY2VUeXBlKSA9PSBJX1NMSUNFKSB8fCBcCisgICAgKChzbGljZVR5cGUpID09IElfU0xJQ0UgKyA1KSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGF0YSBvZiBvbmUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIG9wZXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcmVvcmRlcmluZ09mUGljTnVtc0lkYzsKKyAgICB1MzIgYWJzRGlmZlBpY051bTsKKyAgICB1MzIgbG9uZ1Rlcm1QaWNOdW07Cit9IHJlZlBpY0xpc3RSZW9yZGVyaW5nT3BlcmF0aW9uX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgb3BlcmF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDA7CisgICAgcmVmUGljTGlzdFJlb3JkZXJpbmdPcGVyYXRpb25fdCBjb21tYW5kW01BWF9OVU1fUkVGX1BJQ1MrMV07Cit9IHJlZlBpY0xpc3RSZW9yZGVyaW5nX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBkYXRhIG9mIG9uZSBEUEIgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uOworICAgIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zOworICAgIHUzMiBsb25nVGVybVBpY051bTsKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeDsKKyAgICB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKK30gbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90OworCisvKiB3b3JzdCBjYXNlIHNjZW5hcmlvOiBhbGwgTUFYX05VTV9SRUZfUElDUyBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGFyZQorICogc2hvcnQgdGVybSBwaWN0dXJlcywgZWFjaCBvbmUgb2YgdGhlbSBpcyBmaXJzdCBtYXJrZWQgYXMgbG9uZyB0ZXJtCisgKiByZWZlcmVuY2UgcGljdHVyZSB3aGljaCBpcyB0aGVuIG1hcmtlZCBhcyB1bnVzZWQgZm9yIHJlZmVyZW5jZS4KKyAqIEFkZGl0aW9uYWxseSwgbWF4IGxvbmctdGVybSBmcmFtZSBpbmRleCBpcyBzZXQgYW5kIGN1cnJlbnQgcGljdHVyZSBpcworICogbWFya2VkIGFzIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZS4gTGFzdCBwb3NpdGlvbiByZXNlcnZlZCBmb3IKKyAqIGVuZCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBjb21tYW5kICovCisjZGVmaW5lIE1BWF9OVU1fTU1DX09QRVJBVElPTlMgKDIqTUFYX05VTV9SRUZfUElDUysyKzEpCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWc7CisgICAgdTMyIGxvbmdUZXJtUmVmZXJlbmNlRmxhZzsKKyAgICB1MzIgYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWc7CisgICAgbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90IG9wZXJhdGlvbltNQVhfTlVNX01NQ19PUEVSQVRJT05TXTsKK30gZGVjUmVmUGljTWFya2luZ190OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2xpY2UgaGVhZGVyIGRhdGEgZGVjb2RlZCBmcm9tIHRoZSBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGZpcnN0TWJJblNsaWNlOworICAgIHUzMiBzbGljZVR5cGU7CisgICAgdTMyIHBpY1BhcmFtZXRlclNldElkOworICAgIHUzMiBmcmFtZU51bTsKKyAgICB1MzIgaWRyUGljSWQ7CisgICAgdTMyIHBpY09yZGVyQ250THNiOworICAgIGkzMiBkZWx0YVBpY09yZGVyQ250Qm90dG9tOworICAgIGkzMiBkZWx0YVBpY09yZGVyQ250WzJdOworICAgIHUzMiByZWR1bmRhbnRQaWNDbnQ7CisgICAgdTMyIG51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZzsKKyAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7CisgICAgaTMyIHNsaWNlUXBEZWx0YTsKKyAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7CisgICAgaTMyIHNsaWNlQWxwaGFDME9mZnNldDsKKyAgICBpMzIgc2xpY2VCZXRhT2Zmc2V0OworICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGU7CisgICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCByZWZQaWNMaXN0UmVvcmRlcmluZzsKKyAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKK30gc2xpY2VIZWFkZXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKKyAgbmFsVW5pdF90ICpwTmFsVW5pdCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcHBzSWQpOworCit1MzIgaDI2NGJzZENoZWNrRnJhbWVOdW0oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgKmZyYW1lTnVtKTsKKwordTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICppZHJQaWNJZCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYigKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcGljT3JkZXJDbnRMc2IpOworCit1MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIGkzMiAqZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisKK3UzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWcsCisgIGkzMiAqZGVsdGFQaWNPcmRlckNudCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcmVkdW5kYW50UGljQ250KTsKKwordTMyIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcodTMyICogbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJtRGF0YV90ICogcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxUGFyYW1TZXRfdCAqIHBTZXFQYXJhbVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpY1BhcmFtU2V0X3QgKiBwUGljUGFyYW1TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzIzNDc1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKQEAgLTAsMCArMSw4ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkSW5pdFN0b3JhZ2UKKyAgICAgICAgICBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldAorICAgICAgICAgIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0CisgICAgICAgICAgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzCisgICAgICAgICAgaDI2NGJzZFJlc2V0U3RvcmFnZQorICAgICAgICAgIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZElzRW5kT2ZQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwCisgICAgICAgICAgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5CisgICAgICAgICAgQ2hlY2tQcHMKKyAgICAgICAgICBoMjY0YnNkVmFsaWRQYXJhbVNldHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIENoZWNrUHBzKHBpY1BhcmFtU2V0X3QgKnBwcywgc2VxUGFyYW1TZXRfdCAqc3BzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0U3RvcmFnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBJbml0aWFsaXplIHN0b3JhZ2Ugc3RydWN0dXJlLiBTZXRzIGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlIHRvICcwJworICAgICAgICAgICAgZXhjZXB0IGZvciB0aGUgYWN0aXZlIHBhcmFtZXRlciBzZXQgaWRzLCB3aGljaCBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgIHRvIGludmFsaWQgdmFsdWVzLgorCisgICAgICAgIElucHV0czoKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgaW5pdGlhbGl6ZWQgZGF0YSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBTdG9yYWdlLCAwLCBzaXplb2Yoc3RvcmFnZV90KSk7CisKKyAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOworICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7CisKKyAgICBwU3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX1RSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbnRvIHRoZSBzdG9yYWdlLiBJZiBhY3RpdmUgU1BTIGlzCisgICAgICAgICAgICBvdmVyd3JpdHRlbiAtPiBjaGVjayBpZiBjb250ZW50cyBjaGFuZ2VzIGFuZCBpZiBpdCBkb2VzLCBzZXQKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgdG8gZm9yY2UgcmVhY3RpdmF0aW9uIG9mIHBhcmFtZXRlciBzZXRzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIHBhcmFtIHNldCB0byBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpZDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpOworCisgICAgaWQgPSBwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkOworCisgICAgLyogc2VxIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBub3QgdXNlZCBiZWZvcmUgLT4gYWxsb2NhdGUgbWVtb3J5ICovCisgICAgaWYgKHBTdG9yYWdlLT5zcHNbaWRdID09IE5VTEwpCisgICAgeworICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c3BzW2lkXSwgMSwgc2VxUGFyYW1TZXRfdCk7CisgICAgICAgIGlmIChwU3RvcmFnZS0+c3BzW2lkXSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICB9CisgICAgLyogc2VxdWVuY2UgcGFyYW1ldGVyIHNldCB3aXRoIGlkIGVxdWFsIHRvIGlkIG9mIGFjdGl2ZSBzcHMgKi8KKyAgICBlbHNlIGlmIChpZCA9PSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCisgICAgeworICAgICAgICAvKiBpZiBzZXEgcGFyYW1ldGVyIHNldCBjb250ZW50cyBjaGFuZ2VzCisgICAgICAgICAqICAgIC0+IG92ZXJ3cml0ZSBhbmQgcmUtYWN0aXZhdGUgd2hlbiBuZXh0IElEUiBwaWN0dXJlIGRlY29kZWQKKyAgICAgICAgICogICAgaWRzIG9mIGFjdGl2ZSBwYXJhbSBzZXRzIHNldCB0byBpbnZhbGlkIHZhbHVlcyB0byBmb3JjZQorICAgICAgICAgKiAgICByZS1hY3RpdmF0aW9uLiBNZW1vcmllcyBhbGxvY2F0ZWQgZm9yIG9sZCBzcHMgZnJlZWQKKyAgICAgICAgICogb3RoZXJ3aXNlIGZyZWUgbWVtZXJpZXMgYWxsb2NhdGVkIGZvciBqdXN0IGRlY29kZWQgc3BzIGFuZAorICAgICAgICAgKiBjb250aW51ZSAqLworICAgICAgICBpZiAoaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMocFNlcVBhcmFtU2V0LCBwU3RvcmFnZS0+YWN0aXZlU3BzKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT52dWlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgKyAxOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUyArIDE7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gTlVMTDsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lKTsKKyAgICAgICAgICAgIEZSRUUocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgICAgICB9CisgICAgfQorICAgIC8qIG92ZXJ3cml0ZSBzZXEgcGFyYW0gc2V0IG90aGVyIHRoYW4gYWN0aXZlIG9uZSAtPiBmcmVlIG1lbW9yaWVzCisgICAgICogYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+b2Zmc2V0Rm9yUmVmRnJhbWUpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT52dWlQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAqcFN0b3JhZ2UtPnNwc1tpZF0gPSAqcFNlcVBhcmFtU2V0OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTdG9yZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW50byB0aGUgc3RvcmFnZS4gSWYgYWN0aXZlIFBQUyBpcworICAgICAgICAgICAgb3ZlcndyaXR0ZW4gLT4gY2hlY2sgaWYgYWN0aXZlIFNQUyBjaGFuZ2VzIGFuZCBpZiBpdCBkb2VzIC0+IHNldAorICAgICAgICAgICAgcGFyYW1ldGVycyB0byBmb3JjZSByZWFjdGl2YXRpb24gb2YgcGFyYW1ldGVyIHNldHMKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gcGFyYW0gc2V0IHRvIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpZDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyk7CisKKyAgICBpZCA9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQ7CisKKyAgICAvKiBwaWMgcGFyYW1ldGVyIHNldCB3aXRoIGlkIG5vdCB1c2VkIGJlZm9yZSAtPiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBpZiAocFN0b3JhZ2UtPnBwc1tpZF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5wcHNbaWRdLCAxLCBwaWNQYXJhbVNldF90KTsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5wcHNbaWRdID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIH0KKyAgICAvKiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBlcXVhbCB0byBpZCBvZiBhY3RpdmUgcHBzICovCisgICAgZWxzZSBpZiAoaWQgPT0gcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkKQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgd2hldGhlciBzZXEgcGFyYW0gc2V0IGNoYW5nZXMsIGZvcmNlIHJlLWFjdGl2YXRpb24gb2YKKyAgICAgICAgICogcGFyYW0gc2V0IGlmIGl0IGRvZXMuIFNldCBhY3RpdmVTcHNJZCB0byBpbnZhbGlkIHZhbHVlIHRvCisgICAgICAgICAqIGFjY29tcGxpc2ggdGhpcyAqLworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgKyAxOworICAgICAgICB9CisgICAgICAgIC8qIGZyZWUgbWVtb3JpZXMgYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnJ1bkxlbmd0aCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnRvcExlZnQpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ib3R0b21SaWdodCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnNsaWNlR3JvdXBJZCk7CisgICAgfQorICAgIC8qIG92ZXJ3cml0ZSBwaWMgcGFyYW0gc2V0IG90aGVyIHRoYW4gYWN0aXZlIG9uZSAtPiBmcmVlIG1lbW9yaWVzCisgICAgICogYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+cnVuTGVuZ3RoKTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+dG9wTGVmdCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPmJvdHRvbVJpZ2h0KTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+c2xpY2VHcm91cElkKTsKKyAgICB9CisKKyAgICAqcFN0b3JhZ2UtPnBwc1tpZF0gPSAqcFBpY1BhcmFtU2V0OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQWN0aXZhdGUgY2VydGFpbiBTUFMvUFBTIGNvbWJpbmF0aW9uLiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGJlCisgICAgICAgICAgICBjYWxsZWQgaW4gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBpY3R1cmUuIFBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgY2FuIGJlIGNoYW5nZWQgYXMgd2FudGVkLCBidXQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBtYXkgb25seSBiZQorICAgICAgICAgICAgY2hhbmdlZCB3aGVuIHRoZSBzdGFydGluZyBwaWN0dXJlIGlzIGFuIElEUiBwaWN0dXJlLgorCisgICAgICAgICAgICBXaGVuIG5ldyBTUFMgaXMgYWN0aXZhdGVkIHRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgorICAgICAgICAgICAgbWFjcm9ibG9jayBzdG9yYWdlcyBhbmQgc2xpY2UgZ3JvdXAgbWFwIGFuZCAocmUtKWluaXRpYWxpemVzIHRoZQorICAgICAgICAgICAgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGFjdGl2YXRpb24gdGhlIG9sZAorICAgICAgICAgICAgYWxsb2NhdGlvbnMgYXJlIGZyZWVkIGFuZCBGcmVlRHBiIGNhbGxlZCBiZWZvcmUgbmV3IGFsbG9jYXRpb25zLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBwc0lkICAgICAgICAgICBpZGVudGlmaWVzIHRoZSBQUFMgdG8gYmUgYWN0aXZhdGVkLCBTUFMgaWQgb2J0YWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBQUFMKKyAgICAgICAgICAgIGlzSWRyICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSBwaWN0dXJlIGlzIGFuIElEUiBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBub24tZXhpc3Rpbmcgb3IgaW52YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5aW5nIHRvIGNoYW5nZSBTUFMgd2l0aCBub24tSURSIHBpY3R1cmUKKyAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICAgICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHBwc0lkLCB1MzIgaXNJZHIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKyAgICB1MzIgZmxhZzsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocHBzSWQgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKTsKKworICAgIC8qIGNoZWNrIHRoYXQgcHBzIGFuZCBjb3JyZXNwb25kaW5nIHNwcyBleGlzdCAqLworICAgIGlmICggKHBTdG9yYWdlLT5wcHNbcHBzSWRdID09IE5VTEwpIHx8CisgICAgICAgICAocFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWRdID09IE5VTEwpICkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IHBwcyBwYXJhbWV0ZXJzIGRvIG5vdCB2aW9sYXRlIHBpY3R1cmUgc2l6ZSBjb25zdHJhaW50cyAqLworICAgIHRtcCA9IENoZWNrUHBzKHBTdG9yYWdlLT5wcHNbcHBzSWRdLAorICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkXSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MSAqLworICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPT0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKKyAgICB7CisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOworICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07CisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOworICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+YWN0aXZlU3BzSWRdOworICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzID0KKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7CisKKyAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+d2lkdGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzOworICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MiAqLworICAgIGVsc2UgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKKyAgICB7CisgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19GQUxTRTsKKworICAgICAgICBGUkVFKHBTdG9yYWdlLT5tYik7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXApOworCisgICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5tYiwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgbWJTdG9yYWdlX3QpOworICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgdTMyKTsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5tYiA9PSBOVUxMIHx8IHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgICAgIEgyNjRTd0RlY01lbXNldChwU3RvcmFnZS0+bWIsIDAsCisgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzICogc2l6ZW9mKG1iU3RvcmFnZV90KSk7CisKKyAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMocFN0b3JhZ2UtPm1iLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywKKyAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOworCisgICAgICAgIC8qIGRwYiBvdXRwdXQgcmVvcmRlcmluZyBkaXNhYmxlZCBpZgorICAgICAgICAgKiAxKSBhcHBsaWNhdGlvbiBzZXQgbm9SZW9yZGVyaW5nIGZsYWcKKyAgICAgICAgICogMikgUE9DIHR5cGUgZXF1YWwgdG8gMgorICAgICAgICAgKiAzKSBudW1fcmVvcmRlcl9mcmFtZXMgaW4gdnVpIGVxdWFsIHRvIDAgKi8KKyAgICAgICAgaWYgKCBwU3RvcmFnZS0+bm9SZW9yZGVyaW5nIHx8CisgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljT3JkZXJDbnRUeXBlID09IDIgfHwKKyAgICAgICAgICAgICAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCisgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZyAmJgorICAgICAgICAgICAgICAhcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcykgKQorICAgICAgICAgICAgZmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFnID0gSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RSZXNldERwYihwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icywKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm1heERwYlNpemUsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5udW1SZWZGcmFtZXMsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5tYXhGcmFtZU51bSwKKyAgICAgICAgICAgIGZsYWcpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwcHNJZCAhPSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCisgICAgeworICAgICAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHNoYWxsIG5vdCBjaGFuZ2UgYnV0IGJlZm9yZSBhbiBJRFIgcGljdHVyZSAqLworICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJTRVEgUEFSQU0gU0VUIENIQU5HSU5HLi4uXG4iKSk7CisgICAgICAgICAgICBpZiAoaXNJZHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9CisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPndpZHRoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1iczsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKCgiVFJZSU5HIFRPIENIQU5HRSBTUFMgSU4gTk9OLUlEUiBTTElDRVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXRTdG9yYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFJlc2V0IGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICAgICAgICBwcm9jZXNzaW5nIG9mIG5ldyBpbWFnZSBpcyBzdGFydGVkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgPSAwOworICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQorICAgIHsKKyAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPSAwOworICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA9IDA7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBzdGFydCBvZiBhIHBpY3R1cmUuIFRoaXMKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZWNpZGUgaWYgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzIGFuZAorICAgICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQuIEZ1bmN0aW9uCisgICAgICAgICAgICBjb25zaWRlcnMgdGhhdCBuZXcgcGljdHVyZSBpcyBzdGFydGluZyBpZiBubyBzbGljZSBoZWFkZXJzCisgICAgICAgICAgICBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgZm9yIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fVFJVRSAgICAgICAgbmV3IHBpY3R1cmUgaXMgc3RhcnRpbmcKKyAgICAgICAgICAgIEhBTlRST19GQUxTRSAgICAgICBub3Qgc3RhcnRpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIGlmIChwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9PSBIQU5UUk9fRkFMU0UpCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJc0VuZE9mUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIGVuZCBvZiBhIHBpY3R1cmUuIFRoaXMKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hlbiBkZWJsb2NraW5nIGZpbHRlcmluZworICAgICAgICAgICAgYW5kIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzc2VzIHNob3VsZCBiZSBwZXJmb3JtZWQuCisKKyAgICAgICAgICAgIElmIHRoZSBkZWNvZGVyIGlzIHByb2Nlc3NpbmcgcHJpbWFyeSBzbGljZXMgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUgdmFsdWUgb2YgbnVtRGVjb2RlZE1icyBpbiB0aGUKKyAgICAgICAgICAgIHN0b3JhZ2UuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGVjb2RlciBpcyBwcm9jZXNzaW5nCisgICAgICAgICAgICByZWR1bmRhbnQgc2xpY2VzIHRoZSBudW1EZWNvZGVkTWJzIG1heSBub3QgY29udGFpbiB2YWxpZAorICAgICAgICAgICAgaW5mb3JtYXRpb25hIGFuZCBlYWNoIG1hY3JvYmxvY2sgaGFzIHRvIGJlIGNoZWNrZWQgc2VwYXJhdGVseS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgICAgIGVuZCBvZiBwaWN0dXJlCisgICAgICAgICAgICBIQU5UUk9fRkFMU0UgICAgICAgbm91cAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgLyogcHJpbWFyeSBwaWN0dXJlICovCisgICAgaWYgKCFwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMF0ucmVkdW5kYW50UGljQ250KQorICAgIHsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKKyAgICAgICAgICAgIHRtcCArPSBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA/IDEgOiAwOworCisgICAgICAgIGlmICh0bXAgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBzbGljZSBncm91cCBtYXAuIEp1c3QgY2FsbCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCB3aXRoCisgICAgICAgICAgICBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLCBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIG5leHQgTkFMIHVuaXQgc3RhcnRzIGEgbmV3IGFjY2VzcyB1bml0LiBGb2xsb3dpbmcKKyAgICAgICAgICAgIGNvbmRpdGlvbnMgc3BlY2lmeSBzdGFydCBvZiBhIG5ldyBhY2Nlc3MgdW5pdDoKKworICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlcyA2LTExLCAxMy0xOCAoZS5nLiBTUFMsIFBQUykKKworICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBjaGVja2VkIG9ubHkgZm9yIHNsaWNlIE5BTCB1bml0cywgdmFsdWVzCisgICAgICAgICAgIGNvbXBhcmVkIHRvIG9uZXMgb2J0YWluZWQgZnJvbSBwcmV2aW91cyBzbGljZToKKworICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlIGRpZmZlcnMgKHNsaWNlIC8gSURSIHNsaWNlKQorICAgICAgICAgICAgICAgIC1mcmFtZV9udW0gZGlmZmVycworICAgICAgICAgICAgICAgIC1uYWxfcmVmX2lkYyBkaWZmZXJzIGFuZCBvbmUgb2YgdGhlIHZhbHVlcyBpcyAwCisgICAgICAgICAgICAgICAgLVBPQyBpbmZvcm1hdGlvbiBkaWZmZXJzCisgICAgICAgICAgICAgICAgLWJvdGggYXJlIElEUiBzbGljZXMgYW5kIGlkcl9waWNfaWQgZGlmZmVycworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHN0cm0gICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBudU5leHQgICAgICBwb2ludGVyIHRvIE5BTCB1bml0IHN0cnVjdHVyZQorICAgICAgICAgICAgc3RvcmFnZSAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICB0aGUgcmVzdWx0IGlzIHN0b3JlZCBoZXJlLCBUUlVFIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQgYm91bmRhcnksIEZBTFNFIG90aGVyd2lzZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgZmFpbHVyZSwgaW52YWxpZCBzdHJlYW0gZGF0YQorICAgICAgICAgICAgUEFSQU1fU0VUX0VSUk9SICAgICBpbnZhbGlkIHBhcmFtIHNldCB1c2FnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAorICBzdHJtRGF0YV90ICpzdHJtLAorICBuYWxVbml0X3QgKm51TmV4dCwKKyAgc3RvcmFnZV90ICpzdG9yYWdlLAorICB1MzIgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgcHBzSWQsIGZyYW1lTnVtLCBpZHJQaWNJZCwgcGljT3JkZXJDbnRMc2I7CisgICAgaTMyIGRlbHRhUGljT3JkZXJDbnRCb3R0b20sIGRlbHRhUGljT3JkZXJDbnRbMl07CisgICAgc2VxUGFyYW1TZXRfdCAqc3BzOworICAgIHBpY1BhcmFtU2V0X3QgKnBwczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHN0cm0pOworICAgIEFTU0VSVChudU5leHQpOworICAgIEFTU0VSVChzdG9yYWdlKTsKKyAgICBBU1NFUlQoc3RvcmFnZS0+c3BzKTsKKyAgICBBU1NFUlQoc3RvcmFnZS0+cHBzKTsKKworICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBvdXRwdXQgdG8gRkFMU0UgKi8KKyAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19GQUxTRTsKKworICAgIGlmICggKCAobnVOZXh0LT5uYWxVbml0VHlwZSA+IDUpICYmIChudU5leHQtPm5hbFVuaXRUeXBlIDwgMTIpICkgfHwKKyAgICAgICAgICggKG51TmV4dC0+bmFsVW5pdFR5cGUgPiAxMikgJiYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPD0gMTgpICkgKQorICAgIHsKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UgaWYgKCBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRSAmJgorICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gKi8KKyAgICBpZiAoc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnKQorICAgIHsKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIC8qIGdldCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtLCAmcHBzSWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHN0b3JlIHNwcyBhbmQgcHBzIGluIHNlcGFyYXRlIHBvaW50ZXJzIGp1c3QgdG8gbWFrZSBuYW1lcyBzaG9ydGVyICovCisgICAgcHBzID0gc3RvcmFnZS0+cHBzW3Bwc0lkXTsKKyAgICBpZiAoIHBwcyA9PSBOVUxMIHx8IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXSA9PSBOVUxMICB8fAorICAgICAgICAgKHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICE9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgJiYKKyAgICAgICAgICBwcHMtPnNlcVBhcmFtZXRlclNldElkICE9IHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICYmCisgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKSApCisgICAgICAgIHJldHVybihQQVJBTV9TRVRfRVJST1IpOworICAgIHNwcyA9IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXTsKKworICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsUmVmSWRjICE9IG51TmV4dC0+bmFsUmVmSWRjICYmCisgICAgICAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFJlZklkYyA9PSAwIHx8IG51TmV4dC0+bmFsUmVmSWRjID09IDApKQorICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworCisgICAgaWYgKChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgorICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikgfHwKKyAgICAgIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgorICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikpCisgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisKKyAgICB0bXAgPSBoMjY0YnNkQ2hlY2tGcmFtZU51bShzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCAmZnJhbWVOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RnJhbWVOdW0gIT0gZnJhbWVOdW0pCisgICAgeworICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZGcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgIH0KKworICAgIGlmIChudU5leHQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tJZHJQaWNJZChzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCBudU5leHQtPm5hbFVuaXRUeXBlLAorICAgICAgICAgICZpZHJQaWNJZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgorICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldklkclBpY0lkICE9IGlkclBpY0lkKQorICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKworICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZJZHJQaWNJZCA9IGlkclBpY0lkOworICAgIH0KKworICAgIGlmIChzcHMtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2Ioc3RybSwgc3BzLCBudU5leHQtPm5hbFVuaXRUeXBlLAorICAgICAgICAgICZwaWNPcmRlckNudExzYik7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZQaWNPcmRlckNudExzYiAhPSBwaWNPcmRlckNudExzYikKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBwaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHBzLT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKHN0cm0sIHNwcywKKyAgICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlLCAmZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gIT0KKyAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gPQorICAgICAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tOworICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3BzLT5waWNPcmRlckNudFR5cGUgPT0gMSAmJiAhc3BzLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KHN0cm0sIHNwcywgbnVOZXh0LT5uYWxVbml0VHlwZSwKKyAgICAgICAgICBwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcsIGRlbHRhUGljT3JkZXJDbnQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzBdICE9IGRlbHRhUGljT3JkZXJDbnRbMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMF0gPSBkZWx0YVBpY09yZGVyQ250WzBdOworICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFsxXSAhPSBkZWx0YVBpY09yZGVyQ250WzFdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMV0gPSBkZWx0YVBpY09yZGVyQ250WzFdOworICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgKnN0b3JhZ2UtPmF1Yi0+bnVQcmV2ID0gKm51TmV4dDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogQ2hlY2tQcHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgcGljdHVyZSBwYXJhbWV0ZXIgc2V0LiBDb250ZW50cyBvZiB0aGUgcGljdHVyZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHNldCBpbmZvcm1hdGlvbiB0aGF0IGRlcGVuZHMgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgaXMgY2hlY2tlZAorICAgICAgICAgICAgYWdhaW5zdCB0aGUgZGltZW5zaW9ucyBpbiB0aGUgc3BzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBwcyAgICAgcG9pbnRlciB0byBwaWN0dXJlIHBhcmFtdGVyIHNldAorICAgICAgICAgICAgc3BzICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBldmVyeXRoaW5nIG9rCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGRhdGEgaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpCit7CisKKyAgICB1MzIgaTsKKyAgICB1MzIgcGljU2l6ZTsKKworICAgIHBpY1NpemUgPSBzcHMtPnBpY1dpZHRoSW5NYnMgKiBzcHMtPnBpY0hlaWdodEluTWJzOworCisgICAgLyogY2hlY2sgc2xpY2UgZ3JvdXAgcGFyYW1zICovCisgICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPiAxKQorICAgIHsKKyAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKHBwcy0+cnVuTGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bVNsaWNlR3JvdXBzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBwcy0+cnVuTGVuZ3RoW2ldID4gcGljU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKHBwcy0+dG9wTGVmdCk7CisgICAgICAgICAgICBBU1NFUlQocHBzLT5ib3R0b21SaWdodCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1TbGljZUdyb3Vwcy0xOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBwcy0+dG9wTGVmdFtpXSA+IHBwcy0+Ym90dG9tUmlnaHRbaV0gfHwKKyAgICAgICAgICAgICAgICAgICAgcHBzLT5ib3R0b21SaWdodFtpXSA+PSBwaWNTaXplKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChwcHMtPnRvcExlZnRbaV0gJSBzcHMtPnBpY1dpZHRoSW5NYnMpID4KKyAgICAgICAgICAgICAgICAgICAgIChwcHMtPmJvdHRvbVJpZ2h0W2ldICUgc3BzLT5waWNXaWR0aEluTWJzKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID4gMiAmJiBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgPiBwaWNTaXplKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYgJiYKKyAgICAgICAgICAgICAgICAgcHBzLT5waWNTaXplSW5NYXBVbml0cyA8IHBpY1NpemUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFZhbGlkUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBTUFMvUFBTIGNvbWJpbmF0aW9uIGV4aXN0cyBpbiB0aGUgc3RvcmFnZS4KKyAgICAgICAgICAgIEZ1bmN0aW9uIHRyaWVzIGVhY2ggUFBTIGluIHRoZSBidWZmZXIgYW5kIGNoZWNrcyBpZiBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICBTUFMgZXhpc3RzIGFuZCBjYWxscyBDaGVja1BwcyB0byBkZXRlcm1pbmUgaWYgdGhlIFBQUyBjb25mb3JtcworICAgICAgICAgICAgdG8gaW1hZ2UgZGltZW5zaW9ucyBvZiB0aGUgU1BTLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgSEFOVFJPX09LICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisgICAgICAgICAgICBIQU5UUk9fTk9LICBubyB2YWxpZCBjb21iaW5hdGlvbnMgZm91bmQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBwU3RvcmFnZS0+cHBzW2ldICYmCisgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW2ldLT5zZXFQYXJhbWV0ZXJTZXRJZF0gJiYKKyAgICAgICAgICAgICBDaGVja1BwcyhwU3RvcmFnZS0+cHBzW2ldLAorICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1tpXS0+c2VxUGFyYW1ldGVyU2V0SWRdKSA9PQorICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19OT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhM2IyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NUT1JBR0VfSAorI2RlZmluZSBIMjY0U1dERUNfU1RPUkFHRV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfb3JkZXJfY250LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc2xpY2VJZDsKKyAgICB1MzIgbnVtRGVjb2RlZE1iczsKKyAgICB1MzIgbGFzdE1iQWRkcjsKK30gc2xpY2VTdG9yYWdlX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBwYXJhbWV0ZXJzIG5lZWRlZCBmb3IgYWNjZXNzIHVuaXQgYm91bmRhcnkgY2hlY2tpbmcgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbmFsVW5pdF90IG51UHJldlsxXTsKKyAgICB1MzIgcHJldkZyYW1lTnVtOworICAgIHUzMiBwcmV2SWRyUGljSWQ7CisgICAgdTMyIHByZXZQaWNPcmRlckNudExzYjsKKyAgICBpMzIgcHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b207CisgICAgaTMyIHByZXZEZWx0YVBpY09yZGVyQ250WzJdOworICAgIHUzMiBmaXJzdENhbGxGbGFnOworfSBhdWJDaGVja190OworCisvKiBzdG9yYWdlIGRhdGEgc3RydWN0dXJlLCBob2xkcyBhbGwgZGF0YSBvZiBhIGRlY29kZXIgaW5zdGFuY2UgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogYWN0aXZlIHBhcmFtZXQgc2V0IGlkcyBhbmQgcG9pbnRlcnMgKi8KKyAgICB1MzIgb2xkU3BzSWQ7CisgICAgdTMyIGFjdGl2ZVBwc0lkOworICAgIHUzMiBhY3RpdmVTcHNJZDsKKyAgICBwaWNQYXJhbVNldF90ICphY3RpdmVQcHM7CisgICAgc2VxUGFyYW1TZXRfdCAqYWN0aXZlU3BzOworICAgIHNlcVBhcmFtU2V0X3QgKnNwc1tNQVhfTlVNX1NFUV9QQVJBTV9TRVRTXTsKKyAgICBwaWNQYXJhbVNldF90ICpwcHNbTUFYX05VTV9QSUNfUEFSQU1fU0VUU107CisKKyAgICAvKiBjdXJyZW50IHNsaWNlIGdyb3VwIG1hcCwgcmVjb21wdXRlZCBmb3IgZWFjaCBzbGljZSAqLworICAgIHUzMiAqc2xpY2VHcm91cE1hcDsKKworICAgIHUzMiBwaWNTaXplSW5NYnM7CisKKyAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IGFmdGVyIGFsbCBtYWNyb2Jsb2NrcyBvZiBhIHBpY3R1cmUgc3VjY2Vzc2Z1bGx5CisgICAgICogZGVjb2RlZCAtPiByZWR1bmRhbnQgc2xpY2VzIG5vdCBkZWNvZGVkICovCisgICAgdTMyIHNraXBSZWR1bmRhbnRTbGljZXM7CisgICAgdTMyIHBpY1N0YXJ0ZWQ7CisKKyAgICAvKiBmbGFnIHRvIGluZGljYXRlIGlmIGN1cnJlbnQgYWNjZXNzIHVuaXQgY29udGFpbnMgYW55IHZhbGlkIHNsaWNlcyAqLworICAgIHUzMiB2YWxpZFNsaWNlSW5BY2Nlc3NVbml0OworCisgICAgLyogc3RvcmUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBoYW5kbGluZyBvZiBzbGljZSBkZWNvZGluZyAqLworICAgIHNsaWNlU3RvcmFnZV90IHNsaWNlWzFdOworCisgICAgLyogbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudCBpbWFnZSAqLworICAgIHUzMiBudW1Db25jZWFsZWRNYnM7CisKKyAgICAvKiBwaWNJZCBnaXZlbiBieSBhcHBsaWNhdGlvbiAqLworICAgIHUzMiBjdXJyZW50UGljSWQ7CisKKyAgICAvKiBtYWNyb2Jsb2NrIHNwZWNpZmljIHN0b3JhZ2VzLCBzaXplIGRldGVybWluZWQgYnkgaW1hZ2UgZGltZW5zaW9ucyAqLworICAgIG1iU3RvcmFnZV90ICptYjsKKworICAgIC8qIGZsYWcgdG8gc3RvcmUgbm9PdXRwdXRSZW9yZGVyaW5nIGZsYWcgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiAqLworICAgIHUzMiBub1Jlb3JkZXJpbmc7CisKKyAgICAvKiBEUEIgKi8KKyAgICBkcGJTdG9yYWdlX3QgZHBiWzFdOworCisgICAgLyogc3RydWN0dXJlIHRvIHN0b3JlIHBpY3R1cmUgb3JkZXIgY291bnQgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworICAgIHBvY1N0b3JhZ2VfdCBwb2NbMV07CisKKyAgICAvKiBhY2Nlc3MgdW5pdCBib3VuZGFyeSBjaGVja2luZyByZWxhdGVkIGRhdGEgKi8KKyAgICBhdWJDaGVja190IGF1YlsxXTsKKworICAgIC8qIGN1cnJlbnQgcHJvY2Vzc2VkIGltYWdlICovCisgICAgaW1hZ2VfdCBjdXJySW1hZ2VbMV07CisKKyAgICAvKiBsYXN0IHZhbGlkIE5BTCB1bml0IGhlYWRlciBpcyBzdG9yZWQgaGVyZSAqLworICAgIG5hbFVuaXRfdCBwcmV2TmFsVW5pdFsxXTsKKworICAgIC8qIHNsaWNlIGhlYWRlciwgc2Vjb25kIHN0cnVjdHVyZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2Ugd2hpbGUKKyAgICAgKiBkZWNvZGluZyBzbGljZSBoZWFkZXIsIGZpcnN0IG9uZSBzdG9yZXMgbGFzdCBzdWNjZXNzZnVsbHkgZGVjb2RlZAorICAgICAqIHNsaWNlIGhlYWRlciAqLworICAgIHNsaWNlSGVhZGVyX3Qgc2xpY2VIZWFkZXJbMl07CisKKyAgICAvKiBmaWVsZHMgdG8gc3RvcmUgb2xkIHN0cmVhbSBidWZmZXIgcG9pbnRlcnMsIG5lZWRlZCB3aGVuIG9ubHkgcGFydCBvZgorICAgICAqIGEgc3RyZWFtIGJ1ZmZlciBpcyBwcm9jZXNzZWQgYnkgaDI2NGJzZERlY29kZSBmdW5jdGlvbiAqLworICAgIHUzMiBwcmV2QnVmTm90RmluaXNoZWQ7CisgICAgdTggKnByZXZCdWZQb2ludGVyOworICAgIHUzMiBwcmV2Qnl0ZXNDb25zdW1lZDsKKyAgICBzdHJtRGF0YV90IHN0cm1bMV07CisKKyAgICAvKiBtYWNyb2Jsb2NrIGxheWVyIHN0cnVjdHVyZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSB0aGlzIGJ1dCBpdAorICAgICAqIHdvdWxkIGhhdmUgaW5jcmVhc2VkIHRoZSBzdGFjayBzaXplIGV4Y2Vzc2l2ZWx5IGFuZCBuZWVkZWQgdG8gYmUKKyAgICAgKiBhbGxvY2F0ZWQgZnJvbSBoZWFkIC0+IGVhc2llc3QgdG8gcHV0IGl0IGhlcmUgKi8KKyAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllcjsKKworICAgIHUzMiBwZW5kaW5nQWN0aXZhdGlvbjsgLyogQWN0aXZhdGUgcGFyYW1ldGVyIHNldHMgYWZ0ZXIgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJTX1JEWSB0byB0aGUgdXNlciAqLworICAgIHUzMiBpbnRyYUNvbmNlYWxtZW50RmxhZzsgLyogMCBncmF5IHBpY3R1cmUgZm9yIGNvcnJ1cHRlZCBpbnRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBwcmV2aW91cyBmcmFtZSB1c2VkIGlmIGF2YWlsYWJsZSAqLworfSBzdG9yYWdlX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit2b2lkIGgyNjRic2RSZXNldFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordTMyIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7Cit1MzIgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KTsKK3UzMiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHBwc0lkLCB1MzIgaXNJZHIpOwordm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlKTsKKwordTMyIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKKyAgc3RybURhdGFfdCAqc3RybSwKKyAgbmFsVW5pdF90ICpudU5leHQsCisgIHN0b3JhZ2VfdCAqc3RvcmFnZSwKKyAgdTMyICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKKwordTMyIGgyNjRic2RWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU1RPUkFHRV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGQxMDgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEdldEJpdHMKKyAgICAgICAgICBoMjY0YnNkU2hvd0JpdHMzMgorICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMKKyAgICAgICAgICBoMjY0YnNkSXNCeXRlQWxpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0Qml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZWFkIGFuZCByZW1vdmUgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyLgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG51bUJpdHMgICAgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKworICAgICAgICBPdXRwdXQ6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGJpdHMgcmVhZCBmcm9tIHN0cmVhbQorICAgICAgICAgICAgRU5EX09GX1NUUkVBTSBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEdldEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cykKK3sKKworICAgIHUzMiBvdXQ7CisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQobnVtQml0cyA8IDMyKTsKKworICAgIG91dCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSkgPj4gKDMyIC0gbnVtQml0cyk7CisKKyAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIG51bUJpdHMpID09IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIHJldHVybihvdXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4oRU5EX09GX1NUUkVBTSk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFNob3dCaXRzMzIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmVhZCAzMiBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIuIEJ1ZmZlciBpcyBsZWZ0IGFzIGl0IGlzLCBpLmUuCisgICAgICAgICAgICBubyBiaXRzIGFyZSByZW1vdmVkLiBGaXJzdCBiaXQgcmVhZCBmcm9tIHRoZSBzdHJlYW0gaXMgdGhlIE1TQiBvZgorICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZS4gSWYgdGhlcmUgaXMgbm90IGVub3VnaCBiaXRzIGluIHRoZSBidWZmZXIgLT4KKyAgICAgICAgICAgIGJpdHMgYmV5b25nIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhcmUgc2V0IHRvICcwJyBpbiB0aGUgcmV0dXJuCisgICAgICAgICAgICB2YWx1ZS4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBiaXRzIHJlYWQgZnJvbSBzdHJlYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RTaG93Qml0czMyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKK3sKKworICAgIGkzMiBiaXRzLCBzaGlmdDsKKyAgICB1MzIgb3V0OworICAgIHU4ICpwU3RybTsKKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQ3VyclBvcyk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09CisgICAgICAgICAgIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDcpKTsKKworICAgIHBTdHJtID0gcFN0cm1EYXRhLT5wU3RybUN1cnJQb3M7CisKKyAgICAvKiBudW1iZXIgb2YgYml0cyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICBiaXRzID0gKGkzMilwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSo4IC0gKGkzMilwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHM7CisKKyAgICAvKiBhdCBsZWFzdCAzMi1iaXRzIGluIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoYml0cyA+PSAzMikKKyAgICB7CisgICAgICAgIHUzMiBiaXRQb3NJbldvcmQgPSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKyAgICAgICAgb3V0ID0gKCh1MzIpcFN0cm1bMF0gPDwgMjQpIHwgKCh1MzIpcFN0cm1bMV0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgKCh1MzIpcFN0cm1bMl0gPDwgIDgpIHwgKCh1MzIpcFN0cm1bM10pOworCisgICAgICAgIGlmIChiaXRQb3NJbldvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiBieXRlID0gKHUzMilwU3RybVs0XTsKKyAgICAgICAgICAgIHUzMiB0bXAgPSAoOC1iaXRQb3NJbldvcmQpOworICAgICAgICAgICAgb3V0IDw8PSBiaXRQb3NJbldvcmQ7CisgICAgICAgICAgICBvdXQgfD0gYnl0ZT4+dG1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiAob3V0KTsKKyAgICB9CisgICAgLyogYXQgbGVhc3Qgb25lIGJpdCBpbiB0aGUgYnVmZmVyICovCisgICAgZWxzZSBpZiAoYml0cyA+IDApCisgICAgeworICAgICAgICBzaGlmdCA9IChpMzIpKDI0ICsgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpOworICAgICAgICBvdXQgPSAodTMyKSgqcFN0cm0rKykgPDwgc2hpZnQ7CisgICAgICAgIGJpdHMgLT0gKGkzMikoOCAtIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKTsKKyAgICAgICAgd2hpbGUgKGJpdHMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzaGlmdCAtPSA4OworICAgICAgICAgICAgb3V0IHw9ICh1MzIpKCpwU3RybSsrKSA8PCBzaGlmdDsKKyAgICAgICAgICAgIGJpdHMgLT0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG91dCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmVtb3ZlIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBudW1CaXRzICAgICAgICAgbnVtYmVyIG9mIGJpdHMgdG8gcmVtb3ZlCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgRU5EX09GX1NUUkVBTSAgIG5vdCBlbm91Z2ggYml0cyBsZWZ0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cykKK3sKKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0KTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA9PSAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3KSk7CisKKyAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgKz0gbnVtQml0czsKKyAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NzsKKyAgICBpZiAoIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgKSA8PSAoOCpwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSkgKQorICAgIHsKKyAgICAgICAgcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0ICsKKyAgICAgICAgICAgIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPj4gMyk7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihFTkRfT0ZfU1RSRUFNKTsKKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJc0J5dGVBbGlnbmVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGlzIGJ5dGUgYWxpZ25lZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIFRSVUUgICAgICAgIHN0cmVhbSBpcyBieXRlIGFsaWduZWQKKyAgICAgICAgICAgIEZBTFNFICAgICAgIHN0cmVhbSBpcyBub3QgYnl0ZSBhbGlnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBpZiAoIXBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKQorICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ0MDRiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TVFJFQU1fSAorI2RlZmluZSBIMjY0U1dERUNfU1RSRUFNX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTggICpwU3RybUJ1ZmZTdGFydDsgICAgLyogcG9pbnRlciB0byBzdGFydCBvZiBzdHJlYW0gYnVmZmVyICovCisgICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogY3VycmVudCByZWFkIGFkZHJlc3MgaW4gc3RyZWFtIGJ1ZmZlciAqLworICAgIHUzMiAgYml0UG9zSW5Xb3JkOyAgICAgIC8qIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gYnVmZmVyIGJ5dGUgKi8KKyAgICB1MzIgIHN0cm1CdWZmU2l6ZTsgICAgICAvKiBzaXplIG9mIHN0cmVhbSBidWZmZXIgKGJ5dGVzKSAqLworICAgIHUzMiAgc3RybUJ1ZmZSZWFkQml0czsgIC8qIG51bWJlciBvZiBiaXRzIHJlYWQgZnJvbSBzdHJlYW0gYnVmZmVyICovCit9IHN0cm1EYXRhX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RHZXRCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpOworCit1MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKTsKKwordTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cyk7CisKK3UzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICopOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TVFJFQU1fSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGViNmRkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYwpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RQcm9jZXNzQmxvY2sKKyAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYworICAgICAgICAgIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqLworLypsaW50IC1lNzAxIC1lNzAyICovCisKKy8qIExldmVsU2NhbGUgZnVuY3Rpb24gKi8KK3N0YXRpYyBjb25zdCBpMzIgbGV2ZWxTY2FsZVs2XVszXSA9IHsKKyAgICB7MTAsMTMsMTZ9LCB7MTEsMTQsMTh9LCB7MTMsMTYsMjB9LCB7MTQsMTgsMjN9LCB7MTYsMjAsMjV9LCB7MTgsMjMsMjl9fTsKKworLyogcXAgJSA2IGFzIGEgZnVuY3Rpb24gb2YgcXAgKi8KK3N0YXRpYyBjb25zdCB1OCBxcE1vZDZbNTJdID0gezAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LAorICAgIDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDN9OworCisvKiBxcCAvIDYgYXMgYSBmdW5jdGlvbiBvZiBxcCAqLworc3RhdGljIGNvbnN0IHU4IHFwRGl2Nls1Ml0gPSB7MCwwLDAsMCwwLDAsMSwxLDEsMSwxLDEsMiwyLDIsMiwyLDIsMywzLDMsMywzLDMsCisgICAgNCw0LDQsNCw0LDQsNSw1LDUsNSw1LDUsNiw2LDYsNiw2LDYsNyw3LDcsNyw3LDcsOCw4LDgsOH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgemlnLXphZyBzY2FuLCBpbnZlcnNlIHNjYWxpbmcgYW5kCisgICAgICAgICAgICBpbnZlcnNlIHRyYW5zZm9ybSBmb3IgYSBsdW1hIG9yIGEgY2hyb21hIHJlc2lkdWFsIGJsb2NrCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCisgICAgICAgICAgICBza2lwICAgICAgICAgICAgc2tpcCBwcm9jZXNzaW5nIG9mIGRhdGFbMF0sIHNldCB0byBub24temVybyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRjIGNvZWZmIGhhbmxlZCBzZXBhcmF0ZWx5CisgICAgICAgICAgICBjb2VmZk1hcCAgICAgICAgMTYgbHNiJ3MgaW5kaWNhdGUgd2hpY2ggY29lZmZzIGFyZSBub24temVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAobHNiKSBmb3IgY29lZmYgMCwgYml0IDEgZm9yIGNvZWZmIDEgZXRjLgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBwcm9jZXNzZWQgZGF0YSBub3QgaW4gdmFsaWQgcmFuZ2UgWy01MTIsIDUxMV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkUHJvY2Vzc0Jsb2NrKGkzMiAqZGF0YSwgdTMyIHFwLCB1MzIgc2tpcCwgdTMyIGNvZWZmTWFwKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIGkzMiBkMSwgZDIsIGQzOworICAgIHUzMiByb3csY29sOworICAgIHUzMiBxcERpdjsKKyAgICBpMzIgKnB0cjsKKworLyogQ29kZSAqLworCisgICAgcXBEaXYgPSBxcERpdjZbcXBdOworICAgIHRtcDEgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzBdIDw8IHFwRGl2OworICAgIHRtcDIgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzFdIDw8IHFwRGl2OworICAgIHRtcDMgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzJdIDw8IHFwRGl2OworCisgICAgaWYgKCFza2lwKQorICAgICAgICBkYXRhWzBdID0gKGRhdGFbMF0gKiB0bXAxKTsKKworICAgIC8qIGF0IGxlYXN0IG9uZSBvZiB0aGUgcm93cyAxLCAyIG9yIDMgY29udGFpbiBub24temVybyBjb2VmZnMsIG1hc2sgdGFrZXMKKyAgICAgKiB0aGUgc2Nhbm5pbmcgb3JkZXIgaW50byBhY2NvdW50ICovCisgICAgaWYgKGNvZWZmTWFwICYgMHhGRjlDKQorICAgIHsKKyAgICAgICAgLyogZG8gdGhlIHppZy16YWcgc2NhbiBhbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgZDEgPSBkYXRhWzFdOworICAgICAgICBkMiA9IGRhdGFbMTRdOworICAgICAgICBkMyA9IGRhdGFbMTVdOworICAgICAgICBkYXRhWzFdID0gKGQxICogdG1wMik7CisgICAgICAgIGRhdGFbMTRdID0gKGQyICogdG1wMik7CisgICAgICAgIGRhdGFbMTVdID0gKGQzICogdG1wMyk7CisKKyAgICAgICAgZDEgPSBkYXRhWzJdOworICAgICAgICBkMiA9IGRhdGFbNV07CisgICAgICAgIGQzID0gZGF0YVs0XTsKKyAgICAgICAgZGF0YVs0XSA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzJdICA9IChkMiAqIHRtcDEpOworICAgICAgICBkYXRhWzVdID0gKGQzICogdG1wMyk7CisKKyAgICAgICAgZDEgPSBkYXRhWzhdOworICAgICAgICBkMiA9IGRhdGFbM107CisgICAgICAgIGQzID0gZGF0YVs2XTsKKyAgICAgICAgdG1wMCA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzhdID0gKGQyICogdG1wMSk7CisgICAgICAgIGRhdGFbM10gID0gKGQzICogdG1wMik7CisgICAgICAgIGQxID0gZGF0YVs3XTsKKyAgICAgICAgZDIgPSBkYXRhWzEyXTsKKyAgICAgICAgZDMgPSBkYXRhWzldOworICAgICAgICBkYXRhWzZdICA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzddICA9IChkMiAqIHRtcDMpOworICAgICAgICBkYXRhWzEyXSA9IChkMyAqIHRtcDIpOworICAgICAgICBkYXRhWzldICA9IHRtcDA7CisKKyAgICAgICAgZDEgPSBkYXRhWzEwXTsKKyAgICAgICAgZDIgPSBkYXRhWzExXTsKKyAgICAgICAgZDMgPSBkYXRhWzEzXTsKKyAgICAgICAgZGF0YVsxM10gPSAoZDEgKiB0bXAzKTsKKyAgICAgICAgZGF0YVsxMF0gPSAoZDIgKiB0bXAxKTsKKyAgICAgICAgZGF0YVsxMV0gPSAoZDMgKiB0bXAyKTsKKworICAgICAgICAvKiBob3Jpem9udGFsIHRyYW5zZm9ybSAqLworICAgICAgICBmb3IgKHJvdyA9IDQsIHB0ciA9IGRhdGE7IHJvdy0tOyBwdHIgKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IHB0clswXSArIHB0clsyXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJbMF0gLSBwdHJbMl07CisgICAgICAgICAgICB0bXAyID0gKHB0clsxXSA+PiAxKSAtIHB0clszXTsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJbMV0gKyAocHRyWzNdID4+IDEpOworICAgICAgICAgICAgcHRyWzBdID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICBwdHJbMV0gPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHB0clsyXSA9IHRtcDEgLSB0bXAyOworICAgICAgICAgICAgcHRyWzNdID0gdG1wMCAtIHRtcDM7CisgICAgICAgIH0KKworICAgICAgICAvKmxpbnQgK2U2NjEgK2U2NjIqLworICAgICAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4XTsKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoZGF0YVs0XSA+PiAxKSAtIGRhdGFbMTJdOworICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyAoZGF0YVsxMl0gPj4gMSk7CisgICAgICAgICAgICBkYXRhWzAgXSA9ICh0bXAwICsgdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbNCBdID0gKHRtcDEgKyB0bXAyICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVs4IF0gPSAodG1wMSAtIHRtcDIgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzEyXSA9ICh0bXAwIC0gdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgZWFjaCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLworICAgICAgICAgICAgaWYgKCgodTMyKShkYXRhWzBdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbNF0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVs4XSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzEyXSArIDUxMikgPiAxMDIzKSApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogcm93cyAxLCAyIGFuZCAzIGFyZSB6ZXJvICovCisgICAgeworICAgICAgICAvKiBvbmx5IGRjLWNvZWZmIGlzIG5vbi16ZXJvLCBpLmUuIGNvZWZmcyBhdCBvcmlnaW5hbCBwb3NpdGlvbnMKKyAgICAgICAgICogMSwgNSBhbmQgNiBhcmUgemVybyAqLworICAgICAgICBpZiAoKGNvZWZmTWFwICYgMHg2MikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IChkYXRhWzBdICsgMzIpID4+IDY7CisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCisgICAgICAgICAgICBpZiAoKHUzMikodG1wMCArIDUxMikgPiAxMDIzKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIGRhdGFbMF0gPSBkYXRhWzFdICA9IGRhdGFbMl0gID0gZGF0YVszXSAgPSBkYXRhWzRdICA9IGRhdGFbNV0gID0KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhWzExXSA9IGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0KKyAgICAgICAgICAgICAgICAgICAgICB0bXAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogYXQgbGVhc3Qgb25lIG9mIHRoZSBjb2VmZnMgMSwgNSBvciA2IGlzIG5vbi16ZXJvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAoZGF0YVsxXSAqIHRtcDIpOworICAgICAgICAgICAgZGF0YVsyXSA9IChkYXRhWzVdICogdG1wMSk7CisgICAgICAgICAgICBkYXRhWzNdID0gKGRhdGFbNl0gKiB0bXAyKTsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVsyXTsKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVsyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoZGF0YVsxXSA+PiAxKSAtIGRhdGFbM107CisgICAgICAgICAgICB0bXAzID0gZGF0YVsxXSArIChkYXRhWzNdID4+IDEpOworICAgICAgICAgICAgZGF0YVswXSA9ICh0bXAwICsgdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAodG1wMSArIHRtcDIgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzJdID0gKHRtcDEgLSB0bXAyICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVszXSA9ICh0bXAwIC0gdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSBkYXRhWzBdOworICAgICAgICAgICAgZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IGRhdGFbMV07CisgICAgICAgICAgICBkYXRhWzZdID0gZGF0YVsxMF0gPSBkYXRhWzE0XSA9IGRhdGFbMl07CisgICAgICAgICAgICBkYXRhWzddID0gZGF0YVsxMV0gPSBkYXRhWzE1XSA9IGRhdGFbM107CisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IGVhY2ggdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KKyAgICAgICAgICAgIGlmICgoKHUzMikoZGF0YVswXSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzFdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMl0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVszXSArIDUxMikgPiAxMDIzKSApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0x1bWFEYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHppZy16YWcgc2NhbiwgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kCisgICAgICAgICAgICBpbnZlcnNlIHNjYWxpbmcgZm9yIGEgbHVtYSBEQyBjb2VmZmljaWVudHMgYmxvY2sKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaDI2NGJzZFByb2Nlc3NMdW1hRGMoaTMyICpkYXRhLCB1MzIgcXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdTMyIHJvdyxjb2w7CisgICAgdTMyIHFwTW9kLCBxcERpdjsKKyAgICBpMzIgbGV2U2NhbGU7CisgICAgaTMyICpwdHI7CisKKy8qIENvZGUgKi8KKworICAgIHFwTW9kID0gcXBNb2Q2W3FwXTsKKyAgICBxcERpdiA9IHFwRGl2NltxcF07CisKKyAgICAvKiB6aWctemFnIHNjYW4gKi8KKyAgICB0bXAwID0gZGF0YVsyXTsKKyAgICBkYXRhWzJdICA9IGRhdGFbNV07CisgICAgZGF0YVs1XSA9IGRhdGFbNF07CisgICAgZGF0YVs0XSA9IHRtcDA7CisKKyAgICB0bXAwID0gZGF0YVs4XTsKKyAgICBkYXRhWzhdID0gZGF0YVszXTsKKyAgICBkYXRhWzNdICA9IGRhdGFbNl07CisgICAgZGF0YVs2XSAgPSBkYXRhWzddOworICAgIGRhdGFbN10gID0gZGF0YVsxMl07CisgICAgZGF0YVsxMl0gPSBkYXRhWzldOworICAgIGRhdGFbOV0gID0gdG1wMDsKKworICAgIHRtcDAgPSBkYXRhWzEwXTsKKyAgICBkYXRhWzEwXSA9IGRhdGFbMTFdOworICAgIGRhdGFbMTFdID0gZGF0YVsxM107CisgICAgZGF0YVsxM10gPSB0bXAwOworCisgICAgLyogaG9yaXpvbnRhbCB0cmFuc2Zvcm0gKi8KKyAgICBmb3IgKHJvdyA9IDQsIHB0ciA9IGRhdGE7IHJvdy0tOyBwdHIgKz0gNCkKKyAgICB7CisgICAgICAgIHRtcDAgPSBwdHJbMF0gKyBwdHJbMl07CisgICAgICAgIHRtcDEgPSBwdHJbMF0gLSBwdHJbMl07CisgICAgICAgIHRtcDIgPSBwdHJbMV0gLSBwdHJbM107CisgICAgICAgIHRtcDMgPSBwdHJbMV0gKyBwdHJbM107CisgICAgICAgIHB0clswXSA9IHRtcDAgKyB0bXAzOworICAgICAgICBwdHJbMV0gPSB0bXAxICsgdG1wMjsKKyAgICAgICAgcHRyWzJdID0gdG1wMSAtIHRtcDI7CisgICAgICAgIHB0clszXSA9IHRtcDAgLSB0bXAzOworICAgIH0KKworICAgIC8qbGludCArZTY2MSArZTY2MiovCisgICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gYW5kIGludmVyc2Ugc2NhbGluZyAqLworICAgIGxldlNjYWxlID0gbGV2ZWxTY2FsZVsgcXBNb2QgXVswXTsKKyAgICBpZiAocXAgPj0gMTIpCisgICAgeworICAgICAgICBsZXZTY2FsZSA8PD0gKHFwRGl2LTIpOworICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4IF07CisgICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOCBdOworICAgICAgICAgICAgdG1wMiA9IGRhdGFbNF0gLSBkYXRhWzEyXTsKKyAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgZGF0YVsxMl07CisgICAgICAgICAgICBkYXRhWzAgXSA9ICgodG1wMCArIHRtcDMpKmxldlNjYWxlKTsKKyAgICAgICAgICAgIGRhdGFbNCBdID0gKCh0bXAxICsgdG1wMikqbGV2U2NhbGUpOworICAgICAgICAgICAgZGF0YVs4IF0gPSAoKHRtcDEgLSB0bXAyKSpsZXZTY2FsZSk7CisgICAgICAgICAgICBkYXRhWzEyXSA9ICgodG1wMCAtIHRtcDMpKmxldlNjYWxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpMzIgdG1wOworICAgICAgICB0bXAgPSAoKDEgLSBxcERpdikgPT0gMCkgPyAxIDogMjsKKyAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOCBdOworICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzggXTsKKyAgICAgICAgICAgIHRtcDIgPSBkYXRhWzRdIC0gZGF0YVsxMl07CisgICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIGRhdGFbMTJdOworICAgICAgICAgICAgZGF0YVswIF0gPSAoKHRtcDAgKyB0bXAzKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKKyAgICAgICAgICAgIGRhdGFbNCBdID0gKCh0bXAxICsgdG1wMikqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7CisgICAgICAgICAgICBkYXRhWzggXSA9ICgodG1wMSAtIHRtcDIpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOworICAgICAgICAgICAgZGF0YVsxMl0gPSAoKHRtcDAgLSB0bXAzKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzQ2hyb21hRGMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIGludmVyc2Ugc2NhbGluZyBmb3IgYQorICAgICAgICAgICAgY2hyb21hIERDIGNvZWZmaWNpZW50cyBibG9jaworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKGkzMiAqZGF0YSwgdTMyIHFwKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHUzMiBxcERpdjsKKyAgICBpMzIgbGV2U2NhbGU7CisgICAgdTMyIGxldlNoaWZ0OworCisvKiBDb2RlICovCisKKyAgICBxcERpdiA9IHFwRGl2NltxcF07CisgICAgbGV2U2NhbGUgPSBsZXZlbFNjYWxlWyBxcE1vZDZbcXBdIF1bMF07CisKKyAgICBpZiAocXAgPj0gNikKKyAgICB7CisgICAgICAgIGxldlNjYWxlIDw8PSAocXBEaXYtMSk7CisgICAgICAgIGxldlNoaWZ0ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGV2U2hpZnQgPSAxOworICAgIH0KKworICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVsyXTsKKyAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbMl07CisgICAgdG1wMiA9IGRhdGFbMV0gLSBkYXRhWzNdOworICAgIHRtcDMgPSBkYXRhWzFdICsgZGF0YVszXTsKKyAgICBkYXRhWzBdID0gKCh0bXAwICsgdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVsxXSA9ICgodG1wMCAtIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbMl0gPSAoKHRtcDEgKyB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzNdID0gKCh0bXAxIC0gdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgdG1wMCA9IGRhdGFbNF0gKyBkYXRhWzZdOworICAgIHRtcDEgPSBkYXRhWzRdIC0gZGF0YVs2XTsKKyAgICB0bXAyID0gZGF0YVs1XSAtIGRhdGFbN107CisgICAgdG1wMyA9IGRhdGFbNV0gKyBkYXRhWzddOworICAgIGRhdGFbNF0gPSAoKHRtcDAgKyB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzVdID0gKCh0bXAwIC0gdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVs2XSA9ICgodG1wMSArIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbN10gPSAoKHRtcDEgLSB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKworfQorCisvKmxpbnQgK2U3MDEgK2U3MDIgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGY0MWEyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1RSQU5TRk9STV9ICisjZGVmaW5lIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFByb2Nlc3NCbG9jayhpMzIgKmRhdGEsIHUzMiBxcCwgdTMyIHNraXAsIHUzMiBjb2VmZk1hcCk7Cit2b2lkIGgyNjRic2RQcm9jZXNzTHVtYURjKGkzMiAqZGF0YSwgdTMyIHFwKTsKK3ZvaWQgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhpMzIgKmRhdGEsIHUzMiBxcCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1RSQU5TRk9STV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzYjJmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisgICAgICAgICAgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKKyAgICAgICAgICBoMjY0YnNkTW9yZVJic3BEYXRhCisgICAgICAgICAgaDI2NGJzZE5leHRNYkFkZHJlc3MKKyAgICAgICAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBsb29rLXVwIHRhYmxlIGZvciBleHBlY3RlZCB2YWx1ZXMgb2Ygc3R1ZmZpbmcgYml0cyAqLworc3RhdGljIGNvbnN0IHUzMiBzdHVmZmluZ1RhYmxlWzhdID0gezB4MSwweDIsMHg0LDB4OCwweDEwLDB4MjAsMHg0MCwweDgwfTsKKworLyogbG9vay11cCB0YWJsZSBmb3IgY2hyb21hIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXMgYSBmdW5jdGlvbiBvZiBsdW1hIFFQICovCitjb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml0gPSB7MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwKKyAgICAyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwyOSwzMCwzMSwzMiwzMiwzMywzNCwzNCwzNSwzNSwzNiwzNiwzNywzNywzNywKKyAgICAzOCwzOCwzOCwzOSwzOSwzOSwzOX07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4xICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvdW50IGxlYWRpbmcgemVyb3MgaW4gYSBjb2RlIHdvcmQuIENvZGUgd29yZCBpcyBhc3N1bWVkIHRvIGJlCisgICAgICAgICAgICByaWdodC1hbGlnbmVkLCBsYXN0IGJpdCBvZiB0aGUgY29kZSB3b3JkIGluIHRoZSBsc2Igb2YgdGhlIHZhbHVlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHZhbHVlICAgY29kZSB3b3JkCisgICAgICAgICAgICBsZW5ndGggIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb2RlIHdvcmQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgY29kZSB3b3JkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUsIHUzMiBsZW5ndGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHplcm9zID0gMDsKKyAgICB1MzIgbWFzayA9IDEgPDwgKGxlbmd0aCAtIDEpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobGVuZ3RoIDw9IDMyKTsKKworICAgIHdoaWxlIChtYXNrICYmICEodmFsdWUgJiBtYXNrKSkKKyAgICB7CisgICAgICAgIHplcm9zKys7CisgICAgICAgIG1hc2sgPj49IDE7CisgICAgfQorICAgIHJldHVybih6ZXJvcyk7CisKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgUmF3IEJ5dGUgU3RyZWFtIFBheWxvYWQgKFJCU1ApIHRyYWlsaW5nIGJpdHMsIGkuZS4gc3R1ZmZpbmcuCisgICAgICAgICAgICBSZXN0IG9mIHRoZSBjdXJyZW50IGJ5dGUgKHdob2xlIGJ5dGUgaWYgYWxscmVhZHkgYnl0ZSBhbGlnbmVkKQorICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSBidWZmZXIgc2hhbGwgY29udGFpbiBhICcxJyBiaXQgZm9sbG93ZWQgYnkgemVybyBvcgorICAgICAgICAgICAgbW9yZSAnMCcgYml0cy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIFJCU1AgdHJhaWxpbmcgYml0cyBmb3VuZAorICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHN0dWZmaW5nOworICAgIHUzMiBzdHVmZmluZ0xlbmd0aDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7CisKKyAgICBzdHVmZmluZ0xlbmd0aCA9IDggLSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKworICAgIHN0dWZmaW5nID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBzdHVmZmluZ0xlbmd0aCk7CisgICAgaWYgKHN0dWZmaW5nID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGlmIChzdHVmZmluZyAhPSBzdHVmZmluZ1RhYmxlW3N0dWZmaW5nTGVuZ3RoIC0gMV0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMyAgRnVuY3Rpb246IGgyNjRic2RNb3JlUmJzcERhdGEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IFJCU1AuIFRoZSBzdGFuZGFyZAorICAgICAgICAgICAgZGVmaW5lcyB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgdGhlcmUgaXMgbW9yZSBkYXRhIGlmCisgICAgICAgICAgICAgICAgLW1vcmUgdGhhbiA4IGJpdHMgbGVmdCBvcgorICAgICAgICAgICAgICAgIC1sYXN0IGJpdHMgYXJlIG5vdCBSQlNQIHRyYWlsaW5nIGJpdHMKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19UUlVFICAgIHRoZXJlIGlzIG1vcmUgZGF0YQorICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgbm8gbW9yZSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYml0czsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA8PSA4ICogcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUpOworCisgICAgYml0cyA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplICogOCAtIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKKworICAgIGlmIChiaXRzID09IDApCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCisgICAgaWYgKCAoYml0cyA+IDgpIHx8CisgICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDEgPDwgKGJpdHMtMSkpKSApCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkTmV4dE1iQWRkcmVzcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgYWRkcmVzcyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHNsaWNlIGdyb3VwLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTbGljZUdyb3VwTWFwICAgICAgc2xpY2UgZ3JvdXAgZm9yIGVhY2ggbWFjcm9ibG9jaworICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICBzaXplIG9mIHRoZSBwaWN0dXJlCisgICAgICAgICAgICBjdXJyTWJBZGRyICAgICAgICAgIHdoZXJlIHRvIHN0YXJ0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrCisgICAgICAgICAgICAwICAgaWYgbm9uZSBvZiB0aGUgZm9sbG93aW5nIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBzYW1lIHNsaWNlCisgICAgICAgICAgICAgICAgZ3JvdXAgYXMgY3Vyck1iQWRkcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE5leHRNYkFkZHJlc3ModTMyICpwU2xpY2VHcm91cE1hcCwgdTMyIHBpY1NpemVJbk1icywgdTMyIGN1cnJNYkFkZHIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHNsaWNlR3JvdXAsIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTbGljZUdyb3VwTWFwKTsKKyAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKKyAgICBBU1NFUlQoY3Vyck1iQWRkciA8IHBpY1NpemVJbk1icyk7CisKKyAgICBzbGljZUdyb3VwID0gcFNsaWNlR3JvdXBNYXBbY3Vyck1iQWRkcl07CisKKyAgICBpID0gY3Vyck1iQWRkciArIDE7CisgICAgdG1wID0gcFNsaWNlR3JvdXBNYXBbaV07CisgICAgd2hpbGUgKChpIDwgcGljU2l6ZUluTWJzKSAmJiAodG1wICE9IHNsaWNlR3JvdXApKQorICAgIHsKKyAgICAgICAgaSsrOworICAgICAgICB0bXAgPSBwU2xpY2VHcm91cE1hcFtpXTsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBwaWNTaXplSW5NYnMpCisgICAgICAgIGkgPSAwOworCisgICAgcmV0dXJuKGkpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS41ICBGdW5jdGlvbjogaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2V0IGx1bWEgYW5kIGNocm9tYSBwb2ludGVycyBpbiBpbWFnZV90IGZvciBjdXJyZW50IE1CCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgaW1hZ2UgICAgICAgQ3VycmVudCBpbWFnZQorICAgICAgICAgICAgbWJOdW0gICAgICAgbnVtYmVyIG9mIGN1cnJlbnQgTUIKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtKQoreworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIHUzMiBwaWNTaXplOworICAgIHUzMiByb3csIGNvbDsKKyAgICB1MzIgdG1wOworCisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsKKyAgICByb3cgPSBtYk51bSAvIHdpZHRoOworICAgIGNvbCA9IG1iTnVtICUgd2lkdGg7CisKKyAgICB0bXAgPSByb3cgKiB3aWR0aDsKKyAgICBwaWNTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBpbWFnZS0+bHVtYSA9ICh1OCopKGltYWdlLT5kYXRhICsgY29sICogMTYgKyB0bXAgKiAyNTYpOworICAgIGltYWdlLT5jYiA9ICh1OCopKGltYWdlLT5kYXRhICsgcGljU2l6ZSAqIDI1NiArIHRtcCAqIDY0ICsgY29sICogOCk7CisgICAgaW1hZ2UtPmNyID0gKHU4KikoaW1hZ2UtPmNiICsgcGljU2l6ZSAqIDY0KTsKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjNhZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19VVElMX0gKKyNkZWZpbmUgSDI2NFNXREVDX1VUSUxfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9BU1NFUlRfVVNFRAorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKworI2lmIGRlZmluZWQoX1JBTkdFX0NIRUNLKSB8fCBkZWZpbmVkKF9ERUJVR19QUklOVCkgfHwgZGVmaW5lZChfRVJST1JfUFJJTlQpCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBIQU5UUk9fT0sgICAwCisjZGVmaW5lIEhBTlRST19OT0sgIDEKKworI2RlZmluZSBIQU5UUk9fVFJVRSAgICAgKDEpCisjZGVmaW5lIEhBTlRST19GQUxTRSAgICAoMCkKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKyNkZWZpbmUgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgMHhGRkZGCisjZGVmaW5lIFBBUkFNX1NFVF9FUlJPUiAweEZGRjAKKworLyogdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgR2V0Qml0cyBpZiBzdHJlYW0gYnVmZmVyIGlzIGVtcHR5ICovCisjZGVmaW5lIEVORF9PRl9TVFJFQU0gMHhGRkZGRkZGRlUKKworI2RlZmluZSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IgMHhGRkZGRkYKKworLyogbWFjcm8gdG8gbWFyayBhIHJlc2lkdWFsIGJsb2NrIGVtcHR5LCBpLmUuIGNvbnRhaW4gemVybyBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgTUFSS19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkgKChyZXNpZHVhbClbMF0gPSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IpCisvKiBtYWNybyB0byBjaGVjayBpZiByZXNpZHVhbCBibG9jayBpcyBlbXB0eSAqLworI2RlZmluZSBJU19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkgKChyZXNpZHVhbClbMF0gPT0gRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SKQorCisvKiBtYWNybyBmb3IgYXNzZXJ0aW9uLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfQVNTRVJUX1VTRUQgaXMgZGVmaW5lZCAqLworI2lmZGVmIF9BU1NFUlRfVVNFRAorI2RlZmluZSBBU1NFUlQoZXhwcikgYXNzZXJ0KGV4cHIpCisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgcmFuZ2UgY2hlY2tpbmcgYW4gdmFsdWUsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9SQU5HRV9DSEVDSworICogaXMgZGVmaW5lZCAqLworI2lmZGVmIF9SQU5HRV9DSEVDSworI2RlZmluZSBSQU5HRV9DSEVDSyh2YWx1ZSwgbWluQm91bmQsIG1heEJvdW5kKSBcCit7IFwKKyAgICBpZiAoKHZhbHVlKSA8IChtaW5Cb3VuZCkgfHwgKHZhbHVlKSA+IChtYXhCb3VuZCkpIFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBWYWx1ZSBleGNlZWRzIGdpdmVuIGxpbWl0KHMpIVxuIik7IFwKK30KKyNlbHNlCisjZGVmaW5lIFJBTkdFX0NIRUNLKHZhbHVlLCBtaW5Cb3VuZCwgbWF4Qm91bmQpCisjZW5kaWYKKworLyogbWFjcm8gZm9yIHJhbmdlIGNoZWNraW5nIGFuIGFycmF5LCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfUkFOR0VfQ0hFQ0sKKyAqIGlzIGRlZmluZWQgKi8KKyNpZmRlZiBfUkFOR0VfQ0hFQ0sKKyNkZWZpbmUgUkFOR0VfQ0hFQ0tfQVJSQVkoYXJyYXksIG1pbkJvdW5kLCBtYXhCb3VuZCwgbGVuZ3RoKSBcCit7IFwKKyAgICBpMzIgaTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCAobGVuZ3RoKTsgaSsrKSBcCisgICAgICAgIGlmICgoYXJyYXkpW2ldIDwgKG1pbkJvdW5kKSB8fCAoYXJyYXkpW2ldID4gKG1heEJvdW5kKSkgXAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFZhbHVlIFslZF0gZXhjZWVkcyBnaXZlbiBsaW1pdChzKSFcbiIsaSk7IFwKK30KKyNlbHNlCisjZGVmaW5lIFJBTkdFX0NIRUNLX0FSUkFZKGFycmF5LCBtaW5Cb3VuZCwgbWF4Qm91bmQsIGxlbmd0aCkKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgZGVidWcgcHJpbnRpbmcsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9ERUJVR19QUklOVCBpcworICogZGVmaW5lZCAqLworI2lmZGVmIF9ERUJVR19QUklOVAorI2RlZmluZSBERUJVRyhhcmdzKSBwcmludGYgYXJncworI2Vsc2UKKyNkZWZpbmUgREVCVUcoYXJncykKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgZXJyb3IgcHJpbnRpbmcsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9FUlJPUl9QUklOVCBpcworICogZGVmaW5lZCAqLworI2lmZGVmIF9FUlJPUl9QUklOVAorI2RlZmluZSBFUFJJTlQobXNnKSBmcHJpbnRmKHN0ZGVyciwiRVJST1I6ICVzXG4iLG1zZykKKyNlbHNlCisjZGVmaW5lIEVQUklOVChtc2cpCisjZW5kaWYKKworLyogbWFjcm8gdG8gZ2V0IHNtYWxsZXIgb2YgdHdvIHZhbHVlcyAqLworI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisvKiBtYWNybyB0byBnZXQgZ3JlYXRlciBvZiB0d28gdmFsdWVzICovCisjZGVmaW5lIE1BWChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisKKy8qIG1hY3JvIHRvIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLworI2RlZmluZSBBQlMoYSkgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKy8qIG1hY3JvIHRvIGNsaXAgYSB2YWx1ZSB6LCBzbyB0aGF0IHggPD0geiA9PCB5ICovCisjZGVmaW5lIENMSVAzKHgseSx6KSAoKCh6KSA8ICh4KSkgPyAoeCkgOiAoKCh6KSA+ICh5KSkgPyAoeSkgOiAoeikpKQorCisvKiBtYWNybyB0byBjbGlwIGEgdmFsdWUgeiwgc28gdGhhdCAwIDw9IHogPTwgMjU1ICovCisjZGVmaW5lIENMSVAxKHopICgoKHopIDwgMCkgPyAwIDogKCgoeikgPiAyNTUpID8gMjU1IDogKHopKSkKKworLyogbWFjcm8gdG8gYWxsb2NhdGUgbWVtb3J5ICovCisjZGVmaW5lIEFMTE9DQVRFKHB0ciwgY291bnQsIHR5cGUpIFwKK3sgXAorICAgIChwdHIpID0gSDI2NFN3RGVjTWFsbG9jKChjb3VudCkgKiBzaXplb2YodHlwZSkpOyBcCit9CisKKy8qIG1hY3JvIHRvIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworI2RlZmluZSBGUkVFKHB0cikgXAoreyBcCisgICAgSDI2NFN3RGVjRnJlZSgocHRyKSk7IChwdHIpID0gTlVMTDsgXAorfQorCisjZGVmaW5lIEFMSUdOKHB0ciwgYnl0ZVBvcykgXAorICAgICAgICAocHRyICsgKCAoKGJ5dGVQb3MgLSAoaW50KXB0cikgJiAoYnl0ZVBvcyAtIDEpKSAvIHNpemVvZigqcHRyKSApKQorCitleHRlcm4gY29uc3QgdTMyIGgyNjRic2RRcENbNTJdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSwgdTMyIGxlbmd0aCk7CisjZWxzZQordTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUpOworI2VuZGlmCit1MzIgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMoc3RybURhdGFfdCAqc3RybURhdGEpOworCit1MzIgaDI2NGJzZE1vcmVSYnNwRGF0YShzdHJtRGF0YV90ICpzdHJtRGF0YSk7CisKK3UzMiBoMjY0YnNkTmV4dE1iQWRkcmVzcyh1MzIgKnBTbGljZUdyb3VwTWFwLCB1MzIgcGljU2l6ZUluTWJzLCB1MzIgY3Vyck1iQWRkcik7CisKK3ZvaWQgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1VUSUxfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDYwZjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYwpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAorICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkCisgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBkZWZpbml0aW9uIG9mIHNwZWNpYWwgY29kZSBudW0sIHRoaXMgYWxvbmcgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQKKyAqIHRvIGhhbmRsZSBjb2RlIG51bSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzJdIGluIHRoZSBEZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAorICogZnVuY3Rpb24gKi8KKyNkZWZpbmUgQklHX0NPREVfTlVNIDB4RkZGRkZGRkZVCisKKy8qIE1hcHBpbmcgdGFibGVzIGZvciBjb2RlZF9ibG9ja19wYXR0ZXJuLCB1c2VkIGZvciBkZWNvZGluZyBvZiBtYXBwZWQKKyAqIEV4cC1Hb2xvbWIgY29kZXMgKi8KK3N0YXRpYyBjb25zdCB1OCBjb2RlZEJsb2NrUGF0dGVybkludHJhNHg0WzQ4XSA9IHsKKyAgICA0NywzMSwxNSwwLDIzLDI3LDI5LDMwLDcsMTEsMTMsMTQsMzksNDMsNDUsNDYsMTYsMyw1LDEwLDEyLDE5LDIxLDI2LDI4LDM1LAorICAgIDM3LDQyLDQ0LDEsMiw0LDgsMTcsMTgsMjAsMjQsNiw5LDIyLDI1LDMyLDMzLDM0LDM2LDQwLDM4LDQxfTsKKworc3RhdGljIGNvbnN0IHU4IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbNDhdID0geworICAgIDAsMTYsMSwyLDQsOCwzMiwzLDUsMTAsMTIsMTUsNDcsNywxMSwxMywxNCw2LDksMzEsMzUsMzcsNDIsNDQsMzMsMzQsMzYsNDAsCisgICAgMzksNDMsNDUsNDYsMTcsMTgsMjAsMjQsMTksMjEsMjYsMjgsMjMsMjcsMjksMzAsMjIsMjUsMzgsNDF9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMSAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvZGVOdW0gdXNlZAorICAgICAgICAgICAgaW4gb3RoZXIgRXhwLUdvbG9tYiBjb2RlIG1hcHBpbmdzLiBDb2RlIG51bSAoaS5lLiB0aGUgZGVjb2RlZAorICAgICAgICAgICAgc3ltYm9sKSBpcyBkZXRlcm1pbmVkIGFzCisKKyAgICAgICAgICAgICAgICBjb2RlTnVtID0gMl5sZWFkaW5nWmVyb3MgLSAxICsgR2V0Qml0cyhsZWFkaW5nWmVyb3MpCisKKyAgICAgICAgICAgIE5vcm1hbCBkZWNvZGVkIHN5bWJvbHMgYXJlIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdLiBTeW1ib2wKKyAgICAgICAgICAgIDJeMzItMSBpcyBpbmRpY2F0ZWQgYnkgQklHX0NPREVfTlVNIHdpdGggcmV0dXJuIHZhbHVlIEhBTlRST19PSworICAgICAgICAgICAgd2hpbGUgc3ltYm9sIDJeMzIgIGlzIGluZGljYXRlZCBieSBCSUdfQ09ERV9OVU0gd2l0aCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgIEhBTlRST19OT0suICBUaGVzZSB0d28gc3ltYm9scyBhcmUgc3BlY2lhbCBjYXNlcyB3aXRoIGNvZGUgbGVuZ3RoCisgICAgICAgICAgICBvZiA2NSwgaS5lLiAgMzIgJzAnIGJpdHMsIGEgJzEnIGJpdCwgYW5kIGVpdGhlciAwIG9yIDEgcmVwcmVzZW50ZWQKKyAgICAgICAgICAgIGJ5IDMyIGJpdHMuCisKKyAgICAgICAgICAgIFN5bWJvbCAyXjMyIGlzIG91dCBvZiB1bnNpZ25lZCAzMi1iaXQgcmFuZ2UgYnV0IGlzIG5lZWRlZCBmb3IKKyAgICAgICAgICAgIERlY29kZUV4cEdvbG9tYlNpZ25lZCB0byBleHByZXNzIHZhbHVlIC0yXjMxLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjb2RlTnVtICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQsIG5vdGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCSUdfQ09ERV9OVU0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqY29kZU51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYml0cywgbnVtWmVyb3M7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChjb2RlTnVtKTsKKworICAgIGJpdHMgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworCisgICAgLyogZmlyc3QgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggMSAqLworICAgIGlmIChiaXRzID49IDB4ODAwMDAwMDApCisgICAgeworICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICpjb2RlTnVtID0gMDsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIHNlY29uZCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCAzICovCisgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwMDAwMDAwKQorICAgIHsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAqY29kZU51bSA9IDEgKyAoKGJpdHMgPj4gMjkpICYgMHgxKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIHRoaXJkIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDUgKi8KKyAgICBlbHNlIGlmIChiaXRzID49IDB4MjAwMDAwMDApCisgICAgeworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDUpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICpjb2RlTnVtID0gMyArICgoYml0cyA+PiAyNykgJiAweDMpOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogZm91cnRoIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDcgKi8KKyAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMDAwMDApCisgICAgeworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDcpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICpjb2RlTnVtID0gNyArICgoYml0cyA+PiAyNSkgJiAweDcpOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogb3RoZXIgY29kZSBsZW5ndGhzICovCisgICAgZWxzZQorICAgIHsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgIG51bVplcm9zID0gNCArIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzLCAyOCk7CisjZWxzZQorICAgICAgICBudW1aZXJvcyA9IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzKTsKKyNlbmRpZgorICAgICAgICAvKiBhbGwgMzIgYml0cyBhcmUgemVybyAqLworICAgICAgICBpZiAobnVtWmVyb3MgPT0gMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgICpjb2RlTnVtID0gMDsKKyAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKTsKKyAgICAgICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgLyogY2hlY2sgMzNyZCBiaXQsIG11c3QgYmUgMSAqLworICAgICAgICAgICAgaWYgKGJpdHMgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBjYW5ub3QgdXNlIGgyNjRic2RHZXRCaXRzLCBsaW1pdGVkIHRvIDMxIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBiaXRzID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgLyogY29kZSBudW0gMl4zMiAtIDEsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZyAqLworICAgICAgICAgICAgICAgIGlmIChiaXRzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqY29kZU51bSA9IEJJR19DT0RFX05VTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGNvZGUgbnVtIDJeMzIsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZworICAgICAgICAgICAgICAgICAqIChyZXN1bHRzIGluIC0yXjMxKSAqLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpjb2RlTnVtID0gQklHX0NPREVfTlVNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgbW9yZSB6ZXJvcyB0aGFuIDMyLCBpdCBpcyBhbiBlcnJvciAqLworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLG51bVplcm9zKzEpOworCisgICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIG51bVplcm9zKTsKKyAgICAgICAgaWYgKGJpdHMgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAqY29kZU51bSA9ICgxIDw8IG51bVplcm9zKSAtIDEgKyBiaXRzOworCisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBzaWduZWQKKyAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGFzCisKKyAgICAgICAgICAgICAgICBzeW1ib2wgPSAoLTEpXihjb2RlTnVtKzEpICogKGNvZGVOdW0rMSkvMgorCisgICAgICAgICAgICBTaWduZWQgc3ltYm9scyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2UgWy0yXjMxLCAyXjMxIC0gMV0uIFN5bWJvbAorICAgICAgICAgICAgLTJeMzEgaXMgb2J0YWluZWQgd2hlbiBjb2RlTnVtIGlzIDJeMzIsIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQKKyAgICAgICAgICAgIGJ5IHVuc2lnbmVkIDMyLWJpdCB2YWx1ZS4gVGhpcyBpcyBzaWduYWxlZCBhcyBhIHNwZWNpYWwgY2FzZSBmcm9tCisgICAgICAgICAgICB0aGUgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGJ5IHNldHRpbmcgY29kZU51bSB0bworICAgICAgICAgICAgQklHX0NPREVfTlVNIGFuZCByZXR1cm5pbmcgSEFOVFJPX05PSyBzdGF0dXMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHN0YXR1cywgY29kZU51bSA9IDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVCh2YWx1ZSk7CisKKyAgICBzdGF0dXMgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29kZU51bSk7CisKKyAgICBpZiAoY29kZU51bSA9PSBCSUdfQ09ERV9OVU0pCisgICAgeworICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19PSyBzdGF0dXMgbWVhbnMgY29kZU51bSAyXjMyLTEgd2hpY2ggd291bGQKKyAgICAgICAgICogcmVzdWx0IGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAyXjMxIChpLmUuIG91dCBvZiAzMi1iaXQgc2lnbmVkCisgICAgICAgICAqIGludGVnZXIgcmFuZ2UpICovCisgICAgICAgIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19OT0sgc3RhdHVzIG1lYW5zIGNvZGVOdW0gMl4zMiB3aGljaCByZXN1bHRzCisgICAgICAgICAqIGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAtMl4zMSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICp2YWx1ZSA9IChpMzIpKDIxNDc0ODM2NDhVKTsKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQorICAgIHsKKyAgICAgICAgLyogKC0xKV4oY29kZU51bSsxKSByZXN1bHRzIGluIHBvc2l0aXZlIHNpZ24gaWYgY29kZU51bSBpcyBvZGQsCisgICAgICAgICAqIG5lZ2F0aXZlIHdoZW4gaXQgaXMgZXZlbi4gKGNvZGVOdW0rMSkvMiBpcyBvYnRhaW5lZCBhcworICAgICAgICAgKiAoY29kZU51bSsxKT4+MSB3aGVuIHZhbHVlIGlzIHBvc2l0aXZlIGFuZCBhcyAoLWNvZGVOdW0pPj4xIGZvcgorICAgICAgICAgKiBuZWdhdGl2ZSB2YWx1ZSAqLworICAgICAgICAvKmxpbnQgLWU3MDIgKi8KKyAgICAgICAgKnZhbHVlID0gKGNvZGVOdW0gJiAweDEpID8gKGkzMikoKGNvZGVOdW0gKyAxKSA+PiAxKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpMzIpKChjb2RlTnVtICsgMSkgPj4gMSk7CisgICAgICAgIC8qbGludCArZTcwMiAqLworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4zICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgbWFwcGVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBjb2RlZEJsb2NrUGF0dGVybgorICAgICAgICAgICAgZWl0aGVyIGZvciBpbnRyYSBvciBpbnRlciBtYWNyb2Jsb2NrLiBUaGUgbWFwcGluZyBpcyBpbXBsZW1lbnRlZCBieQorICAgICAgICAgICAgbG9vay11cCB0YWJsZXMgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgaXNJbnRyYSAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgaW50cmEgb3IgaW50ZXIgbWFwcGluZyBpcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKKyAgICB1MzIgaXNJbnRyYSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgc3RhdHVzLCBjb2RlTnVtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQodmFsdWUpOworCisgICAgc3RhdHVzID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvZGVOdW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcmFuZ2Ugb2YgdmFsaWQgY29kZU51bXMgWzAsNDddICovCisgICAgICAgIGlmIChjb2RlTnVtID4gNDcpCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICBpZiAoaXNJbnRyYSkKKyAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50cmE0eDRbY29kZU51bV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbY29kZU51bV07CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2RlLiBncmVhdGVyVGhhbk9uZSBmbGFnIGluZGljYXRlcworICAgICAgICAgICAgdGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wgdG8gYmUgZGVjb2RlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIEZBTFNFICAgLT4gIFswLDFdCisgICAgICAgICAgICAgICAgVFJVRSAgICAtPiAgWzAsMl4zMi0xXQorCisgICAgICAgICAgICBJZiBmbGFnIGlzIGZhbHNlIHRoZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgYnkgcmVhZGluZyBvbmUgYml0CisgICAgICAgICAgICBmcm9tIHRoZSBzdHJlYW0gd2l0aCBoMjY0YnNkR2V0Qml0cyBhbmQgbWFwcGluZyB0aGlzIHRvIGRlY29kZWQKKyAgICAgICAgICAgIHN5bWJvbCBhcworICAgICAgICAgICAgICAgIHN5bWJvbCA9IGJpdCA/IDAgOiAxCisKKyAgICAgICAgICAgIE90aGVyd2lzZSwgaS5lLiB3aGVuIGZsYWcgaXMgVFJVRSwgY29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGlzIGlzIHVzZWQgYXMgdGhlIGRlY29kZWQKKyAgICAgICAgICAgIHN5bWJvbC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGdyZWF0ZXJUaGFuT25lICBmbGFnIHRvIGluZGljYXRlIGlmIHJhbmdlIGlzIHdpZGVyIHRoYW4gWzAsMV0KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiAqdmFsdWUsCisgIHUzMiBncmVhdGVyVGhhbk9uZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVCh2YWx1ZSk7CisKKyAgICBpZiAoZ3JlYXRlclRoYW5PbmUpCisgICAgeworICAgICAgICByZXR1cm4oaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgdmFsdWUpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLDEpOworICAgICAgICBpZiAoKnZhbHVlID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICAqdmFsdWUgXj0gMHgxOworICAgIH0KKworICAgIHJldHVybiAoSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGMxNjc3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1ZMQ19ICisjZGVmaW5lIEgyNjRTV0RFQ19WTENfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgaTMyICp2YWx1ZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKKyAgICB1MzIgaXNJbnRyYSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKKyAgICB1MzIgZ3JlYXRlclRoYW5PbmUpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19WTENfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGE5MzM1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYwpAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzCisgICAgICAgICAgRGVjb2RlSHJkUGFyYW1ldGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX0RQQl9TSVpFIDE2CisjZGVmaW5lIE1BWF9CUiAgICAgICAyNDAwMDAgLyogZm9yIGxldmVsIDUuMSAqLworI2RlZmluZSBNQVhfQ1BCICAgICAgMjQwMDAwIC8qIGZvciBsZXZlbCA1LjEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUhyZFBhcmFtZXRlcnMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgaHJkUGFyYW1ldGVyc190ICpwSHJkUGFyYW1ldGVycyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIFZVSSBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0cmVhbS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycyAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHZ1aVBhcmFtZXRlcnNfdCAqcFZ1aVBhcmFtZXRlcnMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBWdWlQYXJhbWV0ZXJzKTsKKworICAgIEgyNjRTd0RlY01lbXNldChwVnVpUGFyYW1ldGVycywgMCwgc2l6ZW9mKHZ1aVBhcmFtZXRlcnNfdCkpOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjID0gdG1wOworCisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMgPT0gQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+c2FySGVpZ2h0ID0gdG1wOworICAgICAgICB9CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5JbmZvUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5BcHByb3ByaWF0ZUZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAzKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9Gb3JtYXQgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9GdWxsUmFuZ2VGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcgPQorICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzID0gdG1wOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyAgICAgICAgID0gMjsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IDI7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzICAgICAgPSAyOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Zvcm1hdCAgICAgICAgICAgICA9IDU7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgICAgICAgICA9IDI7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IDI7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgICAgICA9IDI7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+Y2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFMb2NJbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQgPiA1KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZCA+IDUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+dGltaW5nSW5mb1ByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT50aW1pbmdJbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpZiAodG1wID09IDApCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5udW1Vbml0c0luVGljayA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpZiAodG1wID09IDApCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50aW1lU2NhbGUgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+Zml4ZWRGcmFtZVJhdGVGbGFnID0KKyAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IERlY29kZUhyZFBhcmFtZXRlcnMocFN0cm1EYXRhLCAmcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJDbnQgICAgICAgICAgPSAxOworICAgICAgICAvKiBNYXhCUiBhbmQgTWF4Q1BCIHNob3VsZCBiZSB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpZyB0byB0aGUgbGV2ZWxJZGMKKyAgICAgICAgICogaW4gdGhlIFNQUyBjb250YWluaW5nIHRoZXNlIFZVSSBwYXJhbWV0ZXJzLiBIb3dldmVyLCB0aGVzZSB2YWx1ZXMKKyAgICAgICAgICogYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFuZCBtYXhpbXVtIGZvciBhbnkgbGV2ZWwgd2lsbCBiZSB1c2VkIGhlcmUgKi8KKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuYml0UmF0ZVZhbHVlWzBdID0gMTIwMCAqIE1BWF9CUiArIDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYlNpemVWYWx1ZVswXSA9IDEyMDAgKiBNQVhfQ1BCICsgMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJSZW1vdmFsRGVsYXlMZW5ndGggICAgICAgID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmRwYk91dHB1dERlbGF5TGVuZ3RoICAgICAgICAgPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMudGltZU9mZnNldExlbmd0aCAgICAgICAgICAgICA9IDI0OworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gRGVjb2RlSHJkUGFyYW1ldGVycyhwU3RybURhdGEsICZwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYkNudCAgICAgICAgICA9IDE7CisgICAgICAgIC8qIE1heEJSIGFuZCBNYXhDUEIgc2hvdWxkIGJlIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGlnIHRvIHRoZSBsZXZlbElkYworICAgICAgICAgKiBpbiB0aGUgU1BTIGNvbnRhaW5pbmcgdGhlc2UgVlVJIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcworICAgICAgICAgKiBhcmUgbm90IHVzZWQgYW55d2hlcmUgYW5kIG1heGltdW0gZm9yIGFueSBsZXZlbCB3aWxsIGJlIHVzZWQgaGVyZSAqLworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5iaXRSYXRlVmFsdWVbMF0gPSAxMDAwICogTUFYX0JSICsgMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiU2l6ZVZhbHVlWzBdID0gMTAwMCAqIE1BWF9DUEIgKyAxOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYlJlbW92YWxEZWxheUxlbmd0aCAgICAgICAgPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuZHBiT3V0cHV0RGVsYXlMZW5ndGggICAgICAgICA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy50aW1lT2Zmc2V0TGVuZ3RoICAgICAgICAgICAgID0gMjQ7CisgICAgfQorCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgfHwKKyAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb3dEZWxheUhyZEZsYWcgPQorICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnID0KKyAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSA+IDE2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20gPiAxNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCA+IDE2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwgPiAxNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20gICAgICAgPSAyOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20gICAgICAgICA9IDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsID0gMTY7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCAgID0gMTY7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzICAgICAgICAgID0gTUFYX0RQQl9TSVpFOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgICAgICA9IE1BWF9EUEJfU0laRTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUhyZFBhcmFtZXRlcnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIEhSRCBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0cmVhbS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwSHJkUGFyYW1ldGVycyAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVIcmRQYXJhbWV0ZXJzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIGhyZFBhcmFtZXRlcnNfdCAqcEhyZFBhcmFtZXRlcnMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBIcmRQYXJhbWV0ZXJzKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICAvKiBjcGJDb3VudCA9IGNwYl9jbnRfbWludXMxICsgMSAqLworICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQrKzsKKyAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmNwYkNudCA+IE1BWF9DUEJfQ05UKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlU2NhbGUgPSB0bXA7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplU2NhbGUgPSB0bXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEhyZFBhcmFtZXRlcnMtPmNwYkNudDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogYml0X3JhdGVfdmFsdWVfbWludXMxIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdICovCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSA+IDQyOTQ5NjcyOTRVKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldKys7CisgICAgICAgIC8qIHRoaXMgbWF5IHJlc3VsdCBpbiBvdmVyZmxvdywgYnV0IHRoaXMgdmFsdWUgaXMgbm90IHVzZWQgZm9yCisgICAgICAgICAqIGFueXRoaW5nICovCisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0gKj0KKyAgICAgICAgICAgIDEgPDwgKDYgKyBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVNjYWxlKTsKKworICAgICAgICAvKiBjcGJfc2l6ZV92YWx1ZV9taW51czEgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldID4gNDI5NDk2NzI5NFUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0rKzsKKyAgICAgICAgLyogdGhpcyBtYXkgcmVzdWx0IGluIG92ZXJmbG93LCBidXQgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBmb3IKKyAgICAgICAgICogYW55dGhpbmcgKi8KKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSAqPQorICAgICAgICAgICAgMSA8PCAoNCArIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplU2NhbGUpOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNickZsYWdbaV0gPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+aW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IHRtcCArIDE7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJSZW1vdmFsRGVsYXlMZW5ndGggPSB0bXAgKyAxOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+ZHBiT3V0cHV0RGVsYXlMZW5ndGggPSB0bXAgKyAxOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+dGltZU9mZnNldExlbmd0aCA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWQ1MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1ZVSV9ICisjZGVmaW5lIEgyNjRTV0RFQ19WVUlfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNQVhfQ1BCX0NOVCAzMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGVudW1lcmF0ZWQgc2FtcGxlIGFzcGVjdCByYXRpb3MsIEFTUEVDVF9SQVRJT19NX04gbWVhbnMgTTpOICovCitlbnVtCit7CisgICAgQVNQRUNUX1JBVElPX1VOU1BFQ0lGSUVEID0gMCwKKyAgICBBU1BFQ1RfUkFUSU9fMV8xLAorICAgIEFTUEVDVF9SQVRJT18xMl8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTBfMTEsCisgICAgQVNQRUNUX1JBVElPXzE2XzExLAorICAgIEFTUEVDVF9SQVRJT180MF8zMywKKyAgICBBU1BFQ1RfUkFUSU9fMjRfMTEsCisgICAgQVNQRUNUX1JBVElPXzIwXzExLAorICAgIEFTUEVDVF9SQVRJT18zMl8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fODBfMzMsCisgICAgQVNQRUNUX1JBVElPXzE4XzExLAorICAgIEFTUEVDVF9SQVRJT18xNV8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fNjRfMzMsCisgICAgQVNQRUNUX1JBVElPXzE2MF85OSwKKyAgICBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSID0gMjU1Cit9OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgSHlwb3RoZXRpY2FsIFJlZmVyZW5jZSBEZWNvZGVyIChIUkQpIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGNwYkNudDsKKyAgICB1MzIgYml0UmF0ZVNjYWxlOworICAgIHUzMiBjcGJTaXplU2NhbGU7CisgICAgdTMyIGJpdFJhdGVWYWx1ZVtNQVhfQ1BCX0NOVF07CisgICAgdTMyIGNwYlNpemVWYWx1ZVtNQVhfQ1BCX0NOVF07CisgICAgdTMyIGNickZsYWdbTUFYX0NQQl9DTlRdOworICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoOworICAgIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGg7CisgICAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoOworICAgIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoOworfSBocmRQYXJhbWV0ZXJzX3Q7CisKKy8qIHN0b3JhZ2UgZm9yIFZVSSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBhc3BlY3RSYXRpb1ByZXNlbnRGbGFnOworICAgIHUzMiBhc3BlY3RSYXRpb0lkYzsKKyAgICB1MzIgc2FyV2lkdGg7CisgICAgdTMyIHNhckhlaWdodDsKKyAgICB1MzIgb3ZlcnNjYW5JbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIG92ZXJzY2FuQXBwcm9wcmlhdGVGbGFnOworICAgIHUzMiB2aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZzsKKyAgICB1MzIgdmlkZW9Gb3JtYXQ7CisgICAgdTMyIHZpZGVvRnVsbFJhbmdlRmxhZzsKKyAgICB1MzIgY29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZzsKKyAgICB1MzIgY29sb3VyUHJpbWFyaWVzOworICAgIHUzMiB0cmFuc2ZlckNoYXJhY3RlcmlzdGljczsKKyAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOworICAgIHUzMiBjaHJvbWFMb2NJbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZDsKKyAgICB1MzIgY2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkOworICAgIHUzMiB0aW1pbmdJbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIG51bVVuaXRzSW5UaWNrOworICAgIHUzMiB0aW1lU2NhbGU7CisgICAgdTMyIGZpeGVkRnJhbWVSYXRlRmxhZzsKKyAgICB1MzIgbmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOworICAgIGhyZFBhcmFtZXRlcnNfdCBuYWxIcmRQYXJhbWV0ZXJzOworICAgIHUzMiB2Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWc7CisgICAgaHJkUGFyYW1ldGVyc190IHZjbEhyZFBhcmFtZXRlcnM7CisgICAgdTMyIGxvd0RlbGF5SHJkRmxhZzsKKyAgICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWc7CisgICAgdTMyIGJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZzsKKyAgICB1MzIgbW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZzsKKyAgICB1MzIgbWF4Qnl0ZXNQZXJQaWNEZW5vbTsKKyAgICB1MzIgbWF4Qml0c1Blck1iRGVub207CisgICAgdTMyIGxvZzJNYXhNdkxlbmd0aEhvcml6b250YWw7CisgICAgdTMyIGxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsOworICAgIHUzMiBudW1SZW9yZGVyRnJhbWVzOworICAgIHUzMiBtYXhEZWNGcmFtZUJ1ZmZlcmluZzsKK30gdnVpUGFyYW1ldGVyc190OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycyk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1ZVSV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggNzAyYTdiNC4uNjJiYTQwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTksMTAgKzksNiBAQAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9oYXJkd2FyZS9tc203awogCi1pZm5lcSAoJChmaWx0ZXIgY3Jlc3BvIGNyZXNwbzRnLCQoVEFSR0VUX0RFVklDRSkpLCkKLUxPQ0FMX0NGTEFHUyArPSAtRFRISVNfSVNfQ1JFU1BPPTEKLWVuZGlmCi0KIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKaW5kZXggNGI3MmE1My4uYjI4ZDk0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC0yMCw4ICsyMCw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IGludCBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMDsKLQogQ29sb3JDb252ZXJ0ZXI6OkNvbG9yQ29udmVydGVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmcm9tLCBPTVhfQ09MT1JfRk9STUFUVFlQRSB0bykKICAgICA6IG1TcmNGb3JtYXQoZnJvbSksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggMTgyOGFjOC4uYTRlOGVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtNTksNyArNTksNiBAQAogICAgIHNpemVfdCBidWZXaWR0aCwgYnVmSGVpZ2h0OwogCiAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKLSNpZm5kZWYgVEhJU19JU19DUkVTUE8KICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICB7CiAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CkBAIC02Nyw3ICs2Niw2IEBACiAgICAgICAgICAgICBidWZIZWlnaHQgPSAobUhlaWdodCArIDEpICYgfjE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotI2VuZGlmCiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKQEAgLTg5LDExICs4Nyw3IEBACiAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOCi0gICAgICAgICAgICB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRQotI2lmbmRlZiBUSElTX0lTX0NSRVNQTwotICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1AKLSNlbmRpZgotICAgICAgICAgICAgKSk7CisgICAgICAgICAgICB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfRVhURVJOQUxfRElTUCkpOwogCiAgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PwogICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IGE5ZThlOTUuLmY2ZGYzODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC05Myw2ICs5Myw3IEBACiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKICAgICBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgc3RhdHVzX3Qgc2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKIAogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7CiAKQEAgLTEwNCw2ICsxMDUsOCBAQAogCiAgICAgc3RhdHVzX3Qgc2V0VGltZWRUZXh0VHJhY2tJbmRleChpbnQzMl90IGluZGV4KTsKIAorICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IEF3ZXNvbWVFdmVudDsKICAgICBmcmllbmQgc3RydWN0IFByZXZpZXdQbGF5ZXI7CkBAIC0xNDEsNiArMTQ0LDcgQEAKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAgICAgTXV0ZXggbU1pc2NTdGF0ZUxvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtU3RhdHNMb2NrOwogCiAgICAgT01YQ2xpZW50IG1DbGllbnQ7CiAgICAgVGltZWRFdmVudFF1ZXVlIG1RdWV1ZTsKQEAgLTI5MSw2ICsyOTUsMzQgQEAKICAgICB2b2lkIHNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpOwogCiAgICAgYm9vbCBpc1N0cmVhbWluZ0hUVFAoKSBjb25zdDsKKyAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7CisKKyAgICBlbnVtIEZsYWdNb2RlIHsKKyAgICAgICAgU0VULAorICAgICAgICBDTEVBUiwKKyAgICAgICAgQVNTSUdOCisgICAgfTsKKyAgICB2b2lkIG1vZGlmeUZsYWdzKHVuc2lnbmVkIHZhbHVlLCBGbGFnTW9kZSBtb2RlKTsKKworICAgIHN0cnVjdCBUcmFja1N0YXQgeworICAgICAgICBTdHJpbmc4IG1NSU1FOworICAgICAgICBTdHJpbmc4IG1EZWNvZGVyTmFtZTsKKyAgICB9OworCisgICAgLy8gcHJvdGVjdGVkIGJ5IG1TdGF0c0xvY2sKKyAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICBpbnQgbUZkOworICAgICAgICBTdHJpbmc4IG1VUkk7CisgICAgICAgIGludDY0X3QgbUJpdHJhdGU7CisgICAgICAgIHNzaXplX3QgbUF1ZGlvVHJhY2tJbmRleDsKKyAgICAgICAgc3NpemVfdCBtVmlkZW9UcmFja0luZGV4OworICAgICAgICBpbnQ2NF90IG1OdW1WaWRlb0ZyYW1lc0RlY29kZWQ7CisgICAgICAgIGludDY0X3QgbU51bVZpZGVvRnJhbWVzRHJvcHBlZDsKKyAgICAgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKKyAgICAgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgVmVjdG9yPFRyYWNrU3RhdD4gbVRyYWNrczsKKyAgICB9IG1TdGF0czsKIAogICAgIEF3ZXNvbWVQbGF5ZXIoY29uc3QgQXdlc29tZVBsYXllciAmKTsKICAgICBBd2Vzb21lUGxheWVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZVBsYXllciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKaW5kZXggMGUyOTI3ZC4uZDgzM2UyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKQEAgLTQzLDggKzQzLDYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogCi0gICAgdmlydHVhbCBib29sIGVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpOwotCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbigpOwogCiAgICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CkBAIC02NywxMSArNjUsNiBAQAogICAgICAgICBESVNDT05ORUNUSU5HCiAgICAgfTsKIAotICAgIHN0cnVjdCBCYW5kd2lkdGhFbnRyeSB7Ci0gICAgICAgIGludDY0X3QgbURlbGF5VXM7Ci0gICAgICAgIHNpemVfdCBtTnVtQnl0ZXM7Ci0gICAgfTsKLQogICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CkBAIC05NCwxMSArODcsNiBAQAogCiAgICAgU3RyaW5nOCBtQ29udGVudFR5cGU7CiAKLSAgICBMaXN0PEJhbmR3aWR0aEVudHJ5PiBtQmFuZHdpZHRoSGlzdG9yeTsKLSAgICBzaXplX3QgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtczsKLSAgICBpbnQ2NF90IG1Ub3RhbFRyYW5zZmVyVGltZVVzOwotICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlckJ5dGVzOwotCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAKQEAgLTEyMSw4ICsxMDksNiBAQAogICAgIHZvaWQgb25SZWFkQ29tcGxldGVkKHNzaXplX3Qgc2l6ZSk7CiAgICAgdm9pZCBvbkRpc2Nvbm5lY3RDb21wbGV0ZSgpOwogCi0gICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudF9sKHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKTsKLQogICAgIHZvaWQgY2xlYXJEUk1TdGF0ZV9sKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaHJvbWl1bUhUVFBEYXRhU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCA2Y2VjMzkwLi4zYTdmYmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC0yMCw2ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQwLDExICs0Miw0MSBAQAogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGJhbmR3aWR0aCBjb3VsZCBzdWNjZXNzZnVsbHkgYmUgZXN0aW1hdGVkLAogICAgIC8vIGZhbHNlIG90aGVyd2lzZS4KLSAgICB2aXJ0dWFsIGJvb2wgZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2JwcykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKIAogICAgIHN0YXRpYyBzcDxIVFRQQmFzZT4gQ3JlYXRlKHVpbnQzMl90IGZsYWdzID0gMCk7CiAKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKTsKKwogcHJpdmF0ZToKKworICAgIHN0cnVjdCBCYW5kd2lkdGhFbnRyeSB7CisgICAgICAgIGludDY0X3QgbURlbGF5VXM7CisgICAgICAgIHNpemVfdCBtTnVtQnl0ZXM7CisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworCisgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT4gbUJhbmR3aWR0aEhpc3Rvcnk7CisgICAgc2l6ZV90IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7CisgICAgaW50NjRfdCBtVG90YWxUcmFuc2ZlclRpbWVVczsKKyAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJCeXRlczsKKworICAgIGVudW0geworICAgICAgICBrTWluQmFuZHdpZHRoQ29sbGVjdEZyZXFNcyA9IDEwMDAsICAgLy8gMSBzZWNvbmQKKyAgICAgICAga01heEJhbmR3aWR0aENvbGxlY3RGcmVxTXMgPSA2MDAwMCwgIC8vIG9uZSBtaW51dGUKKyAgICB9OworCisgICAgaW50NjRfdCBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXM7CisgICAgaW50MzJfdCBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CisgICAgaW50MzJfdCBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNczsKKworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUEJhc2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggZWQzZTI2NS4uMmQ2Y2I4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC01MCw2ICs1MCwxMiBAQAogCiAgICAgdm9pZCByZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CiAKKyAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCBvbmx5IGlmIHRoZQorICAgIC8vIGRhdGEgc291cmNlIGlzIEhUVFAtYmFzZWQ7IG90aGVyd2lzZSwgRVJST1JfVU5TVVBQT1JURUQKKyAgICAvLyBpcyByZXR1cm5lZC4KKyAgICBzdGF0dXNfdCBnZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGludDMyX3QgKmticHMpOworICAgIHN0YXR1c190IHNldENhY2hlU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51Q2FjaGVkU291cmNlMigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCmluZGV4IDJhYjFmMTkuLmMyNjViM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCkBAIC00MywxMCArNDMsNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgYmFuZHdpZHRoIGNvdWxkIHN1Y2Nlc3NmdWxseSBiZSBlc3RpbWF0ZWQsCi0gICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKLQogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oKTsKICAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CkBAIC02MywxMSArNTksNiBAQAogICAgICAgICBDT05ORUNURUQKICAgICB9OwogCi0gICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKLSAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKLSAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKLSAgICB9OwotCiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICB1aW50MzJfdCBtRmxhZ3M7CkBAIC05MywxMSArODQsNiBAQAogICAgIC8vIGNodW5rIGhlYWRlciAob3IgLTEgaWYgbm8gbW9yZSBjaHVua3MpLgogICAgIHNzaXplX3QgbUNodW5rRGF0YUJ5dGVzTGVmdDsKIAotICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+IG1CYW5kd2lkdGhIaXN0b3J5OwotICAgIHNpemVfdCBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotICAgIGludDY0X3QgbVRvdGFsVHJhbnNmZXJUaW1lVXM7Ci0gICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyQnl0ZXM7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApAQCAtMTE0LDcgKzEwMCw2IEBACiAgICAgc3NpemVfdCBpbnRlcm5hbFJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgdm9pZCBhcHBseVRpbWVvdXRSZXNwb25zZSgpOwotICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CiAKICAgICBzdGF0aWMgdm9pZCBNYWtlRnVsbEhlYWRlcnMoCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqb3ZlcnJpZGVzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCA0YjFjM2E3Li4xNDk2OGU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMTE2LDcgKzExNiw3IEBACiB9CiAKIHZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OnRocmVhZEVudHJ5KCkgewotICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT01YQ2FsbGJhY2tEaXNwIiwgMCwgMCwgMCk7CiAKICAgICBmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggMDRjYTM5ZS4uMDJiMWM4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtMzcsNiArMzcsNyBAQAogICAgIHsgIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAiYWFjZGVjIiwgImF1ZGlvX2RlY29kZXIuYWFjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIsICJhbXJkZWMiLCAiYXVkaW9fZGVjb2Rlci5hbXJuYiIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAiYW1yZGVjIiwgImF1ZGlvX2RlY29kZXIuYW1yd2IiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiLCAiaDI2NGRlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmF2Yy5kZWNvZGVyIiwgImF2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIgfSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggMDUzODU0Zi4uNDRkZjViNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19oYWwuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgpAQCAtNTMsMTMgKzUzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoZSBzaW0gYnVpbGQgZG9lc24ndCBoYXZlIGdldHRpZAotCi0jaWZuZGVmIEhBVkVfR0VUVElECi0jIGRlZmluZSBnZXR0aWQgZ2V0cGlkCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM2MCw4ICszNTMsOCBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC00MjksNyArNDIyLDcgQEAKICAgICAgICAgTE9HVigiY3JlYXRlVHJhY2soKSBsU2Vzc2lvbklkOiAlZCIsIGxTZXNzaW9uSWQpOwogCiAgICAgICAgIHRyYWNrID0gdGhyZWFkLT5jcmVhdGVUcmFja19sKGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBsU2Vzc2lvbklkLCAmbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgbFNlc3Npb25JZCwgJmxTdGF0dXMpOwogCiAgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCiAgICAgICAgIC8vIGZvciBhIHRyYWNrIHRvIGJlIGNyZWF0ZWQKQEAgLTQ3Nyw3ICs0NzAsNyBAQAogICAgIHJldHVybiB0aHJlYWQtPmNoYW5uZWxDb3VudCgpOwogfQogCi1pbnQgQXVkaW9GbGluZ2VyOjpmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6Zm9ybWF0KGludCBvdXRwdXQpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CkBAIC05MTYsNyArOTA5LDcgQEAKICAgICByZXR1cm4gKGludCltQ2hhbm5lbENvdW50OwogfQogCi1pbnQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpmb3JtYXQoKSBjb25zdAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpmb3JtYXQoKSBjb25zdAogewogICAgIHJldHVybiBtRm9ybWF0OwogfQpAQCAtMTAwMiw2ICs5OTUsOCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDaGFubmVsIENvdW50OiAlZFxuIiwgbUNoYW5uZWxDb3VudCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgTWFzazogMHglMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRnJhbWUgc2l6ZTogJWRcbiIsIG1GcmFtZVNpemUpOwpAQCAtMTA3NSw3ICsxMDcwLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSAgQ2xpZW4gVHlwIEZtdCBDaG4gU2Vzc2lvbiBCdWYgIFMgTSBGIFNSYXRlIExlZnRWIFJpZ2hWICBTZXJ2ICAgICAgIFVzZXIgICAgICAgTWFpbiBidWYgICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBtYXNrICAgU2Vzc2lvbiBCdWYgIFMgTSBGIFNSYXRlIExlZnRWIFJpZ2hWICBTZXJ2ICAgICAgIFVzZXIgICAgICAgTWFpbiBidWYgICBBdXggQnVmXG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTEwODYsNyArMTA4MSw3IEBACiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIG1hc2sgICBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICB3cDxUcmFjaz4gd1RyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHdUcmFjayAhPSAwKSB7CkBAIC0xMTcyLDggKzExNjcsOCBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBpbnQgc2Vzc2lvbklkLApAQCAtMTE4MywxMSArMTE3OCwxNCBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKICAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxDb3VudCAhPSAoaW50KW1DaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiAgc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxDb3VudCAlZCBmb3Igb3V0cHV0ICVwIiwKLSAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsIG1PdXRwdXQpOwotICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgaWYgKChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSA9PSBBVURJT19GT1JNQVRfUENNKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSB8fCBmb3JtYXQgIT0gbUZvcm1hdCB8fCBjaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrIDB4JTA4eCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KQEAgLTEyMjQsNyArMTIyMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpOwogICAgICAgICBpZiAodHJhY2stPmdldENibGsoKSA9PSBOVUxMIHx8IHRyYWNrLT5uYW1lKCkgPCAwKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgZ290byBFeGl0OwpAQCAtMTM3Myw3ICsxMzcxLDcgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRDoKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbHM7CisgICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIGRlc2Muc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CkBAIC0xMzkzLDggKzEzOTEsOCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpCiB7CiAgICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtQ2hhbm5lbHMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KXBvcGNvdW50KG1DaGFubmVscyk7CisgICAgbUNoYW5uZWxNYXNrID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdClwb3Bjb3VudChtQ2hhbm5lbE1hc2spOwogICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lU2l6ZSA9ICh1aW50MTZfdClhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1GcmFtZUNvdW50ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbikgLyBtRnJhbWVTaXplOwpAQCAtMTgwNCw3ICsxODAyLDcgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsICh2b2lkICopdHJhY2stPmZvcm1hdCgpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9DT1VOVCwgKHZvaWQgKil0cmFjay0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKil0cmFjay0+Y2hhbm5lbE1hc2soKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLApAQCAtMjY4Myw3ICsyNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CiAgICAgaWYgKG91dHB1dFRyYWNrLT5jYmxrKCkgIT0gTlVMTCkgewogICAgICAgICB0aHJlYWQtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fQ05ULCAxLjBmKTsKQEAgLTI3NTEsOCArMjc0OSw4IEBACiAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTI3NzIsNiArMjc3MCw3IEBACiAKICAgICAvLyBMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CisgICB1aW50OF90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKICAgIHNpemVfdCBidWZmZXJTaXplID0gZnJhbWVDb3VudCpjaGFubmVsQ291bnQqc2l6ZW9mKGludDE2X3QpOwogICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgc2l6ZSArPSBidWZmZXJTaXplOwpAQCAtMjc4Niw3ICsyNzg1LDggQEAKICAgICAgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwogICAgICAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwpAQCAtMjgxMCw3ICsyODEwLDggQEAKICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQgPSAodWludDhfdCljaGFubmVsQ291bnQ7CisgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwpAQCAtMjg3Nyw3ICsyODc4LDExIEBACiB9CiAKIGludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Y2hhbm5lbENvdW50KCkgY29uc3QgewotICAgIHJldHVybiAoaW50KW1DYmxrLT5jaGFubmVsQ291bnQ7CisgICAgcmV0dXJuIChjb25zdCBpbnQpbUNoYW5uZWxDb3VudDsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmNoYW5uZWxNYXNrKCkgY29uc3QgeworICAgIHJldHVybiBtQ2hhbm5lbE1hc2s7CiB9CiAKIHZvaWQqIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0IHsKQEAgLTI4ODksOSArMjg5NCw5IEBACiAgICAgaWYgKGJ1ZmZlclN0YXJ0IDwgbUJ1ZmZlciB8fCBidWZmZXJTdGFydCA+IGJ1ZmZlckVuZCB8fCBidWZmZXJFbmQgPiBtQnVmZmVyRW5kIHx8CiAgICAgICAgICgodW5zaWduZWQgbG9uZylidWZmZXJTdGFydCAmICh1bnNpZ25lZCBsb25nKShjYmxrLT5mcmFtZVNpemUgLSAxKSkpIHsKICAgICAgICAgTE9HRSgiVHJhY2tCYXNlOjpnZXRCdWZmZXIgYnVmZmVyIG91dCBvZiByYW5nZTpcbiAgICBzdGFydDogJXAsIGVuZCAlcCAsIG1CdWZmZXIgJXAgbUJ1ZmZlckVuZCAlcFxuICAgIFwKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgJWQsIHNlcnZlckJhc2UgJWQsIHVzZXIgJWQsIHVzZXJCYXNlICVkLCBjaGFubmVsQ291bnQgJWQiLAorICAgICAgICAgICAgICAgIHNlcnZlciAlZCwgc2VydmVyQmFzZSAlZCwgdXNlciAlZCwgdXNlckJhc2UgJWQiLAogICAgICAgICAgICAgICAgIGJ1ZmZlclN0YXJ0LCBidWZmZXJFbmQsIG1CdWZmZXIsIG1CdWZmZXJFbmQsCi0gICAgICAgICAgICAgICAgY2Jsay0+c2VydmVyLCBjYmxrLT5zZXJ2ZXJCYXNlLCBjYmxrLT51c2VyLCBjYmxrLT51c2VyQmFzZSwgY2Jsay0+Y2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yOTA2LDEyICsyOTExLDEyIEBACiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpLAorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIDAsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkKSwKICAgICBtTXV0ZShmYWxzZSksIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwgbU5hbWUoLTEpLCBtTWFpbkJ1ZmZlcihOVUxMKSwgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKQogewpAQCAtMjkzMSw3ICsyOTM2LDcgQEAKICAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogICAgICAgICAvLyBOT1RFOiBhdWRpb190cmFja19jYmxrX3Q6OmZyYW1lU2l6ZSBmb3IgOCBiaXQgUENNIGRhdGEgaXMgYmFzZWQgb24gYSBzYW1wbGUgc2l6ZSBvZgogICAgICAgICAvLyAxNiBiaXQgYmVjYXVzZSBkYXRhIGlzIGNvbnZlcnRlZCB0byAxNiBiaXQgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiBidWZmZXIgYnkgQXVkaW9UcmFjawotICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpID8gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpIDogc2l6ZW9mKGludDhfdCk7CisgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPyBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpIDogc2l6ZW9mKGludDhfdCk7CiAgICAgfQogfQogCkBAIC0yOTc5LDEyICsyOTg0LDEyIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwNWQgJTAzdSAlMDN1ICUwM3UgJTA1dSAgICUwNHUgJTFkICUxZCAlMWQgJTA1dSAlMDV1ICUwNXUgIDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwNWQgJTAzdSAlMDN1IDB4JTA4eCAlMDV1ICAgJTA0dSAlMWQgJTFkICUxZCAlMDV1ICUwNXUgJTA1dSAgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAogICAgICAgICAgICAgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzAsCiAgICAgICAgICAgICAobUNsaWVudCA9PSBOVUxMKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLApAQCAtMzIxOSwyMSArMzIyNCwyMSBAQAogICAgICAgICAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgMCwgc2Vzc2lvbklkKSwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgMCwgc2Vzc2lvbklkKSwKICAgICAgICAgbU92ZXJmbG93KGZhbHNlKQogewogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgTE9HVigiUmVjb3JkVHJhY2sgY29uc3RydWN0b3IsIHNpemUgJWQiLCAoaW50KW1CdWZmZXJFbmQgLSAoaW50KW1CdWZmZXIpOwogICAgICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCkgewotICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDhfdCk7CisgICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDhfdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IHNpemVvZihpbnQ4X3QpOwogICAgICAgIH0KQEAgLTMzMTMsMTAgKzMzMTgsMTAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwM3UgJTAzdSAlMDVkICAgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwM3UgMHglMDh4ICUwNWQgICAlMDR1ICUwMWQgJTA1dSAgJTA4eCAlMDh4XG4iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gTlVMTCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQsCisgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtU3RhdGUsCkBAIC0zMzMyLDEwICszMzM3LDEwIEBACiAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgRHVwbGljYXRpbmdUaHJlYWQgKnNvdXJjZVRocmVhZCwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpCi0gICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX0NOVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIE5VTEwsIDApLAorICAgIDogICBUcmFjayh0aHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9DTlQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIDApLAogICAgIG1BY3RpdmUoZmFsc2UpLCBtU291cmNlVGhyZWFkKHNvdXJjZVRocmVhZCkKIHsKIApAQCAtMzM0Niw4ICszMzUxLDEwIEBACiAgICAgICAgIG1DYmxrLT52b2x1bWVbMF0gPSBtQ2Jsay0+dm9sdW1lWzFdID0gMHgxMDAwOwogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7Ci0gICAgICAgIExPR1YoIk91dHB1dFRyYWNrIGNvbnN0cnVjdG9yIG1DYmxrICVwLCBtQnVmZmVyICVwLCBtQ2Jsay0+YnVmZmVycyAlcCwgbUNibGstPmZyYW1lQ291bnQgJWQsIG1DYmxrLT5zYW1wbGVSYXRlICVkLCBtQ2Jsay0+Y2hhbm5lbENvdW50ICVkIG1CdWZmZXJFbmQgJXAiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLCBtQ2Jsay0+YnVmZmVycywgbUNibGstPmZyYW1lQ291bnQsIG1DYmxrLT5zYW1wbGVSYXRlLCBtQ2Jsay0+Y2hhbm5lbENvdW50LCBtQnVmZmVyRW5kKTsKKyAgICAgICAgTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsIG1DYmxrLT5idWZmZXJzICVwLCAiIFwKKyAgICAgICAgICAgICAgICAibUNibGstPmZyYW1lQ291bnQgJWQsIG1DYmxrLT5zYW1wbGVSYXRlICVkLCBtQ2hhbm5lbE1hc2sgMHglMDh4IG1CdWZmZXJFbmQgJXAiLAorICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLCBtQ2Jsay0+YnVmZmVycywKKyAgICAgICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCwgbUNibGstPnNhbXBsZVJhdGUsIG1DaGFubmVsTWFzaywgbUJ1ZmZlckVuZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKICAgICB9CkBAIC0zMzgyLDcgKzMzODksNyBAQAogewogICAgIEJ1ZmZlciAqcEluQnVmZmVyOwogICAgIEJ1ZmZlciBpbkJ1ZmZlcjsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtQ2Jsay0+Y2hhbm5lbENvdW50OworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1DaGFubmVsQ291bnQ7CiAgICAgYm9vbCBvdXRwdXRCdWZmZXJGdWxsID0gZmFsc2U7CiAgICAgaW5CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKICAgICBpbkJ1ZmZlci5pMTYgPSBkYXRhOwpAQCAtMzY2Nyw4ICszNjc0LDggQEAKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0zNzE3LDcgKzM3MjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBuZXcgcmVjb3JkIHRyYWNrLiBUaGUgcmVjb3JkIHRyYWNrIHVzZXMgb25lIHRyYWNrIGluIG1IYXJkd2FyZU1peGVyVGhyZWFkIGJ5IGNvbnZlbnRpb24uCiAgICAgICAgIHJlY29yZFRyYWNrID0gbmV3IFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgZmxhZ3MsIGxTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIGxTZXNzaW9uSWQpOwogICAgIH0KICAgICBpZiAocmVjb3JkVHJhY2stPmdldENibGsoKSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFJlY29yZFRyYWNrIHNvIHRoYXQgdGhlIENsaWVudApAQCAtNDA2NSw3ICs0MDcyLDcgQEAKIAogICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewogICAgICAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgVHJhY2s6XG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgQ2xpZW4gRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBTUmF0ZSAgU2VydiAgICAgVXNlclxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIENsaWVuIEZtdCBDaG4gbWFzayAgIFNlc3Npb24gQnVmICBTIFNSYXRlICBTZXJ2ICAgICBVc2VyXG4iKTsKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIApAQCAtNDIxOSw3ICs0MjI2LDcgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxzOworICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxNYXNrOwogICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwpAQCAtNDI0Miw4ICs0MjQ5LDggQEAKICAgICBtUmVzYW1wbGVyID0gMDsKIAogICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVscyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KXBvcGNvdW50KG1DaGFubmVscyk7CisgICAgbUNoYW5uZWxNYXNrID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxNYXNrKTsKICAgICBtRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KWF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtSW5wdXRCeXRlcyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCAwNjk4ZGNiLi4xZmFkOTg3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9faGFsLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KIAogI2luY2x1ZGUgIkF1ZGlvQnVmZmVyUHJvdmlkZXIuaCIKIApAQCAtNzYsOCArNzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC04Nyw3ICs4Nyw3IEBACiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGludCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudChpbnQgb3V0cHV0KSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgbGF0ZW5jeShpbnQgb3V0cHV0KSBjb25zdDsKIApAQCAtMTg5LDggKzE4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLApAQCAtMzAxLDggKzMwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTMyOSwxMiArMzI5LDE0IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKIAotICAgICAgICAgICAgaW50IGZvcm1hdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbUZvcm1hdDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCgpIGNvbnN0IDsKIAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2soKSBjb25zdDsKKwogICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUoKSBjb25zdDsKIAogICAgICAgICAgICAgdm9pZCogZ2V0QnVmZmVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZnJhbWVzKSBjb25zdDsKQEAgLTM2MCw5ICszNjIsMTEgQEAKICAgICAgICAgICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVN0YXRlOwogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtQ2xpZW50VGlkOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybWF0OworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtRm9ybWF0OwogICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtRmxhZ3M7CiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CisgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBDb25maWdFdmVudCB7CkBAIC0zNzUsNyArMzc5LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgZm9ybWF0KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgd2FrZVVwKCkgICAgeyBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsgfQogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7CkBAIC00MDYsMTAgKzQxMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+ICAgICAgICBtQXVkaW9GbGluZ2VyOwogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0OworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRm9ybWF0OwogICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICBtUGFyYW1Db25kOwogICAgICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nOD4gICAgICAgICBtTmV3UGFyYW1ldGVyczsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVBhcmFtU3RhdHVzOwpAQCAtNDQyLDggKzQ0Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwpAQCAtNTMwLDggKzUzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFRyYWNrKCAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGluZ1RocmVhZCAqc291cmNlVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5PdXRwdXRUcmFjaygpOwogCkBAIC01ODMsOCArNTg3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCkBAIC04MjksOCArODMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkVHJhY2soY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IDUwZGNkYTcuLjZlOTMxOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKQEAgLTI2LDYgKzI2LDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjEsNiArNjUsNyBAQAogICAgICAgICB0LT5jaGFubmVsQ291bnQgPSAyOwogICAgICAgICB0LT5lbmFibGVkID0gMDsKICAgICAgICAgdC0+Zm9ybWF0ID0gMTY7CisgICAgICAgIHQtPmNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgICAgICB0LT5idWZmZXIucmF3ID0gMDsKICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXIgPSAwOwogICAgICAgICB0LT5ob29rID0gMDsKQEAgLTE4MCwxMyArMTg1LDE4IEBACiAKICAgICBzd2l0Y2ggKHRhcmdldCkgewogICAgIGNhc2UgVFJBQ0s6Ci0gICAgICAgIGlmIChuYW1lID09IENIQU5ORUxfQ09VTlQpIHsKLSAgICAgICAgICAgIGlmICgodWludDMyX3QodmFsdWVJbnQpIDw9IE1BWF9OVU1fQ0hBTk5FTFMpICYmICh2YWx1ZUludCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ICE9IHZhbHVlSW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxDb3VudCA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfQ09VTlQsICVkKSIsIHZhbHVlSW50KTsKKyAgICAgICAgaWYgKG5hbWUgPT0gQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gKHVpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxNYXNrICE9IG1hc2spIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1hc2spOworICAgICAgICAgICAgICAgIGlmICgoY2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFMpICYmIChjaGFubmVsQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxNYXNrID0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgbWFzayk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxtQWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCmluZGV4IDg4NDA4YTcuLjc1YzkxNzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtNjEsNyArNjEsNyBAQAogCiAgICAgICAgIC8vIHNldCBQYXJhbWV0ZXIgbmFtZXMKICAgICAgICAgLy8gZm9yIHRhcmdldCBUUkFDSwotICAgICAgICBDSEFOTkVMX0NPVU5UICAgPSAweDQwMDAsCisgICAgICAgIENIQU5ORUxfTUFTSyAgICA9IDB4NDAwMCwKICAgICAgICAgRk9STUFUICAgICAgICAgID0gMHg0MDAxLAogICAgICAgICBNQUlOX0JVRkZFUiAgICAgPSAweDQwMDIsCiAgICAgICAgIEFVWF9CVUZGRVIgICAgICA9IDB4NDAwMywKQEAgLTE1MCw2ICsxNTAsNyBAQAogICAgICAgICB1aW50OF90ICAgICBlbmFibGVkICAgICAgOiAxOwogICAgICAgICB1aW50OF90ICAgICByZXNlcnZlZDAgICAgOiAzOwogICAgICAgICB1aW50OF90ICAgICBmb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxNYXNrOwogCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICAgICAgICAgICAgICAgIGJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBtdXRhYmxlIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGVmOGQ5NTcuLjQ3Y2EzYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0zNiwxNSArMzYsOCBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5X2hhbC5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0aGUgc2ltIGJ1aWxkIGRvZXNuJ3QgaGF2ZSBnZXR0aWQKLQotI2lmbmRlZiBIQVZFX0dFVFRJRAotIyBkZWZpbmUgZ2V0dGlkIGdldHBpZAotI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IGQ5YjVhZGEuLmI4MzAxMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeV9oYWwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCBmOWZhMzBlLi5hMzc0OWNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTQzOCwxOCArNDM4LDIzIEBACiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgX19kYXRhX2NiKGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpCiAgICAgewogICAgICAgICBMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpfX3RoaXMgPQogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOwogICAgICAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBtZW0oc3RhdGljX2Nhc3Q8Q2FtZXJhSGVhcE1lbW9yeSAqPihkYXRhLT5oYW5kbGUpKTsKLSAgICAgICAgX190aGlzLT5tRGF0YUNiKG1zZ190eXBlLCBtZW0sIF9fdGhpcy0+bUNiVXNlcik7CisgICAgICAgIGlmIChpbmRleCA+PSBtZW0tPm1OdW1CdWZzKSB7CisgICAgICAgICAgICBMT0dFKCIlczogaW52YWxpZCBidWZmZXIgaW5kZXggJWQsIG1heCBhbGxvd2VkIGlzICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICBpbmRleCwgbWVtLT5tTnVtQnVmcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgX190aGlzLT5tRGF0YUNiKG1zZ190eXBlLCBtZW0tPm1CdWZmZXJzW2luZGV4XSwgX190aGlzLT5tQ2JVc2VyKTsKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBfX2RhdGFfY2JfdGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpCiAgICAgewogICAgICAgICBMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CkBAIC00NTksMzggKzQ2NCw4NSBAQAogICAgICAgICAvLyBkcm9wIGFsbCByZWZlcmVuY2VzLCBpdCB3aWxsIGJlIGRlc3Ryb3llZCAoYXMgd2VsbCBhcyB0aGUgZW5jbG9zZWQKICAgICAgICAgLy8gTWVtb3J5SGVhcEJhc2UuCiAgICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSkpOwotICAgICAgICBfX3RoaXMtPm1EYXRhQ2JUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dfdHlwZSwgbWVtLCBfX3RoaXMtPm1DYlVzZXIpOworICAgICAgICBpZiAoaW5kZXggPj0gbWVtLT5tTnVtQnVmcykgeworICAgICAgICAgICAgTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1lbS0+bU51bUJ1ZnMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIF9fdGhpcy0+bURhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ190eXBlLCBtZW0tPm1CdWZmZXJzW2luZGV4XSwgX190aGlzLT5tQ2JVc2VyKTsKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0IGNvbWJpbmVzIGEgTWVtb3J5SGVhcEJhc2UgYW5kIGEgTWVtb3J5QmFzZQogICAgIC8vIGluIG9uZS4gIFNpbmNlIHdlIHRlbmQgdG8gdXNlIHRoZW0gaW4gYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCwgdGhpcyBpcwogICAgIC8vIGhhbmR5LgogCi0gICAgY2xhc3MgQ2FtZXJhSGVhcE1lbW9yeSA6IHB1YmxpYyBNZW1vcnlCYXNlIHsKKyAgICBjbGFzcyBDYW1lcmFIZWFwTWVtb3J5IDogcHVibGljIFJlZkJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeShzaXplX3Qgc2l6ZSkgOgotICAgICAgICAgICAgTWVtb3J5QmFzZShuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSksIDAsIHNpemUpCisgICAgICAgIENhbWVyYUhlYXBNZW1vcnkoaW50IGZkLCBzaXplX3QgYnVmX3NpemUsIHVpbnRfdCBudW1fYnVmZmVycyA9IDEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmU2l6ZShidWZfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUJ1ZnMobnVtX2J1ZmZlcnMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZS5kYXRhID0gZ2V0SGVhcCgpLT5iYXNlKCk7Ci0gICAgICAgICAgICBoYW5kbGUuc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICBoYW5kbGUuaGFuZGxlID0gdGhpczsKKyAgICAgICAgICAgIG1IZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKGZkLCBidWZfc2l6ZSAqIG51bV9idWZmZXJzKTsKKyAgICAgICAgICAgIGNvbW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIH0KIAorICAgICAgICBDYW1lcmFIZWFwTWVtb3J5KHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZmZXJzID0gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKGJ1Zl9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQnVmcyhudW1fYnVmZmVycykKKyAgICAgICAgeworICAgICAgICAgICAgbUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoYnVmX3NpemUgKiBudW1fYnVmZmVycyk7CisgICAgICAgICAgICBjb21tb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb21tb25Jbml0aWFsaXphdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZS5kYXRhID0gbUhlYXAtPmJhc2UoKTsKKyAgICAgICAgICAgIGhhbmRsZS5zaXplID0gbUJ1ZlNpemUgKiBtTnVtQnVmczsKKyAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUgPSB0aGlzOworCisgICAgICAgICAgICBtQnVmZmVycyA9IG5ldyBzcDxNZW1vcnlCYXNlPlttTnVtQnVmc107CisgICAgICAgICAgICBmb3IgKHVpbnRfdCBpID0gMDsgaSA8IG1OdW1CdWZzOyBpKyspCisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0gPSBuZXcgTWVtb3J5QmFzZShtSGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBtQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKTsKKworICAgICAgICAgICAgaGFuZGxlLnJlbGVhc2UgPSBfX3B1dF9tZW1vcnk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIZWFwTWVtb3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlIFtdIG1CdWZmZXJzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG1CdWZTaXplOworICAgICAgICB1aW50X3QgbU51bUJ1ZnM7CisgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBtSGVhcDsKKyAgICAgICAgc3A8TWVtb3J5QmFzZT4gKm1CdWZmZXJzOworCiAgICAgICAgIGNhbWVyYV9tZW1vcnlfdCBoYW5kbGU7CiAgICAgfTsKIAotICAgIHN0YXRpYyBjYW1lcmFfbWVtb3J5X3QqIF9fZ2V0X21lbW9yeShzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCisgICAgc3RhdGljIGNhbWVyYV9tZW1vcnlfdCogX19nZXRfbWVtb3J5KGludCBmZCwgc2l6ZV90IGJ1Zl9zaXplLCB1aW50X3QgbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCiAgICAgewotICAgICAgICAvLyBXZSBhbGxvY2F0ZSB0aGUgb2JqZWN0IGhlcmUsIGJ1dCB3ZSBkbyBub3QgYXNzaWduIGl0IHRvIGEgc3Ryb25nCi0gICAgICAgIC8vIHBvaW50ZXIgeWV0LiAgVGhlIEhBTCB3aWxsIHBhc3MgaXQgYmFjayB0byB1cyB2aWEgdGhlIGRhdGEgY2FsbGJhY2sKLSAgICAgICAgLy8gb3IgdGhlIGRhdGEtdGltZXN0YW1wIGNhbGxiYWNrLCBhbmQgZnJvbSB0aGVyZSBvbiB3ZSB3aWxsIHdyYXAgaXQKLSAgICAgICAgLy8gd2l0aGluIGEgc3Ryb25nIHBvaW50ZXIuCi0KLSAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeSAqbWVtID0gbmV3IENhbWVyYUhlYXBNZW1vcnkoc2l6ZSk7CisgICAgICAgIENhbWVyYUhlYXBNZW1vcnkgKm1lbTsKKyAgICAgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgICAgIG1lbSA9IG5ldyBDYW1lcmFIZWFwTWVtb3J5KGJ1Zl9zaXplLCBudW1fYnVmcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbSA9IG5ldyBDYW1lcmFIZWFwTWVtb3J5KGZkLCBidWZfc2l6ZSwgbnVtX2J1ZnMpOworICAgICAgICBtZW0tPmluY1N0cm9uZyhtZW0pOwogICAgICAgICByZXR1cm4gJm1lbS0+aGFuZGxlOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIF9fcHV0X21lbW9yeShjYW1lcmFfbWVtb3J5X3QgKmRhdGEpCisgICAgeworICAgICAgICBpZiAoIWRhdGEpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeSAqbWVtID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVhcE1lbW9yeSAqPihkYXRhLT5oYW5kbGUpOworICAgICAgICBtZW0tPmRlY1N0cm9uZyhtZW0pOworICAgIH0KKwogICAgIHN0YXRpYyBBTmF0aXZlV2luZG93ICpfX3RvX2Fudyh2b2lkICp1c2VyKQogICAgIHsKICAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKl9fdGhpcyA9CkBAIC01MDAsNyArNTUyLDcgQEAKICNkZWZpbmUgYW53KG4pIF9fdG9fYW53KCgoc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyAqKW4pLT51c2VyKQogCiAgICAgc3RhdGljIGludCBfX2RlcXVldWVfYnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsIGludCAqc3RyaWRlKQogICAgIHsKICAgICAgICAgaW50IHJjOwogICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwpAQCAtNTA4LDggKzU2MCwxMCBAQAogICAgICAgICByYyA9IGEtPmRlcXVldWVCdWZmZXIoYSwgJmFuYik7CiAgICAgICAgIGlmICghcmMpIHsKICAgICAgICAgICAgIHJjID0gYS0+bG9ja0J1ZmZlcihhLCBhbmIpOwotICAgICAgICAgICAgaWYgKCFyYykKKyAgICAgICAgICAgIGlmICghcmMpIHsKICAgICAgICAgICAgICAgICAqYnVmZmVyID0gJmFuYi0+aGFuZGxlOworICAgICAgICAgICAgICAgICpzdHJpZGUgPSBhbmItPnN0cmlkZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBhLT5jYW5jZWxCdWZmZXIoYSwgYW5iKTsKICAgICAgICAgfQpAQCAtNTQxLDcgKzU5NSw3IEBACiAgICAgc3RhdGljIGludCBfX3NldF9idWZmZXJfY291bnQoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywgaW50IGNvdW50KQogICAgIHsKICAgICAgICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLQlyZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGEsIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhLCBjb3VudCk7CiAgICAgfQogCiAgICAgc3RhdGljIGludCBfX3NldF9idWZmZXJzX2dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCg==