LS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNTAzLDYgKzUwMyw5IEBAIGNhc2UgIiR7dGFyZ2V0fSIgaW4KICAgYXJtLSotcmlzY2l4KikKICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgdGFyZ2V0LWxpYmdsb3NzICR7bGliZ2NqfSIKICAgICA7OworICBhdnIzMi0qLSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJpYmVydHkgdGFyZ2V0LWxpYm11ZGZsYXAgdGFyZ2V0LWxpYmZmaSAke2xpYmdjan0iCisgICAgOzsKICAgYXZyLSotKikKICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmliZXJ0eSB0YXJnZXQtbGlic3RkYysrLXYzICR7bGliZ2NqfSIKICAgICA7OwotLS0gYS9nY2MvYnVpbHRpbnMuYworKysgYi9nY2MvYnVpbHRpbnMuYwpAQCAtOTIyMyw3ICs5MjIzLDcgQEAgdmFsaWRhdGVfYXJnbGlzdCAodHJlZSBhcmdsaXN0LCAuLi4pCiAKICAgZG8KICAgICB7Ci0gICAgICBjb2RlID0gdmFfYXJnIChhcCwgZW51bSB0cmVlX2NvZGUpOworICAgICAgY29kZSA9IHZhX2FyZyAoYXAsIGludCk7CiAgICAgICBzd2l0Y2ggKGNvZGUpCiAJewogCWNhc2UgMDoKLS0tIGEvZ2NjL2NhbGxzLmMKKysrIGIvZ2NjL2NhbGxzLmMKQEAgLTM0NDcsNyArMzQ0Nyw3IEBAIGVtaXRfbGlicmFyeV9jYWxsX3ZhbHVlXzEgKGludCByZXR2YWwsIHIKICAgZm9yICg7IGNvdW50IDwgbmFyZ3M7IGNvdW50KyspCiAgICAgewogICAgICAgcnR4IHZhbCA9IHZhX2FyZyAocCwgcnR4KTsKLSAgICAgIGVudW0gbWFjaGluZV9tb2RlIG1vZGUgPSB2YV9hcmcgKHAsIGVudW0gbWFjaGluZV9tb2RlKTsKKyAgICAgIGVudW0gbWFjaGluZV9tb2RlIG1vZGUgPSB2YV9hcmcgKHAsIGludCk7CiAKICAgICAgIC8qIFdlIGNhbm5vdCBjb252ZXJ0IHRoZSBhcmcgdmFsdWUgdG8gdGhlIG1vZGUgdGhlIGxpYnJhcnkgd2FudHMgaGVyZTsKIAkgbXVzdCBkbyBpdCBlYXJsaWVyIHdoZXJlIHdlIGtub3cgdGhlIHNpZ25lZG5lc3Mgb2YgdGhlIGFyZy4gICovCi0tLSBhL2djYy9jLWluY3BhdGguYworKysgYi9nY2MvYy1pbmNwYXRoLmMKQEAgLTM0Nyw2ICszNDcsMTggQEAgYWRkX3BhdGggKGNoYXIgKnBhdGgsIGludCBjaGFpbiwgaW50IGN4eAogICBjaGFyKiBjOwogICBmb3IgKGMgPSBwYXRoOyAqYzsgYysrKQogICAgIGlmICgqYyA9PSAnXFwnKSAqYyA9ICcvJzsKKyAgLyogUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMuICBPbiBzb21lIHZlcnNpb25zIG9mIE1TCisgICAgIFdpbmRvd3MsIHRyYWlsaW5nICBfZm9yd2FyZF8gc2xhc2hlcyBjYXVzZSBubyBwcm9ibGVtcyBmb3Igc3RhdCgpLgorICAgICBPbiBuZXdlciB2ZXJzaW9ucywgc3RhdCgpIGRvZXMgbm90IHJlY29nbmlzZSBhIGRpcmVjdG9yeSB0aGF0IGVuZHMKKyAgICAgaW4gYSAnXFwnIG9yICcvJywgdW5sZXNzIGl0IGlzIGEgZHJpdmUgcm9vdCBkaXIsIHN1Y2ggYXMgImM6LyIsCisgICAgIHdoZXJlIGl0IGlzIG9ibGlnYXRvcnkuICAqLworICBpbnQgcGF0aGxlbiA9IHN0cmxlbiAocGF0aCk7CisgIGNoYXIqIGVuZCA9IHBhdGggKyBwYXRobGVuIC0gMTsKKyAgLyogUHJlc2VydmUgdGhlIGxlYWQgJy8nIG9yIGxlYWQgImM6LyIuICAqLworICBjaGFyKiBzdGFydCA9IHBhdGggKyAocGF0aGxlbiA+IDIgJiYgcGF0aFsxXSA9PSAnOicgPyAzIDogMSk7CisKKyAgZm9yICg7IGVuZCA+IHN0YXJ0ICYmIElTX0RJUl9TRVBBUkFUT1IgKCplbmQpOyBlbmQtLSkKKyAgICAqZW5kID0gMDsKICNlbmRpZgogCiAgIHAgPSBYTkVXIChjcHBfZGlyKTsKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL2F2cjMyLmMKQEAgLTAsMCArMSw3OTE1IEBACisvKgorICAgVGFyZ2V0IGhvb2tzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIGZvciBBVlIzMi4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDYgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+CisgICBJbml0aWFsIHBvcnRpbmcgYnkgQW5kZXJzIO+/vWRsYW5kLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorI2luY2x1ZGUgImNvcmV0eXBlcy5oIgorI2luY2x1ZGUgInRtLmgiCisjaW5jbHVkZSAicnRsLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAiaGFyZC1yZWctc2V0LmgiCisjaW5jbHVkZSAicmVhbC5oIgorI2luY2x1ZGUgImluc24tY29uZmlnLmgiCisjaW5jbHVkZSAiY29uZGl0aW9ucy5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgImluc24tYXR0ci5oIgorI2luY2x1ZGUgImZsYWdzLmgiCisjaW5jbHVkZSAicmVsb2FkLmgiCisjaW5jbHVkZSAiZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJleHByLmgiCisjaW5jbHVkZSAib3B0YWJzLmgiCisjaW5jbHVkZSAidG9wbGV2LmgiCisjaW5jbHVkZSAicmVjb2cuaCIKKyNpbmNsdWRlICJnZ2MuaCIKKyNpbmNsdWRlICJleGNlcHQuaCIKKyNpbmNsdWRlICJjLXByYWdtYS5oIgorI2luY2x1ZGUgImludGVncmF0ZS5oIgorI2luY2x1ZGUgInRtX3AuaCIKKyNpbmNsdWRlICJsYW5naG9va3MuaCIKKworI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgInRhcmdldC1kZWYuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIEZvcndhcmQgZGVmaW5pdGlvbnMgb2YgdHlwZXMuICAqLwordHlwZWRlZiBzdHJ1Y3QgbWluaXBvb2xfbm9kZSBNbm9kZTsKK3R5cGVkZWYgc3RydWN0IG1pbmlwb29sX2ZpeHVwIE1maXg7CisKKy8qIE9ic3RhY2sgZm9yIG1pbmlwb29sIGNvbnN0YW50IGhhbmRsaW5nLiAgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBtaW5pcG9vbF9vYnN0YWNrOworc3RhdGljIGNoYXIgKm1pbmlwb29sX3N0YXJ0b2JqOworc3RhdGljIHJ0eCBtaW5pcG9vbF92ZWN0b3JfbGFiZWw7CisKKy8qIFRydWUgaWYgd2UgYXJlIGN1cnJlbnRseSBidWlsZGluZyBhIGNvbnN0YW50IHRhYmxlLiAgKi8KK2ludCBtYWtpbmdfY29uc3RfdGFibGU7CisKKy8qIFNvbWUgZm9yd2FyZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF2cjMyX2lzcl92YWx1ZSAodHJlZSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdnIzMl9jb21wdXRlX2Z1bmNfdHlwZSAodm9pZCk7CitzdGF0aWMgdHJlZSBhdnIzMl9oYW5kbGVfaXNyX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CitzdGF0aWMgdHJlZSBhdnIzMl9oYW5kbGVfYWNhbGxfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKK3N0YXRpYyB0cmVlIGF2cjMyX2hhbmRsZV9mbmRlY2xfYXR0cmlidXRlICh0cmVlICogbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MsCisJCQkJCSAgIGludCBmbGFncywgYm9vbCAqIG5vX2FkZF9hdHRycyk7CitzdGF0aWMgdm9pZCBhdnIzMl9yZW9yZyAodm9pZCk7Citib29sIGF2cjMyX3JldHVybl9pbl9tc2IgKHRyZWUgdHlwZSk7Citib29sIGF2cjMyX3ZlY3Rvcl9tb2RlX3N1cHBvcnRlZCAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSk7CitzdGF0aWMgdm9pZCBhdnIzMl9pbml0X2xpYmZ1bmNzICh2b2lkKTsKKworCitzdGF0aWMgdm9pZAorYXZyMzJfYWRkX2djX3Jvb3RzICh2b2lkKQoreworICBnY2Nfb2JzdGFja19pbml0ICgmbWluaXBvb2xfb2JzdGFjayk7CisgIG1pbmlwb29sX3N0YXJ0b2JqID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJm1pbmlwb29sX29ic3RhY2ssIDApOworfQorCisKKy8qIExpc3Qgb2YgYWxsIGtub3duIEFWUjMyIHBhcnRzICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJ0X3R5cGVfcyBhdnIzMl9wYXJ0X3R5cGVzW10gPSB7CisgIC8qIG5hbWUsIHBhcnRfdHlwZSwgYXJjaGl0ZWN0dXJlIHR5cGUsIG1hY3JvICovCisgIHsibm9uZSIsIFBBUlRfVFlQRV9BVlIzMl9OT05FLCBBUkNIX1RZUEVfQVZSMzJfQVAsICJfX0FWUjMyX18ifSwKKyAgeyJhcDcwMDAiLCBQQVJUX1RZUEVfQVZSMzJfQVA3MDAwLCBBUkNIX1RZUEVfQVZSMzJfQVAsICJfX0FWUjMyX0FQNzAwMF9fIn0sCisgIHsiYXA3MDAxIiwgUEFSVF9UWVBFX0FWUjMyX0FQNzAwMSwgQVJDSF9UWVBFX0FWUjMyX0FQLCAiX19BVlIzMl9BUDcwMDFfXyJ9LAorICB7ImFwNzAwMiIsIFBBUlRfVFlQRV9BVlIzMl9BUDcwMDIsIEFSQ0hfVFlQRV9BVlIzMl9BUCwgIl9fQVZSMzJfQVA3MDAyX18ifSwKKyAgeyJhcDcyMDAiLCBQQVJUX1RZUEVfQVZSMzJfQVA3MjAwLCBBUkNIX1RZUEVfQVZSMzJfQVAsICJfX0FWUjMyX0FQNzIwMF9fIn0sCisgIHsidWMzYTAxMjgiLCBQQVJUX1RZUEVfQVZSMzJfVUMzQTAxMjgsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyLAorICAgIl9fQVZSMzJfVUMzQTAxMjhfXyJ9LAorICB7InVjM2EwMjU2IiwgUEFSVF9UWVBFX0FWUjMyX1VDM0EwMjU2LCBBUkNIX1RZUEVfQVZSMzJfVUNSMiwKKyAgICJfX0FWUjMyX1VDM0EwMjU2X18ifSwKKyAgeyJ1YzNhMDUxMiIsIFBBUlRfVFlQRV9BVlIzMl9VQzNBMDUxMiwgQVJDSF9UWVBFX0FWUjMyX1VDUjIsCisgICAiX19BVlIzMl9VQzNBMDUxMl9fIn0sCisgIHsidWMzYTA1MTJlcyIsIFBBUlRfVFlQRV9BVlIzMl9VQzNBMDUxMkVTLCBBUkNIX1RZUEVfQVZSMzJfVUNSMSwKKyAgICAiX19BVlIzMl9VQzNBMDUxMkVTX18ifSwKKyAgeyJ1YzNhMTEyOCIsIFBBUlRfVFlQRV9BVlIzMl9VQzNBMTEyOCwgQVJDSF9UWVBFX0FWUjMyX1VDUjIsCisgICAiX19BVlIzMl9VQzNBMTEyOF9fIn0sCisgIHsidWMzYTEyNTYiLCBQQVJUX1RZUEVfQVZSMzJfVUMzQTEyNTYsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyLAorICAgIl9fQVZSMzJfVUMzQTEyNTZfXyJ9LAorICB7InVjM2ExNTEyIiwgUEFSVF9UWVBFX0FWUjMyX1VDM0ExNTEyLCBBUkNIX1RZUEVfQVZSMzJfVUNSMiwKKyAgICJfX0FWUjMyX1VDM0ExNTEyX18ifSwKKyAgeyJ1YzNhMTUxMmVzIiwgUEFSVF9UWVBFX0FWUjMyX1VDM0ExNTEyRVMsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IxLAorICAgIl9fQVZSMzJfVUMzQTE1MTJFU19fIn0sCisgICB7InVjM2EzcmV2ZCIsIFBBUlRfVFlQRV9BVlIzMl9VQzNBM1JFVkQsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyTk9NVUwsCisgICAgIl9fQVZSMzJfVUMzQTMyNTZTX18ifSwKKyAgeyJ1YzNhMzY0IiwgUEFSVF9UWVBFX0FWUjMyX1VDM0EzNjQsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyLAorICAgIl9fQVZSMzJfVUMzQTM2NF9fIn0sCisgIHsidWMzYTM2NHMiLCBQQVJUX1RZUEVfQVZSMzJfVUMzQTM2NFMsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyLAorICAgIl9fQVZSMzJfVUMzQTM2NFNfXyJ9LAorICB7InVjM2EzMTI4IiwgUEFSVF9UWVBFX0FWUjMyX1VDM0EzMTI4LCBBUkNIX1RZUEVfQVZSMzJfVUNSMiwKKyAgICJfX0FWUjMyX1VDM0EzMTI4X18ifSwKKyAgeyJ1YzNhMzEyOHMiLCBQQVJUX1RZUEVfQVZSMzJfVUMzQTMxMjhTLCBBUkNIX1RZUEVfQVZSMzJfVUNSMiwKKyAgICJfX0FWUjMyX1VDM0EzMTI4U19fIn0sCisgIHsidWMzYTMyNTYiLCBQQVJUX1RZUEVfQVZSMzJfVUMzQTMyNTYsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyLAorICAgIl9fQVZSMzJfVUMzQTMyNTZfXyJ9LAorICB7InVjM2EzMjU2cyIsIFBBUlRfVFlQRV9BVlIzMl9VQzNBMzI1NlMsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyLAorICAgIl9fQVZSMzJfVUMzQTMyNTZTX18ifSwKKyAgeyJ1YzNiMDY0IiwgUEFSVF9UWVBFX0FWUjMyX1VDM0IwNjQsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IxLAorICAgIl9fQVZSMzJfVUMzQjA2NF9fIn0sCisgIHsidWMzYjAxMjgiLCBQQVJUX1RZUEVfQVZSMzJfVUMzQjAxMjgsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IxLAorICAgIl9fQVZSMzJfVUMzQjAxMjhfXyJ9LAorICB7InVjM2IwMjU2IiwgUEFSVF9UWVBFX0FWUjMyX1VDM0IwMjU2LCBBUkNIX1RZUEVfQVZSMzJfVUNSMSwKKyAgICJfX0FWUjMyX1VDM0IwMjU2X18ifSwKKyAgeyJ1YzNiMDI1NmVzIiwgUEFSVF9UWVBFX0FWUjMyX1VDM0IwMjU2RVMsIEFSQ0hfVFlQRV9BVlIzMl9VQ1IxLAorICAgIl9fQVZSMzJfVUMzQjAyNTZFU19fIn0sCisgIHsidWMzYjE2NCIsIFBBUlRfVFlQRV9BVlIzMl9VQzNCMTY0LCBBUkNIX1RZUEVfQVZSMzJfVUNSMSwKKyAgICJfX0FWUjMyX1VDM0IxNjRfXyJ9LAorICB7InVjM2IxMTI4IiwgUEFSVF9UWVBFX0FWUjMyX1VDM0IxMTI4LCBBUkNIX1RZUEVfQVZSMzJfVUNSMSwKKyAgICJfX0FWUjMyX1VDM0IxMTI4X18ifSwKKyAgeyJ1YzNiMTI1NiIsIFBBUlRfVFlQRV9BVlIzMl9VQzNCMTI1NiwgQVJDSF9UWVBFX0FWUjMyX1VDUjEsCisgICAiX19BVlIzMl9VQzNCMTI1Nl9fIn0sCisgIHsidWMzYjEyNTZlcyIsIFBBUlRfVFlQRV9BVlIzMl9VQzNCMTI1NkVTLCBBUkNIX1RZUEVfQVZSMzJfVUNSMSwKKyAgICJfX0FWUjMyX1VDM0IxMjU2RVNfXyJ9LAorICB7TlVMTCwgMCwgMCwgTlVMTH0KK307CisKKy8qIExpc3Qgb2YgYWxsIGtub3duIEFWUjMyIGFyY2hpdGVjdHVyZXMgICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyY2hfdHlwZV9zIGF2cjMyX2FyY2hfdHlwZXNbXSA9IHsKKyAgLyogbmFtZSwgYXJjaGl0ZWN0dXJlIHR5cGUsIG1pY3JvYXJjaGl0ZWN0dXJlIHR5cGUsIGZlYXR1cmUgZmxhZ3MsIG1hY3JvICovCisgIHsiYXAiLCBBUkNIX1RZUEVfQVZSMzJfQVAsIFVBUkNIX1RZUEVfQVZSMzJCLAorICAgKEZMQUdfQVZSMzJfSEFTX0RTUAorICAgIHwgRkxBR19BVlIzMl9IQVNfU0lNRAorICAgIHwgRkxBR19BVlIzMl9IQVNfVU5BTElHTkVEX1dPUkQKKyAgICB8IEZMQUdfQVZSMzJfSEFTX0JSQU5DSF9QUkVEIHwgRkxBR19BVlIzMl9IQVNfUkVUVVJOX1NUQUNLCisgICAgfCBGTEFHX0FWUjMyX0hBU19DQUNIRVMpLAorICAgIl9fQVZSMzJfQVBfXyJ9LAorICB7InVjcjEiLCBBUkNIX1RZUEVfQVZSMzJfVUNSMSwgVUFSQ0hfVFlQRV9BVlIzMkEsCisgICAoRkxBR19BVlIzMl9IQVNfRFNQIHwgRkxBR19BVlIzMl9IQVNfUk1XKSwKKyAgICJfX0FWUjMyX1VDX189MSJ9LAorICB7InVjcjIiLCBBUkNIX1RZUEVfQVZSMzJfVUNSMiwgVUFSQ0hfVFlQRV9BVlIzMkEsCisgICAoRkxBR19BVlIzMl9IQVNfRFNQIHwgRkxBR19BVlIzMl9IQVNfUk1XCisgICAgfCBGTEFHX0FWUjMyX0hBU19WMl9JTlNOUyksCisgICAiX19BVlIzMl9VQ19fPTIifSwKKyAgeyJ1Y3Iybm9tdWwiLCBBUkNIX1RZUEVfQVZSMzJfVUNSMk5PTVVMLCBVQVJDSF9UWVBFX0FWUjMyQSwKKyAgIChGTEFHX0FWUjMyX0hBU19EU1AgfCBGTEFHX0FWUjMyX0hBU19STVcKKyAgICB8IEZMQUdfQVZSMzJfSEFTX1YyX0lOU05TIHwgRkxBR19BVlIzMl9IQVNfTk9fTVVMX0lOU05TKSwKKyAgICJfX0FWUjMyX1VDX189MyJ9LAorICB7TlVMTCwgMCwgMCwgMCwgTlVMTH0KK307CisKKy8qIERlZmF1bHQgYXJjaCBuYW1lICovCitjb25zdCBjaGFyICphdnIzMl9hcmNoX25hbWUgPSAibm9uZSI7Citjb25zdCBjaGFyICphdnIzMl9wYXJ0X25hbWUgPSAibm9uZSI7CisKK2NvbnN0IHN0cnVjdCBwYXJ0X3R5cGVfcyAqYXZyMzJfcGFydDsKK2NvbnN0IHN0cnVjdCBhcmNoX3R5cGVfcyAqYXZyMzJfYXJjaDsKKworCisvKiBTZXQgZGVmYXVsdCB0YXJnZXRfZmxhZ3MuICovCisjdW5kZWYgVEFSR0VUX0RFRkFVTFRfVEFSR0VUX0ZMQUdTCisjZGVmaW5lIFRBUkdFVF9ERUZBVUxUX1RBUkdFVF9GTEFHUyBcCisgIChNQVNLX0hBU19BU01fQUREUl9QU0VVRE9TIHwgTUFTS19NRF9SRU9SR19PUFRJTUlaQVRJT04gfCBNQVNLX0NPTkRfRVhFQ19CRUZPUkVfUkVMT0FEKQorCit2b2lkCithdnIzMl9vcHRpbWl6YXRpb25fb3B0aW9ucyAoaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKXsKKyAgaWYgKEFWUjMyX0FMV0FZU19QSUMpCisgICAgZmxhZ19waWMgPSAxOworCisgIC8qIEVuYWJsZSBzZWN0aW9uIGFuY2hvcnMgaWYgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuICovCisgIGlmIChsZXZlbCA+IDAgfHwgc2l6ZSkKKyAgICBmbGFnX3NlY3Rpb25fYW5jaG9ycyA9IDE7Cit9CisKKy8qIE92ZXJyaWRlIGNvbW1hbmQgbGluZSBvcHRpb25zICovCit2b2lkCithdnIzMl9vdmVycmlkZV9vcHRpb25zICh2b2lkKQoreworICBjb25zdCBzdHJ1Y3QgcGFydF90eXBlX3MgKnBhcnQ7CisgIGNvbnN0IHN0cnVjdCBhcmNoX3R5cGVfcyAqYXJjaDsKKworICAvKkFkZCBiYWNrd2FyZCBjb21wYWJpbGl0eSovCisgIGlmIChzdHJjbXAgKCJ1YyIsIGF2cjMyX2FyY2hfbmFtZSk9PSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IERlcHJlY2F0ZWQgYXJjaCBgJXMnIHNwZWNpZmllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSAnLW1hcmNoPXVjcjEnIGluc3RlYWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvbnZlcnRpbmcgdG8gYXJjaCAndWNyMSdcbiIsCisgICAgICAgICAgICAgICBhdnIzMl9hcmNoX25hbWUpOworICAgICAgYXZyMzJfYXJjaF9uYW1lPSJ1Y3IxIjsKKyAgICB9CisKKyAgLyogQ2hlY2sgaWYgYXJjaCB0eXBlIGlzIHNldC4gKi8KKyAgZm9yIChhcmNoID0gYXZyMzJfYXJjaF90eXBlczsgYXJjaC0+bmFtZTsgYXJjaCsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFyY2gtPm5hbWUsIGF2cjMyX2FyY2hfbmFtZSkgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICBhdnIzMl9hcmNoID0gYXJjaDsKKworICBpZiAoIWFyY2gtPm5hbWUgJiYgc3RyY21wKCJub25lIiwgYXZyMzJfYXJjaF9uYW1lKSAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gYXJjaCBgJXMnIHNwZWNpZmllZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiS25vd24gYXJjaCBuYW1lczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIlx0dWMgKGRlcHJlY2F0ZWQpXG4iLAorICAgICAgICAgICAgICAgYXZyMzJfYXJjaF9uYW1lKTsKKyAgICAgIGZvciAoYXJjaCA9IGF2cjMyX2FyY2hfdHlwZXM7IGFyY2gtPm5hbWU7IGFyY2grKykKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHQlc1xuIiwgYXJjaC0+bmFtZSk7CisgICAgICBhdnIzMl9hcmNoID0gJmF2cjMyX2FyY2hfdHlwZXNbQVJDSF9UWVBFX0FWUjMyX0FQXTsKKyAgICB9CisKKyAgLyogQ2hlY2sgaWYgcGFydCB0eXBlIGlzIHNldC4gKi8KKyAgZm9yIChwYXJ0ID0gYXZyMzJfcGFydF90eXBlczsgcGFydC0+bmFtZTsgcGFydCsrKQorICAgIGlmIChzdHJjbXAgKHBhcnQtPm5hbWUsIGF2cjMyX3BhcnRfbmFtZSkgPT0gMCkKKyAgICAgIGJyZWFrOworCisgIGF2cjMyX3BhcnQgPSBwYXJ0OworICBpZiAoIXBhcnQtPm5hbWUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwYXJ0IGAlcycgc3BlY2lmaWVkXG5Lbm93biBwYXJ0IG5hbWVzOlxuIiwKKyAgICAgICAgICAgICAgIGF2cjMyX3BhcnRfbmFtZSk7CisgICAgICBmb3IgKHBhcnQgPSBhdnIzMl9wYXJ0X3R5cGVzOyBwYXJ0LT5uYW1lOyBwYXJ0KyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wKCJub25lIiwgcGFydC0+bmFtZSkgIT0gMCkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlx0JXNcbiIsIHBhcnQtPm5hbWUpOworICAgICAgICB9CisgICAgICAvKiBTZXQgZGVmYXVsdCB0byBOT05FKi8KKyAgICAgIGF2cjMyX3BhcnQgPSAmYXZyMzJfcGFydF90eXBlc1tQQVJUX1RZUEVfQVZSMzJfTk9ORV07CisgICAgfQorCisgIC8qIE5CISBvcHRpb24gLW1hcmNoPSBvdmVycmlkZXMgb3B0aW9uIC1tcGFydAorICAgKiBpZiBib3RoIGFyZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgaWYgKCFhcmNoLT5uYW1lKQorICAgIGF2cjMyX2FyY2ggPSAmYXZyMzJfYXJjaF90eXBlc1thdnIzMl9wYXJ0LT5hcmNoX3R5cGVdOworCisgIC8qIElmIG9wdGltaXphdGlvbiBsZXZlbCBpcyB0d28gb3IgZ3JlYXRlciwgdGhlbiBhbGlnbiBzdGFydCBvZiBsb29wcyB0byBhCisgICAgIHdvcmQgYm91bmRhcnkgc2luY2UgdGhpcyB3aWxsIGFsbG93IGZvbGRpbmcgdGhlIGZpcnN0IGluc24gb2YgdGhlIGxvb3AuCisgICAgIERvIHRoaXMgb25seSBmb3IgdGFyZ2V0cyBzdXBwb3J0aW5nIGJyYW5jaCBwcmVkaWN0aW9uLiAqLworICBpZiAob3B0aW1pemUgPj0gMiAmJiBUQVJHRVRfQlJBTkNIX1BSRUQpCisgICAgYWxpZ25fbG9vcHMgPSAyOworCisKKyAgLyogRW5hYmxlIGZhc3QtZmxvYXQgbGlicmFyeSBpZiB1bnNhZmUgbWF0aCBvcHRpbWl6YXRpb25zCisgICAgIGFyZSB1c2VkLiAqLworICBpZiAoZmxhZ191bnNhZmVfbWF0aF9vcHRpbWl6YXRpb25zKQorICAgIHRhcmdldF9mbGFncyB8PSBNQVNLX0ZBU1RfRkxPQVQ7CisKKyAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHNldCBhdnIzMl9pbW1faW5fY29uc3RfcG9vbAorICAgICBiYXNlZCBvbiBpZiBjYWNoZXMgYXJlIHByZXNlbnQgb3Igbm90LiAqLworICBpZiAoIGF2cjMyX2ltbV9pbl9jb25zdF9wb29sID09IC0xICkKKyAgICB7CisgICAgICBpZiAoIFRBUkdFVF9DQUNIRVMgKQorICAgICAgICBhdnIzMl9pbW1faW5fY29uc3RfcG9vbCA9IDE7CisgICAgICBlbHNlCisgICAgICAgIGF2cjMyX2ltbV9pbl9jb25zdF9wb29sID0gMDsKKyAgICB9CisKKyAgaWYgKFRBUkdFVF9OT19QSUMpCisgICAgZmxhZ19waWMgPSAwOworCisgIGF2cjMyX2FkZF9nY19yb290cyAoKTsKK30KKworCisvKgorSWYgZGVmaW5lZCwgYSBmdW5jdGlvbiB0aGF0IG91dHB1dHMgdGhlIGFzc2VtYmxlciBjb2RlIGZvciBlbnRyeSB0byBhCitmdW5jdGlvbi4gIFRoZSBwcm9sb2d1ZSBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB1cCB0aGUgc3RhY2sgZnJhbWUsCitpbml0aWFsaXppbmcgdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIsIHNhdmluZyByZWdpc3RlcnMgdGhhdCBtdXN0IGJlCitzYXZlZCwgYW5kIGFsbG9jYXRpbmcgc2l6ZSBhZGRpdGlvbmFsIGJ5dGVzIG9mIHN0b3JhZ2UgZm9yIHRoZQorbG9jYWwgdmFyaWFibGVzLiAgc2l6ZSBpcyBhbiBpbnRlZ2VyLiAgZmlsZSBpcyBhIHN0ZGlvCitzdHJlYW0gdG8gd2hpY2ggdGhlIGFzc2VtYmxlciBjb2RlIHNob3VsZCBiZSBvdXRwdXQuCisKK1RoZSBsYWJlbCBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gbmVlZCBub3QgYmUgb3V0cHV0IGJ5IHRoaXMKK21hY3JvLiAgVGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgd2hlbiB0aGUgbWFjcm8gaXMgcnVuLgorCitUbyBkZXRlcm1pbmUgd2hpY2ggcmVnaXN0ZXJzIHRvIHNhdmUsIHRoZSBtYWNybyBjYW4gcmVmZXIgdG8gdGhlIGFycmF5CityZWdzX2V2ZXJfbGl2ZTogZWxlbWVudCByIGlzIG5vbnplcm8gaWYgaGFyZCByZWdpc3RlcgorciBpcyB1c2VkIGFueXdoZXJlIHdpdGhpbiB0aGUgZnVuY3Rpb24uICBUaGlzIGltcGxpZXMgdGhlIGZ1bmN0aW9uCitwcm9sb2d1ZSBzaG91bGQgc2F2ZSByZWdpc3RlciByLCBwcm92aWRlZCBpdCBpcyBub3Qgb25lIG9mIHRoZQorY2FsbC11c2VkIHJlZ2lzdGVycy4gIChUQVJHRVRfQVNNX0ZVTkNUSU9OX0VQSUxPR1VFIG11c3QgbGlrZXdpc2UgdXNlCityZWdzX2V2ZXJfbGl2ZS4pCisKK09uIG1hY2hpbmVzIHRoYXQgaGF2ZSBgYHJlZ2lzdGVyIHdpbmRvd3MnJywgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgZG9lcworbm90IHNhdmUgb24gdGhlIHN0YWNrIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgaW4gdGhlIHdpbmRvd3MsIGV2ZW4gaWYKK3RoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIHByZXNlcnZlZCBieSBmdW5jdGlvbiBjYWxsczsgaW5zdGVhZCBpdCB0YWtlcworYXBwcm9wcmlhdGUgc3RlcHMgdG8gYGBwdXNoJycgdGhlIHJlZ2lzdGVyIHN0YWNrLCBpZiBhbnkgbm9uLWNhbGwtdXNlZAorcmVnaXN0ZXJzIGFyZSB1c2VkIGluIHRoZSBmdW5jdGlvbi4KKworT24gbWFjaGluZXMgd2hlcmUgZnVuY3Rpb25zIG1heSBvciBtYXkgbm90IGhhdmUgZnJhbWUtcG9pbnRlcnMsIHRoZQorZnVuY3Rpb24gZW50cnkgY29kZSBtdXN0IHZhcnkgYWNjb3JkaW5nbHk7IGl0IG11c3Qgc2V0IHVwIHRoZSBmcmFtZQorcG9pbnRlciBpZiBvbmUgaXMgd2FudGVkLCBhbmQgbm90IG90aGVyd2lzZS4gIFRvIGRldGVybWluZSB3aGV0aGVyIGEKK2ZyYW1lIHBvaW50ZXIgaXMgaW4gd2FudGVkLCB0aGUgbWFjcm8gY2FuIHJlZmVyIHRvIHRoZSB2YXJpYWJsZQorZnJhbWVfcG9pbnRlcl9uZWVkZWQuICBUaGUgdmFyaWFibGUncyB2YWx1ZSB3aWxsIGJlIDEgYXQgcnVuCit0aW1lIGluIGEgZnVuY3Rpb24gdGhhdCBuZWVkcyBhIGZyYW1lIHBvaW50ZXIuICAoc2VlIEVsaW1pbmF0aW9uKS4KKworVGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgYW55IHN0YWNrIHNwYWNlCityZXF1aXJlZCBmb3IgdGhlIGZ1bmN0aW9uLiAgVGhpcyBzdGFjayBzcGFjZSBjb25zaXN0cyBvZiB0aGUgcmVnaW9ucworbGlzdGVkIGJlbG93LiAgSW4gbW9zdCBjYXNlcywgdGhlc2UgcmVnaW9ucyBhcmUgYWxsb2NhdGVkIGluIHRoZQorb3JkZXIgbGlzdGVkLCB3aXRoIHRoZSBsYXN0IGxpc3RlZCByZWdpb24gY2xvc2VzdCB0byB0aGUgdG9wIG9mIHRoZQorc3RhY2sgKHRoZSBsb3dlc3QgYWRkcmVzcyBpZiBTVEFDS19HUk9XU19ET1dOV0FSRCBpcyBkZWZpbmVkLCBhbmQKK3RoZSBoaWdoZXN0IGFkZHJlc3MgaWYgaXQgaXMgbm90IGRlZmluZWQpLiAgWW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgb3JkZXIKK2ZvciBhIG1hY2hpbmUgaWYgZG9pbmcgc28gaXMgbW9yZSBjb252ZW5pZW50IG9yIHJlcXVpcmVkIGZvcgorY29tcGF0aWJpbGl0eSByZWFzb25zLiAgRXhjZXB0IGluIGNhc2VzIHdoZXJlIHJlcXVpcmVkIGJ5IHN0YW5kYXJkCitvciBieSBhIGRlYnVnZ2VyLCB0aGVyZSBpcyBubyByZWFzb24gd2h5IHRoZSBzdGFjayBsYXlvdXQgdXNlZCBieSBHQ0MKK25lZWQgYWdyZWUgd2l0aCB0aGF0IHVzZWQgYnkgb3RoZXIgY29tcGlsZXJzIGZvciBhIG1hY2hpbmUuCisqLworCisjdW5kZWYgVEFSR0VUX0FTTV9GVU5DVElPTl9QUk9MT0dVRQorI2RlZmluZSBUQVJHRVRfQVNNX0ZVTkNUSU9OX1BST0xPR1VFIGF2cjMyX3RhcmdldF9hc21fZnVuY3Rpb25fcHJvbG9ndWUKKworCisjdW5kZWYgVEFSR0VUX0RFRkFVTFRfU0hPUlRfRU5VTVMKKyNkZWZpbmUgVEFSR0VUX0RFRkFVTFRfU0hPUlRfRU5VTVMgaG9va19ib29sX3ZvaWRfZmFsc2UKKworI3VuZGVmIFRBUkdFVF9QUk9NT1RFX0ZVTkNUSU9OX0FSR1MKKyNkZWZpbmUgVEFSR0VUX1BST01PVEVfRlVOQ1RJT05fQVJHUyBob29rX2Jvb2xfdHJlZV90cnVlCisKKyN1bmRlZiBUQVJHRVRfUFJPTU9URV9GVU5DVElPTl9SRVRVUk4KKyNkZWZpbmUgVEFSR0VUX1BST01PVEVfRlVOQ1RJT05fUkVUVVJOIGhvb2tfYm9vbF90cmVlX3RydWUKKworI3VuZGVmIFRBUkdFVF9QUk9NT1RFX1BST1RPVFlQRVMKKyNkZWZpbmUgVEFSR0VUX1BST01PVEVfUFJPVE9UWVBFUyBob29rX2Jvb2xfdHJlZV90cnVlCisKKyN1bmRlZiBUQVJHRVRfTVVTVF9QQVNTX0lOX1NUQUNLCisjZGVmaW5lIFRBUkdFVF9NVVNUX1BBU1NfSU5fU1RBQ0sgYXZyMzJfbXVzdF9wYXNzX2luX3N0YWNrCisKKyN1bmRlZiBUQVJHRVRfUEFTU19CWV9SRUZFUkVOQ0UKKyNkZWZpbmUgVEFSR0VUX1BBU1NfQllfUkVGRVJFTkNFIGF2cjMyX3Bhc3NfYnlfcmVmZXJlbmNlCisKKyN1bmRlZiBUQVJHRVRfU1RSSUNUX0FSR1VNRU5UX05BTUlORworI2RlZmluZSBUQVJHRVRfU1RSSUNUX0FSR1VNRU5UX05BTUlORyBhdnIzMl9zdHJpY3RfYXJndW1lbnRfbmFtaW5nCisKKyN1bmRlZiBUQVJHRVRfVkVDVE9SX01PREVfU1VQUE9SVEVEX1AKKyNkZWZpbmUgVEFSR0VUX1ZFQ1RPUl9NT0RFX1NVUFBPUlRFRF9QIGF2cjMyX3ZlY3Rvcl9tb2RlX3N1cHBvcnRlZAorCisjdW5kZWYgVEFSR0VUX1JFVFVSTl9JTl9NRU1PUlkKKyNkZWZpbmUgVEFSR0VUX1JFVFVSTl9JTl9NRU1PUlkgYXZyMzJfcmV0dXJuX2luX21lbW9yeQorCisjdW5kZWYgVEFSR0VUX1JFVFVSTl9JTl9NU0IKKyNkZWZpbmUgVEFSR0VUX1JFVFVSTl9JTl9NU0IgYXZyMzJfcmV0dXJuX2luX21zYgorCisjdW5kZWYgVEFSR0VUX0VOQ09ERV9TRUNUSU9OX0lORk8KKyNkZWZpbmUgVEFSR0VUX0VOQ09ERV9TRUNUSU9OX0lORk8gYXZyMzJfZW5jb2RlX3NlY3Rpb25faW5mbworCisjdW5kZWYgVEFSR0VUX0FSR19QQVJUSUFMX0JZVEVTCisjZGVmaW5lIFRBUkdFVF9BUkdfUEFSVElBTF9CWVRFUyBhdnIzMl9hcmdfcGFydGlhbF9ieXRlcworCisjdW5kZWYgVEFSR0VUX1NUUklQX05BTUVfRU5DT0RJTkcKKyNkZWZpbmUgVEFSR0VUX1NUUklQX05BTUVfRU5DT0RJTkcgYXZyMzJfc3RyaXBfbmFtZV9lbmNvZGluZworCisjZGVmaW5lIHN0cmVxKHN0cmluZzEsIHN0cmluZzIpIChzdHJjbXAgKHN0cmluZzEsIHN0cmluZzIpID09IDApCisKKyN1bmRlZiAgVEFSR0VUX05BUlJPV19WT0xBVElMRV9CSVRGSUVMRAorI2RlZmluZSBUQVJHRVRfTkFSUk9XX1ZPTEFUSUxFX0JJVEZJRUxEIGhvb2tfYm9vbF92b2lkX2ZhbHNlCisKKyN1bmRlZiAgVEFSR0VUX0FUVFJJQlVURV9UQUJMRQorI2RlZmluZSBUQVJHRVRfQVRUUklCVVRFX1RBQkxFIGF2cjMyX2F0dHJpYnV0ZV90YWJsZQorCisjdW5kZWYgIFRBUkdFVF9DT01QX1RZUEVfQVRUUklCVVRFUworI2RlZmluZSBUQVJHRVRfQ09NUF9UWVBFX0FUVFJJQlVURVMgYXZyMzJfY29tcF90eXBlX2F0dHJpYnV0ZXMKKworCisjdW5kZWYgIFRBUkdFVF9SVFhfQ09TVFMKKyNkZWZpbmUgVEFSR0VUX1JUWF9DT1NUUyBhdnIzMl9ydHhfY29zdHMKKworI3VuZGVmICBUQVJHRVRfQ0FOTk9UX0ZPUkNFX0NPTlNUX01FTQorI2RlZmluZSAgVEFSR0VUX0NBTk5PVF9GT1JDRV9DT05TVF9NRU0gYXZyMzJfY2Fubm90X2ZvcmNlX2NvbnN0X21lbQorCisjdW5kZWYgIFRBUkdFVF9BU01fSU5URUdFUgorI2RlZmluZSBUQVJHRVRfQVNNX0lOVEVHRVIgYXZyMzJfYXNzZW1ibGVfaW50ZWdlcgorCisjdW5kZWYgIFRBUkdFVF9GVU5DVElPTl9WQUxVRQorI2RlZmluZSBUQVJHRVRfRlVOQ1RJT05fVkFMVUUgYXZyMzJfZnVuY3Rpb25fdmFsdWUKKworI3VuZGVmICBUQVJHRVRfTUlOX0FOQ0hPUl9PRkZTRVQKKyNkZWZpbmUgVEFSR0VUX01JTl9BTkNIT1JfT0ZGU0VUICgwKQorCisjdW5kZWYgIFRBUkdFVF9NQVhfQU5DSE9SX09GRlNFVAorI2RlZmluZSBUQVJHRVRfTUFYX0FOQ0hPUl9PRkZTRVQgKCgxIDw8IDE1KSAtIDEpCisKKyN1bmRlZiBUQVJHRVRfU0VDT05EQVJZX1JFTE9BRAorI2RlZmluZSBUQVJHRVRfU0VDT05EQVJZX1JFTE9BRCBhdnIzMl9zZWNvbmRhcnlfcmVsb2FkCisKK2VudW0gcmVnX2NsYXNzCithdnIzMl9zZWNvbmRhcnlfcmVsb2FkIChib29sIGluX3AsIHJ0eCB4LCBlbnVtIHJlZ19jbGFzcyBjbGFzcyBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtYWNoaW5lX21vZGUgbW9kZSwgc2Vjb25kYXJ5X3JlbG9hZF9pbmZvICpzcmkpCit7CisKKyAgaWYgKCBhdnIzMl9ybXdfbWVtb3J5X29wZXJhbmQgKHgsIG1vZGUpICkKKyAgICB7CisgICAgICBpZiAoIWluX3ApCisgICAgICAgIHNyaS0+aWNvZGUgPSBDT0RFX0ZPUl9yZWxvYWRfb3V0X3Jtd19tZW1vcnlfb3BlcmFuZDsKKyAgICAgIGVsc2UKKyAgICAgICAgc3JpLT5pY29kZSA9IENPREVfRk9SX3JlbG9hZF9pbl9ybXdfbWVtb3J5X29wZXJhbmQ7CisgICAgfQorICByZXR1cm4gTk9fUkVHUzsKKworfQorCisvKgorICogU3dpdGNoZXMgdG8gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gZm9yIG91dHB1dCBvZiBjb25zdGFudCBwb29sCisgKiBlbnRyeSB4IGluIG1vZGUuIFlvdSBjYW4gYXNzdW1lIHRoYXQgeCBpcyBzb21lIGtpbmQgb2YgY29uc3RhbnQgaW4KKyAqIFJUTC4gVGhlIGFyZ3VtZW50IG1vZGUgaXMgcmVkdW5kYW50IGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhCisgKiBjb25zdF9pbnQgcnR4LiBTZWxlY3QgdGhlIHNlY3Rpb24gYnkgY2FsbGluZyByZWFkb25seV9kYXRhXyBzZWN0aW9uCisgKiBvciBvbmUgb2YgdGhlIGFsdGVybmF0aXZlcyBmb3Igb3RoZXIgc2VjdGlvbnMuIGFsaWduIGlzIHRoZQorICogY29uc3RhbnQgYWxpZ25tZW50IGluIGJpdHMuCisgKgorICogVGhlIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgcHV0dGluZyBzeW1ib2xpYworICogY29uc3RhbnRzIGluIGZsYWdfIHBpYyBtb2RlIGluIGRhdGFfc2VjdGlvbiBhbmQgZXZlcnl0aGluZyBlbHNlIGluCisgKiByZWFkb25seV9kYXRhX3NlY3Rpb24uCisgKi8KKy8vI3VuZGVmIFRBUkdFVF9BU01fU0VMRUNUX1JUWF9TRUNUSU9OCisvLyNkZWZpbmUgVEFSR0VUX0FTTV9TRUxFQ1RfUlRYX1NFQ1RJT04gYXZyMzJfc2VsZWN0X3J0eF9zZWN0aW9uCisKKworLyoKKyAqIElmIG5vbi1udWxsLCB0aGlzIGhvb2sgcGVyZm9ybXMgYSB0YXJnZXQtc3BlY2lmaWMgcGFzcyBvdmVyIHRoZQorICogaW5zdHJ1Y3Rpb24gc3RyZWFtLiBUaGUgY29tcGlsZXIgd2lsbCBydW4gaXQgYXQgYWxsIG9wdGltaXphdGlvbgorICogbGV2ZWxzLCBqdXN0IGJlZm9yZSB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgbm9ybWFsbHkgZG9lcworICogZGVsYXllZC1icmFuY2ggc2NoZWR1bGluZy4KKyAqCisgKiBUaGUgZXhhY3QgcHVycG9zZSBvZiB0aGUgaG9vayB2YXJpZXMgZnJvbSB0YXJnZXQgdG8gdGFyZ2V0LiBTb21lCisgKiB1c2UgaXQgdG8gZG8gdHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3MsCisgKiBzdWNoIGFzIGxheWluZyBvdXQgaW4tZnVuY3Rpb24gY29uc3RhbnQgcG9vbHMgb3IgYXZvaWRpbmcgaGFyZHdhcmUKKyAqIGhhemFyZHMuIE90aGVycyB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gc29tZQorICogbWFjaGluZS1kZXBlbmRlbnQgb3B0aW1pemF0aW9ucy4KKyAqCisgKiBZb3UgbmVlZCBub3QgaW1wbGVtZW50IHRoZSBob29rIGlmIGl0IGhhcyBub3RoaW5nIHRvIGRvLiBUaGUKKyAqIGRlZmF1bHQgZGVmaW5pdGlvbiBpcyBudWxsLgorICovCisjdW5kZWYgVEFSR0VUX01BQ0hJTkVfREVQRU5ERU5UX1JFT1JHCisjZGVmaW5lIFRBUkdFVF9NQUNISU5FX0RFUEVOREVOVF9SRU9SRyBhdnIzMl9yZW9yZworCisvKiBUYXJnZXQgaG9vayBmb3IgYXNzZW1ibGluZyBpbnRlZ2VyIG9iamVjdHMuCisgICBOZWVkIHRvIGhhbmRsZSBpbnRlZ2VyIHZlY3RvcnMgKi8KK3N0YXRpYyBib29sCithdnIzMl9hc3NlbWJsZV9pbnRlZ2VyIChydHggeCwgdW5zaWduZWQgaW50IHNpemUsIGludCBhbGlnbmVkX3ApCit7CisgIGlmIChhdnIzMl92ZWN0b3JfbW9kZV9zdXBwb3J0ZWQgKEdFVF9NT0RFICh4KSkpCisgICAgeworICAgICAgaW50IGksIHVuaXRzOworCisgICAgICBpZiAoR0VUX0NPREUgKHgpICE9IENPTlNUX1ZFQ1RPUikKKwlhYm9ydCAoKTsKKworICAgICAgdW5pdHMgPSBDT05TVF9WRUNUT1JfTlVOSVRTICh4KTsKKworICAgICAgc3dpdGNoIChHRVRfTU9ERSAoeCkpCisJeworCWNhc2UgVjJISW1vZGU6CisJICBzaXplID0gMjsKKwkgIGJyZWFrOworCWNhc2UgVjRRSW1vZGU6CisJICBzaXplID0gMTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB1bml0czsgaSsrKQorCXsKKwkgIHJ0eCBlbHQ7CisKKwkgIGVsdCA9IENPTlNUX1ZFQ1RPUl9FTFQgKHgsIGkpOworCSAgYXNzZW1ibGVfaW50ZWdlciAoZWx0LCBzaXplLCBpID09IDAgPyAzMiA6IHNpemUgKiBCSVRTX1BFUl9VTklULCAxKTsKKwl9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICByZXR1cm4gZGVmYXVsdF9hc3NlbWJsZV9pbnRlZ2VyICh4LCBzaXplLCBhbGlnbmVkX3ApOworfQorCisvKgorICogVGhpcyB0YXJnZXQgaG9vayBkZXNjcmliZXMgdGhlIHJlbGF0aXZlIGNvc3RzIG9mIFJUTCBleHByZXNzaW9ucy4KKyAqCisgKiBUaGUgY29zdCBtYXkgZGVwZW5kIG9uIHRoZSBwcmVjaXNlIGZvcm0gb2YgdGhlIGV4cHJlc3Npb24sIHdoaWNoIGlzCisgKiBhdmFpbGFibGUgZm9yIGV4YW1pbmF0aW9uIGluIHgsIGFuZCB0aGUgcnR4IGNvZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAqIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZCwgZm91bmQgaW4gb3V0ZXJfY29kZS4gY29kZSBpcyB0aGUKKyAqIGV4cHJlc3Npb24gY29kZS0tcmVkdW5kYW50LCBzaW5jZSBpdCBjYW4gYmUgb2J0YWluZWQgd2l0aCBHRVRfQ09ERQorICogKHgpLgorICoKKyAqIEluIGltcGxlbWVudGluZyB0aGlzIGhvb2ssIHlvdSBjYW4gdXNlIHRoZSBjb25zdHJ1Y3QgQ09TVFNfTl9JTlNOUworICogKG4pIHRvIHNwZWNpZnkgYSBjb3N0IGVxdWFsIHRvIG4gZmFzdCBpbnN0cnVjdGlvbnMuCisgKgorICogT24gZW50cnkgdG8gdGhlIGhvb2ssICp0b3RhbCBjb250YWlucyBhIGRlZmF1bHQgZXN0aW1hdGUgZm9yIHRoZQorICogY29zdCBvZiB0aGUgZXhwcmVzc2lvbi4gVGhlIGhvb2sgc2hvdWxkIG1vZGlmeSB0aGlzIHZhbHVlIGFzCisgKiBuZWNlc3NhcnkuIFRyYWRpdGlvbmFsbHksIHRoZSBkZWZhdWx0IGNvc3RzIGFyZSBDT1NUU19OX0lOU05TICg1KQorICogZm9yIG11bHRpcGxpY2F0aW9ucywgQ09TVFNfTl9JTlNOUyAoNykgZm9yIGRpdmlzaW9uIGFuZCBtb2R1bHVzCisgKiBvcGVyYXRpb25zLCBhbmQgQ09TVFNfTl9JTlNOUyAoMSkgZm9yIGFsbCBvdGhlciBvcGVyYXRpb25zLgorICoKKyAqIFdoZW4gb3B0aW1pemluZyBmb3IgY29kZSBzaXplLCBpLmUuIHdoZW4gb3B0aW1pemVfc2l6ZSBpcyBub24temVybywKKyAqIHRoaXMgdGFyZ2V0IGhvb2sgc2hvdWxkIGJlIHVzZWQgdG8gZXN0aW1hdGUgdGhlIHJlbGF0aXZlIHNpemUgY29zdAorICogb2YgYW4gZXhwcmVzc2lvbiwgYWdhaW4gcmVsYXRpdmUgdG8gQ09TVFNfTl9JTlNOUy4KKyAqCisgKiBUaGUgaG9vayByZXR1cm5zIHRydWUgd2hlbiBhbGwgc3ViZXhwcmVzc2lvbnMgb2YgeCBoYXZlIGJlZW4KKyAqIHByb2Nlc3NlZCwgYW5kIGZhbHNlIHdoZW4gcnR4X2Nvc3Qgc2hvdWxkIHJlY3Vyc2UuCisgKi8KKworLyogV29ya2VyIHJvdXRpbmUgZm9yIGF2cjMyX3J0eF9jb3N0cy4gICovCitzdGF0aWMgaW5saW5lIGludAorYXZyMzJfcnR4X2Nvc3RzXzEgKHJ0eCB4LCBlbnVtIHJ0eF9jb2RlIGNvZGUgQVRUUklCVVRFX1VOVVNFRCwKKwkJICAgZW51bSBydHhfY29kZSBvdXRlciBBVFRSSUJVVEVfVU5VU0VEKQoreworICBlbnVtIG1hY2hpbmVfbW9kZSBtb2RlID0gR0VUX01PREUgKHgpOworCisgIHN3aXRjaCAoR0VUX0NPREUgKHgpKQorICAgIHsKKyAgICBjYXNlIE1FTToKKyAgICAgIC8qIFVzaW5nIHByZSBkZWNyZW1lbnQgLyBwb3N0IGluY3JlbWVudCBtZW1vcnkgb3BlcmF0aW9ucyBvbiB0aGUKKyAgICAgICAgIGF2cjMyX3VjIGFyY2hpdGVjdHVyZSBtZWFucyB0aGF0IHR3byB3cml0ZWJhY2tzIG11c3QgYmUgcGVyZm9ybWVkCisgICAgICAgICBhbmQgaGVuY2UgdHdvIGN5Y2xlcyBhcmUgbmVlZGVkLiAqLworICAgICAgaWYgKCFvcHRpbWl6ZV9zaXplCisJICAmJiBHRVRfTU9ERV9TSVpFIChtb2RlKSA8PSAyICogVU5JVFNfUEVSX1dPUkQKKwkgICYmIFRBUkdFVF9BUkNIX1VDCisJICAmJiAoR0VUX0NPREUgKFhFWFAgKHgsIDApKSA9PSBQUkVfREVDCisJICAgICAgfHwgR0VUX0NPREUgKFhFWFAgKHgsIDApKSA9PSBQT1NUX0lOQykpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDUpOworCisgICAgICAvKiBNZW1vcnkgY29zdHMgcXVpdGUgYSBsb3QgZm9yIHRoZSBmaXJzdCB3b3JkLCBidXQgc3Vic2VxdWVudCB3b3JkcworICAgICAgICAgbG9hZCBhdCB0aGUgZXF1aXZhbGVudCBvZiBhIHNpbmdsZSBpbnNuIGVhY2guICAqLworICAgICAgaWYgKEdFVF9NT0RFX1NJWkUgKG1vZGUpID4gVU5JVFNfUEVSX1dPUkQpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDMgKyAoR0VUX01PREVfU0laRSAobW9kZSkgLyBVTklUU19QRVJfV09SRCkpOworCisgICAgICByZXR1cm4gQ09TVFNfTl9JTlNOUyAoNCk7CisgICAgY2FzZSBTWU1CT0xfUkVGOgorICAgIGNhc2UgQ09OU1Q6CisgICAgICAvKiBUaGVzZSBhcmUgdmFsaWQgZm9yIHRoZSBwc2V1ZG8gaW5zbnM6IGxkYS53IGFuZCBjYWxsIHdoaWNoIG9wZXJhdGVzCisgICAgICAgICBvbiBkaXJlY3QgYWRkcmVzc2VzLiBXZSBhc3N1bWUgdGhhdCB0aGUgY29zdCBvZiBhIGxkYS53IGlzIHRoZSBzYW1lCisgICAgICAgICBhcyB0aGUgY29zdCBvZiBhIGxkLncgaW5zbi4gKi8KKyAgICAgIHJldHVybiAob3V0ZXIgPT0gU0VUKSA/IENPU1RTX05fSU5TTlMgKDQpIDogQ09TVFNfTl9JTlNOUyAoMSk7CisgICAgY2FzZSBESVY6CisgICAgY2FzZSBNT0Q6CisgICAgY2FzZSBVRElWOgorICAgIGNhc2UgVU1PRDoKKyAgICAgIHJldHVybiBvcHRpbWl6ZV9zaXplID8gQ09TVFNfTl9JTlNOUyAoMSkgOiBDT1NUU19OX0lOU05TICgxNik7CisKKyAgICBjYXNlIFJPVEFURToKKyAgICBjYXNlIFJPVEFURVJUOgorICAgICAgaWYgKG1vZGUgPT0gVEltb2RlKQorCXJldHVybiBDT1NUU19OX0lOU05TICgxMDApOworCisgICAgICBpZiAobW9kZSA9PSBESW1vZGUpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDEwKTsKKyAgICAgIHJldHVybiBDT1NUU19OX0lOU05TICg0KTsKKyAgICBjYXNlIEFTSElGVDoKKyAgICBjYXNlIExTSElGVFJUOgorICAgIGNhc2UgQVNISUZUUlQ6CisgICAgY2FzZSBOT1Q6CisgICAgICBpZiAobW9kZSA9PSBUSW1vZGUpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDEwKTsKKworICAgICAgaWYgKG1vZGUgPT0gREltb2RlKQorCXJldHVybiBDT1NUU19OX0lOU05TICg0KTsKKyAgICAgIHJldHVybiBDT1NUU19OX0lOU05TICgxKTsKKyAgICBjYXNlIFBMVVM6CisgICAgY2FzZSBNSU5VUzoKKyAgICBjYXNlIE5FRzoKKyAgICBjYXNlIENPTVBBUkU6CisgICAgY2FzZSBBQlM6CisgICAgICBpZiAoR0VUX01PREVfQ0xBU1MgKG1vZGUpID09IE1PREVfRkxPQVQpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDEwMCk7CisKKyAgICAgIGlmIChtb2RlID09IFRJbW9kZSkKKwlyZXR1cm4gQ09TVFNfTl9JTlNOUyAoNTApOworCisgICAgICBpZiAobW9kZSA9PSBESW1vZGUpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDIpOworICAgICAgcmV0dXJuIENPU1RTX05fSU5TTlMgKDEpOworCisgICAgY2FzZSBNVUxUOgorICAgICAgeworCWlmIChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0gTU9ERV9GTE9BVCkKKwkgIHJldHVybiBDT1NUU19OX0lOU05TICgzMDApOworCisJaWYgKG1vZGUgPT0gVEltb2RlKQorCSAgcmV0dXJuIENPU1RTX05fSU5TTlMgKDE2KTsKKworCWlmIChtb2RlID09IERJbW9kZSkKKwkgIHJldHVybiBDT1NUU19OX0lOU05TICg0KTsKKworCWlmIChtb2RlID09IEhJbW9kZSkKKwkgIHJldHVybiBDT1NUU19OX0lOU05TICgyKTsKKworCXJldHVybiBDT1NUU19OX0lOU05TICgzKTsKKyAgICAgIH0KKyAgICBjYXNlIElGX1RIRU5fRUxTRToKKyAgICAgIGlmIChHRVRfQ09ERSAoWEVYUCAoeCwgMSkpID09IFBDIHx8IEdFVF9DT0RFIChYRVhQICh4LCAyKSkgPT0gUEMpCisJcmV0dXJuIENPU1RTX05fSU5TTlMgKDQpOworICAgICAgcmV0dXJuIENPU1RTX05fSU5TTlMgKDEpOworICAgIGNhc2UgU0lHTl9FWFRFTkQ6CisgICAgY2FzZSBaRVJPX0VYVEVORDoKKyAgICAgIC8qIFNpZ24vWmVybyBleHRlbnNpb25zIG9mIHJlZ2lzdGVycyBjb3N0IHF1aXRlIG11Y2ggc2luY2UgdGhlc2UKKyAgICAgICAgIGluc3RyY3V0aW9ucyBvbmx5IHRha2Ugb25lIHJlZ2lzdGVyIG9wZXJhbmQgd2hpY2ggbWVhbnMgdGhhdCBnY2MKKyAgICAgICAgIG9mdGVuIG11c3QgaW5zZXJ0IHNvbWUgbW92ZSBpbnN0cmN1dGlvbnMgKi8KKyAgICAgIGlmIChtb2RlID09IFFJbW9kZSB8fCBtb2RlID09IEhJbW9kZSkKKwlyZXR1cm4gKENPU1RTX05fSU5TTlMgKEdFVF9DT0RFIChYRVhQICh4LCAwKSkgPT0gTUVNID8gMCA6IDEpKTsKKyAgICAgIHJldHVybiBDT1NUU19OX0lOU05TICg0KTsKKyAgICBjYXNlIFVOU1BFQzoKKyAgICAgIC8qIGRpdm1vZCBvcGVyYXRpb25zICovCisgICAgICBpZiAoWElOVCAoeCwgMSkgPT0gVU5TUEVDX1VESVZNT0RTSTRfSU5URVJOQUwKKwkgIHx8IFhJTlQgKHgsIDEpID09IFVOU1BFQ19ESVZNT0RTSTRfSU5URVJOQUwpCisJeworCSAgcmV0dXJuIG9wdGltaXplX3NpemUgPyBDT1NUU19OX0lOU05TICgxKSA6IENPU1RTX05fSU5TTlMgKDE2KTsKKwl9CisgICAgICAvKiBGYWxsdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ09TVFNfTl9JTlNOUyAoMSk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbAorYXZyMzJfcnR4X2Nvc3RzIChydHggeCwgaW50IGNvZGUsIGludCBvdXRlcl9jb2RlLCBpbnQgKnRvdGFsKQoreworICAqdG90YWwgPSBhdnIzMl9ydHhfY29zdHNfMSAoeCwgY29kZSwgb3V0ZXJfY29kZSk7CisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wKK2F2cjMyX2Nhbm5vdF9mb3JjZV9jb25zdF9tZW0gKHJ0eCB4IEFUVFJJQlVURV9VTlVTRUQpCit7CisgIC8qIERvIG5vdCB3YW50IHN5bWJvbHMgaW4gdGhlIGNvbnN0YW50IHBvb2wgd2hlbiBjb21waWxpbmcgcGljIG9yIGlmIHVzaW5nCisgICAgIGFkZHJlc3MgcHNldWRvIGluc3RydWN0aW9ucy4gKi8KKyAgcmV0dXJuICgoZmxhZ19waWMgfHwgVEFSR0VUX0hBU19BU01fQUREUl9QU0VVRE9TKQorCSAgJiYgYXZyMzJfZmluZF9zeW1ib2wgKHgpICE9IE5VTExfUlRYKTsKK30KKworCisvKiBUYWJsZSBvZiBtYWNoaW5lIGF0dHJpYnV0ZXMuICAqLworY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9zcGVjIGF2cjMyX2F0dHJpYnV0ZV90YWJsZVtdID0geworICAvKiB7IG5hbWUsIG1pbl9sZW4sIG1heF9sZW4sIGRlY2xfcmVxLCB0eXBlX3JlcSwgZm5fdHlwZV9yZXEsIGhhbmRsZXIgfSAqLworICAvKiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lcyBoYXZlIHNwZWNpYWwgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlCisgICAgIHJlcXVpcmVtZW50cy4gICovCisgIHsiaXNyIiwgMCwgMSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgYXZyMzJfaGFuZGxlX2lzcl9hdHRyaWJ1dGV9LAorICB7ImludGVycnVwdCIsIDAsIDEsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGF2cjMyX2hhbmRsZV9pc3JfYXR0cmlidXRlfSwKKyAgeyJhY2FsbCIsIDAsIDEsIGZhbHNlLCB0cnVlLCB0cnVlLCBhdnIzMl9oYW5kbGVfYWNhbGxfYXR0cmlidXRlfSwKKyAgeyJuYWtlZCIsIDAsIDAsIHRydWUsIGZhbHNlLCBmYWxzZSwgYXZyMzJfaGFuZGxlX2ZuZGVjbF9hdHRyaWJ1dGV9LAorICB7InJtd19hZGRyZXNzYWJsZSIsIDAsIDAsIHRydWUsIGZhbHNlLCBmYWxzZSwgTlVMTH0sCisgIHtOVUxMLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBOVUxMfQorfTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpjb25zdCBhcmc7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmV0dXJuX3ZhbHVlOworfQoraXNyX2F0dHJpYnV0ZV9hcmc7CisKK3N0YXRpYyBjb25zdCBpc3JfYXR0cmlidXRlX2FyZyBpc3JfYXR0cmlidXRlX2FyZ3NbXSA9IHsKKyAgeyJGVUxMIiwgQVZSMzJfRlRfSVNSX0ZVTEx9LAorICB7ImZ1bGwiLCBBVlIzMl9GVF9JU1JfRlVMTH0sCisgIHsiSEFMRiIsIEFWUjMyX0ZUX0lTUl9IQUxGfSwKKyAgeyJoYWxmIiwgQVZSMzJfRlRfSVNSX0hBTEZ9LAorICB7Ik5PTkUiLCBBVlIzMl9GVF9JU1JfTk9ORX0sCisgIHsibm9uZSIsIEFWUjMyX0ZUX0lTUl9OT05FfSwKKyAgeyJVTkRFRiIsIEFWUjMyX0ZUX0lTUl9OT05FfSwKKyAgeyJ1bmRlZiIsIEFWUjMyX0ZUX0lTUl9OT05FfSwKKyAgeyJTV0kiLCBBVlIzMl9GVF9JU1JfTk9ORX0sCisgIHsic3dpIiwgQVZSMzJfRlRfSVNSX05PTkV9LAorICB7TlVMTCwgQVZSMzJfRlRfSVNSX05PTkV9Cit9OworCisvKiBSZXR1cm5zIHRoZSAoaW50ZXJydXB0KSBmdW5jdGlvbiB0eXBlIG9mIHRoZSBjdXJyZW50CisgICBmdW5jdGlvbiwgb3IgQVZSMzJfRlRfVU5LTk9XTiBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCithdnIzMl9pc3JfdmFsdWUgKHRyZWUgYXJndW1lbnQpCit7CisgIGNvbnN0IGlzcl9hdHRyaWJ1dGVfYXJnICpwdHI7CisgIGNvbnN0IGNoYXIgKmFyZzsKKworICAvKiBObyBhcmd1bWVudCAtIGRlZmF1bHQgdG8gSVNSX05PTkUuICAqLworICBpZiAoYXJndW1lbnQgPT0gTlVMTF9UUkVFKQorICAgIHJldHVybiBBVlIzMl9GVF9JU1JfTk9ORTsKKworICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4gICovCisgIGlmIChUUkVFX1ZBTFVFIChhcmd1bWVudCkgPT0gTlVMTF9UUkVFCisgICAgICB8fCBUUkVFX0NPREUgKFRSRUVfVkFMVUUgKGFyZ3VtZW50KSkgIT0gU1RSSU5HX0NTVCkKKyAgICByZXR1cm4gQVZSMzJfRlRfVU5LTk9XTjsKKworICBhcmcgPSBUUkVFX1NUUklOR19QT0lOVEVSIChUUkVFX1ZBTFVFIChhcmd1bWVudCkpOworCisgIC8qIENoZWNrIGl0IGFnYWluc3QgdGhlIGxpc3Qgb2Yga25vd24gYXJndW1lbnRzLiAgKi8KKyAgZm9yIChwdHIgPSBpc3JfYXR0cmlidXRlX2FyZ3M7IHB0ci0+YXJnICE9IE5VTEw7IHB0cisrKQorICAgIGlmIChzdHJlcSAoYXJnLCBwdHItPmFyZykpCisgICAgICByZXR1cm4gcHRyLT5yZXR1cm5fdmFsdWU7CisKKyAgLyogQW4gdW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlLiAgKi8KKyAgcmV0dXJuIEFWUjMyX0ZUX1VOS05PV047Cit9CisKKworCisvKgorVGhlc2UgaG9va3Mgc3BlY2lmeSBhc3NlbWJseSBkaXJlY3RpdmVzIGZvciBjcmVhdGluZyBjZXJ0YWluIGtpbmRzCitvZiBpbnRlZ2VyIG9iamVjdC4gIFRoZSBUQVJHRVRfQVNNX0JZVEVfT1AgZGlyZWN0aXZlIGNyZWF0ZXMgYQorYnl0ZS1zaXplZCBvYmplY3QsIHRoZSBUQVJHRVRfQVNNX0FMSUdORURfSElfT1Agb25lIGNyZWF0ZXMgYW4KK2FsaWduZWQgdHdvLWJ5dGUgb2JqZWN0LCBhbmQgc28gb24uICBBbnkgb2YgdGhlIGhvb2tzIG1heSBiZQorTlVMTCwgaW5kaWNhdGluZyB0aGF0IG5vIHN1aXRhYmxlIGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUuCisKK1RoZSBjb21waWxlciB3aWxsIHByaW50IHRoZXNlIHN0cmluZ3MgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUsCitmb2xsb3dlZCBpbW1lZGlhdGVseSBieSB0aGUgb2JqZWN0J3MgaW5pdGlhbCB2YWx1ZS4gIEluIG1vc3QgY2FzZXMsCit0aGUgc3RyaW5nIHNob3VsZCBjb250YWluIGEgdGFiLCBhIHBzZXVkby1vcCwgYW5kIHRoZW4gYW5vdGhlciB0YWIuCisqLworI3VuZGVmICBUQVJHRVRfQVNNX0JZVEVfT1AKKyNkZWZpbmUgVEFSR0VUX0FTTV9CWVRFX09QICJcdC5ieXRlXHQiCisjdW5kZWYgIFRBUkdFVF9BU01fQUxJR05FRF9ISV9PUAorI2RlZmluZSBUQVJHRVRfQVNNX0FMSUdORURfSElfT1AgIlx0LmFsaWduIDFcblx0LnNob3J0XHQiCisjdW5kZWYgIFRBUkdFVF9BU01fQUxJR05FRF9TSV9PUAorI2RlZmluZSBUQVJHRVRfQVNNX0FMSUdORURfU0lfT1AgIlx0LmFsaWduIDJcblx0LmludFx0IgorI3VuZGVmICBUQVJHRVRfQVNNX0FMSUdORURfRElfT1AKKyNkZWZpbmUgVEFSR0VUX0FTTV9BTElHTkVEX0RJX09QIE5VTEwKKyN1bmRlZiAgVEFSR0VUX0FTTV9BTElHTkVEX1RJX09QCisjZGVmaW5lIFRBUkdFVF9BU01fQUxJR05FRF9USV9PUCBOVUxMCisjdW5kZWYgIFRBUkdFVF9BU01fVU5BTElHTkVEX0hJX09QCisjZGVmaW5lIFRBUkdFVF9BU01fVU5BTElHTkVEX0hJX09QICJcdC5zaG9ydFx0IgorI3VuZGVmICBUQVJHRVRfQVNNX1VOQUxJR05FRF9TSV9PUAorI2RlZmluZSBUQVJHRVRfQVNNX1VOQUxJR05FRF9TSV9PUCAiXHQuaW50XHQiCisjdW5kZWYgIFRBUkdFVF9BU01fVU5BTElHTkVEX0RJX09QCisjZGVmaW5lIFRBUkdFVF9BU01fVU5BTElHTkVEX0RJX09QIE5VTEwKKyN1bmRlZiAgVEFSR0VUX0FTTV9VTkFMSUdORURfVElfT1AKKyNkZWZpbmUgVEFSR0VUX0FTTV9VTkFMSUdORURfVElfT1AgTlVMTAorCisjdW5kZWYgVEFSR0VUX0FTTV9PVVRQVVRfTUlfVEhVTksKKyNkZWZpbmUgVEFSR0VUX0FTTV9PVVRQVVRfTUlfVEhVTksgYXZyMzJfb3V0cHV0X21pX3RodW5rCisKKyN1bmRlZiBUQVJHRVRfQVNNX0NBTl9PVVRQVVRfTUlfVEhVTksKKyNkZWZpbmUgVEFSR0VUX0FTTV9DQU5fT1VUUFVUX01JX1RIVU5LIGhvb2tfYm9vbF90cmVlX2h3aV9od2lfdHJlZV90cnVlCisKK3N0YXRpYyB2b2lkCithdnIzMl9vdXRwdXRfbWlfdGh1bmsgKEZJTEUgKiBmaWxlLAorICAgIHRyZWUgdGh1bmsgQVRUUklCVVRFX1VOVVNFRCwKKyAgICBIT1NUX1dJREVfSU5UIGRlbHRhLAorICAgIEhPU1RfV0lERV9JTlQgdmNhbGxfb2Zmc2V0LCB0cmVlIGZ1bmN0aW9uKQorICB7CisgICAgaW50IG1pX2RlbHRhID0gZGVsdGE7CisgICAgaW50IHRoaXNfcmVnbm8gPQorICAgICAgKGFnZ3JlZ2F0ZV92YWx1ZV9wIChUUkVFX1RZUEUgKFRSRUVfVFlQRSAoZnVuY3Rpb24pKSwgZnVuY3Rpb24pID8KKyAgICAgICBJTlRFUk5BTF9SRUdOVU0gKDExKSA6IElOVEVSTkFMX1JFR05VTSAoMTIpKTsKKworCisgICAgaWYgKCFhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChtaV9kZWx0YSwgJ0knLCAiSXMyMSIpCisgICAgICAgIHx8IHZjYWxsX29mZnNldCkKKyAgICAgIHsKKyAgICAgICAgZnB1dHMgKCJcdHB1c2htXHRsclxuIiwgZmlsZSk7CisgICAgICB9CisKKworICAgIGlmIChtaV9kZWx0YSAhPSAwKQorICAgICAgeworICAgICAgICBpZiAoYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAobWlfZGVsdGEsICdJJywgIklzMjEiKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmIChmaWxlLCAiXHRzdWJcdCVzLCAlZFxuIiwgcmVnX25hbWVzW3RoaXNfcmVnbm9dLCAtbWlfZGVsdGEpOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEltbWVkaWF0ZSBpcyBsYXJnZXIgdGhhbiBrMjEgd2UgbXVzdCBtYWtlIHVzIGEgdGVtcCByZWdpc3RlciBieQorCSAgICAgcHVzaGluZyBhIHJlZ2lzdGVyIHRvIHRoZSBzdGFjay4gKi8KKyAgICAgICAgICAgIGZwcmludGYgKGZpbGUsICJcdG1vdlx0bHIsIGxvKCVkKVxuIiwgbWlfZGVsdGEpOworICAgICAgICAgICAgZnByaW50ZiAoZmlsZSwgIlx0b3JoXHRsciwgaGkoJWQpXG4iLCBtaV9kZWx0YSk7CisgICAgICAgICAgICBmcHJpbnRmIChmaWxlLCAiXHRhZGRcdCVzLCBsclxuIiwgcmVnX25hbWVzW3RoaXNfcmVnbm9dKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKworICAgIGlmICh2Y2FsbF9vZmZzZXQgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgZnByaW50ZiAoZmlsZSwgIlx0bGQud1x0bHIsICVzWzBdXG4iLCByZWdfbmFtZXNbdGhpc19yZWdub10pOworICAgICAgICBmcHJpbnRmIChmaWxlLCAiXHRsZC53XHRsciwgbHJbJWldXG4iLCAoaW50KSB2Y2FsbF9vZmZzZXQpOworICAgICAgICBmcHJpbnRmIChmaWxlLCAiXHRhZGRcdCVzLCBsclxuIiwgcmVnX25hbWVzW3RoaXNfcmVnbm9dKTsKKyAgICAgIH0KKworCisgICAgaWYgKCFhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChtaV9kZWx0YSwgJ0knLCAiSXMyMSIpCisgICAgICAgIHx8IHZjYWxsX29mZnNldCkKKyAgICAgIHsKKyAgICAgICAgZnB1dHMgKCJcdHBvcG1cdGxyXG4iLCBmaWxlKTsKKyAgICAgIH0KKworICAgIC8qIEp1bXAgdG8gdGhlIGZ1bmN0aW9uLiBXZSBhc3N1bWUgdGhhdCB3ZSBjYW4gdXNlIGFuIHJqbXAgc2luY2UgdGhlCisgICAgICAgZnVuY3Rpb24gdG8ganVtcCB0byBpcyBsb2NhbCBhbmQgcHJvYmFibHkgbm90IHRvbyBmYXIgYXdheSBmcm9tCisgICAgICAgdGhlIHRodW5rLiBJZiB0aGlzIGFzc3VtcHRpb24gcHJvdmVzIHRvIGJlIHdyb25nIHdlIGNvdWxkIGltcGxlbWVudAorICAgICAgIHRoaXMganVtcCBieSBjYWxjdWxhdGluZyB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGp1bXAgc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICAgICAgIGFuZCBwdXQgdGhpcyBpbiB0aGUgY29uc3RhbnQgcG9vbCBhbmQgdGhlbiBwZXJmb3JtIGFuIGFkZCB0byBwYy4KKyAgICAgICBUaGlzIHdvdWxkIGFsc28gYmUgbGVnaXRpbWF0ZSBQSUMgY29kZS4gQnV0IGZvciBub3cgd2UgaG9wZSB0aGF0IGFuIHJqbXAKKyAgICAgICB3aWxsIGJlIHN1ZmZpY2llbnQuLi4KKyAgICAqLworICAgIGZwdXRzICgiXHRyam1wXHQiLCBmaWxlKTsKKyAgICBhc3NlbWJsZV9uYW1lIChmaWxlLCBYU1RSIChYRVhQIChERUNMX1JUTCAoZnVuY3Rpb24pLCAwKSwgMCkpOworICAgIGZwdXRjICgnXG4nLCBmaWxlKTsKKyAgfQorCisKKy8qIEltcGxlbWVudHMgdGFyZ2V0IGhvb2sgdmVjdG9yX21vZGVfc3VwcG9ydGVkLiAgKi8KK2Jvb2wKK2F2cjMyX3ZlY3Rvcl9tb2RlX3N1cHBvcnRlZCAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSkKK3sKKyAgaWYgKChtb2RlID09IFYySEltb2RlKSB8fCAobW9kZSA9PSBWNFFJbW9kZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKyN1bmRlZiBUQVJHRVRfSU5JVF9MSUJGVU5DUworI2RlZmluZSBUQVJHRVRfSU5JVF9MSUJGVU5DUyBhdnIzMl9pbml0X2xpYmZ1bmNzCisKKyN1bmRlZiAgVEFSR0VUX0lOSVRfQlVJTFRJTlMKKyNkZWZpbmUgVEFSR0VUX0lOSVRfQlVJTFRJTlMgYXZyMzJfaW5pdF9idWlsdGlucworCisjdW5kZWYgIFRBUkdFVF9FWFBBTkRfQlVJTFRJTgorI2RlZmluZSBUQVJHRVRfRVhQQU5EX0JVSUxUSU4gYXZyMzJfZXhwYW5kX2J1aWx0aW4KKwordHJlZSBpbnRfZnR5cGVfaW50LCBpbnRfZnR5cGVfdm9pZCwgc2hvcnRfZnR5cGVfc2hvcnQsIHZvaWRfZnR5cGVfaW50X2ludCwKKyAgdm9pZF9mdHlwZV9wdHJfaW50OwordHJlZSB2b2lkX2Z0eXBlX2ludCwgdm9pZF9mdHlwZV92b2lkLCBpbnRfZnR5cGVfcHRyX2ludDsKK3RyZWUgc2hvcnRfZnR5cGVfc2hvcnQsIGludF9mdHlwZV9pbnRfc2hvcnQsIGludF9mdHlwZV9zaG9ydF9zaG9ydCwKKyAgc2hvcnRfZnR5cGVfc2hvcnRfc2hvcnQ7Cit0cmVlIGludF9mdHlwZV9pbnRfaW50LCBsb25nbG9uZ19mdHlwZV9pbnRfc2hvcnQsIGxvbmdsb25nX2Z0eXBlX3Nob3J0X3Nob3J0OwordHJlZSB2b2lkX2Z0eXBlX2ludF9pbnRfaW50X2ludF9pbnQsIHZvaWRfZnR5cGVfaW50X2ludF9pbnQ7Cit0cmVlIGxvbmdsb25nX2Z0eXBlX2ludF9pbnQsIHZvaWRfZnR5cGVfaW50X2ludF9sb25nbG9uZzsKK3RyZWUgaW50X2Z0eXBlX2ludF9pbnRfaW50LCBsb25nbG9uZ19mdHlwZV9sb25nbG9uZ19pbnRfc2hvcnQ7Cit0cmVlIGxvbmdsb25nX2Z0eXBlX2xvbmdsb25nX3Nob3J0X3Nob3J0LCBpbnRfZnR5cGVfaW50X3Nob3J0X3Nob3J0OworCisjZGVmaW5lIGRlZl9idWlsdGluKE5BTUUsIFRZUEUsIENPREUpCQkJCQlcCisgIGxhbmdfaG9va3MuYnVpbHRpbl9mdW5jdGlvbiAoKE5BTUUpLCAoVFlQRSksIChDT0RFKSwJCQlcCisJCSAgCSAgICAgICBCVUlMVF9JTl9NRCwgTlVMTCwgTlVMTF9UUkVFKQorCisjZGVmaW5lIGRlZl9tYnVpbHRpbihNQVNLLCBOQU1FLCBUWVBFLCBDT0RFKQkJCQlcCisgIGRvCQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBpZiAoKE1BU0spKQkJCQkJCQlcCisJbGFuZ19ob29rcy5idWlsdGluX2Z1bmN0aW9uICgoTkFNRSksIChUWVBFKSwgKENPREUpLAkJXAorCQkJCSAgICAgQlVJTFRfSU5fTUQsIE5VTEwsIE5VTExfVFJFRSk7CVwKKyAgICB9CQkJCQkJCQkJXAorICB3aGlsZSAoMCkKKworc3RydWN0IGJ1aWx0aW5fZGVzY3JpcHRpb24KK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG1hc2s7CisgIGNvbnN0IGVudW0gaW5zbl9jb2RlIGljb2RlOworICBjb25zdCBjaGFyICpjb25zdCBuYW1lOworICBjb25zdCBpbnQgY29kZTsKKyAgY29uc3QgZW51bSBydHhfY29kZSBjb21wYXJpc29uOworICBjb25zdCB1bnNpZ25lZCBpbnQgZmxhZzsKKyAgY29uc3QgdHJlZSAqZnR5cGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0aW5fZGVzY3JpcHRpb24gYmRlc2NfMmFyZ1tdID0geworI2RlZmluZSBEU1BfQlVJTFRJTihjb2RlLCBidWlsdGluLCBmdHlwZSkgXAorICB7IDEsIENPREVfRk9SXyMjY29kZSwgIl9fYnVpbHRpbl8iICNjb2RlICwgXAorICAgIEFWUjMyX0JVSUxUSU5fIyNidWlsdGluLCAwLCAwLCBmdHlwZSB9CisKKyAgRFNQX0JVSUxUSU4gKG11bHNhdGhoX2gsIE1VTFNBVEhIX0gsICZzaG9ydF9mdHlwZV9zaG9ydF9zaG9ydCksCisgIERTUF9CVUlMVElOIChtdWxzYXRoaF93LCBNVUxTQVRISF9XLCAmaW50X2Z0eXBlX3Nob3J0X3Nob3J0KSwKKyAgRFNQX0JVSUxUSU4gKG11bHNhdHJuZGhoX2gsIE1VTFNBVFJOREhIX0gsICZzaG9ydF9mdHlwZV9zaG9ydF9zaG9ydCksCisgIERTUF9CVUlMVElOIChtdWxzYXRybmR3aF93LCBNVUxTQVRSTkRXSF9XLCAmaW50X2Z0eXBlX2ludF9zaG9ydCksCisgIERTUF9CVUlMVElOIChtdWxzYXR3aF93LCBNVUxTQVRXSF9XLCAmaW50X2Z0eXBlX2ludF9zaG9ydCksCisgIERTUF9CVUlMVElOIChzYXRhZGRfaCwgU0FUQUREX0gsICZzaG9ydF9mdHlwZV9zaG9ydF9zaG9ydCksCisgIERTUF9CVUlMVElOIChzYXRzdWJfaCwgU0FUU1VCX0gsICZzaG9ydF9mdHlwZV9zaG9ydF9zaG9ydCksCisgIERTUF9CVUlMVElOIChzYXRhZGRfdywgU0FUQUREX1csICZpbnRfZnR5cGVfaW50X2ludCksCisgIERTUF9CVUlMVElOIChzYXRzdWJfdywgU0FUU1VCX1csICZpbnRfZnR5cGVfaW50X2ludCksCisgIERTUF9CVUlMVElOIChtdWx3aF9kLCBNVUxXSF9ELCAmbG9uZ2xvbmdfZnR5cGVfaW50X3Nob3J0KSwKKyAgRFNQX0JVSUxUSU4gKG11bG53aF9kLCBNVUxOV0hfRCwgJmxvbmdsb25nX2Z0eXBlX2ludF9zaG9ydCkKK307CisKKwordm9pZAorYXZyMzJfaW5pdF9idWlsdGlucyAodm9pZCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIGNvbnN0IHN0cnVjdCBidWlsdGluX2Rlc2NyaXB0aW9uICpkOworICB0cmVlIGVuZGxpbmsgPSB2b2lkX2xpc3Rfbm9kZTsKKyAgdHJlZSBpbnRfZW5kbGluayA9IHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwgZW5kbGluayk7CisgIHRyZWUgbG9uZ2xvbmdfZW5kbGluayA9CisgICAgdHJlZV9jb25zIChOVUxMX1RSRUUsIGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSwgZW5kbGluayk7CisgIHRyZWUgc2hvcnRfZW5kbGluayA9CisgICAgdHJlZV9jb25zIChOVUxMX1RSRUUsIHNob3J0X2ludGVnZXJfdHlwZV9ub2RlLCBlbmRsaW5rKTsKKyAgdHJlZSB2b2lkX2VuZGxpbmsgPSB0cmVlX2NvbnMgKE5VTExfVFJFRSwgdm9pZF90eXBlX25vZGUsIGVuZGxpbmspOworCisgIC8qIGludCBmdW5jIChpbnQpICovCisgIGludF9mdHlwZV9pbnQgPSBidWlsZF9mdW5jdGlvbl90eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSwgaW50X2VuZGxpbmspOworCisgIC8qIHNob3J0IGZ1bmMgKHNob3J0KSAqLworICBzaG9ydF9mdHlwZV9zaG9ydAorICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoc2hvcnRfaW50ZWdlcl90eXBlX25vZGUsIHNob3J0X2VuZGxpbmspOworCisgIC8qIHNob3J0IGZ1bmMgKHNob3J0LCBzaG9ydCkgKi8KKyAgc2hvcnRfZnR5cGVfc2hvcnRfc2hvcnQKKyAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKHNob3J0X2ludGVnZXJfdHlwZV9ub2RlLAorCQkJICAgdHJlZV9jb25zIChOVUxMX1RSRUUsIHNob3J0X2ludGVnZXJfdHlwZV9ub2RlLAorCQkJCSAgICAgIHNob3J0X2VuZGxpbmspKTsKKworICAvKiBsb25nIGxvbmcgZnVuYyAobG9uZyBsb25nLCBzaG9ydCwgc2hvcnQpICovCisgIGxvbmdsb25nX2Z0eXBlX2xvbmdsb25nX3Nob3J0X3Nob3J0CisgICAgPSBidWlsZF9mdW5jdGlvbl90eXBlIChsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUsCisJCQkgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgbG9uZ19sb25nX2ludGVnZXJfdHlwZV9ub2RlLAorCQkJCSAgICAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLAorCQkJCQkJIHNob3J0X2ludGVnZXJfdHlwZV9ub2RlLAorCQkJCQkJIHNob3J0X2VuZGxpbmspKSk7CisKKyAgLyogbG9uZyBsb25nIGZ1bmMgKHNob3J0LCBzaG9ydCkgKi8KKyAgbG9uZ2xvbmdfZnR5cGVfc2hvcnRfc2hvcnQKKyAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICBzaG9ydF9lbmRsaW5rKSk7CisKKyAgLyogaW50IGZ1bmMgKGludCwgaW50KSAqLworICBpbnRfZnR5cGVfaW50X2ludAorICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsCisJCQkgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgaW50ZWdlcl90eXBlX25vZGUsCisJCQkJICAgICAgaW50X2VuZGxpbmspKTsKKworICAvKiBsb25nIGxvbmcgZnVuYyAoaW50LCBpbnQpICovCisgIGxvbmdsb25nX2Z0eXBlX2ludF9pbnQKKyAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICBpbnRfZW5kbGluaykpOworCisgIC8qIGxvbmcgbG9uZyBpbnQgZnVuYyAobG9uZyBsb25nLCBpbnQsIHNob3J0KSAqLworICBsb25nbG9uZ19mdHlwZV9sb25nbG9uZ19pbnRfc2hvcnQKKyAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUsCisJCQkJICAgICAgdHJlZV9jb25zIChOVUxMX1RSRUUsIGludGVnZXJfdHlwZV9ub2RlLAorCQkJCQkJIHNob3J0X2VuZGxpbmspKSk7CisKKyAgLyogbG9uZyBsb25nIGludCBmdW5jIChpbnQsIHNob3J0KSAqLworICBsb25nbG9uZ19mdHlwZV9pbnRfc2hvcnQKKyAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICBzaG9ydF9lbmRsaW5rKSk7CisKKyAgLyogaW50IGZ1bmMgKGludCwgc2hvcnQsIHNob3J0KSAqLworICBpbnRfZnR5cGVfaW50X3Nob3J0X3Nob3J0CisgICAgPSBidWlsZF9mdW5jdGlvbl90eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwKKwkJCQkJCSBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkJCSBzaG9ydF9lbmRsaW5rKSkpOworCisgIC8qIGludCBmdW5jIChzaG9ydCwgc2hvcnQpICovCisgIGludF9mdHlwZV9zaG9ydF9zaG9ydAorICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsCisJCQkgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgc2hvcnRfaW50ZWdlcl90eXBlX25vZGUsCisJCQkJICAgICAgc2hvcnRfZW5kbGluaykpOworCisgIC8qIGludCBmdW5jIChpbnQsIHNob3J0KSAqLworICBpbnRfZnR5cGVfaW50X3Nob3J0CisgICAgPSBidWlsZF9mdW5jdGlvbl90eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICBzaG9ydF9lbmRsaW5rKSk7CisKKyAgLyogdm9pZCBmdW5jIChpbnQsIGludCkgKi8KKyAgdm9pZF9mdHlwZV9pbnRfaW50CisgICAgPSBidWlsZF9mdW5jdGlvbl90eXBlICh2b2lkX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICBpbnRfZW5kbGluaykpOworCisgIC8qIHZvaWQgZnVuYyAoaW50LCBpbnQsIGludCkgKi8KKyAgdm9pZF9mdHlwZV9pbnRfaW50X2ludAorICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAodm9pZF90eXBlX25vZGUsCisJCQkgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgaW50ZWdlcl90eXBlX25vZGUsCisJCQkJICAgICAgdHJlZV9jb25zIChOVUxMX1RSRUUsIGludGVnZXJfdHlwZV9ub2RlLAorCQkJCQkJIGludF9lbmRsaW5rKSkpOworCisgIC8qIHZvaWQgZnVuYyAoaW50LCBpbnQsIGxvbmcgbG9uZykgKi8KKyAgdm9pZF9mdHlwZV9pbnRfaW50X2xvbmdsb25nCisgICAgPSBidWlsZF9mdW5jdGlvbl90eXBlICh2b2lkX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgaW50ZWdlcl90eXBlX25vZGUsCisJCQkJCQkgbG9uZ2xvbmdfZW5kbGluaykpKTsKKworICAvKiB2b2lkIGZ1bmMgKGludCwgaW50LCBpbnQsIGludCwgaW50KSAqLworICB2b2lkX2Z0eXBlX2ludF9pbnRfaW50X2ludF9pbnQKKyAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKHZvaWRfdHlwZV9ub2RlLAorCQkJICAgdHJlZV9jb25zIChOVUxMX1RSRUUsIGludGVnZXJfdHlwZV9ub2RlLAorCQkJCSAgICAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkJCSB0cmVlX2NvbnMgKE5VTExfVFJFRSwKKwkJCQkJCQkgICAgaW50ZWdlcl90eXBlX25vZGUsCisJCQkJCQkJICAgIHRyZWVfY29ucworCQkJCQkJCSAgICAoTlVMTF9UUkVFLAorCQkJCQkJCSAgICAgaW50ZWdlcl90eXBlX25vZGUsCisJCQkJCQkJICAgICBpbnRfZW5kbGluaykpKSkpOworCisgIC8qIHZvaWQgZnVuYyAodm9pZCAqLCBpbnQpICovCisgIHZvaWRfZnR5cGVfcHRyX2ludAorICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAodm9pZF90eXBlX25vZGUsCisJCQkgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgcHRyX3R5cGVfbm9kZSwgaW50X2VuZGxpbmspKTsKKworICAvKiB2b2lkIGZ1bmMgKGludCkgKi8KKyAgdm9pZF9mdHlwZV9pbnQgPSBidWlsZF9mdW5jdGlvbl90eXBlICh2b2lkX3R5cGVfbm9kZSwgaW50X2VuZGxpbmspOworCisgIC8qIHZvaWQgZnVuYyAodm9pZCkgKi8KKyAgdm9pZF9mdHlwZV92b2lkID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAodm9pZF90eXBlX25vZGUsIHZvaWRfZW5kbGluayk7CisKKyAgLyogaW50IGZ1bmMgKHZvaWQpICovCisgIGludF9mdHlwZV92b2lkID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsIHZvaWRfZW5kbGluayk7CisKKyAgLyogaW50IGZ1bmMgKHZvaWQgKiwgaW50KSAqLworICBpbnRfZnR5cGVfcHRyX2ludAorICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsCisJCQkgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgcHRyX3R5cGVfbm9kZSwgaW50X2VuZGxpbmspKTsKKworICAvKiBpbnQgZnVuYyAoaW50LCBpbnQsIGludCkgKi8KKyAgaW50X2Z0eXBlX2ludF9pbnRfaW50CisgICAgPSBidWlsZF9mdW5jdGlvbl90eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCSAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLCBpbnRlZ2VyX3R5cGVfbm9kZSwKKwkJCQkgICAgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwgaW50ZWdlcl90eXBlX25vZGUsCisJCQkJCQkgaW50X2VuZGxpbmspKSk7CisKKyAgLyogSW5pdGlhbGl6ZSBhdnIzMiBidWlsdGlucy4gICovCisgIGRlZl9idWlsdGluICgiX19idWlsdGluX21mc3IiLCBpbnRfZnR5cGVfaW50LCBBVlIzMl9CVUlMVElOX01GU1IpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9tdHNyIiwgdm9pZF9mdHlwZV9pbnRfaW50LCBBVlIzMl9CVUlMVElOX01UU1IpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9tZmRyIiwgaW50X2Z0eXBlX2ludCwgQVZSMzJfQlVJTFRJTl9NRkRSKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fbXRkciIsIHZvaWRfZnR5cGVfaW50X2ludCwgQVZSMzJfQlVJTFRJTl9NVERSKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fY2FjaGUiLCB2b2lkX2Z0eXBlX3B0cl9pbnQsIEFWUjMyX0JVSUxUSU5fQ0FDSEUpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9zeW5jIiwgdm9pZF9mdHlwZV9pbnQsIEFWUjMyX0JVSUxUSU5fU1lOQyk7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX3NzcmYiLCB2b2lkX2Z0eXBlX2ludCwgQVZSMzJfQlVJTFRJTl9TU1JGKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fY3NyZiIsIHZvaWRfZnR5cGVfaW50LCBBVlIzMl9CVUlMVElOX0NTUkYpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl90bGJyIiwgdm9pZF9mdHlwZV92b2lkLCBBVlIzMl9CVUlMVElOX1RMQlIpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl90bGJzIiwgdm9pZF9mdHlwZV92b2lkLCBBVlIzMl9CVUlMVElOX1RMQlMpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl90bGJ3Iiwgdm9pZF9mdHlwZV92b2lkLCBBVlIzMl9CVUlMVElOX1RMQlcpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9icmVha3BvaW50Iiwgdm9pZF9mdHlwZV92b2lkLAorCSAgICAgICBBVlIzMl9CVUlMVElOX0JSRUFLUE9JTlQpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl94Y2hnIiwgaW50X2Z0eXBlX3B0cl9pbnQsIEFWUjMyX0JVSUxUSU5fWENIRyk7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX2xkeGkiLCBpbnRfZnR5cGVfcHRyX2ludCwgQVZSMzJfQlVJTFRJTl9MRFhJKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fYnN3YXBfMTYiLCBzaG9ydF9mdHlwZV9zaG9ydCwKKwkgICAgICAgQVZSMzJfQlVJTFRJTl9CU1dBUDE2KTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fYnN3YXBfMzIiLCBpbnRfZnR5cGVfaW50LCBBVlIzMl9CVUlMVElOX0JTV0FQMzIpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9jb3AiLCB2b2lkX2Z0eXBlX2ludF9pbnRfaW50X2ludF9pbnQsCisJICAgICAgIEFWUjMyX0JVSUxUSU5fQ09QKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fbXZjcl93IiwgaW50X2Z0eXBlX2ludF9pbnQsIEFWUjMyX0JVSUxUSU5fTVZDUl9XKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fbXZyY193Iiwgdm9pZF9mdHlwZV9pbnRfaW50X2ludCwKKwkgICAgICAgQVZSMzJfQlVJTFRJTl9NVlJDX1cpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9tdmNyX2QiLCBsb25nbG9uZ19mdHlwZV9pbnRfaW50LAorCSAgICAgICBBVlIzMl9CVUlMVElOX01WQ1JfRCk7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX212cmNfZCIsIHZvaWRfZnR5cGVfaW50X2ludF9sb25nbG9uZywKKwkgICAgICAgQVZSMzJfQlVJTFRJTl9NVlJDX0QpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9zYXRzIiwgaW50X2Z0eXBlX2ludF9pbnRfaW50LCBBVlIzMl9CVUlMVElOX1NBVFMpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9zYXR1IiwgaW50X2Z0eXBlX2ludF9pbnRfaW50LCBBVlIzMl9CVUlMVElOX1NBVFUpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9zYXRybmRzIiwgaW50X2Z0eXBlX2ludF9pbnRfaW50LAorCSAgICAgICBBVlIzMl9CVUlMVElOX1NBVFJORFMpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9zYXRybmR1IiwgaW50X2Z0eXBlX2ludF9pbnRfaW50LAorCSAgICAgICBBVlIzMl9CVUlMVElOX1NBVFJORFUpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9tdXNmciIsIHZvaWRfZnR5cGVfaW50LCBBVlIzMl9CVUlMVElOX01VU0ZSKTsKKyAgZGVmX2J1aWx0aW4gKCJfX2J1aWx0aW5fbXVzdHIiLCBpbnRfZnR5cGVfdm9pZCwgQVZSMzJfQlVJTFRJTl9NVVNUUik7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX21hY3NhdGhoX3ciLCBpbnRfZnR5cGVfaW50X3Nob3J0X3Nob3J0LAorCSAgICAgICBBVlIzMl9CVUlMVElOX01BQ1NBVEhIX1cpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9tYWN3aF9kIiwgbG9uZ2xvbmdfZnR5cGVfbG9uZ2xvbmdfaW50X3Nob3J0LAorCSAgICAgICBBVlIzMl9CVUlMVElOX01BQ1dIX0QpOworICBkZWZfYnVpbHRpbiAoIl9fYnVpbHRpbl9tYWNoaF9kIiwgbG9uZ2xvbmdfZnR5cGVfbG9uZ2xvbmdfc2hvcnRfc2hvcnQsCisJICAgICAgIEFWUjMyX0JVSUxUSU5fTUFDSEhfRCk7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX21lbXMiLCB2b2lkX2Z0eXBlX3B0cl9pbnQsIEFWUjMyX0JVSUxUSU5fTUVNUyk7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX21lbXQiLCB2b2lkX2Z0eXBlX3B0cl9pbnQsIEFWUjMyX0JVSUxUSU5fTUVNVCk7CisgIGRlZl9idWlsdGluICgiX19idWlsdGluX21lbWMiLCB2b2lkX2Z0eXBlX3B0cl9pbnQsIEFWUjMyX0JVSUxUSU5fTUVNQyk7CisKKyAgLyogQWRkIGFsbCBidWlsdGlucyB0aGF0IGFyZSBtb3JlIG9yIGxlc3Mgc2ltcGxlIG9wZXJhdGlvbnMgb24gdHdvCisgICAgIG9wZXJhbmRzLiAgKi8KKyAgZm9yIChpID0gMCwgZCA9IGJkZXNjXzJhcmc7IGkgPCBBUlJBWV9TSVpFIChiZGVzY18yYXJnKTsgaSsrLCBkKyspCisgICAgeworICAgICAgLyogVXNlIG9uZSBvZiB0aGUgb3BlcmFuZHM7IHRoZSB0YXJnZXQgY2FuIGhhdmUgYSBkaWZmZXJlbnQgbW9kZSBmb3IKKyAgICAgICAgIG1hc2stZ2VuZXJhdGluZyBjb21wYXJlcy4gICovCisKKyAgICAgIGlmIChkLT5uYW1lID09IDApCisJY29udGludWU7CisKKyAgICAgIGRlZl9tYnVpbHRpbiAoZC0+bWFzaywgZC0+bmFtZSwgKihkLT5mdHlwZSksIGQtPmNvZGUpOworICAgIH0KK30KKworCisvKiBTdWJyb3V0aW5lIG9mIGF2cjMyX2V4cGFuZF9idWlsdGluIHRvIHRha2UgY2FyZSBvZiBiaW5vcCBpbnNucy4gICovCisKK3N0YXRpYyBydHgKK2F2cjMyX2V4cGFuZF9iaW5vcF9idWlsdGluIChlbnVtIGluc25fY29kZSBpY29kZSwgdHJlZSBhcmdsaXN0LCBydHggdGFyZ2V0KQoreworICBydHggcGF0OworICB0cmVlIGFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKyAgdHJlZSBhcmcxID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoYXJnbGlzdCkpOworICBydHggb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisgIHJ0eCBvcDEgPSBleHBhbmRfZXhwciAoYXJnMSwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgZW51bSBtYWNoaW5lX21vZGUgdG1vZGUgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKyAgZW51bSBtYWNoaW5lX21vZGUgbW9kZTAgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ubW9kZTsKKyAgZW51bSBtYWNoaW5lX21vZGUgbW9kZTEgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMl0ubW9kZTsKKworICBpZiAoIXRhcmdldAorICAgICAgfHwgR0VUX01PREUgKHRhcmdldCkgIT0gdG1vZGUKKyAgICAgIHx8ICEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpICh0YXJnZXQsIHRtb2RlKSkKKyAgICB0YXJnZXQgPSBnZW5fcmVnX3J0eCAodG1vZGUpOworCisgIC8qIEluIGNhc2UgdGhlIGluc24gd2FudHMgaW5wdXQgb3BlcmFuZHMgaW4gbW9kZXMgZGlmZmVyZW50IGZyb20gdGhlCisgICAgIHJlc3VsdCwgYWJvcnQuICAqLworICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLnByZWRpY2F0ZSkgKG9wMCwgbW9kZTApKQorICAgIHsKKyAgICAgIC8qIElmIG9wMCBpcyBhbHJlYWR5IGEgcmVnIHdlIG11c3QgY2FzdCBpdCB0byB0aGUgY29ycmVjdCBtb2RlLiAqLworICAgICAgaWYgKFJFR19QIChvcDApKQorCW9wMCA9IGNvbnZlcnRfdG9fbW9kZSAobW9kZTAsIG9wMCwgMSk7CisgICAgICBlbHNlCisJb3AwID0gY29weV90b19tb2RlX3JlZyAobW9kZTAsIG9wMCk7CisgICAgfQorICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLnByZWRpY2F0ZSkgKG9wMSwgbW9kZTEpKQorICAgIHsKKyAgICAgIC8qIElmIG9wMSBpcyBhbHJlYWR5IGEgcmVnIHdlIG11c3QgY2FzdCBpdCB0byB0aGUgY29ycmVjdCBtb2RlLiAqLworICAgICAgaWYgKFJFR19QIChvcDEpKQorCW9wMSA9IGNvbnZlcnRfdG9fbW9kZSAobW9kZTEsIG9wMSwgMSk7CisgICAgICBlbHNlCisJb3AxID0gY29weV90b19tb2RlX3JlZyAobW9kZTEsIG9wMSk7CisgICAgfQorICBwYXQgPSBHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgb3AwLCBvcDEpOworICBpZiAoIXBhdCkKKyAgICByZXR1cm4gMDsKKyAgZW1pdF9pbnNuIChwYXQpOworICByZXR1cm4gdGFyZ2V0OworfQorCisvKiBFeHBhbmQgYW4gZXhwcmVzc2lvbiBFWFAgdGhhdCBjYWxscyBhIGJ1aWx0LWluIGZ1bmN0aW9uLAorICAgd2l0aCByZXN1bHQgZ29pbmcgdG8gVEFSR0VUIGlmIHRoYXQncyBjb252ZW5pZW50CisgICAoYW5kIGluIG1vZGUgTU9ERSBpZiB0aGF0J3MgY29udmVuaWVudCkuCisgICBTVUJUQVJHRVQgbWF5IGJlIHVzZWQgYXMgdGhlIHRhcmdldCBmb3IgY29tcHV0aW5nIG9uZSBvZiBFWFAncyBvcGVyYW5kcy4KKyAgIElHTk9SRSBpcyBub256ZXJvIGlmIHRoZSB2YWx1ZSBpcyB0byBiZSBpZ25vcmVkLiAgKi8KKworcnR4CithdnIzMl9leHBhbmRfYnVpbHRpbiAodHJlZSBleHAsCisJCSAgICAgIHJ0eCB0YXJnZXQsCisJCSAgICAgIHJ0eCBzdWJ0YXJnZXQgQVRUUklCVVRFX1VOVVNFRCwKKwkJICAgICAgZW51bSBtYWNoaW5lX21vZGUgbW9kZSBBVFRSSUJVVEVfVU5VU0VELAorCQkgICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIGNvbnN0IHN0cnVjdCBidWlsdGluX2Rlc2NyaXB0aW9uICpkOworICB1bnNpZ25lZCBpbnQgaTsKKyAgZW51bSBpbnNuX2NvZGUgaWNvZGUgPSAwOworICB0cmVlIGZuZGVjbCA9IFRSRUVfT1BFUkFORCAoVFJFRV9PUEVSQU5EIChleHAsIDApLCAwKTsKKyAgdHJlZSBhcmdsaXN0ID0gVFJFRV9PUEVSQU5EIChleHAsIDEpOworICB0cmVlIGFyZzAsIGFyZzEsIGFyZzI7CisgIHJ0eCBvcDAsIG9wMSwgb3AyLCBwYXQ7CisgIGVudW0gbWFjaGluZV9tb2RlIHRtb2RlLCBtb2RlMCwgbW9kZTE7CisgIGVudW0gbWFjaGluZV9tb2RlIGFyZzBfbW9kZTsKKyAgaW50IGZjb2RlID0gREVDTF9GVU5DVElPTl9DT0RFIChmbmRlY2wpOworCisgIHN3aXRjaCAoZmNvZGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9TQVRTOgorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9TQVRVOgorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9TQVRSTkRTOgorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9TQVRSTkRVOgorICAgICAgeworCWNvbnN0IGNoYXIgKmZuYW1lOworCXN3aXRjaCAoZmNvZGUpCisJICB7CisJICBkZWZhdWx0OgorCSAgY2FzZSBBVlIzMl9CVUlMVElOX1NBVFM6CisJICAgIGljb2RlID0gQ09ERV9GT1Jfc2F0czsKKwkgICAgZm5hbWUgPSAic2F0cyI7CisJICAgIGJyZWFrOworCSAgY2FzZSBBVlIzMl9CVUlMVElOX1NBVFU6CisJICAgIGljb2RlID0gQ09ERV9GT1Jfc2F0dTsKKwkgICAgZm5hbWUgPSAic2F0dSI7CisJICAgIGJyZWFrOworCSAgY2FzZSBBVlIzMl9CVUlMVElOX1NBVFJORFM6CisJICAgIGljb2RlID0gQ09ERV9GT1Jfc2F0cm5kczsKKwkgICAgZm5hbWUgPSAic2F0cm5kcyI7CisJICAgIGJyZWFrOworCSAgY2FzZSBBVlIzMl9CVUlMVElOX1NBVFJORFU6CisJICAgIGljb2RlID0gQ09ERV9GT1Jfc2F0cm5kdTsKKwkgICAgZm5hbWUgPSAic2F0cm5kdSI7CisJICAgIGJyZWFrOworCSAgfQorCisJYXJnMCA9IFRSRUVfVkFMVUUgKGFyZ2xpc3QpOworCWFyZzEgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChhcmdsaXN0KSk7CisJYXJnMiA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4gKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKSk7CisJb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisJb3AxID0gZXhwYW5kX2V4cHIgKGFyZzEsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisJb3AyID0gZXhwYW5kX2V4cHIgKGFyZzIsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisKKwl0bW9kZSA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5tb2RlOworCisKKwlpZiAodGFyZ2V0ID09IDAKKwkgICAgfHwgR0VUX01PREUgKHRhcmdldCkgIT0gdG1vZGUKKwkgICAgfHwgISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKHRhcmdldCwgdG1vZGUpKQorCSAgdGFyZ2V0ID0gZ2VuX3JlZ19ydHggKHRtb2RlKTsKKworCisJaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpIChvcDAsIEdFVF9NT0RFIChvcDApKSkKKwkgIHsKKwkgICAgb3AwID0gY29weV90b19tb2RlX3JlZyAoaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGUsIG9wMCk7CisJICB9CisKKwlpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLnByZWRpY2F0ZSkgKG9wMSwgU0ltb2RlKSkKKwkgIHsKKwkgICAgZXJyb3IgKCJQYXJhbWV0ZXIgMiB0byBfX2J1aWx0aW5fJXMgc2hvdWxkIGJlIGEgY29uc3RhbnQgbnVtYmVyLiIsCisJCSAgIGZuYW1lKTsKKwkgICAgcmV0dXJuIE5VTExfUlRYOworCSAgfQorCisJaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsxXS5wcmVkaWNhdGUpIChvcDIsIFNJbW9kZSkpCisJICB7CisJICAgIGVycm9yICgiUGFyYW1ldGVyIDMgdG8gX19idWlsdGluXyVzIHNob3VsZCBiZSBhIGNvbnN0YW50IG51bWJlci4iLAorCQkgICBmbmFtZSk7CisJICAgIHJldHVybiBOVUxMX1JUWDsKKwkgIH0KKworCWVtaXRfbW92ZV9pbnNuICh0YXJnZXQsIG9wMCk7CisJcGF0ID0gR0VOX0ZDTiAoaWNvZGUpICh0YXJnZXQsIG9wMSwgb3AyKTsKKwlpZiAoIXBhdCkKKwkgIHJldHVybiAwOworCWVtaXRfaW5zbiAocGF0KTsKKworCXJldHVybiB0YXJnZXQ7CisgICAgICB9CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX01VU1RSOgorICAgICAgaWNvZGUgPSBDT0RFX0ZPUl9tdXN0cjsKKyAgICAgIHRtb2RlID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGU7CisKKyAgICAgIGlmICh0YXJnZXQgPT0gMAorCSAgfHwgR0VUX01PREUgKHRhcmdldCkgIT0gdG1vZGUKKwkgIHx8ICEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpICh0YXJnZXQsIHRtb2RlKSkKKwl0YXJnZXQgPSBnZW5fcmVnX3J0eCAodG1vZGUpOworICAgICAgcGF0ID0gR0VOX0ZDTiAoaWNvZGUpICh0YXJnZXQpOworICAgICAgaWYgKCFwYXQpCisJcmV0dXJuIDA7CisgICAgICBlbWl0X2luc24gKHBhdCk7CisgICAgICByZXR1cm4gdGFyZ2V0OworCisgICAgY2FzZSBBVlIzMl9CVUlMVElOX01GU1I6CisgICAgICBpY29kZSA9IENPREVfRk9SX21mc3I7CisgICAgICBhcmcwID0gVFJFRV9WQUxVRSAoYXJnbGlzdCk7CisgICAgICBvcDAgPSBleHBhbmRfZXhwciAoYXJnMCwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgICAgIHRtb2RlID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGU7CisgICAgICBtb2RlMCA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsxXS5tb2RlOworCisgICAgICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLnByZWRpY2F0ZSkgKG9wMCwgbW9kZTApKQorCXsKKwkgIGVycm9yICgiUGFyYW1ldGVyIDEgdG8gX19idWlsdGluX21mc3IgbXVzdCBiZSBhIGNvbnN0YW50IG51bWJlciIpOworCX0KKworICAgICAgaWYgKHRhcmdldCA9PSAwCisJICB8fCBHRVRfTU9ERSAodGFyZ2V0KSAhPSB0bW9kZQorCSAgfHwgISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKHRhcmdldCwgdG1vZGUpKQorCXRhcmdldCA9IGdlbl9yZWdfcnR4ICh0bW9kZSk7CisgICAgICBwYXQgPSBHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgb3AwKTsKKyAgICAgIGlmICghcGF0KQorCXJldHVybiAwOworICAgICAgZW1pdF9pbnNuIChwYXQpOworICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTVRTUjoKKyAgICAgIGljb2RlID0gQ09ERV9GT1JfbXRzcjsKKyAgICAgIGFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKyAgICAgIGFyZzEgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChhcmdsaXN0KSk7CisgICAgICBvcDAgPSBleHBhbmRfZXhwciAoYXJnMCwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgICAgIG9wMSA9IGV4cGFuZF9leHByIChhcmcxLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworICAgICAgbW9kZTAgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKyAgICAgIG1vZGUxID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLm1vZGU7CisKKyAgICAgIGlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAob3AwLCBtb2RlMCkpCisJeworCSAgZXJyb3IgKCJQYXJhbWV0ZXIgMSB0byBfX2J1aWx0aW5fbXRzciBtdXN0IGJlIGEgY29uc3RhbnQgbnVtYmVyIik7CisJICByZXR1cm4gZ2VuX3JlZ19ydHggKG1vZGUwKTsKKwl9CisgICAgICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLnByZWRpY2F0ZSkgKG9wMSwgbW9kZTEpKQorCW9wMSA9IGNvcHlfdG9fbW9kZV9yZWcgKG1vZGUxLCBvcDEpOworICAgICAgcGF0ID0gR0VOX0ZDTiAoaWNvZGUpIChvcDAsIG9wMSk7CisgICAgICBpZiAoIXBhdCkKKwlyZXR1cm4gMDsKKyAgICAgIGVtaXRfaW5zbiAocGF0KTsKKyAgICAgIHJldHVybiBOVUxMX1JUWDsKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTUZEUjoKKyAgICAgIGljb2RlID0gQ09ERV9GT1JfbWZkcjsKKyAgICAgIGFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKyAgICAgIG9wMCA9IGV4cGFuZF9leHByIChhcmcwLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworICAgICAgdG1vZGUgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKyAgICAgIG1vZGUwID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLm1vZGU7CisKKyAgICAgIGlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AwLCBtb2RlMCkpCisJeworCSAgZXJyb3IgKCJQYXJhbWV0ZXIgMSB0byBfX2J1aWx0aW5fbWZkciBtdXN0IGJlIGEgY29uc3RhbnQgbnVtYmVyIik7CisJfQorCisgICAgICBpZiAodGFyZ2V0ID09IDAKKwkgIHx8IEdFVF9NT0RFICh0YXJnZXQpICE9IHRtb2RlCisJICB8fCAhKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAodGFyZ2V0LCB0bW9kZSkpCisJdGFyZ2V0ID0gZ2VuX3JlZ19ydHggKHRtb2RlKTsKKyAgICAgIHBhdCA9IEdFTl9GQ04gKGljb2RlKSAodGFyZ2V0LCBvcDApOworICAgICAgaWYgKCFwYXQpCisJcmV0dXJuIDA7CisgICAgICBlbWl0X2luc24gKHBhdCk7CisgICAgICByZXR1cm4gdGFyZ2V0OworICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9NVERSOgorICAgICAgaWNvZGUgPSBDT0RFX0ZPUl9tdGRyOworICAgICAgYXJnMCA9IFRSRUVfVkFMVUUgKGFyZ2xpc3QpOworICAgICAgYXJnMSA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKTsKKyAgICAgIG9wMCA9IGV4cGFuZF9leHByIChhcmcwLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworICAgICAgb3AxID0gZXhwYW5kX2V4cHIgKGFyZzEsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisgICAgICBtb2RlMCA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5tb2RlOworICAgICAgbW9kZTEgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ubW9kZTsKKworICAgICAgaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpIChvcDAsIG1vZGUwKSkKKwl7CisJICBlcnJvciAoIlBhcmFtZXRlciAxIHRvIF9fYnVpbHRpbl9tdGRyIG11c3QgYmUgYSBjb25zdGFudCBudW1iZXIiKTsKKwkgIHJldHVybiBnZW5fcmVnX3J0eCAobW9kZTApOworCX0KKyAgICAgIGlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AxLCBtb2RlMSkpCisJb3AxID0gY29weV90b19tb2RlX3JlZyAobW9kZTEsIG9wMSk7CisgICAgICBwYXQgPSBHRU5fRkNOIChpY29kZSkgKG9wMCwgb3AxKTsKKyAgICAgIGlmICghcGF0KQorCXJldHVybiAwOworICAgICAgZW1pdF9pbnNuIChwYXQpOworICAgICAgcmV0dXJuIE5VTExfUlRYOworICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9DQUNIRToKKyAgICAgIGljb2RlID0gQ09ERV9GT1JfY2FjaGU7CisgICAgICBhcmcwID0gVFJFRV9WQUxVRSAoYXJnbGlzdCk7CisgICAgICBhcmcxID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoYXJnbGlzdCkpOworICAgICAgb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisgICAgICBvcDEgPSBleHBhbmRfZXhwciAoYXJnMSwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgICAgIG1vZGUwID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGU7CisgICAgICBtb2RlMSA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsxXS5tb2RlOworCisgICAgICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLnByZWRpY2F0ZSkgKG9wMSwgbW9kZTEpKQorCXsKKwkgIGVycm9yICgiUGFyYW1ldGVyIDIgdG8gX19idWlsdGluX2NhY2hlIG11c3QgYmUgYSBjb25zdGFudCBudW1iZXIiKTsKKwkgIHJldHVybiBnZW5fcmVnX3J0eCAobW9kZTEpOworCX0KKworICAgICAgaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpIChvcDAsIG1vZGUwKSkKKwlvcDAgPSBjb3B5X3RvX21vZGVfcmVnIChtb2RlMCwgb3AwKTsKKworICAgICAgcGF0ID0gR0VOX0ZDTiAoaWNvZGUpIChvcDAsIG9wMSk7CisgICAgICBpZiAoIXBhdCkKKwlyZXR1cm4gMDsKKyAgICAgIGVtaXRfaW5zbiAocGF0KTsKKyAgICAgIHJldHVybiBOVUxMX1JUWDsKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fU1lOQzoKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTVVTRlI6CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX1NTUkY6CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX0NTUkY6CisgICAgICB7CisJY29uc3QgY2hhciAqZm5hbWU7CisJc3dpdGNoIChmY29kZSkKKwkgIHsKKwkgIGRlZmF1bHQ6CisJICBjYXNlIEFWUjMyX0JVSUxUSU5fU1lOQzoKKwkgICAgaWNvZGUgPSBDT0RFX0ZPUl9zeW5jOworCSAgICBmbmFtZSA9ICJzeW5jIjsKKwkgICAgYnJlYWs7CisJICBjYXNlIEFWUjMyX0JVSUxUSU5fTVVTRlI6CisJICAgIGljb2RlID0gQ09ERV9GT1JfbXVzZnI7CisJICAgIGZuYW1lID0gIm11c2ZyIjsKKwkgICAgYnJlYWs7CisJICBjYXNlIEFWUjMyX0JVSUxUSU5fU1NSRjoKKwkgICAgaWNvZGUgPSBDT0RFX0ZPUl9zc3JmOworCSAgICBmbmFtZSA9ICJzc3JmIjsKKwkgICAgYnJlYWs7CisJICBjYXNlIEFWUjMyX0JVSUxUSU5fQ1NSRjoKKwkgICAgaWNvZGUgPSBDT0RFX0ZPUl9jc3JmOworCSAgICBmbmFtZSA9ICJjc3JmIjsKKwkgICAgYnJlYWs7CisJICB9CisKKwlhcmcwID0gVFJFRV9WQUxVRSAoYXJnbGlzdCk7CisJb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisJbW9kZTAgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAob3AwLCBtb2RlMCkpCisJICB7CisJICAgIGlmIChpY29kZSA9PSBDT0RFX0ZPUl9tdXNmcikKKwkgICAgICBvcDAgPSBjb3B5X3RvX21vZGVfcmVnIChtb2RlMCwgb3AwKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZXJyb3IgKCJQYXJhbWV0ZXIgdG8gX19idWlsdGluXyVzIGlzIGlsbGVnYWwuIiwgZm5hbWUpOworCQlyZXR1cm4gZ2VuX3JlZ19ydHggKG1vZGUwKTsKKwkgICAgICB9CisJICB9CisJcGF0ID0gR0VOX0ZDTiAoaWNvZGUpIChvcDApOworCWlmICghcGF0KQorCSAgcmV0dXJuIDA7CisJZW1pdF9pbnNuIChwYXQpOworCXJldHVybiBOVUxMX1JUWDsKKyAgICAgIH0KKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fVExCUjoKKyAgICAgIGljb2RlID0gQ09ERV9GT1JfdGxicjsKKyAgICAgIHBhdCA9IEdFTl9GQ04gKGljb2RlKSAoTlVMTF9SVFgpOworICAgICAgaWYgKCFwYXQpCisJcmV0dXJuIDA7CisgICAgICBlbWl0X2luc24gKHBhdCk7CisgICAgICByZXR1cm4gTlVMTF9SVFg7CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX1RMQlM6CisgICAgICBpY29kZSA9IENPREVfRk9SX3RsYnM7CisgICAgICBwYXQgPSBHRU5fRkNOIChpY29kZSkgKE5VTExfUlRYKTsKKyAgICAgIGlmICghcGF0KQorCXJldHVybiAwOworICAgICAgZW1pdF9pbnNuIChwYXQpOworICAgICAgcmV0dXJuIE5VTExfUlRYOworICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9UTEJXOgorICAgICAgaWNvZGUgPSBDT0RFX0ZPUl90bGJ3OworICAgICAgcGF0ID0gR0VOX0ZDTiAoaWNvZGUpIChOVUxMX1JUWCk7CisgICAgICBpZiAoIXBhdCkKKwlyZXR1cm4gMDsKKyAgICAgIGVtaXRfaW5zbiAocGF0KTsKKyAgICAgIHJldHVybiBOVUxMX1JUWDsKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fQlJFQUtQT0lOVDoKKyAgICAgIGljb2RlID0gQ09ERV9GT1JfYnJlYWtwb2ludDsKKyAgICAgIHBhdCA9IEdFTl9GQ04gKGljb2RlKSAoTlVMTF9SVFgpOworICAgICAgaWYgKCFwYXQpCisJcmV0dXJuIDA7CisgICAgICBlbWl0X2luc24gKHBhdCk7CisgICAgICByZXR1cm4gTlVMTF9SVFg7CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX1hDSEc6CisgICAgICBpY29kZSA9IENPREVfRk9SX3N5bmNfbG9ja190ZXN0X2FuZF9zZXRzaTsKKyAgICAgIGFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKyAgICAgIGFyZzEgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChhcmdsaXN0KSk7CisgICAgICBvcDAgPSBleHBhbmRfZXhwciAoYXJnMCwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgICAgIG9wMSA9IGV4cGFuZF9leHByIChhcmcxLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworICAgICAgdG1vZGUgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKyAgICAgIG1vZGUwID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLm1vZGU7CisgICAgICBtb2RlMSA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsyXS5tb2RlOworCisgICAgICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLnByZWRpY2F0ZSkgKG9wMSwgbW9kZTEpKQorCXsKKwkgIG9wMSA9IGNvcHlfdG9fbW9kZV9yZWcgKG1vZGUxLCBvcDEpOworCX0KKworICAgICAgb3AwID0gZm9yY2VfcmVnIChHRVRfTU9ERSAob3AwKSwgb3AwKTsKKyAgICAgIG9wMCA9IGdlbl9ydHhfTUVNIChHRVRfTU9ERSAob3AwKSwgb3AwKTsKKyAgICAgIGlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AwLCBtb2RlMCkpCisJeworCSAgZXJyb3IKKwkgICAgKCJQYXJhbWV0ZXIgMSB0byBfX2J1aWx0aW5feGNoZyBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyLiIpOworCX0KKworICAgICAgaWYgKHRhcmdldCA9PSAwCisJICB8fCBHRVRfTU9ERSAodGFyZ2V0KSAhPSB0bW9kZQorCSAgfHwgISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKHRhcmdldCwgdG1vZGUpKQorCXRhcmdldCA9IGdlbl9yZWdfcnR4ICh0bW9kZSk7CisgICAgICBwYXQgPSBHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgb3AwLCBvcDEpOworICAgICAgaWYgKCFwYXQpCisJcmV0dXJuIDA7CisgICAgICBlbWl0X2luc24gKHBhdCk7CisgICAgICByZXR1cm4gdGFyZ2V0OworICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9MRFhJOgorICAgICAgaWNvZGUgPSBDT0RFX0ZPUl9sZHhpOworICAgICAgYXJnMCA9IFRSRUVfVkFMVUUgKGFyZ2xpc3QpOworICAgICAgYXJnMSA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKTsKKyAgICAgIGFyZzIgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChUUkVFX0NIQUlOIChhcmdsaXN0KSkpOworICAgICAgb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisgICAgICBvcDEgPSBleHBhbmRfZXhwciAoYXJnMSwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgICAgIG9wMiA9IGV4cGFuZF9leHByIChhcmcyLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworICAgICAgdG1vZGUgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKyAgICAgIG1vZGUwID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLm1vZGU7CisgICAgICBtb2RlMSA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsyXS5tb2RlOworCisgICAgICBpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLnByZWRpY2F0ZSkgKG9wMCwgbW9kZTApKQorCXsKKwkgIG9wMCA9IGNvcHlfdG9fbW9kZV9yZWcgKG1vZGUwLCBvcDApOworCX0KKworICAgICAgaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsyXS5wcmVkaWNhdGUpIChvcDEsIG1vZGUxKSkKKwl7CisJICBvcDEgPSBjb3B5X3RvX21vZGVfcmVnIChtb2RlMSwgb3AxKTsKKwl9CisKKyAgICAgIGlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbM10ucHJlZGljYXRlKSAob3AyLCBTSW1vZGUpKQorCXsKKwkgIGVycm9yCisJICAgICgiUGFyYW1ldGVyIDMgdG8gX19idWlsdGluX2xkeGkgbXVzdCBiZSBhIHZhbGlkIGV4dHJhY3Qgc2hpZnQgb3BlcmFuZDogKDB8OHwxNnwyNCkiKTsKKwkgIHJldHVybiBnZW5fcmVnX3J0eCAobW9kZTApOworCX0KKworICAgICAgaWYgKHRhcmdldCA9PSAwCisJICB8fCBHRVRfTU9ERSAodGFyZ2V0KSAhPSB0bW9kZQorCSAgfHwgISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKHRhcmdldCwgdG1vZGUpKQorCXRhcmdldCA9IGdlbl9yZWdfcnR4ICh0bW9kZSk7CisgICAgICBwYXQgPSBHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgb3AwLCBvcDEsIG9wMik7CisgICAgICBpZiAoIXBhdCkKKwlyZXR1cm4gMDsKKyAgICAgIGVtaXRfaW5zbiAocGF0KTsKKyAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX0JTV0FQMTY6CisgICAgICB7CisJaWNvZGUgPSBDT0RFX0ZPUl9ic3dhcF8xNjsKKwlhcmcwID0gVFJFRV9WQUxVRSAoYXJnbGlzdCk7CisJYXJnMF9tb2RlID0gVFlQRV9NT0RFIChUUkVFX1RZUEUgKGFyZzApKTsKKwltb2RlMCA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsxXS5tb2RlOworCWlmIChhcmcwX21vZGUgIT0gbW9kZTApCisJICBhcmcwID0gYnVpbGQxIChOT1BfRVhQUiwKKwkJCSAoKmxhbmdfaG9va3MudHlwZXMudHlwZV9mb3JfbW9kZSkgKG1vZGUwLCAwKSwgYXJnMCk7CisKKwlvcDAgPSBleHBhbmRfZXhwciAoYXJnMCwgTlVMTF9SVFgsIEhJbW9kZSwgMCk7CisJdG1vZGUgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ubW9kZTsKKworCisJaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsxXS5wcmVkaWNhdGUpIChvcDAsIG1vZGUwKSkKKwkgIHsKKyAgICAgICAgICAgIGlmICggQ09OU1RfSU5UX1AgKG9wMCkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSE9TVF9XSURFX0lOVCB2YWwgPSAoICgoSU5UVkFMIChvcDApJjB4MDBmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOVFZBTCAob3AwKSYweGZmMDApID4+IDgpICk7CisgICAgICAgICAgICAgICAgLyogU2lnbiBleHRlbmQgMTYtYml0IHZhbHVlIHRvIGhvc3Qgd2lkZSBpbnQgKi8KKyAgICAgICAgICAgICAgICB2YWwgPDw9IChIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC0gMTYpOworICAgICAgICAgICAgICAgIHZhbCA+Pj0gKEhPU1RfQklUU19QRVJfV0lERV9JTlQgLSAxNik7CisgICAgICAgICAgICAgICAgb3AwID0gR0VOX0lOVCh2YWwpOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBHRVRfTU9ERSAodGFyZ2V0KSAhPSB0bW9kZQorICAgICAgICAgICAgICAgICAgICB8fCAhKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAodGFyZ2V0LCB0bW9kZSkpCisgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBnZW5fcmVnX3J0eCAodG1vZGUpOworICAgICAgICAgICAgICAgIGVtaXRfbW92ZV9pbnNuKHRhcmdldCwgb3AwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG9wMCA9IGNvcHlfdG9fbW9kZV9yZWcgKG1vZGUwLCBvcDApOworCSAgfQorCisJaWYgKHRhcmdldCA9PSAwCisJICAgIHx8IEdFVF9NT0RFICh0YXJnZXQpICE9IHRtb2RlCisJICAgIHx8ICEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpICh0YXJnZXQsIHRtb2RlKSkKKwkgIHsKKwkgICAgdGFyZ2V0ID0gZ2VuX3JlZ19ydHggKHRtb2RlKTsKKwkgIH0KKworCisJcGF0ID0gR0VOX0ZDTiAoaWNvZGUpICh0YXJnZXQsIG9wMCk7CisJaWYgKCFwYXQpCisJICByZXR1cm4gMDsKKwllbWl0X2luc24gKHBhdCk7CisKKwlyZXR1cm4gdGFyZ2V0OworICAgICAgfQorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9CU1dBUDMyOgorICAgICAgeworCWljb2RlID0gQ09ERV9GT1JfYnN3YXBfMzI7CisJYXJnMCA9IFRSRUVfVkFMVUUgKGFyZ2xpc3QpOworCW9wMCA9IGV4cGFuZF9leHByIChhcmcwLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworCXRtb2RlID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGU7CisJbW9kZTAgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ubW9kZTsKKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AwLCBtb2RlMCkpCisJICB7CisgICAgICAgICAgICBpZiAoIENPTlNUX0lOVF9QIChvcDApICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEhPU1RfV0lERV9JTlQgdmFsID0gKCAoKElOVFZBTCAob3AwKSYweDAwMDAwMGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOVFZBTCAob3AwKSYweDAwMDBmZjAwKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5UVkFMIChvcDApJjB4MDBmZjAwMDApID4+IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJTlRWQUwgKG9wMCkmMHhmZjAwMDAwMCkgPj4gMjQpICk7CisgICAgICAgICAgICAgICAgLyogU2lnbiBleHRlbmQgMzItYml0IHZhbHVlIHRvIGhvc3Qgd2lkZSBpbnQgKi8KKyAgICAgICAgICAgICAgICB2YWwgPDw9IChIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC0gMzIpOworICAgICAgICAgICAgICAgIHZhbCA+Pj0gKEhPU1RfQklUU19QRVJfV0lERV9JTlQgLSAzMik7CisgICAgICAgICAgICAgICAgb3AwID0gR0VOX0lOVCh2YWwpOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBHRVRfTU9ERSAodGFyZ2V0KSAhPSB0bW9kZQorICAgICAgICAgICAgICAgICAgICB8fCAhKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAodGFyZ2V0LCB0bW9kZSkpCisgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBnZW5fcmVnX3J0eCAodG1vZGUpOworICAgICAgICAgICAgICAgIGVtaXRfbW92ZV9pbnNuKHRhcmdldCwgb3AwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG9wMCA9IGNvcHlfdG9fbW9kZV9yZWcgKG1vZGUwLCBvcDApOworCSAgfQorCisJaWYgKHRhcmdldCA9PSAwCisJICAgIHx8IEdFVF9NT0RFICh0YXJnZXQpICE9IHRtb2RlCisJICAgIHx8ICEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5wcmVkaWNhdGUpICh0YXJnZXQsIHRtb2RlKSkKKwkgIHRhcmdldCA9IGdlbl9yZWdfcnR4ICh0bW9kZSk7CisKKworCXBhdCA9IEdFTl9GQ04gKGljb2RlKSAodGFyZ2V0LCBvcDApOworCWlmICghcGF0KQorCSAgcmV0dXJuIDA7CisJZW1pdF9pbnNuIChwYXQpOworCisJcmV0dXJuIHRhcmdldDsKKyAgICAgIH0KKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTVZDUl9XOgorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9NVkNSX0Q6CisgICAgICB7CisJYXJnMCA9IFRSRUVfVkFMVUUgKGFyZ2xpc3QpOworCWFyZzEgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChhcmdsaXN0KSk7CisJb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisJb3AxID0gZXhwYW5kX2V4cHIgKGFyZzEsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisKKwlpZiAoZmNvZGUgPT0gQVZSMzJfQlVJTFRJTl9NVkNSX1cpCisJICBpY29kZSA9IENPREVfRk9SX212Y3JzaTsKKwllbHNlCisJICBpY29kZSA9IENPREVfRk9SX212Y3JkaTsKKworCXRtb2RlID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGU7CisKKwlpZiAodGFyZ2V0ID09IDAKKwkgICAgfHwgR0VUX01PREUgKHRhcmdldCkgIT0gdG1vZGUKKwkgICAgfHwgISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKHRhcmdldCwgdG1vZGUpKQorCSAgdGFyZ2V0ID0gZ2VuX3JlZ19ydHggKHRtb2RlKTsKKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AwLCBTSW1vZGUpKQorCSAgeworCSAgICBlcnJvcgorCSAgICAgICgiUGFyYW1ldGVyIDEgdG8gX19idWlsdGluX2NvcCBpcyBub3QgYSB2YWxpZCBjb3Byb2Nlc3NvciBudW1iZXIuIik7CisJICAgIGVycm9yICgiTnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDcuIik7CisJICAgIHJldHVybiBOVUxMX1JUWDsKKwkgIH0KKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMl0ucHJlZGljYXRlKSAob3AxLCBTSW1vZGUpKQorCSAgeworCSAgICBlcnJvcgorCSAgICAgICgiUGFyYW1ldGVyIDIgdG8gX19idWlsdGluX2NvcCBpcyBub3QgYSB2YWxpZCBjb3Byb2Nlc3NvciByZWdpc3RlciBudW1iZXIuIik7CisJICAgIGVycm9yICgiTnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDE1LiIpOworCSAgICByZXR1cm4gTlVMTF9SVFg7CisJICB9CisKKwlwYXQgPSBHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgb3AwLCBvcDEpOworCWlmICghcGF0KQorCSAgcmV0dXJuIDA7CisJZW1pdF9pbnNuIChwYXQpOworCisJcmV0dXJuIHRhcmdldDsKKyAgICAgIH0KKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTUFDU0FUSEhfVzoKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTUFDV0hfRDoKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTUFDSEhfRDoKKyAgICAgIHsKKwlhcmcwID0gVFJFRV9WQUxVRSAoYXJnbGlzdCk7CisJYXJnMSA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKTsKKwlhcmcyID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoVFJFRV9DSEFJTiAoYXJnbGlzdCkpKTsKKwlvcDAgPSBleHBhbmRfZXhwciAoYXJnMCwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKwlvcDEgPSBleHBhbmRfZXhwciAoYXJnMSwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKwlvcDIgPSBleHBhbmRfZXhwciAoYXJnMiwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKworCWljb2RlID0gKChmY29kZSA9PSBBVlIzMl9CVUlMVElOX01BQ1NBVEhIX1cpID8gQ09ERV9GT1JfbWFjc2F0aGhfdyA6CisJCSAoZmNvZGUgPT0gQVZSMzJfQlVJTFRJTl9NQUNXSF9EKSA/IENPREVfRk9SX21hY3doX2QgOgorCQkgQ09ERV9GT1JfbWFjaGhfZCk7CisKKwl0bW9kZSA9IGluc25fZGF0YVtpY29kZV0ub3BlcmFuZFswXS5tb2RlOworCW1vZGUwID0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzFdLm1vZGU7CisJbW9kZTEgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMl0ubW9kZTsKKworCisJaWYgKCF0YXJnZXQKKwkgICAgfHwgR0VUX01PREUgKHRhcmdldCkgIT0gdG1vZGUKKwkgICAgfHwgISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKHRhcmdldCwgdG1vZGUpKQorCSAgdGFyZ2V0ID0gZ2VuX3JlZ19ydHggKHRtb2RlKTsKKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAob3AwLCB0bW9kZSkpCisJICB7CisJICAgIC8qIElmIG9wMCBpcyBhbHJlYWR5IGEgcmVnIHdlIG11c3QgY2FzdCBpdCB0byB0aGUgY29ycmVjdCBtb2RlLiAqLworCSAgICBpZiAoUkVHX1AgKG9wMCkpCisJICAgICAgb3AwID0gY29udmVydF90b19tb2RlICh0bW9kZSwgb3AwLCAxKTsKKwkgICAgZWxzZQorCSAgICAgIG9wMCA9IGNvcHlfdG9fbW9kZV9yZWcgKHRtb2RlLCBvcDApOworCSAgfQorCisJaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFsxXS5wcmVkaWNhdGUpIChvcDEsIG1vZGUwKSkKKwkgIHsKKwkgICAgLyogSWYgb3AxIGlzIGFscmVhZHkgYSByZWcgd2UgbXVzdCBjYXN0IGl0IHRvIHRoZSBjb3JyZWN0IG1vZGUuICovCisJICAgIGlmIChSRUdfUCAob3AxKSkKKwkgICAgICBvcDEgPSBjb252ZXJ0X3RvX21vZGUgKG1vZGUwLCBvcDEsIDEpOworCSAgICBlbHNlCisJICAgICAgb3AxID0gY29weV90b19tb2RlX3JlZyAobW9kZTAsIG9wMSk7CisJICB9CisKKwlpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLnByZWRpY2F0ZSkgKG9wMiwgbW9kZTEpKQorCSAgeworCSAgICAvKiBJZiBvcDEgaXMgYWxyZWFkeSBhIHJlZyB3ZSBtdXN0IGNhc3QgaXQgdG8gdGhlIGNvcnJlY3QgbW9kZS4gKi8KKwkgICAgaWYgKFJFR19QIChvcDIpKQorCSAgICAgIG9wMiA9IGNvbnZlcnRfdG9fbW9kZSAobW9kZTEsIG9wMiwgMSk7CisJICAgIGVsc2UKKwkgICAgICBvcDIgPSBjb3B5X3RvX21vZGVfcmVnIChtb2RlMSwgb3AyKTsKKwkgIH0KKworCWVtaXRfbW92ZV9pbnNuICh0YXJnZXQsIG9wMCk7CisKKwlwYXQgPSBHRU5fRkNOIChpY29kZSkgKHRhcmdldCwgb3AxLCBvcDIpOworCWlmICghcGF0KQorCSAgcmV0dXJuIDA7CisJZW1pdF9pbnNuIChwYXQpOworCXJldHVybiB0YXJnZXQ7CisgICAgICB9CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX01WUkNfVzoKKyAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTVZSQ19EOgorICAgICAgeworCWFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKwlhcmcxID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoYXJnbGlzdCkpOworCWFyZzIgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChUUkVFX0NIQUlOIChhcmdsaXN0KSkpOworCW9wMCA9IGV4cGFuZF9leHByIChhcmcwLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworCW9wMSA9IGV4cGFuZF9leHByIChhcmcxLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworCW9wMiA9IGV4cGFuZF9leHByIChhcmcyLCBOVUxMX1JUWCwgVk9JRG1vZGUsIDApOworCisJaWYgKGZjb2RlID09IEFWUjMyX0JVSUxUSU5fTVZSQ19XKQorCSAgaWNvZGUgPSBDT0RFX0ZPUl9tdnJjc2k7CisJZWxzZQorCSAgaWNvZGUgPSBDT0RFX0ZPUl9tdnJjZGk7CisKKwlpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLnByZWRpY2F0ZSkgKG9wMCwgU0ltb2RlKSkKKwkgIHsKKwkgICAgZXJyb3IgKCJQYXJhbWV0ZXIgMSBpcyBub3QgYSB2YWxpZCBjb3Byb2Nlc3NvciBudW1iZXIuIik7CisJICAgIGVycm9yICgiTnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDcuIik7CisJICAgIHJldHVybiBOVUxMX1JUWDsKKwkgIH0KKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AxLCBTSW1vZGUpKQorCSAgeworCSAgICBlcnJvciAoIlBhcmFtZXRlciAyIGlzIG5vdCBhIHZhbGlkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG51bWJlci4iKTsKKwkgICAgZXJyb3IgKCJOdW1iZXIgc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMTUuIik7CisJICAgIHJldHVybiBOVUxMX1JUWDsKKwkgIH0KKworCWlmIChHRVRfQ09ERSAob3AyKSA9PSBDT05TVF9JTlQKKwkgICAgfHwgR0VUX0NPREUgKG9wMikgPT0gQ09OU1QKKwkgICAgfHwgR0VUX0NPREUgKG9wMikgPT0gU1lNQk9MX1JFRiB8fCBHRVRfQ09ERSAob3AyKSA9PSBMQUJFTF9SRUYpCisJICB7CisJICAgIG9wMiA9IGZvcmNlX2NvbnN0X21lbSAoaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLm1vZGUsIG9wMik7CisJICB9CisKKwlpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLnByZWRpY2F0ZSkgKG9wMiwgR0VUX01PREUgKG9wMikpKQorCSAgb3AyID0gY29weV90b19tb2RlX3JlZyAoaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLm1vZGUsIG9wMik7CisKKworCXBhdCA9IEdFTl9GQ04gKGljb2RlKSAob3AwLCBvcDEsIG9wMik7CisJaWYgKCFwYXQpCisJICByZXR1cm4gMDsKKwllbWl0X2luc24gKHBhdCk7CisKKwlyZXR1cm4gTlVMTF9SVFg7CisgICAgICB9CisgICAgY2FzZSBBVlIzMl9CVUlMVElOX0NPUDoKKyAgICAgIHsKKwlydHggb3AzLCBvcDQ7CisJdHJlZSBhcmczLCBhcmc0OworCWljb2RlID0gQ09ERV9GT1JfY29wOworCWFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKwlhcmcxID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoYXJnbGlzdCkpOworCWFyZzIgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChUUkVFX0NIQUlOIChhcmdsaXN0KSkpOworCWFyZzMgPSBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChUUkVFX0NIQUlOIChUUkVFX0NIQUlOIChhcmdsaXN0KSkpKTsKKwlhcmc0ID0KKwkgIFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4KKwkJICAgICAgKFRSRUVfQ0hBSU4gKFRSRUVfQ0hBSU4gKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKSkpKTsKKwlvcDAgPSBleHBhbmRfZXhwciAoYXJnMCwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKwlvcDEgPSBleHBhbmRfZXhwciAoYXJnMSwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKwlvcDIgPSBleHBhbmRfZXhwciAoYXJnMiwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKwlvcDMgPSBleHBhbmRfZXhwciAoYXJnMywgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKwlvcDQgPSBleHBhbmRfZXhwciAoYXJnNCwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMF0ucHJlZGljYXRlKSAob3AwLCBTSW1vZGUpKQorCSAgeworCSAgICBlcnJvcgorCSAgICAgICgiUGFyYW1ldGVyIDEgdG8gX19idWlsdGluX2NvcCBpcyBub3QgYSB2YWxpZCBjb3Byb2Nlc3NvciBudW1iZXIuIik7CisJICAgIGVycm9yICgiTnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDcuIik7CisJICAgIHJldHVybiBOVUxMX1JUWDsKKwkgIH0KKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AxLCBTSW1vZGUpKQorCSAgeworCSAgICBlcnJvcgorCSAgICAgICgiUGFyYW1ldGVyIDIgdG8gX19idWlsdGluX2NvcCBpcyBub3QgYSB2YWxpZCBjb3Byb2Nlc3NvciByZWdpc3RlciBudW1iZXIuIik7CisJICAgIGVycm9yICgiTnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDE1LiIpOworCSAgICByZXR1cm4gTlVMTF9SVFg7CisJICB9CisKKwlpZiAoISgqaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzJdLnByZWRpY2F0ZSkgKG9wMiwgU0ltb2RlKSkKKwkgIHsKKwkgICAgZXJyb3IKKwkgICAgICAoIlBhcmFtZXRlciAzIHRvIF9fYnVpbHRpbl9jb3AgaXMgbm90IGEgdmFsaWQgY29wcm9jZXNzb3IgcmVnaXN0ZXIgbnVtYmVyLiIpOworCSAgICBlcnJvciAoIk51bWJlciBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAxNS4iKTsKKwkgICAgcmV0dXJuIE5VTExfUlRYOworCSAgfQorCisJaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFszXS5wcmVkaWNhdGUpIChvcDMsIFNJbW9kZSkpCisJICB7CisJICAgIGVycm9yCisJICAgICAgKCJQYXJhbWV0ZXIgNCB0byBfX2J1aWx0aW5fY29wIGlzIG5vdCBhIHZhbGlkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG51bWJlci4iKTsKKwkgICAgZXJyb3IgKCJOdW1iZXIgc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMTUuIik7CisJICAgIHJldHVybiBOVUxMX1JUWDsKKwkgIH0KKworCWlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbNF0ucHJlZGljYXRlKSAob3A0LCBTSW1vZGUpKQorCSAgeworCSAgICBlcnJvcgorCSAgICAgICgiUGFyYW1ldGVyIDUgdG8gX19idWlsdGluX2NvcCBpcyBub3QgYSB2YWxpZCBjb3Byb2Nlc3NvciBvcGVyYXRpb24uIik7CisJICAgIGVycm9yICgiTnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDEyNy4iKTsKKwkgICAgcmV0dXJuIE5VTExfUlRYOworCSAgfQorCisJcGF0ID0gR0VOX0ZDTiAoaWNvZGUpIChvcDAsIG9wMSwgb3AyLCBvcDMsIG9wNCk7CisJaWYgKCFwYXQpCisJICByZXR1cm4gMDsKKwllbWl0X2luc24gKHBhdCk7CisKKwlyZXR1cm4gdGFyZ2V0OworICAgICAgfQorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9NRU1TOgorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9NRU1DOgorICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9NRU1UOgorICAgICAgeworICAgICAgICBpZiAoIVRBUkdFVF9STVcpCisgICAgICAgICAgZXJyb3IgKCJUcnlpbmcgdG8gdXNlIF9fYnVpbHRpbl9tZW0ocy9jL3QpIHdoZW4gdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgUk1XIGluc25zLiIpOworCisgICAgICAgIHN3aXRjaCAoZmNvZGUpIHsKKyAgICAgICAgY2FzZSBBVlIzMl9CVUlMVElOX01FTVM6CisgICAgICAgICAgaWNvZGUgPSBDT0RFX0ZPUl9pb3JzaTM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZSMzJfQlVJTFRJTl9NRU1DOgorICAgICAgICAgIGljb2RlID0gQ09ERV9GT1JfYW5kc2kzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWUjMyX0JVSUxUSU5fTUVNVDoKKyAgICAgICAgICBpY29kZSA9IENPREVfRk9SX3hvcnNpMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGFyZzAgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKKyAgICAgICAgYXJnMSA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKTsKKyAgICAgICAgb3AwID0gZXhwYW5kX2V4cHIgKGFyZzAsIE5VTExfUlRYLCBWT0lEbW9kZSwgMCk7CisgICAgICAgIGlmICggR0VUX0NPREUgKG9wMCkgPT0gU1lNQk9MX1JFRiApCisgICAgICAgICAgLy8gVGhpcyBzeW1ib2wgbXVzdCBiZSBSTVcgYWRkcmVzc2FibGUKKyAgICAgICAgICBTWU1CT0xfUkVGX0ZMQUdTIChvcDApIHw9ICgxIDw8IFNZTUJPTF9GTEFHX1JNV19BRERSX1NISUZUKTsKKyAgICAgICAgb3AwID0gZ2VuX3J0eF9NRU0oU0ltb2RlLCBvcDApOworICAgICAgICBvcDEgPSBleHBhbmRfZXhwciAoYXJnMSwgTlVMTF9SVFgsIFZPSURtb2RlLCAwKTsKKyAgICAgICAgbW9kZTAgPSBpbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ubW9kZTsKKworCisgICAgICAgIGlmICghKCppbnNuX2RhdGFbaWNvZGVdLm9wZXJhbmRbMV0ucHJlZGljYXRlKSAob3AwLCBtb2RlMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgZXJyb3IgKCJQYXJhbWV0ZXIgMSB0byBfX2J1aWx0aW5fbWVtKHMvYy90KSBtdXN0IGJlIGEgS3MxNTw8MiBhZGRyZXNzIG9yIGEgcm13IGFkZHJlc3NhYmxlIHN5bWJvbC4iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhQ09OU1RfSU5UX1AgKG9wMSkKKyAgICAgICAgICAgICB8fCBJTlRWQUwgKG9wMSkgPiAzMQorICAgICAgICAgICAgIHx8IElOVFZBTCAob3AxKSA8IDAgKQorICAgICAgICAgIGVycm9yICgiUGFyYW1ldGVyIDIgdG8gX19idWlsdGluX21lbShzL2MvdCkgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gMCBhbmQgMzEuIik7CisKKyAgICAgICAgaWYgKCBmY29kZSA9PSBBVlIzMl9CVUlMVElOX01FTUMgKQorICAgICAgICAgIG9wMSA9IEdFTl9JTlQoKH4oMSA8PCBJTlRWQUwob3AxKSkpJjB4ZmZmZmZmZmYpOworICAgICAgICBlbHNlCisgICAgICAgICAgb3AxID0gR0VOX0lOVCgoMSA8PCBJTlRWQUwob3AxKSkmMHhmZmZmZmZmZik7CisgICAgICAgIHBhdCA9IEdFTl9GQ04gKGljb2RlKSAob3AwLCBvcDAsIG9wMSk7CisgICAgICAgIGlmICghcGF0KQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbWl0X2luc24gKHBhdCk7CisgICAgICAgIHJldHVybiBvcDA7CisgICAgICB9CisKKyAgICB9CisKKyAgZm9yIChpID0gMCwgZCA9IGJkZXNjXzJhcmc7IGkgPCBBUlJBWV9TSVpFIChiZGVzY18yYXJnKTsgaSsrLCBkKyspCisgICAgaWYgKGQtPmNvZGUgPT0gZmNvZGUpCisgICAgICByZXR1cm4gYXZyMzJfZXhwYW5kX2Jpbm9wX2J1aWx0aW4gKGQtPmljb2RlLCBhcmdsaXN0LCB0YXJnZXQpOworCisKKyAgLyogQEBAIFNob3VsZCByZWFsbHkgZG8gc29tZXRoaW5nIHNlbnNpYmxlIGhlcmUuICAqLworICByZXR1cm4gTlVMTF9SVFg7Cit9CisKKworLyogSGFuZGxlIGFuICJpbnRlcnJ1cHQiIG9yICJpc3IiIGF0dHJpYnV0ZTsKKyAgIGFyZ3VtZW50cyBhcyBpbiBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCisKK3N0YXRpYyB0cmVlCithdnIzMl9oYW5kbGVfaXNyX2F0dHJpYnV0ZSAodHJlZSAqIG5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAorCQkJICAgIGludCBmbGFncywgYm9vbCAqIG5vX2FkZF9hdHRycykKK3sKKyAgaWYgKERFQ0xfUCAoKm5vZGUpKQorICAgIHsKKyAgICAgIGlmIChUUkVFX0NPREUgKCpub2RlKSAhPSBGVU5DVElPTl9ERUNMKQorCXsKKwkgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywiYCVzJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9ucyIsCisJCSAgIElERU5USUZJRVJfUE9JTlRFUiAobmFtZSkpOworCSAgKm5vX2FkZF9hdHRycyA9IHRydWU7CisJfQorICAgICAgLyogRklYTUU6IHRoZSBhcmd1bWVudCBpZiBhbnkgaXMgY2hlY2tlZCBmb3IgdHlwZSBhdHRyaWJ1dGVzOyBzaG91bGQgaXQKKyAgICAgICAgIGJlIGNoZWNrZWQgZm9yIGRlY2wgb25lcz8gKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fVFlQRQorCSAgfHwgVFJFRV9DT0RFICgqbm9kZSkgPT0gTUVUSE9EX1RZUEUpCisJeworCSAgaWYgKGF2cjMyX2lzcl92YWx1ZSAoYXJncykgPT0gQVZSMzJfRlRfVU5LTk9XTikKKwkgICAgeworCSAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywiYCVzJyBhdHRyaWJ1dGUgaWdub3JlZCIsIElERU5USUZJRVJfUE9JTlRFUiAobmFtZSkpOworCSAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gUE9JTlRFUl9UWVBFCisJICAgICAgICYmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAoKm5vZGUpKSA9PSBGVU5DVElPTl9UWVBFCisJCSAgIHx8IFRSRUVfQ09ERSAoVFJFRV9UWVBFICgqbm9kZSkpID09IE1FVEhPRF9UWVBFKQorCSAgICAgICAmJiBhdnIzMl9pc3JfdmFsdWUgKGFyZ3MpICE9IEFWUjMyX0ZUX1VOS05PV04pCisJeworCSAgKm5vZGUgPSBidWlsZF92YXJpYW50X3R5cGVfY29weSAoKm5vZGUpOworCSAgVFJFRV9UWVBFICgqbm9kZSkgPSBidWlsZF90eXBlX2F0dHJpYnV0ZV92YXJpYW50CisJICAgIChUUkVFX1RZUEUgKCpub2RlKSwKKwkgICAgIHRyZWVfY29ucyAobmFtZSwgYXJncywgVFlQRV9BVFRSSUJVVEVTIChUUkVFX1RZUEUgKCpub2RlKSkpKTsKKwkgICpub19hZGRfYXR0cnMgPSB0cnVlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBQb3NzaWJseSBwYXNzIHRoaXMgYXR0cmlidXRlIG9uIGZyb20gdGhlIHR5cGUgdG8gYSBkZWNsLiAgKi8KKwkgIGlmIChmbGFncyAmICgoaW50KSBBVFRSX0ZMQUdfREVDTF9ORVhUCisJCSAgICAgICB8IChpbnQpIEFUVFJfRkxBR19GVU5DVElPTl9ORVhUCisJCSAgICAgICB8IChpbnQpIEFUVFJfRkxBR19BUlJBWV9ORVhUKSkKKwkgICAgeworCSAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOworCSAgICAgIHJldHVybiB0cmVlX2NvbnMgKG5hbWUsIGFyZ3MsIE5VTExfVFJFRSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywiYCVzJyBhdHRyaWJ1dGUgaWdub3JlZCIsIElERU5USUZJRVJfUE9JTlRFUiAobmFtZSkpOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gTlVMTF9UUkVFOworfQorCisvKiBIYW5kbGUgYW4gYXR0cmlidXRlIHJlcXVpcmluZyBhIEZVTkNUSU9OX0RFQ0w7CisgICBhcmd1bWVudHMgYXMgaW4gc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLworc3RhdGljIHRyZWUKK2F2cjMyX2hhbmRsZV9mbmRlY2xfYXR0cmlidXRlICh0cmVlICogbm9kZSwgdHJlZSBuYW1lLAorCQkJICAgICAgIHRyZWUgYXJncyBBVFRSSUJVVEVfVU5VU0VELAorCQkJICAgICAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELAorCQkJICAgICAgIGJvb2wgKiBub19hZGRfYXR0cnMpCit7CisgIGlmIChUUkVFX0NPREUgKCpub2RlKSAhPSBGVU5DVElPTl9ERUNMKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywiJXFzIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIiwKKwkgICAgICAgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CisgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTExfVFJFRTsKK30KKworCisvKiBIYW5kbGUgYW4gYWNhbGwgYXR0cmlidXRlOworICAgYXJndW1lbnRzIGFzIGluIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KKworc3RhdGljIHRyZWUKK2F2cjMyX2hhbmRsZV9hY2FsbF9hdHRyaWJ1dGUgKHRyZWUgKiBub2RlLCB0cmVlIG5hbWUsCisJCQkgICAgICB0cmVlIGFyZ3MgQVRUUklCVVRFX1VOVVNFRCwKKwkJCSAgICAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELCBib29sICogbm9fYWRkX2F0dHJzKQoreworICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fVFlQRSB8fCBUUkVFX0NPREUgKCpub2RlKSA9PSBNRVRIT0RfVFlQRSkKKyAgICB7CisgICAgICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMsImAlcycgYXR0cmlidXRlIG5vdCB5ZXQgc3VwcG9ydGVkLi4uIiwKKwkgICAgICAgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CisgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKKyAgICAgIHJldHVybiBOVUxMX1RSRUU7CisgICAgfQorCisgIHdhcm5pbmcgKE9QVF9XYXR0cmlidXRlcywiYCVzJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9ucyIsCisJICAgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CisgICpub19hZGRfYXR0cnMgPSB0cnVlOworICByZXR1cm4gTlVMTF9UUkVFOworfQorCisKKy8qIFJldHVybiAwIGlmIHRoZSBhdHRyaWJ1dGVzIGZvciB0d28gdHlwZXMgYXJlIGluY29tcGF0aWJsZSwgMSBpZiB0aGV5CisgICBhcmUgY29tcGF0aWJsZSwgYW5kIDIgaWYgdGhleSBhcmUgbmVhcmx5IGNvbXBhdGlibGUgKHdoaWNoIGNhdXNlcyBhCisgICB3YXJuaW5nIHRvIGJlIGdlbmVyYXRlZCkuICAqLworCitzdGF0aWMgaW50CithdnIzMl9jb21wX3R5cGVfYXR0cmlidXRlcyAodHJlZSB0eXBlMSwgdHJlZSB0eXBlMikKK3sKKyAgaW50IGFjYWxsMSwgYWNhbGwyLCBpc3IxLCBpc3IyLCBuYWtlZDEsIG5ha2VkMjsKKworICAvKiBDaGVjayBmb3IgbWlzbWF0Y2ggb2Ygbm9uLWRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uLiAgKi8KKyAgaWYgKFRSRUVfQ09ERSAodHlwZTEpICE9IEZVTkNUSU9OX1RZUEUpCisgICAgcmV0dXJuIDE7CisKKyAgLyogQ2hlY2sgZm9yIG1pc21hdGNoZWQgY2FsbCBhdHRyaWJ1dGVzLiAgKi8KKyAgYWNhbGwxID0gbG9va3VwX2F0dHJpYnV0ZSAoImFjYWxsIiwgVFlQRV9BVFRSSUJVVEVTICh0eXBlMSkpICE9IE5VTEw7CisgIGFjYWxsMiA9IGxvb2t1cF9hdHRyaWJ1dGUgKCJhY2FsbCIsIFRZUEVfQVRUUklCVVRFUyAodHlwZTIpKSAhPSBOVUxMOworICBuYWtlZDEgPSBsb29rdXBfYXR0cmlidXRlICgibmFrZWQiLCBUWVBFX0FUVFJJQlVURVMgKHR5cGUxKSkgIT0gTlVMTDsKKyAgbmFrZWQyID0gbG9va3VwX2F0dHJpYnV0ZSAoIm5ha2VkIiwgVFlQRV9BVFRSSUJVVEVTICh0eXBlMikpICE9IE5VTEw7CisgIGlzcjEgPSBsb29rdXBfYXR0cmlidXRlICgiaXNyIiwgVFlQRV9BVFRSSUJVVEVTICh0eXBlMSkpICE9IE5VTEw7CisgIGlmICghaXNyMSkKKyAgICBpc3IxID0gbG9va3VwX2F0dHJpYnV0ZSAoImludGVycnVwdCIsIFRZUEVfQVRUUklCVVRFUyAodHlwZTEpKSAhPSBOVUxMOworCisgIGlzcjIgPSBsb29rdXBfYXR0cmlidXRlICgiaXNyIiwgVFlQRV9BVFRSSUJVVEVTICh0eXBlMikpICE9IE5VTEw7CisgIGlmICghaXNyMikKKyAgICBpc3IyID0gbG9va3VwX2F0dHJpYnV0ZSAoImludGVycnVwdCIsIFRZUEVfQVRUUklCVVRFUyAodHlwZTIpKSAhPSBOVUxMOworCisgIGlmICgoYWNhbGwxICYmIGlzcjIpCisgICAgICB8fCAoYWNhbGwyICYmIGlzcjEpIHx8IChuYWtlZDEgJiYgaXNyMikgfHwgKG5ha2VkMiAmJiBpc3IxKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KKworCisvKiBDb21wdXRlcyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCithdnIzMl9jb21wdXRlX2Z1bmNfdHlwZSAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyB0eXBlID0gQVZSMzJfRlRfVU5LTk9XTjsKKyAgdHJlZSBhOworICB0cmVlIGF0dHI7CisKKyAgaWYgKFRSRUVfQ09ERSAoY3VycmVudF9mdW5jdGlvbl9kZWNsKSAhPSBGVU5DVElPTl9ERUNMKQorICAgIGFib3J0ICgpOworCisgIC8qIERlY2lkZSBpZiB0aGUgY3VycmVudCBmdW5jdGlvbiBpcyB2b2xhdGlsZS4gIFN1Y2ggZnVuY3Rpb25zIG5ldmVyCisgICAgIHJldHVybiwgYW5kIG1hbnkgbWVtb3J5IGN5Y2xlcyBjYW4gYmUgc2F2ZWQgYnkgbm90IHN0b3JpbmcgcmVnaXN0ZXIKKyAgICAgdmFsdWVzIHRoYXQgd2lsbCBuZXZlciBiZSBuZWVkZWQgYWdhaW4uICBUaGlzIG9wdGltaXphdGlvbiB3YXMgYWRkZWQgdG8KKyAgICAgc3BlZWQgdXAgY29udGV4dCBzd2l0Y2hpbmcgaW4gYSBrZXJuZWwgYXBwbGljYXRpb24uICAqLworICBpZiAob3B0aW1pemUgPiAwCisgICAgICAmJiBUUkVFX05PVEhST1cgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCkKKyAgICAgICYmIFRSRUVfVEhJU19WT0xBVElMRSAoY3VycmVudF9mdW5jdGlvbl9kZWNsKSkKKyAgICB0eXBlIHw9IEFWUjMyX0ZUX1ZPTEFUSUxFOworCisgIGlmIChjZnVuLT5zdGF0aWNfY2hhaW5fZGVjbCAhPSBOVUxMKQorICAgIHR5cGUgfD0gQVZSMzJfRlRfTkVTVEVEOworCisgIGF0dHIgPSBERUNMX0FUVFJJQlVURVMgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCk7CisKKyAgYSA9IGxvb2t1cF9hdHRyaWJ1dGUgKCJpc3IiLCBhdHRyKTsKKyAgaWYgKGEgPT0gTlVMTF9UUkVFKQorICAgIGEgPSBsb29rdXBfYXR0cmlidXRlICgiaW50ZXJydXB0IiwgYXR0cik7CisKKyAgaWYgKGEgPT0gTlVMTF9UUkVFKQorICAgIHR5cGUgfD0gQVZSMzJfRlRfTk9STUFMOworICBlbHNlCisgICAgdHlwZSB8PSBhdnIzMl9pc3JfdmFsdWUgKFRSRUVfVkFMVUUgKGEpKTsKKworCisgIGEgPSBsb29rdXBfYXR0cmlidXRlICgiYWNhbGwiLCBhdHRyKTsKKyAgaWYgKGEgIT0gTlVMTF9UUkVFKQorICAgIHR5cGUgfD0gQVZSMzJfRlRfQUNBTEw7CisKKyAgYSA9IGxvb2t1cF9hdHRyaWJ1dGUgKCJuYWtlZCIsIGF0dHIpOworICBpZiAoYSAhPSBOVUxMX1RSRUUpCisgICAgdHlwZSB8PSBBVlIzMl9GVF9OQUtFRDsKKworICByZXR1cm4gdHlwZTsKK30KKworLyogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCithdnIzMl9jdXJyZW50X2Z1bmNfdHlwZSAodm9pZCkKK3sKKyAgaWYgKEFWUjMyX0ZVTkNfVFlQRSAoY2Z1bi0+bWFjaGluZS0+ZnVuY190eXBlKSA9PSBBVlIzMl9GVF9VTktOT1dOKQorICAgIGNmdW4tPm1hY2hpbmUtPmZ1bmNfdHlwZSA9IGF2cjMyX2NvbXB1dGVfZnVuY190eXBlICgpOworCisgIHJldHVybiBjZnVuLT5tYWNoaW5lLT5mdW5jX3R5cGU7Cit9CisKKy8qCisgICBUaGlzIHRhcmdldCBob29rIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB3ZSBzaG91bGQgbm90IHBhc3MgdHlwZSBzb2xlbHkKKyAgIGluIHJlZ2lzdGVycy4gVGhlIGZpbGUgZXhwci5oIGRlZmluZXMgYSBkZWZpbml0aW9uIHRoYXQgaXMgdXN1YWxseSBhcHByb3ByaWF0ZSwKKyAgIHJlZmVyIHRvIGV4cHIuaCBmb3IgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uLgorKi8KK2Jvb2wKK2F2cjMyX211c3RfcGFzc19pbl9zdGFjayAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSBBVFRSSUJVVEVfVU5VU0VELCB0cmVlIHR5cGUpCit7CisgIGlmICh0eXBlICYmIEFHR1JFR0FURV9UWVBFX1AgKHR5cGUpCisgICAgICAvKiBJZiB0aGUgYWxpZ25tZW50IGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSB0aGVuIHBhc3MgaW4gdGhlIHN0cnVjdCBvbgorICAgICAgICAgdGhlIHN0YWNrLiAqLworICAgICAgJiYgKCh1bnNpZ25lZCBpbnQpIFRZUEVfQUxJR05fVU5JVCAodHlwZSkgPAorCSAgKHVuc2lnbmVkIGludCkgaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpKQorICAgICAgLyogSWYgd2Ugc3VwcG9ydCB1bmFsaWduZWQgd29yZCBhY2Nlc3NlcyB0aGVuIHN0cnVjdHMgb2Ygc2l6ZSA0IGFuZCA4CisgICAgICAgICBjYW4gaGF2ZSBhbnkgYWxpZ25tZW50IGFuZCBzdGlsbCBiZSBwYXNzZWQgaW4gcmVnaXN0ZXJzLiAqLworICAgICAgJiYgIShUQVJHRVRfVU5BTElHTkVEX1dPUkQKKwkgICAmJiAoaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpID09IDQKKwkgICAgICAgfHwgaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpID09IDgpKQorICAgICAgLyogRG91YmxlIHdvcmQgc3RydWN0cyBuZWVkIG9ubHkgYSB3b3JkIGFsaWdubWVudC4gKi8KKyAgICAgICYmICEoaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpID09IDggJiYgVFlQRV9BTElHTl9VTklUICh0eXBlKSA+PSA0KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAodHlwZSAmJiBBR0dSRUdBVEVfVFlQRV9QICh0eXBlKQorICAgICAgLyogU3RydWN0cyBvZiBzaXplIDMsNSw2LDcgYXJlIGFsd2F5cyBwYXNzZWQgaW4gcmVnaXN0ZXJzLiAqLworICAgICAgJiYgKGludF9zaXplX2luX2J5dGVzICh0eXBlKSA9PSAzCisJICB8fCBpbnRfc2l6ZV9pbl9ieXRlcyAodHlwZSkgPT0gNQorCSAgfHwgaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpID09IDYgfHwgaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpID09IDcpKQorICAgIHJldHVybiB0cnVlOworCisKKyAgcmV0dXJuICh0eXBlICYmIFRSRUVfQUREUkVTU0FCTEUgKHR5cGUpKTsKK30KKworCitib29sCithdnIzMl9zdHJpY3RfYXJndW1lbnRfbmFtaW5nIChDVU1VTEFUSVZFX0FSR1MgKiBjYSBBVFRSSUJVVEVfVU5VU0VEKQoreworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAgIFRoaXMgdGFyZ2V0IGhvb2sgc2hvdWxkIHJldHVybiB0cnVlIGlmIGFuIGFyZ3VtZW50IGF0IHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQKKyAgIGJ5IGN1bSBzaG91bGQgYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gVGhpcyBwcmVkaWNhdGUgaXMgcXVlcmllZCBhZnRlciB0YXJnZXQKKyAgIGluZGVwZW5kZW50IHJlYXNvbnMgZm9yIGJlaW5nIHBhc3NlZCBieSByZWZlcmVuY2UsIHN1Y2ggYXMgVFJFRV9BRERSRVNTQUJMRSAodHlwZSkuCisKKyAgIElmIHRoZSBob29rIHJldHVybnMgdHJ1ZSwgYSBjb3B5IG9mIHRoYXQgYXJndW1lbnQgaXMgbWFkZSBpbiBtZW1vcnkgYW5kIGEKKyAgIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGlzIHBhc3NlZCBpbnN0ZWFkIG9mIHRoZSBhcmd1bWVudCBpdHNlbGYuIFRoZSBwb2ludGVyCisgICBpcyBwYXNzZWQgaW4gd2hhdGV2ZXIgd2F5IGlzIGFwcHJvcHJpYXRlIGZvciBwYXNzaW5nIGEgcG9pbnRlciB0byB0aGF0IHR5cGUuCisqLworYm9vbAorYXZyMzJfcGFzc19ieV9yZWZlcmVuY2UgKENVTVVMQVRJVkVfQVJHUyAqIGN1bSBBVFRSSUJVVEVfVU5VU0VELAorCQkJIGVudW0gbWFjaGluZV9tb2RlIG1vZGUgQVRUUklCVVRFX1VOVVNFRCwKKwkJCSB0cmVlIHR5cGUsIGJvb2wgbmFtZWQgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgcmV0dXJuICh0eXBlICYmIChUUkVFX0NPREUgKFRZUEVfU0laRSAodHlwZSkpICE9IElOVEVHRVJfQ1NUKSk7Cit9CisKK3N0YXRpYyBpbnQKK2F2cjMyX2FyZ19wYXJ0aWFsX2J5dGVzIChDVU1VTEFUSVZFX0FSR1MgKiBwY3VtIEFUVFJJQlVURV9VTlVTRUQsCisJCQkgZW51bSBtYWNoaW5lX21vZGUgbW9kZSBBVFRSSUJVVEVfVU5VU0VELAorCQkJIHRyZWUgdHlwZSBBVFRSSUJVVEVfVU5VU0VELAorCQkJIGJvb2wgbmFtZWQgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGdjY190YXJnZXQgdGFyZ2V0bSA9IFRBUkdFVF9JTklUSUFMSVpFUjsKKworLyoKKyAgVGFibGUgdXNlZCB0byBjb252ZXJ0IGZyb20gcmVnaXN0ZXIgbnVtYmVyIGluIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zIGFuZAorICB0aGUgcmVnaXN0ZXIgbnVtYmVycyB1c2VkIGluIGdjYy4KKyovCitjb25zdCBpbnQgYXZyMzJfZnVuY3Rpb25fYXJnX3JlZ2xpc3RbXSA9IHsKKyAgSU5URVJOQUxfUkVHTlVNICgxMiksCisgIElOVEVSTkFMX1JFR05VTSAoMTEpLAorICBJTlRFUk5BTF9SRUdOVU0gKDEwKSwKKyAgSU5URVJOQUxfUkVHTlVNICg5KSwKKyAgSU5URVJOQUxfUkVHTlVNICg4KQorfTsKKworcnR4IGF2cjMyX2NvbXBhcmVfb3AwID0gTlVMTF9SVFg7CitydHggYXZyMzJfY29tcGFyZV9vcDEgPSBOVUxMX1JUWDsKK3J0eCBhdnIzMl9jb21wYXJlX29wZXJhdG9yID0gTlVMTF9SVFg7CitydHggYXZyMzJfYWNjX2NhY2hlID0gTlVMTF9SVFg7CisKKy8qCisgIFJldHVybnMgbm9uemVybyBpZiBpdCBpcyBhbGxvd2VkIHRvIHN0b3JlIGEgdmFsdWUgb2YgbW9kZSBtb2RlIGluIGhhcmQKKyAgcmVnaXN0ZXIgbnVtYmVyIHJlZ25vLgorKi8KK2ludAorYXZyMzJfaGFyZF9yZWdub19tb2RlX29rIChpbnQgcmVnbnIsIGVudW0gbWFjaGluZV9tb2RlIG1vZGUpCit7CisgIC8qIFdlIGFsbG93IG9ubHkgZmxvYXQgbW9kZXMgaW4gdGhlIGZwLXJlZ2lzdGVycyAqLworICBpZiAocmVnbnIgPj0gRklSU1RfRlBfUkVHTlVNCisgICAgICAmJiByZWduciA8PSBMQVNUX0ZQX1JFR05VTSAmJiBHRVRfTU9ERV9DTEFTUyAobW9kZSkgIT0gTU9ERV9GTE9BVCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3dpdGNoIChtb2RlKQorICAgIHsKKyAgICBjYXNlIERJbW9kZToJCS8qIGxvbmcgbG9uZyAqLworICAgIGNhc2UgREZtb2RlOgkJLyogZG91YmxlICovCisgICAgY2FzZSBTQ21vZGU6CQkvKiBfX2NvbXBsZXhfXyBmbG9hdCAqLworICAgIGNhc2UgQ1NJbW9kZToJCS8qIF9fY29tcGxleF9fIGludCAqLworICAgICAgaWYgKHJlZ25yIDwgNCkKKwl7CQkJLyogbG9uZyBsb25nIGludCBub3Qgc3VwcG9ydGVkIGluIHIxMiwgc3AsIGxyCisJCQkJICAgb3IgcGMuICovCisJICByZXR1cm4gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHJlZ25yICUgMikJLyogbG9uZyBsb25nIGludCBoYXMgdG8gYmUgcmVmZXJlZCBpbiBldmVuCisJCQkJICAgcmVnaXN0ZXJzLiAqLworCSAgICByZXR1cm4gMDsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIGNhc2UgQ0RJbW9kZToJCS8qIF9fY29tcGxleF9fIGxvbmcgbG9uZyAqLworICAgIGNhc2UgRENtb2RlOgkJLyogX19jb21wbGV4X18gZG91YmxlICovCisgICAgY2FzZSBUSW1vZGU6CQkvKiAxNiBieXRlcyAqLworICAgICAgaWYgKHJlZ25yIDwgNykKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UgaWYgKHJlZ25yICUgMikKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKK2ludAorYXZyMzJfcm5kX29wZXJhbmRzIChydHggYWRkLCBydHggc2hpZnQpCit7CisgIGlmIChHRVRfQ09ERSAoc2hpZnQpID09IENPTlNUX0lOVCAmJgorICAgICAgR0VUX0NPREUgKGFkZCkgPT0gQ09OU1RfSU5UICYmIElOVFZBTCAoc2hpZnQpID4gMCkKKyAgICB7CisgICAgICBpZiAoKDEgPDwgKElOVFZBTCAoc2hpZnQpIC0gMSkpID09IElOVFZBTCAoYWRkKSkKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKworaW50CithdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChIT1NUX1dJREVfSU5UIHZhbHVlLCBjaGFyIGMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlICdLJzoKKyAgICBjYXNlICdJJzoKKyAgICAgIHsKKwlIT1NUX1dJREVfSU5UIG1pbl92YWx1ZSA9IDAsIG1heF92YWx1ZSA9IDA7CisJY2hhciBzaXplX3N0clszXTsKKwlpbnQgY29uc3Rfc2l6ZTsKKworCXNpemVfc3RyWzBdID0gc3RyWzJdOworCXNpemVfc3RyWzFdID0gc3RyWzNdOworCXNpemVfc3RyWzJdID0gJ1wwJzsKKwljb25zdF9zaXplID0gYXRvaSAoc2l6ZV9zdHIpOworCisJaWYgKHRvdXBwZXIgKHN0clsxXSkgPT0gJ1UnKQorCSAgeworCSAgICBtaW5fdmFsdWUgPSAwOworCSAgICBtYXhfdmFsdWUgPSAoMSA8PCBjb25zdF9zaXplKSAtIDE7CisJICB9CisJZWxzZSBpZiAodG91cHBlciAoc3RyWzFdKSA9PSAnUycpCisJICB7CisJICAgIG1pbl92YWx1ZSA9IC0oMSA8PCAoY29uc3Rfc2l6ZSAtIDEpKTsKKwkgICAgbWF4X3ZhbHVlID0gKDEgPDwgKGNvbnN0X3NpemUgLSAxKSkgLSAxOworCSAgfQorCisJaWYgKGMgPT0gJ0knKQorCSAgeworCSAgICB2YWx1ZSA9IC12YWx1ZTsKKwkgIH0KKworCWlmICh2YWx1ZSA+PSBtaW5fdmFsdWUgJiYgdmFsdWUgPD0gbWF4X3ZhbHVlKQorCSAgeworCSAgICByZXR1cm4gMTsKKwkgIH0KKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlICdNJzoKKyAgICAgIHJldHVybiBhdnIzMl9tYXNrX3VwcGVyX2JpdHNfb3BlcmFuZCAoR0VOX0lOVCAodmFsdWUpLCBWT0lEbW9kZSk7CisgICAgY2FzZSAnSic6CisgICAgICByZXR1cm4gYXZyMzJfaGkxNl9pbW1lZGlhdGVfb3BlcmFuZCAoR0VOX0lOVCAodmFsdWUpLCBWT0lEbW9kZSk7CisgICAgY2FzZSAnTyc6CisgICAgICByZXR1cm4gb25lX2JpdF9zZXRfb3BlcmFuZCAoR0VOX0lOVCAodmFsdWUpLCBWT0lEbW9kZSk7CisgICAgY2FzZSAnTic6CisgICAgICByZXR1cm4gb25lX2JpdF9jbGVhcmVkX29wZXJhbmQgKEdFTl9JTlQgKHZhbHVlKSwgVk9JRG1vZGUpOworICAgIGNhc2UgJ0wnOgorICAgICAgLyogVGhlIGxvd2VyIDE2LWJpdHMgYXJlIHNldC4gKi8KKyAgICAgIHJldHVybiAoKHZhbHVlICYgMHhmZmZmKSA9PSAweGZmZmYpIDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLypDb21wdXRlIG1hc2sgb2Ygd2hpY2ggZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzIG5lZWRzIHNhdmluZyB1cG9uCisgIGVudHJ5IHRvIHRoaXMgZnVuY3Rpb24qLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2F2cjMyX2NvbXB1dGVfc2F2ZV9mcF9yZWdfbWFzayAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyBmdW5jX3R5cGUgPSBhdnIzMl9jdXJyZW50X2Z1bmNfdHlwZSAoKTsKKyAgdW5zaWduZWQgaW50IHNhdmVfcmVnX21hc2sgPSAwOworICB1bnNpZ25lZCBpbnQgcmVnOworICB1bnNpZ25lZCBpbnQgbWF4X3JlZyA9IDc7CisgIGludCBzYXZlX2FsbF9jYWxsX3VzZWRfcmVncyA9IEZBTFNFOworCisgIC8qIFRoaXMgb25seSBhcHBsaWVzIGZvciBoYXJkd2FyZSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbi4gKi8KKyAgaWYgKCFUQVJHRVRfSEFSRF9GTE9BVCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoSVNfSU5URVJSVVBUIChmdW5jX3R5cGUpKQorICAgIHsKKworICAgICAgLyogSW50ZXJydXB0IGZ1bmN0aW9ucyBtdXN0IG5vdCBjb3JydXB0IGFueSByZWdpc3RlcnMsIGV2ZW4gY2FsbAorICAgICAgICAgY2xvYmJlcmVkIG9uZXMuICBJZiB0aGlzIGlzIGEgbGVhZiBmdW5jdGlvbiB3ZSBjYW4ganVzdCBleGFtaW5lIHRoZQorICAgICAgICAgcmVnaXN0ZXJzIHVzZWQgYnkgdGhlIFJUTCwgYnV0IG90aGVyd2lzZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0CisgICAgICAgICB3aGF0ZXZlciBmdW5jdGlvbiBpcyBjYWxsZWQgbWlnaHQgY2xvYmJlciBhbnl0aGluZywgYW5kIHNvIHdlIGhhdmUKKyAgICAgICAgIHRvIHNhdmUgYWxsIHRoZSBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMgYXMgd2VsbC4gICovCisgICAgICBtYXhfcmVnID0gMTM7CisgICAgICBzYXZlX2FsbF9jYWxsX3VzZWRfcmVncyA9ICFjdXJyZW50X2Z1bmN0aW9uX2lzX2xlYWY7CisgICAgfQorCisgIC8qIEFsbCB1c2VkIHJlZ2lzdGVycyB1c2VkIG11c3QgYmUgc2F2ZWQgKi8KKyAgZm9yIChyZWcgPSAwOyByZWcgPD0gbWF4X3JlZzsgcmVnKyspCisgICAgaWYgKHJlZ3NfZXZlcl9saXZlW0lOVEVSTkFMX0ZQX1JFR05VTSAocmVnKV0KKwl8fCAoc2F2ZV9hbGxfY2FsbF91c2VkX3JlZ3MKKwkgICAgJiYgY2FsbF91c2VkX3JlZ3NbSU5URVJOQUxfRlBfUkVHTlVNIChyZWcpXSkpCisgICAgICBzYXZlX3JlZ19tYXNrIHw9ICgxIDw8IHJlZyk7CisKKyAgcmV0dXJuIHNhdmVfcmVnX21hc2s7Cit9CisKKy8qQ29tcHV0ZSBtYXNrIG9mIHJlZ2lzdGVycyB3aGljaCBuZWVkcyBzYXZpbmcgdXBvbiBmdW5jdGlvbiBlbnRyeSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2F2cjMyX2NvbXB1dGVfc2F2ZV9yZWdfbWFzayAoaW50IHB1c2gpCit7CisgIHVuc2lnbmVkIGxvbmcgZnVuY190eXBlOworICB1bnNpZ25lZCBpbnQgc2F2ZV9yZWdfbWFzayA9IDA7CisgIHVuc2lnbmVkIGludCByZWc7CisKKyAgZnVuY190eXBlID0gYXZyMzJfY3VycmVudF9mdW5jX3R5cGUgKCk7CisKKyAgaWYgKElTX0lOVEVSUlVQVCAoZnVuY190eXBlKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbWF4X3JlZyA9IDEyOworCisKKyAgICAgIC8qIEdldCB0aGUgYmFua2luZyBzY2hlbWUgZm9yIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICAgIHN3aXRjaCAoZnVuY190eXBlKQorCXsKKwljYXNlIEFWUjMyX0ZUX0lTUl9GVUxMOgorCSAgbWF4X3JlZyA9IDA7CisJICBicmVhazsKKwljYXNlIEFWUjMyX0ZUX0lTUl9IQUxGOgorCSAgbWF4X3JlZyA9IDc7CisJICBicmVhazsKKwljYXNlIEFWUjMyX0ZUX0lTUl9OT05FOgorCSAgbWF4X3JlZyA9IDEyOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBJbnRlcnJ1cHQgZnVuY3Rpb25zIG11c3Qgbm90IGNvcnJ1cHQgYW55IHJlZ2lzdGVycywgZXZlbiBjYWxsCisgICAgICAgICBjbG9iYmVyZWQgb25lcy4gIElmIHRoaXMgaXMgYSBsZWFmIGZ1bmN0aW9uIHdlIGNhbiBqdXN0IGV4YW1pbmUgdGhlCisgICAgICAgICByZWdpc3RlcnMgdXNlZCBieSB0aGUgUlRMLCBidXQgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQKKyAgICAgICAgIHdoYXRldmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBtaWdodCBjbG9iYmVyIGFueXRoaW5nLCBhbmQgc28gd2UgaGF2ZQorICAgICAgICAgdG8gc2F2ZSBhbGwgdGhlIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyBhcyB3ZWxsLiAgKi8KKworICAgICAgLyogTmVlZCBub3QgcHVzaCB0aGUgcmVnaXN0ZXJzIHI4LXIxMiBmb3IgQVZSMzJBIGFyY2hpdGVjdHVyZXMsIGFzIHRoaXMKKyAgICAgICAgIGlzIGF1dG9tYXRpYWxseSBkb25lIGluIGhhcmR3YXJlLiBXZSBhbHNvIGRvIG5vdCBoYXZlIGFueSBzaGFkb3cKKyAgICAgICAgIHJlZ2lzdGVycy4gKi8KKyAgICAgIGlmIChUQVJHRVRfVUFSQ0hfQVZSMzJBKQorCXsKKwkgIG1heF9yZWcgPSA3OworCSAgZnVuY190eXBlID0gQVZSMzJfRlRfSVNSX05PTkU7CisJfQorCisgICAgICAvKiBBbGwgcmVnaXN0ZXJzIHdoaWNoIGFyZSB1c2VkIGFuZCBpcyBub3Qgc2hhZG93ZWQgbXVzdCBiZSBzYXZlZCAqLworICAgICAgZm9yIChyZWcgPSAwOyByZWcgPD0gbWF4X3JlZzsgcmVnKyspCisJaWYgKHJlZ3NfZXZlcl9saXZlW0lOVEVSTkFMX1JFR05VTSAocmVnKV0KKwkgICAgfHwgKCFjdXJyZW50X2Z1bmN0aW9uX2lzX2xlYWYKKwkJJiYgY2FsbF91c2VkX3JlZ3NbSU5URVJOQUxfUkVHTlVNIChyZWcpXSkpCisJICBzYXZlX3JlZ19tYXNrIHw9ICgxIDw8IHJlZyk7CisKKyAgICAgIC8qIENoZWNrIExSICovCisgICAgICBpZiAoKHJlZ3NfZXZlcl9saXZlW0xSX1JFR05VTV0KKwkgICB8fCAhY3VycmVudF9mdW5jdGlvbl9pc19sZWFmIHx8IGZyYW1lX3BvaW50ZXJfbmVlZGVkKQorCSAgLyogT25seSBub24tc2hhZG93ZWQgcmVnaXN0ZXIgbW9kZWxzICovCisJICAmJiAoZnVuY190eXBlID09IEFWUjMyX0ZUX0lTUl9OT05FKSkKKwlzYXZlX3JlZ19tYXNrIHw9ICgxIDw8IEFTTV9SRUdOVU0gKExSX1JFR05VTSkpOworCisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgR09UIHJlZ2lzdGVyIGlzIHB1c2hlZC4gKi8KKyAgICAgIGlmIChtYXhfcmVnID49IEFTTV9SRUdOVU0gKFBJQ19PRkZTRVRfVEFCTEVfUkVHTlVNKQorCSAgJiYgY3VycmVudF9mdW5jdGlvbl91c2VzX3BpY19vZmZzZXRfdGFibGUpCisJc2F2ZV9yZWdfbWFzayB8PSAoMSA8PCBBU01fUkVHTlVNIChQSUNfT0ZGU0VUX1RBQkxFX1JFR05VTSkpOworCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IHVzZV9wdXNobSA9IG9wdGltaXplX3NpemU7CisKKyAgICAgIC8qIEluIHRoZSBub3JtYWwgY2FzZSB3ZSBvbmx5IG5lZWQgdG8gc2F2ZSB0aG9zZSByZWdpc3RlcnMgd2hpY2ggYXJlCisgICAgICAgICBjYWxsIHNhdmVkIGFuZCB3aGljaCBhcmUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGZvciAocmVnID0gMDsgcmVnIDw9IDc7IHJlZysrKQorCWlmIChyZWdzX2V2ZXJfbGl2ZVtJTlRFUk5BTF9SRUdOVU0gKHJlZyldCisJICAgICYmICFjYWxsX3VzZWRfcmVnc1tJTlRFUk5BTF9SRUdOVU0gKHJlZyldKQorCSAgc2F2ZV9yZWdfbWFzayB8PSAoMSA8PCByZWcpOworCisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgR09UIHJlZ2lzdGVyIGlzIHB1c2hlZC4gKi8KKyAgICAgIGlmIChjdXJyZW50X2Z1bmN0aW9uX3VzZXNfcGljX29mZnNldF90YWJsZSkKKwlzYXZlX3JlZ19tYXNrIHw9ICgxIDw8IEFTTV9SRUdOVU0gKFBJQ19PRkZTRVRfVEFCTEVfUkVHTlVNKSk7CisKKworICAgICAgLyogSWYgd2Ugb3B0aW1pemUgZm9yIHNpemUgYW5kIGRvIG5vdCBoYXZlIGFub255bW91cyBhcmd1bWVudHM6IHVzZQorICAgICAgICAgcG9wbS9wdXNobSBhbHdheXMgKi8KKyAgICAgIGlmICh1c2VfcHVzaG0pCisJeworCSAgaWYgKChzYXZlX3JlZ19tYXNrICYgKDEgPDwgMCkpCisJICAgICAgfHwgKHNhdmVfcmVnX21hc2sgJiAoMSA8PCAxKSkKKwkgICAgICB8fCAoc2F2ZV9yZWdfbWFzayAmICgxIDw8IDIpKSB8fCAoc2F2ZV9yZWdfbWFzayAmICgxIDw8IDMpKSkKKwkgICAgc2F2ZV9yZWdfbWFzayB8PSAweGY7CisKKwkgIGlmICgoc2F2ZV9yZWdfbWFzayAmICgxIDw8IDQpKQorCSAgICAgIHx8IChzYXZlX3JlZ19tYXNrICYgKDEgPDwgNSkpCisJICAgICAgfHwgKHNhdmVfcmVnX21hc2sgJiAoMSA8PCA2KSkgfHwgKHNhdmVfcmVnX21hc2sgJiAoMSA8PCA3KSkpCisJICAgIHNhdmVfcmVnX21hc2sgfD0gMHhmMDsKKworCSAgaWYgKChzYXZlX3JlZ19tYXNrICYgKDEgPDwgOCkpIHx8IChzYXZlX3JlZ19tYXNrICYgKDEgPDwgOSkpKQorCSAgICBzYXZlX3JlZ19tYXNrIHw9IDB4MzAwOworCX0KKworCisgICAgICAvKiBDaGVjayBMUiAqLworICAgICAgaWYgKChyZWdzX2V2ZXJfbGl2ZVtMUl9SRUdOVU1dCisJICAgfHwgIWN1cnJlbnRfZnVuY3Rpb25faXNfbGVhZgorCSAgIHx8IChvcHRpbWl6ZV9zaXplCisJICAgICAgICYmIHNhdmVfcmVnX21hc2sKKwkgICAgICAgJiYgIWN1cnJlbnRfZnVuY3Rpb25fY2FsbHNfZWhfcmV0dXJuKSB8fCBmcmFtZV9wb2ludGVyX25lZWRlZCkpCisJeworCSAgaWYgKHB1c2gKKwkgICAgICAvKiBOZXZlciBwb3AgTFIgaW50byBQQyBmb3IgZnVuY3Rpb25zIHdoaWNoCisJICAgICAgICAgY2FsbHMgX19idWlsdGluX2VoX3JldHVybiwgc2luY2Ugd2UgbmVlZCB0bworCSAgICAgICAgIGZpeCB0aGUgU1AgYWZ0ZXIgdGhlIHJlc3RvcmluZyBvZiB0aGUgcmVnaXN0ZXJzCisJICAgICAgICAgYW5kIGJlZm9yZSByZXR1cm5pbmcuICovCisJICAgICAgfHwgY3VycmVudF9mdW5jdGlvbl9jYWxsc19laF9yZXR1cm4pCisJICAgIHsKKwkgICAgICAvKiBQdXNoL1BvcCBMUiAqLworCSAgICAgIHNhdmVfcmVnX21hc2sgfD0gKDEgPDwgQVNNX1JFR05VTSAoTFJfUkVHTlVNKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFBvcCBQQyAqLworCSAgICAgIHNhdmVfcmVnX21hc2sgfD0gKDEgPDwgQVNNX1JFR05VTSAoUENfUkVHTlVNKSk7CisJICAgIH0KKwl9CisgICAgfQorCisKKyAgLyogU2F2ZSByZWdpc3RlcnMgc28gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGNhbiBtb2RpZnkgdGhlbS4gICovCisgIGlmIChjdXJyZW50X2Z1bmN0aW9uX2NhbGxzX2VoX3JldHVybikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDs7IGkrKykKKwl7CisJICByZWcgPSBFSF9SRVRVUk5fREFUQV9SRUdOTyAoaSk7CisJICBpZiAocmVnID09IElOVkFMSURfUkVHTlVNKQorCSAgICBicmVhazsKKwkgIHNhdmVfcmVnX21hc2sgfD0gMSA8PCBBU01fUkVHTlVNIChyZWcpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHNhdmVfcmVnX21hc2s7Cit9CisKKy8qQ29tcHV0ZSB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIGFsbCBzYXZlZCByZWdpc3RlcnMgICovCitzdGF0aWMgaW50CithdnIzMl9nZXRfcmVnX21hc2tfc2l6ZSAoaW50IHJlZ19tYXNrKQoreworICBpbnQgcmVnLCBzaXplOworICBzaXplID0gMDsKKworICBmb3IgKHJlZyA9IDA7IHJlZyA8PSAxNTsgcmVnKyspCisgICAgaWYgKHJlZ19tYXNrICYgKDEgPDwgcmVnKSkKKyAgICAgIHNpemUgKz0gNDsKKworICByZXR1cm4gc2l6ZTsKK30KKworLypHZXQgYSByZWdpc3RlciBmcm9tIG9uZSBvZiB0aGUgcmVnaXN0ZXJzIHdoaWNoIGFyZSBzYXZlZCBvbnRvIHRoZSBzdGFjaworICB1cG9uIGZ1bmN0aW9uIGVudHJ5ICovCisKK3N0YXRpYyBpbnQKK2F2cjMyX2dldF9zYXZlZF9yZWcgKGludCBzYXZlX3JlZ19tYXNrKQoreworICB1bnNpZ25lZCBpbnQgcmVnOworCisgIC8qIEZpbmQgdGhlIGZpcnN0IHJlZ2lzdGVyIHdoaWNoIGlzIHNhdmVkIGluIHRoZSBzYXZlZF9yZWdfbWFzayAqLworICBmb3IgKHJlZyA9IDA7IHJlZyA8PSAxNTsgcmVnKyspCisgICAgaWYgKHNhdmVfcmVnX21hc2sgJiAoMSA8PCByZWcpKQorICAgICAgcmV0dXJuIHJlZzsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIFJldHVybiAxIGlmIGl0IGlzIHBvc3NpYmxlIHRvIHJldHVybiB1c2luZyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gICovCitpbnQKK2F2cjMyX3VzZV9yZXR1cm5faW5zbiAoaW50IGlzY29uZCkKK3sKKyAgdW5zaWduZWQgaW50IGZ1bmNfdHlwZSA9IGF2cjMyX2N1cnJlbnRfZnVuY190eXBlICgpOworICB1bnNpZ25lZCBsb25nIHNhdmVkX2ludF9yZWdzOworICB1bnNpZ25lZCBsb25nIHNhdmVkX2ZwX3JlZ3M7CisKKyAgLyogTmV2ZXIgdXNlIGEgcmV0dXJuIGluc3RydWN0aW9uIGJlZm9yZSByZWxvYWQgaGFzIHJ1bi4gICovCisgIGlmICghcmVsb2FkX2NvbXBsZXRlZCkKKyAgICByZXR1cm4gMDsKKworICAvKiBNdXN0IGFkanVzdCB0aGUgc3RhY2sgZm9yIHZhcmFyZyBmdW5jdGlvbnMuICovCisgIGlmIChjdXJyZW50X2Z1bmN0aW9uX2FyZ3NfaW5mby51c2VzX2Fub255bW91c19hcmdzKQorICAgIHJldHVybiAwOworCisgIC8qIElmIHRoZXJlIGEgc3RhY2sgYWRqc3RtZW50LiAgKi8KKyAgaWYgKGdldF9mcmFtZV9zaXplICgpKQorICAgIHJldHVybiAwOworCisgIHNhdmVkX2ludF9yZWdzID0gYXZyMzJfY29tcHV0ZV9zYXZlX3JlZ19tYXNrIChUUlVFKTsKKyAgc2F2ZWRfZnBfcmVncyA9IGF2cjMyX2NvbXB1dGVfc2F2ZV9mcF9yZWdfbWFzayAoKTsKKworICAvKiBGdW5jdGlvbnMgd2hpY2ggaGF2ZSBzYXZlZCBmcC1yZWdzIG9uIHRoZSBzdGFjayBjYW4gbm90IGJlIHBlcmZvcm1lZCBpbgorICAgICBvbmUgaW5zdHJ1Y3Rpb24gKi8KKyAgaWYgKHNhdmVkX2ZwX3JlZ3MpCisgICAgcmV0dXJuIDA7CisKKyAgLyogQ29uZGl0aW9uYWwgcmV0dXJucyBjYW4gbm90IGJlIHBlcmZvcm1lZCBpbiBvbmUgaW5zdHJ1Y3Rpb24gaWYgd2UgbmVlZAorICAgICB0byByZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBzdGFjayAqLworICBpZiAoaXNjb25kICYmIHNhdmVkX2ludF9yZWdzKQorICAgIHJldHVybiAwOworCisgIC8qIENvbmRpdGlvbmFsIHJldHVybiBjYW4gbm90IGJlIHVzZWQgZm9yIGludGVycnVwdCBoYW5kbGVycy4gKi8KKyAgaWYgKGlzY29uZCAmJiBJU19JTlRFUlJVUFQgKGZ1bmNfdHlwZSkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogRm9yIGludGVycnVwdCBoYW5kbGVycyB3aGljaCBuZWVkcyB0byBwb3AgcmVnaXN0ZXJzICovCisgIGlmIChzYXZlZF9pbnRfcmVncyAmJiBJU19JTlRFUlJVUFQgKGZ1bmNfdHlwZSkpCisgICAgcmV0dXJuIDA7CisKKworICAvKiBJZiB0aGVyZSBhcmUgc2F2ZWQgcmVnaXN0ZXJzIGJ1dCB0aGUgTFIgaXNuJ3Qgc2F2ZWQsIHRoZW4gd2UgbmVlZCB0d28KKyAgICAgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcmV0dXJuLiAgKi8KKyAgaWYgKHNhdmVkX2ludF9yZWdzICYmICEoc2F2ZWRfaW50X3JlZ3MgJiAoMSA8PCBBU01fUkVHTlVNIChMUl9SRUdOVU0pKSkpCisgICAgcmV0dXJuIDA7CisKKworICByZXR1cm4gMTsKK30KKworCisvKkdlbmVyYXRlIHNvbWUgZnVuY3Rpb24gcHJvbG9ndWUgaW5mbyBpbiB0aGUgYXNzZW1ibHkgZmlsZSovCisKK3ZvaWQKK2F2cjMyX3RhcmdldF9hc21fZnVuY3Rpb25fcHJvbG9ndWUgKEZJTEUgKiBmLCBIT1NUX1dJREVfSU5UIGZyYW1lX3NpemUpCit7CisgIGlmIChJU19OQUtFRCAoYXZyMzJfY3VycmVudF9mdW5jX3R5cGUgKCkpKQorICAgIGZwcmludGYgKGYsCisJICAgICAiXHQjIEZ1bmN0aW9uIGlzIG5ha2VkOiBQcm9sb2d1ZSBhbmQgZXBpbG9ndWUgcHJvdmlkZWQgYnkgcHJvZ3JhbW1lclxuIik7CisKKyAgaWYgKElTX0lOVEVSUlVQVCAoYXZyMzJfY3VycmVudF9mdW5jX3R5cGUgKCkpKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYXZyMzJfY3VycmVudF9mdW5jX3R5cGUgKCkpCisJeworCWNhc2UgQVZSMzJfRlRfSVNSX0ZVTEw6CisJICBmcHJpbnRmIChmLAorCQkgICAiXHQjIEludGVycnVwdCBGdW5jdGlvbjogRnVsbHkgc2hhZG93ZWQgcmVnaXN0ZXIgZmlsZVxuIik7CisJICBicmVhazsKKwljYXNlIEFWUjMyX0ZUX0lTUl9IQUxGOgorCSAgZnByaW50ZiAoZiwKKwkJICAgIlx0IyBJbnRlcnJ1cHQgRnVuY3Rpb246IEhhbGYgc2hhZG93ZWQgcmVnaXN0ZXIgZmlsZVxuIik7CisJICBicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgQVZSMzJfRlRfSVNSX05PTkU6CisJICBmcHJpbnRmIChmLCAiXHQjIEludGVycnVwdCBGdW5jdGlvbjogTm8gc2hhZG93ZWQgcmVnaXN0ZXIgZmlsZVxuIik7CisJICBicmVhazsKKwl9CisgICAgfQorCisKKyAgZnByaW50ZiAoZiwgIlx0IyBhcmdzID0gJWksIGZyYW1lID0gJWxpLCBwcmV0ZW5kID0gJWlcbiIsCisJICAgY3VycmVudF9mdW5jdGlvbl9hcmdzX3NpemUsIGZyYW1lX3NpemUsCisJICAgY3VycmVudF9mdW5jdGlvbl9wcmV0ZW5kX2FyZ3Nfc2l6ZSk7CisKKyAgZnByaW50ZiAoZiwgIlx0IyBmcmFtZV9uZWVkZWQgPSAlaSwgbGVhZl9mdW5jdGlvbiA9ICVpXG4iLAorCSAgIGZyYW1lX3BvaW50ZXJfbmVlZGVkLCBjdXJyZW50X2Z1bmN0aW9uX2lzX2xlYWYpOworCisgIGZwcmludGYgKGYsICJcdCMgdXNlc19hbm9ueW1vdXNfYXJncyA9ICVpXG4iLAorCSAgIGN1cnJlbnRfZnVuY3Rpb25fYXJnc19pbmZvLnVzZXNfYW5vbnltb3VzX2FyZ3MpOworICBpZiAoY3VycmVudF9mdW5jdGlvbl9jYWxsc19laF9yZXR1cm4pCisgICAgZnByaW50ZiAoZiwgIlx0IyBDYWxscyBfX2J1aWx0aW5fZWhfcmV0dXJuLlxuIik7CisKK30KKworCisvKiBHZW5lcmF0ZSBhbmQgZW1pdCBhbiBpbnNuIHRoYXQgd2Ugd2lsbCByZWNvZ25pemUgYXMgYSBwdXNobSBvciBzdG0uCisgICBVbmZvcnR1bmF0ZWx5LCBzaW5jZSB0aGlzIGluc24gZG9lcyBub3QgcmVmbGVjdCB2ZXJ5IHdlbGwgdGhlIGFjdHVhbAorICAgc2VtYW50aWNzIG9mIHRoZSBvcGVyYXRpb24sIHdlIG5lZWQgdG8gYW5ub3RhdGUgdGhlIGluc24gZm9yIHRoZSBiZW5lZml0CisgICBvZiBEV0FSRjIgZnJhbWUgdW53aW5kIGluZm9ybWF0aW9uLiAgKi8KKworaW50IGF2cjMyX2NvbnZlcnRfdG9fcmVnbGlzdDE2IChpbnQgcmVnbGlzdDhfdmVjdCk7CisKK3N0YXRpYyBydHgKK2VtaXRfbXVsdGlfcmVnX3B1c2ggKGludCByZWdsaXN0LCBpbnQgdXNlUFVTSE0pCit7CisgIHJ0eCBpbnNuOworICBydHggZHdhcmY7CisgIHJ0eCB0bXA7CisgIHJ0eCByZWc7CisgIGludCBpOworICBpbnQgbnJfcmVnczsKKyAgaW50IGluZGV4ID0gMDsKKworICBpZiAodXNlUFVTSE0pCisgICAgeworICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3B1c2htIChnZW5fcnR4X0NPTlNUX0lOVCAoU0ltb2RlLCByZWdsaXN0KSkpOworICAgICAgcmVnbGlzdCA9IGF2cjMyX2NvbnZlcnRfdG9fcmVnbGlzdDE2IChyZWdsaXN0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnNuID0gZW1pdF9pbnNuIChnZW5fc3RtIChzdGFja19wb2ludGVyX3J0eCwKKwkJCQkgZ2VuX3J0eF9DT05TVF9JTlQgKFNJbW9kZSwgcmVnbGlzdCksCisJCQkJIGdlbl9ydHhfQ09OU1RfSU5UIChTSW1vZGUsIDEpKSk7CisgICAgfQorCisgIG5yX3JlZ3MgPSBhdnIzMl9nZXRfcmVnX21hc2tfc2l6ZSAocmVnbGlzdCkgLyA0OworICBkd2FyZiA9IGdlbl9ydHhfU0VRVUVOQ0UgKFZPSURtb2RlLCBydHZlY19hbGxvYyAobnJfcmVncyArIDEpKTsKKworICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgaWYgKHJlZ2xpc3QgJiAoMSA8PCBpKSkKKwl7CisJICByZWcgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBJTlRFUk5BTF9SRUdOVU0gKGkpKTsKKwkgIHRtcCA9IGdlbl9ydHhfU0VUIChWT0lEbW9kZSwKKwkJCSAgICAgZ2VuX3J0eF9NRU0gKFNJbW9kZSwKKwkJCQkJICBwbHVzX2NvbnN0YW50IChzdGFja19wb2ludGVyX3J0eCwKKwkJCQkJCQkgNCAqIGluZGV4KSksIHJlZyk7CisJICBSVFhfRlJBTUVfUkVMQVRFRF9QICh0bXApID0gMTsKKwkgIFhWRUNFWFAgKGR3YXJmLCAwLCAxICsgaW5kZXgrKykgPSB0bXA7CisJfQorICAgIH0KKworICB0bXAgPSBnZW5fcnR4X1NFVCAoU0ltb2RlLAorCQkgICAgIHN0YWNrX3BvaW50ZXJfcnR4LAorCQkgICAgIGdlbl9ydHhfUExVUyAoU0ltb2RlLAorCQkJCSAgIHN0YWNrX3BvaW50ZXJfcnR4LAorCQkJCSAgIEdFTl9JTlQgKC00ICogbnJfcmVncykpKTsKKyAgUlRYX0ZSQU1FX1JFTEFURURfUCAodG1wKSA9IDE7CisgIFhWRUNFWFAgKGR3YXJmLCAwLCAwKSA9IHRtcDsKKyAgUkVHX05PVEVTIChpbnNuKSA9IGdlbl9ydHhfRVhQUl9MSVNUIChSRUdfRlJBTUVfUkVMQVRFRF9FWFBSLCBkd2FyZiwKKwkJCQkJUkVHX05PVEVTIChpbnNuKSk7CisgIHJldHVybiBpbnNuOworfQorCisKK3N0YXRpYyBydHgKK2VtaXRfbXVsdGlfZnBfcmVnX3B1c2ggKGludCByZWdsaXN0KQoreworICBydHggaW5zbjsKKyAgcnR4IGR3YXJmOworICBydHggdG1wOworICBydHggcmVnOworICBpbnQgaTsKKyAgaW50IG5yX3JlZ3M7CisgIGludCBpbmRleCA9IDA7CisKKyAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3N0bV9mcCAoc3RhY2tfcG9pbnRlcl9ydHgsCisJCQkJZ2VuX3J0eF9DT05TVF9JTlQgKFNJbW9kZSwgcmVnbGlzdCksCisJCQkJZ2VuX3J0eF9DT05TVF9JTlQgKFNJbW9kZSwgMSkpKTsKKworICBucl9yZWdzID0gYXZyMzJfZ2V0X3JlZ19tYXNrX3NpemUgKHJlZ2xpc3QpIC8gNDsKKyAgZHdhcmYgPSBnZW5fcnR4X1NFUVVFTkNFIChWT0lEbW9kZSwgcnR2ZWNfYWxsb2MgKG5yX3JlZ3MgKyAxKSk7CisKKyAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGlmIChyZWdsaXN0ICYgKDEgPDwgaSkpCisJeworCSAgcmVnID0gZ2VuX3J0eF9SRUcgKFNJbW9kZSwgSU5URVJOQUxfRlBfUkVHTlVNIChpKSk7CisJICB0bXAgPSBnZW5fcnR4X1NFVCAoVk9JRG1vZGUsCisJCQkgICAgIGdlbl9ydHhfTUVNIChTSW1vZGUsCisJCQkJCSAgcGx1c19jb25zdGFudCAoc3RhY2tfcG9pbnRlcl9ydHgsCisJCQkJCQkJIDQgKiBpbmRleCkpLCByZWcpOworCSAgUlRYX0ZSQU1FX1JFTEFURURfUCAodG1wKSA9IDE7CisJICBYVkVDRVhQIChkd2FyZiwgMCwgMSArIGluZGV4KyspID0gdG1wOworCX0KKyAgICB9CisKKyAgdG1wID0gZ2VuX3J0eF9TRVQgKFNJbW9kZSwKKwkJICAgICBzdGFja19wb2ludGVyX3J0eCwKKwkJICAgICBnZW5fcnR4X1BMVVMgKFNJbW9kZSwKKwkJCQkgICBzdGFja19wb2ludGVyX3J0eCwKKwkJCQkgICBHRU5fSU5UICgtNCAqIG5yX3JlZ3MpKSk7CisgIFJUWF9GUkFNRV9SRUxBVEVEX1AgKHRtcCkgPSAxOworICBYVkVDRVhQIChkd2FyZiwgMCwgMCkgPSB0bXA7CisgIFJFR19OT1RFUyAoaW5zbikgPSBnZW5fcnR4X0VYUFJfTElTVCAoUkVHX0ZSQU1FX1JFTEFURURfRVhQUiwgZHdhcmYsCisJCQkJCVJFR19OT1RFUyAoaW5zbikpOworICByZXR1cm4gaW5zbjsKK30KKworcnR4CithdnIzMl9nZW5fbG9hZF9tdWx0aXBsZSAocnR4ICogcmVncywgaW50IGNvdW50LCBydHggZnJvbSwKKwkJCSBpbnQgd3JpdGVfYmFjaywgaW50IGluX3N0cnVjdF9wLCBpbnQgc2NhbGFyX3ApCit7CisKKyAgcnR4IHJlc3VsdDsKKyAgaW50IGkgPSAwLCBqOworCisgIHJlc3VsdCA9CisgICAgZ2VuX3J0eF9QQVJBTExFTCAoVk9JRG1vZGUsIHJ0dmVjX2FsbG9jIChjb3VudCArICh3cml0ZV9iYWNrID8gMSA6IDApKSk7CisKKyAgaWYgKHdyaXRlX2JhY2spCisgICAgeworICAgICAgWFZFQ0VYUCAocmVzdWx0LCAwLCAwKQorCT0gZ2VuX3J0eF9TRVQgKEdFVF9NT0RFIChmcm9tKSwgZnJvbSwKKwkJICAgICAgIHBsdXNfY29uc3RhbnQgKGZyb20sIGNvdW50ICogNCkpOworICAgICAgaSA9IDE7CisgICAgICBjb3VudCsrOworICAgIH0KKworCisgIGZvciAoaiA9IDA7IGkgPCBjb3VudDsgaSsrLCBqKyspCisgICAgeworICAgICAgcnR4IHVuc3BlYzsKKyAgICAgIHJ0eCBtZW0gPSBnZW5fcnR4X01FTSAoU0ltb2RlLCBwbHVzX2NvbnN0YW50IChmcm9tLCBqICogNCkpOworICAgICAgTUVNX0lOX1NUUlVDVF9QIChtZW0pID0gaW5fc3RydWN0X3A7CisgICAgICBNRU1fU0NBTEFSX1AgKG1lbSkgPSBzY2FsYXJfcDsKKyAgICAgIHVuc3BlYyA9IGdlbl9ydHhfVU5TUEVDIChWT0lEbW9kZSwgZ2VuX3J0dmVjICgxLCBtZW0pLCBVTlNQRUNfTERNKTsKKyAgICAgIFhWRUNFWFAgKHJlc3VsdCwgMCwgaSkgPSBnZW5fcnR4X1NFVCAoVk9JRG1vZGUsIHJlZ3Nbal0sIHVuc3BlYyk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworcnR4CithdnIzMl9nZW5fc3RvcmVfbXVsdGlwbGUgKHJ0eCAqIHJlZ3MsIGludCBjb3VudCwgcnR4IHRvLAorCQkJICBpbnQgaW5fc3RydWN0X3AsIGludCBzY2FsYXJfcCkKK3sKKyAgcnR4IHJlc3VsdDsKKyAgaW50IGkgPSAwLCBqOworCisgIHJlc3VsdCA9IGdlbl9ydHhfUEFSQUxMRUwgKFZPSURtb2RlLCBydHZlY19hbGxvYyAoY291bnQpKTsKKworICBmb3IgKGogPSAwOyBpIDwgY291bnQ7IGkrKywgaisrKQorICAgIHsKKyAgICAgIHJ0eCBtZW0gPSBnZW5fcnR4X01FTSAoU0ltb2RlLCBwbHVzX2NvbnN0YW50ICh0bywgaiAqIDQpKTsKKyAgICAgIE1FTV9JTl9TVFJVQ1RfUCAobWVtKSA9IGluX3N0cnVjdF9wOworICAgICAgTUVNX1NDQUxBUl9QIChtZW0pID0gc2NhbGFyX3A7CisgICAgICBYVkVDRVhQIChyZXN1bHQsIDAsIGkpCisJPSBnZW5fcnR4X1NFVCAoVk9JRG1vZGUsIG1lbSwKKwkJICAgICAgIGdlbl9ydHhfVU5TUEVDIChWT0lEbW9kZSwKKwkJCQkgICAgICAgZ2VuX3J0dmVjICgxLCByZWdzW2pdKSwKKwkJCQkgICAgICAgVU5TUEVDX1NUT1JFX01VTFRJUExFKSk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogTW92ZSBhIGJsb2NrIG9mIG1lbW9yeSBpZiBpdCBpcyB3b3JkIGFsaWduZWQgb3Igd2Ugc3VwcG9ydCB1bmFsaWduZWQKKyAgIHdvcmQgbWVtb3J5IGFjY2Vzc2VzLiBUaGUgc2l6ZSBtdXN0IGJlIG1heGltdW0gNjQgYnl0ZXMuICovCisKK2ludAorYXZyMzJfZ2VuX21vdm1lbXNpIChydHggKiBvcGVyYW5kcykKK3sKKyAgSE9TVF9XSURFX0lOVCBieXRlc190b19nbzsKKyAgcnR4IHNyYywgZHN0OworICBydHggc3Rfc3JjLCBzdF9kc3Q7CisgIGludCBzcmNfb2Zmc2V0ID0gMCwgZHN0X29mZnNldCA9IDA7CisgIGludCBibG9ja19zaXplOworICBpbnQgZHN0X2luX3N0cnVjdF9wLCBzcmNfaW5fc3RydWN0X3A7CisgIGludCBkc3Rfc2NhbGFyX3AsIHNyY19zY2FsYXJfcDsKKyAgaW50IHVuYWxpZ25lZDsKKworICBpZiAoR0VUX0NPREUgKG9wZXJhbmRzWzJdKSAhPSBDT05TVF9JTlQKKyAgICAgIHx8IEdFVF9DT0RFIChvcGVyYW5kc1szXSkgIT0gQ09OU1RfSU5UCisgICAgICB8fCBJTlRWQUwgKG9wZXJhbmRzWzJdKSA+IDY0CisgICAgICB8fCAoKElOVFZBTCAob3BlcmFuZHNbM10pICYgMykgJiYgIVRBUkdFVF9VTkFMSUdORURfV09SRCkpCisgICAgcmV0dXJuIDA7CisKKyAgdW5hbGlnbmVkID0gKElOVFZBTCAob3BlcmFuZHNbM10pICYgMykgIT0gMDsKKworICBibG9ja19zaXplID0gNDsKKworICBzdF9kc3QgPSBYRVhQIChvcGVyYW5kc1swXSwgMCk7CisgIHN0X3NyYyA9IFhFWFAgKG9wZXJhbmRzWzFdLCAwKTsKKworICBkc3RfaW5fc3RydWN0X3AgPSBNRU1fSU5fU1RSVUNUX1AgKG9wZXJhbmRzWzBdKTsKKyAgZHN0X3NjYWxhcl9wID0gTUVNX1NDQUxBUl9QIChvcGVyYW5kc1swXSk7CisgIHNyY19pbl9zdHJ1Y3RfcCA9IE1FTV9JTl9TVFJVQ1RfUCAob3BlcmFuZHNbMV0pOworICBzcmNfc2NhbGFyX3AgPSBNRU1fU0NBTEFSX1AgKG9wZXJhbmRzWzFdKTsKKworICBkc3QgPSBjb3B5X3RvX21vZGVfcmVnIChTSW1vZGUsIHN0X2RzdCk7CisgIHNyYyA9IGNvcHlfdG9fbW9kZV9yZWcgKFNJbW9kZSwgc3Rfc3JjKTsKKworICBieXRlc190b19nbyA9IElOVFZBTCAob3BlcmFuZHNbMl0pOworCisgIHdoaWxlIChieXRlc190b19nbykKKyAgICB7CisgICAgICBlbnVtIG1hY2hpbmVfbW9kZSBtb3ZlX21vZGU7CisgICAgICAvKiAoU2VlbXMgdG8gYmUgYSBwcm9ibGVtIHdpdGggcmVsb2FkcyBmb3IgdGhlIG1vdnRpIHBhdHRlcm4gc28gdGhpcyBpcworICAgICAgICAgZGlzYWJsZWQgdW50aWwgdGhhdCBwcm9ibGVtIGlzIHJlc29sdmVkKQorICAgICAgICAgVVBEQVRFOiBQcm9ibGVtIHNlZW1zIHRvIGJlIHNvbHZlZCBub3cuLi4uICovCisgICAgICBpZiAoYnl0ZXNfdG9fZ28gPj0gR0VUX01PREVfU0laRSAoVEltb2RlKSAmJiAhdW5hbGlnbmVkCisJICAvKiBEbyBub3QgZW1pdCBsZG0vc3RtIGZvciBVQzMgYXMgbGQuZC9zdC5kIGlzIG1vcmUgb3B0aW1hbC4gKi8KKwkgICYmICFUQVJHRVRfQVJDSF9VQykKKwltb3ZlX21vZGUgPSBUSW1vZGU7CisgICAgICBlbHNlIGlmICgoYnl0ZXNfdG9fZ28gPj0gR0VUX01PREVfU0laRSAoREltb2RlKSkgJiYgIXVuYWxpZ25lZCkKKwltb3ZlX21vZGUgPSBESW1vZGU7CisgICAgICBlbHNlIGlmIChieXRlc190b19nbyA+PSBHRVRfTU9ERV9TSVpFIChTSW1vZGUpKQorCW1vdmVfbW9kZSA9IFNJbW9kZTsKKyAgICAgIGVsc2UKKwltb3ZlX21vZGUgPSBRSW1vZGU7CisKKyAgICAgIHsKKyAgICAgICAgcnR4IHNyY19tZW07CisJcnR4IGRzdF9tZW0gPSBnZW5fcnR4X01FTSAobW92ZV9tb2RlLAorCQkJCSAgIGdlbl9ydHhfUExVUyAoU0ltb2RlLCBkc3QsCisJCQkJCQkgR0VOX0lOVCAoZHN0X29mZnNldCkpKTsKKyAgICAgICAgZHN0X29mZnNldCArPSBHRVRfTU9ERV9TSVpFIChtb3ZlX21vZGUpOworICAgICAgICBpZiAoIDAgLyogVGhpcyBjYXVzZXMgYW4gZXJyb3IgaW4gR0NDLiBUaGluayB0aGVyZSBpcworICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIHdyb25nIGluIHRoZSBnY3NlIHBhc3Mgd2hpY2ggY2F1c2VzIFJFUV9FUVVJViBub3RlcworICAgICAgICAgICAgICAgICAgdG8gYmUgd3Jvbmcgc28gZGlzYWJsaW5nIGl0IGZvciBub3cuICovCisgICAgICAgICAgICAgJiYgbW92ZV9tb2RlID09IFRJbW9kZQorICAgICAgICAgICAgICYmIElOVFZBTCAob3BlcmFuZHNbMl0pID4gR0VUX01PREVfU0laRSAoVEltb2RlKSApCisgICAgICAgICAgeworICAgICAgICAgICAgc3JjX21lbSA9IGdlbl9ydHhfTUVNIChtb3ZlX21vZGUsCisJCQkJICAgZ2VuX3J0eF9QT1NUX0lOQyAoU0ltb2RlLCBzcmMpKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBzcmNfbWVtID0gZ2VuX3J0eF9NRU0gKG1vdmVfbW9kZSwKKwkJCQkgICBnZW5fcnR4X1BMVVMgKFNJbW9kZSwgc3JjLAorCQkJCQkJIEdFTl9JTlQgKHNyY19vZmZzZXQpKSk7CisgICAgICAgICAgICBzcmNfb2Zmc2V0ICs9IEdFVF9NT0RFX1NJWkUgKG1vdmVfbW9kZSk7CisgICAgICAgICAgfQorCisJYnl0ZXNfdG9fZ28gLT0gR0VUX01PREVfU0laRSAobW92ZV9tb2RlKTsKKworCU1FTV9JTl9TVFJVQ1RfUCAoZHN0X21lbSkgPSBkc3RfaW5fc3RydWN0X3A7CisJTUVNX1NDQUxBUl9QIChkc3RfbWVtKSA9IGRzdF9zY2FsYXJfcDsKKworCU1FTV9JTl9TVFJVQ1RfUCAoc3JjX21lbSkgPSBzcmNfaW5fc3RydWN0X3A7CisJTUVNX1NDQUxBUl9QIChzcmNfbWVtKSA9IHNyY19zY2FsYXJfcDsKKwllbWl0X21vdmVfaW5zbiAoZHN0X21lbSwgc3JjX21lbSk7CisKKyAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworCisvKkV4cGFuZCB0aGUgcHJvbG9ndWUgaW5zdHJ1Y3Rpb24qLwordm9pZAorYXZyMzJfZXhwYW5kX3Byb2xvZ3VlICh2b2lkKQoreworICBydHggaW5zbiwgZHdhcmY7CisgIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcmVnX21hc2ssIHNhdmVkX2ZwX3JlZ19tYXNrOworICBpbnQgcmVnbGlzdDggPSAwOworCisgIC8qIE5ha2VkIGZ1bmN0aW9ucyBkb2VzIG5vdCBoYXZlIGEgcHJvbG9ndWUgKi8KKyAgaWYgKElTX05BS0VEIChhdnIzMl9jdXJyZW50X2Z1bmNfdHlwZSAoKSkpCisgICAgcmV0dXJuOworCisgIHNhdmVkX3JlZ19tYXNrID0gYXZyMzJfY29tcHV0ZV9zYXZlX3JlZ19tYXNrIChUUlVFKTsKKworICBpZiAoc2F2ZWRfcmVnX21hc2spCisgICAgeworICAgICAgLyogTXVzdCBwdXNoIHVzZWQgcmVnaXN0ZXJzICovCisKKyAgICAgIC8qIFNob3VsZCB3ZSB1c2UgUE9QTSBvciBMRE0/ICovCisgICAgICBpbnQgdXNlUFVTSE0gPSBUUlVFOworICAgICAgcmVnbGlzdDggPSAwOworICAgICAgaWYgKCgoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAwKSkgfHwKKwkgICAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAxKSkgfHwKKwkgICAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAyKSkgfHwgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgMykpKSkKKwl7CisJICAvKiBPbmUgb2YgUjAtUjMgc2hvdWxkIGF0IGxlYXN0IGJlIHB1c2hlZCAqLworCSAgaWYgKCgoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAwKSkgJiYKKwkgICAgICAgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgMSkpICYmCisJICAgICAgIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDIpKSAmJiAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAzKSkpKQorCSAgICB7CisJICAgICAgLyogQWxsIHNob3VsZCBiZSBwdXNoZWQgKi8KKwkgICAgICByZWdsaXN0OCB8PSAweDAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB1c2VQVVNITSA9IEZBTFNFOworCSAgICB9CisJfQorCisgICAgICBpZiAoKChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDQpKSB8fAorCSAgIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDUpKSB8fAorCSAgIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDYpKSB8fCAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCA3KSkpKQorCXsKKwkgIC8qIE9uZSBvZiBSNC1SNyBzaG91bGQgYXQgbGVhc3QgYmUgcHVzaGVkICovCisJICBpZiAoKChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDQpKSAmJgorCSAgICAgICAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCA1KSkgJiYKKwkgICAgICAgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgNikpICYmIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDcpKSkpCisJICAgIHsKKwkgICAgICBpZiAodXNlUFVTSE0pCisJCS8qIEFsbCBzaG91bGQgYmUgcHVzaGVkICovCisJCXJlZ2xpc3Q4IHw9IDB4MDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHVzZVBVU0hNID0gRkFMU0U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICgoKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgOCkpIHx8IChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDkpKSkpCisJeworCSAgLyogT25lIG9mIFI4LVI5IHNob3VsZCBhdCBsZWFzdCBiZSBwdXNoZWQgKi8KKwkgIGlmICgoKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgOCkpICYmIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDkpKSkpCisJICAgIHsKKwkgICAgICBpZiAodXNlUFVTSE0pCisJCS8qIEFsbCBzaG91bGQgYmUgcHVzaGVkICovCisJCXJlZ2xpc3Q4IHw9IDB4MDQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHVzZVBVU0hNID0gRkFMU0U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDEwKSkKKwlyZWdsaXN0OCB8PSAweDA4OworCisgICAgICBpZiAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAxMSkpCisJcmVnbGlzdDggfD0gMHgxMDsKKworICAgICAgaWYgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgMTIpKQorCXJlZ2xpc3Q4IHw9IDB4MjA7CisKKyAgICAgIGlmIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IEFTTV9SRUdOVU0gKExSX1JFR05VTSkpKQorCXsKKwkgIC8qIFB1c2ggTFIgKi8KKwkgIHJlZ2xpc3Q4IHw9IDB4NDA7CisJfQorCisgICAgICBpZiAodXNlUFVTSE0pCisJeworCSAgaW5zbiA9IGVtaXRfbXVsdGlfcmVnX3B1c2ggKHJlZ2xpc3Q4LCBUUlVFKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW5zbiA9IGVtaXRfbXVsdGlfcmVnX3B1c2ggKHNhdmVkX3JlZ19tYXNrLCBGQUxTRSk7CisJfQorICAgICAgUlRYX0ZSQU1FX1JFTEFURURfUCAoaW5zbikgPSAxOworCisgICAgICAvKiBQcmV2ZW50IHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSBiZWluZyBzY2hlZHVsZWQgYWZ0ZXIgYW55IG90aGVyCisgICAgICAgICBpbnN0cnVjdGlvbnMuICAqLworICAgICAgZW1pdF9pbnNuIChnZW5fYmxvY2thZ2UgKCkpOworICAgIH0KKworICBzYXZlZF9mcF9yZWdfbWFzayA9IGF2cjMyX2NvbXB1dGVfc2F2ZV9mcF9yZWdfbWFzayAoKTsKKyAgaWYgKHNhdmVkX2ZwX3JlZ19tYXNrKQorICAgIHsKKyAgICAgIGluc24gPSBlbWl0X211bHRpX2ZwX3JlZ19wdXNoIChzYXZlZF9mcF9yZWdfbWFzayk7CisgICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IDE7CisKKyAgICAgIC8qIFByZXZlbnQgdGhpcyBpbnN0cnVjdGlvbiBmcm9tIGJlaW5nIHNjaGVkdWxlZCBhZnRlciBhbnkgb3RoZXIKKyAgICAgICAgIGluc3RydWN0aW9ucy4gICovCisgICAgICBlbWl0X2luc24gKGdlbl9ibG9ja2FnZSAoKSk7CisgICAgfQorCisgIC8qIFNldCBmcmFtZSBwb2ludGVyICovCisgIGlmIChmcmFtZV9wb2ludGVyX25lZWRlZCkKKyAgICB7CisgICAgICBpbnNuID0gZW1pdF9tb3ZlX2luc24gKGZyYW1lX3BvaW50ZXJfcnR4LCBzdGFja19wb2ludGVyX3J0eCk7CisgICAgICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IDE7CisgICAgfQorCisgIGlmIChnZXRfZnJhbWVfc2l6ZSAoKSA+IDApCisgICAgeworICAgICAgaWYgKGF2cjMyX2NvbnN0X29rX2Zvcl9jb25zdHJhaW50X3AgKGdldF9mcmFtZV9zaXplICgpLCAnSycsICJLczIxIikpCisJeworCSAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3J0eF9TRVQgKFNJbW9kZSwKKwkJCQkJIHN0YWNrX3BvaW50ZXJfcnR4LAorCQkJCQkgZ2VuX3J0eF9QTFVTIChTSW1vZGUsCisJCQkJCQkgICAgICAgc3RhY2tfcG9pbnRlcl9ydHgsCisJCQkJCQkgICAgICAgZ2VuX3J0eF9DT05TVF9JTlQKKwkJCQkJCSAgICAgICAoU0ltb2RlLAorCQkJCQkJCS1nZXRfZnJhbWVfc2l6ZQorCQkJCQkJCSgpKSkpKTsKKwkgIFJUWF9GUkFNRV9SRUxBVEVEX1AgKGluc24pID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSW1tZWRpYXRlIGlzIGxhcmdlciB0aGFuIGsyMSBXZSBtdXN0IGVpdGhlciBjaGVjayBpZiB3ZSBjYW4gdXNlCisJICAgICBvbmUgb2YgdGhlIHB1c2hlZCByZWVnaXN0ZXJzIGFzIHRlbXBvcmFyeSBzdG9yYWdlIG9yIHdlIG11c3QKKwkgICAgIG1ha2UgdXMgYSB0ZW1wIHJlZ2lzdGVyIGJ5IHB1c2hpbmcgYSByZWdpc3RlciB0byB0aGUgc3RhY2suICovCisJICBydHggdGVtcF9yZWcsIGNvbnN0X3Bvb2xfZW50cnksIGluc247CisJICBpZiAoc2F2ZWRfcmVnX21hc2spCisJICAgIHsKKwkgICAgICB0ZW1wX3JlZyA9CisJCWdlbl9ydHhfUkVHIChTSW1vZGUsCisJCQkgICAgIElOVEVSTkFMX1JFR05VTSAoYXZyMzJfZ2V0X3NhdmVkX3JlZworCQkJCQkgICAgICAoc2F2ZWRfcmVnX21hc2spKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHRlbXBfcmVnID0gZ2VuX3J0eF9SRUcgKFNJbW9kZSwgSU5URVJOQUxfUkVHTlVNICg3KSk7CisJICAgICAgZW1pdF9tb3ZlX2luc24gKGdlbl9ydHhfTUVNCisJCQkgICAgICAoU0ltb2RlLAorCQkJICAgICAgIGdlbl9ydHhfUFJFX0RFQyAoU0ltb2RlLCBzdGFja19wb2ludGVyX3J0eCkpLAorCQkJICAgICAgdGVtcF9yZWcpOworCSAgICB9CisKKwkgIGNvbnN0X3Bvb2xfZW50cnkgPQorCSAgICBmb3JjZV9jb25zdF9tZW0gKFNJbW9kZSwKKwkJCSAgICAgZ2VuX3J0eF9DT05TVF9JTlQgKFNJbW9kZSwgZ2V0X2ZyYW1lX3NpemUgKCkpKTsKKwkgIGVtaXRfbW92ZV9pbnNuICh0ZW1wX3JlZywgY29uc3RfcG9vbF9lbnRyeSk7CisKKwkgIGluc24gPSBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChTSW1vZGUsCisJCQkJCSBzdGFja19wb2ludGVyX3J0eCwKKwkJCQkJIGdlbl9ydHhfTUlOVVMgKFNJbW9kZSwKKwkJCQkJCQlzdGFja19wb2ludGVyX3J0eCwKKwkJCQkJCQl0ZW1wX3JlZykpKTsKKworCSAgZHdhcmYgPSBnZW5fcnR4X1NFVCAoVk9JRG1vZGUsIHN0YWNrX3BvaW50ZXJfcnR4LAorCQkJICAgICAgIGdlbl9ydHhfUExVUyAoU0ltb2RlLCBzdGFja19wb2ludGVyX3J0eCwKKwkJCQkJICAgICBHRU5fSU5UICgtZ2V0X2ZyYW1lX3NpemUgKCkpKSk7CisJICBSRUdfTk9URVMgKGluc24pID0gZ2VuX3J0eF9FWFBSX0xJU1QgKFJFR19GUkFNRV9SRUxBVEVEX0VYUFIsCisJCQkJCQlkd2FyZiwgUkVHX05PVEVTIChpbnNuKSk7CisJICBSVFhfRlJBTUVfUkVMQVRFRF9QIChpbnNuKSA9IDE7CisKKwkgIGlmICghc2F2ZWRfcmVnX21hc2spCisJICAgIHsKKwkgICAgICBpbnNuID0KKwkJZW1pdF9tb3ZlX2luc24gKHRlbXBfcmVnLAorCQkJCWdlbl9ydHhfTUVNIChTSW1vZGUsCisJCQkJCSAgICAgZ2VuX3J0eF9QT1NUX0lOQyAoU0ltb2RlLAorCQkJCQkJCSAgICAgICBnZW5fcnR4X1JFRworCQkJCQkJCSAgICAgICAoU0ltb2RlLAorCQkJCQkJCQkxMykpKSk7CisJICAgIH0KKworCSAgLyogTWFyayB0aGUgdGVtcCByZWdpc3RlciBhcyBkZWFkICovCisJICBSRUdfTk9URVMgKGluc24pID0gZ2VuX3J0eF9FWFBSX0xJU1QgKFJFR19ERUFELCB0ZW1wX3JlZywKKwkJCQkJCVJFR19OT1RFUyAoaW5zbikpOworCisKKwl9CisKKyAgICAgIC8qIFByZXZlbnQgdGhlIHRoZSBzdGFjayBhZGp1c3RtZW50IHRvIGJlIHNjaGVkdWxlZCBhZnRlciBhbnkKKyAgICAgICAgIGluc3RydWN0aW9ucyB1c2luZyB0aGUgZnJhbWUgcG9pbnRlci4gICovCisgICAgICBlbWl0X2luc24gKGdlbl9ibG9ja2FnZSAoKSk7CisgICAgfQorCisgIC8qIExvYWQgR09UICovCisgIGlmIChmbGFnX3BpYykKKyAgICB7CisgICAgICBhdnIzMl9sb2FkX3BpY19yZWdpc3RlciAoKTsKKworICAgICAgLyogZ2NjIGRvZXMgbm90IGtub3cgdGhhdCBsb2FkIG9yIGNhbGwgaW5zdHJ1Y3Rpb25zIG1pZ2h0IHVzZSB0aGUgcGljCisgICAgICAgICByZWdpc3RlciBzbyBpdCBtaWdodCBzY2hlZHVsZSB0aGVzZSBpbnN0cnVjdGlvbnMgYmVmb3JlIHRoZSBsb2FkaW5nCisgICAgICAgICBvZiB0aGUgcGljIHJlZ2lzdGVyLiBUbyBhdm9pZCB0aGlzIGVtaXQgYSBiYXJyaWVyIGZvciBub3cuIFRPRE8hCisgICAgICAgICBGaW5kIG91dCBhIGJldHRlciB3YXkgdG8gbGV0IGdjYyBrbm93IHdoaWNoIGluc3RydWN0aW9ucyBtaWdodCB1c2UKKyAgICAgICAgIHRoZSBwaWMgcmVnaXN0ZXIuICovCisgICAgICBlbWl0X2luc24gKGdlbl9ibG9ja2FnZSAoKSk7CisgICAgfQorICByZXR1cm47Cit9CisKK3ZvaWQKK2F2cjMyX3NldF9yZXR1cm5fYWRkcmVzcyAocnR4IHNvdXJjZSwgcnR4IHNjcmF0Y2gpCit7CisgIHJ0eCBhZGRyOworICB1bnNpZ25lZCBsb25nIHNhdmVkX3JlZ3M7CisKKyAgc2F2ZWRfcmVncyA9IGF2cjMyX2NvbXB1dGVfc2F2ZV9yZWdfbWFzayAoVFJVRSk7CisKKyAgaWYgKCEoc2F2ZWRfcmVncyAmICgxIDw8IEFTTV9SRUdOVU0gKExSX1JFR05VTSkpKSkKKyAgICBlbWl0X21vdmVfaW5zbiAoZ2VuX3J0eF9SRUcgKFBtb2RlLCBMUl9SRUdOVU0pLCBzb3VyY2UpOworICBlbHNlCisgICAgeworICAgICAgaWYgKGZyYW1lX3BvaW50ZXJfbmVlZGVkKQorCWFkZHIgPSBnZW5fcnR4X1JFRyAoUG1vZGUsIEZSQU1FX1BPSU5URVJfUkVHTlVNKTsKKyAgICAgIGVsc2UKKwlpZiAoYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoZ2V0X2ZyYW1lX3NpemUgKCksICdLJywgIktzMTYiKSkKKwl7CisJICBhZGRyID0gcGx1c19jb25zdGFudCAoc3RhY2tfcG9pbnRlcl9ydHgsIGdldF9mcmFtZV9zaXplICgpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZW1pdF9pbnNuIChnZW5fbW92c2kgKHNjcmF0Y2gsIEdFTl9JTlQgKGdldF9mcmFtZV9zaXplICgpKSkpOworCSAgYWRkciA9IHNjcmF0Y2g7CisJfQorICAgICAgZW1pdF9tb3ZlX2luc24gKGdlbl9ydHhfTUVNIChQbW9kZSwgYWRkciksIHNvdXJjZSk7CisgICAgfQorfQorCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgSU5TTi4gIExFTkdUSCBpcyB0aGUgaW5pdGlhbCBsZW5ndGggY29tcHV0ZWQgYnkKKyAgIGF0dHJpYnV0ZXMgaW4gdGhlIG1hY2hpbmUtZGVzY3JpcHRpb24gZmlsZS4gICovCisKK2ludAorYXZyMzJfYWRqdXN0X2luc25fbGVuZ3RoIChydHggaW5zbiBBVFRSSUJVVEVfVU5VU0VELAorCQkJICBpbnQgbGVuZ3RoIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiBsZW5ndGg7Cit9CisKK3ZvaWQKK2F2cjMyX291dHB1dF9yZXR1cm5faW5zdHJ1Y3Rpb24gKGludCBzaW5nbGVfcmV0X2luc3QgQVRUUklCVVRFX1VOVVNFRCwKKwkJCQkgaW50IGlzY29uZCBBVFRSSUJVVEVfVU5VU0VELAorCQkJCSBydHggY29uZCBBVFRSSUJVVEVfVU5VU0VELCBydHggcjEyX2ltbSkKK3sKKworICB1bnNpZ25lZCBsb25nIHNhdmVkX3JlZ19tYXNrLCBzYXZlZF9mcF9yZWdfbWFzazsKKyAgaW50IGluc2VydF9yZXQgPSBUUlVFOworICBpbnQgcmVnbGlzdDggPSAwOworICBpbnQgc3RhY2tfYWRqdXN0bWVudCA9IGdldF9mcmFtZV9zaXplICgpOworICB1bnNpZ25lZCBpbnQgZnVuY190eXBlID0gYXZyMzJfY3VycmVudF9mdW5jX3R5cGUgKCk7CisgIEZJTEUgKmYgPSBhc21fb3V0X2ZpbGU7CisKKyAgLyogTmFrZWQgZnVuY3Rpb25zIGRvZXMgbm90IGhhdmUgYW4gZXBpbG9ndWUgKi8KKyAgaWYgKElTX05BS0VEIChmdW5jX3R5cGUpKQorICAgIHJldHVybjsKKworICBzYXZlZF9mcF9yZWdfbWFzayA9IGF2cjMyX2NvbXB1dGVfc2F2ZV9mcF9yZWdfbWFzayAoKTsKKworICBzYXZlZF9yZWdfbWFzayA9IGF2cjMyX2NvbXB1dGVfc2F2ZV9yZWdfbWFzayAoRkFMU0UpOworCisgIC8qIFJlc2V0IGZyYW1lIHBvaW50ZXIgKi8KKyAgaWYgKHN0YWNrX2FkanVzdG1lbnQgPiAwKQorICAgIHsKKyAgICAgIGlmIChhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChzdGFja19hZGp1c3RtZW50LCAnSScsICJJczIxIikpCisJeworCSAgZnByaW50ZiAoZiwgIlx0c3ViXHRzcCwgJWkgIyBSZXNldCBGcmFtZSBQb2ludGVyXG4iLAorCQkgICAtc3RhY2tfYWRqdXN0bWVudCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRPRE8hIElzIGl0IHNhZmUgdG8gdXNlIHI4IGFzIHNjcmF0Y2g/PyAqLworCSAgZnByaW50ZiAoZiwgIlx0bW92XHRyOCwgbG8oJWkpICMgUmVzZXQgRnJhbWUgUG9pbnRlclxuIiwKKwkJICAgLXN0YWNrX2FkanVzdG1lbnQpOworCSAgZnByaW50ZiAoZiwgIlx0b3JoXHRyOCwgaGkoJWkpICMgUmVzZXQgRnJhbWUgUG9pbnRlclxuIiwKKwkJICAgLXN0YWNrX2FkanVzdG1lbnQpOworCSAgZnByaW50ZiAoZiwgIlx0YWRkXHRzcCwgcjggICMgUmVzZXQgRnJhbWUgUG9pbnRlclxuIik7CisJfQorICAgIH0KKworICBpZiAoc2F2ZWRfZnBfcmVnX21hc2spCisgICAgeworICAgICAgY2hhciByZWdsaXN0WzY0XTsJCS8qIDY0IGJ5dGVzIHNob3VsZCBiZSBlbm91Z2guLi4gKi8KKyAgICAgIGF2cjMyX21ha2VfZnBfcmVnbGlzdF93IChzYXZlZF9mcF9yZWdfbWFzaywgKGNoYXIgKikgcmVnbGlzdCk7CisgICAgICBmcHJpbnRmIChmLCAiXHRsZGNtLndcdGNwMCwgc3ArKywgJXNcbiIsIHJlZ2xpc3QpOworICAgICAgaWYgKHNhdmVkX2ZwX3JlZ19tYXNrICYgfjB4ZmYpCisJeworCSAgc2F2ZWRfZnBfcmVnX21hc2sgJj0gfjB4ZmY7CisJICBhdnIzMl9tYWtlX2ZwX3JlZ2xpc3RfZCAoc2F2ZWRfZnBfcmVnX21hc2ssIChjaGFyICopIHJlZ2xpc3QpOworCSAgZnByaW50ZiAoZiwgIlx0bGRjbS5kXHRjcDAsIHNwKyssICVzXG4iLCByZWdsaXN0KTsKKwl9CisgICAgfQorCisgIGlmIChzYXZlZF9yZWdfbWFzaykKKyAgICB7CisgICAgICAvKiBNdXN0IHBvcCB1c2VkIHJlZ2lzdGVycyAqLworCisgICAgICAvKiBTaG91bGQgd2UgdXNlIFBPUE0gb3IgTERNPyAqLworICAgICAgaW50IHVzZVBPUE0gPSBUUlVFOworICAgICAgaWYgKCgoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAwKSkgfHwKKwkgICAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAxKSkgfHwKKwkgICAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAyKSkgfHwgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgMykpKSkKKwl7CisJICAvKiBPbmUgb2YgUjAtUjMgc2hvdWxkIGF0IGxlYXN0IGJlIHBvcHBlZCAqLworCSAgaWYgKCgoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAwKSkgJiYKKwkgICAgICAgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgMSkpICYmCisJICAgICAgIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDIpKSAmJiAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAzKSkpKQorCSAgICB7CisJICAgICAgLyogQWxsIHNob3VsZCBiZSBwb3BwZWQgKi8KKwkgICAgICByZWdsaXN0OCB8PSAweDAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB1c2VQT1BNID0gRkFMU0U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICgoKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgNCkpIHx8CisJICAgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgNSkpIHx8CisJICAgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgNikpIHx8IChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDcpKSkpCisJeworCSAgLyogT25lIG9mIFIwLVIzIHNob3VsZCBhdCBsZWFzdCBiZSBwb3BwZWQgKi8KKwkgIGlmICgoKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgNCkpICYmCisJICAgICAgIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDUpKSAmJgorCSAgICAgICAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCA2KSkgJiYgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgNykpKSkKKwkgICAgeworCSAgICAgIGlmICh1c2VQT1BNKQorCQkvKiBBbGwgc2hvdWxkIGJlIHBvcHBlZCAqLworCQlyZWdsaXN0OCB8PSAweDAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB1c2VQT1BNID0gRkFMU0U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICgoKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgOCkpIHx8IChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDkpKSkpCisJeworCSAgLyogT25lIG9mIFI4LVI5IHNob3VsZCBhdCBsZWFzdCBiZSBwdXNoZWQgKi8KKwkgIGlmICgoKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgOCkpICYmIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDkpKSkpCisJICAgIHsKKwkgICAgICBpZiAodXNlUE9QTSkKKwkJLyogQWxsIHNob3VsZCBiZSBwdXNoZWQgKi8KKwkJcmVnbGlzdDggfD0gMHgwNDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdXNlUE9QTSA9IEZBTFNFOworCSAgICB9CisJfQorCisgICAgICBpZiAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCAxMCkpCisJcmVnbGlzdDggfD0gMHgwODsKKworICAgICAgaWYgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgMTEpKQorCXJlZ2xpc3Q4IHw9IDB4MTA7CisKKyAgICAgIGlmIChzYXZlZF9yZWdfbWFzayAmICgxIDw8IDEyKSkKKwlyZWdsaXN0OCB8PSAweDIwOworCisgICAgICBpZiAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCBBU01fUkVHTlVNIChMUl9SRUdOVU0pKSkKKwkvKiBQb3AgTFIgKi8KKwlyZWdsaXN0OCB8PSAweDQwOworCisgICAgICBpZiAoc2F2ZWRfcmVnX21hc2sgJiAoMSA8PCBBU01fUkVHTlVNIChQQ19SRUdOVU0pKSkKKwkvKiBQb3AgTFIgaW50byBQQy4gKi8KKwlyZWdsaXN0OCB8PSAweDgwOworCisgICAgICBpZiAodXNlUE9QTSkKKwl7CisJICBjaGFyIHJlZ2xpc3RbNjRdOwkvKiA2NCBieXRlcyBzaG91bGQgYmUgZW5vdWdoLi4uICovCisJICBhdnIzMl9tYWtlX3JlZ2xpc3Q4IChyZWdsaXN0OCwgKGNoYXIgKikgcmVnbGlzdCk7CisKKwkgIGlmIChyZWdsaXN0OCAmIDB4ODApCisJICAgIC8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYWxzbyBhIHJldHVybiAqLworCSAgICBpbnNlcnRfcmV0ID0gRkFMU0U7CisKKwkgIGlmIChyMTJfaW1tICYmICFpbnNlcnRfcmV0KQorCSAgICBmcHJpbnRmIChmLCAiXHRwb3BtXHQlcywgcjEyPSVsaVxuIiwgcmVnbGlzdCwgSU5UVkFMIChyMTJfaW1tKSk7CisJICBlbHNlCisJICAgIGZwcmludGYgKGYsICJcdHBvcG1cdCVzXG4iLCByZWdsaXN0KTsKKworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyIHJlZ2xpc3RbNjRdOwkvKiA2NCBieXRlcyBzaG91bGQgYmUgZW5vdWdoLi4uICovCisJICBhdnIzMl9tYWtlX3JlZ2xpc3QxNiAoc2F2ZWRfcmVnX21hc2ssIChjaGFyICopIHJlZ2xpc3QpOworCSAgaWYgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgQVNNX1JFR05VTSAoUENfUkVHTlVNKSkpCisJICAgIC8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYWxzbyBhIHJldHVybiAqLworCSAgICBpbnNlcnRfcmV0ID0gRkFMU0U7CisKKwkgIGlmIChyMTJfaW1tICYmICFpbnNlcnRfcmV0KQorCSAgICBmcHJpbnRmIChmLCAiXHRsZG1cdHNwKyssICVzLCByMTI9JWxpXG4iLCByZWdsaXN0LAorCQkgICAgIElOVFZBTCAocjEyX2ltbSkpOworCSAgZWxzZQorCSAgICBmcHJpbnRmIChmLCAiXHRsZG1cdHNwKyssICVzXG4iLCByZWdsaXN0KTsKKworCX0KKworICAgIH0KKworICAvKiBTdGFjayBhZGp1c3RtZW50IGZvciBleGNlcHRpb24gaGFuZGxlci4gICovCisgIGlmIChjdXJyZW50X2Z1bmN0aW9uX2NhbGxzX2VoX3JldHVybikKKyAgICBmcHJpbnRmIChmLCAiXHRhZGRcdHNwLCByJWRcbiIsIEFTTV9SRUdOVU0gKEVIX1JFVFVSTl9TVEFDS0FESl9SRUdOTykpOworCisKKyAgaWYgKElTX0lOVEVSUlVQVCAoZnVuY190eXBlKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiXHRyZXRlXG4iKTsKKyAgICB9CisgIGVsc2UgaWYgKGluc2VydF9yZXQpCisgICAgeworICAgICAgaWYgKHIxMl9pbW0pCisJZnByaW50ZiAoZiwgIlx0cmV0YWxcdCVsaVxuIiwgSU5UVkFMIChyMTJfaW1tKSk7CisgICAgICBlbHNlCisJZnByaW50ZiAoZiwgIlx0cmV0YWxcdHIxMlxuIik7CisgICAgfQorfQorCisvKiBGdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGZwLXJlZ2lzdGVyIG1hc2sgdG8gYQorICAgcmVnbGlzdENQRDggcmVnaXN0ZXIgbGlzdCBzdHJpbmcuICovCit2b2lkCithdnIzMl9tYWtlX2ZwX3JlZ2xpc3RfZCAoaW50IHJlZ2xpc3RfbWFzaywgY2hhciAqcmVnbGlzdF9zdHJpbmcpCit7CisgIGludCBpOworCisgIC8qIE1ha2Ugc3VyZSByZWdsaXN0X3N0cmluZyBpcyBlbXB0eSAqLworICByZWdsaXN0X3N0cmluZ1swXSA9ICdcMCc7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9GUF9SRUdTOyBpICs9IDIpCisgICAgeworICAgICAgaWYgKHJlZ2xpc3RfbWFzayAmICgxIDw8IGkpKQorCXsKKwkgIHN0cmxlbiAocmVnbGlzdF9zdHJpbmcpID8KKwkgICAgc3ByaW50ZiAocmVnbGlzdF9zdHJpbmcsICIlcywgJXMtJXMiLCByZWdsaXN0X3N0cmluZywKKwkJICAgICByZWdfbmFtZXNbSU5URVJOQUxfRlBfUkVHTlVNIChpKV0sCisJCSAgICAgcmVnX25hbWVzW0lOVEVSTkFMX0ZQX1JFR05VTSAoaSArIDEpXSkgOgorCSAgICBzcHJpbnRmIChyZWdsaXN0X3N0cmluZywgIiVzLSVzIiwKKwkJICAgICByZWdfbmFtZXNbSU5URVJOQUxfRlBfUkVHTlVNIChpKV0sCisJCSAgICAgcmVnX25hbWVzW0lOVEVSTkFMX0ZQX1JFR05VTSAoaSArIDEpXSk7CisJfQorICAgIH0KK30KKworLyogRnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSBmcC1yZWdpc3RlciBtYXNrIHRvIGEKKyAgIHJlZ2xpc3RDUDggcmVnaXN0ZXIgbGlzdCBzdHJpbmcuICovCit2b2lkCithdnIzMl9tYWtlX2ZwX3JlZ2xpc3RfdyAoaW50IHJlZ2xpc3RfbWFzaywgY2hhciAqcmVnbGlzdF9zdHJpbmcpCit7CisgIGludCBpOworCisgIC8qIE1ha2Ugc3VyZSByZWdsaXN0X3N0cmluZyBpcyBlbXB0eSAqLworICByZWdsaXN0X3N0cmluZ1swXSA9ICdcMCc7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9GUF9SRUdTOyArK2kpCisgICAgeworICAgICAgaWYgKHJlZ2xpc3RfbWFzayAmICgxIDw8IGkpKQorCXsKKwkgIHN0cmxlbiAocmVnbGlzdF9zdHJpbmcpID8KKwkgICAgc3ByaW50ZiAocmVnbGlzdF9zdHJpbmcsICIlcywgJXMiLCByZWdsaXN0X3N0cmluZywKKwkJICAgICByZWdfbmFtZXNbSU5URVJOQUxfRlBfUkVHTlVNIChpKV0pIDoKKwkgICAgc3ByaW50ZiAocmVnbGlzdF9zdHJpbmcsICIlcyIsIHJlZ19uYW1lc1tJTlRFUk5BTF9GUF9SRUdOVU0gKGkpXSk7CisJfQorICAgIH0KK30KKwordm9pZAorYXZyMzJfbWFrZV9yZWdsaXN0MTYgKGludCByZWdsaXN0MTZfdmVjdCwgY2hhciAqcmVnbGlzdDE2X3N0cmluZykKK3sKKyAgaW50IGk7CisKKyAgLyogTWFrZSBzdXJlIHJlZ2xpc3QxNl9zdHJpbmcgaXMgZW1wdHkgKi8KKyAgcmVnbGlzdDE2X3N0cmluZ1swXSA9ICdcMCc7CisKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisgICAgeworICAgICAgaWYgKHJlZ2xpc3QxNl92ZWN0ICYgKDEgPDwgaSkpCisJeworCSAgc3RybGVuIChyZWdsaXN0MTZfc3RyaW5nKSA/CisJICAgIHNwcmludGYgKHJlZ2xpc3QxNl9zdHJpbmcsICIlcywgJXMiLCByZWdsaXN0MTZfc3RyaW5nLAorCQkgICAgIHJlZ19uYW1lc1tJTlRFUk5BTF9SRUdOVU0gKGkpXSkgOgorCSAgICBzcHJpbnRmIChyZWdsaXN0MTZfc3RyaW5nLCAiJXMiLCByZWdfbmFtZXNbSU5URVJOQUxfUkVHTlVNIChpKV0pOworCX0KKyAgICB9Cit9CisKK2ludAorYXZyMzJfY29udmVydF90b19yZWdsaXN0MTYgKGludCByZWdsaXN0OF92ZWN0KQoreworICBpbnQgcmVnbGlzdDE2X3ZlY3QgPSAwOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4MSkKKyAgICByZWdsaXN0MTZfdmVjdCB8PSAweEY7CisgIGlmIChyZWdsaXN0OF92ZWN0ICYgMHgyKQorICAgIHJlZ2xpc3QxNl92ZWN0IHw9IDB4RjA7CisgIGlmIChyZWdsaXN0OF92ZWN0ICYgMHg0KQorICAgIHJlZ2xpc3QxNl92ZWN0IHw9IDB4MzAwOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4OCkKKyAgICByZWdsaXN0MTZfdmVjdCB8PSAweDQwMDsKKyAgaWYgKHJlZ2xpc3Q4X3ZlY3QgJiAweDEwKQorICAgIHJlZ2xpc3QxNl92ZWN0IHw9IDB4ODAwOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4MjApCisgICAgcmVnbGlzdDE2X3ZlY3QgfD0gMHgxMDAwOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4NDApCisgICAgcmVnbGlzdDE2X3ZlY3QgfD0gMHg0MDAwOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4ODApCisgICAgcmVnbGlzdDE2X3ZlY3QgfD0gMHg4MDAwOworCisgIHJldHVybiByZWdsaXN0MTZfdmVjdDsKK30KKwordm9pZAorYXZyMzJfbWFrZV9yZWdsaXN0OCAoaW50IHJlZ2xpc3Q4X3ZlY3QsIGNoYXIgKnJlZ2xpc3Q4X3N0cmluZykKK3sKKyAgLyogTWFrZSBzdXJlIHJlZ2xpc3Q4X3N0cmluZyBpcyBlbXB0eSAqLworICByZWdsaXN0OF9zdHJpbmdbMF0gPSAnXDAnOworCisgIGlmIChyZWdsaXN0OF92ZWN0ICYgMHgxKQorICAgIHNwcmludGYgKHJlZ2xpc3Q4X3N0cmluZywgInIwLXIzIik7CisgIGlmIChyZWdsaXN0OF92ZWN0ICYgMHgyKQorICAgIHN0cmxlbiAocmVnbGlzdDhfc3RyaW5nKSA/IHNwcmludGYgKHJlZ2xpc3Q4X3N0cmluZywgIiVzLCByNC1yNyIsCisJCQkJCXJlZ2xpc3Q4X3N0cmluZykgOgorICAgICAgc3ByaW50ZiAocmVnbGlzdDhfc3RyaW5nLCAicjQtcjciKTsKKyAgaWYgKHJlZ2xpc3Q4X3ZlY3QgJiAweDQpCisgICAgc3RybGVuIChyZWdsaXN0OF9zdHJpbmcpID8gc3ByaW50ZiAocmVnbGlzdDhfc3RyaW5nLCAiJXMsIHI4LXI5IiwKKwkJCQkJcmVnbGlzdDhfc3RyaW5nKSA6CisgICAgICBzcHJpbnRmIChyZWdsaXN0OF9zdHJpbmcsICJyOC1yOSIpOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4OCkKKyAgICBzdHJsZW4gKHJlZ2xpc3Q4X3N0cmluZykgPyBzcHJpbnRmIChyZWdsaXN0OF9zdHJpbmcsICIlcywgcjEwIiwKKwkJCQkJcmVnbGlzdDhfc3RyaW5nKSA6CisgICAgICBzcHJpbnRmIChyZWdsaXN0OF9zdHJpbmcsICJyMTAiKTsKKyAgaWYgKHJlZ2xpc3Q4X3ZlY3QgJiAweDEwKQorICAgIHN0cmxlbiAocmVnbGlzdDhfc3RyaW5nKSA/IHNwcmludGYgKHJlZ2xpc3Q4X3N0cmluZywgIiVzLCByMTEiLAorCQkJCQlyZWdsaXN0OF9zdHJpbmcpIDoKKyAgICAgIHNwcmludGYgKHJlZ2xpc3Q4X3N0cmluZywgInIxMSIpOworICBpZiAocmVnbGlzdDhfdmVjdCAmIDB4MjApCisgICAgc3RybGVuIChyZWdsaXN0OF9zdHJpbmcpID8gc3ByaW50ZiAocmVnbGlzdDhfc3RyaW5nLCAiJXMsIHIxMiIsCisJCQkJCXJlZ2xpc3Q4X3N0cmluZykgOgorICAgICAgc3ByaW50ZiAocmVnbGlzdDhfc3RyaW5nLCAicjEyIik7CisgIGlmIChyZWdsaXN0OF92ZWN0ICYgMHg0MCkKKyAgICBzdHJsZW4gKHJlZ2xpc3Q4X3N0cmluZykgPyBzcHJpbnRmIChyZWdsaXN0OF9zdHJpbmcsICIlcywgbHIiLAorCQkJCQlyZWdsaXN0OF9zdHJpbmcpIDoKKyAgICAgIHNwcmludGYgKHJlZ2xpc3Q4X3N0cmluZywgImxyIik7CisgIGlmIChyZWdsaXN0OF92ZWN0ICYgMHg4MCkKKyAgICBzdHJsZW4gKHJlZ2xpc3Q4X3N0cmluZykgPyBzcHJpbnRmIChyZWdsaXN0OF9zdHJpbmcsICIlcywgcGMiLAorCQkJCQlyZWdsaXN0OF9zdHJpbmcpIDoKKyAgICAgIHNwcmludGYgKHJlZ2xpc3Q4X3N0cmluZywgInBjIik7Cit9CisKK2ludAorYXZyMzJfZWhfcmV0dXJuX2RhdGFfcmVnbm8gKGludCBuKQoreworICBpZiAobiA+PSAwICYmIG4gPD0gMykKKyAgICByZXR1cm4gOCArIG47CisgIGVsc2UKKyAgICByZXR1cm4gSU5WQUxJRF9SRUdOVU07Cit9CisKKy8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20gcmVnaXN0ZXIgRlJPTSB0byByZWdpc3RlciBUTy4KKyAgIFRoZXNlIGNhbiBiZSB0aGUgYXJnIHBvaW50ZXIsIHRoZSBmcmFtZSBwb2ludGVyIG9yCisgICB0aGUgc3RhY2sgcG9pbnRlci4KKyAgIFR5cGljYWwgc3RhY2sgbGF5b3V0IGxvb2tzIGxpa2UgdGhpczoKKworICAgICAgIG9sZCBzdGFjayBwb2ludGVyIC0+IHwgICAgfAorCQkJICAgICAtLS0tCisJCQkgICAgfCAgICB8IFwKKwkJCSAgICB8ICAgIHwgICBzYXZlZCBhcmd1bWVudHMgZm9yCisJCQkgICAgfCAgICB8ICAgdmFyYXJnIGZ1bmN0aW9ucworIGFyZ19wb2ludGVyCS0+CSAgICB8ICAgIHwgLworCQkJICAgICAgLS0KKwkJCSAgICB8ICAgIHwgXAorCQkJICAgIHwgICAgfCAgIGNhbGwgc2F2ZWQKKwkJCSAgICB8ICAgIHwgICByZWdpc3RlcnMKKwkJCSAgICB8ICAgIHwgLworICBmcmFtZSBwdHIJIC0+CS0tCisJCQkgICAgfCAgICB8IFwKKwkJCSAgICB8ICAgIHwgICBsb2NhbAorCQkJICAgIHwgICAgfCAgIHZhcmlhYmxlcworICBzdGFjayBwdHIgLS0+CSAgICAgfCAgICB8IC8KKwkJCSAgICAgIC0tCisJCQkgICAgfCAgICB8IFwKKwkJCSAgICB8ICAgIHwgICBvdXRnb2luZworCQkJICAgIHwgICAgfCAgIGFyZ3VtZW50cworCQkJICAgIHwgICAgfCAvCisJCQkgICAgICAtLQorCisgIEZvciBhIGdpdmVuIGZ1bmNpdG9uIHNvbWUgb3IgYWxsIG9mIHRoZXNlIHN0YWNrIGNvbXBvbW5lbnRzCisgIG1heSBub3QgYmUgbmVlZGVkLCBnaXZpbmcgcmlzZSB0byB0aGUgcG9zc2liaWxpdHkgb2YKKyAgZWxpbWluYXRpbmcgc29tZSBvZiB0aGUgcmVnaXN0ZXJzLgorCisgIFRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0IHJlZmxlY3QgdGhlIGJlaGF2aW91cgorICBvZiBhdnIzMl9leHBhbmRfcHJvbG9ndWUoKSBhbmQgYXZyMzJfY29tcHV0ZV9zYXZlX3JlZ19tYXNrKCkuCisKKyAgVGhlIHNpZ24gb2YgdGhlIG51bWJlciByZXR1cm5lZCByZWZsZWN0cyB0aGUgZGlyZWN0aW9uIG9mIHN0YWNrCisgIGdyb3d0aCwgc28gdGhlIHZhbHVlcyBhcmUgcG9zaXRpdmUgZm9yIGFsbCBlbGltaW5hdGlvbnMgZXhjZXB0CisgIGZyb20gdGhlIHNvZnQgZnJhbWUgcG9pbnRlciB0byB0aGUgaGFyZCBmcmFtZSBwb2ludGVyLiAgKi8KKworCitpbnQKK2F2cjMyX2luaXRpYWxfZWxpbWluYXRpb25fb2Zmc2V0IChpbnQgZnJvbSwgaW50IHRvKQoreworICBpbnQgaTsKKyAgaW50IGNhbGxfc2F2ZWRfcmVncyA9IDA7CisgIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcmVnX21hc2ssIHNhdmVkX2ZwX3JlZ19tYXNrOworICB1bnNpZ25lZCBpbnQgbG9jYWxfdmFycyA9IGdldF9mcmFtZV9zaXplICgpOworCisgIHNhdmVkX3JlZ19tYXNrID0gYXZyMzJfY29tcHV0ZV9zYXZlX3JlZ19tYXNrIChUUlVFKTsKKyAgc2F2ZWRfZnBfcmVnX21hc2sgPSBhdnIzMl9jb21wdXRlX3NhdmVfZnBfcmVnX21hc2sgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisgICAgeworICAgICAgaWYgKHNhdmVkX3JlZ19tYXNrICYgKDEgPDwgaSkpCisJY2FsbF9zYXZlZF9yZWdzICs9IDQ7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fRlBfUkVHUzsgKytpKQorICAgIHsKKyAgICAgIGlmIChzYXZlZF9mcF9yZWdfbWFzayAmICgxIDw8IGkpKQorCWNhbGxfc2F2ZWRfcmVncyArPSA0OworICAgIH0KKworICBzd2l0Y2ggKGZyb20pCisgICAgeworICAgIGNhc2UgQVJHX1BPSU5URVJfUkVHTlVNOgorICAgICAgc3dpdGNoICh0bykKKwl7CisJY2FzZSBTVEFDS19QT0lOVEVSX1JFR05VTToKKwkgIHJldHVybiBjYWxsX3NhdmVkX3JlZ3MgKyBsb2NhbF92YXJzOworCWNhc2UgRlJBTUVfUE9JTlRFUl9SRUdOVU06CisJICByZXR1cm4gY2FsbF9zYXZlZF9yZWdzOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisgICAgY2FzZSBGUkFNRV9QT0lOVEVSX1JFR05VTToKKyAgICAgIHN3aXRjaCAodG8pCisJeworCWNhc2UgU1RBQ0tfUE9JTlRFUl9SRUdOVU06CisJICByZXR1cm4gbG9jYWxfdmFyczsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKworLyoKKyAgUmV0dXJucyBhIHJ0eCB1c2VkIHdoZW4gcGFzc2luZyB0aGUgbmV4dCBhcmd1bWVudCB0byBhIGZ1bmN0aW9uLgorICBhdnIzMl9pbml0X2N1bXVsYXRpdmVfYXJncygpIGFuZCBhdnIzMl9mdW5jdGlvbl9hcmdfYWR2YW5jZSgpIHNldHMgd2l0Y2gKKyAgcmVnaXN0ZXIgdG8gdXNlLgorKi8KK3J0eAorYXZyMzJfZnVuY3Rpb25fYXJnIChDVU1VTEFUSVZFX0FSR1MgKiBjdW0sIGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisJCSAgICB0cmVlIHR5cGUsIGludCBuYW1lZCkKK3sKKyAgaW50IGluZGV4ID0gLTE7CisKKyAgSE9TVF9XSURFX0lOVCBhcmdfc2l6ZSwgYXJnX3JzaXplOworICBpZiAodHlwZSkKKyAgICB7CisgICAgICBhcmdfc2l6ZSA9IGludF9zaXplX2luX2J5dGVzICh0eXBlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhcmdfc2l6ZSA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpOworICAgIH0KKyAgYXJnX3JzaXplID0gUFVTSF9ST1VORElORyAoYXJnX3NpemUpOworCisgIC8qCisgICAgIFRoZSBsYXN0IHRpbWUgdGhpcyBtYWNybyBpcyBjYWxsZWQsIGl0IGlzIGNhbGxlZCB3aXRoIG1vZGUgPT0gVk9JRG1vZGUsCisgICAgIGFuZCBpdHMgcmVzdWx0IGlzIHBhc3NlZCB0byB0aGUgY2FsbCBvciBjYWxsX3ZhbHVlIHBhdHRlcm4gYXMgb3BlcmFuZHMgMgorICAgICBhbmQgMyByZXNwZWN0aXZlbHkuICovCisgIGlmIChtb2RlID09IFZPSURtb2RlKQorICAgIHsKKyAgICAgIHJldHVybiBnZW5fcnR4X0NPTlNUX0lOVCAoU0ltb2RlLCAyMik7CS8qIFRvRG86IGZpeG1lLiAqLworICAgIH0KKworICBpZiAoKCp0YXJnZXRtLmNhbGxzLm11c3RfcGFzc19pbl9zdGFjaykgKG1vZGUsIHR5cGUpIHx8ICFuYW1lZCkKKyAgICB7CisgICAgICByZXR1cm4gTlVMTF9SVFg7CisgICAgfQorCisgIGlmIChhcmdfcnNpemUgPT0gOCkKKyAgICB7CisgICAgICAvKiB1c2UgcjExOnIxMCBvciByOTpyOC4gKi8KKyAgICAgIGlmICghKEdFVF9VU0VEX0lOREVYIChjdW0sIDEpIHx8IEdFVF9VU0VEX0lOREVYIChjdW0sIDIpKSkKKwlpbmRleCA9IDE7CisgICAgICBlbHNlIGlmICghKEdFVF9VU0VEX0lOREVYIChjdW0sIDMpIHx8IEdFVF9VU0VEX0lOREVYIChjdW0sIDQpKSkKKwlpbmRleCA9IDM7CisgICAgICBlbHNlCisJaW5kZXggPSAtMTsKKyAgICB9CisgIGVsc2UgaWYgKGFyZ19yc2l6ZSA9PSA0KQorICAgIHsJCQkJLyogVXNlIGZpcnN0IGF2YWlsYWJsZSByZWdpc3RlciAqLworICAgICAgaW5kZXggPSAwOworICAgICAgd2hpbGUgKGluZGV4IDw9IExBU1RfQ1VNX1JFR19JTkRFWCAmJiBHRVRfVVNFRF9JTkRFWCAoY3VtLCBpbmRleCkpCisJaW5kZXgrKzsKKyAgICAgIGlmIChpbmRleCA+IExBU1RfQ1VNX1JFR19JTkRFWCkKKwlpbmRleCA9IC0xOworICAgIH0KKworICBTRVRfUkVHX0lOREVYIChjdW0sIGluZGV4KTsKKworICBpZiAoR0VUX1JFR19JTkRFWCAoY3VtKSA+PSAwKQorICAgIHJldHVybiBnZW5fcnR4X1JFRyAobW9kZSwKKwkJCWF2cjMyX2Z1bmN0aW9uX2FyZ19yZWdsaXN0W0dFVF9SRUdfSU5ERVggKGN1bSldKTsKKworICByZXR1cm4gTlVMTF9SVFg7Cit9CisKKy8qCisgIFNldCB0aGUgcmVnaXN0ZXIgdXNlZCBmb3IgcGFzc2luZyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYSBmdW5jdGlvbi4KKyovCit2b2lkCithdnIzMl9pbml0X2N1bXVsYXRpdmVfYXJncyAoQ1VNVUxBVElWRV9BUkdTICogY3VtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlIGZudHlwZSBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eCBsaWJuYW1lIEFUVFJJQlVURV9VTlVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSBmbmRlY2wgQVRUUklCVVRFX1VOVVNFRCkKKyAgeworICAgIC8qIFNldCBhbGwgcmVnaXN0ZXJzIGFzIHVudXNlZC4gKi8KKyAgICBTRVRfSU5ERVhFU19VTlVTRUQgKGN1bSk7CisKKyAgICAvKiBSZXNldCB1c2VzX2Fub255bW91c19hcmdzICovCisgICAgY3VtLT51c2VzX2Fub255bW91c19hcmdzID0gMDsKKworICAgIC8qIFJlc2V0IHNpemUgb2Ygc3RhY2sgcHVzaGVkIGFyZ3VtZW50cyAqLworICAgIGN1bS0+c3RhY2tfcHVzaGVkX2FyZ3Nfc2l6ZSA9IDA7CisgIH0KKworLyoKKyAgU2V0IHJlZ2lzdGVyIHVzZWQgZm9yIHBhc3NpbmcgdGhlIG5leHQgYXJndW1lbnQgdG8gYSBmdW5jdGlvbi4gT25seSB0aGUKKyAgU2NyYXRjaCBSZWdpc3RlcnMgYXJlIHVzZWQuCisKKwkJbnVtYmVyICBuYW1lCisJCSAgIDE1ICAgcjE1ICBQQworCQkgICAxNCAgIHIxNCAgTFIKKwkJICAgMTMgICByMTMgX1NQX19fX19fX19fCisgICAgIEZJUlNUX0NVTV9SRUcgMTIgICByMTIgX3x8XworCQkgICAxMCAgIHIxMSAgfHwKKwkJICAgMTEgICByMTAgX3x8XyAgU2NyYXRjaCBSZWdpc3RlcnMKKwkJICAgIDggICByOSAgIHx8CisgIExBU1RfU0NSQVRDSF9SRUcgIDkgICByOCAgX1wvX19fX19fX19fCisJCSAgICA2ICAgcjcgICAvXAorCQkgICAgNyAgIHI2ICAgfHwKKwkJICAgIDQgICByNSAgIHx8CisJCSAgICA1ICAgcjQgICB8fAorCQkgICAgMiAgIHIzICAgfHwKKwkJICAgIDMgICByMiAgIHx8CisJCSAgICAwICAgcjEgICB8fAorCQkgICAgMSAgIHIwICBffHxfX19fX19fX18KKworKi8KK3ZvaWQKK2F2cjMyX2Z1bmN0aW9uX2FyZ19hZHZhbmNlIChDVU1VTEFUSVZFX0FSR1MgKiBjdW0sIGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisJCQkgICAgdHJlZSB0eXBlLCBpbnQgbmFtZWQgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgSE9TVF9XSURFX0lOVCBhcmdfc2l6ZSwgYXJnX3JzaXplOworCisgIGlmICh0eXBlKQorICAgIHsKKyAgICAgIGFyZ19zaXplID0gaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFyZ19zaXplID0gR0VUX01PREVfU0laRSAobW9kZSk7CisgICAgfQorICBhcmdfcnNpemUgPSBQVVNIX1JPVU5ESU5HIChhcmdfc2l6ZSk7CisKKyAgLyogSXQgdGhlIGFyZ3VtZW50IGhhZCB0byBiZSBwYXNzZWQgaW4gc3RhY2ssIG5vIHJlZ2lzdGVyIGlzIHVzZWQuICovCisgIGlmICgoKnRhcmdldG0uY2FsbHMubXVzdF9wYXNzX2luX3N0YWNrKSAobW9kZSwgdHlwZSkpCisgICAgeworICAgICAgY3VtLT5zdGFja19wdXNoZWRfYXJnc19zaXplICs9IFBVU0hfUk9VTkRJTkcgKGludF9zaXplX2luX2J5dGVzICh0eXBlKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE1hcmsgdGhlIHVzZWQgcmVnaXN0ZXJzIGFzICJ1c2VkIi4gKi8KKyAgaWYgKEdFVF9SRUdfSU5ERVggKGN1bSkgPj0gMCkKKyAgICB7CisgICAgICBTRVRfVVNFRF9JTkRFWCAoY3VtLCBHRVRfUkVHX0lOREVYIChjdW0pKTsKKyAgICAgIGlmIChhcmdfcnNpemUgPT0gOCkKKwl7CisJICBTRVRfVVNFRF9JTkRFWCAoY3VtLCAoR0VUX1JFR19JTkRFWCAoY3VtKSArIDEpKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSGFkIHRvIHVzZSBzdGFjayAqLworICAgICAgY3VtLT5zdGFja19wdXNoZWRfYXJnc19zaXplICs9IGFyZ19yc2l6ZTsKKyAgICB9Cit9CisKKy8qCisgIERlZmluZXMgd2l0Y2ggZGlyZWN0aW9uIHRvIGdvIHRvIGZpbmQgdGhlIG5leHQgcmVnaXN0ZXIgdG8gdXNlIGlmIHRoZQorICBhcmd1bWVudCBpcyBsYXJnZXIgdGhlbiBvbmUgcmVnaXN0ZXIgb3IgZm9yIGFyZ3VtZW50cyBzaG9ydGVyIHRoYW4gYW4KKyAgaW50IHdoaWNoIGlzIG5vdCBwcm9tb3RlZCwgc3VjaCBhcyB0aGUgbGFzdCBwYXJ0IG9mIHN0cnVjdHVyZXMgd2l0aAorICBzaXplIG5vdCBhIG11bHRpcGxlIG9mIDQuICovCitlbnVtIGRpcmVjdGlvbgorYXZyMzJfZnVuY3Rpb25fYXJnX3BhZGRpbmcgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUgQVRUUklCVVRFX1VOVVNFRCwKKwkJCSAgICB0cmVlIHR5cGUpCit7CisgIC8qIFBhZCB1cHdhcmQgZm9yIGFsbCBhZ2dyZWdhdGVzIGV4Y2VwdCBieXRlIGFuZCBoYWxmd29yZCBzaXplZCBhZ2dyZWdhdGVzCisgICAgIHdoaWNoIGNhbiBiZSBwYXNzZWQgaW4gcmVnaXN0ZXJzLiAqLworICBpZiAodHlwZQorICAgICAgJiYgQUdHUkVHQVRFX1RZUEVfUCAodHlwZSkKKyAgICAgICYmIChpbnRfc2l6ZV9pbl9ieXRlcyAodHlwZSkgIT0gMSkKKyAgICAgICYmICEoKGludF9zaXplX2luX2J5dGVzICh0eXBlKSA9PSAyKQorCSAgICYmIFRZUEVfQUxJR05fVU5JVCAodHlwZSkgPj0gMikKKyAgICAgICYmIChpbnRfc2l6ZV9pbl9ieXRlcyAodHlwZSkgJiAweDMpKQorICAgIHsKKyAgICAgIHJldHVybiB1cHdhcmQ7CisgICAgfQorCisgIHJldHVybiBkb3dud2FyZDsKK30KKworLyoKKyAgUmV0dXJuIGEgcnR4IHVzZWQgZm9yIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBhIGZ1bmN0aW9uIGNhbGwuCisqLworcnR4CithdnIzMl9mdW5jdGlvbl92YWx1ZSAodHJlZSB0eXBlLCB0cmVlIGZ1bmMsIGJvb2wgb3V0Z29pbmcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgaWYgKGF2cjMyX3JldHVybl9pbl9tZW1vcnkgKHR5cGUsIGZ1bmMpKQorICAgIHJldHVybiBOVUxMX1JUWDsKKworICBpZiAoaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpIDw9IDQpCisgICAgaWYgKGF2cjMyX3JldHVybl9pbl9tc2IgKHR5cGUpKQorICAgICAgLyogQWdncmVnYXRlcyBvZiBzaXplIGxlc3MgdGhhbiBhIHdvcmQgd2hpY2ggZG9lcyBhbGlnbiB0aGUgZGF0YSBpbiB0aGUKKyAgICAgICAgIE1TQiBtdXN0IHVzZSBTSW1vZGUgZm9yIHIxMi4gKi8KKyAgICAgIHJldHVybiBnZW5fcnR4X1JFRyAoU0ltb2RlLCBSRVRfUkVHSVNURVIpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnZW5fcnR4X1JFRyAoVFlQRV9NT0RFICh0eXBlKSwgUkVUX1JFR0lTVEVSKTsKKyAgZWxzZSBpZiAoaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpIDw9IDgpCisgICAgcmV0dXJuIGdlbl9ydHhfUkVHIChUWVBFX01PREUgKHR5cGUpLCBJTlRFUk5BTF9SRUdOVU0gKDExKSk7CisKKyAgcmV0dXJuIE5VTExfUlRYOworfQorCisvKgorICBSZXR1cm4gYSBydHggdXNlZCBmb3IgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGEgbGlicmFyeSBmdW5jdGlvbiBjYWxsLgorKi8KK3J0eAorYXZyMzJfbGliY2FsbF92YWx1ZSAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSkKK3sKKworICBpZiAoR0VUX01PREVfU0laRSAobW9kZSkgPD0gNCkKKyAgICByZXR1cm4gZ2VuX3J0eF9SRUcgKG1vZGUsIFJFVF9SRUdJU1RFUik7CisgIGVsc2UgaWYgKEdFVF9NT0RFX1NJWkUgKG1vZGUpIDw9IDgpCisgICAgcmV0dXJuIGdlbl9ydHhfUkVHIChtb2RlLCBJTlRFUk5BTF9SRUdOVU0gKDExKSk7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTF9SVFg7Cit9CisKKy8qIFJldHVybiBUUlVFIGlmIFggcmVmZXJlbmNlcyBhIFNZTUJPTF9SRUYuICAqLworaW50CitzeW1ib2xfbWVudGlvbmVkX3AgKHJ0eCB4KQoreworICBjb25zdCBjaGFyICpmbXQ7CisgIGludCBpOworCisgIGlmIChHRVRfQ09ERSAoeCkgPT0gU1lNQk9MX1JFRikKKyAgICByZXR1cm4gMTsKKworICBmbXQgPSBHRVRfUlRYX0ZPUk1BVCAoR0VUX0NPREUgKHgpKTsKKworICBmb3IgKGkgPSBHRVRfUlRYX0xFTkdUSCAoR0VUX0NPREUgKHgpKSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGlmIChmbXRbaV0gPT0gJ0UnKQorCXsKKwkgIGludCBqOworCisJICBmb3IgKGogPSBYVkVDTEVOICh4LCBpKSAtIDE7IGogPj0gMDsgai0tKQorCSAgICBpZiAoc3ltYm9sX21lbnRpb25lZF9wIChYVkVDRVhQICh4LCBpLCBqKSkpCisJICAgICAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZSBpZiAoZm10W2ldID09ICdlJyAmJiBzeW1ib2xfbWVudGlvbmVkX3AgKFhFWFAgKHgsIGkpKSkKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiBUUlVFIGlmIFggcmVmZXJlbmNlcyBhIExBQkVMX1JFRi4gICovCitpbnQKK2xhYmVsX21lbnRpb25lZF9wIChydHggeCkKK3sKKyAgY29uc3QgY2hhciAqZm10OworICBpbnQgaTsKKworICBpZiAoR0VUX0NPREUgKHgpID09IExBQkVMX1JFRikKKyAgICByZXR1cm4gMTsKKworICBmbXQgPSBHRVRfUlRYX0ZPUk1BVCAoR0VUX0NPREUgKHgpKTsKKyAgZm9yIChpID0gR0VUX1JUWF9MRU5HVEggKEdFVF9DT0RFICh4KSkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBpZiAoZm10W2ldID09ICdFJykKKwl7CisJICBpbnQgajsKKworCSAgZm9yIChqID0gWFZFQ0xFTiAoeCwgaSkgLSAxOyBqID49IDA7IGotLSkKKwkgICAgaWYgKGxhYmVsX21lbnRpb25lZF9wIChYVkVDRVhQICh4LCBpLCBqKSkpCisJICAgICAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZSBpZiAoZm10W2ldID09ICdlJyAmJiBsYWJlbF9tZW50aW9uZWRfcCAoWEVYUCAoeCwgaSkpKQorCXJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIFRSVUUgaWYgWCBjb250YWlucyBhIE1FTSBleHByZXNzaW9uLiAgKi8KK2ludAorbWVtX21lbnRpb25lZF9wIChydHggeCkKK3sKKyAgY29uc3QgY2hhciAqZm10OworICBpbnQgaTsKKworICBpZiAoTUVNX1AgKHgpKQorICAgIHJldHVybiAxOworCisgIGZtdCA9IEdFVF9SVFhfRk9STUFUIChHRVRfQ09ERSAoeCkpOworICBmb3IgKGkgPSBHRVRfUlRYX0xFTkdUSCAoR0VUX0NPREUgKHgpKSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGlmIChmbXRbaV0gPT0gJ0UnKQorCXsKKwkgIGludCBqOworCisJICBmb3IgKGogPSBYVkVDTEVOICh4LCBpKSAtIDE7IGogPj0gMDsgai0tKQorCSAgICBpZiAobWVtX21lbnRpb25lZF9wIChYVkVDRVhQICh4LCBpLCBqKSkpCisJICAgICAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZSBpZiAoZm10W2ldID09ICdlJyAmJiBtZW1fbWVudGlvbmVkX3AgKFhFWFAgKHgsIGkpKSkKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorYXZyMzJfbGVnaXRpbWF0ZV9waWNfb3BlcmFuZF9wIChydHggeCkKK3sKKworICAvKiBXZSBjYW4ndCBoYXZlIGNvbnN0LCB0aGlzIG11c3QgYmUgYnJva2VuIGRvd24gdG8gYSBzeW1ib2wuICovCisgIGlmIChHRVRfQ09ERSAoeCkgPT0gQ09OU1QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENhbid0IGFjY2VzcyBzeW1ib2xzIG9yIGxhYmVscyB2aWEgdGhlIGNvbnN0YW50IHBvb2wgZWl0aGVyICovCisgIGlmICgoR0VUX0NPREUgKHgpID09IFNZTUJPTF9SRUYKKyAgICAgICAmJiBDT05TVEFOVF9QT09MX0FERFJFU1NfUCAoeCkKKyAgICAgICAmJiAoc3ltYm9sX21lbnRpb25lZF9wIChnZXRfcG9vbF9jb25zdGFudCAoeCkpCisJICAgfHwgbGFiZWxfbWVudGlvbmVkX3AgKGdldF9wb29sX2NvbnN0YW50ICh4KSkpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworcnR4CitsZWdpdGltaXplX3BpY19hZGRyZXNzIChydHggb3JpZywgZW51bSBtYWNoaW5lX21vZGUgbW9kZSBBVFRSSUJVVEVfVU5VU0VELAorCQkJcnR4IHJlZykKK3sKKworICBpZiAoR0VUX0NPREUgKG9yaWcpID09IFNZTUJPTF9SRUYgfHwgR0VUX0NPREUgKG9yaWcpID09IExBQkVMX1JFRikKKyAgICB7CisgICAgICBpbnQgc3VicmVncyA9IDA7CisKKyAgICAgIGlmIChyZWcgPT0gMCkKKwl7CisJICBpZiAobm9fbmV3X3BzZXVkb3MpCisJICAgIGFib3J0ICgpOworCSAgZWxzZQorCSAgICByZWcgPSBnZW5fcmVnX3J0eCAoUG1vZGUpOworCisJICBzdWJyZWdzID0gMTsKKwl9CisKKyAgICAgIGVtaXRfbW92ZV9pbnNuIChyZWcsIG9yaWcpOworCisgICAgICAvKiBPbmx5IHNldCBjdXJyZW50IGZ1bmN0aW9uIGFzIHVzaW5nIHBpYyBvZmZzZXQgdGFibGUgaWYgZmxhZ19waWMgaXMKKyAgICAgICAgIHNldC4gVGhpcyBpcyBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGlmCisgICAgICAgICBUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MgaXMgc2V0LiAqLworICAgICAgaWYgKGZsYWdfcGljKQorCWN1cnJlbnRfZnVuY3Rpb25fdXNlc19waWNfb2Zmc2V0X3RhYmxlID0gMTsKKworICAgICAgLyogUHV0IGEgUkVHX0VRVUFMIG5vdGUgb24gdGhpcyBpbnNuLCBzbyB0aGF0IGl0IGNhbiBiZSBvcHRpbWl6ZWQgYnkKKyAgICAgICAgIGxvb3AuICAqLworICAgICAgcmV0dXJuIHJlZzsKKyAgICB9CisgIGVsc2UgaWYgKEdFVF9DT0RFIChvcmlnKSA9PSBDT05TVCkKKyAgICB7CisgICAgICBydHggYmFzZSwgb2Zmc2V0OworCisgICAgICBpZiAoZmxhZ19waWMKKwkgICYmIEdFVF9DT0RFIChYRVhQIChvcmlnLCAwKSkgPT0gUExVUworCSAgJiYgWEVYUCAoWEVYUCAob3JpZywgMCksIDApID09IHBpY19vZmZzZXRfdGFibGVfcnR4KQorCXJldHVybiBvcmlnOworCisgICAgICBpZiAocmVnID09IDApCisJeworCSAgaWYgKG5vX25ld19wc2V1ZG9zKQorCSAgICBhYm9ydCAoKTsKKwkgIGVsc2UKKwkgICAgcmVnID0gZ2VuX3JlZ19ydHggKFBtb2RlKTsKKwl9CisKKyAgICAgIGlmIChHRVRfQ09ERSAoWEVYUCAob3JpZywgMCkpID09IFBMVVMpCisJeworCSAgYmFzZSA9CisJICAgIGxlZ2l0aW1pemVfcGljX2FkZHJlc3MgKFhFWFAgKFhFWFAgKG9yaWcsIDApLCAwKSwgUG1vZGUsIHJlZyk7CisJICBvZmZzZXQgPQorCSAgICBsZWdpdGltaXplX3BpY19hZGRyZXNzIChYRVhQIChYRVhQIChvcmlnLCAwKSwgMSksIFBtb2RlLAorCQkJCSAgICBiYXNlID09IHJlZyA/IDAgOiByZWcpOworCX0KKyAgICAgIGVsc2UKKwlhYm9ydCAoKTsKKworICAgICAgaWYgKEdFVF9DT0RFIChvZmZzZXQpID09IENPTlNUX0lOVCkKKwl7CisJICAvKiBUaGUgYmFzZSByZWdpc3RlciBkb2Vzbid0IHJlYWxseSBtYXR0ZXIsIHdlIG9ubHkgd2FudCB0byB0ZXN0CisJICAgICB0aGUgaW5kZXggZm9yIHRoZSBhcHByb3ByaWF0ZSBtb2RlLiAgKi8KKwkgIGlmICghYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoSU5UVkFMIChvZmZzZXQpLCAnSScsICJJczIxIikpCisJICAgIHsKKwkgICAgICBpZiAoIW5vX25ld19wc2V1ZG9zKQorCQlvZmZzZXQgPSBmb3JjZV9yZWcgKFBtb2RlLCBvZmZzZXQpOworCSAgICAgIGVsc2UKKwkJYWJvcnQgKCk7CisJICAgIH0KKworCSAgaWYgKEdFVF9DT0RFIChvZmZzZXQpID09IENPTlNUX0lOVCkKKwkgICAgcmV0dXJuIHBsdXNfY29uc3RhbnQgKGJhc2UsIElOVFZBTCAob2Zmc2V0KSk7CisJfQorCisgICAgICByZXR1cm4gZ2VuX3J0eF9QTFVTIChQbW9kZSwgYmFzZSwgb2Zmc2V0KTsKKyAgICB9CisKKyAgcmV0dXJuIG9yaWc7Cit9CisKKy8qIEdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgUElDIHJlZ2lzdGVyLiAgKi8KK3ZvaWQKK2F2cjMyX2xvYWRfcGljX3JlZ2lzdGVyICh2b2lkKQoreworICBydHggbDEsIHBpY190bXA7CisgIHJ0eCBnbG9iYWxfb2Zmc2V0X3RhYmxlOworCisgIGlmICgoY3VycmVudF9mdW5jdGlvbl91c2VzX3BpY19vZmZzZXRfdGFibGUgPT0gMCkgfHwgVEFSR0VUX05PX0lOSVRfR09UKQorICAgIHJldHVybjsKKworICBpZiAoIWZsYWdfcGljKQorICAgIGFib3J0ICgpOworCisgIGwxID0gZ2VuX2xhYmVsX3J0eCAoKTsKKworICBnbG9iYWxfb2Zmc2V0X3RhYmxlID0gZ2VuX3J0eF9TWU1CT0xfUkVGIChQbW9kZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpOworICBwaWNfdG1wID0KKyAgICBnZW5fcnR4X0NPTlNUIChQbW9kZSwKKwkJICAgZ2VuX3J0eF9NSU5VUyAoU0ltb2RlLCBnZW5fcnR4X0xBQkVMX1JFRiAoUG1vZGUsIGwxKSwKKwkJCQkgIGdsb2JhbF9vZmZzZXRfdGFibGUpKTsKKyAgZW1pdF9pbnNuIChnZW5fcGljX2xvYWRfYWRkcgorCSAgICAgKHBpY19vZmZzZXRfdGFibGVfcnR4LCBmb3JjZV9jb25zdF9tZW0gKFNJbW9kZSwgcGljX3RtcCkpKTsKKyAgZW1pdF9pbnNuIChnZW5fcGljX2NvbXB1dGVfZ290X2Zyb21fcGMgKHBpY19vZmZzZXRfdGFibGVfcnR4LCBsMSkpOworCisgIC8qIE5lZWQgdG8gZW1pdCB0aGlzIHdoZXRoZXIgb3Igbm90IHdlIG9iZXkgcmVnZGVjbHMsIHNpbmNlIHNldGptcC9sb25nam1wCisgICAgIGNhbiBjYXVzZSBsaWZlIGluZm8gdG8gc2NyZXcgdXAuICAqLworICBlbWl0X2luc24gKGdlbl9ydHhfVVNFIChWT0lEbW9kZSwgcGljX29mZnNldF90YWJsZV9ydHgpKTsKK30KKworCisKKy8qIFRoaXMgaG9vayBzaG91bGQgcmV0dXJuIHRydWUgaWYgdmFsdWVzIG9mIHR5cGUgdHlwZSBhcmUgcmV0dXJuZWQgYXQgdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGVuZCBvZiBhIHJlZ2lzdGVyIChpbiBvdGhlciB3b3JkcywgaWYgdGhleSBhcmUgcGFkZGVkIGF0IHRoZQorICAgbGVhc3Qgc2lnbmlmaWNhbnQgZW5kKS4gWW91IGNhbiBhc3N1bWUgdGhhdCB0eXBlIGlzIHJldHVybmVkIGluIGEgcmVnaXN0ZXI7CisgICB0aGUgY2FsbGVyIGlzIHJlcXVpcmVkIHRvIGNoZWNrIHRoaXMuICBOb3RlIHRoYXQgdGhlIHJlZ2lzdGVyIHByb3ZpZGVkIGJ5CisgICBGVU5DVElPTl9WQUxVRSBtdXN0IGJlIGFibGUgdG8gaG9sZCB0aGUgY29tcGxldGUgcmV0dXJuIHZhbHVlLiBGb3IgZXhhbXBsZSwKKyAgIGlmIGEgMS0sIDItIG9yIDMtYnl0ZSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZW5kIG9mIGEKKyAgIDQtYnl0ZSByZWdpc3RlciwgRlVOQ1RJT05fVkFMVUUgc2hvdWxkIHByb3ZpZGUgYW4gU0ltb2RlIHJ0eC4gKi8KK2Jvb2wKK2F2cjMyX3JldHVybl9pbl9tc2IgKHRyZWUgdHlwZSBBVFRSSUJVVEVfVU5VU0VEKQoreworICAvKiBpZiAoIEFHR1JFR0FURV9UWVBFX1AgKHR5cGUpICkgaWYgKChpbnRfc2l6ZV9pbl9ieXRlcyh0eXBlKSA9PSAxKSB8fAorICAgICAoKGludF9zaXplX2luX2J5dGVzKHR5cGUpID09IDIpICYmIFRZUEVfQUxJR05fVU5JVCh0eXBlKSA+PSAyKSkgcmV0dXJuCisgICAgIGZhbHNlOyBlbHNlIHJldHVybiB0cnVlOyAqLworCisgIHJldHVybiBmYWxzZTsKK30KKworCisvKgorICBSZXR1cm5zIG9uZSBpZiBhIGNlcnRhaW4gZnVuY3Rpb24gdmFsdWUgaXMgZ29pbmcgdG8gYmUgcmV0dXJuZWQgaW4gbWVtb3J5CisgIGFuZCB6ZXJvIGlmIGl0IGlzIGdvaW5nIHRvIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuCisKKyAgQkxLbW9kZSBhbmQgYWxsIG90aGVyIG1vZGVzIHRoYXQgaXMgbGFyZ2VyIHRoYW4gNjQgYml0cyBhcmUgcmV0dXJuZWQgaW4KKyAgbWVtb3J5LgorKi8KK2Jvb2wKK2F2cjMyX3JldHVybl9pbl9tZW1vcnkgKHRyZWUgdHlwZSwgdHJlZSBmbnR5cGUgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgaWYgKFRZUEVfTU9ERSAodHlwZSkgPT0gVk9JRG1vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChpbnRfc2l6ZV9pbl9ieXRlcyAodHlwZSkgPiAoMiAqIFVOSVRTX1BFUl9XT1JEKQorICAgICAgfHwgaW50X3NpemVfaW5fYnl0ZXMgKHR5cGUpID09IC0xKQorICAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBJZiB3ZSBoYXZlIGFuIGFnZ3JlZ2F0ZSB0aGVuIHVzZSB0aGUgc2FtZSBtZWNoYW5pc20gYXMgd2hlbiBjaGVja2luZyBpZgorICAgICBpdCBzaG91bGQgYmUgcGFzc2VkIG9uIHRoZSBzdGFjay4gKi8KKyAgaWYgKHR5cGUKKyAgICAgICYmIEFHR1JFR0FURV9UWVBFX1AgKHR5cGUpCisgICAgICAmJiAoKnRhcmdldG0uY2FsbHMubXVzdF9wYXNzX2luX3N0YWNrKSAoVFlQRV9NT0RFICh0eXBlKSwgdHlwZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIE91dHB1dCB0aGUgY29uc3RhbnQgcGFydCBvZiB0aGUgdHJhbXBvbGluZS4KKyAgIGxkZHBjICAgIHIwLCBwY1sweDg6ZV0gOyBsb2FkIHN0YXRpYyBjaGFpbiByZWdpc3RlcgorICAgbGRkcGMgICAgcGMsIHBjWzB4ODplXSA7IGp1bXAgdG8gc3VicnV0aW5lCisgICAubG9uZyAgICAwCQkgOyBBZGRyZXNzIHRvIHN0YXRpYyBjaGFpbiwKKwkJCSA7IGZpbGxlZCBpbiBieSBhdnIzMl9pbml0aWFsaXplX3RyYW1wb2xpbmUoKQorICAgLmxvbmcgICAgMAkJIDsgQWRkcmVzcyB0byBzdWJydXRpbmUsCisJCQkgOyBmaWxsZWQgaW4gYnkgYXZyMzJfaW5pdGlhbGl6ZV90cmFtcG9saW5lKCkKKyovCit2b2lkCithdnIzMl90cmFtcG9saW5lX3RlbXBsYXRlIChGSUxFICogZmlsZSkKK3sKKyAgZnByaW50ZiAoZmlsZSwgIlx0bGRkcGMgICAgcjAsIHBjWzhdXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIlx0bGRkcGMgICAgcGMsIHBjWzhdXG4iKTsKKyAgLyogbWFrZSByb29tIGZvciB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhdGljIGNoYWluLiAqLworICBmcHJpbnRmIChmaWxlLCAiXHQubG9uZ1x0MFxuIik7CisgIC8qIG1ha2Ugcm9vbSBmb3IgdGhlIGFkZHJlc3MgdG8gdGhlIHN1YnJ1dGluZS4gKi8KKyAgZnByaW50ZiAoZmlsZSwgIlx0LmxvbmdcdDBcbiIpOworfQorCisKKy8qCisgIEluaXRpYWxpemUgdGhlIHZhcmlhYmxlIHBhcnRzIG9mIGEgdHJhbXBvbGluZS4KKyovCit2b2lkCithdnIzMl9pbml0aWFsaXplX3RyYW1wb2xpbmUgKHJ0eCBhZGRyLCBydHggZm5hZGRyLCBydHggc3RhdGljX2NoYWluKQoreworICAvKiBTdG9yZSB0aGUgYWRkcmVzcyB0byB0aGUgc3RhdGljIGNoYWluLiAqLworICBlbWl0X21vdmVfaW5zbiAoZ2VuX3J0eF9NRU0KKwkJICAoU0ltb2RlLCBwbHVzX2NvbnN0YW50IChhZGRyLCBUUkFNUE9MSU5FX1NJWkUgLSA0KSksCisJCSAgc3RhdGljX2NoYWluKTsKKworICAvKiBTdG9yZSB0aGUgYWRkcmVzcyB0byB0aGUgZnVuY3Rpb24uICovCisgIGVtaXRfbW92ZV9pbnNuIChnZW5fcnR4X01FTSAoU0ltb2RlLCBwbHVzX2NvbnN0YW50IChhZGRyLCBUUkFNUE9MSU5FX1NJWkUpKSwKKwkJICBmbmFkZHIpOworCisgIGVtaXRfaW5zbiAoZ2VuX2NhY2hlIChnZW5fcnR4X1JFRyAoU0ltb2RlLCAxMyksCisJCQlnZW5fcnR4X0NPTlNUX0lOVCAoU0ltb2RlLAorCQkJCQkgICBBVlIzMl9DQUNIRV9JTlZBTElEQVRFX0lDQUNIRSkpKTsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgWCBpcyB2YWxpZCBhcyBhbiBhZGRyZXNzaW5nIHJlZ2lzdGVyLiAgKi8KK2ludAorYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAocnR4IHgsIGludCBzdHJpY3RfcCkKK3sKKyAgaW50IHJlZ25vOworCisgIGlmICghcmVnaXN0ZXJfb3BlcmFuZCh4LCBHRVRfTU9ERSh4KSkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogSWYgc3RyaWN0IHdlIHJlcXVpcmUgdGhlIHJlZ2lzdGVyIHRvIGJlIGEgaGFyZCByZWdpc3Rlci4gKi8KKyAgaWYgKHN0cmljdF9wCisgICAgICAmJiAhUkVHX1AoeCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmVnbm8gPSBSRUdOTyAoeCk7CisKKyAgaWYgKHN0cmljdF9wKQorICAgIHJldHVybiBSRUdOT19PS19GT1JfQkFTRV9QIChyZWdubyk7CisKKyAgcmV0dXJuIChyZWdubyA8PSBMQVNUX1JFR05VTSB8fCByZWdubyA+PSBGSVJTVF9QU0VVRE9fUkVHSVNURVIpOworfQorCisvKiBSZXR1cm4gbm9uemVybyBpZiBJTkRFWCBpcyB2YWxpZCBmb3IgYW4gYWRkcmVzcyBpbmRleCBvcGVyYW5kLiAgKi8KK2ludAorYXZyMzJfbGVnaXRpbWF0ZV9pbmRleF9wIChlbnVtIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggaW5kZXgsIGludCBzdHJpY3RfcCkKK3sKKyAgZW51bSBydHhfY29kZSBjb2RlID0gR0VUX0NPREUgKGluZGV4KTsKKworICBpZiAoR0VUX01PREVfU0laRSAobW9kZSkgPiA4KQorICAgIHJldHVybiAwOworCisgIC8qIFN0YW5kYXJkIGNvcHJvY2Vzc29yIGFkZHJlc3NpbmcgbW9kZXMuICAqLworICBpZiAoY29kZSA9PSBDT05TVF9JTlQpCisgICAgeworICAgICAgaWYgKFRBUkdFVF9IQVJEX0ZMT0FUICYmIEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX0ZMT0FUKQorCS8qIENvcHJvY2Vzc29yIG1lbSBpbnNucyBoYXMgYSBzbWFsbGVyIHJlYWNoIHRoYW4gb3JkaW5hcnkgbWVtIGluc25zICovCisJcmV0dXJuIENPTlNUX09LX0ZPUl9DT05TVFJBSU5UX1AgKElOVFZBTCAoaW5kZXgpLCAnSycsICJLdTE0Iik7CisgICAgICBlbHNlCisJcmV0dXJuIENPTlNUX09LX0ZPUl9DT05TVFJBSU5UX1AgKElOVFZBTCAoaW5kZXgpLCAnSycsICJLczE2Iik7CisgICAgfQorCisgIGlmIChhdnIzMl9hZGRyZXNzX3JlZ2lzdGVyX3J0eF9wIChpbmRleCwgc3RyaWN0X3ApKQorICAgIHJldHVybiAxOworCisgIGlmIChjb2RlID09IE1VTFQpCisgICAgeworICAgICAgcnR4IHhpb3AwID0gWEVYUCAoaW5kZXgsIDApOworICAgICAgcnR4IHhpb3AxID0gWEVYUCAoaW5kZXgsIDEpOworICAgICAgcmV0dXJuICgoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAoeGlvcDAsIHN0cmljdF9wKQorCSAgICAgICAmJiBwb3dlcl9vZl90d29fb3BlcmFuZCAoeGlvcDEsIFNJbW9kZSkKKwkgICAgICAgJiYgKElOVFZBTCAoeGlvcDEpIDw9IDgpKQorCSAgICAgIHx8IChhdnIzMl9hZGRyZXNzX3JlZ2lzdGVyX3J0eF9wICh4aW9wMSwgc3RyaWN0X3ApCisJCSAgJiYgcG93ZXJfb2ZfdHdvX29wZXJhbmQgKHhpb3AwLCBTSW1vZGUpCisJCSAgJiYgKElOVFZBTCAoeGlvcDApIDw9IDgpKSk7CisgICAgfQorICBlbHNlIGlmIChjb2RlID09IEFTSElGVCkKKyAgICB7CisgICAgICBydHggb3AgPSBYRVhQIChpbmRleCwgMSk7CisKKyAgICAgIHJldHVybiAoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAoWEVYUCAoaW5kZXgsIDApLCBzdHJpY3RfcCkKKwkgICAgICAmJiBHRVRfQ09ERSAob3ApID09IENPTlNUX0lOVAorCSAgICAgICYmIElOVFZBTCAob3ApID4gMCAmJiBJTlRWQUwgKG9wKSA8PSAzKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgIFVzZWQgaW4gdGhlIEdPX0lGX0xFR0lUSU1BVEVfQUREUkVTUyBtYWNyby4gUmV0dXJucyBhIG5vbnplcm8gdmFsdWUgaWYKKyAgdGhlIFJUWCB4IGlzIGEgbGVnaXRpbWF0ZSBtZW1vcnkgYWRkcmVzcy4KKworICBSZXR1cm5zIE5PX1JFR1MgaWYgdGhlIGFkZHJlc3MgaXMgbm90IGxlZ2F0aW1lLCBHRU5FUkFMX1JFR1Mgb3IgQUxMX1JFR1MKKyAgaWYgaXQgaXMuCisqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uKi8KK2ludCBpc19taW5pcG9vbF9sYWJlbCAocnR4IGxhYmVsKTsKKworaW50CithdnIzMl9sZWdpdGltYXRlX2FkZHJlc3MgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB4LCBpbnQgc3RyaWN0KQoreworCisgIHN3aXRjaCAoR0VUX0NPREUgKHgpKQorICAgIHsKKyAgICBjYXNlIFJFRzoKKyAgICAgIHJldHVybiBhdnIzMl9hZGRyZXNzX3JlZ2lzdGVyX3J0eF9wICh4LCBzdHJpY3QpOworICAgIGNhc2UgQ09OU1RfSU5UOgorICAgICAgcmV0dXJuICgobW9kZT09U0ltb2RlKQorICAgICAgICAgICAgICAmJiBDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKElOVFZBTCh4KSwgJ0snLCAiS3MxNyIpKTsKKyAgICBjYXNlIENPTlNUOgorICAgICAgeworCXJ0eCBsYWJlbCA9IGF2cjMyX2ZpbmRfc3ltYm9sICh4KTsKKwlpZiAobGFiZWwKKwkgICAgJiYKKwkgICAgKChDT05TVEFOVF9QT09MX0FERFJFU1NfUCAobGFiZWwpCisJICAgICAgJiYgIShmbGFnX3BpYworCQkgICAmJiAoc3ltYm9sX21lbnRpb25lZF9wIChnZXRfcG9vbF9jb25zdGFudCAobGFiZWwpKQorCQkgICAgICAgfHwgbGFiZWxfbWVudGlvbmVkX3AgKGdldF9wb29sX2NvbnN0YW50IChsYWJlbCkpKSkpCisJICAgICAvKiBUT0RPISBDYW4gdGhpcyBldmVyIGhhcHBlbj8/PyAqLworCSAgICAgfHwgKChHRVRfQ09ERSAobGFiZWwpID09IExBQkVMX1JFRikKKwkJICYmIEdFVF9DT0RFIChYRVhQIChsYWJlbCwgMCkpID09IENPREVfTEFCRUwKKwkJICYmIGlzX21pbmlwb29sX2xhYmVsIChYRVhQIChsYWJlbCwgMCkpKQorICAgICAgICAgICAgIC8qfHwgKChHRVRfQ09ERSAobGFiZWwpID09IFNZTUJPTF9SRUYpCisgICAgICAgICAgICAgICAgICYmIG1vZGUgPT0gU0ltb2RlCisgICAgICAgICAgICAgICAgICYmIFNZTUJPTF9SRUZfUk1XX0FERFIobGFiZWwpKSovKSkKKwkgIHsKKwkgICAgcmV0dXJuIFRSVUU7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIExBQkVMX1JFRjoKKyAgICAgIGlmIChHRVRfQ09ERSAoWEVYUCAoeCwgMCkpID09IENPREVfTEFCRUwKKwkgICYmIGlzX21pbmlwb29sX2xhYmVsIChYRVhQICh4LCAwKSkpCisJeworCSAgcmV0dXJuIFRSVUU7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTWU1CT0xfUkVGOgorICAgICAgeworCWlmIChDT05TVEFOVF9QT09MX0FERFJFU1NfUCAoeCkKKwkgICAgJiYgIShmbGFnX3BpYworCQkgJiYgKHN5bWJvbF9tZW50aW9uZWRfcCAoZ2V0X3Bvb2xfY29uc3RhbnQgKHgpKQorCQkgICAgIHx8IGxhYmVsX21lbnRpb25lZF9wIChnZXRfcG9vbF9jb25zdGFudCAoeCkpKSkpCisJICByZXR1cm4gVFJVRTsKKwllbHNlIGlmIChTWU1CT0xfUkVGX1JDQUxMX0ZVTkNUSU9OX1AgKHgpCisgICAgICAgICAgICAgICAgIHx8IChtb2RlID09IFNJbW9kZQorICAgICAgICAgICAgICAgICAgICAgJiYgU1lNQk9MX1JFRl9STVdfQUREUiAoeCkpKQorCSAgcmV0dXJuIFRSVUU7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBQUkVfREVDOgkJLyogKHByZV9kZWMgKC4uLikpICovCisgICAgY2FzZSBQT1NUX0lOQzoJCS8qIChwb3N0X2luYyAoLi4uKSkgKi8KKyAgICAgIHJldHVybiBhdnIzMl9hZGRyZXNzX3JlZ2lzdGVyX3J0eF9wIChYRVhQICh4LCAwKSwgc3RyaWN0KTsKKyAgICBjYXNlIFBMVVM6CQkJLyogKHBsdXMgKC4uLikgKC4uLikpICovCisgICAgICB7CisJcnR4IHhvcDAgPSBYRVhQICh4LCAwKTsKKwlydHggeG9wMSA9IFhFWFAgKHgsIDEpOworCisJcmV0dXJuICgoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAoeG9wMCwgc3RyaWN0KQorCQkgJiYgYXZyMzJfbGVnaXRpbWF0ZV9pbmRleF9wIChtb2RlLCB4b3AxLCBzdHJpY3QpKQorCQl8fCAoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAoeG9wMSwgc3RyaWN0KQorCQkgICAgJiYgYXZyMzJfbGVnaXRpbWF0ZV9pbmRleF9wIChtb2RlLCB4b3AwLCBzdHJpY3QpKSk7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKworaW50CithdnIzMl9jb25zdF9va19mb3JfbW92ZSAoSE9TVF9XSURFX0lOVCBjKQoreworICBpZiAoIFRBUkdFVF9WMl9JTlNOUyApCisgICAgcmV0dXJuICggYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoYywgJ0snLCAiS3MyMSIpCisgICAgICAgICAgICAgLyogbW92aCBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgIHx8IGF2cjMyX2hpMTZfaW1tZWRpYXRlX29wZXJhbmQgKEdFTl9JTlQoYyksIFZPSURtb2RlKSApOworICBlbHNlCisgICAgcmV0dXJuIGF2cjMyX2NvbnN0X29rX2Zvcl9jb25zdHJhaW50X3AgKGMsICdLJywgIktzMjEiKTsKK30KKworaW50CithdnIzMl9jb25zdF9kb3VibGVfaW1tZWRpYXRlIChydHggdmFsdWUpCit7CisgIEhPU1RfV0lERV9JTlQgaGksIGxvOworCisgIGlmIChHRVRfQ09ERSAodmFsdWUpICE9IENPTlNUX0RPVUJMRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKFNDQUxBUl9GTE9BVF9NT0RFX1AgKEdFVF9NT0RFICh2YWx1ZSkpKQorICAgIHsKKyAgICAgIEhPU1RfV0lERV9JTlQgdGFyZ2V0X2Zsb2F0WzJdOworICAgICAgaGkgPSBsbyA9IDA7CisgICAgICByZWFsX3RvX3RhcmdldCAodGFyZ2V0X2Zsb2F0LCBDT05TVF9ET1VCTEVfUkVBTF9WQUxVRSAodmFsdWUpLAorCQkgICAgICBHRVRfTU9ERSAodmFsdWUpKTsKKyAgICAgIGxvID0gdGFyZ2V0X2Zsb2F0WzBdOworICAgICAgaGkgPSB0YXJnZXRfZmxvYXRbMV07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaGkgPSBDT05TVF9ET1VCTEVfSElHSCAodmFsdWUpOworICAgICAgbG8gPSBDT05TVF9ET1VCTEVfTE9XICh2YWx1ZSk7CisgICAgfQorCisgIGlmIChhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChsbywgJ0snLCAiS3MyMSIpCisgICAgICAmJiAoR0VUX01PREUgKHZhbHVlKSA9PSBTRm1vZGUKKwkgIHx8IGF2cjMyX2NvbnN0X29rX2Zvcl9jb25zdHJhaW50X3AgKGhpLCAnSycsICJLczIxIikpKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKworaW50CithdnIzMl9sZWdpdGltYXRlX2NvbnN0YW50X3AgKHJ0eCB4KQoreworICBzd2l0Y2ggKEdFVF9DT0RFICh4KSkKKyAgICB7CisgICAgY2FzZSBDT05TVF9JTlQ6CisgICAgICAvKiBDaGVjayBpZiB3ZSBzaG91bGQgcHV0IGxhcmdlIGltbWVkaWF0ZSBpbnRvIGNvbnN0YW50IHBvb2wKKyAgICAgICBvciBsb2FkIHRoZW0gZGlyZWN0bHkgd2l0aCBtb3Yvb3JoLiovCisgICAgICBpZiAoIWF2cjMyX2ltbV9pbl9jb25zdF9wb29sKQorCXJldHVybiAxOworCisgICAgICByZXR1cm4gYXZyMzJfY29uc3Rfb2tfZm9yX21vdmUgKElOVFZBTCAoeCkpOworICAgIGNhc2UgQ09OU1RfRE9VQkxFOgorICAgICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHB1dCBsYXJnZSBpbW1lZGlhdGUgaW50byBjb25zdGFudCBwb29sCisgICAgICAgICBvciBsb2FkIHRoZW0gZGlyZWN0bHkgd2l0aCBtb3Yvb3JoLiovCisgICAgICBpZiAoIWF2cjMyX2ltbV9pbl9jb25zdF9wb29sKQorCXJldHVybiAxOworCisgICAgICBpZiAoR0VUX01PREUgKHgpID09IFNGbW9kZQorCSAgfHwgR0VUX01PREUgKHgpID09IERGbW9kZSB8fCBHRVRfTU9ERSAoeCkgPT0gREltb2RlKQorCXJldHVybiBhdnIzMl9jb25zdF9kb3VibGVfaW1tZWRpYXRlICh4KTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICBjYXNlIExBQkVMX1JFRjoKKyAgICBjYXNlIFNZTUJPTF9SRUY6CisgICAgICByZXR1cm4gYXZyMzJfZmluZF9zeW1ib2wgKHgpICYmIChmbGFnX3BpYyB8fCBUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MpOworICAgIGNhc2UgQ09OU1Q6CisgICAgY2FzZSBISUdIOgorICAgIGNhc2UgQ09OU1RfVkVDVE9SOgorICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZiAoIiVzKCk6XG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgZGVidWdfcnR4ICh4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KK30KKworCisvKiBTdHJpcCBhbnkgc3BlY2lhbCBlbmNvZGluZyBmcm9tIGxhYmVscyAqLworY29uc3QgY2hhciAqCithdnIzMl9zdHJpcF9uYW1lX2VuY29kaW5nIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpzdHJpcHBlZCA9IG5hbWU7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgc3dpdGNoIChzdHJpcHBlZFswXSkKKwl7CisJY2FzZSAnIyc6CisJICBzdHJpcHBlZCA9IHN0cmNociAobmFtZSArIDEsICcjJykgKyAxOworCSAgYnJlYWs7CisJY2FzZSAnKic6CisJICBzdHJpcHBlZCA9ICZzdHJpcHBlZFsxXTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICByZXR1cm4gc3RyaXBwZWQ7CisJfQorICAgIH0KK30KKworCisKKy8qIERvIGFueXRoaW5nIG5lZWRlZCBiZWZvcmUgUlRMIGlzIGVtaXR0ZWQgZm9yIGVhY2ggZnVuY3Rpb24uICAqLworc3RhdGljIHN0cnVjdCBtYWNoaW5lX2Z1bmN0aW9uICoKK2F2cjMyX2luaXRfbWFjaGluZV9zdGF0dXMgKHZvaWQpCit7CisgIHN0cnVjdCBtYWNoaW5lX2Z1bmN0aW9uICptYWNoaW5lOworICBtYWNoaW5lID0KKyAgICAobWFjaGluZV9mdW5jdGlvbiAqKSBnZ2NfYWxsb2NfY2xlYXJlZCAoc2l6ZW9mIChtYWNoaW5lX2Z1bmN0aW9uKSk7CisKKyNpZiBBVlIzMl9GVF9VTktOT1dOICE9IDAKKyAgbWFjaGluZS0+ZnVuY190eXBlID0gQVZSMzJfRlRfVU5LTk9XTjsKKyNlbmRpZgorCisgIG1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX2hlYWQgPSAwOworICBtYWNoaW5lLT5taW5pcG9vbF9sYWJlbF90YWlsID0gMDsKKyAgbWFjaGluZS0+aWZjdnRfYWZ0ZXJfcmVsb2FkID0gMDsKKyAgcmV0dXJuIG1hY2hpbmU7Cit9CisKK3ZvaWQKK2F2cjMyX2luaXRfZXhwYW5kZXJzICh2b2lkKQoreworICAvKiBBcnJhbmdlIHRvIGluaXRpYWxpemUgYW5kIG1hcmsgdGhlIG1hY2hpbmUgcGVyLWZ1bmN0aW9uIHN0YXR1cy4gICovCisgIGluaXRfbWFjaGluZV9zdGF0dXMgPSBhdnIzMl9pbml0X21hY2hpbmVfc3RhdHVzOworfQorCisKKy8qIFJldHVybiBhbiBSVFggaW5kaWNhdGluZyB3aGVyZSB0aGUgcmV0dXJuIGFkZHJlc3MgdG8gdGhlCisgICBjYWxsaW5nIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZC4gICovCisKK3J0eAorYXZyMzJfcmV0dXJuX2FkZHIgKGludCBjb3VudCwgcnR4IGZyYW1lIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIGlmIChjb3VudCAhPSAwKQorICAgIHJldHVybiBOVUxMX1JUWDsKKworICByZXR1cm4gZ2V0X2hhcmRfcmVnX2luaXRpYWxfdmFsIChQbW9kZSwgTFJfUkVHTlVNKTsKK30KKworCit2b2lkCithdnIzMl9lbmNvZGVfc2VjdGlvbl9pbmZvICh0cmVlIGRlY2wsIHJ0eCBydGwsIGludCBmaXJzdCkKK3sKKyAgZGVmYXVsdF9lbmNvZGVfc2VjdGlvbl9pbmZvKGRlY2wsIHJ0bCwgZmlyc3QpOworCisgIGlmICggVFJFRV9DT0RFIChkZWNsKSA9PSBWQVJfREVDTAorICAgICAgICYmIChHRVRfQ09ERSAoWEVYUCAocnRsLCAwKSkgPT0gU1lNQk9MX1JFRikKKyAgICAgICAmJiAobG9va3VwX2F0dHJpYnV0ZSAoInJtd19hZGRyZXNzYWJsZSIsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpCisgICAgICAgICAgIHx8IFRBUkdFVF9STVdfQUREUkVTU0FCTEVfREFUQSkgKXsKKyAgICBpZiAoICFUQVJHRVRfUk1XIHx8IGZsYWdfcGljICkKKyAgICAgIHJldHVybjsKKyAgICBTWU1CT0xfUkVGX0ZMQUdTIChYRVhQIChydGwsIDApKSB8PSAoMSA8PCBTWU1CT0xfRkxBR19STVdfQUREUl9TSElGVCk7CisgIH0KK30KKwordm9pZAorYXZyMzJfYXNtX291dHB1dF9sYWJlbCAoRklMRSAqIHN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgbmFtZSA9IGF2cjMyX3N0cmlwX25hbWVfZW5jb2RpbmcgKG5hbWUpOworCisgIC8qIFByaW50IHRoZSBsYWJlbC4gKi8KKyAgYXNzZW1ibGVfbmFtZSAoc3RyZWFtLCBuYW1lKTsKKyAgZnByaW50ZiAoc3RyZWFtLCAiOlxuIik7Cit9CisKKworCit2b2lkCithdnIzMl9hc21fd2Vha2VuX2xhYmVsIChGSUxFICogc3RyZWFtLCBjb25zdCBjaGFyICpuYW1lKQoreworICBmcHJpbnRmIChzdHJlYW0sICJcdC53ZWFrICIpOworICBhc3NlbWJsZV9uYW1lIChzdHJlYW0sIG5hbWUpOworICBmcHJpbnRmIChzdHJlYW0sICJcbiIpOworfQorCisvKgorICBDaGVja3MgaWYgYSBsYWJlbHJlZiBpcyBlcXVhbCB0byBhIHJlc2VydmVkIHdvcmQgaW4gdGhlIGFzc2VtYmxlci4gSWYgaXQgaXMsCisgIGluc2VydCBhICdfJyBiZWZvcmUgdGhlIGxhYmVsIG5hbWUuCisqLwordm9pZAorYXZyMzJfYXNtX291dHB1dF9sYWJlbHJlZiAoRklMRSAqIHN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IHZlcmJhdGltID0gRkFMU0U7CisgIGNvbnN0IGNoYXIgKnN0cmlwcGVkID0gbmFtZTsKKyAgaW50IHN0cmlwX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgd2hpbGUgKCFzdHJpcF9maW5pc2hlZCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHN0cmlwcGVkWzBdKQorCXsKKwljYXNlICcjJzoKKwkgIHN0cmlwcGVkID0gc3RyY2hyIChuYW1lICsgMSwgJyMnKSArIDE7CisJICBicmVhazsKKwljYXNlICcqJzoKKwkgIHN0cmlwcGVkID0gJnN0cmlwcGVkWzFdOworCSAgdmVyYmF0aW0gPSBUUlVFOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHN0cmlwX2ZpbmlzaGVkID0gVFJVRTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKHZlcmJhdGltKQorICAgIGZwdXRzIChzdHJpcHBlZCwgc3RyZWFtKTsKKyAgZWxzZQorICAgIGFzbV9mcHJpbnRmIChzdHJlYW0sICIlVSVzIiwgc3RyaXBwZWQpOworfQorCisKKworLyoKKyAgIENoZWNrIGlmIHRoZSBjb21wYXJpc29uIGluIGNvbXBhcmVfZXhwIGlzIHJlZHVuZGFudAorICAgZm9yIHRoZSBjb25kaXRpb24gZ2l2ZW4gaW4gbmV4dF9jb25kIGdpdmVuIHRoYXQgdGhlCisgICBuZWVkZWQgZmxhZ3MgYXJlIGFscmVhZHkgc2V0IGJ5IGFuIGVhcmxpZXIgaW5zdHJ1Y3Rpb24uCisgICBVc2VzIGNjX3ByZXZfc3RhdHVzIHRvIGNoZWNrIHRoaXMuCisKKyAgIFJldHVybnMgTlVMTF9SVFggaWYgdGhlIGNvbXBhcmUgaXMgbm90IHJlZHVuZGFudAorICAgb3IgdGhlIG5ldyBjb25kaXRpb24gdG8gdXNlIGluIHRoZSBjb25kaXRpb25hbAorICAgaW5zdHJ1Y3Rpb24gaWYgdGhlIGNvbXBhcmUgaXMgcmVkdW5kYW50LgorKi8KK3N0YXRpYyBydHgKK2lzX2NvbXBhcmVfcmVkdW5kYW50IChydHggY29tcGFyZV9leHAsIHJ0eCBuZXh0X2NvbmQpCit7CisgIGludCB6X2ZsYWdfdmFsaWQgPSBGQUxTRTsKKyAgaW50IG5fZmxhZ192YWxpZCA9IEZBTFNFOworICBydHggbmV3X2NvbmQ7CisKKyAgaWYgKEdFVF9DT0RFIChjb21wYXJlX2V4cCkgIT0gQ09NUEFSRQorICAgICAgJiYgR0VUX0NPREUgKGNvbXBhcmVfZXhwKSAhPSBBTkQpCisgICAgcmV0dXJuIE5VTExfUlRYOworCisKKyAgaWYgKHJ0eF9lcXVhbF9wIChjY19wcmV2X3N0YXR1cy5tZGVwLnZhbHVlLCBjb21wYXJlX2V4cCkpCisgICAgeworICAgICAgLyogY2MwIGFscmVhZHkgY29udGFpbnMgdGhlIGNvcnJlY3QgY29tcGFyaXNvbiAtPiBkZWxldGUgY21wIGluc24gKi8KKyAgICAgIHJldHVybiBuZXh0X2NvbmQ7CisgICAgfQorCisgIGlmIChHRVRfTU9ERSAoY29tcGFyZV9leHApICE9IFNJbW9kZSkKKyAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgc3dpdGNoIChjY19wcmV2X3N0YXR1cy5tZGVwLmZsYWdzKQorICAgIHsKKyAgICBjYXNlIENDX1NFVF9WTkNaOgorICAgIGNhc2UgQ0NfU0VUX05DWjoKKyAgICAgIG5fZmxhZ192YWxpZCA9IFRSVUU7CisgICAgY2FzZSBDQ19TRVRfQ1o6CisgICAgY2FzZSBDQ19TRVRfWjoKKyAgICAgIHpfZmxhZ192YWxpZCA9IFRSVUU7CisgICAgfQorCisgIGlmIChjY19wcmV2X3N0YXR1cy5tZGVwLnZhbHVlCisgICAgICAmJiBHRVRfQ09ERSAoY29tcGFyZV9leHApID09IENPTVBBUkUKKyAgICAgICYmIFJFR19QIChYRVhQIChjb21wYXJlX2V4cCwgMCkpCisgICAgICAmJiBSRUdOTyAoWEVYUCAoY29tcGFyZV9leHAsIDApKSA9PSBSRUdOTyAoY2NfcHJldl9zdGF0dXMubWRlcC52YWx1ZSkKKyAgICAgICYmIEdFVF9DT0RFIChYRVhQIChjb21wYXJlX2V4cCwgMSkpID09IENPTlNUX0lOVAorICAgICAgJiYgbmV4dF9jb25kICE9IE5VTExfUlRYKQorICAgIHsKKyAgICAgIGlmIChJTlRWQUwgKFhFWFAgKGNvbXBhcmVfZXhwLCAxKSkgPT0gMAorCSAgJiYgel9mbGFnX3ZhbGlkCisJICAmJiAoR0VUX0NPREUgKG5leHRfY29uZCkgPT0gRVEgfHwgR0VUX0NPREUgKG5leHRfY29uZCkgPT0gTkUpKQorCS8qIFdlIGNhbiBza2lwIGNvbXBhcmlzb24gWiBmbGFnIGlzIGFscmVhZHkgcmVmbGVjdGluZyBvcHNbMF0gKi8KKwlyZXR1cm4gbmV4dF9jb25kOworICAgICAgZWxzZSBpZiAobl9mbGFnX3ZhbGlkCisJICAgICAgICYmICgoSU5UVkFMIChYRVhQIChjb21wYXJlX2V4cCwgMSkpID09IDAKKwkJICAgICYmIChHRVRfQ09ERSAobmV4dF9jb25kKSA9PSBHRQorCQkJfHwgR0VUX0NPREUgKG5leHRfY29uZCkgPT0gTFQpKQorCQkgICB8fCAoSU5UVkFMIChYRVhQIChjb21wYXJlX2V4cCwgMSkpID09IC0xCisJCSAgICAgICAmJiAoR0VUX0NPREUgKG5leHRfY29uZCkgPT0gR1QKKwkJCSAgIHx8IEdFVF9DT0RFIChuZXh0X2NvbmQpID09IExFKSkpKQorCXsKKwkgIC8qIFdlIGNhbiBza2lwIGNvbXBhcmlzb24gTiBmbGFnIGlzIGFscmVhZHkgcmVmbGVjdGluZyBvcHNbMF0sCisJICAgICB3aGljaCBtZWFucyB0aGF0IHdlIGNhbiB1c2UgdGhlIG1pL3BsIGNvbmRpdGlvbnMgdG8gY2hlY2sgaWYKKwkgICAgIG9wc1swXSBpcyBHRSBvciBMVCAwLiAqLworCSAgaWYgKChHRVRfQ09ERSAobmV4dF9jb25kKSA9PSBHRSkgfHwgKEdFVF9DT0RFIChuZXh0X2NvbmQpID09IEdUKSkKKwkgICAgbmV3X2NvbmQgPQorCSAgICAgIGdlbl9ydHhfVU5TUEVDIChHRVRfTU9ERSAobmV4dF9jb25kKSwgZ2VuX3J0dmVjICgyLCBjYzBfcnR4LCBjb25zdDBfcnR4KSwKKwkJCSAgICAgIFVOU1BFQ19DT05EX1BMKTsKKwkgIGVsc2UKKwkgICAgbmV3X2NvbmQgPQorCSAgICAgIGdlbl9ydHhfVU5TUEVDIChHRVRfTU9ERSAobmV4dF9jb25kKSwgZ2VuX3J0dmVjICgyLCBjYzBfcnR4LCBjb25zdDBfcnR4KSwKKwkJCSAgICAgIFVOU1BFQ19DT05EX01JKTsKKwkgIHJldHVybiBuZXdfY29uZDsKKwl9CisgICAgfQorICByZXR1cm4gTlVMTF9SVFg7Cit9CisKKy8qIFVwZGF0ZXMgY2Nfc3RhdHVzLiAgKi8KK3ZvaWQKK2F2cjMyX25vdGljZV91cGRhdGVfY2MgKHJ0eCBleHAsIHJ0eCBpbnNuKQoreworICBlbnVtIGF0dHJfY2MgYXR0cl9jYyA9IGdldF9hdHRyX2NjIChpbnNuKTsKKyAgCisgIGlmICggYXR0cl9jYyA9PSBDQ19TRVRfWl9JRl9OT1RfVjIgKQorICAgIGlmIChUQVJHRVRfVjJfSU5TTlMpCisgICAgICBhdHRyX2NjID0gQ0NfTk9ORTsKKyAgICBlbHNlCisgICAgICBhdHRyX2NjID0gQ0NfU0VUX1o7CisgIAorICBzd2l0Y2ggKGF0dHJfY2MpCisgICAgeworICAgIGNhc2UgQ0NfQ0FMTF9TRVQ6CisgICAgICBDQ19TVEFUVVNfSU5JVDsKKyAgICAgIEZQQ0NfU1RBVFVTX0lOSVQ7CisgICAgICAvKiBDaGVjayBpZiB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5zIGEgdmFsdWUgaW4gcjEyICovCisgICAgICBpZiAoUkVHX1AgKHJlY29nX2RhdGEub3BlcmFuZFswXSkKKwkgICYmIFJFR05PIChyZWNvZ19kYXRhLm9wZXJhbmRbMF0pID09IFJFVFZBTF9SRUdOVU0pCisJeworCSAgY2Nfc3RhdHVzLmZsYWdzID0gMDsKKwkgIGNjX3N0YXR1cy5tZGVwLnZhbHVlID0KKwkgICAgZ2VuX3J0eF9DT01QQVJFIChTSW1vZGUsIHJlY29nX2RhdGEub3BlcmFuZFswXSwgY29uc3QwX3J0eCk7CisJICBjY19zdGF0dXMubWRlcC5mbGFncyA9IENDX1NFVF9WTkNaOworICAgICAgICAgIGNjX3N0YXR1cy5tZGVwLmNvbmRfZXhlY19jbXBfY2xvYmJlcmVkID0gMDsKKworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NfQ09NUEFSRToKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhhdCBjb21wYXJlIHdpbGwgbm90IGJlIG9wdGltaXplZCBhd2F5IGlmIHNvIG5vdGhpbmcgc2hvdWxkCisgICAgICAgICAgIGJlIGRvbmUgKi8KKyAgICAgICAgcnR4IGNvbXBhcmVfZXhwID0gU0VUX1NSQyAoZXhwKTsKKyAgICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHRzdCBleHByZXNzaW9uLiBJZiBzbyBjb252ZXJ0IGl0IHRvIGEKKyAgICAgICAgICAgY29tcGFyZSB3aXRoIDAuICovCisgICAgICAgIGlmICggUkVHX1AgKFNFVF9TUkMgKGV4cCkpICkKKyAgICAgICAgICBjb21wYXJlX2V4cCA9IGdlbl9ydHhfQ09NUEFSRSAoR0VUX01PREUgKFNFVF9TUkMgKGV4cCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfU1JDIChleHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdDBfcnR4KTsKKworICAgICAgICBpZiAoaXNfY29tcGFyZV9yZWR1bmRhbnQgKGNvbXBhcmVfZXhwLCBnZXRfbmV4dF9pbnNuX2NvbmQgKGluc24pKSA9PQorICAgICAgICAgICAgTlVMTF9SVFgpCisgICAgICAgICAgeworCisgICAgICAgICAgICAvKiBSZXNldCB0aGUgbm9uc3RhbmRhcmQgZmxhZyAqLworICAgICAgICAgICAgQ0NfU1RBVFVTX0lOSVQ7CisgICAgICAgICAgICBjY19zdGF0dXMuZmxhZ3MgPSAwOworICAgICAgICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSBjb21wYXJlX2V4cDsKKyAgICAgICAgICAgIGNjX3N0YXR1cy5tZGVwLmZsYWdzID0gQ0NfU0VUX1ZOQ1o7CisgICAgICAgICAgICBjY19zdGF0dXMubWRlcC5jb25kX2V4ZWNfY21wX2Nsb2JiZXJlZCA9IDA7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENDX0NNUF9DT05EX0lOU046CisgICAgICB7CisJLyogQ29uZGl0aW9uYWwgaW5zbiB0aGF0IGVtaXQgdGhlIGNvbXBhcmUgaXRzZWxmLiAqLworICAgICAgICBydHggY21wOworICAgICAgICBydHggY21wX29wMCwgY21wX29wMTsKKyAgICAgICAgcnR4IGNvbmQ7CisgICAgICAgIHJ0eCBkZXN0OworICAgICAgICBydHggbmV4dF9pbnNuID0gbmV4dF9ub25ub3RlX2luc24gKGluc24pOworCisgICAgICAgIGlmICggR0VUX0NPREUgKGV4cCkgPT0gQ09ORF9FWEVDICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjbXBfb3AwID0gWEVYUCAoQ09ORF9FWEVDX1RFU1QgKGV4cCksIDApOworICAgICAgICAgICAgY21wX29wMSA9IFhFWFAgKENPTkRfRVhFQ19URVNUIChleHApLCAxKTsKKyAgICAgICAgICAgIGNvbmQgPSBDT05EX0VYRUNfVEVTVCAoZXhwKTsKKyAgICAgICAgICAgIGRlc3QgPSBTRVRfREVTVCAoQ09ORF9FWEVDX0NPREUgKGV4cCkpOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZW4gZWxzZSBjb25kaXRpb25hbC4gY29tcGFyZSBvcGVyYW5kcyBhcmUgaW4gb3BlcmFuZHMKKyAgICAgICAgICAgICAgIDQgYW5kIDUuICovCisgICAgICAgICAgICBjbXBfb3AwID0gcmVjb2dfZGF0YS5vcGVyYW5kWzRdOworICAgICAgICAgICAgY21wX29wMSA9IHJlY29nX2RhdGEub3BlcmFuZFs1XTsKKyAgICAgICAgICAgIGNvbmQgPSByZWNvZ19kYXRhLm9wZXJhbmRbMV07CisgICAgICAgICAgICBkZXN0ID0gU0VUX0RFU1QgKGV4cCk7CisgICAgICAgICAgfQorCisgICAgICAgIGlmICggR0VUX0NPREUgKGNtcF9vcDApID09IEFORCApCisgICAgICAgICAgY21wID0gY21wX29wMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNtcCA9IGdlbl9ydHhfQ09NUEFSRSAoR0VUX01PREUgKGNtcF9vcDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wX29wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcF9vcDEpOworCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBjb25kaXRpb25hbCBpbnNucyB1cGRhdGVzIGEgcmVnaXN0ZXIgcHJlc2VudAorICAgICAgICAgICBpbiB0aGUgY29tcGFyaXNvbiwgaWYgc28gdGhlbiB3ZSBtdXN0IHJlc2V0IHRoZSBjY19zdGF0dXMuICovCisgICAgICAgIGlmIChSRUdfUCAoZGVzdCkKKyAgICAgICAgICAgICYmIChyZWdfbWVudGlvbmVkX3AgKGRlc3QsIGNtcF9vcDApCisgICAgICAgICAgICAgICAgfHwgcmVnX21lbnRpb25lZF9wIChkZXN0LCBjbXBfb3AxKSkKKyAgICAgICAgICAgICYmIEdFVF9DT0RFIChleHApICE9IENPTkRfRVhFQyApCisgICAgICAgICAgeworICAgICAgICAgICAgQ0NfU1RBVFVTX0lOSVQ7CisgICAgICAgICAgfQorCWVsc2UgaWYgKGlzX2NvbXBhcmVfcmVkdW5kYW50IChjbXAsIGNvbmQpID09IE5VTExfUlRYKQorCSAgeworCSAgICAvKiBSZXNldCB0aGUgbm9uc3RhbmRhcmQgZmxhZyAqLworCSAgICBDQ19TVEFUVVNfSU5JVDsKKyAgICAgICAgICAgIGlmICggR0VUX0NPREUgKGNtcF9vcDApID09IEFORCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjY19zdGF0dXMuZmxhZ3MgPSBDQ19JTlZFUlRFRDsKKyAgICAgICAgICAgICAgICBjY19zdGF0dXMubWRlcC5mbGFncyA9IENDX1NFVF9aOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjY19zdGF0dXMuZmxhZ3MgPSAwOworICAgICAgICAgICAgICAgIGNjX3N0YXR1cy5tZGVwLmZsYWdzID0gQ0NfU0VUX1ZOQ1o7CisgICAgICAgICAgICAgIH0KKwkgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSBjbXA7CisgICAgICAgICAgICBjY19zdGF0dXMubWRlcC5jb25kX2V4ZWNfY21wX2Nsb2JiZXJlZCA9IDA7CisJICB9CisKKworICAgICAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGEgQ09ORF9FWEVDIGluc24gd2hpY2ggdXBkYXRlcyBvbmUKKyAgICAgICAgICAgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGUgY29tcGFyZSBzdGF0dXMuICovCisgICAgICAgIGlmIChSRUdfUCAoZGVzdCkKKyAgICAgICAgICAgICYmIChyZWdfbWVudGlvbmVkX3AgKGRlc3QsIGNtcF9vcDApCisgICAgICAgICAgICAgICAgfHwgcmVnX21lbnRpb25lZF9wIChkZXN0LCBjbXBfb3AxKSkKKyAgICAgICAgICAgICYmIEdFVF9DT0RFIChleHApID09IENPTkRfRVhFQyApCisgICAgICAgICAgY2Nfc3RhdHVzLm1kZXAuY29uZF9leGVjX2NtcF9jbG9iYmVyZWQgPSAxOworICAgICAgICAKKyAgICAgICAgaWYgKCBjY19zdGF0dXMubWRlcC5jb25kX2V4ZWNfY21wX2Nsb2JiZXJlZCAKKyAgICAgICAgICAgICAmJiBHRVRfQ09ERSAoZXhwKSA9PSBDT05EX0VYRUMKKyAgICAgICAgICAgICAmJiBuZXh0X2luc24gIT0gTlVMTAorICAgICAgICAgICAgICYmIElOU05fUCAobmV4dF9pbnNuKQorICAgICAgICAgICAgICYmICEoR0VUX0NPREUgKFBBVFRFUk4gKG5leHRfaW5zbikpID09IENPTkRfRVhFQworICAgICAgICAgICAgICAgICAgJiYgcnR4X2VxdWFsX3AgKFhFWFAgKENPTkRfRVhFQ19URVNUIChQQVRURVJOIChuZXh0X2luc24pKSwgMCksIGNtcF9vcDApCisgICAgICAgICAgICAgICAgICAmJiBydHhfZXF1YWxfcCAoWEVYUCAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpLCAxKSwgY21wX29wMSkKKyAgICAgICAgICAgICAgICAgICYmIChHRVRfQ09ERSAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpKSA9PSBHRVRfQ09ERSAoY29uZCkKKyAgICAgICAgICAgICAgICAgICAgICB8fCBHRVRfQ09ERSAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpKSA9PSByZXZlcnNlX2NvbmRpdGlvbiAoR0VUX0NPREUgKGNvbmQpKSkpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIGEgc2VxdWVuY2Ugb2YgY29uZGl0aW9uYWwgaW5zbnMgd2hlcmUgdGhlIGNvbXBhcmUgc3RhdHVzIGhhcyBiZWVuIGNsb2JiZXJlZAorICAgICAgICAgICAgICAgc2luY2UgdGhlIGNvbXBhcmUgbm8gbG9uZ2VyIHJlZmxlY3RzIHRoZSBjb250ZW50IG9mIHRoZSB2YWx1ZXMgdG8gY29tcGFyZS4gKi8KKyAgICAgICAgICAgIENDX1NUQVRVU19JTklUOworICAgICAgICAgICAgY2Nfc3RhdHVzLm1kZXAuY29uZF9leGVjX2NtcF9jbG9iYmVyZWQgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENDX0ZQQ09NUEFSRToKKyAgICAgIC8qIENoZWNrIHRoYXQgZmxvYXRpbmctcG9pbnQgY29tcGFyZSB3aWxsIG5vdCBiZSBvcHRpbWl6ZWQgYXdheSBpZiBzbworICAgICAgICAgbm90aGluZyBzaG91bGQgYmUgZG9uZSAqLworICAgICAgaWYgKCFydHhfZXF1YWxfcCAoY2NfcHJldl9zdGF0dXMubWRlcC5mcHZhbHVlLCBTRVRfU1JDIChleHApKSkKKwl7CisJICAvKiBjYzAgYWxyZWFkeSBjb250YWlucyB0aGUgY29ycmVjdCBjb21wYXJpc29uIC0+IGRlbGV0ZSBjbXAgaW5zbiAqLworCSAgLyogUmVzZXQgdGhlIG5vbnN0YW5kYXJkIGZsYWcgKi8KKwkgIGNjX3N0YXR1cy5tZGVwLmZwdmFsdWUgPSBTRVRfU1JDIChleHApOworCSAgY2Nfc3RhdHVzLm1kZXAuZnBmbGFncyA9IENDX1NFVF9DWjsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIENDX0ZST01fRlBDQzoKKyAgICAgIC8qIEZsYWdzIGFyZSB1cGRhdGVkIHdpdGggZmxhZ3MgZnJvbSBGbG9hdGluZy1wb2ludCBjb3Byb2Nlc3Nvciwgc2V0CisgICAgICAgICBDQ19OT1RfU0lHTkVEIGZsYWcgc2luY2UgdGhlIGZsYWdzIGFyZSBzZXQgc28gdGhhdCB1bnNpZ25lZAorICAgICAgICAgY29uZGlkaW9uIGNvZGVzIGNhbiBiZSB1c2VkIGRpcmVjdGx5LiAqLworICAgICAgQ0NfU1RBVFVTX0lOSVQ7CisgICAgICBjY19zdGF0dXMuZmxhZ3MgPSBDQ19OT1RfU0lHTkVEOworICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSBjY19zdGF0dXMubWRlcC5mcHZhbHVlOworICAgICAgY2Nfc3RhdHVzLm1kZXAuZmxhZ3MgPSBjY19zdGF0dXMubWRlcC5mcGZsYWdzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ19CTEQ6CisgICAgICAvKiBCaXQgbG9hZCBpcyBraW5kIG9mIGxpa2UgYW4gaW52ZXJ0ZWQgdGVzdHNpLCBiZWNhdXNlIHRoZSBaIGZsYWcgaXMKKyAgICAgICAgIGludmVydGVkICovCisgICAgICBDQ19TVEFUVVNfSU5JVDsKKyAgICAgIGNjX3N0YXR1cy5mbGFncyA9IENDX0lOVkVSVEVEOworICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSBTRVRfU1JDIChleHApOworICAgICAgY2Nfc3RhdHVzLm1kZXAuZmxhZ3MgPSBDQ19TRVRfWjsKKyAgICAgIGNjX3N0YXR1cy5tZGVwLmNvbmRfZXhlY19jbXBfY2xvYmJlcmVkID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0NfTk9ORToKKyAgICAgIC8qIEluc24gZG9lcyBub3QgYWZmZWN0IENDIGF0IGFsbC4gQ2hlY2sgaWYgdGhlIGluc3RydWN0aW9uIHVwZGF0ZXMKKyAgICAgICAgIHNvbWUgb2YgdGhlIHJlZ2lzdGVyIGN1cnJlbnRseSByZWZsZWN0ZWQgaW4gY2MwICovCisKKyAgICAgIGlmICgoR0VUX0NPREUgKGV4cCkgPT0gU0VUKQorCSAgJiYgKGNjX3N0YXR1cy52YWx1ZTEgfHwgY2Nfc3RhdHVzLnZhbHVlMiB8fCBjY19zdGF0dXMubWRlcC52YWx1ZSkKKwkgICYmIChyZWdfbWVudGlvbmVkX3AgKFNFVF9ERVNUIChleHApLCBjY19zdGF0dXMudmFsdWUxKQorCSAgICAgIHx8IHJlZ19tZW50aW9uZWRfcCAoU0VUX0RFU1QgKGV4cCksIGNjX3N0YXR1cy52YWx1ZTIpCisJICAgICAgfHwgcmVnX21lbnRpb25lZF9wIChTRVRfREVTVCAoZXhwKSwgY2Nfc3RhdHVzLm1kZXAudmFsdWUpKSkKKwl7CisJICBDQ19TVEFUVVNfSU5JVDsKKwl9CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSBwYXJhbGxlbCB3ZSBtdXN0IHN0ZXAgdGhyb3VnaCBlYWNoIG9mIHRoZSBwYXJhbGxlbAorICAgICAgICAgZXhwcmVzc2lvbnMgKi8KKyAgICAgIGlmIChHRVRfQ09ERSAoZXhwKSA9PSBQQVJBTExFTCkKKwl7CisJICBpbnQgaTsKKwkgIGZvciAoaSA9IDA7IGkgPCBYVkVDTEVOIChleHAsIDApOyArK2kpCisJICAgIHsKKwkgICAgICBydHggdmVjX2V4cCA9IFhWRUNFWFAgKGV4cCwgMCwgaSk7CisJICAgICAgaWYgKChHRVRfQ09ERSAodmVjX2V4cCkgPT0gU0VUKQorCQkgICYmIChjY19zdGF0dXMudmFsdWUxIHx8IGNjX3N0YXR1cy52YWx1ZTIKKwkJICAgICAgfHwgY2Nfc3RhdHVzLm1kZXAudmFsdWUpCisJCSAgJiYgKHJlZ19tZW50aW9uZWRfcCAoU0VUX0RFU1QgKHZlY19leHApLCBjY19zdGF0dXMudmFsdWUxKQorCQkgICAgICB8fCByZWdfbWVudGlvbmVkX3AgKFNFVF9ERVNUICh2ZWNfZXhwKSwKKwkJCQkJICBjY19zdGF0dXMudmFsdWUyKQorCQkgICAgICB8fCByZWdfbWVudGlvbmVkX3AgKFNFVF9ERVNUICh2ZWNfZXhwKSwKKwkJCQkJICBjY19zdGF0dXMubWRlcC52YWx1ZSkpKQorCQl7CisJCSAgQ0NfU1RBVFVTX0lOSVQ7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBtZW1vcnkgb3BhcnRpb25zIHdpdGggcG9zdF9pbmMgb3IgcHJlX2RlYyBvbiB0aGUKKyAgICAgICAgIHJlZ2lzdGVyIGN1cnJlbnRseSByZWZsZWN0ZWQgaW4gY2MwICovCisgICAgICBpZiAoR0VUX0NPREUgKGV4cCkgPT0gU0VUCisJICAmJiBHRVRfQ09ERSAoU0VUX1NSQyAoZXhwKSkgPT0gTUVNCisJICAmJiAoR0VUX0NPREUgKFhFWFAgKFNFVF9TUkMgKGV4cCksIDApKSA9PSBQT1NUX0lOQworCSAgICAgIHx8IEdFVF9DT0RFIChYRVhQIChTRVRfU1JDIChleHApLCAwKSkgPT0gUFJFX0RFQykKKwkgICYmCisJICAocmVnX21lbnRpb25lZF9wCisJICAgKFhFWFAgKFhFWFAgKFNFVF9TUkMgKGV4cCksIDApLCAwKSwgY2Nfc3RhdHVzLnZhbHVlMSkKKwkgICB8fCByZWdfbWVudGlvbmVkX3AgKFhFWFAgKFhFWFAgKFNFVF9TUkMgKGV4cCksIDApLCAwKSwKKwkJCSAgICAgICBjY19zdGF0dXMudmFsdWUyKQorCSAgIHx8IHJlZ19tZW50aW9uZWRfcCAoWEVYUCAoWEVYUCAoU0VUX1NSQyAoZXhwKSwgMCksIDApLAorCQkJICAgICAgIGNjX3N0YXR1cy5tZGVwLnZhbHVlKSkpCisJQ0NfU1RBVFVTX0lOSVQ7CisKKyAgICAgIGlmIChHRVRfQ09ERSAoZXhwKSA9PSBTRVQKKwkgICYmIEdFVF9DT0RFIChTRVRfREVTVCAoZXhwKSkgPT0gTUVNCisJICAmJiAoR0VUX0NPREUgKFhFWFAgKFNFVF9ERVNUIChleHApLCAwKSkgPT0gUE9TVF9JTkMKKwkgICAgICB8fCBHRVRfQ09ERSAoWEVYUCAoU0VUX0RFU1QgKGV4cCksIDApKSA9PSBQUkVfREVDKQorCSAgJiYKKwkgIChyZWdfbWVudGlvbmVkX3AKKwkgICAoWEVYUCAoWEVYUCAoU0VUX0RFU1QgKGV4cCksIDApLCAwKSwgY2Nfc3RhdHVzLnZhbHVlMSkKKwkgICB8fCByZWdfbWVudGlvbmVkX3AgKFhFWFAgKFhFWFAgKFNFVF9ERVNUIChleHApLCAwKSwgMCksCisJCQkgICAgICAgY2Nfc3RhdHVzLnZhbHVlMikKKwkgICB8fCByZWdfbWVudGlvbmVkX3AgKFhFWFAgKFhFWFAgKFNFVF9ERVNUIChleHApLCAwKSwgMCksCisJCQkgICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUpKSkKKwlDQ19TVEFUVVNfSU5JVDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQ19TRVRfVk5DWjoKKyAgICAgIENDX1NUQVRVU19JTklUOworICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSByZWNvZ19kYXRhLm9wZXJhbmRbMF07CisgICAgICBjY19zdGF0dXMubWRlcC5mbGFncyA9IENDX1NFVF9WTkNaOworICAgICAgY2Nfc3RhdHVzLm1kZXAuY29uZF9leGVjX2NtcF9jbG9iYmVyZWQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENDX1NFVF9OQ1o6CisgICAgICBDQ19TVEFUVVNfSU5JVDsKKyAgICAgIGNjX3N0YXR1cy5tZGVwLnZhbHVlID0gcmVjb2dfZGF0YS5vcGVyYW5kWzBdOworICAgICAgY2Nfc3RhdHVzLm1kZXAuZmxhZ3MgPSBDQ19TRVRfTkNaOworICAgICAgY2Nfc3RhdHVzLm1kZXAuY29uZF9leGVjX2NtcF9jbG9iYmVyZWQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENDX1NFVF9DWjoKKyAgICAgIENDX1NUQVRVU19JTklUOworICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSByZWNvZ19kYXRhLm9wZXJhbmRbMF07CisgICAgICBjY19zdGF0dXMubWRlcC5mbGFncyA9IENDX1NFVF9DWjsKKyAgICAgIGNjX3N0YXR1cy5tZGVwLmNvbmRfZXhlY19jbXBfY2xvYmJlcmVkID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQ19TRVRfWjoKKyAgICAgIENDX1NUQVRVU19JTklUOworICAgICAgY2Nfc3RhdHVzLm1kZXAudmFsdWUgPSByZWNvZ19kYXRhLm9wZXJhbmRbMF07CisgICAgICBjY19zdGF0dXMubWRlcC5mbGFncyA9IENDX1NFVF9aOworICAgICAgY2Nfc3RhdHVzLm1kZXAuY29uZF9leGVjX2NtcF9jbG9iYmVyZWQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENDX0NMT0JCRVI6CisgICAgICBDQ19TVEFUVVNfSU5JVDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIENDX1NUQVRVU19JTklUOworICAgIH0KK30KKworCisvKgorICBPdXRwdXRzIHRvIHN0ZGlvIHN0cmVhbSBzdHJlYW0gdGhlIGFzc2VtYmxlciBzeW50YXggZm9yIGFuIGluc3RydWN0aW9uCisgIG9wZXJhbmQgeC4geCBpcyBhbiBSVEwgZXhwcmVzc2lvbi4KKyovCit2b2lkCithdnIzMl9wcmludF9vcGVyYW5kIChGSUxFICogc3RyZWFtLCBydHggeCwgaW50IGNvZGUpCit7CisgIGludCBlcnJvciA9IDA7CisKKyAgaWYgKCBjb2RlID09ICc/JyApCisgICAgeworICAgICAgLyogUHJlZGljYWJsZSBpbnN0cnVjdGlvbiwgcHJpbnQgY29uZGl0aW9uIGNvZGUgKi8KKworICAgICAgLyogSWYgdGhlIGluc24gc2hvdWxkIG5vdCBiZSBjb25kaXRpb25hbCB0aGVuIGRvIG5vdGhpbmcuICovCisgICAgICBpZiAoIGN1cnJlbnRfaW5zbl9wcmVkaWNhdGUgPT0gTlVMTF9SVFggKQorICAgICAgICByZXR1cm47CisKKyAgICAgIC8qIFNldCB4IHRvIHRoZSBwcmVkaWNhdGUgdG8gZm9yY2UgcHJpbnRpbmcKKyAgICAgICAgIHRoZSBjb25kaXRpb24gbGF0ZXIgb24uICovCisgICAgICB4ID0gY3VycmVudF9pbnNuX3ByZWRpY2F0ZTsKKworICAgICAgLyogUmV2ZXJzZSBjb25kaXRpb24gaWYgdXNlaW5nIGJsZCBpbnNuLiAqLworICAgICAgaWYgKCBHRVRfQ09ERSAoWEVYUChjdXJyZW50X2luc25fcHJlZGljYXRlLDApKSA9PSBBTkQgKQorICAgICAgICB4ID0gcmV2ZXJzZWRfY29uZGl0aW9uIChjdXJyZW50X2luc25fcHJlZGljYXRlKTsKKyAgICB9CisgIGVsc2UgaWYgKCBjb2RlID09ICchJyApCisgICAgeworICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZm9yIGNvbmRpdGlvbmFsIGluc24gaWYgbmVlZGVkLiAqLworICAgICAgcnR4IG5ld19jb25kOworICAgICAgZ2NjX2Fzc2VydCAoIGN1cnJlbnRfaW5zbl9wcmVkaWNhdGUgIT0gTlVMTF9SVFggKTsKKyAgICAgIG5ld19jb25kID0gYXZyMzJfb3V0cHV0X2NtcChjdXJyZW50X2luc25fcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT0RFKFhFWFAoY3VycmVudF9pbnNuX3ByZWRpY2F0ZSwwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVYUChjdXJyZW50X2luc25fcHJlZGljYXRlLDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFWFAoY3VycmVudF9pbnNuX3ByZWRpY2F0ZSwxKSk7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXcgY29uZGl0aW9uIGlzIGEgc3BlY2lhbCBhdnIzMiBjb25kaXRpb24KKyAgICAgICAgIHNwZWNpZmllZCB1c2luZyBVTlNQRUNzLiBJZiBzbyB3ZSBtdXN0IGhhbmRsZSBpdCBkaWZmZXJlbnRseS4gKi8KKyAgICAgIGlmICggR0VUX0NPREUgKG5ld19jb25kKSA9PSBVTlNQRUMgKQorICAgICAgICB7CisgICAgICAgICAgY3VycmVudF9pbnNuX3ByZWRpY2F0ZSA9CisgICAgICAgICAgICBnZW5fcnR4X1VOU1BFQyAoQ0Ntb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9ydHZlYyAoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFWFAoY3VycmVudF9pbnNuX3ByZWRpY2F0ZSwwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFWFAoY3VycmVudF9pbnNuX3ByZWRpY2F0ZSwxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWElOVCAobmV3X2NvbmQsIDEpKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgUFVUX0NPREUoY3VycmVudF9pbnNuX3ByZWRpY2F0ZSwgR0VUX0NPREUobmV3X2NvbmQpKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKworICBzd2l0Y2ggKEdFVF9DT0RFICh4KSkKKyAgICB7CisgICAgY2FzZSBVTlNQRUM6CisgICAgICBzd2l0Y2ggKFhJTlQgKHgsIDEpKQorCXsKKwljYXNlIFVOU1BFQ19DT05EX1BMOgorCSAgaWYgKGNvZGUgPT0gJ2knKQorCSAgICBmcHV0cyAoIm1pIiwgc3RyZWFtKTsKKwkgIGVsc2UKKwkgICAgZnB1dHMgKCJwbCIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlIFVOU1BFQ19DT05EX01JOgorCSAgaWYgKGNvZGUgPT0gJ2knKQorCSAgICBmcHV0cyAoInBsIiwgc3RyZWFtKTsKKwkgIGVsc2UKKwkgICAgZnB1dHMgKCJtaSIsIHN0cmVhbSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZXJyb3IgPSAxOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVE6CisgICAgICBpZiAoY29kZSA9PSAnaScpCisJZnB1dHMgKCJuZSIsIHN0cmVhbSk7CisgICAgICBlbHNlCisJZnB1dHMgKCJlcSIsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5FOgorICAgICAgaWYgKGNvZGUgPT0gJ2knKQorCWZwdXRzICgiZXEiLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwdXRzICgibmUiLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHVDoKKyAgICAgIGlmIChjb2RlID09ICdpJykKKwlmcHV0cyAoImxlIiwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0cyAoImd0Iiwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1RVOgorICAgICAgaWYgKGNvZGUgPT0gJ2knKQorCWZwdXRzICgibHMiLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwdXRzICgiaGkiLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMVDoKKyAgICAgIGlmIChjb2RlID09ICdpJykKKwlmcHV0cyAoImdlIiwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0cyAoImx0Iiwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTFRVOgorICAgICAgaWYgKGNvZGUgPT0gJ2knKQorCWZwdXRzICgiaHMiLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwdXRzICgibG8iLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHRToKKyAgICAgIGlmIChjb2RlID09ICdpJykKKwlmcHV0cyAoImx0Iiwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0cyAoImdlIiwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0VVOgorICAgICAgaWYgKGNvZGUgPT0gJ2knKQorCWZwdXRzICgibG8iLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwdXRzICgiaHMiLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMRToKKyAgICAgIGlmIChjb2RlID09ICdpJykKKwlmcHV0cyAoImd0Iiwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0cyAoImxlIiwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTEVVOgorICAgICAgaWYgKGNvZGUgPT0gJ2knKQorCWZwdXRzICgiaGkiLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwdXRzICgibHMiLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT05TVF9JTlQ6CisgICAgICB7CisgICAgICAgIEhPU1RfV0lERV9JTlQgdmFsdWUgPSBJTlRWQUwgKHgpOworCisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICBpZiAoIEhPU1RfQklUU19QRVJfV0lERV9JTlQgPiBCSVRTX1BFUl9XT1JEICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEEgY29uc3RfaW50IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBESW1vZGUgY29uc3RhbnRzLiAqLworICAgICAgICAgICAgICAgIHZhbHVlID4+PSBCSVRTX1BFUl9XT1JEOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBXZSBtaWdodCBnZXQgYSBjb25zdF9pbnQgaW1tZWRpYXRlIGZvciBzZXR0aW5nIGEgREkgcmVnaXN0ZXIsCisgICAgICAgICAgICAgICB3ZSB0aGVuIG11c3QgdGhlbiByZXR1cm4gdGhlIGNvcnJlY3Qgc2lnbiBleHRlbmRlZCBESS4gVGhlIG1vc3QKKyAgICAgICAgICAgICAgIHNpZ25pZmljYW50IHdvcmQgaXMganVzdCBhIHNpZ24gZXh0ZW5zaW9uLiAqLworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCAwKQorICAgICAgICAgICAgICB2YWx1ZSA9IC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2V0IHRvIGJpdCBwb3NpdGlvbiBvZiBmaXJzdCBiaXQgc2V0IGluIGltbWVkaWF0ZSAqLworICAgICAgICAgICAgICBpbnQgaSwgYml0cG9zID0gMzI7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmICgxIDw8IGkpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiaXRwb3MgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdmFsdWUgPSBiaXRwb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2V0IHRvIGJpdCBwb3NpdGlvbiBvZiBmaXJzdCBiaXQgY2xlYXJlZCBpbiBpbW1lZGlhdGUgKi8KKyAgICAgICAgICAgICAgaW50IGksIGJpdHBvcyA9IDMyOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSAmICgxIDw8IGkpKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYml0cG9zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHZhbHVlID0gYml0cG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFJlZ2xpc3QgOCAqLworICAgICAgICAgICAgICBjaGFyIG9wWzUwXTsKKyAgICAgICAgICAgICAgb3BbMF0gPSAnXDAnOworCisgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIDB4MDEpCisgICAgICAgICAgICAgICAgc3ByaW50ZiAob3AsICJyMC1yMyIpOworICAgICAgICAgICAgICBpZiAodmFsdWUgJiAweDAyKQorICAgICAgICAgICAgICAgIHN0cmxlbiAob3ApID8gc3ByaW50ZiAob3AsICIlcywgcjQtcjciLCBvcCkgOiBzcHJpbnRmIChvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInI0LXI3Iik7CisgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIDB4MDQpCisgICAgICAgICAgICAgICAgc3RybGVuIChvcCkgPyBzcHJpbnRmIChvcCwgIiVzLCByOC1yOSIsIG9wKSA6IHNwcmludGYgKG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicjgtcjkiKTsKKyAgICAgICAgICAgICAgaWYgKHZhbHVlICYgMHgwOCkKKyAgICAgICAgICAgICAgICBzdHJsZW4gKG9wKSA/IHNwcmludGYgKG9wLCAiJXMsIHIxMCIsIG9wKSA6IHNwcmludGYgKG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIxMCIpOworICAgICAgICAgICAgICBpZiAodmFsdWUgJiAweDEwKQorICAgICAgICAgICAgICAgIHN0cmxlbiAob3ApID8gc3ByaW50ZiAob3AsICIlcywgcjExIiwgb3ApIDogc3ByaW50ZiAob3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicjExIik7CisgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIDB4MjApCisgICAgICAgICAgICAgICAgc3RybGVuIChvcCkgPyBzcHJpbnRmIChvcCwgIiVzLCByMTIiLCBvcCkgOiBzcHJpbnRmIChvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyMTIiKTsKKyAgICAgICAgICAgICAgaWYgKHZhbHVlICYgMHg0MCkKKyAgICAgICAgICAgICAgICBzdHJsZW4gKG9wKSA/IHNwcmludGYgKG9wLCAiJXMsIGxyIiwgb3ApIDogc3ByaW50ZiAob3AsICJsciIpOworICAgICAgICAgICAgICBpZiAodmFsdWUgJiAweDgwKQorICAgICAgICAgICAgICAgIHN0cmxlbiAob3ApID8gc3ByaW50ZiAob3AsICIlcywgcGMiLCBvcCkgOiBzcHJpbnRmIChvcCwgInBjIik7CisKKyAgICAgICAgICAgICAgZnB1dHMgKG9wLCBzdHJlYW0pOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFJlZ2xpc3QgMTYgKi8KKyAgICAgICAgICAgICAgY2hhciByZWdsaXN0MTZfc3RyaW5nWzEwMF07CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICByZWdsaXN0MTZfc3RyaW5nWzBdID0gJ1wwJzsKKworCSAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorCQl7CisJCSAgaWYgKHZhbHVlICYgKDEgPDwgaSkpCisJCSAgICB7CisJCSAgICAgIHN0cmxlbiAocmVnbGlzdDE2X3N0cmluZykgPyBzcHJpbnRmIChyZWdsaXN0MTZfc3RyaW5nLAorCQkJCQkJCSAgICIlcywgJXMiLAorCQkJCQkJCSAgIHJlZ2xpc3QxNl9zdHJpbmcsCisJCQkJCQkJICAgcmVnX25hbWVzCisJCQkJCQkJICAgW0lOVEVSTkFMX1JFR05VTQorCQkJCQkJCSAgICAoaSldKSA6CisJCQlzcHJpbnRmIChyZWdsaXN0MTZfc3RyaW5nLCAiJXMiLAorCQkJCSByZWdfbmFtZXNbSU5URVJOQUxfUkVHTlVNIChpKV0pOworCQkgICAgfQorCQl9CisJICAgICAgZnB1dHMgKHJlZ2xpc3QxNl9zdHJpbmcsIHN0cmVhbSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBjYXNlICdDJzoKKwkgICAgeworCSAgICAgIC8qIFJlZ0xpc3RDUDggKi8KKwkgICAgICBjaGFyIHJlZ2xpc3Rfc3RyaW5nWzEwMF07CisJICAgICAgYXZyMzJfbWFrZV9mcF9yZWdsaXN0X3cgKHZhbHVlLCAoY2hhciAqKSByZWdsaXN0X3N0cmluZyk7CisJICAgICAgZnB1dHMgKHJlZ2xpc3Rfc3RyaW5nLCBzdHJlYW0pOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgY2FzZSAnRCc6CisJICAgIHsKKwkgICAgICAvKiBSZWdMaXN0Q1BEOCAqLworCSAgICAgIGNoYXIgcmVnbGlzdF9zdHJpbmdbMTAwXTsKKwkgICAgICBhdnIzMl9tYWtlX2ZwX3JlZ2xpc3RfZCAodmFsdWUsIChjaGFyICopIHJlZ2xpc3Rfc3RyaW5nKTsKKwkgICAgICBmcHV0cyAocmVnbGlzdF9zdHJpbmcsIHN0cmVhbSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBjYXNlICdoJzoKKwkgICAgLyogUHJpbnQgaGFsZndvcmQgcGFydCBvZiB3b3JkICovCisJICAgIGZwdXRzICh2YWx1ZSA/ICJiIiA6ICJ0Iiwgc3RyZWFtKTsKKwkgICAgcmV0dXJuOworCSAgfQorCisJLyogUHJpbnQgVmFsdWUgKi8KKwlmcHJpbnRmIChzdHJlYW0sICIlZCIsIHZhbHVlKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIENPTlNUX0RPVUJMRToKKyAgICAgIHsKKwlIT1NUX1dJREVfSU5UIGhpLCBsbzsKKwlpZiAoU0NBTEFSX0ZMT0FUX01PREVfUCAoR0VUX01PREUgKHgpKSkKKwkgIHsKKwkgICAgSE9TVF9XSURFX0lOVCB0YXJnZXRfZmxvYXRbMl07CisJICAgIGhpID0gbG8gPSAwOworCSAgICByZWFsX3RvX3RhcmdldCAodGFyZ2V0X2Zsb2F0LCBDT05TVF9ET1VCTEVfUkVBTF9WQUxVRSAoeCksCisJCQkgICAgR0VUX01PREUgKHgpKTsKKwkgICAgLyogRm9yIGRvdWJsZXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBzdGFydHMgYXQgaW5kZXggMC4gKi8KKwkgICAgaWYgKEdFVF9NT0RFX1NJWkUgKEdFVF9NT0RFICh4KSkgPiBVTklUU19QRVJfV09SRCkKKwkgICAgICB7CisJCWhpID0gdGFyZ2V0X2Zsb2F0WzBdOworCQlsbyA9IHRhcmdldF9mbG9hdFsxXTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWxvID0gdGFyZ2V0X2Zsb2F0WzBdOworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB7CisJICAgIGhpID0gQ09OU1RfRE9VQkxFX0hJR0ggKHgpOworCSAgICBsbyA9IENPTlNUX0RPVUJMRV9MT1cgKHgpOworCSAgfQorCisJaWYgKGNvZGUgPT0gJ20nKQorCSAgZnByaW50ZiAoc3RyZWFtLCAiJWxkIiwgaGkpOworCWVsc2UKKwkgIGZwcmludGYgKHN0cmVhbSwgIiVsZCIsIGxvKTsKKworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgQ09OU1Q6CisgICAgICBvdXRwdXRfYWRkcl9jb25zdCAoc3RyZWFtLCBYRVhQIChYRVhQICh4LCAwKSwgMCkpOworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiKyVsZCIsIElOVFZBTCAoWEVYUCAoWEVYUCAoeCwgMCksIDEpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFRzoKKyAgICAgIC8qIFN3YXAgcmVnaXN0ZXIgbmFtZSBpZiB0aGUgcmVnaXN0ZXIgaXMgREltb2RlIG9yIERGbW9kZS4gKi8KKyAgICAgIGlmIChHRVRfTU9ERSAoeCkgPT0gREltb2RlIHx8IEdFVF9NT0RFICh4KSA9PSBERm1vZGUpCisJeworCSAgLyogRG91YmxlIHJlZ2lzdGVyIG11c3QgaGF2ZSBhbiBldmVuIG51bWJlcmVkIGFkZHJlc3MgKi8KKwkgIGdjY19hc3NlcnQgKCEoUkVHTk8gKHgpICUgMikpOworCSAgaWYgKGNvZGUgPT0gJ20nKQorCSAgICBmcHV0cyAocmVnX25hbWVzW3RydWVfcmVnbnVtICh4KV0sIHN0cmVhbSk7CisJICBlbHNlCisJICAgIGZwdXRzIChyZWdfbmFtZXNbdHJ1ZV9yZWdudW0gKHgpICsgMV0sIHN0cmVhbSk7CisJfQorICAgICAgZWxzZSBpZiAoR0VUX01PREUgKHgpID09IFRJbW9kZSkKKwl7CisJICBzd2l0Y2ggKGNvZGUpCisJICAgIHsKKwkgICAgY2FzZSAnVCc6CisJICAgICAgZnB1dHMgKHJlZ19uYW1lc1t0cnVlX3JlZ251bSAoeCldLCBzdHJlYW0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdVJzoKKwkgICAgICBmcHV0cyAocmVnX25hbWVzW3RydWVfcmVnbnVtICh4KSArIDFdLCBzdHJlYW0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdMJzoKKwkgICAgICBmcHV0cyAocmVnX25hbWVzW3RydWVfcmVnbnVtICh4KSArIDJdLCBzdHJlYW0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdCJzoKKwkgICAgICBmcHV0cyAocmVnX25hbWVzW3RydWVfcmVnbnVtICh4KSArIDNdLCBzdHJlYW0pOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiVzLCAlcywgJXMsICVzIiwKKwkJICAgICAgIHJlZ19uYW1lc1t0cnVlX3JlZ251bSAoeCkgKyAzXSwKKwkJICAgICAgIHJlZ19uYW1lc1t0cnVlX3JlZ251bSAoeCkgKyAyXSwKKwkJICAgICAgIHJlZ19uYW1lc1t0cnVlX3JlZ251bSAoeCkgKyAxXSwKKwkJICAgICAgIHJlZ19uYW1lc1t0cnVlX3JlZ251bSAoeCldKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHV0cyAocmVnX25hbWVzW3RydWVfcmVnbnVtICh4KV0sIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0RFX0xBQkVMOgorICAgIGNhc2UgTEFCRUxfUkVGOgorICAgIGNhc2UgU1lNQk9MX1JFRjoKKyAgICAgIG91dHB1dF9hZGRyX2NvbnN0IChzdHJlYW0sIHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNRU06CisgICAgICBzd2l0Y2ggKEdFVF9DT0RFIChYRVhQICh4LCAwKSkpCisJeworCWNhc2UgTEFCRUxfUkVGOgorCWNhc2UgU1lNQk9MX1JFRjoKKwkgIG91dHB1dF9hZGRyX2NvbnN0IChzdHJlYW0sIFhFWFAgKHgsIDApKTsKKwkgIGJyZWFrOworCWNhc2UgTUVNOgorCSAgc3dpdGNoIChHRVRfQ09ERSAoWEVYUCAoWEVYUCAoeCwgMCksIDApKSkKKwkgICAgeworCSAgICBjYXNlIFNZTUJPTF9SRUY6CisJICAgICAgb3V0cHV0X2FkZHJfY29uc3QgKHN0cmVhbSwgWEVYUCAoWEVYUCAoeCwgMCksIDApKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlcnJvciA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgUkVHOgorCSAgYXZyMzJfcHJpbnRfb3BlcmFuZCAoc3RyZWFtLCBYRVhQICh4LCAwKSwgMCk7CisJICBpZiAoY29kZSAhPSAncCcpCisJICAgIGZwdXRzICgiWzBdIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgUFJFX0RFQzoKKwkgIGZwdXRzICgiLS0iLCBzdHJlYW0pOworCSAgYXZyMzJfcHJpbnRfb3BlcmFuZCAoc3RyZWFtLCBYRVhQIChYRVhQICh4LCAwKSwgMCksIDApOworCSAgYnJlYWs7CisJY2FzZSBQT1NUX0lOQzoKKwkgIGF2cjMyX3ByaW50X29wZXJhbmQgKHN0cmVhbSwgWEVYUCAoWEVYUCAoeCwgMCksIDApLCAwKTsKKwkgIGZwdXRzICgiKysiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSBQTFVTOgorCSAgeworCSAgICBydHggb3AwID0gWEVYUCAoWEVYUCAoeCwgMCksIDApOworCSAgICBydHggb3AxID0gWEVYUCAoWEVYUCAoeCwgMCksIDEpOworCSAgICBydHggYmFzZSA9IE5VTExfUlRYLCBvZmZzZXQgPSBOVUxMX1JUWDsKKworCSAgICBpZiAoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAob3AwLCAxKSkKKwkgICAgICB7CisJCWJhc2UgPSBvcDA7CisJCW9mZnNldCA9IG9wMTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGF2cjMyX2FkZHJlc3NfcmVnaXN0ZXJfcnR4X3AgKG9wMSwgMSkpCisJICAgICAgeworCQkvKiBPcGVyYW5kcyBhcmUgc3dpdGNoZWQuICovCisJCWJhc2UgPSBvcDE7CisJCW9mZnNldCA9IG9wMDsKKwkgICAgICB9CisKKwkgICAgZ2NjX2Fzc2VydCAoYmFzZSAmJiBvZmZzZXQKKwkJCSYmIGF2cjMyX2FkZHJlc3NfcmVnaXN0ZXJfcnR4X3AgKGJhc2UsIDEpCisJCQkmJiBhdnIzMl9sZWdpdGltYXRlX2luZGV4X3AgKEdFVF9NT0RFICh4KSwgb2Zmc2V0LAorCQkJCQkJICAgICAxKSk7CisKKwkgICAgYXZyMzJfcHJpbnRfb3BlcmFuZCAoc3RyZWFtLCBiYXNlLCAwKTsKKwkgICAgZnB1dHMgKCJbIiwgc3RyZWFtKTsKKwkgICAgYXZyMzJfcHJpbnRfb3BlcmFuZCAoc3RyZWFtLCBvZmZzZXQsIDApOworCSAgICBmcHV0cyAoIl0iLCBzdHJlYW0pOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIENPTlNUOgorCSAgb3V0cHV0X2FkZHJfY29uc3QgKHN0cmVhbSwgWEVYUCAoWEVYUCAoWEVYUCAoeCwgMCksIDApLCAwKSk7CisJICBmcHJpbnRmIChzdHJlYW0sICIgKyAlbGQiLAorCQkgICBJTlRWQUwgKFhFWFAgKFhFWFAgKFhFWFAgKHgsIDApLCAwKSwgMSkpKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIENPTlNUX0lOVDoKKwkgIGF2cjMyX3ByaW50X29wZXJhbmQgKHN0cmVhbSwgWEVYUCAoeCwgMCksIDApOworICAgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICBlcnJvciA9IDE7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNVUxUOgorICAgICAgeworCWludCB2YWx1ZSA9IElOVFZBTCAoWEVYUCAoeCwgMSkpOworCisJLyogQ29udmVydCBpbW1lZGlhdGUgaW4gbXVsdGlwbGljYXRpb24gaW50byBhIHNoaWZ0IGltbWVkaWF0ZSAqLworCXN3aXRjaCAodmFsdWUpCisJICB7CisJICBjYXNlIDI6CisJICAgIHZhbHVlID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlIDQ6CisJICAgIHZhbHVlID0gMjsKKwkgICAgYnJlYWs7CisJICBjYXNlIDg6CisJICAgIHZhbHVlID0gMzsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICB2YWx1ZSA9IDA7CisJICB9CisJZnByaW50ZiAoc3RyZWFtLCAiJXMgPDwgJWkiLCByZWdfbmFtZXNbdHJ1ZV9yZWdudW0gKFhFWFAgKHgsIDApKV0sCisJCSB2YWx1ZSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBBU0hJRlQ6CisgICAgICBpZiAoR0VUX0NPREUgKFhFWFAgKHgsIDEpKSA9PSBDT05TVF9JTlQpCisJZnByaW50ZiAoc3RyZWFtLCAiJXMgPDwgJWkiLCByZWdfbmFtZXNbdHJ1ZV9yZWdudW0gKFhFWFAgKHgsIDApKV0sCisJCSAoaW50KSBJTlRWQUwgKFhFWFAgKHgsIDEpKSk7CisgICAgICBlbHNlIGlmIChSRUdfUCAoWEVYUCAoeCwgMSkpKQorCWZwcmludGYgKHN0cmVhbSwgIiVzIDw8ICVzIiwgcmVnX25hbWVzW3RydWVfcmVnbnVtIChYRVhQICh4LCAwKSldLAorCQkgcmVnX25hbWVzW3RydWVfcmVnbnVtIChYRVhQICh4LCAxKSldKTsKKyAgICAgIGVsc2UKKwl7CisJICBlcnJvciA9IDE7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBMU0hJRlRSVDoKKyAgICAgIGlmIChHRVRfQ09ERSAoWEVYUCAoeCwgMSkpID09IENPTlNUX0lOVCkKKwlmcHJpbnRmIChzdHJlYW0sICIlcyA+PiAlaSIsIHJlZ19uYW1lc1t0cnVlX3JlZ251bSAoWEVYUCAoeCwgMCkpXSwKKwkJIChpbnQpIElOVFZBTCAoWEVYUCAoeCwgMSkpKTsKKyAgICAgIGVsc2UgaWYgKFJFR19QIChYRVhQICh4LCAxKSkpCisJZnByaW50ZiAoc3RyZWFtLCAiJXMgPj4gJXMiLCByZWdfbmFtZXNbdHJ1ZV9yZWdudW0gKFhFWFAgKHgsIDApKV0sCisJCSByZWdfbmFtZXNbdHJ1ZV9yZWdudW0gKFhFWFAgKHgsIDEpKV0pOworICAgICAgZWxzZQorCXsKKwkgIGVycm9yID0gMTsKKwl9CisgICAgICBmcHJpbnRmIChzdHJlYW0sICI+PiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQQVJBTExFTDoKKyAgICAgIHsKKwkvKiBMb2FkIHN0b3JlIG11bHRpcGxlICovCisJaW50IGk7CisJaW50IGNvdW50ID0gWFZFQ0xFTiAoeCwgMCk7CisJaW50IHJlZ2xpc3QxNiA9IDA7CisJY2hhciByZWdsaXN0MTZfc3RyaW5nWzEwMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkgIHsKKwkgICAgcnR4IHZlY19lbG0gPSBYVkVDRVhQICh4LCAwLCBpKTsKKwkgICAgaWYgKEdFVF9NT0RFICh2ZWNfZWxtKSAhPSBTRVQpCisJICAgICAgeworCQlkZWJ1Z19ydHggKHZlY19lbG0pOworCQlpbnRlcm5hbF9lcnJvciAoIlVua25vd24gZWxlbWVudCBpbiBwYXJhbGxlbCBleHByZXNzaW9uISIpOworCSAgICAgIH0KKwkgICAgaWYgKEdFVF9NT0RFIChYRVhQICh2ZWNfZWxtLCAwKSkgPT0gUkVHKQorCSAgICAgIHsKKwkJLyogTG9hZCBtdWx0aXBsZSAqLworCQlyZWdsaXN0MTYgfD0gMSA8PCBBU01fUkVHTlVNIChSRUdOTyAoWEVYUCAodmVjX2VsbSwgMCkpKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIFN0b3JlIG11bHRpcGxlICovCisJCXJlZ2xpc3QxNiB8PSAxIDw8IEFTTV9SRUdOVU0gKFJFR05PIChYRVhQICh2ZWNfZWxtLCAxKSkpOworCSAgICAgIH0KKwkgIH0KKworCWF2cjMyX21ha2VfcmVnbGlzdDE2IChyZWdsaXN0MTYsIHJlZ2xpc3QxNl9zdHJpbmcpOworCWZwdXRzIChyZWdsaXN0MTZfc3RyaW5nLCBzdHJlYW0pOworCisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIFBMVVM6CisgICAgICB7CisgICAgICAgIHJ0eCBvcDAgPSBYRVhQICh4LCAwKTsKKyAgICAgICAgcnR4IG9wMSA9IFhFWFAgKHgsIDEpOworICAgICAgICBydHggYmFzZSA9IE5VTExfUlRYLCBvZmZzZXQgPSBOVUxMX1JUWDsKKworICAgICAgICBpZiAoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAob3AwLCAxKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBiYXNlID0gb3AwOworICAgICAgICAgICAgb2Zmc2V0ID0gb3AxOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAob3AxLCAxKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBPcGVyYW5kcyBhcmUgc3dpdGNoZWQuICovCisgICAgICAgICAgICBiYXNlID0gb3AxOworICAgICAgICAgICAgb2Zmc2V0ID0gb3AwOworICAgICAgICAgIH0KKworICAgICAgICBnY2NfYXNzZXJ0IChiYXNlICYmIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAmJiBhdnIzMl9hZGRyZXNzX3JlZ2lzdGVyX3J0eF9wIChiYXNlLCAxKQorICAgICAgICAgICAgICAgICAgICAmJiBhdnIzMl9sZWdpdGltYXRlX2luZGV4X3AgKEdFVF9NT0RFICh4KSwgb2Zmc2V0LCAxKSk7CisKKyAgICAgICAgYXZyMzJfcHJpbnRfb3BlcmFuZCAoc3RyZWFtLCBiYXNlLCAwKTsKKyAgICAgICAgZnB1dHMgKCJbIiwgc3RyZWFtKTsKKyAgICAgICAgYXZyMzJfcHJpbnRfb3BlcmFuZCAoc3RyZWFtLCBvZmZzZXQsIDApOworICAgICAgICBmcHV0cyAoIl0iLCBzdHJlYW0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciA9IDE7CisgICAgfQorCisgIGlmIChlcnJvcikKKyAgICB7CisgICAgICBkZWJ1Z19ydHggKHgpOworICAgICAgaW50ZXJuYWxfZXJyb3IgKCJJbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF2cjMyX3ByaW50X29wZXJhbmQiKTsKKyAgICB9Cit9CisKK3J0eAorYXZyMzJfZ2V0X25vdGVfcmVnX2VxdWl2IChydHggaW5zbikKK3sKKyAgcnR4IG5vdGU7CisKKyAgbm90ZSA9IGZpbmRfcmVnX25vdGUgKGluc24sIFJFR19FUVVJViwgTlVMTF9SVFgpOworCisgIGlmIChub3RlICE9IE5VTExfUlRYKQorICAgIHJldHVybiBYRVhQIChub3RlLCAwKTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMX1JUWDsKK30KKworLyoKKyAgT3V0cHV0cyB0byBzdGRpbyBzdHJlYW0gc3RyZWFtIHRoZSBhc3NlbWJsZXIgc3ludGF4IGZvciBhbiBpbnN0cnVjdGlvbgorICBvcGVyYW5kIHRoYXQgaXMgYSBtZW1vcnkgcmVmZXJlbmNlIHdob3NlIGFkZHJlc3MgaXMgeC4geCBpcyBhbiBSVEwKKyAgZXhwcmVzc2lvbi4KKworICBUb0RvOiBmaXhtZS4KKyovCit2b2lkCithdnIzMl9wcmludF9vcGVyYW5kX2FkZHJlc3MgKEZJTEUgKiBzdHJlYW0sIHJ0eCB4KQoreworICBmcHJpbnRmIChzdHJlYW0sICIoJWQpIC8qIGFkZHJlc3MgKi8iLCBSRUdOTyAoeCkpOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIGlzIG1lbnRpb25lZC4gICovCitib29sCithdnIzMl9nb3RfbWVudGlvbmVkX3AgKHJ0eCBhZGRyKQoreworICBpZiAoR0VUX0NPREUgKGFkZHIpID09IE1FTSkKKyAgICBhZGRyID0gWEVYUCAoYWRkciwgMCk7CisgIHdoaWxlIChHRVRfQ09ERSAoYWRkcikgPT0gQ09OU1QpCisgICAgYWRkciA9IFhFWFAgKGFkZHIsIDApOworICBpZiAoR0VUX0NPREUgKGFkZHIpID09IFNZTUJPTF9SRUYpCisgICAgeworICAgICAgcmV0dXJuIHN0cmVxIChYU1RSIChhZGRyLCAwKSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpOworICAgIH0KKyAgaWYgKEdFVF9DT0RFIChhZGRyKSA9PSBQTFVTIHx8IEdFVF9DT0RFIChhZGRyKSA9PSBNSU5VUykKKyAgICB7CisgICAgICBib29sIGwxLCBsMjsKKworICAgICAgbDEgPSBhdnIzMl9nb3RfbWVudGlvbmVkX3AgKFhFWFAgKGFkZHIsIDApKTsKKyAgICAgIGwyID0gYXZyMzJfZ290X21lbnRpb25lZF9wIChYRVhQIChhZGRyLCAxKSk7CisgICAgICByZXR1cm4gbDEgfHwgbDI7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLyogRmluZCB0aGUgc3ltYm9sIGluIGFuIGFkZHJlc3MgZXhwcmVzc2lvbi4gICovCisKK3J0eAorYXZyMzJfZmluZF9zeW1ib2wgKHJ0eCBhZGRyKQoreworICBpZiAoR0VUX0NPREUgKGFkZHIpID09IE1FTSkKKyAgICBhZGRyID0gWEVYUCAoYWRkciwgMCk7CisKKyAgd2hpbGUgKEdFVF9DT0RFIChhZGRyKSA9PSBDT05TVCkKKyAgICBhZGRyID0gWEVYUCAoYWRkciwgMCk7CisKKyAgaWYgKEdFVF9DT0RFIChhZGRyKSA9PSBTWU1CT0xfUkVGIHx8IEdFVF9DT0RFIChhZGRyKSA9PSBMQUJFTF9SRUYpCisgICAgcmV0dXJuIGFkZHI7CisgIGlmIChHRVRfQ09ERSAoYWRkcikgPT0gUExVUykKKyAgICB7CisgICAgICBydHggbDEsIGwyOworCisgICAgICBsMSA9IGF2cjMyX2ZpbmRfc3ltYm9sIChYRVhQIChhZGRyLCAwKSk7CisgICAgICBsMiA9IGF2cjMyX2ZpbmRfc3ltYm9sIChYRVhQIChhZGRyLCAxKSk7CisgICAgICBpZiAobDEgIT0gTlVMTF9SVFggJiYgbDIgPT0gTlVMTF9SVFgpCisJcmV0dXJuIGwxOworICAgICAgZWxzZSBpZiAobDEgPT0gTlVMTF9SVFggJiYgbDIgIT0gTlVMTF9SVFgpCisJcmV0dXJuIGwyOworICAgIH0KKworICByZXR1cm4gTlVMTF9SVFg7Cit9CisKKworLyogUm91dGluZXMgZm9yIG1hbmlwdWxhdGlvbiBvZiB0aGUgY29uc3RhbnQgcG9vbC4gICovCisKKy8qIEFWUjMyIGluc3RydWN0aW9ucyBjYW5ub3QgbG9hZCBhIGxhcmdlIGNvbnN0YW50IGRpcmVjdGx5IGludG8gYQorICAgcmVnaXN0ZXI7IHRoZXkgaGF2ZSB0byBjb21lIGZyb20gYSBwYyByZWxhdGl2ZSBsb2FkLiAgVGhlIGNvbnN0YW50CisgICBtdXN0IHRoZXJlZm9yZSBiZSBwbGFjZWQgaW4gdGhlIGFkZHJlc3NhYmxlIHJhbmdlIG9mIHRoZSBwYworICAgcmVsYXRpdmUgbG9hZC4gIERlcGVuZGluZyBvbiB0aGUgcHJlY2lzZSBwYyByZWxhdGl2ZSBsb2FkCisgICBpbnN0cnVjdGlvbiB0aGUgcmFuZ2UgaXMgc29tZXdoZXJlIGJldHdlZW4gMjU2IGJ5dGVzIGFuZCA0ay4gIFRoaXMKKyAgIG1lYW5zIHRoYXQgd2Ugb2Z0ZW4gaGF2ZSB0byBkdW1wIGEgY29uc3RhbnQgaW5zaWRlIGEgZnVuY3Rpb24sIGFuZAorICAgZ2VuZXJhdGUgY29kZSB0byBicmFuY2ggYXJvdW5kIGl0LgorCisgICBJdCBpcyBpbXBvcnRhbnQgdG8gbWluaW1pemUgdGhpcywgc2luY2UgdGhlIGJyYW5jaGVzIHdpbGwgc2xvdworICAgdGhpbmdzIGRvd24gYW5kIG1ha2UgdGhlIGNvZGUgbGFyZ2VyLgorCisgICBOb3JtYWxseSB3ZSBjYW4gaGlkZSB0aGUgdGFibGUgYWZ0ZXIgYW4gZXhpc3RpbmcgdW5jb25kaXRpb25hbAorICAgYnJhbmNoIHNvIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJydXB0aW9uIG9mIHRoZSBmbG93LCBidXQgaW4gdGhlCisgICB3b3JzdCBjYXNlIHRoZSBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworCWxkZHBjCXJuLCBMMQorCS4uLgorCXJqbXAJTDIKKwlhbGlnbgorCUwxOgkubG9uZyB2YWx1ZQorCUwyOgorCS4uLgorCisJbGRkcGMJcm4sIEwzCisJLi4uCisJcmptcAlMNAorCWFsaWduCisJTDM6CS5sb25nIHZhbHVlCisJTDQ6CisJLi4uCisKKyAgIFdlIGZpeCB0aGlzIGJ5IHBlcmZvcm1pbmcgYSBzY2FuIGFmdGVyIHNjaGVkdWxpbmcsIHdoaWNoIG5vdGljZXMKKyAgIHdoaWNoIGluc3RydWN0aW9ucyBuZWVkIHRvIGhhdmUgdGhlaXIgb3BlcmFuZHMgZmV0Y2hlZCBmcm9tIHRoZQorICAgY29uc3RhbnQgdGFibGUgYW5kIGJ1aWxkcyB0aGUgdGFibGUuCisKKyAgIFRoZSBhbGdvcml0aG0gc3RhcnRzIGJ5IGJ1aWxkaW5nIGEgdGFibGUgb2YgYWxsIHRoZSBjb25zdGFudHMgdGhhdAorICAgbmVlZCBmaXhpbmcgdXAgYW5kIGFsbCB0aGUgbmF0dXJhbCBiYXJyaWVycyBpbiB0aGUgZnVuY3Rpb24gKHBsYWNlcworICAgd2hlcmUgYSBjb25zdGFudCB0YWJsZSBjYW4gYmUgZHJvcHBlZCB3aXRob3V0IGJyZWFraW5nIHRoZSBmbG93KS4KKyAgIEZvciBlYWNoIGZpeHVwIHdlIG5vdGUgaG93IGZhciB0aGUgcGMtcmVsYXRpdmUgcmVwbGFjZW1lbnQgd2lsbCBiZQorICAgYWJsZSB0byByZWFjaCBhbmQgdGhlIG9mZnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW50byB0aGUgZnVuY3Rpb24uCisKKyAgIEhhdmluZyBidWlsdCB0aGUgdGFibGUgd2UgdGhlbiBncm91cCB0aGUgZml4ZXMgdG9nZXRoZXIgdG8gZm9ybQorICAgdGFibGVzIHRoYXQgYXJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlIChzdWJqZWN0IHRvIGFkZHJlc3NpbmcKKyAgIGNvbnN0cmFpbnRzKSBhbmQgZW1pdCBlYWNoIHRhYmxlIG9mIGNvbnN0YW50cyBhZnRlciB0aGUgbGFzdAorICAgYmFycmllciB0aGF0IGlzIHdpdGhpbiByYW5nZSBvZiBhbGwgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgZ3JvdXAuCisgICBJZiBhIGdyb3VwIGRvZXMgbm90IGNvbnRhaW4gYSBiYXJyaWVyLCB0aGVuIHdlIGZvcmNpYmx5IGNyZWF0ZSBvbmUKKyAgIGJ5IGluc2VydGluZyBhIGp1bXAgaW5zdHJ1Y3Rpb24gaW50byB0aGUgZmxvdy4gIE9uY2UgdGhlIHRhYmxlIGhhcworICAgYmVlbiBpbnNlcnRlZCwgdGhlIGluc25zIGFyZSB0aGVuIG1vZGlmaWVkIHRvIHJlZmVyZW5jZSB0aGUKKyAgIHJlbGV2YW50IGVudHJ5IGluIHRoZSBwb29sLgorCisgICBQb3NzaWJsZSBlbmhhbmNlbWVudHMgdG8gdGhlIGFsZ29yaXRobSAobm90IGltcGxlbWVudGVkKSBhcmU6CisKKyAgIDEpIEZvciBzb21lIHByb2Nlc3NvcnMgYW5kIG9iamVjdCBmb3JtYXRzLCB0aGVyZSBtYXkgYmUgYmVuZWZpdCBpbgorICAgYWxpZ25pbmcgdGhlIHBvb2xzIHRvIHRoZSBzdGFydCBvZiBjYWNoZSBsaW5lczsgdGhpcyBhbGlnbm1lbnQKKyAgIHdvdWxkIG5lZWQgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gY2FsY3VsYXRpbmcgYWRkcmVzc2FiaWxpdHkKKyAgIG9mIGEgcG9vbC4gICovCisKKy8qIFRoZXNlIHR5cGVkZWZzIGFyZSBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUsIHNvIHRoYXQKKyAgIHRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHByb3RvdHlwZXMgdGhlcmUuICBUaGlzIGNvbW1lbnQgaXMgdG8KKyAgIHJlbWluZCByZWFkZXJzIG9mIHRoYXQgZmFjdCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcworICAgY2FuIGJlIHVuZGVyc3Rvb2QgbW9yZSBlYXNpbHkuCisKKyAgICAgdHlwZWRlZiBzdHJ1Y3QgbWluaXBvb2xfbm9kZSAgICBNbm9kZTsKKyAgICAgdHlwZWRlZiBzdHJ1Y3QgbWluaXBvb2xfZml4dXAgICBNZml4OyAgKi8KKworc3RydWN0IG1pbmlwb29sX25vZGUKK3sKKyAgLyogRG91Ymx5IGxpbmtlZCBjaGFpbiBvZiBlbnRyaWVzLiAgKi8KKyAgTW5vZGUgKm5leHQ7CisgIE1ub2RlICpwcmV2OworICAvKiBUaGUgbWF4aW11bSBvZmZzZXQgaW50byB0aGUgY29kZSB0aGF0IHRoaXMgZW50cnkgY2FuIGJlIHBsYWNlZC4gIFdoaWxlCisgICAgIHB1c2hpbmcgZml4ZXMgZm9yIGZvcndhcmQgcmVmZXJlbmNlcywgYWxsIGVudHJpZXMgYXJlIHNvcnRlZCBpbiBvcmRlciBvZgorICAgICBpbmNyZWFzaW5nIG1heF9hZGRyZXNzLiAgKi8KKyAgSE9TVF9XSURFX0lOVCBtYXhfYWRkcmVzczsKKyAgLyogU2ltaWxhcmx5IGZvciBhbiBlbnRyeSBpbnNlcnRlZCBmb3IgYSBiYWNrd2FyZHMgcmVmLiAgKi8KKyAgSE9TVF9XSURFX0lOVCBtaW5fYWRkcmVzczsKKyAgLyogVGhlIG51bWJlciBvZiBmaXhlcyByZWZlcmVuY2luZyB0aGlzIGVudHJ5LiAgVGhpcyBjYW4gYmVjb21lIHplcm8gaWYgd2UKKyAgICAgInVucHVzaCIgYW4gZW50cnkuICBJbiB0aGlzIGNhc2Ugd2UgaWdub3JlIHRoZSBlbnRyeSB3aGVuIHdlIGNvbWUgdG8KKyAgICAgZW1pdCB0aGUgY29kZS4gICovCisgIGludCByZWZjb3VudDsKKyAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWluaXBvb2wuICAqLworICBIT1NUX1dJREVfSU5UIG9mZnNldDsKKyAgLyogVGhlIHZhbHVlIGluIHRhYmxlLiAgKi8KKyAgcnR4IHZhbHVlOworICAvKiBUaGUgbW9kZSBvZiB2YWx1ZS4gICovCisgIGVudW0gbWFjaGluZV9tb2RlIG1vZGU7CisgIC8qIFRoZSBzaXplIG9mIHRoZSB2YWx1ZS4gICovCisgIGludCBmaXhfc2l6ZTsKK307CisKK3N0cnVjdCBtaW5pcG9vbF9maXh1cAoreworICBNZml4ICpuZXh0OworICBydHggaW5zbjsKKyAgSE9TVF9XSURFX0lOVCBhZGRyZXNzOworICBydHggKmxvYzsKKyAgZW51bSBtYWNoaW5lX21vZGUgbW9kZTsKKyAgaW50IGZpeF9zaXplOworICBydHggdmFsdWU7CisgIE1ub2RlICptaW5pcG9vbDsKKyAgSE9TVF9XSURFX0lOVCBmb3J3YXJkczsKKyAgSE9TVF9XSURFX0lOVCBiYWNrd2FyZHM7Cit9OworCisKKy8qIEZpeGVzIGxlc3MgdGhhbiBhIHdvcmQgbmVlZCBwYWRkaW5nIG91dCB0byBhIHdvcmQgYm91bmRhcnkuICAqLworI2RlZmluZSBNSU5JUE9PTF9GSVhfU0laRShtb2RlLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKElTX0ZPUkNFX01JTklQT09MKHZhbHVlKSA/IDAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoR0VUX01PREVfU0laRSAoKG1vZGUpKSA+PSA0ID8gR0VUX01PREVfU0laRSAoKG1vZGUpKSA6IDQpKQorCisjZGVmaW5lIElTX0ZPUkNFX01JTklQT09MKHgpICAgICAgICAgICAgICAgICAgICBcCisgIChHRVRfQ09ERSh4KSA9PSBVTlNQRUMgJiYgICAgICAgICAgICAgICAgICAgICBcCisgICBYSU5UKHgsIDEpID09IFVOU1BFQ19GT1JDRV9NSU5JUE9PTCkKKworc3RhdGljIE1ub2RlICptaW5pcG9vbF92ZWN0b3JfaGVhZDsKK3N0YXRpYyBNbm9kZSAqbWluaXBvb2xfdmVjdG9yX3RhaWw7CisKKy8qIFRoZSBsaW5rZWQgbGlzdCBvZiBhbGwgbWluaXBvb2wgZml4ZXMgcmVxdWlyZWQgZm9yIHRoaXMgZnVuY3Rpb24uICAqLworTWZpeCAqbWluaXBvb2xfZml4X2hlYWQ7CitNZml4ICptaW5pcG9vbF9maXhfdGFpbDsKKy8qIFRoZSBmaXggZW50cnkgZm9yIHRoZSBjdXJyZW50IG1pbmlwb29sLCBvbmNlIGl0IGhhcyBiZWVuIHBsYWNlZC4gICovCitNZml4ICptaW5pcG9vbF9iYXJyaWVyOworCisvKiBEZXRlcm1pbmVzIGlmIElOU04gaXMgdGhlIHN0YXJ0IG9mIGEganVtcCB0YWJsZS4gIFJldHVybnMgdGhlIGVuZAorICAgb2YgdGhlIFRBQkxFIG9yIE5VTExfUlRYLiAgKi8KK3N0YXRpYyBydHgKK2lzX2p1bXBfdGFibGUgKHJ0eCBpbnNuKQoreworICBydHggdGFibGU7CisKKyAgaWYgKEdFVF9DT0RFIChpbnNuKSA9PSBKVU1QX0lOU04KKyAgICAgICYmIEpVTVBfTEFCRUwgKGluc24pICE9IE5VTEwKKyAgICAgICYmICgodGFibGUgPSBuZXh0X3JlYWxfaW5zbiAoSlVNUF9MQUJFTCAoaW5zbikpKQorCSAgPT0gbmV4dF9yZWFsX2luc24gKGluc24pKQorICAgICAgJiYgdGFibGUgIT0gTlVMTAorICAgICAgJiYgR0VUX0NPREUgKHRhYmxlKSA9PSBKVU1QX0lOU04KKyAgICAgICYmIChHRVRfQ09ERSAoUEFUVEVSTiAodGFibGUpKSA9PSBBRERSX1ZFQworCSAgfHwgR0VUX0NPREUgKFBBVFRFUk4gKHRhYmxlKSkgPT0gQUREUl9ESUZGX1ZFQykpCisgICAgcmV0dXJuIHRhYmxlOworCisgIHJldHVybiBOVUxMX1JUWDsKK30KKworc3RhdGljIEhPU1RfV0lERV9JTlQKK2dldF9qdW1wX3RhYmxlX3NpemUgKHJ0eCBpbnNuKQoreworICAvKiBBRERSX1ZFQ3Mgb25seSB0YWtlIHJvb20gaWYgcmVhZC1vbmx5IGRhdGEgZG9lcyBpbnRvIHRoZSB0ZXh0IHNlY3Rpb24uICAqLworICBpZiAoSlVNUF9UQUJMRVNfSU5fVEVYVF9TRUNUSU9OCisjaWYgIWRlZmluZWQoUkVBRE9OTFlfREFUQV9TRUNUSU9OX0FTTV9PUCkKKyAgICAgIHx8IDEKKyNlbmRpZgorICAgICkKKyAgICB7CisgICAgICBydHggYm9keSA9IFBBVFRFUk4gKGluc24pOworICAgICAgaW50IGVsdCA9IEdFVF9DT0RFIChib2R5KSA9PSBBRERSX0RJRkZfVkVDID8gMSA6IDA7CisKKyAgICAgIHJldHVybiBHRVRfTU9ERV9TSVpFIChHRVRfTU9ERSAoYm9keSkpICogWFZFQ0xFTiAoYm9keSwgZWx0KTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIE1vdmUgYSBtaW5pcG9vbCBmaXggTVAgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBiZWZvcmUgTUFYX01QLgorICAgSWYgTUFYX01QIGlzIE5VTEwsIHRoZW4gTVAgZG9lc24ndCBuZWVkIG1vdmluZywgYnV0IHRoZSBhZGRyZXNzaW5nCisgICBjb25zdHJhaW50cyBtYXkgbmVlZCB1cGRhdGluZy4gICovCitzdGF0aWMgTW5vZGUgKgorbW92ZV9taW5pcG9vbF9maXhfZm9yd2FyZF9yZWYgKE1ub2RlICogbXAsIE1ub2RlICogbWF4X21wLAorCQkJICAgICAgIEhPU1RfV0lERV9JTlQgbWF4X2FkZHJlc3MpCit7CisgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGJlIHRydWUgYW5kIHRoZSBjb2RlIGJlbG93IGFzc3VtZXMgdGhlc2UgYXJlCisgICAgIGRpZmZlcmVudC4gICovCisgIGlmIChtcCA9PSBtYXhfbXApCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKG1heF9tcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtYXhfYWRkcmVzcyA8IG1wLT5tYXhfYWRkcmVzcykKKwltcC0+bWF4X2FkZHJlc3MgPSBtYXhfYWRkcmVzczsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobWF4X2FkZHJlc3MgPiBtYXhfbXAtPm1heF9hZGRyZXNzIC0gbXAtPmZpeF9zaXplKQorCW1wLT5tYXhfYWRkcmVzcyA9IG1heF9tcC0+bWF4X2FkZHJlc3MgLSBtcC0+Zml4X3NpemU7CisgICAgICBlbHNlCisJbXAtPm1heF9hZGRyZXNzID0gbWF4X2FkZHJlc3M7CisKKyAgICAgIC8qIFVubGluayBNUCBmcm9tIGl0cyBjdXJyZW50IHBvc2l0aW9uLiAgU2luY2UgbWF4X21wIGlzIG5vbi1udWxsLAorICAgICAgICAgbXAtPnByZXYgbXVzdCBiZSBub24tbnVsbC4gICovCisgICAgICBtcC0+cHJldi0+bmV4dCA9IG1wLT5uZXh0OworICAgICAgaWYgKG1wLT5uZXh0ICE9IE5VTEwpCisJbXAtPm5leHQtPnByZXYgPSBtcC0+cHJldjsKKyAgICAgIGVsc2UKKwltaW5pcG9vbF92ZWN0b3JfdGFpbCA9IG1wLT5wcmV2OworCisgICAgICAvKiBSZS1pbnNlcnQgaXQgYmVmb3JlIE1BWF9NUC4gICovCisgICAgICBtcC0+bmV4dCA9IG1heF9tcDsKKyAgICAgIG1wLT5wcmV2ID0gbWF4X21wLT5wcmV2OworICAgICAgbWF4X21wLT5wcmV2ID0gbXA7CisKKyAgICAgIGlmIChtcC0+cHJldiAhPSBOVUxMKQorCW1wLT5wcmV2LT5uZXh0ID0gbXA7CisgICAgICBlbHNlCisJbWluaXBvb2xfdmVjdG9yX2hlYWQgPSBtcDsKKyAgICB9CisKKyAgLyogU2F2ZSB0aGUgbmV3IGVudHJ5LiAgKi8KKyAgbWF4X21wID0gbXA7CisKKyAgLyogU2NhbiBvdmVyIHRoZSBwcmVjZWRpbmcgZW50cmllcyBhbmQgYWRqdXN0IHRoZWlyIGFkZHJlc3NlcyBhcyByZXF1aXJlZC4KKyAgICovCisgIHdoaWxlIChtcC0+cHJldiAhPSBOVUxMCisJICYmIG1wLT5wcmV2LT5tYXhfYWRkcmVzcyA+IG1wLT5tYXhfYWRkcmVzcyAtIG1wLT5wcmV2LT5maXhfc2l6ZSkKKyAgICB7CisgICAgICBtcC0+cHJldi0+bWF4X2FkZHJlc3MgPSBtcC0+bWF4X2FkZHJlc3MgLSBtcC0+cHJldi0+Zml4X3NpemU7CisgICAgICBtcCA9IG1wLT5wcmV2OworICAgIH0KKworICByZXR1cm4gbWF4X21wOworfQorCisvKiBBZGQgYSBjb25zdGFudCB0byB0aGUgbWluaXBvb2wgZm9yIGEgZm9yd2FyZCByZWZlcmVuY2UuICBSZXR1cm5zIHRoZQorICAgbm9kZSBhZGRlZCBvciBOVUxMIGlmIHRoZSBjb25zdGFudCB3aWxsIG5vdCBmaXQgaW4gdGhpcyBwb29sLiAgKi8KK3N0YXRpYyBNbm9kZSAqCithZGRfbWluaXBvb2xfZm9yd2FyZF9yZWYgKE1maXggKiBmaXgpCit7CisgIC8qIElmIHNldCwgbWF4X21wIGlzIHRoZSBmaXJzdCBwb29sX2VudHJ5IHRoYXQgaGFzIGEgbG93ZXIgY29uc3RyYWludCB0aGFuCisgICAgIHRoZSBvbmUgd2UgYXJlIHRyeWluZyB0byBhZGQuICAqLworICBNbm9kZSAqbWF4X21wID0gTlVMTDsKKyAgSE9TVF9XSURFX0lOVCBtYXhfYWRkcmVzcyA9IGZpeC0+YWRkcmVzcyArIGZpeC0+Zm9yd2FyZHM7CisgIE1ub2RlICptcDsKKworICAvKiBJZiB0aGlzIGZpeCdzIGFkZHJlc3MgaXMgZ3JlYXRlciB0aGFuIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbnRyeSwKKyAgICAgdGhlbiB3ZSBjYW4ndCBwdXQgdGhlIGZpeCBpbiB0aGlzIHBvb2wuICBXZSBzdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgY3VycmVudCBmaXggdG8gZW5zdXJlIHRoYXQgaWYgdGhlIHRhYmxlIGlzIGZ1bGx5IHBhY2tlZCB3ZSBzdGlsbCBoYXZlCisgICAgIGVub3VnaCByb29tIHRvIGluc2VydCB0aGlzIHZhbHVlIGJ5IHN1ZmZsaW5nIHRoZSBvdGhlciBmaXhlcyBmb3J3YXJkcy4gICovCisgIGlmIChtaW5pcG9vbF92ZWN0b3JfaGVhZCAmJgorICAgICAgZml4LT5hZGRyZXNzID49IG1pbmlwb29sX3ZlY3Rvcl9oZWFkLT5tYXhfYWRkcmVzcyAtIGZpeC0+Zml4X3NpemUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogU2NhbiB0aGUgcG9vbCB0byBzZWUgaWYgYSBjb25zdGFudCB3aXRoIHRoZSBzYW1lIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgYWRkZWQuICBXaGlsZSB3ZSBhcmUgZG9pbmcgdGhpcywgYWxzbyBub3RlIHRoZSBsb2NhdGlvbiB3aGVyZSB3ZSBtdXN0CisgICAgIGluc2VydCB0aGUgY29uc3RhbnQgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiAgKi8KKyAgZm9yIChtcCA9IG1pbmlwb29sX3ZlY3Rvcl9oZWFkOyBtcCAhPSBOVUxMOyBtcCA9IG1wLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChHRVRfQ09ERSAoZml4LT52YWx1ZSkgPT0gR0VUX0NPREUgKG1wLT52YWx1ZSkKKwkgICYmIGZpeC0+bW9kZSA9PSBtcC0+bW9kZQorCSAgJiYgKEdFVF9DT0RFIChmaXgtPnZhbHVlKSAhPSBDT0RFX0xBQkVMCisJICAgICAgfHwgKENPREVfTEFCRUxfTlVNQkVSIChmaXgtPnZhbHVlKQorCQkgID09IENPREVfTEFCRUxfTlVNQkVSIChtcC0+dmFsdWUpKSkKKwkgICYmIHJ0eF9lcXVhbF9wIChmaXgtPnZhbHVlLCBtcC0+dmFsdWUpKQorCXsKKwkgIC8qIE1vcmUgdGhhbiBvbmUgZml4IHJlZmVyZW5jZXMgdGhpcyBlbnRyeS4gICovCisJICBtcC0+cmVmY291bnQrKzsKKwkgIHJldHVybiBtb3ZlX21pbmlwb29sX2ZpeF9mb3J3YXJkX3JlZiAobXAsIG1heF9tcCwgbWF4X2FkZHJlc3MpOworCX0KKworICAgICAgLyogTm90ZSB0aGUgaW5zZXJ0aW9uIHBvaW50IGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAobWF4X21wID09IE5VTEwgJiYgbXAtPm1heF9hZGRyZXNzID4gbWF4X2FkZHJlc3MpCisJbWF4X21wID0gbXA7CisKKyAgICB9CisKKyAgLyogVGhlIHZhbHVlIGlzIG5vdCBjdXJyZW50bHkgaW4gdGhlIG1pbmlwb29sLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgICBlbnRyeSBmb3IgaXQuICBJZiBNQVhfTVAgaXMgTlVMTCwgdGhlIGVudHJ5IHdpbGwgYmUgcHV0IG9uIHRoZSBlbmQgb2YKKyAgICAgdGhlIGxpc3Qgc2luY2UgdGhlIHBsYWNlbWVudCBpcyBsZXNzIGNvbnN0cmFpbmVkIHRoYW4gYW55IGV4aXN0aW5nCisgICAgIGVudHJ5LiAgT3RoZXJ3aXNlLCB3ZSBpbnNlcnQgdGhlIG5ldyBmaXggYmVmb3JlIE1BWF9NUCBhbmQsIGlmCisgICAgIG5lY2Vzc2FyeSwgYWRqdXN0IHRoZSBjb25zdHJhaW50cyBvbiB0aGUgb3RoZXIgZW50cmllcy4gICovCisgIG1wID0geG1hbGxvYyAoc2l6ZW9mICgqbXApKTsKKyAgbXAtPmZpeF9zaXplID0gZml4LT5maXhfc2l6ZTsKKyAgbXAtPm1vZGUgPSBmaXgtPm1vZGU7CisgIG1wLT52YWx1ZSA9IGZpeC0+dmFsdWU7CisgIG1wLT5yZWZjb3VudCA9IDE7CisgIC8qIE5vdCB5ZXQgcmVxdWlyZWQgZm9yIGEgYmFja3dhcmRzIHJlZi4gICovCisgIG1wLT5taW5fYWRkcmVzcyA9IC02NTUzNjsKKworICBpZiAobWF4X21wID09IE5VTEwpCisgICAgeworICAgICAgbXAtPm1heF9hZGRyZXNzID0gbWF4X2FkZHJlc3M7CisgICAgICBtcC0+bmV4dCA9IE5VTEw7CisgICAgICBtcC0+cHJldiA9IG1pbmlwb29sX3ZlY3Rvcl90YWlsOworCisgICAgICBpZiAobXAtPnByZXYgPT0gTlVMTCkKKwl7CisJICBtaW5pcG9vbF92ZWN0b3JfaGVhZCA9IG1wOworCSAgbWluaXBvb2xfdmVjdG9yX2xhYmVsID0gZ2VuX2xhYmVsX3J0eCAoKTsKKwl9CisgICAgICBlbHNlCisJbXAtPnByZXYtPm5leHQgPSBtcDsKKworICAgICAgbWluaXBvb2xfdmVjdG9yX3RhaWwgPSBtcDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobWF4X2FkZHJlc3MgPiBtYXhfbXAtPm1heF9hZGRyZXNzIC0gbXAtPmZpeF9zaXplKQorCW1wLT5tYXhfYWRkcmVzcyA9IG1heF9tcC0+bWF4X2FkZHJlc3MgLSBtcC0+Zml4X3NpemU7CisgICAgICBlbHNlCisJbXAtPm1heF9hZGRyZXNzID0gbWF4X2FkZHJlc3M7CisKKyAgICAgIG1wLT5uZXh0ID0gbWF4X21wOworICAgICAgbXAtPnByZXYgPSBtYXhfbXAtPnByZXY7CisgICAgICBtYXhfbXAtPnByZXYgPSBtcDsKKyAgICAgIGlmIChtcC0+cHJldiAhPSBOVUxMKQorCW1wLT5wcmV2LT5uZXh0ID0gbXA7CisgICAgICBlbHNlCisJbWluaXBvb2xfdmVjdG9yX2hlYWQgPSBtcDsKKyAgICB9CisKKyAgLyogU2F2ZSB0aGUgbmV3IGVudHJ5LiAgKi8KKyAgbWF4X21wID0gbXA7CisKKyAgLyogU2NhbiBvdmVyIHRoZSBwcmVjZWRpbmcgZW50cmllcyBhbmQgYWRqdXN0IHRoZWlyIGFkZHJlc3NlcyBhcyByZXF1aXJlZC4KKyAgICovCisgIHdoaWxlIChtcC0+cHJldiAhPSBOVUxMCisJICYmIG1wLT5wcmV2LT5tYXhfYWRkcmVzcyA+IG1wLT5tYXhfYWRkcmVzcyAtIG1wLT5wcmV2LT5maXhfc2l6ZSkKKyAgICB7CisgICAgICBtcC0+cHJldi0+bWF4X2FkZHJlc3MgPSBtcC0+bWF4X2FkZHJlc3MgLSBtcC0+cHJldi0+Zml4X3NpemU7CisgICAgICBtcCA9IG1wLT5wcmV2OworICAgIH0KKworICByZXR1cm4gbWF4X21wOworfQorCitzdGF0aWMgTW5vZGUgKgorbW92ZV9taW5pcG9vbF9maXhfYmFja3dhcmRfcmVmIChNbm9kZSAqIG1wLCBNbm9kZSAqIG1pbl9tcCwKKwkJCQlIT1NUX1dJREVfSU5UIG1pbl9hZGRyZXNzKQoreworICBIT1NUX1dJREVfSU5UIG9mZnNldDsKKworICAvKiBUaGlzIHNob3VsZCBuZXZlciBiZSB0cnVlLCBhbmQgdGhlIGNvZGUgYmVsb3cgYXNzdW1lcyB0aGVzZSBhcmUKKyAgICAgZGlmZmVyZW50LiAgKi8KKyAgaWYgKG1wID09IG1pbl9tcCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluX21wID09IE5VTEwpCisgICAgeworICAgICAgaWYgKG1pbl9hZGRyZXNzID4gbXAtPm1pbl9hZGRyZXNzKQorCW1wLT5taW5fYWRkcmVzcyA9IG1pbl9hZGRyZXNzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIHdpbGwgYWRqdXN0IHRoaXMgYmVsb3cgaWYgaXQgaXMgdG9vIGxvb3NlLiAgKi8KKyAgICAgIG1wLT5taW5fYWRkcmVzcyA9IG1pbl9hZGRyZXNzOworCisgICAgICAvKiBVbmxpbmsgTVAgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbi4gIFNpbmNlIG1pbl9tcCBpcyBub24tbnVsbCwKKyAgICAgICAgIG1wLT5uZXh0IG11c3QgYmUgbm9uLW51bGwuICAqLworICAgICAgbXAtPm5leHQtPnByZXYgPSBtcC0+cHJldjsKKyAgICAgIGlmIChtcC0+cHJldiAhPSBOVUxMKQorCW1wLT5wcmV2LT5uZXh0ID0gbXAtPm5leHQ7CisgICAgICBlbHNlCisJbWluaXBvb2xfdmVjdG9yX2hlYWQgPSBtcC0+bmV4dDsKKworICAgICAgLyogUmVpbnNlcnQgaXQgYWZ0ZXIgTUlOX01QLiAgKi8KKyAgICAgIG1wLT5wcmV2ID0gbWluX21wOworICAgICAgbXAtPm5leHQgPSBtaW5fbXAtPm5leHQ7CisgICAgICBtaW5fbXAtPm5leHQgPSBtcDsKKyAgICAgIGlmIChtcC0+bmV4dCAhPSBOVUxMKQorCW1wLT5uZXh0LT5wcmV2ID0gbXA7CisgICAgICBlbHNlCisJbWluaXBvb2xfdmVjdG9yX3RhaWwgPSBtcDsKKyAgICB9CisKKyAgbWluX21wID0gbXA7CisKKyAgb2Zmc2V0ID0gMDsKKyAgZm9yIChtcCA9IG1pbmlwb29sX3ZlY3Rvcl9oZWFkOyBtcCAhPSBOVUxMOyBtcCA9IG1wLT5uZXh0KQorICAgIHsKKyAgICAgIG1wLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICBpZiAobXAtPnJlZmNvdW50ID4gMCkKKwlvZmZzZXQgKz0gbXAtPmZpeF9zaXplOworCisgICAgICBpZiAobXAtPm5leHQgJiYgbXAtPm5leHQtPm1pbl9hZGRyZXNzIDwgbXAtPm1pbl9hZGRyZXNzICsgbXAtPmZpeF9zaXplKQorCW1wLT5uZXh0LT5taW5fYWRkcmVzcyA9IG1wLT5taW5fYWRkcmVzcyArIG1wLT5maXhfc2l6ZTsKKyAgICB9CisKKyAgcmV0dXJuIG1pbl9tcDsKK30KKworLyogQWRkIGEgY29uc3RhbnQgdG8gdGhlIG1pbmlwb29sIGZvciBhIGJhY2t3YXJkIHJlZmVyZW5jZS4gIFJldHVybnMgdGhlCisgICBub2RlIGFkZGVkIG9yIE5VTEwgaWYgdGhlIGNvbnN0YW50IHdpbGwgbm90IGZpdCBpbiB0aGlzIHBvb2wuCisKKyAgIE5vdGUgdGhhdCB0aGUgY29kZSBmb3IgaW5zZXJ0aW9uIGZvciBhIGJhY2t3YXJkcyByZWZlcmVuY2UgY2FuIGJlCisgICBzb21ld2hhdCBjb25mdXNpbmcgYmVjYXVzZSB0aGUgY2FsY3VsYXRlZCBvZmZzZXRzIGZvciBlYWNoIGZpeCBkbworICAgbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIHRoZSBwb29sICh3aGljaCBpcyBzdGlsbCB1bmRlcgorICAgY29uc3RydWN0aW9uLiAgKi8KK3N0YXRpYyBNbm9kZSAqCithZGRfbWluaXBvb2xfYmFja3dhcmRfcmVmIChNZml4ICogZml4KQoreworICAvKiBJZiBzZXQsIG1pbl9tcCBpcyB0aGUgbGFzdCBwb29sX2VudHJ5IHRoYXQgaGFzIGEgbG93ZXIgY29uc3RyYWludCB0aGFuCisgICAgIHRoZSBvbmUgd2UgYXJlIHRyeWluZyB0byBhZGQuICAqLworICBNbm9kZSAqbWluX21wID0gTlVMTDsKKyAgLyogVGhpcyBjYW4gYmUgbmVnYXRpdmUsIHNpbmNlIGl0IGlzIG9ubHkgYSBjb25zdHJhaW50LiAgKi8KKyAgSE9TVF9XSURFX0lOVCBtaW5fYWRkcmVzcyA9IGZpeC0+YWRkcmVzcyAtIGZpeC0+YmFja3dhcmRzOworICBNbm9kZSAqbXA7CisKKyAgLyogSWYgd2UgY2FuJ3QgcmVhY2ggdGhlIGN1cnJlbnQgcG9vbCBmcm9tIHRoaXMgaW5zbiwgb3IgaWYgd2UgY2FuJ3QgaW5zZXJ0CisgICAgIHRoaXMgZW50cnkgYXQgdGhlIGVuZCBvZiB0aGUgcG9vbCB3aXRob3V0IHB1c2hpbmcgb3RoZXIgZml4ZXMgb3V0IG9mCisgICAgIHJhbmdlLCB0aGVuIHdlIGRvbid0IHRyeS4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGNhbid0IGZhaWwgbGF0ZXIgb24uICAqLworICBpZiAobWluX2FkZHJlc3MgPj0gbWluaXBvb2xfYmFycmllci0+YWRkcmVzcworICAgICAgfHwgKG1pbmlwb29sX3ZlY3Rvcl90YWlsLT5taW5fYWRkcmVzcyArIGZpeC0+Zml4X3NpemUKKwkgID49IG1pbmlwb29sX2JhcnJpZXItPmFkZHJlc3MpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFNjYW4gdGhlIHBvb2wgdG8gc2VlIGlmIGEgY29uc3RhbnQgd2l0aCB0aGUgc2FtZSB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuCisgICAgIGFkZGVkLiAgV2hpbGUgd2UgYXJlIGRvaW5nIHRoaXMsIGFsc28gbm90ZSB0aGUgbG9jYXRpb24gd2hlcmUgd2UgbXVzdAorICAgICBpbnNlcnQgdGhlIGNvbnN0YW50IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gICovCisgIGZvciAobXAgPSBtaW5pcG9vbF92ZWN0b3JfdGFpbDsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+cHJldikKKyAgICB7CisgICAgICBpZiAoR0VUX0NPREUgKGZpeC0+dmFsdWUpID09IEdFVF9DT0RFIChtcC0+dmFsdWUpCisJICAmJiBmaXgtPm1vZGUgPT0gbXAtPm1vZGUKKwkgICYmIChHRVRfQ09ERSAoZml4LT52YWx1ZSkgIT0gQ09ERV9MQUJFTAorCSAgICAgIHx8IChDT0RFX0xBQkVMX05VTUJFUiAoZml4LT52YWx1ZSkKKwkJICA9PSBDT0RFX0xBQkVMX05VTUJFUiAobXAtPnZhbHVlKSkpCisJICAmJiBydHhfZXF1YWxfcCAoZml4LT52YWx1ZSwgbXAtPnZhbHVlKQorCSAgLyogQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc2xhY2sgdG8gbW92ZSB0aGlzIGVudHJ5IHRvIHRoZSBlbmQKKwkgICAgIG9mIHRoZSB0YWJsZSAodGhpcyBpcyBjb25zZXJ2YXRpdmUpLiAgKi8KKwkgICYmIChtcC0+bWF4X2FkZHJlc3MKKwkgICAgICA+IChtaW5pcG9vbF9iYXJyaWVyLT5hZGRyZXNzCisJCSArIG1pbmlwb29sX3ZlY3Rvcl90YWlsLT5vZmZzZXQKKwkJICsgbWluaXBvb2xfdmVjdG9yX3RhaWwtPmZpeF9zaXplKSkpCisJeworCSAgbXAtPnJlZmNvdW50Kys7CisJICByZXR1cm4gbW92ZV9taW5pcG9vbF9maXhfYmFja3dhcmRfcmVmIChtcCwgbWluX21wLCBtaW5fYWRkcmVzcyk7CisJfQorCisgICAgICBpZiAobWluX21wICE9IE5VTEwpCisJbXAtPm1pbl9hZGRyZXNzICs9IGZpeC0+Zml4X3NpemU7CisgICAgICBlbHNlCisJeworCSAgLyogTm90ZSB0aGUgaW5zZXJ0aW9uIHBvaW50IGlmIG5lY2Vzc2FyeS4gICovCisJICBpZiAobXAtPm1pbl9hZGRyZXNzIDwgbWluX2FkZHJlc3MpCisJICAgIHsKKwkgICAgICBtaW5fbXAgPSBtcDsKKwkgICAgfQorCSAgZWxzZSBpZiAobXAtPm1heF9hZGRyZXNzCisJCSAgIDwgbWluaXBvb2xfYmFycmllci0+YWRkcmVzcyArIG1wLT5vZmZzZXQgKyBmaXgtPmZpeF9zaXplKQorCSAgICB7CisJICAgICAgLyogSW5zZXJ0aW5nIGJlZm9yZSB0aGlzIGVudHJ5IHdvdWxkIHB1c2ggdGhlIGZpeCBiZXlvbmQgaXRzCisJICAgICAgICAgbWF4aW11bSBhZGRyZXNzICh3aGljaCBjYW4gaGFwcGVuIGlmIHdlIGhhdmUgcmUtbG9jYXRlZCBhCisJICAgICAgICAgZm9yd2FyZHMgZml4KTsgZm9yY2UgdGhlIG5ldyBmaXggdG8gY29tZSBhZnRlciBpdC4gICovCisJICAgICAgbWluX21wID0gbXA7CisJICAgICAgbWluX2FkZHJlc3MgPSBtcC0+bWluX2FkZHJlc3MgKyBmaXgtPmZpeF9zaXplOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeS4gICovCisgIG1wID0geG1hbGxvYyAoc2l6ZW9mICgqbXApKTsKKyAgbXAtPmZpeF9zaXplID0gZml4LT5maXhfc2l6ZTsKKyAgbXAtPm1vZGUgPSBmaXgtPm1vZGU7CisgIG1wLT52YWx1ZSA9IGZpeC0+dmFsdWU7CisgIG1wLT5yZWZjb3VudCA9IDE7CisgIG1wLT5tYXhfYWRkcmVzcyA9IG1pbmlwb29sX2JhcnJpZXItPmFkZHJlc3MgKyA2NTUzNjsKKworICBtcC0+bWluX2FkZHJlc3MgPSBtaW5fYWRkcmVzczsKKworICBpZiAobWluX21wID09IE5VTEwpCisgICAgeworICAgICAgbXAtPnByZXYgPSBOVUxMOworICAgICAgbXAtPm5leHQgPSBtaW5pcG9vbF92ZWN0b3JfaGVhZDsKKworICAgICAgaWYgKG1wLT5uZXh0ID09IE5VTEwpCisJeworCSAgbWluaXBvb2xfdmVjdG9yX3RhaWwgPSBtcDsKKwkgIG1pbmlwb29sX3ZlY3Rvcl9sYWJlbCA9IGdlbl9sYWJlbF9ydHggKCk7CisJfQorICAgICAgZWxzZQorCW1wLT5uZXh0LT5wcmV2ID0gbXA7CisKKyAgICAgIG1pbmlwb29sX3ZlY3Rvcl9oZWFkID0gbXA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXAtPm5leHQgPSBtaW5fbXAtPm5leHQ7CisgICAgICBtcC0+cHJldiA9IG1pbl9tcDsKKyAgICAgIG1pbl9tcC0+bmV4dCA9IG1wOworCisgICAgICBpZiAobXAtPm5leHQgIT0gTlVMTCkKKwltcC0+bmV4dC0+cHJldiA9IG1wOworICAgICAgZWxzZQorCW1pbmlwb29sX3ZlY3Rvcl90YWlsID0gbXA7CisgICAgfQorCisgIC8qIFNhdmUgdGhlIG5ldyBlbnRyeS4gICovCisgIG1pbl9tcCA9IG1wOworCisgIGlmIChtcC0+cHJldikKKyAgICBtcCA9IG1wLT5wcmV2OworICBlbHNlCisgICAgbXAtPm9mZnNldCA9IDA7CisKKyAgLyogU2NhbiBvdmVyIHRoZSBmb2xsb3dpbmcgZW50cmllcyBhbmQgYWRqdXN0IHRoZWlyIG9mZnNldHMuICAqLworICB3aGlsZSAobXAtPm5leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobXAtPm5leHQtPm1pbl9hZGRyZXNzIDwgbXAtPm1pbl9hZGRyZXNzICsgbXAtPmZpeF9zaXplKQorCW1wLT5uZXh0LT5taW5fYWRkcmVzcyA9IG1wLT5taW5fYWRkcmVzcyArIG1wLT5maXhfc2l6ZTsKKworICAgICAgaWYgKG1wLT5yZWZjb3VudCkKKwltcC0+bmV4dC0+b2Zmc2V0ID0gbXAtPm9mZnNldCArIG1wLT5maXhfc2l6ZTsKKyAgICAgIGVsc2UKKwltcC0+bmV4dC0+b2Zmc2V0ID0gbXAtPm9mZnNldDsKKworICAgICAgbXAgPSBtcC0+bmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIG1pbl9tcDsKK30KKworc3RhdGljIHZvaWQKK2Fzc2lnbl9taW5pcG9vbF9vZmZzZXRzIChNZml4ICogYmFycmllcikKK3sKKyAgSE9TVF9XSURFX0lOVCBvZmZzZXQgPSAwOworICBNbm9kZSAqbXA7CisKKyAgbWluaXBvb2xfYmFycmllciA9IGJhcnJpZXI7CisKKyAgZm9yIChtcCA9IG1pbmlwb29sX3ZlY3Rvcl9oZWFkOyBtcCAhPSBOVUxMOyBtcCA9IG1wLT5uZXh0KQorICAgIHsKKyAgICAgIG1wLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgIGlmIChtcC0+cmVmY291bnQgPiAwKQorCW9mZnNldCArPSBtcC0+Zml4X3NpemU7CisgICAgfQorfQorCisvKiBQcmludCBhIHN5bWJvbGljIGZvcm0gb2YgWCB0byB0aGUgZGVidWcgZmlsZSwgRi4gICovCitzdGF0aWMgdm9pZAorYXZyMzJfcHJpbnRfdmFsdWUgKEZJTEUgKiBmLCBydHggeCkKK3sKKyAgc3dpdGNoIChHRVRfQ09ERSAoeCkpCisgICAgeworICAgIGNhc2UgQ09OU1RfSU5UOgorICAgICAgZnByaW50ZiAoZiwgIjB4JXgiLCAoaW50KSBJTlRWQUwgKHgpKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgQ09OU1RfRE9VQkxFOgorICAgICAgZnByaW50ZiAoZiwgIjwweCVseCwweCVseD4iLCAobG9uZykgWFdJTlQgKHgsIDIpLCAobG9uZykgWFdJTlQgKHgsIDMpKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgQ09OU1RfVkVDVE9SOgorICAgICAgeworCWludCBpOworCisJZnByaW50ZiAoZiwgIjwiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQ09OU1RfVkVDVE9SX05VTklUUyAoeCk7IGkrKykKKwkgIHsKKwkgICAgZnByaW50ZiAoZiwgIjB4JXgiLCAoaW50KSBJTlRWQUwgKENPTlNUX1ZFQ1RPUl9FTFQgKHgsIGkpKSk7CisJICAgIGlmIChpIDwgKENPTlNUX1ZFQ1RPUl9OVU5JVFMgKHgpIC0gMSkpCisJICAgICAgZnB1dGMgKCcsJywgZik7CisJICB9CisJZnByaW50ZiAoZiwgIj4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgQ09OU1RfU1RSSU5HOgorICAgICAgZnByaW50ZiAoZiwgIlwiJXNcIiIsIFhTVFIgKHgsIDApKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgU1lNQk9MX1JFRjoKKyAgICAgIGZwcmludGYgKGYsICJgJXMnIiwgWFNUUiAoeCwgMCkpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBMQUJFTF9SRUY6CisgICAgICBmcHJpbnRmIChmLCAiTCVkIiwgSU5TTl9VSUQgKFhFWFAgKHgsIDApKSk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIENPTlNUOgorICAgICAgYXZyMzJfcHJpbnRfdmFsdWUgKGYsIFhFWFAgKHgsIDApKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgUExVUzoKKyAgICAgIGF2cjMyX3ByaW50X3ZhbHVlIChmLCBYRVhQICh4LCAwKSk7CisgICAgICBmcHJpbnRmIChmLCAiKyIpOworICAgICAgYXZyMzJfcHJpbnRfdmFsdWUgKGYsIFhFWFAgKHgsIDEpKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgUEM6CisgICAgICBmcHJpbnRmIChmLCAicGMiKTsKKyAgICAgIHJldHVybjsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChmLCAiPz8/PyIpOworICAgICAgcmV0dXJuOworICAgIH0KK30KKworaW50Citpc19taW5pcG9vbF9sYWJlbCAocnR4IGxhYmVsKQoreworICBtaW5pcG9vbF9sYWJlbHMgKmN1cl9tcF9sYWJlbCA9IGNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX2hlYWQ7CisKKyAgaWYgKEdFVF9DT0RFIChsYWJlbCkgIT0gQ09ERV9MQUJFTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgd2hpbGUgKGN1cl9tcF9sYWJlbCkKKyAgICB7CisgICAgICBpZiAoQ09ERV9MQUJFTF9OVU1CRVIgKGxhYmVsKQorCSAgPT0gQ09ERV9MQUJFTF9OVU1CRVIgKGN1cl9tcF9sYWJlbC0+bGFiZWwpKQorCXJldHVybiBUUlVFOworICAgICAgY3VyX21wX2xhYmVsID0gY3VyX21wX2xhYmVsLT5uZXh0OworICAgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorbmV3X21pbmlwb29sX2xhYmVsIChydHggbGFiZWwpCit7CisgIGlmICghY2Z1bi0+bWFjaGluZS0+bWluaXBvb2xfbGFiZWxfaGVhZCkKKyAgICB7CisgICAgICBjZnVuLT5tYWNoaW5lLT5taW5pcG9vbF9sYWJlbF9oZWFkID0KKwlnZ2NfYWxsb2MgKHNpemVvZiAobWluaXBvb2xfbGFiZWxzKSk7CisgICAgICBjZnVuLT5tYWNoaW5lLT5taW5pcG9vbF9sYWJlbF90YWlsID0gY2Z1bi0+bWFjaGluZS0+bWluaXBvb2xfbGFiZWxfaGVhZDsKKyAgICAgIGNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX2hlYWQtPmxhYmVsID0gbGFiZWw7CisgICAgICBjZnVuLT5tYWNoaW5lLT5taW5pcG9vbF9sYWJlbF9oZWFkLT5uZXh0ID0gMDsKKyAgICAgIGNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX2hlYWQtPnByZXYgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX3RhaWwtPm5leHQgPQorCWdnY19hbGxvYyAoc2l6ZW9mIChtaW5pcG9vbF9sYWJlbHMpKTsKKyAgICAgIGNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX3RhaWwtPm5leHQtPmxhYmVsID0gbGFiZWw7CisgICAgICBjZnVuLT5tYWNoaW5lLT5taW5pcG9vbF9sYWJlbF90YWlsLT5uZXh0LT5uZXh0ID0gMDsKKyAgICAgIGNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX3RhaWwtPm5leHQtPnByZXYgPQorCWNmdW4tPm1hY2hpbmUtPm1pbmlwb29sX2xhYmVsX3RhaWw7CisgICAgICBjZnVuLT5tYWNoaW5lLT5taW5pcG9vbF9sYWJlbF90YWlsID0KKwljZnVuLT5tYWNoaW5lLT5taW5pcG9vbF9sYWJlbF90YWlsLT5uZXh0OworICAgIH0KK30KKworLyogT3V0cHV0IHRoZSBsaXRlcmFsIHRhYmxlICovCitzdGF0aWMgdm9pZAorZHVtcF9taW5pcG9vbCAocnR4IHNjYW4pCit7CisgIE1ub2RlICptcDsKKyAgTW5vZGUgKm5tcDsKKworICBpZiAoZHVtcF9maWxlKQorICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkgICAgICI7OyBFbWl0dGluZyBtaW5pcG9vbCBhZnRlciBpbnNuICV1OyBhZGRyZXNzICVsZDsgYWxpZ24gJWQgKGJ5dGVzKVxuIiwKKwkgICAgIElOU05fVUlEIChzY2FuKSwgKHVuc2lnbmVkIGxvbmcpIG1pbmlwb29sX2JhcnJpZXItPmFkZHJlc3MsIDQpOworCisgIHNjYW4gPSBlbWl0X2luc25fYWZ0ZXIgKGdlbl9jb25zdHRhYmxlX3N0YXJ0ICgpLCBzY2FuKTsKKyAgc2NhbiA9IGVtaXRfaW5zbl9hZnRlciAoZ2VuX2FsaWduXzQgKCksIHNjYW4pOworICBzY2FuID0gZW1pdF9sYWJlbF9hZnRlciAobWluaXBvb2xfdmVjdG9yX2xhYmVsLCBzY2FuKTsKKyAgbmV3X21pbmlwb29sX2xhYmVsIChtaW5pcG9vbF92ZWN0b3JfbGFiZWwpOworCisgIGZvciAobXAgPSBtaW5pcG9vbF92ZWN0b3JfaGVhZDsgbXAgIT0gTlVMTDsgbXAgPSBubXApCisgICAgeworICAgICAgaWYgKG1wLT5yZWZjb3VudCA+IDApCisJeworCSAgaWYgKGR1bXBfZmlsZSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkJICAgICAgICI7OyAgT2Zmc2V0ICV1LCBtaW4gJWxkLCBtYXggJWxkICIsCisJCSAgICAgICAodW5zaWduZWQpIG1wLT5vZmZzZXQsICh1bnNpZ25lZCBsb25nKSBtcC0+bWluX2FkZHJlc3MsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgbXAtPm1heF9hZGRyZXNzKTsKKwkgICAgICBhdnIzMl9wcmludF92YWx1ZSAoZHVtcF9maWxlLCBtcC0+dmFsdWUpOworCSAgICAgIGZwdXRjICgnXG4nLCBkdW1wX2ZpbGUpOworCSAgICB9CisKKwkgIHN3aXRjaCAobXAtPmZpeF9zaXplKQorCSAgICB7CisjaWZkZWYgSEFWRV9jb25zdHRhYmxlXzQKKwkgICAgY2FzZSA0OgorCSAgICAgIHNjYW4gPSBlbWl0X2luc25fYWZ0ZXIgKGdlbl9jb25zdHRhYmxlXzQgKG1wLT52YWx1ZSksIHNjYW4pOworCSAgICAgIGJyZWFrOworCisjZW5kaWYKKyNpZmRlZiBIQVZFX2NvbnN0dGFibGVfOAorCSAgICBjYXNlIDg6CisJICAgICAgc2NhbiA9IGVtaXRfaW5zbl9hZnRlciAoZ2VuX2NvbnN0dGFibGVfOCAobXAtPnZhbHVlKSwgc2Nhbik7CisJICAgICAgYnJlYWs7CisKKyNlbmRpZgorI2lmZGVmIEhBVkVfY29uc3R0YWJsZV8xNgorICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgc2NhbiA9IGVtaXRfaW5zbl9hZnRlciAoZ2VuX2NvbnN0dGFibGVfMTYgKG1wLT52YWx1ZSksIHNjYW4pOworICAgICAgICAgICAgICBicmVhazsKKworI2VuZGlmCisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBmb3IgZm9yY2UtbWluaXBvb2wgZW50cmllcyB3aGljaCBqdXN0IGFyZQorCSAgICAgICAgIHRoZXJlIHRvIGZvcmNlIHRoZSBtaW5pcG9vbCB0byBiZSBnZW5lcmF0ZS4gKi8KKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgbm1wID0gbXAtPm5leHQ7CisgICAgICBmcmVlIChtcCk7CisgICAgfQorCisgIG1pbmlwb29sX3ZlY3Rvcl9oZWFkID0gbWluaXBvb2xfdmVjdG9yX3RhaWwgPSBOVUxMOworICBzY2FuID0gZW1pdF9pbnNuX2FmdGVyIChnZW5fY29uc3R0YWJsZV9lbmQgKCksIHNjYW4pOworICBzY2FuID0gZW1pdF9iYXJyaWVyX2FmdGVyIChzY2FuKTsKK30KKworLyogUmV0dXJuIHRoZSBjb3N0IG9mIGZvcmNpYmx5IGluc2VydGluZyBhIGJhcnJpZXIgYWZ0ZXIgSU5TTi4gICovCitzdGF0aWMgaW50CithdnIzMl9iYXJyaWVyX2Nvc3QgKHJ0eCBpbnNuKQoreworICAvKiBCYXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBwb29sIG9uIHRoZSBsb29wIGRlcHRoIGlzIHByZWZlcmFibGUsIGJ1dCBhdAorICAgICB0aGUgbW9tZW50LCB0aGUgYmFzaWMgYmxvY2sgaW5mb3JtYXRpb24gc2VlbXMgdG8gYmUgY29ycnVwdCBieSB0aGlzCisgICAgIHN0YWdlIG9mIHRoZSBjb21waWxhdGlvbi4gICovCisgIGludCBiYXNlX2Nvc3QgPSA1MDsKKyAgcnR4IG5leHQgPSBuZXh0X25vbm5vdGVfaW5zbiAoaW5zbik7CisKKyAgaWYgKG5leHQgIT0gTlVMTCAmJiBHRVRfQ09ERSAobmV4dCkgPT0gQ09ERV9MQUJFTCkKKyAgICBiYXNlX2Nvc3QgLT0gMjA7CisKKyAgc3dpdGNoIChHRVRfQ09ERSAoaW5zbikpCisgICAgeworICAgIGNhc2UgQ09ERV9MQUJFTDoKKyAgICAgIC8qIEl0IHdpbGwgYWx3YXlzIGJlIGJldHRlciB0byBwbGFjZSB0aGUgdGFibGUgYmVmb3JlIHRoZSBsYWJlbCwgcmF0aGVyCisgICAgICAgICB0aGFuIGFmdGVyIGl0LiAgKi8KKyAgICAgIHJldHVybiA1MDsKKworICAgIGNhc2UgSU5TTjoKKyAgICBjYXNlIENBTExfSU5TTjoKKyAgICAgIHJldHVybiBiYXNlX2Nvc3Q7CisKKyAgICBjYXNlIEpVTVBfSU5TTjoKKyAgICAgIHJldHVybiBiYXNlX2Nvc3QgLSAxMDsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYmFzZV9jb3N0ICsgMTA7CisgICAgfQorfQorCisvKiBGaW5kIHRoZSBiZXN0IHBsYWNlIGluIHRoZSBpbnNuIHN0cmVhbSBpbiB0aGUgcmFuZ2UKKyAgIChGSVgtPmFkZHJlc3MsTUFYX0FERFJFU1MpIHRvIGZvcmNpYmx5IGluc2VydCBhIG1pbmlwb29sIGJhcnJpZXIuCisgICBDcmVhdGUgdGhlIGJhcnJpZXIgYnkgaW5zZXJ0aW5nIGEganVtcCBhbmQgYWRkIGEgbmV3IGZpeCBlbnRyeSBmb3IKKyAgIGl0LiAgKi8KK3N0YXRpYyBNZml4ICoKK2NyZWF0ZV9maXhfYmFycmllciAoTWZpeCAqIGZpeCwgSE9TVF9XSURFX0lOVCBtYXhfYWRkcmVzcykKK3sKKyAgSE9TVF9XSURFX0lOVCBjb3VudCA9IDA7CisgIHJ0eCBiYXJyaWVyOworICBydHggZnJvbSA9IGZpeC0+aW5zbjsKKyAgcnR4IHNlbGVjdGVkID0gZnJvbTsKKyAgaW50IHNlbGVjdGVkX2Nvc3Q7CisgIEhPU1RfV0lERV9JTlQgc2VsZWN0ZWRfYWRkcmVzczsKKyAgTWZpeCAqbmV3X2ZpeDsKKyAgSE9TVF9XSURFX0lOVCBtYXhfY291bnQgPSBtYXhfYWRkcmVzcyAtIGZpeC0+YWRkcmVzczsKKyAgcnR4IGxhYmVsID0gZ2VuX2xhYmVsX3J0eCAoKTsKKworICBzZWxlY3RlZF9jb3N0ID0gYXZyMzJfYmFycmllcl9jb3N0IChmcm9tKTsKKyAgc2VsZWN0ZWRfYWRkcmVzcyA9IGZpeC0+YWRkcmVzczsKKworICB3aGlsZSAoZnJvbSAmJiBjb3VudCA8IG1heF9jb3VudCkKKyAgICB7CisgICAgICBydHggdG1wOworICAgICAgaW50IG5ld19jb3N0OworCisgICAgICAvKiBUaGlzIGNvZGUgc2hvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQgaWYgdGhlcmUgd2FzIGEgbmF0dXJhbCBiYXJyaWVyCisgICAgICAgICB3aXRoaW4gcmFuZ2UuICAqLworICAgICAgaWYgKEdFVF9DT0RFIChmcm9tKSA9PSBCQVJSSUVSKQorCWFib3J0ICgpOworCisgICAgICAvKiBDb3VudCB0aGUgbGVuZ3RoIG9mIHRoaXMgaW5zbi4gICovCisgICAgICBjb3VudCArPSBnZXRfYXR0cl9sZW5ndGggKGZyb20pOworCisgICAgICAvKiBJZiB0aGVyZSBpcyBhIGp1bXAgdGFibGUsIGFkZCBpdHMgbGVuZ3RoLiAgKi8KKyAgICAgIHRtcCA9IGlzX2p1bXBfdGFibGUgKGZyb20pOworICAgICAgaWYgKHRtcCAhPSBOVUxMKQorCXsKKwkgIGNvdW50ICs9IGdldF9qdW1wX3RhYmxlX3NpemUgKHRtcCk7CisKKwkgIC8qIEp1bXAgdGFibGVzIGFyZW4ndCBpbiBhIGJhc2ljIGJsb2NrLCBzbyBiYXNlIHRoZSBjb3N0IG9uIHRoZQorCSAgICAgZGlzcGF0Y2ggaW5zbi4gIElmIHdlIHNlbGVjdCB0aGlzIGxvY2F0aW9uLCB3ZSB3aWxsIHN0aWxsIHB1dAorCSAgICAgdGhlIHBvb2wgYWZ0ZXIgdGhlIHRhYmxlLiAgKi8KKwkgIG5ld19jb3N0ID0gYXZyMzJfYmFycmllcl9jb3N0IChmcm9tKTsKKworCSAgaWYgKGNvdW50IDwgbWF4X2NvdW50ICYmIG5ld19jb3N0IDw9IHNlbGVjdGVkX2Nvc3QpCisJICAgIHsKKwkgICAgICBzZWxlY3RlZCA9IHRtcDsKKwkgICAgICBzZWxlY3RlZF9jb3N0ID0gbmV3X2Nvc3Q7CisJICAgICAgc2VsZWN0ZWRfYWRkcmVzcyA9IGZpeC0+YWRkcmVzcyArIGNvdW50OworCSAgICB9CisKKwkgIC8qIENvbnRpbnVlIGFmdGVyIHRoZSBkaXNwYXRjaCB0YWJsZS4gICovCisJICBmcm9tID0gTkVYVF9JTlNOICh0bXApOworCSAgY29udGludWU7CisJfQorCisgICAgICBuZXdfY29zdCA9IGF2cjMyX2JhcnJpZXJfY29zdCAoZnJvbSk7CisKKyAgICAgIGlmIChjb3VudCA8IG1heF9jb3VudCAmJiBuZXdfY29zdCA8PSBzZWxlY3RlZF9jb3N0KQorCXsKKwkgIHNlbGVjdGVkID0gZnJvbTsKKwkgIHNlbGVjdGVkX2Nvc3QgPSBuZXdfY29zdDsKKwkgIHNlbGVjdGVkX2FkZHJlc3MgPSBmaXgtPmFkZHJlc3MgKyBjb3VudDsKKwl9CisKKyAgICAgIGZyb20gPSBORVhUX0lOU04gKGZyb20pOworICAgIH0KKworICAvKiBDcmVhdGUgYSBuZXcgSlVNUF9JTlNOIHRoYXQgYnJhbmNoZXMgYXJvdW5kIGEgYmFycmllci4gICovCisgIGZyb20gPSBlbWl0X2p1bXBfaW5zbl9hZnRlciAoZ2VuX2p1bXAgKGxhYmVsKSwgc2VsZWN0ZWQpOworICBKVU1QX0xBQkVMIChmcm9tKSA9IGxhYmVsOworICBiYXJyaWVyID0gZW1pdF9iYXJyaWVyX2FmdGVyIChmcm9tKTsKKyAgZW1pdF9sYWJlbF9hZnRlciAobGFiZWwsIGJhcnJpZXIpOworCisgIC8qIENyZWF0ZSBhIG1pbmlwb29sIGJhcnJpZXIgZW50cnkgZm9yIHRoZSBuZXcgYmFycmllci4gICovCisgIG5ld19maXggPSAoTWZpeCAqKSBvYnN0YWNrX2FsbG9jICgmbWluaXBvb2xfb2JzdGFjaywgc2l6ZW9mICgqbmV3X2ZpeCkpOworICBuZXdfZml4LT5pbnNuID0gYmFycmllcjsKKyAgbmV3X2ZpeC0+YWRkcmVzcyA9IHNlbGVjdGVkX2FkZHJlc3M7CisgIG5ld19maXgtPm5leHQgPSBmaXgtPm5leHQ7CisgIGZpeC0+bmV4dCA9IG5ld19maXg7CisKKyAgcmV0dXJuIG5ld19maXg7Cit9CisKKy8qIFJlY29yZCB0aGF0IHRoZXJlIGlzIGEgbmF0dXJhbCBiYXJyaWVyIGluIHRoZSBpbnNuIHN0cmVhbSBhdAorICAgQUREUkVTUy4gICovCitzdGF0aWMgdm9pZAorcHVzaF9taW5pcG9vbF9iYXJyaWVyIChydHggaW5zbiwgSE9TVF9XSURFX0lOVCBhZGRyZXNzKQoreworICBNZml4ICpmaXggPSAoTWZpeCAqKSBvYnN0YWNrX2FsbG9jICgmbWluaXBvb2xfb2JzdGFjaywgc2l6ZW9mICgqZml4KSk7CisKKyAgZml4LT5pbnNuID0gaW5zbjsKKyAgZml4LT5hZGRyZXNzID0gYWRkcmVzczsKKworICBmaXgtPm5leHQgPSBOVUxMOworICBpZiAobWluaXBvb2xfZml4X2hlYWQgIT0gTlVMTCkKKyAgICBtaW5pcG9vbF9maXhfdGFpbC0+bmV4dCA9IGZpeDsKKyAgZWxzZQorICAgIG1pbmlwb29sX2ZpeF9oZWFkID0gZml4OworCisgIG1pbmlwb29sX2ZpeF90YWlsID0gZml4OworfQorCisvKiBSZWNvcmQgSU5TTiwgd2hpY2ggd2lsbCBuZWVkIGZpeGluZyB1cCB0byBsb2FkIGEgdmFsdWUgZnJvbSB0aGUKKyAgIG1pbmlwb29sLiAgQUREUkVTUyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBpbnNuIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUKKyAgIGZ1bmN0aW9uOyBMT0MgaXMgYSBwb2ludGVyIHRvIHRoZSBwYXJ0IG9mIHRoZSBpbnNuIHdoaWNoIHJlcXVpcmVzCisgICBmaXhpbmc7IFZBTFVFIGlzIHRoZSBjb25zdGFudCB0aGF0IG11c3QgYmUgbG9hZGVkLCB3aGljaCBpcyBvZiB0eXBlCisgICBNT0RFLiAgKi8KK3N0YXRpYyB2b2lkCitwdXNoX21pbmlwb29sX2ZpeCAocnR4IGluc24sIEhPU1RfV0lERV9JTlQgYWRkcmVzcywgcnR4ICogbG9jLAorCQkgICBlbnVtIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggdmFsdWUpCit7CisgIE1maXggKmZpeCA9IChNZml4ICopIG9ic3RhY2tfYWxsb2MgKCZtaW5pcG9vbF9vYnN0YWNrLCBzaXplb2YgKCpmaXgpKTsKKyAgcnR4IGJvZHkgPSBQQVRURVJOIChpbnNuKTsKKworICBmaXgtPmluc24gPSBpbnNuOworICBmaXgtPmFkZHJlc3MgPSBhZGRyZXNzOworICBmaXgtPmxvYyA9IGxvYzsKKyAgZml4LT5tb2RlID0gbW9kZTsKKyAgZml4LT5maXhfc2l6ZSA9IE1JTklQT09MX0ZJWF9TSVpFIChtb2RlLCB2YWx1ZSk7CisgIGZpeC0+dmFsdWUgPSB2YWx1ZTsKKworICBpZiAoR0VUX0NPREUgKGJvZHkpID09IFBBUkFMTEVMKQorICAgIHsKKyAgICAgIC8qIE1jYWxsIDogS3MxNiA8PCAyICovCisgICAgICBmaXgtPmZvcndhcmRzID0gKCgxIDw8IDE1KSAtIDEpIDw8IDI7CisgICAgICBmaXgtPmJhY2t3YXJkcyA9ICgxIDw8IDE1KSA8PCAyOworICAgIH0KKyAgZWxzZSBpZiAoR0VUX0NPREUgKGJvZHkpID09IFNFVAorICAgICAgICAgICAmJiBHRVRfTU9ERV9TSVpFIChHRVRfTU9ERSAoU0VUX0RFU1QgKGJvZHkpKSkgPT0gNCkKKyAgICB7CisgICAgICAgIC8qIFdvcmQgTG9hZCAqLworICAgICAgaWYgKFRBUkdFVF9IQVJEX0ZMT0FUCisgICAgICAgICAgJiYgR0VUX01PREVfQ0xBU1MgKEdFVF9NT0RFIChTRVRfREVTVCAoYm9keSkpKSA9PSBNT0RFX0ZMT0FUKQorICAgICAgICB7CisgICAgICAgICAgLyogTGRjMC53IDogS3UxMiA8PCAyICovCisgICAgICAgICAgZml4LT5mb3J3YXJkcyA9ICgoMSA8PCAxMikgLSAxKSA8PCAyOworICAgICAgICAgIGZpeC0+YmFja3dhcmRzID0gMDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKG9wdGltaXplX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIExkZHBjIDogS3U3IDw8IDIgKi8KKyAgICAgICAgICAgICAgZml4LT5mb3J3YXJkcyA9ICgoMSA8PCA3KSAtIDEpIDw8IDI7CisgICAgICAgICAgICAgIGZpeC0+YmFja3dhcmRzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIExkLncgOiBLczE2ICovCisgICAgICAgICAgICAgIGZpeC0+Zm9yd2FyZHMgPSAoKDEgPDwgMTUpIC0gNCk7CisgICAgICAgICAgICAgIGZpeC0+YmFja3dhcmRzID0gKDEgPDwgMTUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChHRVRfQ09ERSAoYm9keSkgPT0gU0VUCisgICAgICAgICAgICYmIEdFVF9NT0RFX1NJWkUgKEdFVF9NT0RFIChTRVRfREVTVCAoYm9keSkpKSA9PSA4KQorICAgIHsKKyAgICAgIC8qIERvdWJsZSB3b3JkIGxvYWQgKi8KKyAgICAgIGlmIChUQVJHRVRfSEFSRF9GTE9BVAorICAgICAgICAgICYmIEdFVF9NT0RFX0NMQVNTIChHRVRfTU9ERSAoU0VUX0RFU1QgKGJvZHkpKSkgPT0gTU9ERV9GTE9BVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIExkYzAuZCA6IEt1MTIgPDwgMiAqLworICAgICAgICAgIGZpeC0+Zm9yd2FyZHMgPSAoKDEgPDwgMTIpIC0gMSkgPDwgMjsKKyAgICAgICAgICBmaXgtPmJhY2t3YXJkcyA9IDA7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIExkLmQgOiBLczE2ICovCisgICAgICAgICAgZml4LT5mb3J3YXJkcyA9ICgoMSA8PCAxNSkgLSA0KTsKKyAgICAgICAgICBmaXgtPmJhY2t3YXJkcyA9ICgxIDw8IDE1KTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoR0VUX0NPREUgKGJvZHkpID09IFVOU1BFQ19WT0xBVElMRQorICAgICAgICAgICAmJiBYSU5UIChib2R5LCAxKSA9PSBWVU5TUEVDX01WUkMpCisgICAgeworICAgICAgLyogQ29wcm9jZXNzb3IgbG9hZCAqLworICAgICAgLyogTGRjIDogS3U4IDw8IDIgKi8KKyAgICAgIGZpeC0+Zm9yd2FyZHMgPSAoKDEgPDwgOCkgLSAxKSA8PCAyOworICAgICAgZml4LT5iYWNrd2FyZHMgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFzc3VtZSB3b3JzdCBjYXNlIHdoaWNoIGlzIGxkZHBjIGluc24uICovCisgICAgICBmaXgtPmZvcndhcmRzID0gKCgxIDw8IDcpIC0gMSkgPDwgMjsKKyAgICAgIGZpeC0+YmFja3dhcmRzID0gMDsKKyAgICB9CisKKyAgZml4LT5taW5pcG9vbCA9IE5VTEw7CisKKyAgLyogSWYgYW4gaW5zbiBkb2Vzbid0IGhhdmUgYSByYW5nZSBkZWZpbmVkIGZvciBpdCwgdGhlbiBpdCBpc24ndCBleHBlY3RpbmcKKyAgICAgdG8gYmUgcmV3b3JrZWQgYnkgdGhpcyBjb2RlLiAgQmV0dGVyIHRvIGFib3J0IG5vdyB0aGFuIHRvIGdlbmVyYXRlIGR1ZmYKKyAgICAgYXNzZW1ibHkgY29kZS4gICovCisgIGlmIChmaXgtPmZvcndhcmRzID09IDAgJiYgZml4LT5iYWNrd2FyZHMgPT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoZHVtcF9maWxlKQorICAgIHsKKyAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkgICAgICAgIjs7ICVzbW9kZSBmaXh1cCBmb3IgaSVkOyBhZGRyICVsdSwgcmFuZ2UgKCVsZCwlbGQpOiAiLAorCSAgICAgICBHRVRfTU9ERV9OQU1FIChtb2RlKSwKKwkgICAgICAgSU5TTl9VSUQgKGluc24pLCAodW5zaWduZWQgbG9uZykgYWRkcmVzcywKKwkgICAgICAgLTEgKiAobG9uZykgZml4LT5iYWNrd2FyZHMsIChsb25nKSBmaXgtPmZvcndhcmRzKTsKKyAgICAgIGF2cjMyX3ByaW50X3ZhbHVlIChkdW1wX2ZpbGUsIGZpeC0+dmFsdWUpOworICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKKyAgICB9CisKKyAgLyogQWRkIGl0IHRvIHRoZSBjaGFpbiBvZiBmaXhlcy4gICovCisgIGZpeC0+bmV4dCA9IE5VTEw7CisKKyAgaWYgKG1pbmlwb29sX2ZpeF9oZWFkICE9IE5VTEwpCisgICAgbWluaXBvb2xfZml4X3RhaWwtPm5leHQgPSBmaXg7CisgIGVsc2UKKyAgICBtaW5pcG9vbF9maXhfaGVhZCA9IGZpeDsKKworICBtaW5pcG9vbF9maXhfdGFpbCA9IGZpeDsKK30KKworLyogU2NhbiBJTlNOIGFuZCBub3RlIGFueSBvZiBpdHMgb3BlcmFuZHMgdGhhdCBuZWVkIGZpeGluZy4KKyAgIElmIERPX1BVU0hFUyBpcyBmYWxzZSB3ZSBkbyBub3QgYWN0dWFsbHkgcHVzaCBhbnkgb2YgdGhlIGZpeHVwcworICAgbmVlZGVkLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpcyBhbnkgZml4dXBzIHdlcmUgbmVlZGVkL3B1c2hlZC4KKyAgIFRoaXMgaXMgdXNlZCBieSBhdnIzMl9tZW1vcnlfbG9hZF9wKCkgd2hpY2ggbmVlZHMgdG8ga25vdyBhYm91dCBsb2FkcworICAgb2YgY29uc3RhbnRzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBtaW5pcG9vbCBsb2Fkcy4gICovCitzdGF0aWMgYm9vbAorbm90ZV9pbnZhbGlkX2NvbnN0YW50cyAocnR4IGluc24sIEhPU1RfV0lERV9JTlQgYWRkcmVzcywgaW50IGRvX3B1c2hlcykKK3sKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgaW50IG9wbm87CisKKyAgZXh0cmFjdF9pbnNuIChpbnNuKTsKKworICBpZiAoIWNvbnN0cmFpbl9vcGVyYW5kcyAoMSkpCisgICAgZmF0YWxfaW5zbl9ub3RfZm91bmQgKGluc24pOworCisgIGlmIChyZWNvZ19kYXRhLm5fYWx0ZXJuYXRpdmVzID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZpbGwgaW4gcmVjb2dfb3BfYWx0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnN0cmFpbnRzIG9mIHRoaXMKKyAgICAgaW5zbi4gICovCisgIHByZXByb2Nlc3NfY29uc3RyYWludHMgKCk7CisKKyAgZm9yIChvcG5vID0gMDsgb3BubyA8IHJlY29nX2RhdGEubl9vcGVyYW5kczsgb3BubysrKQorICAgIHsKKyAgICAgIHJ0eCBvcDsKKworICAgICAgLyogVGhpbmdzIHdlIG5lZWQgdG8gZml4IGNhbiBvbmx5IG9jY3VyIGluIGlucHV0cy4gICovCisgICAgICBpZiAocmVjb2dfZGF0YS5vcGVyYW5kX3R5cGVbb3Bub10gIT0gT1BfSU4pCisJY29udGludWU7CisKKyAgICAgIG9wID0gcmVjb2dfZGF0YS5vcGVyYW5kW29wbm9dOworCisgICAgICBpZiAoYXZyMzJfY29uc3RfcG9vbF9yZWZfb3BlcmFuZCAob3AsIEdFVF9NT0RFIChvcCkpKQorCXsKKwkgIGlmIChkb19wdXNoZXMpCisJICAgIHsKKwkgICAgICBydHggY29wID0gYXZvaWRfY29uc3RhbnRfcG9vbF9yZWZlcmVuY2UgKG9wKTsKKworCSAgICAgIC8qIENhc3RpbmcgdGhlIGFkZHJlc3Mgb2Ygc29tZXRoaW5nIHRvIGEgbW9kZSBuYXJyb3dlciB0aGFuIGEKKwkgICAgICAgICB3b3JkIGNhbiBjYXVzZSBhdm9pZF9jb25zdGFudF9wb29sX3JlZmVyZW5jZSgpIHRvIHJldHVybiB0aGUKKwkgICAgICAgICBwb29sIHJlZmVyZW5jZSBpdHNlbGYuICBUaGF0J3Mgbm8gZ29vZCB0byB1cyBoZXJlLiAgTGV0cworCSAgICAgICAgIGp1c3QgaG9wZSB0aGF0IHdlIGNhbiB1c2UgdGhlIGNvbnN0YW50IHBvb2wgdmFsdWUgZGlyZWN0bHkuCisJICAgICAgICovCisJICAgICAgaWYgKG9wID09IGNvcCkKKwkJY29wID0gZ2V0X3Bvb2xfY29uc3RhbnQgKFhFWFAgKG9wLCAwKSk7CisKKwkgICAgICBwdXNoX21pbmlwb29sX2ZpeCAoaW5zbiwgYWRkcmVzcywKKwkJCQkgcmVjb2dfZGF0YS5vcGVyYW5kX2xvY1tvcG5vXSwKKwkJCQkgcmVjb2dfZGF0YS5vcGVyYW5kX21vZGVbb3Bub10sIGNvcCk7CisJICAgIH0KKworCSAgcmVzdWx0ID0gdHJ1ZTsKKwl9CisgICAgICBlbHNlIGlmIChUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MKKwkgICAgICAgJiYgYXZyMzJfYWRkcmVzc19vcGVyYW5kIChvcCwgR0VUX01PREUgKG9wKSkpCisJeworCSAgLyogSGFuZGxlIHBzZXVkbyBpbnN0cnVjdGlvbnMgdXNpbmcgYSBkaXJlY3QgYWRkcmVzcy4gVGhlc2UgcHNldWRvCisJICAgICBpbnN0cnVjdGlvbnMgbWlnaHQgbmVlZCBlbnRyaWVzIGluIHRoZSBjb25zdGFudCBwb29sIGFuZCB3ZSBtdXN0CisJICAgICB0aGVyZWZvciBjcmVhdGUgYSBjb25zdGFudCBwb29sIGZvciB0aGVtLCBpbiBjYXNlIHRoZQorCSAgICAgYXNzZW1ibGVyL2xpbmtlciBuZWVkcyB0byBpbnNlcnQgZW50cmllcy4gKi8KKwkgIGlmIChkb19wdXNoZXMpCisJICAgIHsKKwkgICAgICAvKiBQdXNoIGEgZHVtbXkgY29uc3RhbnQgcG9vbCBlbnRyeSBzbyB0aGF0IHRoZSAuY3Bvb2wKKwkgICAgICAgICBkaXJlY3RpdmUgc2hvdWxkIGJlIGluc2VydGVkIG9uIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUKKwkgICAgICAgICBjb2RlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHJlYWwgY29uc3RhbnQgcG9vbCBlbnRyaWVzLiBUaGlzCisJICAgICAgICAgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIgdG8ga25vdyB3aGVyZSB0byBwdXQKKwkgICAgICAgICBnZW5lcmF0ZWQgY29uc3RhbnQgcG9vbCBlbnRyaWVzLiAqLworCSAgICAgIHB1c2hfbWluaXBvb2xfZml4IChpbnNuLCBhZGRyZXNzLAorCQkJCSByZWNvZ19kYXRhLm9wZXJhbmRfbG9jW29wbm9dLAorCQkJCSByZWNvZ19kYXRhLm9wZXJhbmRfbW9kZVtvcG5vXSwKKwkJCQkgZ2VuX3J0eF9VTlNQRUMgKFZPSURtb2RlLAorCQkJCQkJIGdlbl9ydHZlYyAoMSwgY29uc3QwX3J0eCksCisJCQkJCQkgVU5TUEVDX0ZPUkNFX01JTklQT09MKSk7CisJICAgICAgcmVzdWx0ID0gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludAorYXZyMzJfaW5zbl9pc19jYXN0IChydHggaW5zbikKK3sKKworICBpZiAoTk9OSlVNUF9JTlNOX1AgKGluc24pCisgICAgICAmJiBHRVRfQ09ERSAoUEFUVEVSTiAoaW5zbikpID09IFNFVAorICAgICAgJiYgKEdFVF9DT0RFIChTRVRfU1JDIChQQVRURVJOIChpbnNuKSkpID09IFpFUk9fRVhURU5ECisJICB8fCBHRVRfQ09ERSAoU0VUX1NSQyAoUEFUVEVSTiAoaW5zbikpKSA9PSBTSUdOX0VYVEVORCkKKyAgICAgICYmIFJFR19QIChYRVhQIChTRVRfU1JDIChQQVRURVJOIChpbnNuKSksIDApKQorICAgICAgJiYgUkVHX1AgKFNFVF9ERVNUIChQQVRURVJOIChpbnNuKSkpKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgUmVwbGFjZSBhbGwgb2NjdXJhbmNlcyBvZiByZWcgRlJPTSB3aXRoIHJlZyBUTyBpbiBYICovCisKK3J0eAorYXZyMzJfcmVwbGFjZV9yZWcgKHJ0eCB4LCBydHggZnJvbSwgcnR4IHRvKQoreworICBpbnQgaSwgajsKKyAgY29uc3QgY2hhciAqZm10OworCisgIGdjY19hc3NlcnQgKCBSRUdfUCAoZnJvbSkgJiYgUkVHX1AgKHRvKSApOworCisgIC8qIEFsbG93IHRoaXMgZnVuY3Rpb24gdG8gbWFrZSByZXBsYWNlbWVudHMgaW4gRVhQUl9MSVNUcy4gICovCisgIGlmICh4ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHJ0eF9lcXVhbF9wICh4LCBmcm9tKSkKKyAgICByZXR1cm4gdG87CisKKyAgaWYgKEdFVF9DT0RFICh4KSA9PSBTVUJSRUcpCisgICAgeworICAgICAgcnR4IG5ldyA9IGF2cjMyX3JlcGxhY2VfcmVnIChTVUJSRUdfUkVHICh4KSwgZnJvbSwgdG8pOworCisgICAgICBpZiAoR0VUX0NPREUgKG5ldykgPT0gQ09OU1RfSU5UKQorCXsKKwkgIHggPSBzaW1wbGlmeV9zdWJyZWcgKEdFVF9NT0RFICh4KSwgbmV3LAorCQkJICAgICAgIEdFVF9NT0RFIChTVUJSRUdfUkVHICh4KSksCisJCQkgICAgICAgU1VCUkVHX0JZVEUgKHgpKTsKKwkgIGdjY19hc3NlcnQgKHgpOworCX0KKyAgICAgIGVsc2UKKwlTVUJSRUdfUkVHICh4KSA9IG5ldzsKKworICAgICAgcmV0dXJuIHg7CisgICAgfQorICBlbHNlIGlmIChHRVRfQ09ERSAoeCkgPT0gWkVST19FWFRFTkQpCisgICAgeworICAgICAgcnR4IG5ldyA9IGF2cjMyX3JlcGxhY2VfcmVnIChYRVhQICh4LCAwKSwgZnJvbSwgdG8pOworCisgICAgICBpZiAoR0VUX0NPREUgKG5ldykgPT0gQ09OU1RfSU5UKQorCXsKKwkgIHggPSBzaW1wbGlmeV91bmFyeV9vcGVyYXRpb24gKFpFUk9fRVhURU5ELCBHRVRfTU9ERSAoeCksCisJCQkJCW5ldywgR0VUX01PREUgKFhFWFAgKHgsIDApKSk7CisJICBnY2NfYXNzZXJ0ICh4KTsKKwl9CisgICAgICBlbHNlCisJWEVYUCAoeCwgMCkgPSBuZXc7CisKKyAgICAgIHJldHVybiB4OworICAgIH0KKworICBmbXQgPSBHRVRfUlRYX0ZPUk1BVCAoR0VUX0NPREUgKHgpKTsKKyAgZm9yIChpID0gR0VUX1JUWF9MRU5HVEggKEdFVF9DT0RFICh4KSkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBpZiAoZm10W2ldID09ICdlJykKKwlYRVhQICh4LCBpKSA9IGF2cjMyX3JlcGxhY2VfcmVnIChYRVhQICh4LCBpKSwgZnJvbSwgdG8pOworICAgICAgZWxzZSBpZiAoZm10W2ldID09ICdFJykKKwlmb3IgKGogPSBYVkVDTEVOICh4LCBpKSAtIDE7IGogPj0gMDsgai0tKQorCSAgWFZFQ0VYUCAoeCwgaSwgaikgPSBhdnIzMl9yZXBsYWNlX3JlZyAoWFZFQ0VYUCAoeCwgaSwgaiksIGZyb20sIHRvKTsKKyAgICB9CisKKyAgcmV0dXJuIHg7Cit9CisKKworLyogRklYTUU6IFRoZSBsZXZlbCBvZiBuZXN0aW5nIGluIHRoaXMgZnVuY3Rpb24gaXMgd2F5IHRvbyBkZWVwLiBJdCBuZWVkcyB0byBiZQorICAgdG9ybiBhcGFydC4gICovCitzdGF0aWMgdm9pZAorYXZyMzJfcmVvcmdfb3B0aW1pemF0aW9uICh2b2lkKQoreworICBydHggZmlyc3QgPSBnZXRfZmlyc3Rfbm9ubm90ZV9pbnNuICgpOworICBydHggaW5zbjsKKworICBpZiAoVEFSR0VUX01EX1JFT1JHX09QVElNSVpBVElPTiAmJiAob3B0aW1pemVfc2l6ZSB8fCAob3B0aW1pemUgPiAwKSkpCisgICAgeworCisgICAgICAvKiBTY2FuIHRocm91Z2ggYWxsIGluc25zIGxvb2tpbmcgZm9yIGNhc3Qgb3BlcmF0aW9ucy4gKi8KKyAgICAgIGlmIChkdW1wX2ZpbGUpCisJeworCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiOzsgRGVsZXRpbmcgcmVkdW5kYW50IGNhc3Qgb3BlcmF0aW9uczpcbiIpOworCX0KKyAgICAgIGZvciAoaW5zbiA9IGZpcnN0OyBpbnNuOyBpbnNuID0gTkVYVF9JTlNOIChpbnNuKSkKKwl7CisJICBydHggcmVnLCBzcmNfcmVnLCBzY2FuOworCSAgZW51bSBtYWNoaW5lX21vZGUgbW9kZTsKKwkgIGludCB1bnVzZWRfY2FzdDsKKwkgIHJ0eCBsYWJlbF9yZWY7CisKKwkgIGlmIChhdnIzMl9pbnNuX2lzX2Nhc3QgKGluc24pCisJICAgICAgJiYgKEdFVF9NT0RFIChYRVhQIChTRVRfU1JDIChQQVRURVJOIChpbnNuKSksIDApKSA9PSBRSW1vZGUKKwkJICB8fCBHRVRfTU9ERSAoWEVYUCAoU0VUX1NSQyAoUEFUVEVSTiAoaW5zbikpLCAwKSkgPT0gSEltb2RlKSkKKwkgICAgeworCSAgICAgIG1vZGUgPSBHRVRfTU9ERSAoWEVYUCAoU0VUX1NSQyAoUEFUVEVSTiAoaW5zbikpLCAwKSk7CisJICAgICAgcmVnID0gU0VUX0RFU1QgKFBBVFRFUk4gKGluc24pKTsKKwkgICAgICBzcmNfcmVnID0gWEVYUCAoU0VUX1NSQyAoUEFUVEVSTiAoaW5zbikpLCAwKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgdW51c2VkX2Nhc3QgPSBmYWxzZTsKKwkgIGxhYmVsX3JlZiA9IE5VTExfUlRYOworCSAgZm9yIChzY2FuID0gTkVYVF9JTlNOIChpbnNuKTsgc2Nhbjsgc2NhbiA9IE5FWFRfSU5TTiAoc2NhbikpCisJICAgIHsKKwkgICAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGRlc3RpbmF0aW9uIG9mIGEgc2ltcGxlCisJICAgICAgICAgY29uZGl0aW9uYWwganVtcCB3aGljaCB3ZSBoYXZlIGFscmVhZHkgc2Nhbm5lZCBwYXN0LiBJZiBzbywKKwkgICAgICAgICB3ZSBjYW4gc2FmZWx5IGNvbnRpbnVlIHNjYW5uaW5nLiAqLworCSAgICAgIGlmIChMQUJFTF9QIChzY2FuKSAmJiBsYWJlbF9yZWYgIT0gTlVMTF9SVFgpCisJCXsKKwkJICBpZiAoQ09ERV9MQUJFTF9OVU1CRVIgKHNjYW4pID09CisJCSAgICAgIENPREVfTEFCRUxfTlVNQkVSIChYRVhQIChsYWJlbF9yZWYsIDApKSkKKwkJICAgIGxhYmVsX3JlZiA9IE5VTExfUlRYOworCQkgIGVsc2UKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgICBpZiAoIUlOU05fUCAoc2NhbikpCisJCWNvbnRpbnVlOworCisJICAgICAgLyogRm9yIGNvbmRpdGlvbmFsIGp1bXBzIHdlIGNhbiBtYW5hZ2UgdG8ga2VlcCBvbiBzY2FubmluZyBpZgorCSAgICAgICAgIHdlIG1lZXQgdGhlIGRlc3RpbmF0aW9uIGxhYmVsIGxhdGVyIG9uIGJlZm9yZSBhbnkgbmV3IGp1bXAKKwkgICAgICAgICBpbnNucyBvY2N1cmUuICovCisJICAgICAgaWYgKEdFVF9DT0RFIChzY2FuKSA9PSBKVU1QX0lOU04pCisJCXsKKwkJICBpZiAoYW55X2NvbmRqdW1wX3AgKHNjYW4pICYmIGxhYmVsX3JlZiA9PSBOVUxMX1JUWCkKKwkJICAgIGxhYmVsX3JlZiA9IGNvbmRqdW1wX2xhYmVsIChzY2FuKTsKKwkJICBlbHNlCisJCSAgICBicmVhazsKKwkJfQorCisgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjYWxsIGFuZCB0aGUgcmVnaXN0ZXIgaXMgdXNlZCBhcyBhbiBhcmd1bWVudC4gKi8KKyAgICAgICAgICAgICAgaWYgKENBTExfUCAoc2NhbikKKyAgICAgICAgICAgICAgICAgICYmIGZpbmRfcmVnX2Z1c2FnZSAoc2NhbiwgVVNFLCByZWcpICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworCSAgICAgIGlmICghcmVnX21lbnRpb25lZF9wIChyZWcsIFBBVFRFUk4gKHNjYW4pKSkKKwkJY29udGludWU7CisKKwkgICAgICAvKiBDaGVjayBpZiBjYXN0ZWQgcmVnaXN0ZXIgaXMgdXNlZCBpbiB0aGlzIGluc24gKi8KKwkgICAgICBpZiAoKHJlZ25vX3VzZV9pbiAoUkVHTk8gKHJlZyksIFBBVFRFUk4gKHNjYW4pKSAhPSBOVUxMX1JUWCkKKwkJICAmJiAoR0VUX01PREUgKHJlZ25vX3VzZV9pbiAoUkVHTk8gKHJlZyksIFBBVFRFUk4gKHNjYW4pKSkgPT0KKwkJICAgICAgR0VUX01PREUgKHJlZykpKQorCQl7CisJCSAgLyogSWYgbm90IHVzZWQgaW4gdGhlIHNvdXJjZSB0byB0aGUgc2V0IG9yIGluIGEgbWVtb3J5CisJCSAgICAgZXhwcmVzc2lvbiBpbiB0aGUgZGVzdGlhbnRpb24gdGhlbiB0aGUgcmVnaXN0ZXIgaXMgdXNlZAorCQkgICAgIGFzIGEgZGVzdGluYXRpb24gYW5kIGlzIHJlYWxseSBkZWFkLiAqLworCQkgIGlmIChzaW5nbGVfc2V0IChzY2FuKQorCQkgICAgICAmJiBHRVRfQ09ERSAoUEFUVEVSTiAoc2NhbikpID09IFNFVAorCQkgICAgICAmJiBSRUdfUCAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSkKKwkJICAgICAgJiYgIXJlZ25vX3VzZV9pbiAoUkVHTk8gKHJlZyksIFNFVF9TUkMgKFBBVFRFUk4gKHNjYW4pKSkKKwkJICAgICAgJiYgbGFiZWxfcmVmID09IE5VTExfUlRYKQorCQkgICAgeworCQkgICAgICB1bnVzZWRfY2FzdCA9IHRydWU7CisJCSAgICB9CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIENoZWNrIGlmIHJlZ2lzdGVyIGlzIGRlYWQgb3Igc2V0IGluIHRoaXMgaW5zbiAqLworCSAgICAgIGlmIChkZWFkX29yX3NldF9wIChzY2FuLCByZWcpKQorCQl7CisJCSAgdW51c2VkX2Nhc3QgPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB1bnJlc29sdmVkIGNvbmRpdGlvbmFsIGp1bXBzICovCisJICBpZiAobGFiZWxfcmVmICE9IE5VTExfUlRYKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKHVudXNlZF9jYXN0KQorCSAgICB7CisJICAgICAgaWYgKFJFR05PIChyZWcpID09IFJFR05PIChYRVhQIChTRVRfU1JDIChQQVRURVJOIChpbnNuKSksIDApKSkKKwkJeworCQkgIC8qIE9uZSBvcGVyYW5kIGNhc3QsIHNhZmUgdG8gZGVsZXRlICovCisJCSAgaWYgKGR1bXBfZmlsZSkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZiAoZHVtcF9maWxlLAorCQkJICAgICAgICI7OyAgSU5TTiAlaSByZW1vdmVkLCBjYXN0ZWQgcmVnaXN0ZXIgJWkgdmFsdWUgbm90IHVzZWQuXG4iLAorCQkJICAgICAgIElOU05fVUlEIChpbnNuKSwgUkVHTk8gKHJlZykpOworCQkgICAgfQorCQkgIFNFVF9JTlNOX0RFTEVURUQgKGluc24pOworCQkgIC8qIEZvcmNlIHRoZSBpbnN0cnVjdGlvbiB0byBiZSByZWNvZ25pemVkIGFnYWluICovCisJCSAgSU5TTl9DT0RFIChpbnNuKSA9IC0xOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogVHdvIG9wZXJhbmQgY2FzdCwgd2hpY2ggcmVhbGx5IGNvdWxkIGJlIHN1YnN0aXR1dGVkIHdpdGgKKwkJICAgICBhIG1vdmUsIGlmIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgZGVhZCBhZnRlciB0aGUgY2FzdAorCQkgICAgIGluc24gYW5kIHRoZW4gdGhlIGluc24gd2hpY2ggc2V0cyB0aGUgc291cmNlIHJlZ2lzdGVyCisJCSAgICAgY291bGQgaW5zdGVhZCBkaXJlY3RseSBzZXQgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZvcgorCQkgICAgIHRoZSBjYXN0LiBBcyBsb25nIGFzIHRoZXJlIGFyZSBubyBpbnNucyBpbiBiZXR3ZWVuIHdoaWNoCisJCSAgICAgdXNlcyB0aGUgcmVnaXN0ZXIuICovCisJCSAgcnR4IGxpbmsgPSBOVUxMX1JUWDsKKwkJICBydHggc2V0OworCQkgIHJ0eCBzcmNfcmVnID0gWEVYUCAoU0VUX1NSQyAoUEFUVEVSTiAoaW5zbikpLCAwKTsKKwkJICB1bnVzZWRfY2FzdCA9IGZhbHNlOworCisJCSAgaWYgKCFmaW5kX3JlZ19ub3RlIChpbnNuLCBSRUdfREVBRCwgc3JjX3JlZykpCisJCSAgICBjb250aW51ZTsKKworCQkgIC8qIFNlYXJjaCBmb3IgdGhlIGluc24gd2hpY2ggc2V0cyB0aGUgc291cmNlIHJlZ2lzdGVyICovCisJCSAgZm9yIChsaW5rID0gTE9HX0xJTktTIChpbnNuKTsgbGluazsgbGluayA9IFhFWFAgKGxpbmssIDEpKQorCQkgICAgeworCQkgICAgICBpZiAoUkVHX05PVEVfS0lORCAobGluaykgIT0gMCkKKwkJCWNvbnRpbnVlOworCQkgICAgICBzZXQgPSBzaW5nbGVfc2V0IChYRVhQIChsaW5rLCAwKSk7CisJCSAgICAgIGlmIChzZXQgJiYgcnR4X2VxdWFsX3AgKHNyY19yZWcsIFNFVF9ERVNUIChzZXQpKSkKKwkJCXsKKwkJCSAgbGluayA9IFhFWFAgKGxpbmssIDApOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKworCQkgIC8qIEZvdW5kIG5vIGxpbmsgb3IgbGluayBpcyBhIGNhbGwgaW5zbiB3aGVyZSB3ZSBjYW4gbm90CisJCSAgICAgY2hhbmdlIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciAqLworCQkgIGlmIChsaW5rID09IE5VTExfUlRYIHx8IENBTExfUCAobGluaykpCisJCSAgICBjb250aW51ZTsKKworCQkgIC8qIFNjYW4gdGhyb3VnaCBhbGwgaW5zbiBiZXR3ZWVuIGxpbmsgYW5kIGluc24gKi8KKwkJICBmb3IgKHNjYW4gPSBORVhUX0lOU04gKGxpbmspOyBzY2FuOyBzY2FuID0gTkVYVF9JTlNOIChzY2FuKSkKKwkJICAgIHsKKwkJICAgICAgLyogRG9uJ3QgdHJ5IHRvIHRyYWNlIGZvcndhcmQgcGFzdCBhIENPREVfTEFCRUwgaWYgd2UKKwkJICAgICAgICAgaGF2ZW4ndCBzZWVuIElOU04geWV0LiAgT3JkaW5hcmlseSwgd2Ugd2lsbCBvbmx5CisJCSAgICAgICAgIGZpbmQgdGhlIHNldHRpbmcgaW5zbiBpbiBMT0dfTElOS1MgaWYgaXQgaXMgaW4gdGhlCisJCSAgICAgICAgIHNhbWUgYmFzaWMgYmxvY2suICBIb3dldmVyLCBjcm9zcy1qdW1waW5nIGNhbiBpbnNlcnQKKwkJICAgICAgICAgY29kZSBsYWJlbHMgaW4gYmV0d2VlbiB0aGUgbG9hZCBhbmQgdGhlIGNhbGwsIGFuZAorCQkgICAgICAgICBjYW4gcmVzdWx0IGluIHNpdHVhdGlvbnMgd2hlcmUgYSBzaW5nbGUgY2FsbCBpbnNuCisJCSAgICAgICAgIG1heSBoYXZlIHR3byB0YXJnZXRzIGRlcGVuZGluZyBvbiB3aGVyZSB3ZSBjYW1lCisJCSAgICAgICAgIGZyb20uICAqLworCisJCSAgICAgIGlmIChHRVRfQ09ERSAoc2NhbikgPT0gQ09ERV9MQUJFTCkKKwkJCWJyZWFrOworCisJCSAgICAgIGlmICghSU5TTl9QIChzY2FuKSkKKwkJCWNvbnRpbnVlOworCisJCSAgICAgIC8qIERvbid0IHRyeSB0byB0cmFjZSBmb3J3YXJkIHBhc3QgYSBKVU1QLiAgVG8gb3B0aW1pemUKKwkJICAgICAgICAgc2FmZWx5LCB3ZSB3b3VsZCBoYXZlIHRvIGNoZWNrIHRoYXQgYWxsIHRoZQorCQkgICAgICAgICBpbnN0cnVjdGlvbnMgYXQgdGhlIGp1bXAgZGVzdGluYXRpb24gZGlkIG5vdCB1c2UgUkVHLgorCQkgICAgICAgKi8KKworCQkgICAgICBpZiAoR0VUX0NPREUgKHNjYW4pID09IEpVTVBfSU5TTikKKwkJCXsKKwkJCSAgYnJlYWs7CisJCQl9CisKKwkJICAgICAgaWYgKCFyZWdfbWVudGlvbmVkX3AgKHNyY19yZWcsIFBBVFRFUk4gKHNjYW4pKSkKKwkJCWNvbnRpbnVlOworCisJCSAgICAgIC8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgY2FzdCBpbnNuICovCisJCSAgICAgIGlmIChzY2FuID09IGluc24pCisJCQl7CisJCQkgIC8qIFdlIGNhbiByZW1vdmUgY2FzdCBhbmQgcmVwbGFjZSB0aGUgZGVzdGluYXRpb24KKwkJCSAgICAgcmVnaXN0ZXIgb2YgdGhlIGxpbmsgaW5zbiB3aXRoIHRoZSBkZXN0aW5hdGlvbgorCQkJICAgICBvZiB0aGUgY2FzdCAqLworCQkJICBpZiAoZHVtcF9maWxlKQorCQkJICAgIHsKKwkJCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkJCQkgICAgICAgIjs7ICBJTlNOICVpIHJlbW92ZWQsIGNhc3RlZCB2YWx1ZSB1bnVzZWQuICIKKwkJCQkgICAgICAgIkRlc3RpbmF0aW9uIG9mIHJlbW92ZWQgY2FzdCBvcGVyYXRpb246IHJlZ2lzdGVyICVpLCAgZm9sZGVkIGludG8gSU5TTiAlaS5cbiIsCisJCQkJICAgICAgIElOU05fVUlEIChpbnNuKSwgUkVHTk8gKHJlZyksCisJCQkJICAgICAgIElOU05fVUlEIChsaW5rKSk7CisJCQkgICAgfQorCQkJICAvKiBVcGRhdGUgbGluayBpbnNuICovCisJCQkgIFNFVF9ERVNUIChQQVRURVJOIChsaW5rKSkgPQorCQkJICAgIGdlbl9ydHhfUkVHIChtb2RlLCBSRUdOTyAocmVnKSk7CisJCQkgIC8qIEZvcmNlIHRoZSBpbnN0cnVjdGlvbiB0byBiZSByZWNvZ25pemVkIGFnYWluICovCisJCQkgIElOU05fQ09ERSAobGluaykgPSAtMTsKKworCQkJICAvKiBEZWxldGUgaW5zbiAqLworCQkJICBTRVRfSU5TTl9ERUxFVEVEIChpbnNuKTsKKwkJCSAgLyogRm9yY2UgdGhlIGluc3RydWN0aW9uIHRvIGJlIHJlY29nbml6ZWQgYWdhaW4gKi8KKwkJCSAgSU5TTl9DT0RFIChpbnNuKSA9IC0xOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICBpZiAoVEFSR0VUX01EX1JFT1JHX09QVElNSVpBVElPTiAmJiAob3B0aW1pemVfc2l6ZSB8fCAob3B0aW1pemUgPiAwKSkpCisgICAgeworCisgICAgICAvKiBTY2FuIHRocm91Z2ggYWxsIGluc25zIGxvb2tpbmcgZm9yIHNoaWZ0ZWQgYWRkIG9wZXJhdGlvbnMgKi8KKyAgICAgIGlmIChkdW1wX2ZpbGUpCisJeworCSAgZnByaW50ZiAoZHVtcF9maWxlLAorCQkgICAiOzsgRGVsZXRpbmcgcmVkdW5kYW50IHNoaWZ0ZWQgYWRkIG9wZXJhdGlvbnM6XG4iKTsKKwl9CisgICAgICBmb3IgKGluc24gPSBmaXJzdDsgaW5zbjsgaW5zbiA9IE5FWFRfSU5TTiAoaW5zbikpCisJeworCSAgcnR4IHJlZywgbWVtX2V4cHIsIHNjYW4sIG9wMCwgb3AxOworCSAgaW50IGFkZF9vbmx5X3VzZWRfYXNfcG9pbnRlcjsKKworCSAgaWYgKElOU05fUCAoaW5zbikKKwkgICAgICAmJiBHRVRfQ09ERSAoUEFUVEVSTiAoaW5zbikpID09IFNFVAorCSAgICAgICYmIEdFVF9DT0RFIChTRVRfU1JDIChQQVRURVJOIChpbnNuKSkpID09IFBMVVMKKwkgICAgICAmJiAoR0VUX0NPREUgKFhFWFAgKFNFVF9TUkMgKFBBVFRFUk4gKGluc24pKSwgMCkpID09IE1VTFQKKwkJICB8fCBHRVRfQ09ERSAoWEVYUCAoU0VUX1NSQyAoUEFUVEVSTiAoaW5zbikpLCAwKSkgPT0gQVNISUZUKQorCSAgICAgICYmIEdFVF9DT0RFIChYRVhQIChYRVhQIChTRVRfU1JDIChQQVRURVJOIChpbnNuKSksIDApLCAxKSkgPT0KKwkgICAgICBDT05TVF9JTlQgJiYgUkVHX1AgKFNFVF9ERVNUIChQQVRURVJOIChpbnNuKSkpCisJICAgICAgJiYgUkVHX1AgKFhFWFAgKFNFVF9TUkMgKFBBVFRFUk4gKGluc24pKSwgMSkpCisJICAgICAgJiYgUkVHX1AgKFhFWFAgKFhFWFAgKFNFVF9TUkMgKFBBVFRFUk4gKGluc24pKSwgMCksIDApKSkKKwkgICAgeworCSAgICAgIHJlZyA9IFNFVF9ERVNUIChQQVRURVJOIChpbnNuKSk7CisJICAgICAgbWVtX2V4cHIgPSBTRVRfU1JDIChQQVRURVJOIChpbnNuKSk7CisJICAgICAgb3AwID0gWEVYUCAoWEVYUCAobWVtX2V4cHIsIDApLCAwKTsKKwkgICAgICBvcDEgPSBYRVhQIChtZW1fZXhwciwgMSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFNjYW4gZm9yd2FyZCB0aGUgY2hlY2sgaWYgdGhlIHJlc3VsdCBvZiB0aGUgc2hpZnRlZCBhZGQKKwkgICAgIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgYXMgYW4gYWRkcmVzcyBpbiBtZW1vcnkgb3BlcmF0aW9ucyBhbmQKKwkgICAgIHRoYXQgdGhlIG9wZXJhbmRzIHRvIHRoZSBzaGlmdGVkIGFkZCBhcmUgbm90IGNsb2JiZXJlZC4gKi8KKwkgIGFkZF9vbmx5X3VzZWRfYXNfcG9pbnRlciA9IGZhbHNlOworCSAgZm9yIChzY2FuID0gTkVYVF9JTlNOIChpbnNuKTsgc2Nhbjsgc2NhbiA9IE5FWFRfSU5TTiAoc2NhbikpCisJICAgIHsKKwkgICAgICBpZiAoIUlOU05fUCAoc2NhbikpCisJCWNvbnRpbnVlOworCisJICAgICAgLyogRG9uJ3QgdHJ5IHRvIHRyYWNlIGZvcndhcmQgcGFzdCBhIEpVTVAgb3IgQ0FMTC4gIFRvIG9wdGltaXplCisJICAgICAgICAgc2FmZWx5LCB3ZSB3b3VsZCBoYXZlIHRvIGNoZWNrIHRoYXQgYWxsIHRoZSBpbnN0cnVjdGlvbnMgYXQKKwkgICAgICAgICB0aGUganVtcCBkZXN0aW5hdGlvbiBkaWQgbm90IHVzZSBSRUcuICAqLworCisJICAgICAgaWYgKEdFVF9DT0RFIChzY2FuKSA9PSBKVU1QX0lOU04pCisJCXsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgLyogSWYgdXNlZCBpbiBhIGNhbGwgaW5zbiB0aGVuIHdlIGNhbm5vdCBvcHRpbWl6ZSBpdCBhd2F5ICovCisJICAgICAgaWYgKENBTExfUCAoc2NhbikgJiYgZmluZF9yZWdub19mdXNhZ2UgKHNjYW4sIFVTRSwgUkVHTk8gKHJlZykpKQorCQlicmVhazsKKworCSAgICAgIC8qIElmIGFueSBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIHNoaWZ0ZWQgYWRkIGFyZSBjbG9iYmVyZWQgd2UKKwkgICAgICAgICBjYW5ub3Qgb3B0aW1pemUgdGhlIHNoaWZ0ZWQgYWRkYSBhd2F5ICovCisJICAgICAgaWYgKChyZWdfc2V0X3AgKG9wMCwgc2NhbikgJiYgKFJFR05PIChvcDApICE9IFJFR05PIChyZWcpKSkKKwkJICB8fCAocmVnX3NldF9wIChvcDEsIHNjYW4pICYmIChSRUdOTyAob3AxKSAhPSBSRUdOTyAocmVnKSkpKQorCQlicmVhazsKKworCSAgICAgIGlmICghcmVnX21lbnRpb25lZF9wIChyZWcsIFBBVFRFUk4gKHNjYW4pKSkKKwkJY29udGludWU7CisKKwkgICAgICAvKiBJZiB1c2VkIGFueSBvdGhlciBwbGFjZSB0aGFuIGFzIGEgcG9pbnRlciBvciBhcyB0aGUKKwkgICAgICAgICBkZXN0aW5hdGlvbiByZWdpc3RlciB3ZSBmYWlsZWQgKi8KKyAgICAgICAgICAgICAgaWYgKCEoc2luZ2xlX3NldCAoc2NhbikKKyAgICAgICAgICAgICAgICAgICAgJiYgR0VUX0NPREUgKFBBVFRFUk4gKHNjYW4pKSA9PSBTRVQKKyAgICAgICAgICAgICAgICAgICAgJiYgKChNRU1fUCAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiBSRUdfUCAoWEVYUCAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgUkVHTk8gKFhFWFAgKFNFVF9ERVNUIChQQVRURVJOIChzY2FuKSksIDApKSA9PSBSRUdOTyAocmVnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNRU1fUCAoU0VUX1NSQyAoUEFUVEVSTiAoc2NhbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFJFR19QIChYRVhQIChTRVRfU1JDIChQQVRURVJOIChzY2FuKSksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFJFR05PIChYRVhQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTRVRfU1JDIChQQVRURVJOIChzY2FuKSksIDApKSA9PSBSRUdOTyAocmVnKSkpKQorICAgICAgICAgICAgICAgICAgJiYgIShHRVRfQ09ERSAoUEFUVEVSTiAoc2NhbikpID09IFNFVAorICAgICAgICAgICAgICAgICAgICAgICAmJiBSRUdfUCAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIXJlZ25vX3VzZV9pbiAoUkVHTk8gKHJlZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9TUkMgKFBBVFRFUk4gKHNjYW4pKSkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIC8qIFdlIGNhbm5vdCByZXBsYWNlIHRoZSBwb2ludGVyIGluIFRJbW9kZSBpbnNucworICAgICAgICAgICAgICAgICBhcyB0aGVzZSBoYXMgYSBkaWZmZXJlbmUgYWRkcmVzc2luZyBtb2RlIHRoYW4gdGhlIG90aGVyCisgICAgICAgICAgICAgICAgIG1lbW9yeSBpbnNucy4gKi8KKyAgICAgICAgICAgICAgaWYgKCBHRVRfTU9ERSAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSkgPT0gVEltb2RlICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworCSAgICAgIC8qIENoZWNrIGlmIHJlZ2lzdGVyIGlzIGRlYWQgb3Igc2V0IGluIHRoaXMgaW5zbiAqLworCSAgICAgIGlmIChkZWFkX29yX3NldF9wIChzY2FuLCByZWcpKQorCQl7CisJCSAgYWRkX29ubHlfdXNlZF9hc19wb2ludGVyID0gdHJ1ZTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIGlmIChhZGRfb25seV91c2VkX2FzX3BvaW50ZXIpCisJICAgIHsKKwkgICAgICAvKiBMZXRzIGRlbGV0ZSB0aGUgYWRkIGluc24gYW5kIHJlcGxhY2UgYWxsIG1lbW9yeSByZWZlcmVuY2VzCisJICAgICAgICAgd2hpY2ggdXNlcyB0aGUgcG9pbnRlciB3aXRoIHRoZSBmdWxsIGV4cHJlc3Npb24uICovCisJICAgICAgaWYgKGR1bXBfZmlsZSkKKwkJeworCQkgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkJCSAgICI7OyBEZWxldGluZyBJTlNOICVpIHNpbmNlIGFkZHJlc3MgZXhwcmVzc2lvbiBjYW4gYmUgZm9sZGVkIGludG8gYWxsICIKKwkJCSAgICJtZW1vcnkgcmVmZXJlbmNlcyB1c2luZyB0aGlzIGV4cHJlc3Npb25cbiIsCisJCQkgICBJTlNOX1VJRCAoaW5zbikpOworCQl9CisJICAgICAgU0VUX0lOU05fREVMRVRFRCAoaW5zbik7CisJICAgICAgLyogRm9yY2UgdGhlIGluc3RydWN0aW9uIHRvIGJlIHJlY29nbml6ZWQgYWdhaW4gKi8KKwkgICAgICBJTlNOX0NPREUgKGluc24pID0gLTE7CisKKwkgICAgICBmb3IgKHNjYW4gPSBORVhUX0lOU04gKGluc24pOyBzY2FuOyBzY2FuID0gTkVYVF9JTlNOIChzY2FuKSkKKwkJeworCQkgIGlmICghSU5TTl9QIChzY2FuKSkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgaWYgKCFyZWdfbWVudGlvbmVkX3AgKHJlZywgUEFUVEVSTiAoc2NhbikpKQorCQkgICAgY29udGludWU7CisKKwkJICAvKiBJZiB1c2VkIGFueSBvdGhlciBwbGFjZSB0aGFuIGFzIGEgcG9pbnRlciBvciBhcyB0aGUKKwkJICAgICBkZXN0aW5hdGlvbiByZWdpc3RlciB3ZSBmYWlsZWQgKi8KKwkJICBpZiAoKHNpbmdsZV9zZXQgKHNjYW4pCisJCSAgICAgICAmJiBHRVRfQ09ERSAoUEFUVEVSTiAoc2NhbikpID09IFNFVAorCQkgICAgICAgJiYgKChNRU1fUCAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSkKKwkJCSAgICAmJiBSRUdfUCAoWEVYUCAoU0VUX0RFU1QgKFBBVFRFUk4gKHNjYW4pKSwgMCkpCisJCQkgICAgJiYgUkVHTk8gKFhFWFAgKFNFVF9ERVNUIChQQVRURVJOIChzY2FuKSksIDApKSA9PQorCQkJICAgIFJFR05PIChyZWcpKSB8fCAoTUVNX1AgKFNFVF9TUkMgKFBBVFRFUk4gKHNjYW4pKSkKKwkJCQkJICAgICAmJgorCQkJCQkgICAgIFJFR19QIChYRVhQCisJCQkJCQkgICAgKFNFVF9TUkMgKFBBVFRFUk4gKHNjYW4pKSwKKwkJCQkJCSAgICAgMCkpCisJCQkJCSAgICAgJiYKKwkJCQkJICAgICBSRUdOTyAoWEVYUAorCQkJCQkJICAgIChTRVRfU1JDIChQQVRURVJOIChzY2FuKSksCisJCQkJCQkgICAgIDApKSA9PSBSRUdOTyAocmVnKSkpKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKGR1bXBfZmlsZSkKKwkJCXsKKwkJCSAgZnByaW50ZiAoZHVtcF9maWxlLAorCQkJCSAgICI7OyBSZWdpc3RlciAlaSByZXBsYWNlZCBieSBpbmRleGVkIGFkZHJlc3MgaW4gSU5TTiAlaVxuIiwKKwkJCQkgICBSRUdOTyAocmVnKSwgSU5TTl9VSUQgKHNjYW4pKTsKKwkJCX0KKwkJICAgICAgaWYgKE1FTV9QIChTRVRfREVTVCAoUEFUVEVSTiAoc2NhbikpKSkKKwkJCVhFWFAgKFNFVF9ERVNUIChQQVRURVJOIChzY2FuKSksIDApID0gbWVtX2V4cHI7CisJCSAgICAgIGVsc2UKKwkJCVhFWFAgKFNFVF9TUkMgKFBBVFRFUk4gKHNjYW4pKSwgMCkgPSBtZW1fZXhwcjsKKwkJICAgIH0KKworCQkgIC8qIENoZWNrIGlmIHJlZ2lzdGVyIGlzIGRlYWQgb3Igc2V0IGluIHRoaXMgaW5zbiAqLworCQkgIGlmIChkZWFkX29yX3NldF9wIChzY2FuLCByZWcpKQorCQkgICAgeworCQkgICAgICBicmVhazsKKwkJICAgIH0KKworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisKKyAgaWYgKFRBUkdFVF9NRF9SRU9SR19PUFRJTUlaQVRJT04gJiYgKG9wdGltaXplX3NpemUgfHwgKG9wdGltaXplID4gMCkpKQorICAgIHsKKworICAgICAgLyogU2NhbiB0aHJvdWdoIGFsbCBpbnNucyBsb29raW5nIGZvciBjb25kaXRpb25hbCByZWdpc3RlciB0bworICAgICAgICAgcmVnaXN0ZXIgbW92ZSBvcGVyYXRpb25zICovCisgICAgICBpZiAoZHVtcF9maWxlKQorCXsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwKKwkJICAgIjs7IEZvbGRpbmcgcmVkdW5kYW50IGNvbmRpdGlvbmFsIG1vdmUgb3BlcmF0aW9uczpcbiIpOworCX0KKyAgICAgIGZvciAoaW5zbiA9IGZpcnN0OyBpbnNuOyBpbnNuID0gbmV4dF9ub25ub3RlX2luc24gKGluc24pKQorCXsKKwkgIHJ0eCBzcmNfcmVnLCBkc3RfcmVnLCBzY2FuLCB0ZXN0OworCisJICBpZiAoSU5TTl9QIChpbnNuKQorICAgICAgICAgICAgICAmJiBHRVRfQ09ERSAoUEFUVEVSTiAoaW5zbikpID09IENPTkRfRVhFQworCSAgICAgICYmIEdFVF9DT0RFIChDT05EX0VYRUNfQ09ERSAoUEFUVEVSTiAoaW5zbikpKSA9PSBTRVQKKwkgICAgICAmJiBSRUdfUCAoU0VUX1NSQyAoQ09ORF9FWEVDX0NPREUgKFBBVFRFUk4gKGluc24pKSkpCisJICAgICAgJiYgUkVHX1AgKFNFVF9ERVNUIChDT05EX0VYRUNfQ09ERSAoUEFUVEVSTiAoaW5zbikpKSkKKyAgICAgICAgICAgICAgJiYgZmluZF9yZWdfbm90ZSAoaW5zbiwgUkVHX0RFQUQsIFNFVF9TUkMgKENPTkRfRVhFQ19DT0RFIChQQVRURVJOIChpbnNuKSkpKSkKKwkgICAgeworCSAgICAgIHNyY19yZWcgPSBTRVRfU1JDIChDT05EX0VYRUNfQ09ERSAoUEFUVEVSTiAoaW5zbikpKTsKKwkgICAgICBkc3RfcmVnID0gU0VUX0RFU1QgKENPTkRfRVhFQ19DT0RFIChQQVRURVJOIChpbnNuKSkpOworICAgICAgICAgICAgICB0ZXN0ID0gQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKGluc24pKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworICAgICAgICAgIC8qIFNjYW4gYmFja3dhcmQgdGhyb3VnaCB0aGUgcmVzdCBvZiBpbnNucyBpbiB0aGlzIGlmLXRoZW4gb3IgaWYtZWxzZQorICAgICAgICAgICAgIGJsb2NrIGFuZCBjaGVjayBpZiB3ZSBjYW4gZm9sZCB0aGUgbW92ZSBpbnRvIGFub3RoZXIgb2YgdGhlIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgaW5zbnMgaW4gdGhlIHNhbWUgYmxvY2suICovCisgICAgICAgICAgc2NhbiA9IHByZXZfbm9ubm90ZV9pbnNuIChpbnNuKTsKKyAgICAgICAgICB3aGlsZSAoSU5TTl9QIChzY2FuKQorICAgICAgICAgICAgICAgICAmJiBHRVRfQ09ERSAoUEFUVEVSTiAoc2NhbikpID09IENPTkRfRVhFQworICAgICAgICAgICAgICAgICAmJiBydHhfZXF1YWxfcCAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKHNjYW4pKSwgdGVzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJ0eCBwYXR0ZXJuID0gQ09ORF9FWEVDX0NPREUgKFBBVFRFUk4gKHNjYW4pKTsKKyAgICAgICAgICAgICAgaWYgKCBHRVRfQ09ERSAocGF0dGVybikgPT0gUEFSQUxMRUwgKQorICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBYVkVDRVhQIChwYXR0ZXJuLCAwLCAwKTsKKworICAgICAgICAgICAgICBpZiAoIHJlZ19zZXRfcCAoc3JjX3JlZywgcGF0dGVybikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEZvbGQgaW4gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZvciB0aGUgY29uZC4gbW92ZQorICAgICAgICAgICAgICAgICAgICAgaW50byB0aGlzIGluc24uICovCisgICAgICAgICAgICAgICAgICBTRVRfREVTVCAocGF0dGVybikgPSBkc3RfcmVnOworICAgICAgICAgICAgICAgICAgaWYgKGR1bXBfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOzsgRGVsZXRpbmcgSU5TTiAlaSBzaW5jZSB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZm9sZGVkIGludG8gSU5TTiAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlNOX1VJRCAoaW5zbiksIElOU05fVUlEIChzY2FuKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLyogU2NhbiBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZSBpbnNucyBpbiBiZXR3ZWVuIHVzZXMgdGhlIHNyY19yZWcuIFdlCisgICAgICAgICAgICAgICAgICAgICBtdXN0IHRoZW4gcmVwbGFjZSBpdCB3aXRoIHRoZSBkc3RfcmVnLiAqLworICAgICAgICAgICAgICAgICAgd2hpbGUgKCAoc2NhbiA9IG5leHRfbm9ubm90ZV9pbnNuIChzY2FuKSkgIT0gaW5zbiApeworICAgICAgICAgICAgICAgICAgICBhdnIzMl9yZXBsYWNlX3JlZyAoc2Nhbiwgc3JjX3JlZywgZHN0X3JlZyk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGhlIGluc24uICovCisgICAgICAgICAgICAgICAgICBTRVRfSU5TTl9ERUxFVEVEIChpbnNuKTsKKworICAgICAgICAgICAgICAgICAgLyogRm9yY2UgdGhlIGluc3RydWN0aW9uIHRvIGJlIHJlY29nbml6ZWQgYWdhaW4gKi8KKyAgICAgICAgICAgICAgICAgIElOU05fQ09ERSAoaW5zbikgPSAtMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgdXNlZCBidXQgbm90IHNldCBpbiB0aGlzIGluc24KKyAgICAgICAgICAgICAgICAgd2UgY2Fubm90IGZvbGQuICovCisgICAgICAgICAgICAgIGlmICggcmVnX21lbnRpb25lZF9wIChkc3RfcmVnLCBwYXR0ZXJuKSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgc2NhbiA9IHByZXZfbm9ubm90ZV9pbnNuIChzY2FuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisvKiBFeHBvcnRlZCB0byB0b3BsZXYuYy4KKworICAgRG8gYSBmaW5hbCBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLCBqdXN0IGJlZm9yZSBkZWxheWVkIGJyYW5jaAorICAgc2NoZWR1bGluZy4gICovCisKK3N0YXRpYyB2b2lkCithdnIzMl9yZW9yZyAodm9pZCkKK3sKKyAgcnR4IGluc247CisgIEhPU1RfV0lERV9JTlQgYWRkcmVzcyA9IDA7CisgIE1maXggKmZpeDsKKworICBtaW5pcG9vbF9maXhfaGVhZCA9IG1pbmlwb29sX2ZpeF90YWlsID0gTlVMTDsKKworICAvKiBUaGUgZmlyc3QgaW5zbiBtdXN0IGFsd2F5cyBiZSBhIG5vdGUsIG9yIHRoZSBjb2RlIGJlbG93IHdvbid0IHNjYW4gaXQKKyAgICAgcHJvcGVybHkuICAqLworICBpbnNuID0gZ2V0X2luc25zICgpOworICBpZiAoR0VUX0NPREUgKGluc24pICE9IE5PVEUpCisgICAgYWJvcnQgKCk7CisKKyAgLyogU2NhbiBhbGwgdGhlIGluc25zIGFuZCByZWNvcmQgdGhlIG9wZXJhbmRzIHRoYXQgd2lsbCBuZWVkIGZpeGluZy4gICovCisgIGZvciAoaW5zbiA9IG5leHRfbm9ubm90ZV9pbnNuIChpbnNuKTsgaW5zbjsgaW5zbiA9IG5leHRfbm9ubm90ZV9pbnNuIChpbnNuKSkKKyAgICB7CisgICAgICBpZiAoR0VUX0NPREUgKGluc24pID09IEJBUlJJRVIpCisJcHVzaF9taW5pcG9vbF9iYXJyaWVyIChpbnNuLCBhZGRyZXNzKTsKKyAgICAgIGVsc2UgaWYgKElOU05fUCAoaW5zbikpCisJeworCSAgcnR4IHRhYmxlOworCisJICBub3RlX2ludmFsaWRfY29uc3RhbnRzIChpbnNuLCBhZGRyZXNzLCB0cnVlKTsKKwkgIGFkZHJlc3MgKz0gZ2V0X2F0dHJfbGVuZ3RoIChpbnNuKTsKKworCSAgLyogSWYgdGhlIGluc24gaXMgYSB2ZWN0b3IganVtcCwgYWRkIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBhbmQgc2tpcAorCSAgICAgdGhlIHRhYmxlLiAgKi8KKwkgIGlmICgodGFibGUgPSBpc19qdW1wX3RhYmxlIChpbnNuKSkgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGFkZHJlc3MgKz0gZ2V0X2p1bXBfdGFibGVfc2l6ZSAodGFibGUpOworCSAgICAgIGluc24gPSB0YWJsZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgZml4ID0gbWluaXBvb2xfZml4X2hlYWQ7CisKKyAgLyogTm93IHNjYW4gdGhlIGZpeHVwcyBhbmQgcGVyZm9ybSB0aGUgcmVxdWlyZWQgY2hhbmdlcy4gICovCisgIHdoaWxlIChmaXgpCisgICAgeworICAgICAgTWZpeCAqZnRtcDsKKyAgICAgIE1maXggKmZkZWw7CisgICAgICBNZml4ICpsYXN0X2FkZGVkX2ZpeDsKKyAgICAgIE1maXggKmxhc3RfYmFycmllciA9IE5VTEw7CisgICAgICBNZml4ICp0aGlzX2ZpeDsKKworICAgICAgLyogU2tpcCBhbnkgZnVydGhlciBiYXJyaWVycyBiZWZvcmUgdGhlIG5leHQgZml4LiAgKi8KKyAgICAgIHdoaWxlIChmaXggJiYgR0VUX0NPREUgKGZpeC0+aW5zbikgPT0gQkFSUklFUikKKwlmaXggPSBmaXgtPm5leHQ7CisKKyAgICAgIC8qIE5vIG1vcmUgZml4ZXMuICAqLworICAgICAgaWYgKGZpeCA9PSBOVUxMKQorCWJyZWFrOworCisgICAgICBsYXN0X2FkZGVkX2ZpeCA9IE5VTEw7CisKKyAgICAgIGZvciAoZnRtcCA9IGZpeDsgZnRtcDsgZnRtcCA9IGZ0bXAtPm5leHQpCisJeworCSAgaWYgKEdFVF9DT0RFIChmdG1wLT5pbnNuKSA9PSBCQVJSSUVSKQorCSAgICB7CisJICAgICAgaWYgKGZ0bXAtPmFkZHJlc3MgPj0gbWluaXBvb2xfdmVjdG9yX2hlYWQtPm1heF9hZGRyZXNzKQorCQlicmVhazsKKworCSAgICAgIGxhc3RfYmFycmllciA9IGZ0bXA7CisJICAgIH0KKwkgIGVsc2UgaWYgKChmdG1wLT5taW5pcG9vbCA9IGFkZF9taW5pcG9vbF9mb3J3YXJkX3JlZiAoZnRtcCkpID09IE5VTEwpCisJICAgIGJyZWFrOworCisJICBsYXN0X2FkZGVkX2ZpeCA9IGZ0bXA7CS8qIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZml4IGFkZGVkLgorCQkJCQkgKi8KKwl9CisKKyAgICAgIC8qIElmIHdlIGZvdW5kIGEgYmFycmllciwgZHJvcCBiYWNrIHRvIHRoYXQ7IGFueSBmaXhlcyB0aGF0IHdlIGNvdWxkCisgICAgICAgICBoYXZlIHJlYWNoZWQgYnV0IGNvbWUgYWZ0ZXIgdGhlIGJhcnJpZXIgd2lsbCBub3cgZ28gaW4gdGhlIG5leHQKKyAgICAgICAgIG1pbmktcG9vbC4gICovCisgICAgICBpZiAobGFzdF9iYXJyaWVyICE9IE5VTEwpCisJeworCSAgLyogUmVkdWNlIHRoZSByZWZjb3VudCBmb3IgdGhvc2UgZml4ZXMgdGhhdCB3b24ndCBnbyBpbnRvIHRoaXMgcG9vbAorCSAgICAgYWZ0ZXIgYWxsLiAgKi8KKwkgIGZvciAoZmRlbCA9IGxhc3RfYmFycmllci0+bmV4dDsKKwkgICAgICAgZmRlbCAmJiBmZGVsICE9IGZ0bXA7IGZkZWwgPSBmZGVsLT5uZXh0KQorCSAgICB7CisJICAgICAgZmRlbC0+bWluaXBvb2wtPnJlZmNvdW50LS07CisJICAgICAgZmRlbC0+bWluaXBvb2wgPSBOVUxMOworCSAgICB9CisKKwkgIGZ0bXAgPSBsYXN0X2JhcnJpZXI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIGZ0bXAgaXMgZmlyc3QgZml4IHRoYXQgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBwb29sIGFuZCB0aGVyZSBubworCSAgICAgbmF0dXJhbCBiYXJyaWVycyB0aGF0IHdlIGNvdWxkIHVzZS4gIEluc2VydCBhIG5ldyBiYXJyaWVyIGluIHRoZQorCSAgICAgY29kZSBzb21ld2hlcmUgYmV0d2VlbiB0aGUgcHJldmlvdXMgZml4IGFuZCB0aGlzIG9uZSwgYW5kCisJICAgICBhcnJhbmdlIHRvIGp1bXAgYXJvdW5kIGl0LiAgKi8KKwkgIEhPU1RfV0lERV9JTlQgbWF4X2FkZHJlc3M7CisKKwkgIC8qIFRoZSBsYXN0IGl0ZW0gb24gdGhlIGxpc3Qgb2YgZml4ZXMgbXVzdCBiZSBhIGJhcnJpZXIsIHNvIHdlIGNhbgorCSAgICAgbmV2ZXIgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGZpeGVzIHdpdGhvdXQgbGFzdF9iYXJyaWVyCisJICAgICBiZWluZyBzZXQuICAqLworCSAgaWYgKGZ0bXAgPT0gTlVMTCkKKwkgICAgYWJvcnQgKCk7CisKKwkgIG1heF9hZGRyZXNzID0gbWluaXBvb2xfdmVjdG9yX2hlYWQtPm1heF9hZGRyZXNzOworCSAgLyogQ2hlY2sgdGhhdCB0aGVyZSBpc24ndCBhbm90aGVyIGZpeCB0aGF0IGlzIGluIHJhbmdlIHRoYXQgd2UKKwkgICAgIGNvdWxkbid0IGZpdCBpbnRvIHRoaXMgcG9vbCBiZWNhdXNlIHRoZSBwb29sIHdhcyBhbHJlYWR5IHRvbworCSAgICAgbGFyZ2U6IHdlIG5lZWQgdG8gcHV0IHRoZSBwb29sIGJlZm9yZSBzdWNoIGFuIGluc3RydWN0aW9uLiAgKi8KKwkgIGlmIChmdG1wLT5hZGRyZXNzIDwgbWF4X2FkZHJlc3MpCisJICAgIG1heF9hZGRyZXNzID0gZnRtcC0+YWRkcmVzczsKKworCSAgbGFzdF9iYXJyaWVyID0gY3JlYXRlX2ZpeF9iYXJyaWVyIChsYXN0X2FkZGVkX2ZpeCwgbWF4X2FkZHJlc3MpOworCX0KKworICAgICAgYXNzaWduX21pbmlwb29sX29mZnNldHMgKGxhc3RfYmFycmllcik7CisKKyAgICAgIHdoaWxlIChmdG1wKQorCXsKKwkgIGlmIChHRVRfQ09ERSAoZnRtcC0+aW5zbikgIT0gQkFSUklFUgorCSAgICAgICYmICgoZnRtcC0+bWluaXBvb2wgPSBhZGRfbWluaXBvb2xfYmFja3dhcmRfcmVmIChmdG1wKSkKKwkJICA9PSBOVUxMKSkKKwkgICAgYnJlYWs7CisKKwkgIGZ0bXAgPSBmdG1wLT5uZXh0OworCX0KKworICAgICAgLyogU2NhbiBvdmVyIHRoZSBmaXhlcyB3ZSBoYXZlIGlkZW50aWZpZWQgZm9yIHRoaXMgcG9vbCwgZml4aW5nIHRoZW0gdXAKKyAgICAgICAgIGFuZCBhZGRpbmcgdGhlIGNvbnN0YW50cyB0byB0aGUgcG9vbCBpdHNlbGYuICAqLworICAgICAgICBmb3IgKHRoaXNfZml4ID0gZml4OyB0aGlzX2ZpeCAmJiBmdG1wICE9IHRoaXNfZml4OworICAgICAgICAgICAgIHRoaXNfZml4ID0gdGhpc19maXgtPm5leHQpCisgICAgICAgICAgaWYgKEdFVF9DT0RFICh0aGlzX2ZpeC0+aW5zbikgIT0gQkFSUklFUgorICAgICAgICAgICAgICAvKiBEbyBub3RoaW5nIGZvciBlbnRyaWVzIHByZXNlbnQganVzdCB0byBmb3JjZSB0aGUgaW5zZXJ0aW9uIG9mCisJICAgICAgIGEgbWluaXBvb2wuICovCisJICAgICYmICFJU19GT1JDRV9NSU5JUE9PTCAodGhpc19maXgtPnZhbHVlKSkKKwkgIHsKKwkgICAgcnR4IGFkZHIgPSBwbHVzX2NvbnN0YW50IChnZW5fcnR4X0xBQkVMX1JFRiAoVk9JRG1vZGUsCisJCQkJCQkJIG1pbmlwb29sX3ZlY3Rvcl9sYWJlbCksCisJCQkJICAgICAgdGhpc19maXgtPm1pbmlwb29sLT5vZmZzZXQpOworCSAgICAqdGhpc19maXgtPmxvYyA9IGdlbl9ydHhfTUVNICh0aGlzX2ZpeC0+bW9kZSwgYWRkcik7CisJICB9CisKKyAgICAgIGR1bXBfbWluaXBvb2wgKGxhc3RfYmFycmllci0+aW5zbik7CisgICAgICBmaXggPSBmdG1wOworICAgIH0KKworICAvKiBGcmVlIHRoZSBtaW5pcG9vbCBtZW1vcnkuICAqLworICBvYnN0YWNrX2ZyZWUgKCZtaW5pcG9vbF9vYnN0YWNrLCBtaW5pcG9vbF9zdGFydG9iaik7CisKKyAgYXZyMzJfcmVvcmdfb3B0aW1pemF0aW9uICgpOworfQorCisKKy8qCisgSG9vayBmb3IgZG9pbmcgc29tZSBmaW5hbCBzY2FubmluZyBvZiBpbnN0cnVjdGlvbnMuIERvZXMgbm90aGluZyB5ZXQuLi4qLwordm9pZAorYXZyMzJfZmluYWxfcHJlc2Nhbl9pbnNuIChydHggaW5zbiBBVFRSSUJVVEVfVU5VU0VELAorCQkJICBydHggKiBvcHZlYyBBVFRSSUJVVEVfVU5VU0VELAorCQkJICBpbnQgbm9wZXJhbmRzIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybjsKK30KKworCisvKiBGdW5jdGlvbiBmb3IgY2hhbmdpbmcgdGhlIGNvbmRpdGlvbiBvbiB0aGUgbmV4dCBpbnN0cnVjdGlvbiwKKyAgIHNob3VsZCBiZSB1c2VkIHdoZW4gZW1taXRpbmcgY29tcGFyZSBpbnN0cnVjdGlvbnMgYW5kCisgICB0aGUgY29uZGl0aW9uIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIG5lZWRzIHRvIGNoYW5nZS4KKyovCitpbnQKK3NldF9uZXh0X2luc25fY29uZCAocnR4IGN1cl9pbnNuLCBydHggbmV3X2NvbmQpCit7CisgIHJ0eCBuZXh0X2luc24gPSBuZXh0X25vbm5vdGVfaW5zbiAoY3VyX2luc24pOworICAgaWYgKChuZXh0X2luc24gIT0gTlVMTF9SVFgpCisgICAgICAgJiYgKElOU05fUCAobmV4dF9pbnNuKSkpCisgICAgIHsKKyAgICAgICBpZiAoKEdFVF9DT0RFIChQQVRURVJOIChuZXh0X2luc24pKSA9PSBTRVQpCisgICAgICAgICAgICYmIChHRVRfQ09ERSAoU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSkpID09IElGX1RIRU5fRUxTRSkpCisgICAgICAgICB7CisgICAgICAgICAgIC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgWEVYUCAoU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSksIDApID0gbmV3X2NvbmQ7CisgICAgICAgICAgIC8qIEZvcmNlIHRoZSBpbnN0cnVjdGlvbiB0byBiZSByZWNvZ25pemVkIGFnYWluICovCisgICAgICAgICAgIElOU05fQ09ERSAobmV4dF9pbnNuKSA9IC0xOworICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgIH0KKyAgICAgICBlbHNlIGlmICgoR0VUX0NPREUgKFBBVFRFUk4gKG5leHRfaW5zbikpID09IFNFVCkKKyAgICAgICAgICAgICAgICAmJiBhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIChTRVRfU1JDIChQQVRURVJOIChuZXh0X2luc24pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9ERSAoU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSkpKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgLyogc2NjIHdpdGggbm8gY29tcGFyZSAqLworICAgICAgICAgICBTRVRfU1JDIChQQVRURVJOIChuZXh0X2luc24pKSA9IG5ld19jb25kOworICAgICAgICAgICAvKiBGb3JjZSB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgcmVjb2duaXplZCBhZ2FpbiAqLworICAgICAgICAgICBJTlNOX0NPREUgKG5leHRfaW5zbikgPSAtMTsKKyAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICB9CisgICAgICAgZWxzZSBpZiAoR0VUX0NPREUgKFBBVFRFUk4gKG5leHRfaW5zbikpID09IENPTkRfRVhFQykKKyAgICAgICAgIHsKKyAgICAgICAgICAgaWYgKCBHRVRfQ09ERSAobmV3X2NvbmQpID09IFVOU1BFQyApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpID0KKyAgICAgICAgICAgICAgICAgZ2VuX3J0eF9VTlNQRUMgKENDbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9ydHZlYyAoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVYUCAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVYUCAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpLCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSU5UIChuZXdfY29uZCwgMSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFBVVF9DT0RFKENPTkRfRVhFQ19URVNUIChQQVRURVJOIChuZXh0X2luc24pKSwgR0VUX0NPREUobmV3X2NvbmQpKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIEZ1bmN0aW9uIGZvciBvYnRhaW5pbmcgdGhlIGNvbmRpdGlvbiBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24KKyAgIGFmdGVyIGN1cl9pbnNuLgorKi8KK3J0eAorZ2V0X25leHRfaW5zbl9jb25kIChydHggY3VyX2luc24pCit7CisgIHJ0eCBuZXh0X2luc24gPSBuZXh0X25vbm5vdGVfaW5zbiAoY3VyX2luc24pOworICBydHggY29uZCA9IE5VTExfUlRYOworICBpZiAobmV4dF9pbnNuICE9IE5VTExfUlRYCisgICAgICAmJiBJTlNOX1AgKG5leHRfaW5zbikpCisgICAgeworICAgICAgaWYgKChHRVRfQ09ERSAoUEFUVEVSTiAobmV4dF9pbnNuKSkgPT0gU0VUKQorICAgICAgICAgICYmIChHRVRfQ09ERSAoU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSkpID09IElGX1RIRU5fRUxTRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBCcmFuY2ggYW5kIGNvbmQgaWYgdGhlbiBlbHNlIGluc3RydWN0aW9ucyAqLworICAgICAgICAgIGNvbmQgPSBYRVhQIChTRVRfU1JDIChQQVRURVJOIChuZXh0X2luc24pKSwgMCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChHRVRfQ09ERSAoUEFUVEVSTiAobmV4dF9pbnNuKSkgPT0gU0VUKQorICAgICAgICAgICAgICAgJiYgYXZyMzJfY29tcGFyaXNvbl9vcGVyYXRvciAoU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9ERSAoU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSkpKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNjYyB3aXRoIG5vIGNvbXBhcmUgKi8KKyAgICAgICAgICBjb25kID0gU0VUX1NSQyAoUEFUVEVSTiAobmV4dF9pbnNuKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKEdFVF9DT0RFIChQQVRURVJOIChuZXh0X2luc24pKSA9PSBDT05EX0VYRUMpCisgICAgICAgIHsKKyAgICAgICAgICBjb25kID0gQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKG5leHRfaW5zbikpOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gY29uZDsKK30KKworCitydHgKK2F2cjMyX291dHB1dF9jbXAgKHJ0eCBjb25kLCBlbnVtIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggb3AwLCBydHggb3AxKQoreworCisgIHJ0eCBuZXdfY29uZCA9IE5VTExfUlRYOworICBydHggb3BzWzJdOworICBydHggY29tcGFyZV9wYXR0ZXJuOworICBvcHNbMF0gPSBvcDA7CisgIG9wc1sxXSA9IG9wMTsKKworICBpZiAoIEdFVF9DT0RFIChvcDApID09IEFORCApCisgICAgY29tcGFyZV9wYXR0ZXJuID0gb3AwOworICBlbHNlCisgICAgY29tcGFyZV9wYXR0ZXJuID0gZ2VuX3J0eF9DT01QQVJFIChtb2RlLCBvcDAsIG9wMSk7CisKKyAgbmV3X2NvbmQgPSBpc19jb21wYXJlX3JlZHVuZGFudCAoY29tcGFyZV9wYXR0ZXJuLCBjb25kKTsKKworICBpZiAobmV3X2NvbmQgIT0gTlVMTF9SVFgpCisgICAgcmV0dXJuIG5ld19jb25kOworCisgIC8qIENoZWNrIGlmIHdlIGFyZSBpbnNlcnRpbmcgYSBiaXQtbG9hZCBpbnN0ZWFkIG9mIGEgY29tcGFyZS4gKi8KKyAgaWYgKCBHRVRfQ09ERSAob3AwKSA9PSBBTkQgKQorICAgIHsKKyAgICAgIG9wc1swXSA9IFhFWFAgKG9wMCwgMCk7CisgICAgICBvcHNbMV0gPSBYRVhQIChvcDAsIDEpOworICAgICAgb3V0cHV0X2FzbV9pbnNuICgiYmxkXHQlMCwgJXAxIiwgb3BzKTsKKyAgICAgIHJldHVybiBjb25kOworICAgIH0KKworICAvKiBJbnNlcnQgY29tcGFyZSAqLworICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgIGNhc2UgUUltb2RlOgorICAgICAgb3V0cHV0X2FzbV9pbnNuICgiY3AuYlx0JTAsICUxIiwgb3BzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEltb2RlOgorICAgICAgb3V0cHV0X2FzbV9pbnNuICgiY3AuaFx0JTAsICUxIiwgb3BzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0ltb2RlOgorICAgICAgb3V0cHV0X2FzbV9pbnNuICgiY3Aud1x0JTAsICUxIiwgb3BzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREltb2RlOgorICAgICAgaWYgKEdFVF9DT0RFIChvcDEpICE9IFJFRykKKwlvdXRwdXRfYXNtX2luc24gKCJjcC53XHQlMCwgJTFcbmNwY1x0JW0wIiwgb3BzKTsKKyAgICAgIGVsc2UKKwlvdXRwdXRfYXNtX2luc24gKCJjcC53XHQlMCwgJTFcbmNwY1x0JW0wLCAlbTEiLCBvcHMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGludGVybmFsX2Vycm9yICgiVW5rbm93biBjb21wYXJpc29uIG1vZGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gY29uZDsKK30KKworaW50CithdnIzMl9sb2FkX211bHRpcGxlX29wZXJhdGlvbiAocnR4IG9wLAorCQkJICAgICAgIGVudW0gbWFjaGluZV9tb2RlIG1vZGUgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgaW50IGNvdW50ID0gWFZFQ0xFTiAob3AsIDApOworICB1bnNpZ25lZCBpbnQgZGVzdF9yZWdubzsKKyAgcnR4IHNyY19hZGRyOworICBydHggZWx0OworICBpbnQgaSA9IDEsIGJhc2UgPSAwOworCisgIGlmIChjb3VudCA8PSAxIHx8IEdFVF9DT0RFIChYVkVDRVhQIChvcCwgMCwgMCkpICE9IFNFVCkKKyAgICByZXR1cm4gMDsKKworICAvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBtaWdodCBiZSBhIHdyaXRlLWJhY2suICAqLworICBpZiAoR0VUX0NPREUgKFNFVF9TUkMgKGVsdCA9IFhWRUNFWFAgKG9wLCAwLCAwKSkpID09IFBMVVMpCisgICAgeworICAgICAgaSsrOworICAgICAgYmFzZSA9IDE7CisKKyAgICAgIC8qIE5vdyBjaGVjayBpdCBtb3JlIGNhcmVmdWxseS4gICovCisgICAgICBpZiAoR0VUX0NPREUgKFNFVF9ERVNUIChlbHQpKSAhPSBSRUcKKwkgIHx8IEdFVF9DT0RFIChYRVhQIChTRVRfU1JDIChlbHQpLCAwKSkgIT0gUkVHCisJICB8fCBHRVRfQ09ERSAoWEVYUCAoU0VUX1NSQyAoZWx0KSwgMSkpICE9IENPTlNUX0lOVAorCSAgfHwgSU5UVkFMIChYRVhQIChTRVRfU1JDIChlbHQpLCAxKSkgIT0gKGNvdW50IC0gMSkgKiA0KQorCXJldHVybiAwOworICAgIH0KKworICAvKiBQZXJmb3JtIGEgcXVpY2sgY2hlY2sgc28gd2UgZG9uJ3QgYmxvdyB1cCBiZWxvdy4gICovCisgIGlmIChjb3VudCA8PSAxCisgICAgICB8fCBHRVRfQ09ERSAoWFZFQ0VYUCAob3AsIDAsIGkgLSAxKSkgIT0gU0VUCisgICAgICB8fCBHRVRfQ09ERSAoU0VUX0RFU1QgKFhWRUNFWFAgKG9wLCAwLCBpIC0gMSkpKSAhPSBSRUcKKyAgICAgIHx8IEdFVF9DT0RFIChTRVRfU1JDIChYVkVDRVhQIChvcCwgMCwgaSAtIDEpKSkgIT0gVU5TUEVDKQorICAgIHJldHVybiAwOworCisgIGRlc3RfcmVnbm8gPSBSRUdOTyAoU0VUX0RFU1QgKFhWRUNFWFAgKG9wLCAwLCBpIC0gMSkpKTsKKyAgc3JjX2FkZHIgPSBYRVhQIChTRVRfU1JDIChYVkVDRVhQIChvcCwgMCwgaSAtIDEpKSwgMCk7CisKKyAgZm9yICg7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGVsdCA9IFhWRUNFWFAgKG9wLCAwLCBpKTsKKworICAgICAgaWYgKEdFVF9DT0RFIChlbHQpICE9IFNFVAorCSAgfHwgR0VUX0NPREUgKFNFVF9ERVNUIChlbHQpKSAhPSBSRUcKKwkgIHx8IEdFVF9NT0RFIChTRVRfREVTVCAoZWx0KSkgIT0gU0ltb2RlCisJICB8fCBHRVRfQ09ERSAoU0VUX1NSQyAoZWx0KSkgIT0gVU5TUEVDKQorCXJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworaW50CithdnIzMl9zdG9yZV9tdWx0aXBsZV9vcGVyYXRpb24gKHJ0eCBvcCwKKwkJCQllbnVtIG1hY2hpbmVfbW9kZSBtb2RlIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIGludCBjb3VudCA9IFhWRUNMRU4gKG9wLCAwKTsKKyAgaW50IHNyY19yZWdubzsKKyAgcnR4IGRlc3RfYWRkcjsKKyAgcnR4IGVsdDsKKyAgaW50IGkgPSAxOworCisgIGlmIChjb3VudCA8PSAxIHx8IEdFVF9DT0RFIChYVkVDRVhQIChvcCwgMCwgMCkpICE9IFNFVCkKKyAgICByZXR1cm4gMDsKKworICAvKiBQZXJmb3JtIGEgcXVpY2sgY2hlY2sgc28gd2UgZG9uJ3QgYmxvdyB1cCBiZWxvdy4gICovCisgIGlmIChjb3VudCA8PSBpCisgICAgICB8fCBHRVRfQ09ERSAoWFZFQ0VYUCAob3AsIDAsIGkgLSAxKSkgIT0gU0VUCisgICAgICB8fCBHRVRfQ09ERSAoU0VUX0RFU1QgKFhWRUNFWFAgKG9wLCAwLCBpIC0gMSkpKSAhPSBNRU0KKyAgICAgIHx8IEdFVF9DT0RFIChTRVRfU1JDIChYVkVDRVhQIChvcCwgMCwgaSAtIDEpKSkgIT0gVU5TUEVDKQorICAgIHJldHVybiAwOworCisgIHNyY19yZWdubyA9IFJFR05PIChTRVRfU1JDIChYVkVDRVhQIChvcCwgMCwgaSAtIDEpKSk7CisgIGRlc3RfYWRkciA9IFhFWFAgKFNFVF9ERVNUIChYVkVDRVhQIChvcCwgMCwgaSAtIDEpKSwgMCk7CisKKyAgZm9yICg7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGVsdCA9IFhWRUNFWFAgKG9wLCAwLCBpKTsKKworICAgICAgaWYgKEdFVF9DT0RFIChlbHQpICE9IFNFVAorCSAgfHwgR0VUX0NPREUgKFNFVF9ERVNUIChlbHQpKSAhPSBNRU0KKwkgIHx8IEdFVF9NT0RFIChTRVRfREVTVCAoZWx0KSkgIT0gU0ltb2RlCisJICB8fCBHRVRfQ09ERSAoU0VUX1NSQyAoZWx0KSkgIT0gVU5TUEVDKQorCXJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworaW50CithdnIzMl92YWxpZF9tYWNtYWNfYnlwYXNzIChydHggaW5zbl9vdXQsIHJ0eCBpbnNuX2luKQoreworICAvKiBDaGVjayBpZiB0aGV5IHVzZSB0aGUgc2FtZSBhY2N1bXVsYXRvciAqLworICBpZiAocnR4X2VxdWFsX3AKKyAgICAgIChTRVRfREVTVCAoUEFUVEVSTiAoaW5zbl9vdXQpKSwgU0VUX0RFU1QgKFBBVFRFUk4gKGluc25faW4pKSkpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworaW50CithdnIzMl92YWxpZF9tdWxtYWNfYnlwYXNzIChydHggaW5zbl9vdXQsIHJ0eCBpbnNuX2luKQoreworICAvKgorICAgICBDaGVjayBpZiB0aGUgbXVsIGluc3RydWN0aW9uIHByb2R1Y2VzIHRoZSBhY2N1bXVsYXRvciBmb3IgdGhlIG1hYworICAgICBpbnN0cnVjdGlvbi4gKi8KKyAgaWYgKHJ0eF9lcXVhbF9wCisgICAgICAoU0VUX0RFU1QgKFBBVFRFUk4gKGluc25fb3V0KSksIFNFVF9ERVNUIChQQVRURVJOIChpbnNuX2luKSkpKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQKK2F2cjMyX3N0b3JlX2J5cGFzcyAocnR4IGluc25fb3V0LCBydHggaW5zbl9pbikKK3sKKyAgLyogT25seSB2YWxpZCBieXBhc3MgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgdXNlZCBhcyBhbiBzcmMgaW4gdGhlIHN0b3JlCisgICAgIGluc3RydWN0aW9uLCBOT1QgaWYgdXNlZCBhcyBhIHBvaW50ZXIgb3IgYmFzZS4gKi8KKyAgaWYgKHJ0eF9lcXVhbF9wCisgICAgICAoU0VUX0RFU1QgKFBBVFRFUk4gKGluc25fb3V0KSksIFNFVF9TUkMgKFBBVFRFUk4gKGluc25faW4pKSkpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworaW50CithdnIzMl9tdWxfd2F3X2J5cGFzcyAocnR4IGluc25fb3V0LCBydHggaW5zbl9pbikKK3sKKyAgLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIHJlc3VsdCBmcm9tIHRoZSBtdWwgaW5zdHJ1Y3Rpb24gaXMKKyAgICAgdXNlZCBhcyBhIHJlc3VsdCByZWdpc3RlciBpbiB0aGUgaW5wdXQgaW5zdHJ1Y3Rpb24uICovCisgIGlmIChydHhfZXF1YWxfcAorICAgICAgKFNFVF9ERVNUIChQQVRURVJOIChpbnNuX291dCkpLCBTRVRfREVTVCAoUEFUVEVSTiAoaW5zbl9pbikpKSkKKyAgICB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQKK2F2cjMyX3ZhbGlkX2xvYWRfZG91YmxlX2J5cGFzcyAocnR4IGluc25fb3V0LCBydHggaW5zbl9pbikKK3sKKyAgLyogQ2hlY2sgaWYgdGhlIGZpcnN0IGxvYWRlZCB3b3JkIGluIGluc25fb3V0IGlzIHVzZWQgaW4gaW5zbl9pbi4gKi8KKyAgcnR4IGRzdF9yZWc7CisgIHJ0eCBzZWNvbmRfbG9hZGVkX3JlZzsKKworICAvKiBJZiB0aGlzIGlzIGEgZG91YmxlIGFsdSBvcGVyYXRpb24gdGhlbiB0aGUgYnlwYXNzIGlzIG5vdCB2YWxpZCAqLworICBpZiAoKGdldF9hdHRyX3R5cGUgKGluc25faW4pID09IFRZUEVfQUxVCisgICAgICAgfHwgZ2V0X2F0dHJfdHlwZSAoaW5zbl9pbikgPT0gVFlQRV9BTFUyKQorICAgICAgJiYgKEdFVF9NT0RFX1NJWkUgKEdFVF9NT0RFIChTRVRfREVTVCAoUEFUVEVSTiAoaW5zbl9vdXQpKSkpID4gNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaW4gdGhlIGxvYWQgKi8KKyAgaWYgKCFSRUdfUCAoU0VUX0RFU1QgKFBBVFRFUk4gKGluc25fb3V0KSkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkc3RfcmVnID0gU0VUX0RFU1QgKFBBVFRFUk4gKGluc25fb3V0KSk7CisgIHNlY29uZF9sb2FkZWRfcmVnID0gZ2VuX3J0eF9SRUcgKFNJbW9kZSwgUkVHTk8gKGRzdF9yZWcpICsgMSk7CisKKyAgaWYgKCFyZWdfbWVudGlvbmVkX3AgKHNlY29uZF9sb2FkZWRfcmVnLCBQQVRURVJOIChpbnNuX2luKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisKK2ludAorYXZyMzJfdmFsaWRfbG9hZF9xdWFkX2J5cGFzcyAocnR4IGluc25fb3V0LCBydHggaW5zbl9pbikKK3sKKyAgLyoKKyAgICAgQ2hlY2sgaWYgdGhlIHR3byBmaXJzdCBsb2FkZWQgd29yZCBpbiBpbnNuX291dCBhcmUgdXNlZCBpbiBpbnNuX2luLiAqLworICBydHggZHN0X3JlZzsKKyAgcnR4IHRoaXJkX2xvYWRlZF9yZWcsIGZvdXJ0aF9sb2FkZWRfcmVnOworCisgIC8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaW4gdGhlIGxvYWQgKi8KKyAgaWYgKCFSRUdfUCAoU0VUX0RFU1QgKFBBVFRFUk4gKGluc25fb3V0KSkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkc3RfcmVnID0gU0VUX0RFU1QgKFBBVFRFUk4gKGluc25fb3V0KSk7CisgIHRoaXJkX2xvYWRlZF9yZWcgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBSRUdOTyAoZHN0X3JlZykgKyAyKTsKKyAgZm91cnRoX2xvYWRlZF9yZWcgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBSRUdOTyAoZHN0X3JlZykgKyAzKTsKKworICBpZiAoIXJlZ19tZW50aW9uZWRfcCAodGhpcmRfbG9hZGVkX3JlZywgUEFUVEVSTiAoaW5zbl9pbikpCisgICAgICAmJiAhcmVnX21lbnRpb25lZF9wIChmb3VydGhfbG9hZGVkX3JlZywgUEFUVEVSTiAoaW5zbl9pbikpKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKworCitydHgKK2F2cjMyX2lmY3Z0X21vZGlmeV90ZXN0IChjZV9pZl9ibG9ja190ICpjZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eCB0ZXN0ICl7CisgIHJ0eCBicmFuY2hfaW5zbjsKKyAgcnR4IGNtcF90ZXN0OworICBydHggY29tcGFyZV9vcDA7CisgIHJ0eCBjb21wYXJlX29wMTsKKworCisgIGlmICggIWNlX2luZm8KKyAgICAgICB8fCB0ZXN0ID09IE5VTExfUlRYCisgICAgICAgfHwgIXJlZ19tZW50aW9uZWRfcCAoY2MwX3J0eCwgdGVzdCkpCisgICAgcmV0dXJuIHRlc3Q7CisKKyAgYnJhbmNoX2luc24gPSBCQl9FTkQgKGNlX2luZm8tPnRlc3RfYmIpOworICBjbXBfdGVzdCA9IFBBVFRFUk4ocHJldl9ub25ub3RlX2luc24gKGJyYW5jaF9pbnNuKSk7CisKKyAgaWYgKEdFVF9DT0RFKGNtcF90ZXN0KSAhPSBTRVQKKyAgICAgIHx8ICFDQzBfUChYRVhQKGNtcF90ZXN0LCAwKSkgKQorICAgIHJldHVybiBjbXBfdGVzdDsKKworICBpZiAoIEdFVF9DT0RFKFNFVF9TUkMoY21wX3Rlc3QpKSA9PSBDT01QQVJFICl7CisgICAgY29tcGFyZV9vcDAgPSBYRVhQKFNFVF9TUkMoY21wX3Rlc3QpLCAwKTsKKyAgICBjb21wYXJlX29wMSA9IFhFWFAoU0VUX1NSQyhjbXBfdGVzdCksIDEpOworICB9IGVsc2UgeworICAgIGNvbXBhcmVfb3AwID0gU0VUX1NSQyhjbXBfdGVzdCk7CisgICAgY29tcGFyZV9vcDEgPSBjb25zdDBfcnR4OworICB9CisKKyAgcmV0dXJuIGdlbl9ydHhfZm10X2VlIChHRVRfQ09ERSh0ZXN0KSwgR0VUX01PREUgKGNvbXBhcmVfb3AwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlX29wMCwgY29tcGFyZV9vcDEpOworfQorCisKKworcnR4CithdnIzMl9pZmN2dF9tb2RpZnlfaW5zbiAoY2VfaWZfYmxvY2tfdCAqY2VfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBydHggcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBydHggaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV90cnVlX2NoYW5nZXMpeworICBydHggdGVzdCA9IENPTkRfRVhFQ19URVNUKHBhdHRlcm4pOworICBydHggb3AgPSBDT05EX0VYRUNfQ09ERShwYXR0ZXJuKTsKKyAgcnR4IGNtcF9pbnNuOworICBydHggY29uZF9leGVjX2luc247CisgIGludCBpbnB1dHNfc2V0X291dHNpZGVfaWZibG9jayA9IDE7CisgIGJhc2ljX2Jsb2NrIGN1cnJlbnRfYmIgPSBCTE9DS19GT1JfSU5TTiAoaW5zbik7CisgIHJ0eCBiYl9pbnNuIDsKKyAgZW51bSBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChYRVhQIChvcCwgMCkpOworCisgIGlmIChDQzBfUChYRVhQKHRlc3QsIDApKSkKKyAgICB0ZXN0ID0gYXZyMzJfaWZjdnRfbW9kaWZ5X3Rlc3QgKGNlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ICk7CisKKyAgcGF0dGVybiA9IGdlbl9ydHhfQ09ORF9FWEVDIChWT0lEbW9kZSwgdGVzdCwgb3ApOworCisgIGlmICggIXJlbG9hZF9jb21wbGV0ZWQgKQorICAgIHsKKyAgICAgIHJ0eCBzdGFydDsKKyAgICAgIGludCBudW1faW5zbnM7CisgICAgICBpbnQgbWF4X2luc25zID0gTUFYX0NPTkRJVElPTkFMX0VYRUNVVEU7CisKKyAgICAgIGlmICggIWNlX2luZm8gKQorICAgICAgICByZXR1cm4gb3A7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBpbnNuIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29uZGl0aW9uYWwKKyAgICAgICAgIGV4ZWN1dGlvbi4gKi8KKyAgICAgIHN0YXJ0X3NlcXVlbmNlICgpOworICAgICAgY29uZF9leGVjX2luc24gPSBlbWl0X2luc24gKHBhdHRlcm4pOworICAgICAgaWYgKCByZWNvZ19tZW1vaXplZCAoY29uZF9leGVjX2luc24pIDwgMAorICAgICAgICAgICAmJiAhbm9fbmV3X3BzZXVkb3MgKQorICAgICAgICB7CisgICAgICAgICAgLyogSW5zbiBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiwgdHJ5CisgICAgICAgICAgICAgdG8gZml4IGl0IHVwIGJ5IHVzaW5nIGFuIGV4dHJhIHNjcmF0Y2ggcmVnaXN0ZXIgb3IKKyAgICAgICAgICAgICBieSBwdWxsaW5nIHRoZSBvcGVyYXRpb24gb3V0c2lkZSB0aGUgaWYtdGhlbi1lbHNlCisgICAgICAgICAgICAgYW5kIHRoZW4gZW1pdGluZyBhIGNvbmRpdGlvbmFsIG1vdmUgaW5zaWRlIHRoZSBpZi10aGVuLWVsc2UuICovCisgICAgICAgICAgZW5kX3NlcXVlbmNlICgpOworICAgICAgICAgIGlmICggR0VUX0NPREUgKG9wKSAhPSBTRVQKKyAgICAgICAgICAgICAgIHx8ICFSRUdfUCAoU0VUX0RFU1QgKG9wKSkKKyAgICAgICAgICAgICAgIHx8IEdFVF9DT0RFIChTRVRfU1JDIChvcCkpID09IElGX1RIRU5fRUxTRQorICAgICAgICAgICAgICAgfHwgR0VUX01PREVfU0laRSAobW9kZSkgPiBVTklUU19QRVJfV09SRCApCisgICAgICAgICAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgICAgICAgICAvKiBDaGVjayBpZiBhbnkgb2YgdGhlIGlucHV0IG9wZXJhbmRzIHRvIHRoZSBpbnNuIGlzIHNldCBpbnNpZGUgdGhlCisgICAgICAgICAgICAgY3VycmVudCBibG9jay4gKi8KKyAgICAgICAgICBpZiAoIGN1cnJlbnRfYmItPmluZGV4ID09IGNlX2luZm8tPnRoZW5fYmItPmluZGV4ICkKKyAgICAgICAgICAgIHN0YXJ0ID0gUFJFVl9JTlNOIChCQl9IRUFEIChjZV9pbmZvLT50aGVuX2JiKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhcnQgPSBQUkVWX0lOU04gKEJCX0hFQUQgKGNlX2luZm8tPmVsc2VfYmIpKTsKKworCisgICAgICAgICAgZm9yICggYmJfaW5zbiA9IG5leHRfbm9ubm90ZV9pbnNuIChzdGFydCk7IGJiX2luc24gIT0gaW5zbjsgYmJfaW5zbiA9IG5leHRfbm9ubm90ZV9pbnNuIChiYl9pbnNuKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJ0eCBzZXQgPSBzaW5nbGVfc2V0IChiYl9pbnNuKTsKKworICAgICAgICAgICAgICBpZiAoIHNldCAmJiByZWdfbWVudGlvbmVkX3AgKFNFVF9ERVNUIChzZXQpLCBTRVRfU1JDIChvcCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlucHV0c19zZXRfb3V0c2lkZV9pZmJsb2NrID0gMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNtcF9pbnNuID0gcHJldl9ub25ub3RlX2luc24gKEJCX0VORCAoY2VfaW5mby0+dGVzdF9iYikpOworCisKKyAgICAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gaW5zZXJ0IG1vcmUgaW5zbnMuICovCisgICAgICAgICAgbnVtX2luc25zID0gKCBjZV9pbmZvLT5udW1fdGhlbl9pbnNucyArCisgICAgICAgICAgICAgICAgICAgICAgICBjZV9pbmZvLT5udW1fZWxzZV9pbnNucyArCisgICAgICAgICAgICAgICAgICAgICAgICBjZV9pbmZvLT5udW1fY29uZF9jbG9iYmVyX2luc25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlX2luZm8tPm51bV9leHRyYV9tb3ZlX2luc25zICk7CisKKyAgICAgICAgICBpZiAoIGNlX2luZm8tPm51bV9lbHNlX2luc25zICE9IDAgKQorICAgICAgICAgICAgbWF4X2luc25zICo9MjsKKworICAgICAgICAgIGlmICggbnVtX2luc25zID49IG1heF9pbnNucyApCisgICAgICAgICAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgICAgICAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFuIGluc3RydWN0aW9uIHdoaWNoIG1pZ2h0IGJlIGNvbnZlcnRlZCB0bworICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGZvcm0gaWYgd2UgZ2l2ZSBpdCBhIHNjcmF0Y2ggcmVnaXN0ZXIgdG8gY2xvYmJlci4gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBydHggY2xvYmJlcl9pbnNuOworICAgICAgICAgICAgcnR4IHNjcmF0Y2hfcmVnID0gZ2VuX3JlZ19ydHggKG1vZGUpOworICAgICAgICAgICAgcnR4IG5ld19wYXR0ZXJuID0gY29weV9ydHggKHBhdHRlcm4pOworICAgICAgICAgICAgcnR4IHNldF9zcmMgPSBTRVRfU1JDIChDT05EX0VYRUNfQ09ERSAobmV3X3BhdHRlcm4pKTsKKworICAgICAgICAgICAgcnR4IGNsb2JiZXIgPSBnZW5fcnR4X0NMT0JCRVIgKG1vZGUsIHNjcmF0Y2hfcmVnKTsKKyAgICAgICAgICAgIHJ0eCB2ZWNbMl0gPSB7IENPTkRfRVhFQ19DT0RFIChuZXdfcGF0dGVybiksIGNsb2JiZXIgfTsKKyAgICAgICAgICAgIENPTkRfRVhFQ19DT0RFIChuZXdfcGF0dGVybikgPSBnZW5fcnR4X1BBUkFMTEVMIChtb2RlLCBnZW5fcnR2ZWNfdiAoMiwgdmVjKSk7CisKKyAgICAgICAgICAgIHN0YXJ0X3NlcXVlbmNlICgpOworICAgICAgICAgICAgY2xvYmJlcl9pbnNuID0gZW1pdF9pbnNuIChuZXdfcGF0dGVybik7CisKKyAgICAgICAgICAgIGlmICggcmVjb2dfbWVtb2l6ZWQgKGNsb2JiZXJfaW5zbikgPj0gMAorICAgICAgICAgICAgICAgICAmJiAoICggR0VUX1JUWF9MRU5HVEggKEdFVF9DT0RFIChzZXRfc3JjKSkgPT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKHNldF9zcmMsIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoSU5UVkFMIChYRVhQIChzZXRfc3JjLCAxKSksICdLJywgIktzMDgiKSApCisgICAgICAgICAgICAgICAgICAgICAgfHwgIWNlX2luZm8tPmVsc2VfYmIKKyAgICAgICAgICAgICAgICAgICAgICB8fCBjdXJyZW50X2JiLT5pbmRleCA9PSBjZV9pbmZvLT5lbHNlX2JiLT5pbmRleCApKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kX3NlcXVlbmNlICgpOworICAgICAgICAgICAgICAgIC8qIEZvcmNlIHRoZSBpbnNuIHRvIGJlIHJlY29nbml6ZWQgYWdhaW4uICovCisgICAgICAgICAgICAgICAgSU5TTl9DT0RFIChpbnNuKSA9IC0xOworCisgICAgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2hhbmdlIGluIHRoaXMgSUYtYmxvY2sgdGhlbgorICAgICAgICAgICAgICAgICAgIHNpZ25hbCB0aGF0IHdlIGhhdmUgbWFkZSBhIGNoYW5nZS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoIGNlX2luZm8tPm51bV9jb25kX2Nsb2JiZXJfaW5zbnMgPT0gMAorICAgICAgICAgICAgICAgICAgICAgJiYgY2VfaW5mby0+bnVtX2V4dHJhX21vdmVfaW5zbnMgPT0gMCApCisgICAgICAgICAgICAgICAgICAqbnVtX3RydWVfY2hhbmdlcyArPSAxOworCisgICAgICAgICAgICAgICAgY2VfaW5mby0+bnVtX2NvbmRfY2xvYmJlcl9pbnNucysrOworCisgICAgICAgICAgICAgICAgaWYgKGR1bXBfZmlsZSkKKyAgICAgICAgICAgICAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblJlcGxhY2luZyBJTlNOICVkIHdpdGggYW4gaW5zbiB1c2luZyBhIHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIGxhdGVyIGlmY3Z0IHBhc3Nlcy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOU05fVUlEIChpbnNuKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09ORF9FWEVDX0NPREUgKG5ld19wYXR0ZXJuKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kX3NlcXVlbmNlICgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICggaW5wdXRzX3NldF9vdXRzaWRlX2lmYmxvY2sgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgaW5zbiBiZWZvcmUgdGhlIGNtcCBpcyBhbiBhbmQgd2hpY2ggdXNlZAorICAgICAgICAgICAgICAgICB0b2dldGhlciB3aXRoIHRoZSBjbXAgY2FuIGJlIG9wdGltaXplZCBpbnRvIGEgYmxkLiBJZgorICAgICAgICAgICAgICAgICBzbyB0aGVuIHdlIHNob3VsZCB0cnkgdG8gcHV0IHRoZSBpbnNuIGJlZm9yZSB0aGUgYW5kCisgICAgICAgICAgICAgICAgIHNvIHRoYXQgd2UgY2FuIGNhdGNoIHRoZSBibGQgcGVlcGhvbGUuICovCisgICAgICAgICAgICAgIHJ0eCBzZXQ7CisgICAgICAgICAgICAgIHJ0eCBpbnNuX2JlZm9yZV9jbXBfaW5zbiA9IHByZXZfbm9ubm90ZV9pbnNuIChjbXBfaW5zbik7CisgICAgICAgICAgICAgIGlmIChpbnNuX2JlZm9yZV9jbXBfaW5zbgorICAgICAgICAgICAgICAgICAgJiYgKHNldCA9IHNpbmdsZV9zZXQgKGluc25fYmVmb3JlX2NtcF9pbnNuKSkKKyAgICAgICAgICAgICAgICAgICYmIEdFVF9DT0RFIChTRVRfU1JDIChzZXQpKSA9PSBBTkQKKyAgICAgICAgICAgICAgICAgICYmIG9uZV9iaXRfc2V0X29wZXJhbmQgKFhFWFAgKFNFVF9TUkMgKHNldCksIDEpLCBTSW1vZGUpCisgICAgICAgICAgICAgICAgICAvKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbnNuIGRvZXMgbm90IHNldCBhbnkKKyAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBpbnB1dCBvcGVyYW5kcyB0byB0aGUgaW5zbiB3ZSBhcmUgcHVsbGluZyBvdXQuICovCisgICAgICAgICAgICAgICAgICAmJiAhcmVnX21lbnRpb25lZF9wIChTRVRfREVTVCAoc2V0KSwgU0VUX1NSQyAob3ApKSApCisgICAgICAgICAgICAgICAgY21wX2luc24gPSBwcmV2X25vbm5vdGVfaW5zbiAoY21wX2luc24pOworCisgICAgICAgICAgICAgIC8qIFdlIGNhbiB0cnkgdG8gcHV0IHRoZSBvcGVyYXRpb24gb3V0c2lkZSB0aGUgaWYtdGhlbi1lbHNlCisgICAgICAgICAgICAgICAgIGJsb2NrcyBhbmQgaW5zZXJ0IGEgbW92ZS4gKi8KKyAgICAgICAgICAgICAgaWYgKCAhaW5zbl9pbnZhbGlkX3AgKGluc24pCisgICAgICAgICAgICAgICAgICAgLyogRG8gbm90IGFsbG93IGNvbmRpdGlvbmFsIGluc25zIHRvIGJlIG1vdmVkIG91dHNpZGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgaWYtdGhlbi1lbHNlLiAqLworICAgICAgICAgICAgICAgICAgICYmICFyZWdfbWVudGlvbmVkX3AgKGNjMF9ydHgsIGluc24pCisgICAgICAgICAgICAgICAgICAgLyogV2UgY2Fubm90IG1vdmUgbWVtb3J5IGxvYWRzIG91dHNpZGUgb2YgdGhlIGlmLXRoZW4tZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBtZW1vcnkgYWNjZXNzIHNob3VsZCBub3QgYmUgcGVyZm9tZWQgaWYgdGhlCisgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uIGlzIG5vdCBtZXQuICovCisgICAgICAgICAgICAgICAgICAgJiYgIW1lbV9tZW50aW9uZWRfcCAoU0VUX1NSQyAob3ApKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcnR4IHNjcmF0Y2hfcmVnID0gZ2VuX3JlZ19ydHggKG1vZGUpOworICAgICAgICAgICAgICAgICAgcnR4IG9wX3BhdHRlcm4gPSBjb3B5X3J0eCAob3ApOworICAgICAgICAgICAgICAgICAgcnR4IG5ld19pbnNuLCBzZXE7CisgICAgICAgICAgICAgICAgICBydHggbGluaywgcHJldl9saW5rOworICAgICAgICAgICAgICAgICAgb3AgPSBjb3B5X3J0eCAob3ApOworICAgICAgICAgICAgICAgICAgLyogRW1pdCB0aGUgb3BlcmF0aW9uIHRvIGEgdGVtcCByZWcgYmVmb3JlIHRoZSBjb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgYW5kIGVtaXQgYSBtb3ZlIGluc2lkZSB0aGUgaWYtdGhlbi1lbHNlLCBob3BpbmcgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHdob2xlIGlmLXRoZW4tZWxzZSBjYW4gYmUgY29udmVydGVkIHRvIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24uICovCisgICAgICAgICAgICAgICAgICBTRVRfREVTVCAob3BfcGF0dGVybikgPSBzY3JhdGNoX3JlZzsKKyAgICAgICAgICAgICAgICAgIHN0YXJ0X3NlcXVlbmNlICgpOworICAgICAgICAgICAgICAgICAgbmV3X2luc24gPSBlbWl0X2luc24gKG9wX3BhdHRlcm4pOworICAgICAgICAgICAgICAgICAgc2VxID0gZ2V0X2luc25zKCk7CisgICAgICAgICAgICAgICAgICBlbmRfc2VxdWVuY2UgKCk7CisKKyAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGFnYWluIHRoYXQgdGhlIGluc24gaXMgdmFsaWQuIEZvciBzb21lIGluc25zIHRoZSBpbnNuIG1pZ2h0CisgICAgICAgICAgICAgICAgICAgICBiZWNvbWUgaW52YWxpZCBpZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgY2hhbmdlZC4gSWUuIGZvciBtdWxhY2MKKyAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuICovCisgICAgICAgICAgICAgICAgICBpZiAoIGluc25faW52YWxpZF9wIChuZXdfaW5zbikgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgICAgICAgICAgICAgICAgIGVtaXRfaW5zbl9iZWZvcmVfc2V0bG9jIChzZXEsIGNtcF9pbnNuLCBJTlNOX0xPQ0FUT1IgKGluc24pKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGR1bXBfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZHVtcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5Nb3ZpbmcgSU5TTiAlZCBvdXQgb2YgSUYtYmxvY2sgYnkgYWRkaW5nIElOU04gJWQuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOU05fVUlEIChpbnNuKSwgSU5TTl9VSUQgKG5ld19pbnNuKSk7CisKKyAgICAgICAgICAgICAgICAgIGNlX2luZm8tPmV4dHJhX21vdmVfaW5zbnNbY2VfaW5mby0+bnVtX2V4dHJhX21vdmVfaW5zbnNdID0gaW5zbjsKKyAgICAgICAgICAgICAgICAgIGNlX2luZm8tPm1vdmVkX2luc25zW2NlX2luZm8tPm51bV9leHRyYV9tb3ZlX2luc25zXSA9IG5ld19pbnNuOworICAgICAgICAgICAgICAgICAgWEVYUCAob3AsIDEpID0gc2NyYXRjaF9yZWc7CisgICAgICAgICAgICAgICAgICAvKiBGb3JjZSB0aGUgaW5zbiB0byBiZSByZWNvZ25pemVkIGFnYWluLiAqLworICAgICAgICAgICAgICAgICAgSU5TTl9DT0RFIChpbnNuKSA9IC0xOworCisgICAgICAgICAgICAgICAgICAvKiBNb3ZlIFJFR19ERUFEIG5vdGVzIHRvIHRoZSBtb3ZlZCBpbnNuLiAqLworICAgICAgICAgICAgICAgICAgcHJldl9saW5rID0gTlVMTF9SVFg7CisgICAgICAgICAgICAgICAgICBmb3IgKGxpbmsgPSBSRUdfTk9URVMgKGluc24pOyBsaW5rOyBsaW5rID0gWEVYUCAobGluaywgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVHX05PVEVfS0lORCAobGluaykgPT0gUkVHX0RFQUQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCB0aGUgUkVHX0RFQUQgbm90ZSB0byB0aGUgbmV3IGluc24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eCBkZWFkX3JlZyA9IFhFWFAgKGxpbmssIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfTk9URVMgKG5ld19pbnNuKSA9IGdlbl9ydHhfRVhQUl9MSVNUIChSRUdfREVBRCwgZGVhZF9yZWcsIFJFR19OT1RFUyAobmV3X2luc24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoZSBSRUdfREVBRCBub3RlIGZyb20gdGhlIGluc24gd2UgY29udmVydCB0byBhIG1vdmUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJldl9saW5rICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRVhQIChwcmV2X2xpbmssIDEpID0gWEVYUCAobGluaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfTk9URVMgKGluc24pID0gWEVYUCAobGluaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2xpbmsgPSBsaW5rOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAvKiBBZGQgYSBSRUdfREVBRCBub3RlIHRvIHNpZ25hbCB0aGF0IHRoZSBzY3JhdGNoIHJlZ2lzdGVyIGlzIGRlYWQuICovCisgICAgICAgICAgICAgICAgICBSRUdfTk9URVMgKGluc24pID0gZ2VuX3J0eF9FWFBSX0xJU1QgKFJFR19ERUFELCBzY3JhdGNoX3JlZywgUkVHX05PVEVTIChpbnNuKSk7CisKKyAgICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNoYW5nZSBpbiB0aGlzIElGLWJsb2NrIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCB0aGF0IHdlIGhhdmUgbWFkZSBhIGNoYW5nZS4gKi8KKyAgICAgICAgICAgICAgICAgIGlmICggY2VfaW5mby0+bnVtX2NvbmRfY2xvYmJlcl9pbnNucyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICYmIGNlX2luZm8tPm51bV9leHRyYV9tb3ZlX2luc25zID09IDAgKQorICAgICAgICAgICAgICAgICAgICAqbnVtX3RydWVfY2hhbmdlcyArPSAxOworCisgICAgICAgICAgICAgICAgICBjZV9pbmZvLT5udW1fZXh0cmFfbW92ZV9pbnNucysrOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFdlIGZhaWxlZCB0byBmaXh1cCB0aGUgaW5zbnMsIHNvIHRoaXMgaWYtdGhlbi1lbHNlIGNhbiBub3QgYmUgbWFkZQorICAgICAgICAgICAgIGNvbmRpdGlvbmFsLiBKdXN0IHJldHVybiBOVUxMX1JUWCBzbyB0aGF0IHRoZSBpZi10aGVuLWVsc2UgY29udmVyc2lvbgorICAgICAgICAgICAgIGZvciB0aGlzIGlmLXRoZW4tZWxzZSB3aWxsIGJlIGNhbmNlbGxlZC4gKi8KKyAgICAgICAgICByZXR1cm4gTlVMTF9SVFg7CisgICAgICAgIH0KKyAgICAgIGVuZF9zZXF1ZW5jZSAoKTsKKyAgICAgIHJldHVybiBvcDsKKyAgICB9CisKKyAgLyogU2lnbmFsIHRoYXQgd2UgaGF2ZSBzdGFydGVkIGlmIGNvbnZlcnNpb24gYWZ0ZXIgcmVsb2FkLCB3aGljaCBtZWFucworICAgICB0aGF0IGl0IHNob3VsZCBiZSBzYWZlIHRvIHNwbGl0IGFsbCB0aGUgcHJlZGljYWJsZSBjbG9iYmVyIGluc25zIHdoaWNoCisgICAgIGRpZCBub3QgYmVjb21lIGNvbmRfZXhlYyBiYWNrIGludG8gYSBzaW1wbGVyIGZvcm0gaWYgcG9zc2libGUuICovCisgIGNmdW4tPm1hY2hpbmUtPmlmY3Z0X2FmdGVyX3JlbG9hZCA9IDE7CisKKyAgcmV0dXJuIHBhdHRlcm47Cit9CisKKwordm9pZAorYXZyMzJfaWZjdnRfbW9kaWZ5X2NhbmNlbCAoIGNlX2lmX2Jsb2NrX3QgKmNlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fdHJ1ZV9jaGFuZ2VzKQoreworICBpbnQgbjsKKworICBpZiAoIGNlX2luZm8tPm51bV9leHRyYV9tb3ZlX2luc25zID4gMAorICAgICAgICYmIGNlX2luZm8tPm51bV9jb25kX2Nsb2JiZXJfaW5zbnMgPT0gMCkKKyAgICAvKiBTaWduYWwgdGhhdCB3ZSBkaWQgbm90IGRvIGFueSBjaGFuZ2VzIGFmdGVyIGFsbC4gKi8KKyAgICAqbnVtX3RydWVfY2hhbmdlcyAtPSAxOworCisgIC8qIFJlbW92ZSBhbnkgaW5zZXJ0ZWQgbW92ZSBpbnNucy4gKi8KKyAgZm9yICggbiA9IDA7IG4gPCBjZV9pbmZvLT5udW1fZXh0cmFfbW92ZV9pbnNuczsgbisrICkKKyAgICB7CisgICAgICBydHggbGluaywgcHJldl9saW5rOworCisgICAgICAvKiBSZW1vdmUgUkVHX0RFQUQgbm90ZSBzaW5jZSB3ZSBhcmUgbm90IG5lZWRpbmcgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgYW55d2F5LiAqLworICAgICAgcHJldl9saW5rID0gTlVMTF9SVFg7CisgICAgICBmb3IgKGxpbmsgPSBSRUdfTk9URVMgKGNlX2luZm8tPmV4dHJhX21vdmVfaW5zbnNbbl0pOyBsaW5rOyBsaW5rID0gWEVYUCAobGluaywgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoUkVHX05PVEVfS0lORCAobGluaykgPT0gUkVHX0RFQUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICggcHJldl9saW5rICkKKyAgICAgICAgICAgICAgICBYRVhQIChwcmV2X2xpbmssIDEpID0gWEVYUCAobGluaywgMSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBSRUdfTk9URVMgKGNlX2luZm8tPmV4dHJhX21vdmVfaW5zbnNbbl0pID0gWEVYUCAobGluaywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmV2X2xpbmsgPSBsaW5rOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIFJldmVydCBhbGwgcmVnX25vdGVzIGZvciB0aGUgbW92ZWQgaW5zbi4gKi8KKyAgICAgIGZvciAobGluayA9IFJFR19OT1RFUyAoY2VfaW5mby0+bW92ZWRfaW5zbnNbbl0pOyBsaW5rOyBsaW5rID0gWEVYUCAobGluaywgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBSRUdfTk9URVMgKGNlX2luZm8tPmV4dHJhX21vdmVfaW5zbnNbbl0pID0gZ2VuX3J0eF9FWFBSX0xJU1QgKFJFR19OT1RFX0tJTkQgKGxpbmspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVYUCAobGluaywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfTk9URVMgKGNlX2luZm8tPmV4dHJhX21vdmVfaW5zbnNbbl0pKTsKKyAgICAgICAgfQorCisgICAgICAvKiBSZW1vdmUgdGhlIG1vdmVkIGluc24uICovCisgICAgICByZW1vdmVfaW5zbiAoIGNlX2luZm8tPm1vdmVkX2luc25zW25dICk7CisgICAgfQorfQorCisvKiBGdW5jdGlvbiByZXR1cm5pbmcgVFJVRSBpZiBJTlNOIHdpdGggT1BFUkFORFMgaXMgYSBzcGxpdHRhYmxlCisgICBjb25kaXRpb25hbCBpbW1lZGlhdGUgY2xvYmJlciBpbnNuLiBXZSBhc3N1bWUgdGhhdCB0aGUgaW5zbiBpcworICAgYWxyZWFkeSBhIGNvbmRpdGlvbmFsIGltbWVkaWF0ZSBjbG9iYmVyIGluc25zIGFuZCBkbyBub3QgY2hlY2sKKyAgIGZvciB0aGF0LiAqLworaW50CithdnIzMl9jb25kX2ltbV9jbG9iYmVyX3NwbGl0dGFibGUgKHJ0eCBpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHggb3BlcmFuZHNbXSkKK3sKKyAgaWYgKCAoUkVHTk8gKG9wZXJhbmRzWzBdKSAhPSBSRUdOTyAob3BlcmFuZHNbMV0pKQorICAgICAgICYmIChsb2dpY2FsX2JpbmFyeV9vcGVyYXRvciAoU0VUX1NSQyAoWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksMCwwKSksIFZPSURtb2RlKQorICAgICAgICAgICB8fCAoR0VUX0NPREUgKFNFVF9TUkMgKFhWRUNFWFAgKFBBVFRFUk4gKGluc24pLDAsMCkpKSA9PSBQTFVTCisgICAgICAgICAgICAgICAmJiAhYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoSU5UVkFMIChvcGVyYW5kc1syXSksICdJJywgIklzMTYiKSkKKyAgICAgICAgICAgfHwgKEdFVF9DT0RFIChTRVRfU1JDIChYVkVDRVhQIChQQVRURVJOIChpbnNuKSwwLDApKSkgPT0gTUlOVVMKKyAgICAgICAgICAgICAgICYmICFhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChJTlRWQUwgKG9wZXJhbmRzWzJdKSwgJ0snLCAiS3MxNiIpKSkgKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogRnVuY3Rpb24gZm9yIGdldHRpbmcgYW4gaW50ZWdlciB2YWx1ZSBmcm9tIGEgY29uc3RfaW50IG9yIGNvbnN0X2RvdWJsZQorICAgZXhwcmVzc2lvbiByZWdhcmRsZXNzIG9mIHRoZSBIT1NUX1dJREVfSU5UIHNpemUuIEVhY2ggdGFyZ2V0IGNwdSB3b3JkCisgICB3aWxsIGJlIHB1dCBpbnRvIHRoZSB2YWwgYXJyYXkgd2hlcmUgdGhlIExTVyB3aWxsIGJlIHN0b3JlZCBhdCB0aGUgbG93ZXN0CisgICBhZGRyZXNzIGFuZCBzbyBmb3J0aC4gQXNzdW1lcyB0aGF0IGNvbnN0X2V4cHIgaXMgZWl0aGVyIGEgY29uc3RfaW50IG9yCisgICBjb25zdF9kb3VibGUuIE9ubHkgdmFsaWQgZm9yIG1vZGVzIHdoaWNoIGhhdmUgc2l6ZXMgdGhhdCBhcmUgYSBtdWx0aXBsZQorICAgb2YgdGhlIHdvcmQgc2l6ZS4KKyovCit2b2lkCithdnIzMl9nZXRfaW50dmFsIChlbnVtIG1hY2hpbmVfbW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgcnR4IGNvbnN0X2V4cHIsCisgICAgICAgICAgICAgICAgICBIT1NUX1dJREVfSU5UICp2YWwpCit7CisgIGludCB3b3Jkc19pbl9tb2RlID0gR0VUX01PREVfU0laRSAobW9kZSkvVU5JVFNfUEVSX1dPUkQ7CisgIGNvbnN0IGludCB3b3Jkc19pbl9jb25zdF9pbnQgPSBIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC8gQklUU19QRVJfV09SRDsKKworICBpZiAoIEdFVF9DT0RFKGNvbnN0X2V4cHIpID09IENPTlNUX0RPVUJMRSApeworICAgIEhPU1RfV0lERV9JTlQgaGkgPSBDT05TVF9ET1VCTEVfSElHSChjb25zdF9leHByKTsKKyAgICBIT1NUX1dJREVfSU5UIGxvID0gQ09OU1RfRE9VQkxFX0xPVyhjb25zdF9leHByKTsKKyAgICAvKiBFdmFsdWF0ZSBoaSBhbmQgbG8gdmFsdWVzIG9mIGNvbnN0X2RvdWJsZS4gKi8KKyAgICBhdnIzMl9nZXRfaW50dmFsIChtb2RlX2Zvcl9zaXplIChIT1NUX0JJVFNfUEVSX1dJREVfSU5ULCBNT0RFX0lOVCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgR0VOX0lOVCAobG8pLAorICAgICAgICAgICAgICAgICAgICAgICZ2YWxbMF0pOworICAgIGF2cjMyX2dldF9pbnR2YWwgKG1vZGVfZm9yX3NpemUgKEhPU1RfQklUU19QRVJfV0lERV9JTlQsIE1PREVfSU5ULCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBHRU5fSU5UIChoaSksCisgICAgICAgICAgICAgICAgICAgICAgJnZhbFt3b3Jkc19pbl9jb25zdF9pbnRdKTsKKyAgfSBlbHNlIGlmICggR0VUX0NPREUoY29uc3RfZXhwcikgPT0gQ09OU1RfSU5UICl7CisgICAgSE9TVF9XSURFX0lOVCB2YWx1ZSA9IElOVFZBTChjb25zdF9leHByKTsKKyAgICBpbnQgd29yZDsKKyAgICBmb3IgKCB3b3JkID0gMDsgKHdvcmQgPCB3b3Jkc19pbl9tb2RlKSAmJiAod29yZCA8IHdvcmRzX2luX2NvbnN0X2ludCk7IHdvcmQrKyApeworICAgICAgLyogU2hpZnQgd29yZCB1cCB0byB0aGUgTVNXIGFuZCBzaGlmdCBkb3duIGFnYWluIHRvIGV4dHJhY3QgdGhlCisgICAgICAgICB3b3JkIGFuZCBzaWduLWV4dGVuZC4gKi8KKyAgICAgIGludCBsc2hpZnQgPSAod29yZHNfaW5fY29uc3RfaW50IC0gd29yZCAtIDEpICogQklUU19QRVJfV09SRDsKKyAgICAgIGludCByc2hpZnQgPSAod29yZHNfaW5fY29uc3RfaW50LTEpICogQklUU19QRVJfV09SRDsKKyAgICAgIHZhbFt3b3JkXSA9ICh2YWx1ZSA8PCBsc2hpZnQpID4+IHJzaGlmdDsKKyAgICB9CisKKyAgICBmb3IgKCA7IHdvcmQgPCB3b3Jkc19pbl9tb2RlOyB3b3JkKysgKXsKKyAgICAgIC8qIEp1c3QgcHV0IHRoZSBzaWduIGJpdHMgaW4gdGhlIHJlbWFpbmluZyB3b3Jkcy4gKi8KKyAgICAgIHZhbFt3b3JkXSA9IHZhbHVlIDwgMCA/IC0xIDogMDsKKyAgICB9CisgIH0KK30KKwordm9pZAorYXZyMzJfc3BsaXRfY29uc3RfZXhwciAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbWFjaGluZV9tb2RlIG5ld19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgcnR4IGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICBydHggKnNwbGl0X2V4cHIpCit7CisgIGludCBpLCB3b3JkOworICBpbnQgd29yZHNfaW5faW50dmFsID0gR0VUX01PREVfU0laRSAobW9kZSkvVU5JVFNfUEVSX1dPUkQ7CisgIGludCB3b3Jkc19pbl9zcGxpdF92YWx1ZXMgPSBHRVRfTU9ERV9TSVpFIChuZXdfbW9kZSkvVU5JVFNfUEVSX1dPUkQ7CisgIGNvbnN0IGludCB3b3Jkc19pbl9jb25zdF9pbnQgPSBIT1NUX0JJVFNfUEVSX1dJREVfSU5UIC8gQklUU19QRVJfV09SRDsKKyAgSE9TVF9XSURFX0lOVCAqdmFsID0gYWxsb2NhICh3b3Jkc19pbl9pbnR2YWwgKiBVTklUU19QRVJfV09SRCk7CisKKyAgYXZyMzJfZ2V0X2ludHZhbCAobW9kZSwgZXhwciwgdmFsKTsKKworICBmb3IgKCBpPTA7IGkgPCAod29yZHNfaW5faW50dmFsL3dvcmRzX2luX3NwbGl0X3ZhbHVlcyk7IGkrKyApCisgICAgeworICAgICAgSE9TVF9XSURFX0lOVCB2YWx1ZV9sbyA9IDAsIHZhbHVlX2hpID0gMDsKKyAgICAgIGZvciAoIHdvcmQgPSAwOyB3b3JkIDwgd29yZHNfaW5fc3BsaXRfdmFsdWVzOyB3b3JkKysgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCB3b3JkID49IHdvcmRzX2luX2NvbnN0X2ludCApCisgICAgICAgICAgICB2YWx1ZV9oaSB8PSAoKHZhbFtpICogd29yZHNfaW5fc3BsaXRfdmFsdWVzICsgd29yZF0gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKChIT1NUX1dJREVfSU5UKTEgPDwgQklUU19QRVJfV09SRCktMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKEJJVFNfUEVSX1dPUkQgKiAod29yZCAtIHdvcmRzX2luX2NvbnN0X2ludCkpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZV9sbyB8PSAoKHZhbFtpICogd29yZHNfaW5fc3BsaXRfdmFsdWVzICsgd29yZF0gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKChIT1NUX1dJREVfSU5UKTEgPDwgQklUU19QRVJfV09SRCktMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKEJJVFNfUEVSX1dPUkQgKiB3b3JkKSk7CisgICAgICAgIH0KKyAgICAgIHNwbGl0X2V4cHJbaV0gPSBpbW1lZF9kb3VibGVfY29uc3QodmFsdWVfbG8sIHZhbHVlX2hpLCBuZXdfbW9kZSk7CisgICAgfQorfQorCisKKy8qIFNldCB1cCBsaWJyYXJ5IGZ1bmN0aW9ucyB0byBjb21wbHkgdG8gQVZSMzIgQUJJICAqLworCitzdGF0aWMgdm9pZAorYXZyMzJfaW5pdF9saWJmdW5jcyAodm9pZCkKK3sKKyAgLyogQ29udmVydCBnY2MgcnVuLXRpbWUgZnVuY3Rpb24gbmFtZXMgdG8gQVZSMzIgQUJJIG5hbWVzICovCisKKyAgLyogRG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLiAqLworICBzZXRfb3B0YWJfbGliZnVuYyAobmVnX29wdGFiLCBERm1vZGUsIE5VTEwpOworCisgIC8qIERvdWJsZS1wcmVjaXNpb24gY29tcGFyaXNvbnMuICAqLworICBzZXRfb3B0YWJfbGliZnVuYyAoZXFfb3B0YWIsIERGbW9kZSwgIl9fYXZyMzJfZjY0X2NtcF9lcSIpOworICBzZXRfb3B0YWJfbGliZnVuYyAobmVfb3B0YWIsIERGbW9kZSwgTlVMTCk7CisgIHNldF9vcHRhYl9saWJmdW5jIChsdF9vcHRhYiwgREZtb2RlLCAiX19hdnIzMl9mNjRfY21wX2x0Iik7CisgIHNldF9vcHRhYl9saWJmdW5jIChsZV9vcHRhYiwgREZtb2RlLCBOVUxMKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGdlX29wdGFiLCBERm1vZGUsICJfX2F2cjMyX2Y2NF9jbXBfZ2UiKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGd0X29wdGFiLCBERm1vZGUsIE5VTEwpOworCisgIC8qIFNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4gKi8KKyAgc2V0X29wdGFiX2xpYmZ1bmMgKHNtdWxfb3B0YWIsIFNGbW9kZSwgIl9fYXZyMzJfZjMyX211bCIpOworICBzZXRfb3B0YWJfbGliZnVuYyAobmVnX29wdGFiLCBTRm1vZGUsIE5VTEwpOworCisgIC8qIFNpbmdsZS1wcmVjaXNpb24gY29tcGFyaXNvbnMuICAqLworICBzZXRfb3B0YWJfbGliZnVuYyAoZXFfb3B0YWIsIFNGbW9kZSwgIl9fYXZyMzJfZjMyX2NtcF9lcSIpOworICBzZXRfb3B0YWJfbGliZnVuYyAobmVfb3B0YWIsIFNGbW9kZSwgTlVMTCk7CisgIHNldF9vcHRhYl9saWJmdW5jIChsdF9vcHRhYiwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfY21wX2x0Iik7CisgIHNldF9vcHRhYl9saWJmdW5jIChsZV9vcHRhYiwgU0Ztb2RlLCBOVUxMKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGdlX29wdGFiLCBTRm1vZGUsICJfX2F2cjMyX2YzMl9jbXBfZ2UiKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGd0X29wdGFiLCBTRm1vZGUsIE5VTEwpOworCisgIC8qIEZsb2F0aW5nLXBvaW50IHRvIGludGVnZXIgY29udmVyc2lvbnMuICovCisgIHNldF9jb252X2xpYmZ1bmMgKHNmaXhfb3B0YWIsIFNJbW9kZSwgREZtb2RlLCAiX19hdnIzMl9mNjRfdG9fczMyIik7CisgIHNldF9jb252X2xpYmZ1bmMgKHVmaXhfb3B0YWIsIFNJbW9kZSwgREZtb2RlLCAiX19hdnIzMl9mNjRfdG9fdTMyIik7CisgIHNldF9jb252X2xpYmZ1bmMgKHNmaXhfb3B0YWIsIERJbW9kZSwgREZtb2RlLCAiX19hdnIzMl9mNjRfdG9fczY0Iik7CisgIHNldF9jb252X2xpYmZ1bmMgKHVmaXhfb3B0YWIsIERJbW9kZSwgREZtb2RlLCAiX19hdnIzMl9mNjRfdG9fdTY0Iik7CisgIHNldF9jb252X2xpYmZ1bmMgKHNmaXhfb3B0YWIsIFNJbW9kZSwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfdG9fczMyIik7CisgIHNldF9jb252X2xpYmZ1bmMgKHVmaXhfb3B0YWIsIFNJbW9kZSwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfdG9fdTMyIik7CisgIHNldF9jb252X2xpYmZ1bmMgKHNmaXhfb3B0YWIsIERJbW9kZSwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfdG9fczY0Iik7CisgIHNldF9jb252X2xpYmZ1bmMgKHVmaXhfb3B0YWIsIERJbW9kZSwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfdG9fdTY0Iik7CisKKyAgLyogQ29udmVyc2lvbnMgYmV0d2VlbiBmbG9hdGluZyB0eXBlcy4gICovCisgIHNldF9jb252X2xpYmZ1bmMgKHRydW5jX29wdGFiLCBTRm1vZGUsIERGbW9kZSwgIl9fYXZyMzJfZjY0X3RvX2YzMiIpOworICBzZXRfY29udl9saWJmdW5jIChzZXh0X29wdGFiLCBERm1vZGUsIFNGbW9kZSwgIl9fYXZyMzJfZjMyX3RvX2Y2NCIpOworCisgIC8qIEludGVnZXIgdG8gZmxvYXRpbmctcG9pbnQgY29udmVyc2lvbnMuICBUYWJsZSA4LiAgKi8KKyAgc2V0X2NvbnZfbGliZnVuYyAoc2Zsb2F0X29wdGFiLCBERm1vZGUsIFNJbW9kZSwgIl9fYXZyMzJfczMyX3RvX2Y2NCIpOworICBzZXRfY29udl9saWJmdW5jIChzZmxvYXRfb3B0YWIsIERGbW9kZSwgREltb2RlLCAiX19hdnIzMl9zNjRfdG9fZjY0Iik7CisgIHNldF9jb252X2xpYmZ1bmMgKHNmbG9hdF9vcHRhYiwgU0Ztb2RlLCBTSW1vZGUsICJfX2F2cjMyX3MzMl90b19mMzIiKTsKKyAgc2V0X2NvbnZfbGliZnVuYyAoc2Zsb2F0X29wdGFiLCBTRm1vZGUsIERJbW9kZSwgIl9fYXZyMzJfczY0X3RvX2YzMiIpOworICBzZXRfY29udl9saWJmdW5jICh1ZmxvYXRfb3B0YWIsIERGbW9kZSwgU0ltb2RlLCAiX19hdnIzMl91MzJfdG9fZjY0Iik7CisgIHNldF9jb252X2xpYmZ1bmMgKHVmbG9hdF9vcHRhYiwgU0Ztb2RlLCBTSW1vZGUsICJfX2F2cjMyX3UzMl90b19mMzIiKTsKKyAgLyogVE9ETzogQWRkIHRoZXNlIHRvIGdjYyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLworICAvL3NldF9jb252X2xpYmZ1bmMgKHVmbG9hdF9vcHRhYiwgREZtb2RlLCBESW1vZGUsIE5VTEwpOworICAvL3NldF9jb252X2xpYmZ1bmMgKHVmbG9hdF9vcHRhYiwgU0Ztb2RlLCBESW1vZGUsIE5VTEwpOworCisgIC8qIExvbmcgbG9uZy4gIFRhYmxlIDkuICAqLworICBzZXRfb3B0YWJfbGliZnVuYyAoc211bF9vcHRhYiwgREltb2RlLCAiX19hdnIzMl9tdWw2NCIpOworICBzZXRfb3B0YWJfbGliZnVuYyAoc2Rpdl9vcHRhYiwgREltb2RlLCAiX19hdnIzMl9zZGl2NjQiKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKHVkaXZfb3B0YWIsIERJbW9kZSwgIl9fYXZyMzJfdWRpdjY0Iik7CisgIHNldF9vcHRhYl9saWJmdW5jIChzbW9kX29wdGFiLCBESW1vZGUsICJfX2F2cjMyX3Ntb2Q2NCIpOworICBzZXRfb3B0YWJfbGliZnVuYyAodW1vZF9vcHRhYiwgREltb2RlLCAiX19hdnIzMl91bW9kNjQiKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGFzaGxfb3B0YWIsIERJbW9kZSwgIl9fYXZyMzJfbHNsNjQiKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGxzaHJfb3B0YWIsIERJbW9kZSwgIl9fYXZyMzJfbHNyNjQiKTsKKyAgc2V0X29wdGFiX2xpYmZ1bmMgKGFzaHJfb3B0YWIsIERJbW9kZSwgIl9fYXZyMzJfYXNyNjQiKTsKKworICAvKiBGbG9hdGluZyBwb2ludCBsaWJyYXJ5IGZ1bmN0aW9ucyB3aGljaCBoYXZlIGZhc3QgdmVyc2lvbnMuICovCisgIGlmICggVEFSR0VUX0ZBU1RfRkxPQVQgKQorICAgIHsKKyAgICAgIHNldF9vcHRhYl9saWJmdW5jIChzZGl2X29wdGFiLCBERm1vZGUsICJfX2F2cjMyX2Y2NF9kaXZfZmFzdCIpOworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKHNtdWxfb3B0YWIsIERGbW9kZSwgIl9fYXZyMzJfZjY0X211bF9mYXN0Iik7CisgICAgICBzZXRfb3B0YWJfbGliZnVuYyAoYWRkX29wdGFiLCBERm1vZGUsICJfX2F2cjMyX2Y2NF9hZGRfZmFzdCIpOworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKHN1Yl9vcHRhYiwgREZtb2RlLCAiX19hdnIzMl9mNjRfc3ViX2Zhc3QiKTsKKyAgICAgIHNldF9vcHRhYl9saWJmdW5jIChhZGRfb3B0YWIsIFNGbW9kZSwgIl9fYXZyMzJfZjMyX2FkZF9mYXN0Iik7CisgICAgICBzZXRfb3B0YWJfbGliZnVuYyAoc3ViX29wdGFiLCBTRm1vZGUsICJfX2F2cjMyX2YzMl9zdWJfZmFzdCIpOworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKHNkaXZfb3B0YWIsIFNGbW9kZSwgIl9fYXZyMzJfZjMyX2Rpdl9mYXN0Iik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKHNkaXZfb3B0YWIsIERGbW9kZSwgIl9fYXZyMzJfZjY0X2RpdiIpOworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKHNtdWxfb3B0YWIsIERGbW9kZSwgIl9fYXZyMzJfZjY0X211bCIpOworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKGFkZF9vcHRhYiwgREZtb2RlLCAiX19hdnIzMl9mNjRfYWRkIik7CisgICAgICBzZXRfb3B0YWJfbGliZnVuYyAoc3ViX29wdGFiLCBERm1vZGUsICJfX2F2cjMyX2Y2NF9zdWIiKTsKKyAgICAgIHNldF9vcHRhYl9saWJmdW5jIChhZGRfb3B0YWIsIFNGbW9kZSwgIl9fYXZyMzJfZjMyX2FkZCIpOworICAgICAgc2V0X29wdGFiX2xpYmZ1bmMgKHN1Yl9vcHRhYiwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfc3ViIik7CisgICAgICBzZXRfb3B0YWJfbGliZnVuYyAoc2Rpdl9vcHRhYiwgU0Ztb2RlLCAiX19hdnIzMl9mMzJfZGl2Iik7CisgICAgfQorfQotLS0gL2Rldi9udWxsCisrKyBiL2djYy9jb25maWcvYXZyMzIvYXZyMzItZWxmLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAgIEVsZiBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDYgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udHJvbGxpbmcgdGhlIENvbXBpbGF0b3IgRHJpdmVyLCAnZ2NjJworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSdW4tdGltZSBUYXJnZXQgU3BlY2lmaWNhdGlvbi4gICovCisjdW5kZWYgIFRBUkdFVF9WRVJTSU9OCisjZGVmaW5lIFRBUkdFVF9WRVJTSU9OICBmcHV0cyAoIiAoQVZSMzIgR05VIHdpdGggRUxGKSIsIHN0ZGVycik7CisKKy8qCitBbm90aGVyIEMgc3RyaW5nIGNvbnN0YW50IHVzZWQgbXVjaCBsaWtlIExJTktfU1BFQy4gIFRoZQorZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgdGhhdCBTVEFSVEZJTEVfU1BFQyBpcyB1c2VkIGF0Cit0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGNvbW1hbmQgZ2l2ZW4gdG8gdGhlIGxpbmtlci4KKworSWYgdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IGlzIHByb3ZpZGVkIHRoYXQgbG9hZHMgdGhlCitzdGFuZGFyZCBDIHN0YXJ0dXAgZmlsZSBmcm9tIHRoZSB1c3VhbCBwbGFjZS4gIFNlZSBnY2MuYy4KKyovCisjdW5kZWYgIFNUQVJURklMRV9TUEVDCisjZGVmaW5lIFNUQVJURklMRV9TUEVDICJjcnQwJU8lcyBjcnRpJU8lcyBjcnRiZWdpbiVPJXMiCisKKyN1bmRlZiBMSU5LX1NQRUMKKyNkZWZpbmUgTElOS19TUEVDICIle211c2Utb3NjYWxsOi0tZGVmc3ltIF9fZG9fbm90X3VzZV9vc2NhbGxfY29wcm9jX189MH0gJXttcmVsYXh8Tyo6JXttbm8tcmVsYXh8TzB8TzE6IDs6LS1yZWxheH19ICV7bXBhcnQ9dWMzYTNyZXZkOi1tYXZyMzJlbGZfdWMzYTMyNTZzOzole21wYXJ0PSo6LW1hdnIzMmVsZl8lKn19ICV7bWNwdT0qOi1tYXZyMzJlbGZfJSp9IgorCisKKy8qCitBbm90aGVyIEMgc3RyaW5nIGNvbnN0YW50IHVzZWQgbXVjaCBsaWtlIExJTktfU1BFQy4gIFRoZQorZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgdGhhdCBFTkRGSUxFX1NQRUMgaXMgdXNlZCBhdAordGhlIHZlcnkgZW5kIG9mIHRoZSBjb21tYW5kIGdpdmVuIHRvIHRoZSBsaW5rZXIuCisKK0RvIG5vdCBkZWZpbmUgdGhpcyBtYWNybyBpZiBpdCBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nLgorKi8KKyN1bmRlZiAgRU5ERklMRV9TUEVDCisjZGVmaW5lIEVOREZJTEVfU1BFQyAiY3J0ZW5kJU8lcyBjcnRuJU8lcyIKKworCisvKiBUYXJnZXQgQ1BVIGJ1aWx0aW5zLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0NQVV9DUFBfQlVJTFRJTlMoKQkJCQlcCisgIGRvCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX2F2cjMyX18iKTsJCQkJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX18iKTsJCQkJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0VMRl9fIik7CSAgICAgICAJICAgICAgICAJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKGF2cjMyX3BhcnQtPm1hY3JvKTsJCQlcCisgICAgICBidWlsdGluX2RlZmluZSAoYXZyMzJfYXJjaC0+bWFjcm8pOwkJCVwKKyAgICAgIGlmIChhdnIzMl9hcmNoLT51YXJjaF90eXBlID09IFVBUkNIX1RZUEVfQVZSMzJBKQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9BVlIzMkFfXyIpOwkJCVwKKyAgICAgIGVsc2UJCQkJCQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9BVlIzMkJfXyIpOwkJCVwKKyAgICAgIGlmIChUQVJHRVRfVU5BTElHTkVEX1dPUkQpCQkJCVwKKwlidWlsdGluX2RlZmluZSAoIl9fQVZSMzJfSEFTX1VOQUxJR05FRF9XT1JEX18iKTsJXAorICAgICAgaWYgKFRBUkdFVF9TSU1EKQkJCQkJCVwKKwlidWlsdGluX2RlZmluZSAoIl9fQVZSMzJfSEFTX1NJTURfXyIpOwkJCVwKKyAgICAgIGlmIChUQVJHRVRfRFNQKQkJCQkJCVwKKwlidWlsdGluX2RlZmluZSAoIl9fQVZSMzJfSEFTX0RTUF9fIik7CQkJXAorICAgICAgaWYgKFRBUkdFVF9STVcpCQkJCQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9IQVNfUk1XX18iKTsJCQlcCisgICAgICBpZiAoVEFSR0VUX0JSQU5DSF9QUkVEKQkJCQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9IQVNfQlJBTkNIX1BSRURfXyIpOwkJXAorICAgICAgaWYgKFRBUkdFVF9GQVNUX0ZMT0FUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0ZBU1RfRkxPQVRfXyIpOyAgICAgICAgICAgICAgICBcCisgICAgfQkJCQkJCQkJXAorICB3aGlsZSAoMCkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL2F2cjMyLmgKQEAgLTAsMCArMSwzMzQ3IEBACisvKgorICAgRGVmaW5pdGlvbnMgb2YgdGFyZ2V0IG1hY2hpbmUgZm9yIEFWUjMyLgorICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbi4KKworICAgV3JpdHRlbiBieSBSb25ueSBQZWRlcnNlbiwgQXRtZWwgTm9yd2F5LCA8cnBlZGVyc2VuQGF0bWVsLmNvbT4KKyAgIEluaXRpYWwgcG9ydGluZyBieSBBbmRlcnMg77+9ZGxhbmQuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaWZuZGVmIEdDQ19BVlIzMl9ICisjZGVmaW5lIEdDQ19BVlIzMl9ICisKKworI2lmbmRlZiBPQkpFQ1RfRk9STUFUX0VMRgorI2Vycm9yIGF2cjMyLmggaW5jbHVkZWQgYmVmb3JlIGVsZm9zLmgKKyNlbmRpZgorCisjaWZuZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAorI2RlZmluZSBMT0NBTF9MQUJFTF9QUkVGSVggIi4iCisjZW5kaWYKKworI2lmbmRlZiBTVUJUQVJHRVRfQ1BQX1NQRUMKKyNkZWZpbmUgU1VCVEFSR0VUX0NQUF9TUEVDICAiLURfX0VMRl9fIgorI2VuZGlmCisKKworZXh0ZXJuIHN0cnVjdCBydHhfZGVmICphdnIzMl9jb21wYXJlX29wMDsKK2V4dGVybiBzdHJ1Y3QgcnR4X2RlZiAqYXZyMzJfY29tcGFyZV9vcDE7CisKKworZXh0ZXJuIHN0cnVjdCBydHhfZGVmICphdnIzMl9hY2NfY2FjaGU7CisKKy8qIGNhY2hlIGluc3RydWN0aW9uIG9wNSBjb2RlcyAqLworI2RlZmluZSBBVlIzMl9DQUNIRV9JTlZBTElEQVRFX0lDQUNIRSAxCisKKy8qIFRoZXNlIGJpdHMgZGVzY3JpYmUgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmdW5jdGlvbiBzdXBwb3J0ZWQKKyAgIGJ5IHRoZSBBVlIzMiBiYWNrZW5kLiAgVGhleSBhcmUgZXhjbHVzaXZlLiAgaWUgYSBmdW5jdGlvbiBjYW5ub3QgYmUgYm90aCBhCisgICBub3JtYWwgZnVuY3Rpb24gYW5kIGFuIGludGVyd29ya2VkIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZS4gIEtub3dpbmcgdGhlCisgICB0eXBlIG9mIGEgZnVuY3Rpb24gaXMgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyBpdHMgcHJvbG9ndWUgYW5kCisgICBlcGlsb2d1ZSBzZXF1ZW5jZXMuCisgICBOb3RlIHZhbHVlIDcgaXMgY3VycmVudGx5IHVuYXNzaWduZWQuICBBbHNvIG5vdGUgdGhhdCB0aGUgaW50ZXJydXB0CisgICBmdW5jdGlvbiB0eXBlcyBhbGwgaGF2ZSBiaXQgMiBzZXQsIHNvIHRoYXQgdGhleSBjYW4gYmUgdGVzdGVkIGZvciBlYXNpbHkuCisgICBOb3RlIHRoYXQgMCBpcyBkZWxpYmVyYXRlbHkgY2hvc2VuIGZvciBBVlIzMl9GVF9VTktOT1dOIHNvIHRoYXQgd2hlbiB0aGUKKyAgIG1hY2hpbmVfZnVuY3Rpb24gc3RydWN0dXJlIGlzIGluaXRpYWxpemVkICh0byB6ZXJvKSBmdW5jX3R5cGUgd2lsbAorICAgZGVmYXVsdCB0byB1bmtub3duLiAgVGhpcyB3aWxsIGZvcmNlIHRoZSBmaXJzdCB1c2Ugb2YgYXZyMzJfY3VycmVudF9mdW5jX3R5cGUKKyAgIHRvIGNhbGwgYXZyMzJfY29tcHV0ZV9mdW5jX3R5cGUuICAqLworI2RlZmluZSBBVlIzMl9GVF9VTktOT1dOCSAwCS8qIFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiBkZXRlcm1pbmVkLgorCQkJCQkgICAqLworI2RlZmluZSBBVlIzMl9GVF9OT1JNQUwJCSAxCS8qIFlvdXIgbm9ybWFsLCBzdHJhaWdodGZvcndhcmQKKwkJCQkJICAgZnVuY3Rpb24uICAqLworI2RlZmluZSBBVlIzMl9GVF9BQ0FMTAkgICAgICAgICAyCS8qIEFuIGFjYWxsIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgQVZSMzJfRlRfRVhDRVBUSU9OX0hBTkRMRVIgMwkvKiBBIEMrKyBleGNlcHRpb24gaGFuZGxlci4gICovCisjZGVmaW5lIEFWUjMyX0ZUX0lTUl9GVUxMCSA0CS8qIEEgZnVsbHkgc2hhZG93ZWQgaW50ZXJydXB0IG1vZGUuICAqLworI2RlZmluZSBBVlIzMl9GVF9JU1JfSEFMRgkgNQkvKiBBIGhhbGYgc2hhZG93ZWQgaW50ZXJydXB0IG1vZGUuICAqLworI2RlZmluZSBBVlIzMl9GVF9JU1JfTk9ORQkgNgkvKiBObyBzaGFkb3cgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBBVlIzMl9GVF9UWVBFX01BU0sJKCgxIDw8IDMpIC0gMSkKKworLyogSW4gYWRkaXRpb24gZnVuY3Rpb25zIGNhbiBoYXZlIHNldmVyYWwgdHlwZSBtb2RpZmllcnMsCisgICBvdXRsaW5lZCBieSB0aGVzZSBiaXQgbWFza3M6ICAqLworI2RlZmluZSBBVlIzMl9GVF9JTlRFUlJVUFQJKDEgPDwgMikJLyogTm90ZSBvdmVybGFwIHdpdGggRlRfSVNSCisJCQkJCQkgICBhbmQgYWJvdmUuICAqLworI2RlZmluZSBBVlIzMl9GVF9OQUtFRAkJKDEgPDwgMykJLyogTm8gcHJvbG9ndWUgb3IgZXBpbG9ndWUuICAqLworI2RlZmluZSBBVlIzMl9GVF9WT0xBVElMRQkoMSA8PCA0KQkvKiBEb2VzIG5vdCByZXR1cm4uICAqLworI2RlZmluZSBBVlIzMl9GVF9ORVNURUQJCSgxIDw8IDUpCS8qIEVtYmVkZGVkIGluc2lkZSBhbm90aGVyCisJCQkJCQkgICBmdW5jLiAqLworCisvKiBTb21lIG1hY3JvcyB0byB0ZXN0IHRoZXNlIGZsYWdzLiAgKi8KKyNkZWZpbmUgQVZSMzJfRlVOQ19UWVBFKHQpCSh0ICYgQVZSMzJfRlRfVFlQRV9NQVNLKQorI2RlZmluZSBJU19JTlRFUlJVUFQodCkJCSh0ICYgQVZSMzJfRlRfSU5URVJSVVBUKQorI2RlZmluZSBJU19WT0xBVElMRSh0KSAgICAgCSh0ICYgQVZSMzJfRlRfVk9MQVRJTEUpCisjZGVmaW5lIElTX05BS0VEKHQpICAgICAgICAJKHQgJiBBVlIzMl9GVF9OQUtFRCkKKyNkZWZpbmUgSVNfTkVTVEVEKHQpICAgICAgIAkodCAmIEFWUjMyX0ZUX05FU1RFRCkKKworI2RlZmluZSBTWU1CT0xfRkxBR19STVdfQUREUl9TSElGVCAgICBTWU1CT0xfRkxBR19NQUNIX0RFUF9TSElGVAorI2RlZmluZSBTWU1CT0xfUkVGX1JNV19BRERSKFJUWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNZTUJPTF9SRUZfRkxBR1MgKFJUWCkgJiAoMSA8PCBTWU1CT0xfRkxBR19STVdfQUREUl9TSElGVCkpICE9IDApCisKKwordHlwZWRlZiBzdHJ1Y3QgbWluaXBvb2xfbGFiZWxzCitHVFkgKChjaGFpbl9uZXh0ICgiJWgubmV4dCIpLCBjaGFpbl9wcmV2ICgiJWgucHJldiIpKSkKK3sKKyAgcnR4IGxhYmVsOworICBzdHJ1Y3QgbWluaXBvb2xfbGFiZWxzICpwcmV2OworICBzdHJ1Y3QgbWluaXBvb2xfbGFiZWxzICpuZXh0OworfSBtaW5pcG9vbF9sYWJlbHM7CisKKy8qIEEgQyBzdHJ1Y3R1cmUgZm9yIG1hY2hpbmUtc3BlY2lmaWMsIHBlci1mdW5jdGlvbiBkYXRhLgorICAgVGhpcyBpcyBhZGRlZCB0byB0aGUgY2Z1biBzdHJ1Y3R1cmUuICAqLworCit0eXBlZGVmIHN0cnVjdCBtYWNoaW5lX2Z1bmN0aW9uCitHVFkgKCgpKQoreworICAvKiBSZWNvcmRzIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmdW5jX3R5cGU7CisgIC8qIExpc3Qgb2YgbWluaXBvb2wgbGFiZWxzLCB1c2UgZm9yIGNoZWNraW5nIGlmIGNvZGUgbGFiZWwgaXMgdmFsaWQgaW4gYQorICAgICBtZW1vcnkgZXhwcmVzc2lvbiAqLworICBtaW5pcG9vbF9sYWJlbHMgKm1pbmlwb29sX2xhYmVsX2hlYWQ7CisgIG1pbmlwb29sX2xhYmVscyAqbWluaXBvb2xfbGFiZWxfdGFpbDsKKyAgaW50IGlmY3Z0X2FmdGVyX3JlbG9hZDsKK30gbWFjaGluZV9mdW5jdGlvbjsKKworLyogSW5pdGlhbGl6ZSBkYXRhIHVzZWQgYnkgaW5zbiBleHBhbmRlcnMuICBUaGlzIGlzIGNhbGxlZCBmcm9tIGluc25fZW1pdCwKKyAgIG9uY2UgZm9yIGV2ZXJ5IGZ1bmN0aW9uIGJlZm9yZSBjb2RlIGlzIGdlbmVyYXRlZC4gICovCisjZGVmaW5lIElOSVRfRVhQQU5ERVJTIGF2cjMyX2luaXRfZXhwYW5kZXJzICgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNQRUNTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVNNX1NQRUMKKyNkZWZpbmUgQVNNX1NQRUMgIiV7ZnBpYzotLXBpY30gJXttcmVsYXh8Tyo6JXttbm8tcmVsYXh8TzB8TzE6IDs6LS1saW5rcmVsYXh9fSAle21hcmNoPXVjcjJub211bDotbWFyY2g9dWNyMjs6JXttYXJjaD0qOi1tYXJjaD0lKn19ICV7bXBhcnQ9dWMzYTNyZXZkOi1tcGFydD11YzNhMzI1NnM7OiV7bXBhcnQ9KjotbXBhcnQ9JSp9fSIKKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJTElCX0RFRkFVTFRTCisjZGVmaW5lIE1VTFRJTElCX0RFRkFVTFRTIHsgIm1hcmNoPWFwIiwgIiIgfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJ1bi10aW1lIFRhcmdldCBTcGVjaWZpY2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFRBUkdFVF9WRVJTSU9OCisjZGVmaW5lIFRBUkdFVF9WRVJTSU9OIGZwcmludGYoc3RkZXJyLCAiIChBVlIzMiwgR05VIGFzc2VtYmxlciBzeW50YXgpIik7CisjZW5kaWYKKworCisvKiBQYXJ0IHR5cGVzLiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHRoZSBvcmRlciBvZiBhdnIzMl9wYXJ0X3R5cGVzIGluIGF2cjMyLmMqLworZW51bSBwYXJ0X3R5cGUKK3sKKyAgUEFSVF9UWVBFX0FWUjMyX05PTkUsCisgIFBBUlRfVFlQRV9BVlIzMl9BUDcwMDAsCisgIFBBUlRfVFlQRV9BVlIzMl9BUDcwMDEsCisgIFBBUlRfVFlQRV9BVlIzMl9BUDcwMDIsCisgIFBBUlRfVFlQRV9BVlIzMl9BUDcyMDAsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNBMDEyOCwKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0EwMjU2LAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQTA1MTIsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNBMDUxMkVTLAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQTExMjgsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNBMTI1NiwKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0ExNTEyLAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQTE1MTJFUywKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0EzUkVWRCwKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0EzNjQsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNBMzY0UywKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0EzMTI4LAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQTMxMjhTLAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQTMyNTYsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNBMzI1NlMsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNCMDY0LAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQjAxMjgsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNCMDI1NiwKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0IwMjU2RVMsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNCMTY0LAorICBQQVJUX1RZUEVfQVZSMzJfVUMzQjExMjgsCisgIFBBUlRfVFlQRV9BVlIzMl9VQzNCMTI1NiwKKyAgUEFSVF9UWVBFX0FWUjMyX1VDM0IxMjU2RVMKK307CisKKy8qIE1pY3JvYXJjaGl0ZWN0dXJlcy4gKi8KK2VudW0gbWljcm9hcmNoaXRlY3R1cmVfdHlwZQoreworICBVQVJDSF9UWVBFX0FWUjMyQSwKKyAgVUFSQ0hfVFlQRV9BVlIzMkIsCisgIFVBUkNIX1RZUEVfTk9ORQorfTsKKworLyogQXJjaGl0ZWN0dXJlcyB0eXBlcyB3aGljaCBzcGVjaWZpZXMgdGhlIHBpcGVsaW5lLgorIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggYXZyMzJfYXJjaF90eXBlcyBpbiBhdnIzMi5jCisgYW5kIHRoZSBwaXBlbGluZSBhdHRyaWJ1dGUgaW4gYXZyMzIubWQgKi8KK2VudW0gYXJjaGl0ZWN0dXJlX3R5cGUKK3sKKyAgQVJDSF9UWVBFX0FWUjMyX0FQLAorICBBUkNIX1RZUEVfQVZSMzJfVUNSMSwKKyAgQVJDSF9UWVBFX0FWUjMyX1VDUjIsCisgIEFSQ0hfVFlQRV9BVlIzMl9VQ1IyTk9NVUwsCisgIEFSQ0hfVFlQRV9BVlIzMl9OT05FCit9OworCisvKiBGbGFnIHNwZWNpZnlpbmcgaWYgdGhlIGNwdSBoYXMgc3VwcG9ydCBmb3IgRFNQIGluc3RydWN0aW9ucy4qLworI2RlZmluZSBGTEFHX0FWUjMyX0hBU19EU1AgKDEgPDwgMCkKKy8qIEZsYWcgc3BlY2lmeWluZyBpZiB0aGUgY3B1IGhhcyBzdXBwb3J0IGZvciBSZWFkLU1vZGlmeS1Xcml0ZQorICAgaW5zdHJ1Y3Rpb25zLiovCisjZGVmaW5lIEZMQUdfQVZSMzJfSEFTX1JNVyAoMSA8PCAxKQorLyogRmxhZyBzcGVjaWZ5aW5nIGlmIHRoZSBjcHUgaGFzIHN1cHBvcnQgZm9yIFNJTUQgaW5zdHJ1Y3Rpb25zLiAqLworI2RlZmluZSBGTEFHX0FWUjMyX0hBU19TSU1EICgxIDw8IDIpCisvKiBGbGFnIHNwZWNpZnlpbmcgaWYgdGhlIGNwdSBoYXMgc3VwcG9ydCBmb3IgdW5hbGlnbmVkIG1lbW9yeSB3b3JkIGFjY2Vzcy4gKi8KKyNkZWZpbmUgRkxBR19BVlIzMl9IQVNfVU5BTElHTkVEX1dPUkQgKDEgPDwgMykKKy8qIEZsYWcgc3BlY2lmeWluZyBpZiB0aGUgY3B1IGhhcyBzdXBwb3J0IGZvciBicmFuY2ggcHJlZGljdGlvbi4gKi8KKyNkZWZpbmUgRkxBR19BVlIzMl9IQVNfQlJBTkNIX1BSRUQgKDEgPDwgNCkKKy8qIEZsYWcgc3BlY2lmeWluZyBpZiB0aGUgY3B1IGhhcyBzdXBwb3J0IGZvciBhIHJldHVybiBzdGFjay4gKi8KKyNkZWZpbmUgRkxBR19BVlIzMl9IQVNfUkVUVVJOX1NUQUNLICgxIDw8IDUpCisvKiBGbGFnIHNwZWNpZnlpbmcgaWYgdGhlIGNwdSBoYXMgY2FjaGVzLiAqLworI2RlZmluZSBGTEFHX0FWUjMyX0hBU19DQUNIRVMgKDEgPDwgNikKKy8qIEZsYWcgc3BlY2lmeWluZyBpZiB0aGUgY3B1IGhhcyBzdXBwb3J0IGZvciB2MiBpbnNucy4gKi8KKyNkZWZpbmUgRkxBR19BVlIzMl9IQVNfVjJfSU5TTlMgKDEgPDwgNykKKy8qIEZsYWcgc3BlY2lmeWluZyB0aGF0IHRoZSBjcHUgaGFzIGJ1Z2d5IG11bCBpbnNucy4gKi8KKyNkZWZpbmUgRkxBR19BVlIzMl9IQVNfTk9fTVVMX0lOU05TICgxIDw8IDgpCisKKy8qIFN0cnVjdHVyZSBmb3IgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCBkaWZmZXJlbnQgYXZyMzIgQ1BVcy9wYXJ0cyAqLworc3RydWN0IHBhcnRfdHlwZV9zCit7CisgIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWU7CisgIGVudW0gcGFydF90eXBlIHBhcnRfdHlwZTsKKyAgZW51bSBhcmNoaXRlY3R1cmVfdHlwZSBhcmNoX3R5cGU7CisgIC8qIE11c3QgbGllIG91dHNpZGUgdXNlcidzIG5hbWVzcGFjZS4gIE5VTEwgPT0gbm8gbWFjcm8uICAqLworICBjb25zdCBjaGFyICpjb25zdCBtYWNybzsKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCBkaWZmZXJlbnQgYXZyMzIgcGlwZWxpbmUKKyBhcmNoaXRlY3R1cmVzLiAqLworc3RydWN0IGFyY2hfdHlwZV9zCit7CisgIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWU7CisgIGVudW0gYXJjaGl0ZWN0dXJlX3R5cGUgYXJjaF90eXBlOworICBlbnVtIG1pY3JvYXJjaGl0ZWN0dXJlX3R5cGUgdWFyY2hfdHlwZTsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBmZWF0dXJlX2ZsYWdzOworICAvKiBNdXN0IGxpZSBvdXRzaWRlIHVzZXIncyBuYW1lc3BhY2UuICBOVUxMID09IG5vIG1hY3JvLiAgKi8KKyAgY29uc3QgY2hhciAqY29uc3QgbWFjcm87Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHBhcnRfdHlwZV9zICphdnIzMl9wYXJ0OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNoX3R5cGVfcyAqYXZyMzJfYXJjaDsKKworI2RlZmluZSBUQVJHRVRfU0lNRCAgKGF2cjMyX2FyY2gtPmZlYXR1cmVfZmxhZ3MgJiBGTEFHX0FWUjMyX0hBU19TSU1EKQorI2RlZmluZSBUQVJHRVRfRFNQICAoYXZyMzJfYXJjaC0+ZmVhdHVyZV9mbGFncyAmIEZMQUdfQVZSMzJfSEFTX0RTUCkKKyNkZWZpbmUgVEFSR0VUX1JNVyAgKGF2cjMyX2FyY2gtPmZlYXR1cmVfZmxhZ3MgJiBGTEFHX0FWUjMyX0hBU19STVcpCisjZGVmaW5lIFRBUkdFVF9VTkFMSUdORURfV09SRCAgKGF2cjMyX2FyY2gtPmZlYXR1cmVfZmxhZ3MgJiBGTEFHX0FWUjMyX0hBU19VTkFMSUdORURfV09SRCkKKyNkZWZpbmUgVEFSR0VUX0JSQU5DSF9QUkVEICAoYXZyMzJfYXJjaC0+ZmVhdHVyZV9mbGFncyAmIEZMQUdfQVZSMzJfSEFTX0JSQU5DSF9QUkVEKQorI2RlZmluZSBUQVJHRVRfUkVUVVJOX1NUQUNLICAoYXZyMzJfYXJjaC0+ZmVhdHVyZV9mbGFncyAmIEZMQUdfQVZSMzJfSEFTX1JFVFVSTl9TVEFDSykKKyNkZWZpbmUgVEFSR0VUX1YyX0lOU05TICAoYXZyMzJfYXJjaC0+ZmVhdHVyZV9mbGFncyAmIEZMQUdfQVZSMzJfSEFTX1YyX0lOU05TKQorI2RlZmluZSBUQVJHRVRfQ0FDSEVTICAoYXZyMzJfYXJjaC0+ZmVhdHVyZV9mbGFncyAmIEZMQUdfQVZSMzJfSEFTX0NBQ0hFUykKKyNkZWZpbmUgVEFSR0VUX05PX01VTF9JTlNOUyAgKGF2cjMyX2FyY2gtPmZlYXR1cmVfZmxhZ3MgJiBGTEFHX0FWUjMyX0hBU19OT19NVUxfSU5TTlMpCisjZGVmaW5lIFRBUkdFVF9BUkNIX0FQIChhdnIzMl9hcmNoLT5hcmNoX3R5cGUgPT0gQVJDSF9UWVBFX0FWUjMyX0FQKQorI2RlZmluZSBUQVJHRVRfQVJDSF9VQ1IxIChhdnIzMl9hcmNoLT5hcmNoX3R5cGUgPT0gQVJDSF9UWVBFX0FWUjMyX1VDUjEpCisjZGVmaW5lIFRBUkdFVF9BUkNIX1VDUjIgKGF2cjMyX2FyY2gtPmFyY2hfdHlwZSA9PSBBUkNIX1RZUEVfQVZSMzJfVUNSMikKKyNkZWZpbmUgVEFSR0VUX0FSQ0hfVUMgKFRBUkdFVF9BUkNIX1VDUjEgfHwgVEFSR0VUX0FSQ0hfVUNSMikKKyNkZWZpbmUgVEFSR0VUX1VBUkNIX0FWUjMyQSAoYXZyMzJfYXJjaC0+dWFyY2hfdHlwZSA9PSBVQVJDSF9UWVBFX0FWUjMyQSkKKyNkZWZpbmUgVEFSR0VUX1VBUkNIX0FWUjMyQiAoYXZyMzJfYXJjaC0+dWFyY2hfdHlwZSA9PSBVQVJDSF9UWVBFX0FWUjMyQikKKworI2RlZmluZSBDQU5fREVCVUdfV0lUSE9VVF9GUAorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdG9yYWdlIExheW91dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorRGVmaW5lIHRoaXMgbWFjcm8gdG8gaGF2ZSB0aGUgdmFsdWUgMSBpZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gYQorYnl0ZSBoYXMgdGhlIGxvd2VzdCBudW1iZXI7IG90aGVyd2lzZSBkZWZpbmUgaXQgdG8gaGF2ZSB0aGUgdmFsdWUgemVyby4KK1RoaXMgbWVhbnMgdGhhdCBiaXQtZmllbGQgaW5zdHJ1Y3Rpb25zIGNvdW50IGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQKK2JpdC4gIElmIHRoZSBtYWNoaW5lIGhhcyBubyBiaXQtZmllbGQgaW5zdHJ1Y3Rpb25zLCB0aGVuIHRoaXMgbXVzdCBzdGlsbAorYmUgZGVmaW5lZCwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHZhbHVlIGl0IGlzIGRlZmluZWQgdG8uICBUaGlzCittYWNybyBuZWVkIG5vdCBiZSBhIGNvbnN0YW50LgorCitUaGlzIG1hY3JvIGRvZXMgbm90IGFmZmVjdCB0aGUgd2F5IHN0cnVjdHVyZSBmaWVsZHMgYXJlIHBhY2tlZCBpbnRvCitieXRlcyBvciB3b3JkczsgdGhhdCBpcyBjb250cm9sbGVkIGJ5IEJZVEVTX0JJR19FTkRJQU4uCisqLworI2RlZmluZSBCSVRTX0JJR19FTkRJQU4gMAorCisvKgorRGVmaW5lIHRoaXMgbWFjcm8gdG8gaGF2ZSB0aGUgdmFsdWUgMSBpZiB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGluIGEKK3dvcmQgaGFzIHRoZSBsb3dlc3QgbnVtYmVyLiBUaGlzIG1hY3JvIG5lZWQgbm90IGJlIGEgY29uc3RhbnQuCisqLworLyoKKyAgRGF0YSBpcyBzdG9yZWQgaW4gYW4gYmlnLWVuZGlhbiB3YXkuCisqLworI2RlZmluZSBCWVRFU19CSUdfRU5ESUFOIDEKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIHRvIGhhdmUgdGhlIHZhbHVlIDEgaWYsIGluIGEgbXVsdGl3b3JkIG9iamVjdCwgdGhlCittb3N0IHNpZ25pZmljYW50IHdvcmQgaGFzIHRoZSBsb3dlc3QgbnVtYmVyLiAgVGhpcyBhcHBsaWVzIHRvIGJvdGgKK21lbW9yeSBsb2NhdGlvbnMgYW5kIHJlZ2lzdGVyczsgR0NDIGZ1bmRhbWVudGFsbHkgYXNzdW1lcyB0aGF0IHRoZQorb3JkZXIgb2Ygd29yZHMgaW4gbWVtb3J5IGlzIHRoZSBzYW1lIGFzIHRoZSBvcmRlciBpbiByZWdpc3RlcnMuICBUaGlzCittYWNybyBuZWVkIG5vdCBiZSBhIGNvbnN0YW50LgorKi8KKy8qCisgIERhdGEgaXMgc3RvcmVkIGluIGFuIGJpbi1lbmRpYW4gd2F5LgorKi8KKyNkZWZpbmUgV09SRFNfQklHX0VORElBTiAxCisKKy8qCitEZWZpbmUgdGhpcyBtYWNybyBpZiBXT1JEU19CSUdfRU5ESUFOIGlzIG5vdCBjb25zdGFudC4gIFRoaXMgbXVzdCBiZSBhCitjb25zdGFudCB2YWx1ZSB3aXRoIHRoZSBzYW1lIG1lYW5pbmcgYXMgV09SRFNfQklHX0VORElBTiwgd2hpY2ggd2lsbCBiZQordXNlZCBvbmx5IHdoZW4gY29tcGlsaW5nIGxpYmdjYzIuYy4gIFR5cGljYWxseSB0aGUgdmFsdWUgd2lsbCBiZSBzZXQKK2Jhc2VkIG9uIHByZXByb2Nlc3NvciBkZWZpbmVzLgorKi8KKyNkZWZpbmUgTElCR0NDMl9XT1JEU19CSUdfRU5ESUFOIFdPUkRTX0JJR19FTkRJQU4KKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIHRvIGhhdmUgdGhlIHZhbHVlIDEgaWYgREZtb2RlLCBYRm1vZGUgb3IKK1RGbW9kZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBzdG9yZWQgaW4gbWVtb3J5IHdpdGggdGhlIHdvcmQKK2NvbnRhaW5pbmcgdGhlIHNpZ24gYml0IGF0IHRoZSBsb3dlc3QgYWRkcmVzczsgb3RoZXJ3aXNlIGRlZmluZSBpdCB0bworaGF2ZSB0aGUgdmFsdWUgMC4gIFRoaXMgbWFjcm8gbmVlZCBub3QgYmUgYSBjb25zdGFudC4KKworWW91IG5lZWQgbm90IGRlZmluZSB0aGlzIG1hY3JvIGlmIHRoZSBvcmRlcmluZyBpcyB0aGUgc2FtZSBhcyBmb3IKK211bHRpLXdvcmQgaW50ZWdlcnMuCisqLworLyogI2RlZmluZSBGTE9BVF9XT1JEU19CSUdfRU5ESUFOIDEgKi8KKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIHRvIGJlIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhbiBhZGRyZXNzYWJsZSBzdG9yYWdlCit1bml0IChieXRlKTsgbm9ybWFsbHkgOC4KKyovCisjZGVmaW5lIEJJVFNfUEVSX1VOSVQgOAorCisvKgorTnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkOyBub3JtYWxseSAzMi4KKyovCisjZGVmaW5lIEJJVFNfUEVSX1dPUkQgMzIKKworLyoKK01heGltdW0gbnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkLiAgSWYgdGhpcyBpcyB1bmRlZmluZWQsIHRoZSBkZWZhdWx0IGlzCitCSVRTX1BFUl9XT1JELiAgT3RoZXJ3aXNlLCBpdCBpcyB0aGUgY29uc3RhbnQgdmFsdWUgdGhhdCBpcyB0aGUKK2xhcmdlc3QgdmFsdWUgdGhhdCBCSVRTX1BFUl9XT1JEIGNhbiBoYXZlIGF0IHJ1bi10aW1lLgorKi8KKy8qIE1BWF9CSVRTX1BFUl9XT1JEIG5vdCBkZWZpbmVkKi8KKworLyoKK051bWJlciBvZiBzdG9yYWdlIHVuaXRzIGluIGEgd29yZDsgbm9ybWFsbHkgNC4KKyovCisjZGVmaW5lIFVOSVRTX1BFUl9XT1JEIDQKKworLyoKK01pbmltdW0gbnVtYmVyIG9mIHVuaXRzIGluIGEgd29yZC4gIElmIHRoaXMgaXMgdW5kZWZpbmVkLCB0aGUgZGVmYXVsdCBpcworVU5JVFNfUEVSX1dPUkQuICBPdGhlcndpc2UsIGl0IGlzIHRoZSBjb25zdGFudCB2YWx1ZSB0aGF0IGlzIHRoZQorc21hbGxlc3QgdmFsdWUgdGhhdCBVTklUU19QRVJfV09SRCBjYW4gaGF2ZSBhdCBydW4tdGltZS4KKyovCisvKiBNSU5fVU5JVFNfUEVSX1dPUkQgbm90IGRlZmluZWQgKi8KKworLyoKK1dpZHRoIG9mIGEgcG9pbnRlciwgaW4gYml0cy4gIFlvdSBtdXN0IHNwZWNpZnkgYSB2YWx1ZSBubyB3aWRlciB0aGFuIHRoZQord2lkdGggb2YgUG1vZGUuICBJZiBpdCBpcyBub3QgZXF1YWwgdG8gdGhlIHdpZHRoIG9mIFBtb2RlLAoreW91IG11c3QgZGVmaW5lIFBPSU5URVJTX0VYVEVORF9VTlNJR05FRC4KKyovCisjZGVmaW5lIFBPSU5URVJfU0laRSAzMgorCisvKgorQSBDIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8gaWYgcG9pbnRlcnMgdGhhdCBuZWVkIHRvIGJlCitleHRlbmRlZCBmcm9tIGJlaW5nIFBPSU5URVJfU0laRSBiaXRzIHdpZGUgdG8gUG1vZGUgYXJlIHRvCitiZSB6ZXJvLWV4dGVuZGVkIGFuZCB6ZXJvIGlmIHRoZXkgYXJlIHRvIGJlIHNpZ24tZXh0ZW5kZWQuICBJZiB0aGUgdmFsdWUKK2lzIGxlc3MgdGhlbiB6ZXJvIHRoZW4gdGhlcmUgbXVzdCBiZSBhbiAicHRyX2V4dGVuZCIgaW5zdHJ1Y3Rpb24gdGhhdAorZXh0ZW5kcyBhIHBvaW50ZXIgZnJvbSBQT0lOVEVSX1NJWkUgdG8gUG1vZGUuCisKK1lvdSBuZWVkIG5vdCBkZWZpbmUgdGhpcyBtYWNybyBpZiB0aGUgUE9JTlRFUl9TSVpFIGlzIGVxdWFsCit0byB0aGUgd2lkdGggb2YgUG1vZGUuCisqLworLyogI2RlZmluZSBQT0lOVEVSU19FWFRFTkRfVU5TSUdORUQgKi8KKworLyoKK0EgTWFjcm8gdG8gdXBkYXRlIE0gYW5kIFVOU0lHTkVEUCB3aGVuIGFuIG9iamVjdCB3aG9zZSB0eXBlCitpcyBUWVBFIGFuZCB3aGljaCBoYXMgdGhlIHNwZWNpZmllZCBtb2RlIGFuZCBzaWduZWRuZXNzIGlzIHRvIGJlCitzdG9yZWQgaW4gYSByZWdpc3Rlci4gIFRoaXMgbWFjcm8gaXMgb25seSBjYWxsZWQgd2hlbiBUWVBFIGlzIGEKK3NjYWxhciB0eXBlLgorCitPbiBtb3N0IFJJU0MgbWFjaGluZXMsIHdoaWNoIG9ubHkgaGF2ZSBvcGVyYXRpb25zIHRoYXQgb3BlcmF0ZSBvbiBhIGZ1bGwKK3JlZ2lzdGVyLCBkZWZpbmUgdGhpcyBtYWNybyB0byBzZXQgTSB0byB3b3JkX21vZGUgaWYKK00gaXMgYW4gaW50ZWdlciBtb2RlIG5hcnJvd2VyIHRoYW4gQklUU19QRVJfV09SRC4gIEluIG1vc3QKK2Nhc2VzLCBvbmx5IGludGVnZXIgbW9kZXMgc2hvdWxkIGJlIHdpZGVuZWQgYmVjYXVzZSB3aWRlci1wcmVjaXNpb24KK2Zsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXJlIHVzdWFsbHkgbW9yZSBleHBlbnNpdmUgdGhhbiB0aGVpciBuYXJyb3dlcgorY291bnRlcnBhcnRzLgorCitGb3IgbW9zdCBtYWNoaW5lcywgdGhlIG1hY3JvIGRlZmluaXRpb24gZG9lcyBub3QgY2hhbmdlIFVOU0lHTkVEUC4KK0hvd2V2ZXIsIHNvbWUgbWFjaGluZXMsIGhhdmUgaW5zdHJ1Y3Rpb25zIHRoYXQgcHJlZmVyZW50aWFsbHkgaGFuZGxlCitlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkIHF1YW50aXRpZXMgb2YgY2VydGFpbiBtb2Rlcy4gIEZvciBleGFtcGxlLCBvbgordGhlIERFQyBBbHBoYSwgMzItYml0IGxvYWRzIGZyb20gbWVtb3J5IGFuZCAzMi1iaXQgYWRkIGluc3RydWN0aW9ucworc2lnbi1leHRlbmQgdGhlIHJlc3VsdCB0byA2NCBiaXRzLiAgT24gc3VjaCBtYWNoaW5lcywgc2V0CitVTlNJR05FRFAgYWNjb3JkaW5nIHRvIHdoaWNoIGtpbmQgb2YgZXh0ZW5zaW9uIGlzIG1vcmUgZWZmaWNpZW50LgorCitEbyBub3QgZGVmaW5lIHRoaXMgbWFjcm8gaWYgaXQgd291bGQgbmV2ZXIgbW9kaWZ5IE0uCisqLworI2RlZmluZSBQUk9NT1RFX01PREUoTSwgVU5TSUdORURQLCBUWVBFKQlcCisgICAgewkJCQkJCVwKKyAgICAgIGlmIChHRVRfTU9ERV9DTEFTUyAoTSkgPT0gTU9ERV9JTlQJXAorCSAgJiYgR0VUX01PREVfU0laRSAoTSkgPCA0KQkJXAorCXsJCQkJCVwKKyAgICAgICAgICBpZiAoTSA9PSBRSW1vZGUpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVU5TSUdORURQID0gMTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGVsc2UgaWYgKE0gPT0gU0ltb2RlKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVU5TSUdORURQID0gMDsgICAgICAgICAgICAgICAgICAgICAgXAorCSAgKE0pID0gU0ltb2RlOwkJCQlcCisJfQkJCQkJXAorICAgIH0KKworI2RlZmluZSBQUk9NT1RFX0ZVTkNUSU9OX01PREUoTSwgVU5TSUdORURQLCBUWVBFKSAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChHRVRfTU9ERV9DTEFTUyAoTSkgPT0gTU9ERV9JTlQgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAmJiBHRVRfTU9ERV9TSVpFIChNKSA8IDQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoTSkgPSBTSW1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qIERlZmluZSBpZiBvcGVyYXRpb25zIGJldHdlZW4gcmVnaXN0ZXJzIGFsd2F5cyBwZXJmb3JtIHRoZSBvcGVyYXRpb24KKyAgIG9uIHRoZSBmdWxsIHJlZ2lzdGVyIGV2ZW4gaWYgYSBuYXJyb3dlciBtb2RlIGlzIHNwZWNpZmllZC4gICovCisjZGVmaW5lIFdPUkRfUkVHSVNURVJfT1BFUkFUSU9OUworCisvKiBEZWZpbmUgaWYgbG9hZGluZyBpbiBNT0RFLCBhbiBpbnRlZ3JhbCBtb2RlIG5hcnJvd2VyIHRoYW4gQklUU19QRVJfV09SRAorICAgd2lsbCBlaXRoZXIgemVyby1leHRlbmQgb3Igc2lnbi1leHRlbmQuICBUaGUgdmFsdWUgb2YgdGhpcyBtYWNybyBzaG91bGQKKyAgIGJlIHRoZSBjb2RlIHRoYXQgc2F5cyB3aGljaCBvbmUgb2YgdGhlIHR3byBvcGVyYXRpb25zIGlzIGltcGxpY2l0bHkKKyAgIGRvbmUsIFVOS05PV04gaWYgbm90IGtub3duLiAgKi8KKyNkZWZpbmUgTE9BRF9FWFRFTkRfT1AoTU9ERSkJCQkJXAorICAgKCgoTU9ERSkgPT0gUUltb2RlKSA/IFpFUk9fRVhURU5ECQkJXAorICAgOiAoKE1PREUpID09IEhJbW9kZSkgPyBTSUdOX0VYVEVORCA6IFVOS05PV04pCisKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIGlmIHRoZSBwcm9tb3Rpb24gZGVzY3JpYmVkIGJ5IFBST01PVEVfTU9ERQorc2hvdWxkIG9ubHkgYmUgcGVyZm9ybWVkIGZvciBvdXRnb2luZyBmdW5jdGlvbiBhcmd1bWVudHMgb3IKK2Z1bmN0aW9uIHJldHVybiB2YWx1ZXMsIGFzIHNwZWNpZmllZCBieSBQUk9NT1RFX0ZVTkNUSU9OX0FSR1MKK2FuZCBQUk9NT1RFX0ZVTkNUSU9OX1JFVFVSTiwgcmVzcGVjdGl2ZWx5LgorKi8KKy8qICNkZWZpbmUgUFJPTU9URV9GT1JfQ0FMTF9PTkxZICovCisKKy8qCitOb3JtYWwgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzIG9uIHRoZSBzdGFjaywgaW4KK2JpdHMuICBBbGwgc3RhY2sgcGFyYW1ldGVycyByZWNlaXZlIGF0IGxlYXN0IHRoaXMgbXVjaCBhbGlnbm1lbnQKK3JlZ2FyZGxlc3Mgb2YgZGF0YSB0eXBlLiAgT24gbW9zdCBtYWNoaW5lcywgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKK3NpemUgb2YgYW4gaW50ZWdlci4KKyovCisjZGVmaW5lIFBBUk1fQk9VTkRBUlkgMzIKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBtaW5pbXVtIGFsaWdubWVudCBlbmZvcmNlZCBieSBoYXJkd2FyZSBmb3IgdGhlCitzdGFjayBwb2ludGVyIG9uIHRoaXMgbWFjaGluZS4gIFRoZSBkZWZpbml0aW9uIGlzIGEgQyBleHByZXNzaW9uIGZvciB0aGUKK2Rlc2lyZWQgYWxpZ25tZW50IChtZWFzdXJlZCBpbiBiaXRzKS4gIFRoaXMgdmFsdWUgaXMgdXNlZCBhcyBhIGRlZmF1bHQKK2lmIFBSRUZFUlJFRF9TVEFDS19CT1VOREFSWSBpcyBub3QgZGVmaW5lZC4gIE9uIG1vc3QgbWFjaGluZXMsCit0aGlzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBQQVJNX0JPVU5EQVJZLgorKi8KKyNkZWZpbmUgU1RBQ0tfQk9VTkRBUlkgMzIKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3aXNoIHRvIHByZXNlcnZlIGEgY2VydGFpbiBhbGlnbm1lbnQgZm9yIHRoZQorc3RhY2sgcG9pbnRlciwgZ3JlYXRlciB0aGFuIHdoYXQgdGhlIGhhcmR3YXJlIGVuZm9yY2VzLiAgVGhlIGRlZmluaXRpb24KK2lzIGEgQyBleHByZXNzaW9uIGZvciB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgKG1lYXN1cmVkIGluIGJpdHMpLiAgVGhpcworbWFjcm8gbXVzdCBldmFsdWF0ZSB0byBhIHZhbHVlIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuCitTVEFDS19CT1VOREFSWS4KKyovCisjZGVmaW5lIFBSRUZFUlJFRF9TVEFDS19CT1VOREFSWSAoVEFSR0VUX0ZPUkNFX0RPVUJMRV9BTElHTiA/IDY0IDogMzIgKQorCisvKgorQWxpZ25tZW50IHJlcXVpcmVkIGZvciBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LCBpbiBiaXRzLgorKi8KKyNkZWZpbmUgRlVOQ1RJT05fQk9VTkRBUlkgMTYKKworLyoKK0JpZ2dlc3QgYWxpZ25tZW50IHRoYXQgYW55IGRhdGEgdHlwZSBjYW4gcmVxdWlyZSBvbiB0aGlzIG1hY2hpbmUsIGluIGJpdHMuCisqLworI2RlZmluZSBCSUdHRVNUX0FMSUdOTUVOVCAgKFRBUkdFVF9GT1JDRV9ET1VCTEVfQUxJR04gPyA2NCA6IDMyICkKKworLyoKK0lmIGRlZmluZWQsIHRoZSBzbWFsbGVzdCBhbGlnbm1lbnQsIGluIGJpdHMsIHRoYXQgY2FuIGJlIGdpdmVuIHRvIGFuCitvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUgb3BlcmF0aW9uLCB3aXRob3V0IGRpc3R1cmJpbmcgYW55CituZWFyYnkgb2JqZWN0LiAgTm9ybWFsbHksIHRoaXMgaXMgQklUU19QRVJfVU5JVCwgYnV0IG1heSBiZSBsYXJnZXIKK29uIG1hY2hpbmVzIHRoYXQgZG9uJ3QgaGF2ZSBieXRlIG9yIGhhbGYtd29yZCBzdG9yZSBvcGVyYXRpb25zLgorKi8KKyNkZWZpbmUgTUlOSU1VTV9BVE9NSUNfQUxJR05NRU5UIEJJVFNfUEVSX1VOSVQKKworCisvKgorQW4gaW50ZWdlciBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBsYXJnZXN0IGludGVnZXIgbWFjaGluZSBtb2RlIHRoYXQKK3Nob3VsZCBhY3R1YWxseSBiZSB1c2VkLiBBbGwgaW50ZWdlciBtYWNoaW5lIG1vZGVzIG9mIHRoaXMgc2l6ZSBvciBzbWFsbGVyIGNhbiBiZQordXNlZCBmb3Igc3RydWN0dXJlcyBhbmQgdW5pb25zIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpemVzLiBJZiB0aGlzIG1hY3JvIGlzIHVuZGVmaW5lZCwKK0dFVF9NT0RFX0JJVFNJWkUgKERJbW9kZSkgaXMgYXNzdW1lZC4qLworI2RlZmluZSBNQVhfRklYRURfTU9ERV9TSVpFICBHRVRfTU9ERV9CSVRTSVpFIChESW1vZGUpCisKKworLyoKK0lmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHRvIGNvbXB1dGUgdGhlIGFsaWdubWVudCBnaXZlbiB0byBhIGNvbnN0YW50Cit0aGF0IGlzIGJlaW5nIHBsYWNlZCBpbiBtZW1vcnkuICBDT05TVEFOVCBpcyB0aGUgY29uc3RhbnQgYW5kCitCQVNJQ19BTElHTiBpcyB0aGUgYWxpZ25tZW50IHRoYXQgdGhlIG9iamVjdCB3b3VsZCBvcmRpbmFyaWx5CitoYXZlLiAgVGhlIHZhbHVlIG9mIHRoaXMgbWFjcm8gaXMgdXNlZCBpbnN0ZWFkIG9mIHRoYXQgYWxpZ25tZW50IHRvCithbGlnbiB0aGUgb2JqZWN0LgorCitJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLCB0aGVuIEJBU0lDX0FMSUdOIGlzIHVzZWQuCisKK1RoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIG1hY3JvIGlzIHRvIGluY3JlYXNlIGFsaWdubWVudCBmb3Igc3RyaW5nCitjb25zdGFudHMgdG8gYmUgd29yZCBhbGlnbmVkIHNvIHRoYXQgc3RyY3B5IGNhbGxzIHRoYXQgY29weQorY29uc3RhbnRzIGNhbiBiZSBkb25lIGlubGluZS4KKyovCisjZGVmaW5lIENPTlNUQU5UX0FMSUdOTUVOVChDT05TVEFOVCwgQkFTSUNfQUxJR04pIFwKKyAoKFRSRUVfQ09ERShDT05TVEFOVCkgPT0gU1RSSU5HX0NTVCkgPyBCSVRTX1BFUl9XT1JEIDogQkFTSUNfQUxJR04pCisKKy8qIFRyeSB0byBhbGlnbiBzdHJpbmcgdG8gYSB3b3JkLiAqLworI2RlZmluZSBEQVRBX0FMSUdOTUVOVChUWVBFLCBBTElHTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoeyhUUkVFX0NPREUgKFRZUEUpID09IEFSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAmJiBUWVBFX01PREUgKFRSRUVfVFlQRSAoVFlQRSkpID09IFFJbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAmJiAoQUxJR04pIDwgQklUU19QRVJfV09SRCA/IEJJVFNfUEVSX1dPUkQgOiAoQUxJR04pKTt9KQorCisvKiBUcnkgdG8gYWxpZ24gbG9jYWwgc3RvcmUgc3RyaW5ncyB0byBhIHdvcmQuICovCisjZGVmaW5lIExPQ0FMX0FMSUdOTUVOVChUWVBFLCBBTElHTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh7KFRSRUVfQ09ERSAoVFlQRSkgPT0gQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICYmIFRZUEVfTU9ERSAoVFJFRV9UWVBFIChUWVBFKSkgPT0gUUltb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICYmIChBTElHTikgPCBCSVRTX1BFUl9XT1JEID8gQklUU19QRVJfV09SRCA6IChBTElHTikpO30pCisKKy8qCitEZWZpbmUgdGhpcyBtYWNybyB0byBiZSB0aGUgdmFsdWUgMSBpZiBpbnN0cnVjdGlvbnMgd2lsbCBmYWlsIHRvIHdvcmsKK2lmIGdpdmVuIGRhdGEgbm90IG9uIHRoZSBub21pbmFsIGFsaWdubWVudC4gIElmIGluc3RydWN0aW9ucyB3aWxsIG1lcmVseQorZ28gc2xvd2VyIGluIHRoYXQgY2FzZSwgZGVmaW5lIHRoaXMgbWFjcm8gYXMgMC4KKyovCisjZGVmaW5lIFNUUklDVF9BTElHTk1FTlQgMQorCisvKgorRGVmaW5lIHRoaXMgaWYgeW91IHdpc2ggdG8gaW1pdGF0ZSB0aGUgd2F5IG1hbnkgb3RoZXIgQyBjb21waWxlcnMgaGFuZGxlCithbGlnbm1lbnQgb2YgYml0LWZpZWxkcyBhbmQgdGhlIHN0cnVjdHVyZXMgdGhhdCBjb250YWluIHRoZW0uCisKK1RoZSBiZWhhdmlvciBpcyB0aGF0IHRoZSB0eXBlIHdyaXR0ZW4gZm9yIGEgYml0LWZpZWxkIChpbnQsCitzaG9ydCwgb3Igb3RoZXIgaW50ZWdlciB0eXBlKSBpbXBvc2VzIGFuIGFsaWdubWVudCBmb3IgdGhlCitlbnRpcmUgc3RydWN0dXJlLCBhcyBpZiB0aGUgc3RydWN0dXJlIHJlYWxseSBkaWQgY29udGFpbiBhbiBvcmRpbmFyeQorZmllbGQgb2YgdGhhdCB0eXBlLiAgSW4gYWRkaXRpb24sIHRoZSBiaXQtZmllbGQgaXMgcGxhY2VkIHdpdGhpbiB0aGUKK3N0cnVjdHVyZSBzbyB0aGF0IGl0IHdvdWxkIGZpdCB3aXRoaW4gc3VjaCBhIGZpZWxkLCBub3QgY3Jvc3NpbmcgYQorYm91bmRhcnkgZm9yIGl0LgorCitUaHVzLCBvbiBtb3N0IG1hY2hpbmVzLCBhIGJpdC1maWVsZCB3aG9zZSB0eXBlIGlzIHdyaXR0ZW4gYXMgaW50Cit3b3VsZCBub3QgY3Jvc3MgYSBmb3VyLWJ5dGUgYm91bmRhcnksIGFuZCB3b3VsZCBmb3JjZSBmb3VyLWJ5dGUKK2FsaWdubWVudCBmb3IgdGhlIHdob2xlIHN0cnVjdHVyZS4gIChUaGUgYWxpZ25tZW50IHVzZWQgbWF5IG5vdCBiZSBmb3VyCitieXRlczsgaXQgaXMgY29udHJvbGxlZCBieSB0aGUgb3RoZXIgYWxpZ25tZW50IHBhcmFtZXRlcnMuKQorCitJZiB0aGUgbWFjcm8gaXMgZGVmaW5lZCwgaXRzIGRlZmluaXRpb24gc2hvdWxkIGJlIGEgQyBleHByZXNzaW9uOworYSBub256ZXJvIHZhbHVlIGZvciB0aGUgZXhwcmVzc2lvbiBlbmFibGVzIHRoaXMgYmVoYXZpb3IuCisKK05vdGUgdGhhdCBpZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLCBvciBpdHMgdmFsdWUgaXMgemVybywgc29tZQorYml0LWZpZWxkcyBtYXkgY3Jvc3MgbW9yZSB0aGFuIG9uZSBhbGlnbm1lbnQgYm91bmRhcnkuICBUaGUgY29tcGlsZXIgY2FuCitzdXBwb3J0IHN1Y2ggcmVmZXJlbmNlcyBpZiB0aGVyZSBhcmUgaW5zdiwgZXh0diwgYW5kCitleHR6diBpbnNucyB0aGF0IGNhbiBkaXJlY3RseSByZWZlcmVuY2UgbWVtb3J5LgorCitUaGUgb3RoZXIga25vd24gd2F5IG9mIG1ha2luZyBiaXQtZmllbGRzIHdvcmsgaXMgdG8gZGVmaW5lCitTVFJVQ1RVUkVfU0laRV9CT1VOREFSWSBhcyBsYXJnZSBhcyBCSUdHRVNUX0FMSUdOTUVOVC4KK1RoZW4gZXZlcnkgc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIGZ1bGx3b3Jkcy4KKworVW5sZXNzIHRoZSBtYWNoaW5lIGhhcyBiaXQtZmllbGQgaW5zdHJ1Y3Rpb25zIG9yIHlvdSBkZWZpbmUKK1NUUlVDVFVSRV9TSVpFX0JPVU5EQVJZIHRoYXQgd2F5LCB5b3UgbXVzdCBkZWZpbmUKK1BDQ19CSVRGSUVMRF9UWVBFX01BVFRFUlMgdG8gaGF2ZSBhIG5vbnplcm8gdmFsdWUuCisKK0lmIHlvdXIgYWltIGlzIHRvIG1ha2UgR0NDIHVzZSB0aGUgc2FtZSBjb252ZW50aW9ucyBmb3IgbGF5aW5nIG91dAorYml0LWZpZWxkcyBhcyBhcmUgdXNlZCBieSBhbm90aGVyIGNvbXBpbGVyLCBoZXJlIGlzIGhvdyB0byBpbnZlc3RpZ2F0ZQord2hhdCB0aGUgb3RoZXIgY29tcGlsZXIgZG9lcy4gIENvbXBpbGUgYW5kIHJ1biB0aGlzIHByb2dyYW06CisKK3N0cnVjdCBmb28xCit7CisgIGNoYXIgeDsKKyAgY2hhciA6MDsKKyAgY2hhciB5OworfTsKKworc3RydWN0IGZvbzIKK3sKKyAgY2hhciB4OworICBpbnQgOjA7CisgIGNoYXIgeTsKK307CisKK21haW4gKCkKK3sKKyAgcHJpbnRmICgiU2l6ZSBvZiBmb28xIGlzICVkXG4iLAorICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZvbzEpKTsKKyAgcHJpbnRmICgiU2l6ZSBvZiBmb28yIGlzICVkXG4iLAorICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZvbzIpKTsKKyAgZXhpdCAoMCk7Cit9CisKK0lmIHRoaXMgcHJpbnRzIDIgYW5kIDUsIHRoZW4gdGhlIGNvbXBpbGVyJ3MgYmVoYXZpb3IgaXMgd2hhdCB5b3Ugd291bGQKK2dldCBmcm9tIFBDQ19CSVRGSUVMRF9UWVBFX01BVFRFUlMuCisqLworI2RlZmluZSBQQ0NfQklURklFTERfVFlQRV9NQVRURVJTIDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMYXlvdXQgb2YgU291cmNlIExhbmd1YWdlIERhdGEgVHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSB0eXBlIGludCBvbiB0aGUKK3RhcmdldCBtYWNoaW5lLiAgSWYgeW91IGRvbid0IGRlZmluZSB0aGlzLCB0aGUgZGVmYXVsdCBpcyBvbmUgd29yZC4KKyovCisjZGVmaW5lIElOVF9UWVBFX1NJWkUgMzIKKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSB0eXBlIHNob3J0IG9uIHRoZQordGFyZ2V0IG1hY2hpbmUuICBJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMsIHRoZSBkZWZhdWx0IGlzIGhhbGYgYSB3b3JkLiAoSWYKK3RoaXMgd291bGQgYmUgbGVzcyB0aGFuIG9uZSBzdG9yYWdlIHVuaXQsIGl0IGlzIHJvdW5kZWQgdXAgdG8gb25lIHVuaXQuKQorKi8KKyNkZWZpbmUgU0hPUlRfVFlQRV9TSVpFIDE2CisKKy8qCitBIEMgZXhwcmVzc2lvbiBmb3IgdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgdHlwZSBsb25nIG9uIHRoZQordGFyZ2V0IG1hY2hpbmUuICBJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMsIHRoZSBkZWZhdWx0IGlzIG9uZSB3b3JkLgorKi8KKyNkZWZpbmUgTE9OR19UWVBFX1NJWkUgMzIKKworCisvKgorQSBDIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHR5cGUgbG9uZyBsb25nIG9uIHRoZQordGFyZ2V0IG1hY2hpbmUuICBJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMsIHRoZSBkZWZhdWx0IGlzIHR3bword29yZHMuICBJZiB5b3Ugd2FudCB0byBzdXBwb3J0IEdOVSBBZGEgb24geW91ciBtYWNoaW5lLCB0aGUgdmFsdWUgb2YgdGhpcworbWFjcm8gbXVzdCBiZSBhdCBsZWFzdCA2NC4KKyovCisjZGVmaW5lIExPTkdfTE9OR19UWVBFX1NJWkUgNjQKKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSB0eXBlIGNoYXIgb24gdGhlCit0YXJnZXQgbWFjaGluZS4gIElmIHlvdSBkb24ndCBkZWZpbmUgdGhpcywgdGhlIGRlZmF1bHQgaXMKK0JJVFNfUEVSX1VOSVQuCisqLworI2RlZmluZSBDSEFSX1RZUEVfU0laRSA4CisKKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBDKysgdHlwZSBib29sIGFuZAorQzk5IHR5cGUgX0Jvb2wgb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgSWYgeW91IGRvbid0IGRlZmluZQordGhpcywgYW5kIHlvdSBwcm9iYWJseSBzaG91bGRuJ3QsIHRoZSBkZWZhdWx0IGlzIENIQVJfVFlQRV9TSVpFLgorKi8KKyNkZWZpbmUgQk9PTF9UWVBFX1NJWkUgOAorCisKKy8qCitBbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIDEgb3IgMCwgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIHR5cGUKK2NoYXIgc2hvdWxkIGJlIHNpZ25lZCBvciB1bnNpZ25lZCBieSBkZWZhdWx0LiAgVGhlIHVzZXIgY2FuCithbHdheXMgb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggdGhlIG9wdGlvbnMgLWZzaWduZWQtY2hhcgorYW5kIC1mdW5zaWduZWQtY2hhci4KKyovCisvKiBXZSBhcmUgdXNpbmcgdW5zaWduZWQgY2hhciAqLworI2RlZmluZSBERUZBVUxUX1NJR05FRF9DSEFSIDAKKworCisvKgorQSBDIGV4cHJlc3Npb24gZm9yIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZSB0byB1c2UKK2ZvciBzaXplIHZhbHVlcy4gIFRoZSB0eXBlZGVmIG5hbWUgc2l6ZV90IGlzIGRlZmluZWQgdXNpbmcgdGhlCitjb250ZW50cyBvZiB0aGUgc3RyaW5nLgorCitUaGUgc3RyaW5nIGNhbiBjb250YWluIG1vcmUgdGhhbiBvbmUga2V5d29yZC4gIElmIHNvLCBzZXBhcmF0ZSB0aGVtIHdpdGgKK3NwYWNlcywgYW5kIHdyaXRlIGZpcnN0IGFueSBsZW5ndGgga2V5d29yZCwgdGhlbiB1bnNpZ25lZCBpZgorYXBwcm9wcmlhdGUsIGFuZCBmaW5hbGx5IGludC4gIFRoZSBzdHJpbmcgbXVzdCBleGFjdGx5IG1hdGNoIG9uZQorb2YgdGhlIGRhdGEgdHlwZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbgoraW5pdF9kZWNsX3Byb2Nlc3NpbmcgaW4gdGhlIGZpbGUgYy1kZWNsLmMuICBZb3UgbWF5IG5vdAorb21pdCBpbnQgb3IgY2hhbmdlIHRoZSBvcmRlciAtIHRoYXQgd291bGQgY2F1c2UgdGhlIGNvbXBpbGVyIHRvCitjcmFzaCBvbiBzdGFydHVwLgorCitJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMgbWFjcm8sIHRoZSBkZWZhdWx0IGlzICJsb25nIHVuc2lnbmVkIGludCIuCisqLworI2RlZmluZSBTSVpFX1RZUEUgImxvbmcgdW5zaWduZWQgaW50IgorCisvKgorQSBDIGV4cHJlc3Npb24gZm9yIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZSB0byB1c2UKK2ZvciB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHR3byBwb2ludGVycy4gIFRoZSB0eXBlZGVmIG5hbWUKK3B0cmRpZmZfdCBpcyBkZWZpbmVkIHVzaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nLiAgU2VlCitTSVpFX1RZUEUgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0lmIHlvdSBkb24ndCBkZWZpbmUgdGhpcyBtYWNybywgdGhlIGRlZmF1bHQgaXMgImxvbmcgaW50Ii4KKyovCisjZGVmaW5lIFBUUkRJRkZfVFlQRSAibG9uZyBpbnQiCisKKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBkYXRhIHR5cGUgZm9yIHdpZGUKK2NoYXJhY3RlcnMuICBUaGlzIGlzIHVzZWQgaW4gY3BwLCB3aGljaCBjYW5ub3QgbWFrZSB1c2Ugb2YKK1dDSEFSX1RZUEUuCisqLworI2RlZmluZSBXQ0hBUl9UWVBFX1NJWkUgMzIKKworCisvKgorQSBDIGV4cHJlc3Npb24gZm9yIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZSB0bwordXNlIGZvciB3aWRlIGNoYXJhY3RlcnMgcGFzc2VkIHRvIHByaW50ZiBhbmQgcmV0dXJuZWQgZnJvbQorZ2V0d2MuICBUaGUgdHlwZWRlZiBuYW1lIHdpbnRfdCBpcyBkZWZpbmVkIHVzaW5nIHRoZQorY29udGVudHMgb2YgdGhlIHN0cmluZy4gIFNlZSBTSVpFX1RZUEUgYWJvdmUgZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCitJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMgbWFjcm8sIHRoZSBkZWZhdWx0IGlzICJ1bnNpZ25lZCBpbnQiLgorKi8KKyNkZWZpbmUgV0lOVF9UWVBFICJ1bnNpZ25lZCBpbnQiCisKKy8qCitBIEMgZXhwcmVzc2lvbiBmb3IgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbmFtZSBvZiB0aGUgZGF0YSB0eXBlIHRoYXQKK2NhbiByZXByZXNlbnQgYW55IHZhbHVlIG9mIGFueSBzdGFuZGFyZCBvciBleHRlbmRlZCBzaWduZWQgaW50ZWdlciB0eXBlLgorVGhlIHR5cGVkZWYgbmFtZSBpbnRtYXhfdCBpcyBkZWZpbmVkIHVzaW5nIHRoZSBjb250ZW50cyBvZiB0aGUKK3N0cmluZy4gIFNlZSBTSVpFX1RZUEUgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0lmIHlvdSBkb24ndCBkZWZpbmUgdGhpcyBtYWNybywgdGhlIGRlZmF1bHQgaXMgdGhlIGZpcnN0IG9mCisiaW50IiwgImxvbmcgaW50Iiwgb3IgImxvbmcgbG9uZyBpbnQiIHRoYXQgaGFzIGFzCittdWNoIHByZWNpc2lvbiBhcyBsb25nIGxvbmcgaW50LgorKi8KKyNkZWZpbmUgSU5UTUFYX1RZUEUgImxvbmcgbG9uZyBpbnQiCisKKy8qCitBIEMgZXhwcmVzc2lvbiBmb3IgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbmFtZSBvZiB0aGUgZGF0YSB0eXBlIHRoYXQKK2NhbiByZXByZXNlbnQgYW55IHZhbHVlIG9mIGFueSBzdGFuZGFyZCBvciBleHRlbmRlZCB1bnNpZ25lZCBpbnRlZ2VyCit0eXBlLiAgVGhlIHR5cGVkZWYgbmFtZSB1aW50bWF4X3QgaXMgZGVmaW5lZCB1c2luZyB0aGUgY29udGVudHMKK29mIHRoZSBzdHJpbmcuICBTZWUgU0laRV9UWVBFIGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitJZiB5b3UgZG9uJ3QgZGVmaW5lIHRoaXMgbWFjcm8sIHRoZSBkZWZhdWx0IGlzIHRoZSBmaXJzdCBvZgorInVuc2lnbmVkIGludCIsICJsb25nIHVuc2lnbmVkIGludCIsIG9yICJsb25nIGxvbmcgdW5zaWduZWQgaW50IgordGhhdCBoYXMgYXMgbXVjaCBwcmVjaXNpb24gYXMgbG9uZyBsb25nIHVuc2lnbmVkIGludC4KKyovCisjZGVmaW5lIFVJTlRNQVhfVFlQRSAibG9uZyBsb25nIHVuc2lnbmVkIGludCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdpc3RlciBVc2FnZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb252ZXJ0IGZyb20gZ2NjIGludGVybmFsIHJlZ2lzdGVyIG51bWJlciB0byByZWdpc3RlciBudW1iZXIKKyAgIHVzZWQgaW4gYXNzZW1ibHkgY29kZSAqLworI2RlZmluZSBBU01fUkVHTlVNKHJlZykgKExBU1RfUkVHTlVNIC0gKHJlZykpCisjZGVmaW5lIEFTTV9GUF9SRUdOVU0ocmVnKSAoTEFTVF9GUF9SRUdOVU0gLSAocmVnKSkKKworLyogQ29udmVydCBiZXR3ZWVuIHJlZ2lzdGVyIG51bWJlciB1c2VkIGluIGFzc2VtYmx5IHRvIGdjYworICAgaW50ZXJuYWwgcmVnaXN0ZXIgbnVtYmVyICAqLworI2RlZmluZSBJTlRFUk5BTF9SRUdOVU0ocmVnKSAoTEFTVF9SRUdOVU0gLSAocmVnKSkKKyNkZWZpbmUgSU5URVJOQUxfRlBfUkVHTlVNKHJlZykgKExBU1RfRlBfUkVHTlVNIC0gKHJlZykpCisKKy8qKiBCYXNpYyBDaGFyYWN0ZXJpc3RpY3Mgb2YgUmVnaXN0ZXJzICoqLworCisvKgorTnVtYmVyIG9mIGhhcmR3YXJlIHJlZ2lzdGVycyBrbm93biB0byB0aGUgY29tcGlsZXIuICBUaGV5IHJlY2VpdmUKK251bWJlcnMgMCB0aHJvdWdoIEZJUlNUX1BTRVVET19SRUdJU1RFUi0xOyB0aHVzLCB0aGUgZmlyc3QKK3BzZXVkbyByZWdpc3RlcidzIG51bWJlciByZWFsbHkgaXMgYXNzaWduZWQgdGhlIG51bWJlcgorRklSU1RfUFNFVURPX1JFR0lTVEVSLgorKi8KKyNkZWZpbmUgRklSU1RfUFNFVURPX1JFR0lTVEVSIChMQVNUX0ZQX1JFR05VTSArIDEpCisKKyNkZWZpbmUgRklSU1RfUkVHTlVNIDAKKyNkZWZpbmUgTEFTVF9SRUdOVU0gMTUKKyNkZWZpbmUgTlVNX0ZQX1JFR1MgMTYKKyNkZWZpbmUgRklSU1RfRlBfUkVHTlVNIDE2CisjZGVmaW5lIExBU1RfRlBfUkVHTlVNICgxNitOVU1fRlBfUkVHUy0xKQorCisvKgorQW4gaW5pdGlhbGl6ZXIgdGhhdCBzYXlzIHdoaWNoIHJlZ2lzdGVycyBhcmUgdXNlZCBmb3IgZml4ZWQgcHVycG9zZXMKK2FsbCB0aHJvdWdob3V0IHRoZSBjb21waWxlZCBjb2RlIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBhdmFpbGFibGUgZm9yCitnZW5lcmFsIGFsbG9jYXRpb24uICBUaGVzZSB3b3VsZCBpbmNsdWRlIHRoZSBzdGFjayBwb2ludGVyLCB0aGUgZnJhbWUKK3BvaW50ZXIgKGV4Y2VwdCBvbiBtYWNoaW5lcyB3aGVyZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZ2VuZXJhbAorcmVnaXN0ZXIgd2hlbiBubyBmcmFtZSBwb2ludGVyIGlzIG5lZWRlZCksIHRoZSBwcm9ncmFtIGNvdW50ZXIgb24KK21hY2hpbmVzIHdoZXJlIHRoYXQgaXMgY29uc2lkZXJlZCBvbmUgb2YgdGhlIGFkZHJlc3NhYmxlIHJlZ2lzdGVycywKK2FuZCBhbnkgb3RoZXIgbnVtYmVyZWQgcmVnaXN0ZXIgd2l0aCBhIHN0YW5kYXJkIHVzZS4KKworVGhpcyBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzLCBzZXBhcmF0ZWQgYnkKK2NvbW1hcyBhbmQgc3Vycm91bmRlZCBieSBicmFjZXMuICBUaGUgbnRoIG51bWJlciBpcyAxIGlmCityZWdpc3RlciBuIGlzIGZpeGVkLCAwIG90aGVyd2lzZS4KKworVGhlIHRhYmxlIGluaXRpYWxpemVkIGZyb20gdGhpcyBtYWNybywgYW5kIHRoZSB0YWJsZSBpbml0aWFsaXplZCBieQordGhlIGZvbGxvd2luZyBvbmUsIG1heSBiZSBvdmVycmlkZGVuIGF0IHJ1biB0aW1lIGVpdGhlciBhdXRvbWF0aWNhbGx5LAorYnkgdGhlIGFjdGlvbnMgb2YgdGhlIG1hY3JvIENPTkRJVElPTkFMX1JFR0lTVEVSX1VTQUdFLCBvciBieQordGhlIHVzZXIgd2l0aCB0aGUgY29tbWFuZCBvcHRpb25zIC1mZml4ZWQtW3JlZ10sCistZmNhbGwtdXNlZC1bcmVnXSBhbmQgLWZjYWxsLXNhdmVkLVtyZWddLgorKi8KKworLyogVGhlIGludGVybmFsIGdjYyByZWdpc3RlciBudW1iZXJzIGFyZSByZXZlcnNlZAorICAgY29tcGFyZWQgdG8gdGhlIHJlYWwgcmVnaXN0ZXIgbnVtYmVycyBzaW5jZQorICAgZ2NjIGV4cGVjdHMgZGF0YSB0eXBlcyBzdG9yZWQgb3ZlciBtdWx0aXBsZQorICAgcmVnaXN0ZXJzIGluIHRoZSByZWdpc3RlciBmaWxlIHRvIGJlIGJpZyBlbmRpYW4KKyAgIGlmIHRoZSBtZW1vcnkgbGF5b3V0IGlzIGJpZyBlbmRpYW4uIEJ1dCB0aGlzCisgICBpcyBub3QgdGhlIGNhc2UgZm9yIGF2cjMyIHNvIHdlIGZha2UgYSBiaWcKKyAgIGVuZGlhbiByZWdpc3RlciBmaWxlLiAqLworCisjZGVmaW5lIEZJWEVEX1JFR0lTVEVSUyB7CVwKKyAgMSwgLyogUHJvZ3JhbSBDb3VudGVyICovCVwKKyAgMCwgLyogTGluayBSZWdpc3RlciAqLwlcCisgIDEsIC8qIFN0YWNrIFBvaW50ZXIgKi8JXAorICAwLCAvKiByMTIgKi8JCQlcCisgIDAsIC8qIHIxMSAqLwkJCVwKKyAgMCwgLyogcjEwICovCQkJXAorICAwLCAvKiByOSAqLwkJCVwKKyAgMCwgLyogcjggKi8JCQlcCisgIDAsIC8qIHI3ICovCQkJXAorICAwLCAvKiByNiAqLwkJCVwKKyAgMCwgLyogcjUgKi8JCQlcCisgIDAsIC8qIHI0ICovCQkJXAorICAwLCAvKiByMyAqLwkJCVwKKyAgMCwgLyogcjIgKi8JCQlcCisgIDAsIC8qIHIxICovCQkJXAorICAwLCAvKiByMCAqLwkJCVwKKyAgMCwgLyogZjE1ICovCQkJXAorICAwLCAvKiBmMTQgKi8JCQlcCisgIDAsIC8qIGYxMyAqLwkJCVwKKyAgMCwgLyogZjEyICovCQkJXAorICAwLCAvKiBmMTEgKi8JCQlcCisgIDAsIC8qIGYxMCAqLwkJCVwKKyAgMCwgLyogZjkgKi8JCQlcCisgIDAsIC8qIGY4ICovCQkJXAorICAwLCAvKiBmNyAqLwkJCVwKKyAgMCwgLyogZjYgKi8JCQlcCisgIDAsIC8qIGY1ICovCQkJXAorICAwLCAvKiBmNCAqLwkJCVwKKyAgMCwgLyogZjMgKi8JCQlcCisgIDAsIC8qIGYyKi8JCQlcCisgIDAsIC8qIGYxICovCQkJXAorICAwICAvKiBmMCAqLwkJCVwKK30KKworLyoKK0xpa2UgRklYRURfUkVHSVNURVJTIGJ1dCBoYXMgMSBmb3IgZWFjaCByZWdpc3RlciB0aGF0IGlzCitjbG9iYmVyZWQgKGluIGdlbmVyYWwpIGJ5IGZ1bmN0aW9uIGNhbGxzIGFzIHdlbGwgYXMgZm9yIGZpeGVkCityZWdpc3RlcnMuICBUaGlzIG1hY3JvIHRoZXJlZm9yZSBpZGVudGlmaWVzIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90CithdmFpbGFibGUgZm9yIGdlbmVyYWwgYWxsb2NhdGlvbiBvZiB2YWx1ZXMgdGhhdCBtdXN0IGxpdmUgYWNyb3NzCitmdW5jdGlvbiBjYWxscy4KKworSWYgYSByZWdpc3RlciBoYXMgMCBpbiBDQUxMX1VTRURfUkVHSVNURVJTLCB0aGUgY29tcGlsZXIKK2F1dG9tYXRpY2FsbHkgc2F2ZXMgaXQgb24gZnVuY3Rpb24gZW50cnkgYW5kIHJlc3RvcmVzIGl0IG9uIGZ1bmN0aW9uCitleGl0LCBpZiB0aGUgcmVnaXN0ZXIgaXMgdXNlZCB3aXRoaW4gdGhlIGZ1bmN0aW9uLgorKi8KKyNkZWZpbmUgQ0FMTF9VU0VEX1JFR0lTVEVSUyB7CVwKKyAgMSwgLyogUHJvZ3JhbSBDb3VudGVyICovCVwKKyAgMCwgLyogTGluayBSZWdpc3RlciAqLwlcCisgIDEsIC8qIFN0YWNrIFBvaW50ZXIgKi8JXAorICAxLCAvKiByMTIgKi8JCQlcCisgIDEsIC8qIHIxMSAqLwkJCVwKKyAgMSwgLyogcjEwICovCQkJXAorICAxLCAvKiByOSAqLwkJCVwKKyAgMSwgLyogcjggKi8JCQlcCisgIDAsIC8qIHI3ICovCQkJXAorICAwLCAvKiByNiAqLwkJCVwKKyAgMCwgLyogcjUgKi8JCQlcCisgIDAsIC8qIHI0ICovCQkJXAorICAwLCAvKiByMyAqLwkJCVwKKyAgMCwgLyogcjIgKi8JCQlcCisgIDAsIC8qIHIxICovCQkJXAorICAwLCAvKiByMCAqLwkJCVwKKyAgMSwgLyogZjE1ICovCQkJXAorICAxLCAvKiBmMTQgKi8JCQlcCisgIDEsIC8qIGYxMyAqLwkJCVwKKyAgMSwgLyogZjEyICovCQkJXAorICAxLCAvKiBmMTEgKi8JCQlcCisgIDEsIC8qIGYxMCAqLwkJCVwKKyAgMSwgLyogZjkgKi8JCQlcCisgIDEsIC8qIGY4ICovCQkJXAorICAwLCAvKiBmNyAqLwkJCVwKKyAgMCwgLyogZjYgKi8JCQlcCisgIDAsIC8qIGY1ICovCQkJXAorICAwLCAvKiBmNCAqLwkJCVwKKyAgMCwgLyogZjMgKi8JCQlcCisgIDAsIC8qIGYyKi8JCQlcCisgIDAsIC8qIGYxKi8JCQlcCisgIDAsIC8qIGYwICovCQkJXAorfQorCisvKiBJbnRlcnJ1cHQgZnVuY3Rpb25zIGNhbiBvbmx5IHVzZSByZWdpc3RlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgorICAgc2F2ZWQgYnkgdGhlIHByb2xvZ3VlLCBldmVuIGlmIHRoZXkgd291bGQgbm9ybWFsbHkgYmUKKyAgIGNhbGwtY2xvYmJlcmVkLiAgKi8KKyNkZWZpbmUgSEFSRF9SRUdOT19SRU5BTUVfT0soU1JDLCBEU1QpCQkJCQlcCisJKCEgSVNfSU5URVJSVVBUIChjZnVuLT5tYWNoaW5lLT5mdW5jX3R5cGUpIHx8CQkJXAorCQlyZWdzX2V2ZXJfbGl2ZVtEU1RdKQorCisKKy8qCitaZXJvIG9yIG1vcmUgQyBzdGF0ZW1lbnRzIHRoYXQgbWF5IGNvbmRpdGlvbmFsbHkgbW9kaWZ5IGZpdmUgdmFyaWFibGVzCitmaXhlZF9yZWdzLCBjYWxsX3VzZWRfcmVncywgZ2xvYmFsX3JlZ3MsCityZWdfbmFtZXMsIGFuZCByZWdfY2xhc3NfY29udGVudHMsIHRvIHRha2UgaW50byBhY2NvdW50CithbnkgZGVwZW5kZW5jZSBvZiB0aGVzZSByZWdpc3RlciBzZXRzIG9uIHRhcmdldCBmbGFncy4gIFRoZSBmaXJzdCB0aHJlZQorb2YgdGhlc2UgYXJlIG9mIHR5cGUgY2hhciBbXSAoaW50ZXJwcmV0ZWQgYXMgQm9vbGVhbiB2ZWN0b3JzKS4KK2dsb2JhbF9yZWdzIGlzIGEgY29uc3QgY2hhciAqW10sIGFuZAorcmVnX2NsYXNzX2NvbnRlbnRzIGlzIGEgSEFSRF9SRUdfU0VULiAgQmVmb3JlIHRoZSBtYWNybyBpcworY2FsbGVkLCBmaXhlZF9yZWdzLCBjYWxsX3VzZWRfcmVncywKK3JlZ19jbGFzc19jb250ZW50cywgYW5kIHJlZ19uYW1lcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKK2Zyb20gRklYRURfUkVHSVNURVJTLCBDQUxMX1VTRURfUkVHSVNURVJTLAorUkVHX0NMQVNTX0NPTlRFTlRTLCBhbmQgUkVHSVNURVJfTkFNRVMsIHJlc3BlY3RpdmVseS4KK2dsb2JhbF9yZWdzIGhhcyBiZWVuIGNsZWFyZWQsIGFuZCBhbnkgLWZmaXhlZC1bcmVnXSwKKy1mY2FsbC11c2VkLVtyZWddIGFuZCAtZmNhbGwtc2F2ZWQtW3JlZ10KK2NvbW1hbmQgb3B0aW9ucyBoYXZlIGJlZW4gYXBwbGllZC4KKworWW91IG5lZWQgbm90IGRlZmluZSB0aGlzIG1hY3JvIGlmIGl0IGhhcyBubyB3b3JrIHRvIGRvLgorCitJZiB0aGUgdXNhZ2Ugb2YgYW4gZW50aXJlIGNsYXNzIG9mIHJlZ2lzdGVycyBkZXBlbmRzIG9uIHRoZSB0YXJnZXQKK2ZsYWdzLCB5b3UgbWF5IGluZGljYXRlIHRoaXMgdG8gR0NDIGJ5IHVzaW5nIHRoaXMgbWFjcm8gdG8gbW9kaWZ5CitmaXhlZF9yZWdzIGFuZCBjYWxsX3VzZWRfcmVncyB0byAxIGZvciBlYWNoIG9mIHRoZQorcmVnaXN0ZXJzIGluIHRoZSBjbGFzc2VzIHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZCBieSBHQ0MuICBBbHNvIGRlZmluZQordGhlIG1hY3JvIFJFR19DTEFTU19GUk9NX0xFVFRFUiB0byByZXR1cm4gTk9fUkVHUyBpZiBpdAoraXMgY2FsbGVkIHdpdGggYSBsZXR0ZXIgZm9yIGEgY2xhc3MgdGhhdCBzaG91bGRuJ3QgYmUgdXNlZC4KKworIChIb3dldmVyLCBpZiB0aGlzIGNsYXNzIGlzIG5vdCBpbmNsdWRlZCBpbiBHRU5FUkFMX1JFR1MgYW5kIGFsbAorb2YgdGhlIGluc24gcGF0dGVybnMgd2hvc2UgY29uc3RyYWludHMgcGVybWl0IHRoaXMgY2xhc3MgYXJlCitjb250cm9sbGVkIGJ5IHRhcmdldCBzd2l0Y2hlcywgdGhlbiBHQ0Mgd2lsbCBhdXRvbWF0aWNhbGx5IGF2b2lkIHVzaW5nCit0aGVzZSByZWdpc3RlcnMgd2hlbiB0aGUgdGFyZ2V0IHN3aXRjaGVzIGFyZSBvcHBvc2VkIHRvIHRoZW0uKQorKi8KKyNkZWZpbmUgQ09ORElUSU9OQUxfUkVHSVNURVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgaW50IHJlZ25vOwkJCQkJCVwKKwkJCQkJCQkJXAorICAgICAgaWYgKFRBUkdFVF9TT0ZUX0ZMT0FUKQkJCSAgICAgICAgICAgICAgICBcCisJewkJCQkJCQlcCisJICBmb3IgKHJlZ25vID0gRklSU1RfRlBfUkVHTlVNOwkJCQlcCisJICAgICAgIHJlZ25vIDw9IExBU1RfRlBfUkVHTlVNOyArK3JlZ25vKQkgICAgICAgIFwKKwkgICAgZml4ZWRfcmVnc1tyZWdub10gPSBjYWxsX3VzZWRfcmVnc1tyZWdub10gPSAxOwlcCisJfQkJCQkJCQlcCisgICAgICBpZiAoZmxhZ19waWMpCQkJCQkJXAorCXsJCQkJCQkJXAorCSAgZml4ZWRfcmVnc1tQSUNfT0ZGU0VUX1RBQkxFX1JFR05VTV0gPSAxOwkJXAorCSAgY2FsbF91c2VkX3JlZ3NbUElDX09GRlNFVF9UQUJMRV9SRUdOVU1dID0gMTsJCVwKKwl9CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisKKy8qCitJZiB0aGUgcHJvZ3JhbSBjb3VudGVyIGhhcyBhIHJlZ2lzdGVyIG51bWJlciwgZGVmaW5lIHRoaXMgYXMgdGhhdAorcmVnaXN0ZXIgbnVtYmVyLiAgT3RoZXJ3aXNlLCBkbyBub3QgZGVmaW5lIGl0LgorKi8KKworI2RlZmluZSBMQVNUX0FWUjMyX1JFR05VTSAxNgorCisKKy8qKiBPcmRlciBvZiBBbGxvY2F0aW9uIG9mIFJlZ2lzdGVycyAqKi8KKworLyoKK0lmIGRlZmluZWQsIGFuIGluaXRpYWxpemVyIGZvciBhIHZlY3RvciBvZiBpbnRlZ2VycywgY29udGFpbmluZyB0aGUKK251bWJlcnMgb2YgaGFyZCByZWdpc3RlcnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIEdDQyBzaG91bGQgcHJlZmVyCit0byB1c2UgdGhlbSAoZnJvbSBtb3N0IHByZWZlcnJlZCB0byBsZWFzdCkuCisKK0lmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQsIHJlZ2lzdGVycyBhcmUgdXNlZCBsb3dlc3QgbnVtYmVyZWQgZmlyc3QKKyhhbGwgZWxzZSBiZWluZyBlcXVhbCkuCisKK09uZSB1c2Ugb2YgdGhpcyBtYWNybyBpcyBvbiBtYWNoaW5lcyB3aGVyZSB0aGUgaGlnaGVzdCBudW1iZXJlZAorcmVnaXN0ZXJzIG11c3QgYWx3YXlzIGJlIHNhdmVkIGFuZCB0aGUgc2F2ZS1tdWx0aXBsZS1yZWdpc3RlcnMKK2luc3RydWN0aW9uIHN1cHBvcnRzIG9ubHkgc2VxdWVuY2VzIG9mIGNvbnNlY3V0aXZlIHJlZ2lzdGVycy4gIE9uIHN1Y2gKK21hY2hpbmVzLCBkZWZpbmUgUkVHX0FMTE9DX09SREVSIHRvIGJlIGFuIGluaXRpYWxpemVyIHRoYXQgbGlzdHMKK3RoZSBoaWdoZXN0IG51bWJlcmVkIGFsbG9jYWJsZSByZWdpc3RlciBmaXJzdC4KKyovCisjZGVmaW5lIFJFR19BTExPQ19PUkRFUiAJXAorewkJCQlcCisgIElOVEVSTkFMX1JFR05VTSg4KSwJCVwKKyAgSU5URVJOQUxfUkVHTlVNKDkpLAkJXAorICBJTlRFUk5BTF9SRUdOVU0oMTApLAkJXAorICBJTlRFUk5BTF9SRUdOVU0oMTEpLAkJXAorICBJTlRFUk5BTF9SRUdOVU0oMTIpLAkJXAorICBMUl9SRUdOVU0sCQkJXAorICBJTlRFUk5BTF9SRUdOVU0oNyksCQlcCisgIElOVEVSTkFMX1JFR05VTSg2KSwJCVwKKyAgSU5URVJOQUxfUkVHTlVNKDUpLAkJXAorICBJTlRFUk5BTF9SRUdOVU0oNCksCQlcCisgIElOVEVSTkFMX1JFR05VTSgzKSwJCVwKKyAgSU5URVJOQUxfUkVHTlVNKDIpLAkJXAorICBJTlRFUk5BTF9SRUdOVU0oMSksCQlcCisgIElOVEVSTkFMX1JFR05VTSgwKSwJCVwKKyAgSU5URVJOQUxfRlBfUkVHTlVNKDE1KSwJXAorICBJTlRFUk5BTF9GUF9SRUdOVU0oMTQpLAlcCisgIElOVEVSTkFMX0ZQX1JFR05VTSgxMyksCVwKKyAgSU5URVJOQUxfRlBfUkVHTlVNKDEyKSwJXAorICBJTlRFUk5BTF9GUF9SRUdOVU0oMTEpLAlcCisgIElOVEVSTkFMX0ZQX1JFR05VTSgxMCksCVwKKyAgSU5URVJOQUxfRlBfUkVHTlVNKDkpLAlcCisgIElOVEVSTkFMX0ZQX1JFR05VTSg4KSwJXAorICBJTlRFUk5BTF9GUF9SRUdOVU0oNyksCVwKKyAgSU5URVJOQUxfRlBfUkVHTlVNKDYpLAlcCisgIElOVEVSTkFMX0ZQX1JFR05VTSg1KSwJXAorICBJTlRFUk5BTF9GUF9SRUdOVU0oNCksCVwKKyAgSU5URVJOQUxfRlBfUkVHTlVNKDMpLAlcCisgIElOVEVSTkFMX0ZQX1JFR05VTSgyKSwJXAorICBJTlRFUk5BTF9GUF9SRUdOVU0oMSksCVwKKyAgSU5URVJOQUxfRlBfUkVHTlVNKDApLAlcCisgIFNQX1JFR05VTSwgICAgICAgICAgIAkJXAorICBQQ19SRUdOVU0JCQlcCit9CisKKworLyoqIEhvdyBWYWx1ZXMgRml0IGluIFJlZ2lzdGVycyAqKi8KKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGhhcmQgcmVnaXN0ZXJzLCBzdGFydGluZworYXQgcmVnaXN0ZXIgbnVtYmVyIFJFR05PLCByZXF1aXJlZCB0byBob2xkIGEgdmFsdWUgb2YgbW9kZQorTU9ERS4KKworT24gYSBtYWNoaW5lIHdoZXJlIGFsbCByZWdpc3RlcnMgYXJlIGV4YWN0bHkgb25lIHdvcmQsIGEgc3VpdGFibGUKK2RlZmluaXRpb24gb2YgdGhpcyBtYWNybyBpcworCisjZGVmaW5lIEhBUkRfUkVHTk9fTlJFR1MoUkVHTk8sIE1PREUpICAgICAgICAgICAgXAorICAgKChHRVRfTU9ERV9TSVpFIChNT0RFKSArIFVOSVRTX1BFUl9XT1JEIC0gMSkgIFwKKyAgICAvIFVOSVRTX1BFUl9XT1JEKQorKi8KKyNkZWZpbmUgSEFSRF9SRUdOT19OUkVHUyhSRUdOTywgTU9ERSkgXAorICAoKHVuc2lnbmVkIGludCkoKEdFVF9NT0RFX1NJWkUoTU9ERSkgKyBVTklUU19QRVJfV09SRCAtMSApIC8gVU5JVFNfUEVSX1dPUkQpKQorCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCBpcyBub256ZXJvIGlmIGl0IGlzIHBlcm1pc3NpYmxlIHRvIHN0b3JlIGEgdmFsdWUKK29mIG1vZGUgTU9ERSBpbiBoYXJkIHJlZ2lzdGVyIG51bWJlciBSRUdOTyAob3IgaW4gc2V2ZXJhbAorcmVnaXN0ZXJzIHN0YXJ0aW5nIHdpdGggdGhhdCBvbmUpLiAgRm9yIGEgbWFjaGluZSB3aGVyZSBhbGwgcmVnaXN0ZXJzCithcmUgZXF1aXZhbGVudCwgYSBzdWl0YWJsZSBkZWZpbml0aW9uIGlzCisKKyAgI2RlZmluZSBIQVJEX1JFR05PX01PREVfT0soUkVHTk8sIE1PREUpIDEKKworWW91IG5lZWQgbm90IGluY2x1ZGUgY29kZSB0byBjaGVjayBmb3IgdGhlIG51bWJlcnMgb2YgZml4ZWQgcmVnaXN0ZXJzLAorYmVjYXVzZSB0aGUgYWxsb2NhdGlvbiBtZWNoYW5pc20gY29uc2lkZXJzIHRoZW0gdG8gYmUgYWx3YXlzIG9jY3VwaWVkLgorCitPbiBzb21lIG1hY2hpbmVzLCBkb3VibGUtcHJlY2lzaW9uIHZhbHVlcyBtdXN0IGJlIGtlcHQgaW4gZXZlbi9vZGQKK3JlZ2lzdGVyIHBhaXJzLiAgWW91IGNhbiBpbXBsZW1lbnQgdGhhdCBieSBkZWZpbmluZyB0aGlzIG1hY3JvIHRvIHJlamVjdAorb2RkIHJlZ2lzdGVyIG51bWJlcnMgZm9yIHN1Y2ggbW9kZXMuCisKK1RoZSBtaW5pbXVtIHJlcXVpcmVtZW50IGZvciBhIG1vZGUgdG8gYmUgT0sgaW4gYSByZWdpc3RlciBpcyB0aGF0IHRoZQorbW92W21vZGVdIGluc3RydWN0aW9uIHBhdHRlcm4gc3VwcG9ydCBtb3ZlcyBiZXR3ZWVuIHRoZQorcmVnaXN0ZXIgYW5kIG90aGVyIGhhcmQgcmVnaXN0ZXIgaW4gdGhlIHNhbWUgY2xhc3MgYW5kIHRoYXQgbW92aW5nIGEKK3ZhbHVlIGludG8gdGhlIHJlZ2lzdGVyIGFuZCBiYWNrIG91dCBub3QgYWx0ZXIgaXQuCisKK1NpbmNlIHRoZSBzYW1lIGluc3RydWN0aW9uIHVzZWQgdG8gbW92ZSB3b3JkX21vZGUgd2lsbCB3b3JrIGZvcgorYWxsIG5hcnJvd2VyIGludGVnZXIgbW9kZXMsIGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gYW55IG1hY2hpbmUgZm9yCitIQVJEX1JFR05PX01PREVfT0sgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVzZSBtb2RlcywgcHJvdmlkZWQKK3lvdSBkZWZpbmUgcGF0dGVybnMgbW92aGksIGV0Yy4sIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuICBUaGlzCitpcyB1c2VmdWwgYmVjYXVzZSBvZiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBIQVJEX1JFR05PX01PREVfT0sKK2FuZCBNT0RFU19USUVBQkxFX1A7IGl0IGlzIHZlcnkgZGVzaXJhYmxlIGZvciBhbGwgaW50ZWdlciBtb2RlcwordG8gYmUgdGllYWJsZS4KKworTWFueSBtYWNoaW5lcyBoYXZlIHNwZWNpYWwgcmVnaXN0ZXJzIGZvciBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLgorT2Z0ZW4gcGVvcGxlIGFzc3VtZSB0aGF0IGZsb2F0aW5nIHBvaW50IG1hY2hpbmUgbW9kZXMgYXJlIGFsbG93ZWQgb25seQoraW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgVGhpcyBpcyBub3QgdHJ1ZS4gIEFueSByZWdpc3RlcnMgdGhhdAorY2FuIGhvbGQgaW50ZWdlcnMgY2FuIHNhZmVseSBob2xkIGEgZmxvYXRpbmcgcG9pbnQgbWFjaGluZQorbW9kZSwgd2hldGhlciBvciBub3QgZmxvYXRpbmcgYXJpdGhtZXRpYyBjYW4gYmUgZG9uZSBvbiBpdCBpbiB0aG9zZQorcmVnaXN0ZXJzLiAgSW50ZWdlciBtb3ZlIGluc3RydWN0aW9ucyBjYW4gYmUgdXNlZCB0byBtb3ZlIHRoZSB2YWx1ZXMuCisKK09uIHNvbWUgbWFjaGluZXMsIHRob3VnaCwgdGhlIGNvbnZlcnNlIGlzIHRydWU6IGZpeGVkLXBvaW50IG1hY2hpbmUKK21vZGVzIG1heSBub3QgZ28gaW4gZmxvYXRpbmcgcmVnaXN0ZXJzLiAgVGhpcyBpcyB0cnVlIGlmIHRoZSBmbG9hdGluZworcmVnaXN0ZXJzIG5vcm1hbGl6ZSBhbnkgdmFsdWUgc3RvcmVkIGluIHRoZW0sIGJlY2F1c2Ugc3RvcmluZyBhCitub24tZmxvYXRpbmcgdmFsdWUgdGhlcmUgd291bGQgZ2FyYmxlIGl0LiAgSW4gdGhpcyBjYXNlLAorSEFSRF9SRUdOT19NT0RFX09LIHNob3VsZCByZWplY3QgZml4ZWQtcG9pbnQgbWFjaGluZSBtb2RlcyBpbgorZmxvYXRpbmcgcmVnaXN0ZXJzLiAgQnV0IGlmIHRoZSBmbG9hdGluZyByZWdpc3RlcnMgZG8gbm90IGF1dG9tYXRpY2FsbHkKK25vcm1hbGl6ZSwgaWYgeW91IGNhbiBzdG9yZSBhbnkgYml0IHBhdHRlcm4gaW4gb25lIGFuZCByZXRyaWV2ZSBpdAordW5jaGFuZ2VkIHdpdGhvdXQgYSB0cmFwLCB0aGVuIGFueSBtYWNoaW5lIG1vZGUgbWF5IGdvIGluIGEgZmxvYXRpbmcKK3JlZ2lzdGVyLCBzbyB5b3UgY2FuIGRlZmluZSB0aGlzIG1hY3JvIHRvIHNheSBzby4KKworVGhlIHByaW1hcnkgc2lnbmlmaWNhbmNlIG9mIHNwZWNpYWwgZmxvYXRpbmcgcmVnaXN0ZXJzIGlzIHJhdGhlciB0aGF0Cit0aGV5IGFyZSB0aGUgcmVnaXN0ZXJzIGFjY2VwdGFibGUgaW4gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYworaW5zdHJ1Y3Rpb25zLiAgSG93ZXZlciwgdGhpcyBpcyBvZiBubyBjb25jZXJuIHRvCitIQVJEX1JFR05PX01PREVfT0suICBZb3UgaGFuZGxlIGl0IGJ5IHdyaXRpbmcgdGhlIHByb3BlcgorY29uc3RyYWludHMgZm9yIHRob3NlIGluc3RydWN0aW9ucy4KKworT24gc29tZSBtYWNoaW5lcywgdGhlIGZsb2F0aW5nIHJlZ2lzdGVycyBhcmUgZXNwZWNpYWxseSBzbG93IHRvIGFjY2VzcywKK3NvIHRoYXQgaXQgaXMgYmV0dGVyIHRvIHN0b3JlIGEgdmFsdWUgaW4gYSBzdGFjayBmcmFtZSB0aGFuIGluIHN1Y2ggYQorcmVnaXN0ZXIgaWYgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBpcyBub3QgYmVpbmcgZG9uZS4gIEFzIGxvbmcgYXMgdGhlCitmbG9hdGluZyByZWdpc3RlcnMgYXJlIG5vdCBpbiBjbGFzcyBHRU5FUkFMX1JFR1MsIHRoZXkgd2lsbCBub3QKK2JlIHVzZWQgdW5sZXNzIHNvbWUgcGF0dGVybidzIGNvbnN0cmFpbnQgYXNrcyBmb3Igb25lLgorKi8KKyNkZWZpbmUgSEFSRF9SRUdOT19NT0RFX09LKFJFR05PLCBNT0RFKSBhdnIzMl9oYXJkX3JlZ25vX21vZGVfb2soUkVHTk8sIE1PREUpCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGlzIG5vbnplcm8gaWYgYSB2YWx1ZSBvZiBtb2RlCitNT0RFMSBpcyBhY2Nlc3NpYmxlIGluIG1vZGUgTU9ERTIgd2l0aG91dCBjb3B5aW5nLgorCitJZiBIQVJEX1JFR05PX01PREVfT0soUiwgTU9ERTEpIGFuZAorSEFSRF9SRUdOT19NT0RFX09LKFIsIE1PREUyKSBhcmUgYWx3YXlzIHRoZSBzYW1lIGZvcgorYW55IFIsIHRoZW4gTU9ERVNfVElFQUJMRV9QKE1PREUxLCBNT0RFMikKK3Nob3VsZCBiZSBub256ZXJvLiAgSWYgdGhleSBkaWZmZXIgZm9yIGFueSBSLCB5b3Ugc2hvdWxkIGRlZmluZQordGhpcyBtYWNybyB0byByZXR1cm4gemVybyB1bmxlc3Mgc29tZSBvdGhlciBtZWNoYW5pc20gZW5zdXJlcyB0aGUKK2FjY2Vzc2liaWxpdHkgb2YgdGhlIHZhbHVlIGluIGEgbmFycm93ZXIgbW9kZS4KKworWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB0byByZXR1cm4gbm9uemVybyBpbiBhcyBtYW55IGNhc2VzIGFzCitwb3NzaWJsZSBzaW5jZSBkb2luZyBzbyB3aWxsIGFsbG93IEdDQyB0byBwZXJmb3JtIGJldHRlciByZWdpc3RlcgorYWxsb2NhdGlvbi4KKyovCisjZGVmaW5lIE1PREVTX1RJRUFCTEVfUChNT0RFMSwgTU9ERTIpICBcCisgIChHRVRfTU9ERV9DTEFTUyAoTU9ERTEpID09IEdFVF9NT0RFX0NMQVNTIChNT0RFMikpCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdpc3RlciBDbGFzc2VzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCitBbiBlbnVtZXJhbCB0eXBlIHRoYXQgbXVzdCBiZSBkZWZpbmVkIHdpdGggYWxsIHRoZSByZWdpc3RlciBjbGFzcyBuYW1lcworYXMgZW51bWVyYWwgdmFsdWVzLiAgTk9fUkVHUyBtdXN0IGJlIGZpcnN0LiAgQUxMX1JFR1MKK211c3QgYmUgdGhlIGxhc3QgcmVnaXN0ZXIgY2xhc3MsIGZvbGxvd2VkIGJ5IG9uZSBtb3JlIGVudW1lcmFsIHZhbHVlLAorTElNX1JFR19DTEFTU0VTLCB3aGljaCBpcyBub3QgYSByZWdpc3RlciBjbGFzcyBidXQgcmF0aGVyCit0ZWxscyBob3cgbWFueSBjbGFzc2VzIHRoZXJlIGFyZS4KKworRWFjaCByZWdpc3RlciBjbGFzcyBoYXMgYSBudW1iZXIsIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiBjYXN0aW5nCit0aGUgY2xhc3MgbmFtZSB0byB0eXBlIGludC4gIFRoZSBudW1iZXIgc2VydmVzIGFzIGFuIGluZGV4CitpbiBtYW55IG9mIHRoZSB0YWJsZXMgZGVzY3JpYmVkIGJlbG93LgorKi8KK2VudW0gcmVnX2NsYXNzCit7CisgIE5PX1JFR1MsCisgIEdFTkVSQUxfUkVHUywKKyAgRlBfUkVHUywKKyAgQUxMX1JFR1MsCisgIExJTV9SRUdfQ0xBU1NFUworfTsKKworLyoKK1RoZSBudW1iZXIgb2YgZGlzdGluY3QgcmVnaXN0ZXIgY2xhc3NlcywgZGVmaW5lZCBhcyBmb2xsb3dzOgorICAjZGVmaW5lIE5fUkVHX0NMQVNTRVMgKGludCkgTElNX1JFR19DTEFTU0VTCisqLworI2RlZmluZSBOX1JFR19DTEFTU0VTIChpbnQpTElNX1JFR19DTEFTU0VTCisKKy8qCitBbiBpbml0aWFsaXplciBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBhcyBDIHN0cmluZworY29uc3RhbnRzLiAgVGhlc2UgbmFtZXMgYXJlIHVzZWQgaW4gd3JpdGluZyBzb21lIG9mIHRoZSBkZWJ1Z2dpbmcgZHVtcHMuCisqLworI2RlZmluZSBSRUdfQ0xBU1NfTkFNRVMJCVwKK3sJCQkJXAorICAiTk9fUkVHUyIsCQkJXAorICAiR0VORVJBTF9SRUdTIiwJCVwKKyAgIkZMT0FUSU5HX1BPSU5UX1JFR1MiLAlcCisgICJBTExfUkVHUyIJCQlcCit9CisKKy8qCitBbiBpbml0aWFsaXplciBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgcmVnaXN0ZXIgY2xhc3NlcywgYXMgaW50ZWdlcnMKK3doaWNoIGFyZSBiaXQgbWFza3MuICBUaGUgbnRoIGludGVnZXIgc3BlY2lmaWVzIHRoZSBjb250ZW50cyBvZiBjbGFzcworbi4gIFRoZSB3YXkgdGhlIGludGVnZXIgbWFzayBpcyBpbnRlcnByZXRlZCBpcyB0aGF0CityZWdpc3RlciByIGlzIGluIHRoZSBjbGFzcyBpZiBtYXNrICYgKDEgPDwgcikgaXMgMS4KKworV2hlbiB0aGUgbWFjaGluZSBoYXMgbW9yZSB0aGFuIDMyIHJlZ2lzdGVycywgYW4gaW50ZWdlciBkb2VzIG5vdCBzdWZmaWNlLgorVGhlbiB0aGUgaW50ZWdlcnMgYXJlIHJlcGxhY2VkIGJ5IHN1Yi1pbml0aWFsaXplcnMsIGJyYWNlZCBncm91cGluZ3MgY29udGFpbmluZworc2V2ZXJhbCBpbnRlZ2Vycy4gIEVhY2ggc3ViLWluaXRpYWxpemVyIG11c3QgYmUgc3VpdGFibGUgYXMgYW4gaW5pdGlhbGl6ZXIKK2ZvciB0aGUgdHlwZSBIQVJEX1JFR19TRVQgd2hpY2ggaXMgZGVmaW5lZCBpbiBoYXJkLXJlZy1zZXQuaC4KK0luIHRoaXMgc2l0dWF0aW9uLCB0aGUgZmlyc3QgaW50ZWdlciBpbiBlYWNoIHN1Yi1pbml0aWFsaXplciBjb3JyZXNwb25kcyB0bworcmVnaXN0ZXJzIDAgdGhyb3VnaCAzMSwgdGhlIHNlY29uZCBpbnRlZ2VyIHRvIHJlZ2lzdGVycyAzMiB0aHJvdWdoIDYzLCBhbmQKK3NvIG9uLgorKi8KKyNkZWZpbmUgUkVHX0NMQVNTX0NPTlRFTlRTIHsJCVwKKyAgezB4MDAwMDAwMDB9LCAvKiBOT19SRUdTICovCQlcCisgIHsweDAwMDBGRkZGfSwgLyogR0VORVJBTF9SRUdTICovCVwKKyAgezB4RkZGRjAwMDB9LCAvKiBGUF9SRUdTICovCQlcCisgIHsweDdGRkZGRkZGfSwgLyogQUxMX1JFR1MgKi8JCVwKK30KKworCisvKgorQSBDIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgYSByZWdpc3RlciBjbGFzcyBjb250YWluaW5nIGhhcmQgcmVnaXN0ZXIKK1JFR05PLiAgSW4gZ2VuZXJhbCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1Y2ggY2xhc3M7IGNob29zZSBhIGNsYXNzCit3aGljaCBpcyBtaW5pbWFsLCBtZWFuaW5nIHRoYXQgbm8gc21hbGxlciBjbGFzcyBhbHNvIGNvbnRhaW5zIHRoZQorcmVnaXN0ZXIuCisqLworI2RlZmluZSBSRUdOT19SRUdfQ0xBU1MoUkVHTk8pICgoUkVHTk8gPCAxNikgPyBHRU5FUkFMX1JFR1MgOiBGUF9SRUdTKQorCisvKgorQSBtYWNybyB3aG9zZSBkZWZpbml0aW9uIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byB3aGljaCBhIHZhbGlkCitiYXNlIHJlZ2lzdGVyIG11c3QgYmVsb25nLiAgQSBiYXNlIHJlZ2lzdGVyIGlzIG9uZSB1c2VkIGluIGFuIGFkZHJlc3MKK3doaWNoIGlzIHRoZSByZWdpc3RlciB2YWx1ZSBwbHVzIGEgZGlzcGxhY2VtZW50LgorKi8KKyNkZWZpbmUgQkFTRV9SRUdfQ0xBU1MgR0VORVJBTF9SRUdTCisKKy8qCitUaGlzIGlzIGEgdmFyaWF0aW9uIG9mIHRoZSBCQVNFX1JFR19DTEFTUyBtYWNybyB3aGljaCBhbGxvd3MKK3RoZSBzZWxlY3Rpb24gb2YgYSBiYXNlIHJlZ2lzdGVyIGluIGEgbW9kZSBkZXBlbmVkZW50IG1hbm5lci4gIElmCittb2RlIGlzIFZPSURtb2RlIHRoZW4gaXQgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcworQkFTRV9SRUdfQ0xBU1MuCisqLworI2RlZmluZSBNT0RFX0JBU0VfUkVHX0NMQVNTKE1PREUpIEJBU0VfUkVHX0NMQVNTCisKKy8qCitBIG1hY3JvIHdob3NlIGRlZmluaXRpb24gaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHdoaWNoIGEgdmFsaWQKK2luZGV4IHJlZ2lzdGVyIG11c3QgYmVsb25nLiAgQW4gaW5kZXggcmVnaXN0ZXIgaXMgb25lIHVzZWQgaW4gYW4KK2FkZHJlc3Mgd2hlcmUgaXRzIHZhbHVlIGlzIGVpdGhlciBtdWx0aXBsaWVkIGJ5IGEgc2NhbGUgZmFjdG9yIG9yCithZGRlZCB0byBhbm90aGVyIHJlZ2lzdGVyIChhcyB3ZWxsIGFzIGFkZGVkIHRvIGEgZGlzcGxhY2VtZW50KS4KKyovCisjZGVmaW5lIElOREVYX1JFR19DTEFTUyBCQVNFX1JFR19DTEFTUworCisvKgorQSBDIGV4cHJlc3Npb24gd2hpY2ggZGVmaW5lcyB0aGUgbWFjaGluZS1kZXBlbmRlbnQgb3BlcmFuZCBjb25zdHJhaW50CitsZXR0ZXJzIGZvciByZWdpc3RlciBjbGFzc2VzLiAgSWYgQ0hBUiBpcyBzdWNoIGEgbGV0dGVyLCB0aGUKK3ZhbHVlIHNob3VsZCBiZSB0aGUgcmVnaXN0ZXIgY2xhc3MgY29ycmVzcG9uZGluZyB0byBpdC4gIE90aGVyd2lzZSwKK3RoZSB2YWx1ZSBzaG91bGQgYmUgTk9fUkVHUy4gIFRoZSByZWdpc3RlciBsZXR0ZXIgciwKK2NvcnJlc3BvbmRpbmcgdG8gY2xhc3MgR0VORVJBTF9SRUdTLCB3aWxsIG5vdCBiZSBwYXNzZWQKK3RvIHRoaXMgbWFjcm87IHlvdSBkbyBub3QgbmVlZCB0byBoYW5kbGUgaXQuCisqLworI2RlZmluZSBSRUdfQ0xBU1NfRlJPTV9MRVRURVIoQ0hBUikgKChDSEFSKSA9PSAnZicgPyBGUF9SRUdTIDogTk9fUkVHUykKKworCisvKiBUaGVzZSBhc3N1bWUgdGhhdCBSRUdOTyBpcyBhIGhhcmQgb3IgcHNldWRvIHJlZyBudW1iZXIuCisgICBUaGV5IGdpdmUgbm9uemVybyBvbmx5IGlmIFJFR05PIGlzIGEgaGFyZCByZWcgb2YgdGhlIHN1aXRhYmxlIGNsYXNzCisgICBvciBhIHBzZXVkbyByZWcgY3VycmVudGx5IGFsbG9jYXRlZCB0byBhIHN1aXRhYmxlIGhhcmQgcmVnLgorICAgU2luY2UgdGhleSB1c2UgcmVnX3JlbnVtYmVyLCB0aGV5IGFyZSBzYWZlIG9ubHkgb25jZSByZWdfcmVudW1iZXIKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCwgd2hpY2ggaGFwcGVucyBpbiBsb2NhbC1hbGxvYy5jLiAgKi8KKyNkZWZpbmUgVEVTVF9SRUdOTyhSLCBURVNULCBWQUxVRSkgXAorICAoKFIgVEVTVCBWQUxVRSkgfHwgKCh1bnNpZ25lZCkgcmVnX3JlbnVtYmVyW1JdIFRFU1QgVkFMVUUpKQorCisvKgorQSBDIGV4cHJlc3Npb24gd2hpY2ggaXMgbm9uemVybyBpZiByZWdpc3RlciBudW1iZXIgbnVtIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBiYXNlCityZWdpc3RlciBpbiBvcGVyYW5kIGFkZHJlc3Nlcy4gSXQgbWF5IGJlIGVpdGhlciBhIHN1aXRhYmxlIGhhcmQgcmVnaXN0ZXIgb3IgYSBwc2V1ZG8KK3JlZ2lzdGVyIHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIHN1Y2ggYSBoYXJkIHJlZ2lzdGVyLgorKi8KKyNkZWZpbmUgUkVHTk9fT0tfRk9SX0JBU0VfUChOVU0pICBURVNUX1JFR05PKE5VTSwgPD0sIExBU1RfUkVHTlVNKQorCisvKgorQSBDIGV4cHJlc3Npb24gd2hpY2ggaXMgbm9uemVybyBpZiByZWdpc3RlciBudW1iZXIgTlVNIGlzCitzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIGluZGV4IHJlZ2lzdGVyIGluIG9wZXJhbmQgYWRkcmVzc2VzLiAgSXQgbWF5IGJlCitlaXRoZXIgYSBzdWl0YWJsZSBoYXJkIHJlZ2lzdGVyIG9yIGEgcHNldWRvIHJlZ2lzdGVyIHRoYXQgaGFzIGJlZW4KK2FsbG9jYXRlZCBzdWNoIGEgaGFyZCByZWdpc3Rlci4KKworVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbiBpbmRleCByZWdpc3RlciBhbmQgYSBiYXNlIHJlZ2lzdGVyIGlzIHRoYXQKK3RoZSBpbmRleCByZWdpc3RlciBtYXkgYmUgc2NhbGVkLiAgSWYgYW4gYWRkcmVzcyBpbnZvbHZlcyB0aGUgc3VtIG9mCit0d28gcmVnaXN0ZXJzLCBuZWl0aGVyIG9uZSBvZiB0aGVtIHNjYWxlZCwgdGhlbiBlaXRoZXIgb25lIG1heSBiZQorbGFiZWxlZCB0aGUgYGBiYXNlJycgYW5kIHRoZSBvdGhlciB0aGUgYGBpbmRleCcnOyBidXQgd2hpY2hldmVyCitsYWJlbGluZyBpcyB1c2VkIG11c3QgZml0IHRoZSBtYWNoaW5lJ3MgY29uc3RyYWludHMgb2Ygd2hpY2ggcmVnaXN0ZXJzCittYXkgc2VydmUgaW4gZWFjaCBjYXBhY2l0eS4gIFRoZSBjb21waWxlciB3aWxsIHRyeSBib3RoIGxhYmVsaW5ncywKK2xvb2tpbmcgZm9yIG9uZSB0aGF0IGlzIHZhbGlkLCBhbmQgd2lsbCByZWxvYWQgb25lIG9yIGJvdGggcmVnaXN0ZXJzCitvbmx5IGlmIG5laXRoZXIgbGFiZWxpbmcgd29ya3MuCisqLworI2RlZmluZSBSRUdOT19PS19GT1JfSU5ERVhfUChOVU0pIFRFU1RfUkVHTk8oTlVNLCA8PSwgTEFTVF9SRUdOVU0pCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IHBsYWNlcyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVnaXN0ZXIgY2xhc3MKK3RvIHVzZSB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byBjb3B5IHZhbHVlIFggaW50byBhIHJlZ2lzdGVyIGluIGNsYXNzCitDTEFTUy4gIFRoZSB2YWx1ZSBpcyBhIHJlZ2lzdGVyIGNsYXNzOyBwZXJoYXBzIENMQVNTLCBvciBwZXJoYXBzCithbm90aGVyLCBzbWFsbGVyIGNsYXNzLiAgT24gbWFueSBtYWNoaW5lcywgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGlzCitzYWZlOiAjZGVmaW5lIFBSRUZFUlJFRF9SRUxPQURfQ0xBU1MoWCxDTEFTUykgQ0xBU1MKKworU29tZXRpbWVzIHJldHVybmluZyBhIG1vcmUgcmVzdHJpY3RpdmUgY2xhc3MgbWFrZXMgYmV0dGVyIGNvZGUuICBGb3IKK2V4YW1wbGUsIG9uIHRoZSA2ODAwMCwgd2hlbiBYIGlzIGFuIGludGVnZXIgY29uc3RhbnQgdGhhdCBpcyBpbiByYW5nZQorZm9yIGEgJ21vdmVxJyBpbnN0cnVjdGlvbiwgdGhlIHZhbHVlIG9mIHRoaXMgbWFjcm8gaXMgYWx3YXlzCitEQVRBX1JFR1MgYXMgbG9uZyBhcyBDTEFTUyBpbmNsdWRlcyB0aGUgZGF0YSByZWdpc3RlcnMuCitSZXF1aXJpbmcgYSBkYXRhIHJlZ2lzdGVyIGd1YXJhbnRlZXMgdGhhdCBhICdtb3ZlcScgd2lsbCBiZSB1c2VkLgorCitJZiBYIGlzIGEgY29uc3RfZG91YmxlLCBieSByZXR1cm5pbmcgTk9fUkVHUworeW91IGNhbiBmb3JjZSBYIGludG8gYSBtZW1vcnkgY29uc3RhbnQuICBUaGlzIGlzIHVzZWZ1bCBvbgorY2VydGFpbiBtYWNoaW5lcyB3aGVyZSBpbW1lZGlhdGUgZmxvYXRpbmcgdmFsdWVzIGNhbm5vdCBiZSBsb2FkZWQgaW50bworY2VydGFpbiBraW5kcyBvZiByZWdpc3RlcnMuCisqLworI2RlZmluZSBQUkVGRVJSRURfUkVMT0FEX0NMQVNTKFgsIENMQVNTKSAgQ0xBU1MKKworCisKKy8qCitBIEMgZXhwcmVzc2lvbiBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHJlZ2lzdGVycworb2YgY2xhc3MgQ0xBU1MgbmVlZGVkIHRvIGhvbGQgYSB2YWx1ZSBvZiBtb2RlIE1PREUuCisKK1RoaXMgaXMgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBtYWNybyBIQVJEX1JFR05PX05SRUdTLiAgSW4gZmFjdCwKK3RoZSB2YWx1ZSBvZiB0aGUgbWFjcm8gQ0xBU1NfTUFYX05SRUdTKENMQVNTLCBNT0RFKQorc2hvdWxkIGJlIHRoZSBtYXhpbXVtIHZhbHVlIG9mIEhBUkRfUkVHTk9fTlJFR1MoUkVHTk8sIE1PREUpCitmb3IgYWxsIFJFR05PIHZhbHVlcyBpbiB0aGUgY2xhc3MgQ0xBU1MuCisKK1RoaXMgbWFjcm8gaGVscHMgY29udHJvbCB0aGUgaGFuZGxpbmcgb2YgbXVsdGlwbGUtd29yZCB2YWx1ZXMKK2luIHRoZSByZWxvYWQgcGFzcy4KKyovCisjZGVmaW5lIENMQVNTX01BWF9OUkVHUyhDTEFTUywgTU9ERSkgLyogVG9EbzpmaXhtZSAqLyBcCisgICh1bnNpZ25lZCBpbnQpKChHRVRfTU9ERV9TSVpFKE1PREUpICsgVU5JVFNfUEVSX1dPUkQgLSAxKSAvIFVOSVRTX1BFUl9XT1JEKQorCisKKy8qCisgIFVzaW5nIENPTlNUX09LX0ZPUl9DT05TVFJBSU5UX1AgaW5zdGVhZCBvZiBDT05TX09LX0ZPUl9MRVRURVJfUAorICBpbiBvcmRlciB0byBzdXBwb3J0IGNvbnN0cmFpbnRzIHdpdGggbW9yZSB0aGFuIG9uZSBsZXR0ZXIuCisgIE9ubHkgdHdvIGxldHRlcnMgYXJlIHRoZW4gdXNlZCBmb3IgY29uc3RhbnQgY29uc3RyYWludHMsCisgIHRoZSBsZXR0ZXIgJ0snIGFuZCB0aGUgbGV0dGVyICdJJy4gVGhlIGNvbnN0cmFpbnQgc3RhcnRpbmcgd2l0aAorICB0aGVzZSBsZXR0ZXJzIG11c3QgY29uc2lzdCBvZiBmb3VyIGNoYXJhY3RlcnMuIFRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nCisgICdLJyBvciAnSScgbXVzdCBiZSBlaXRoZXIgJ3UnICh1bnNpZ25lZCkgb3IgJ3MnIChzaWduZWQpIHRvIHNwZWNpZnkKKyAgaWYgdGhlIGNvbnN0YW50IGlzIHplcm8gb3Igc2lnbiBleHRlbmRlZC4gVGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMgc3BlY2lmeQorICB0aGUgbGVuZ3RoIGluIGJpdHMgb2YgdGhlIGNvbnN0YW50LiBUaGUgYmFzZSBjb25zdHJhaW50IGxldHRlciAnSScgbWVhbnMKKyAgdGhhdCB0aGlzIGlzIGFuIG5lZ2F0ZWQgY29uc3RhbnQsIG1lYW5pbmcgdGhhdCBhY3R1YWxseSAtVkFMIHNob3VsZCBiZQorICBjaGVja2VkIHRvIGxpZSB3aXRoaW5nIHRoZSB2YWxpZCByYW5nZSBpbnN0ZWFkIG9mIFZBTCB3aGljaCBpcyB1c2VkIHdoZW4KKyAgJ0snIGlzIHRoZSBiYXNlIGNvbnN0cmFpbnQgbGV0dGVyLgorCisqLworCisjZGVmaW5lIENPTlNUUkFJTlRfTEVOKEMsIFNUUikJCQkJXAorICAoICgoQykgPT0gJ0snIHx8IChDKSA9PSAnSScpID8gIDQgOgkJCVwKKyAgICAoKEMpID09ICdSJykgPyAgNSA6CQkJCQlcCisgICAgKChDKSA9PSAnUCcpID8gLTEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUZBVUxUX0NPTlNUUkFJTlRfTEVOKChDKSwgKFNUUikpICkKKworI2RlZmluZSBDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKFZBTFVFLCBDLCBTVFIpCVwKKyAgYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcChWQUxVRSwgQywgU1RSKQorCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBvcGVyYW5kIGNvbnN0cmFpbnQKK2xldHRlcnMgdGhhdCBzcGVjaWZ5IHBhcnRpY3VsYXIgcmFuZ2VzIG9mIGNvbnN0X2RvdWJsZSB2YWx1ZXMgKCdHJyBvciAnSCcpLgorCitJZiBDIGlzIG9uZSBvZiB0aG9zZSBsZXR0ZXJzLCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgY2hlY2sgdGhhdAorVkFMVUUsIGFuIFJUWCBvZiBjb2RlIGNvbnN0X2RvdWJsZSwgaXMgaW4gdGhlIGFwcHJvcHJpYXRlCityYW5nZSBhbmQgcmV0dXJuIDEgaWYgc28sIDAgb3RoZXJ3aXNlLiAgSWYgQyBpcyBub3Qgb25lIG9mIHRob3NlCitsZXR0ZXJzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIDAgcmVnYXJkbGVzcyBvZiBWQUxVRS4KKworY29uc3RfZG91YmxlIGlzIHVzZWQgZm9yIGFsbCBmbG9hdGluZy1wb2ludCBjb25zdGFudHMgYW5kIGZvcgorREltb2RlIGZpeGVkLXBvaW50IGNvbnN0YW50cy4gIEEgZ2l2ZW4gbGV0dGVyIGNhbiBhY2NlcHQgZWl0aGVyCitvciBib3RoIGtpbmRzIG9mIHZhbHVlcy4gIEl0IGNhbiB1c2UgR0VUX01PREUgdG8gZGlzdGluZ3Vpc2gKK2JldHdlZW4gdGhlc2Uga2luZHMuCisqLworI2RlZmluZSBDT05TVF9ET1VCTEVfT0tfRk9SX0xFVFRFUl9QKE9QLCBDKSBcCisgICgoQykgPT0gJ0cnID8gYXZyMzJfY29uc3RfZG91YmxlX2ltbWVkaWF0ZShPUCkgOiAwKQorCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSBvcHRpb25hbCBtYWNoaW5lLWRlcGVuZGVudCBjb25zdHJhaW50CitsZXR0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VncmVnYXRlIHNwZWNpZmljIHR5cGVzIG9mIG9wZXJhbmRzLCB1c3VhbGx5CittZW1vcnkgcmVmZXJlbmNlcywgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gIEFueSBsZXR0ZXIgdGhhdCBpcyBub3QKK2Vsc2V3aGVyZSBkZWZpbmVkIGFuZCBub3QgbWF0Y2hlZCBieSBSRUdfQ0xBU1NfRlJPTV9MRVRURVIKK21heSBiZSB1c2VkLiAgTm9ybWFsbHkgdGhpcyBtYWNybyB3aWxsIG5vdCBiZSBkZWZpbmVkLgorCitJZiBpdCBpcyByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCBtYWNoaW5lLCBpdCBzaG91bGQgcmV0dXJuIDEKK2lmIFZBTFVFIGNvcnJlc3BvbmRzIHRvIHRoZSBvcGVyYW5kIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhlCitjb25zdHJhaW50IGxldHRlciBDLiAgSWYgQyBpcyBub3QgZGVmaW5lZCBhcyBhbiBleHRyYQorY29uc3RyYWludCwgdGhlIHZhbHVlIHJldHVybmVkIHNob3VsZCBiZSAwIHJlZ2FyZGxlc3Mgb2YgVkFMVUUuCisKK0ZvciBleGFtcGxlLCBvbiB0aGUgUk9NUCwgbG9hZCBpbnN0cnVjdGlvbnMgY2Fubm90IGhhdmUgdGhlaXIgb3V0cHV0CitpbiByMCBpZiB0aGUgbWVtb3J5IHJlZmVyZW5jZSBjb250YWlucyBhIHN5bWJvbGljIGFkZHJlc3MuICBDb25zdHJhaW50CitsZXR0ZXIgJ1EnIGlzIGRlZmluZWQgYXMgcmVwcmVzZW50aW5nIGEgbWVtb3J5IGFkZHJlc3MgdGhhdCBkb2VzCitub3QgY29udGFpbiBhIHN5bWJvbGljIGFkZHJlc3MuICBBbiBhbHRlcm5hdGl2ZSBpcyBzcGVjaWZpZWQgd2l0aAorYSAnUScgY29uc3RyYWludCBvbiB0aGUgaW5wdXQgYW5kICdyJyBvbiB0aGUgb3V0cHV0LiAgVGhlIG5leHQKK2FsdGVybmF0aXZlIHNwZWNpZmllcyAnbScgb24gdGhlIGlucHV0IGFuZCBhIHJlZ2lzdGVyIGNsYXNzIHRoYXQKK2RvZXMgbm90IGluY2x1ZGUgcjAgb24gdGhlIG91dHB1dC4KKyovCisjZGVmaW5lIEVYVFJBX0NPTlNUUkFJTlRfU1RSKE9QLCBDLCBTVFIpCQkJCVwKKyAgKChDKSA9PSAnVycgPyBhdnIzMl9hZGRyZXNzX29wZXJhbmQoT1AsIEdFVF9NT0RFKE9QKSkgOgkJXAorICAgKEMpID09ICdSJyA/IChhdnIzMl9pbmRpcmVjdF9yZWdpc3Rlcl9vcGVyYW5kKE9QLCBHRVRfTU9ERShPUCkpIHx8CVwKKyAgICAgICAgICAgICAgICAgKGF2cjMyX2ltbV9kaXNwX21lbW9yeV9vcGVyYW5kKE9QLCBHRVRfTU9ERShPUCkpCVwKKyAgICAgICAgICAgICAgICAgICYmIGF2cjMyX2NvbnN0X29rX2Zvcl9jb25zdHJhaW50X3AoCQkJXAorCQkJCUlOVFZBTChYRVhQKFhFWFAoT1AsIDApLCAxKSksCQlcCisJCQkJKFNUUilbMV0sICYoU1RSKVsxXSkpKSA6CQlcCisgICAoQykgPT0gJ1MnID8gYXZyMzJfaW5kZXhlZF9tZW1vcnlfb3BlcmFuZChPUCwgR0VUX01PREUoT1ApKSA6CVwKKyAgIChDKSA9PSAnVCcgPyBhdnIzMl9jb25zdF9wb29sX3JlZl9vcGVyYW5kKE9QLCBHRVRfTU9ERShPUCkpIDoJXAorICAgKEMpID09ICdVJyA/IFNZTUJPTF9SRUZfUkNBTExfRlVOQ1RJT05fUChPUCkgOgkJCVwKKyAgIChDKSA9PSAnWicgPyBhdnIzMl9jb3BfbWVtb3J5X29wZXJhbmQoT1AsIEdFVF9NT0RFKE9QKSkgOgkJXAorICAgKEMpID09ICdRJyA/IGF2cjMyX25vbl9ybXdfbWVtb3J5X29wZXJhbmQoT1AsIEdFVF9NT0RFKE9QKSkgOgkJXAorICAgKEMpID09ICdZJyA/IGF2cjMyX3Jtd19tZW1vcnlfb3BlcmFuZChPUCwgR0VUX01PREUoT1ApKSA6ICAgICAgICAgICAgXAorICAgMCkKKworCisjZGVmaW5lIEVYVFJBX01FTU9SWV9DT05TVFJBSU5UKEMsIFNUUikgKCAoKEMpID09ICdSJykgfHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMpID09ICdRJykgfHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMpID09ICdTJykgfHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMpID09ICdZJykgfHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEMpID09ICdaJykgKQorCisKKy8qIFJldHVybnMgbm9uemVybyBpZiBvcCBpcyBhIGZ1bmN0aW9uIFNZTUJPTF9SRUYgd2hpY2gKKyAgIGNhbiBiZSBjYWxsZWQgdXNpbmcgYW4gcmNhbGwgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgU1lNQk9MX1JFRl9SQ0FMTF9GVU5DVElPTl9QKG9wKSAgXAorICAoIEdFVF9DT0RFKG9wKSA9PSBTWU1CT0xfUkVGICAgICAgICAgICBcCisgICAgJiYgU1lNQk9MX1JFRl9GVU5DVElPTl9QKG9wKSAgICAgICAgIFwKKyAgICAmJiBTWU1CT0xfUkVGX0xPQ0FMX1Aob3ApICAgICAgICAgICAgXAorICAgICYmICFTWU1CT0xfUkVGX0VYVEVSTkFMX1Aob3ApICAgICAgICBcCisgICAgJiYgIVRBUkdFVF9IQVNfQVNNX0FERFJfUFNFVURPUyApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YWNrIExheW91dCBhbmQgQ2FsbGluZyBDb252ZW50aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQmFzaWMgU3RhY2sgTGF5b3V0ICoqLworCisvKgorRGVmaW5lIHRoaXMgbWFjcm8gaWYgcHVzaGluZyBhIHdvcmQgb250byB0aGUgc3RhY2sgbW92ZXMgdGhlIHN0YWNrCitwb2ludGVyIHRvIGEgc21hbGxlciBhZGRyZXNzLgorCitXaGVuIHdlIHNheSwgYGBkZWZpbmUgdGhpcyBtYWNybyBpZiAuLi4sJycgaXQgbWVhbnMgdGhhdCB0aGUKK2NvbXBpbGVyIGNoZWNrcyB0aGlzIG1hY3JvIG9ubHkgd2l0aCAjaWZkZWYgc28gdGhlIHByZWNpc2UKK2RlZmluaXRpb24gdXNlZCBkb2VzIG5vdCBtYXR0ZXIuCisqLworLyogcHVzaG0gZGVjcmVjZSBTUDogKigtLVNQKSA8LS0gUnggKi8KKyNkZWZpbmUgU1RBQ0tfR1JPV1NfRE9XTldBUkQKKworLyoKK1RoaXMgbWFjcm8gZGVmaW5lcyB0aGUgb3BlcmF0aW9uIHVzZWQgd2hlbiBzb21ldGhpbmcgaXMgcHVzaGVkCitvbiB0aGUgc3RhY2suICBJbiBSVEwsIGEgcHVzaCBvcGVyYXRpb24gd2lsbCBiZQorKHNldCAobWVtIChTVEFDS19QVVNIX0NPREUgKHJlZyBzcCkpKSAuLi4pCisKK1RoZSBjaG9pY2VzIGFyZSBQUkVfREVDLCBQT1NUX0RFQywgUFJFX0lOQywKK2FuZCBQT1NUX0lOQy4gIFdoaWNoIG9mIHRoZXNlIGlzIGNvcnJlY3QgZGVwZW5kcyBvbgordGhlIHN0YWNrIGRpcmVjdGlvbiBhbmQgb24gd2hldGhlciB0aGUgc3RhY2sgcG9pbnRlciBwb2ludHMKK3RvIHRoZSBsYXN0IGl0ZW0gb24gdGhlIHN0YWNrIG9yIHdoZXRoZXIgaXQgcG9pbnRzIHRvIHRoZQorc3BhY2UgZm9yIHRoZSBuZXh0IGl0ZW0gb24gdGhlIHN0YWNrLgorCitUaGUgZGVmYXVsdCBpcyBQUkVfREVDIHdoZW4gU1RBQ0tfR1JPV1NfRE9XTldBUkQgaXMKK2RlZmluZWQsIHdoaWNoIGlzIGFsbW9zdCBhbHdheXMgcmlnaHQsIGFuZCBQUkVfSU5DIG90aGVyd2lzZSwKK3doaWNoIGlzIG9mdGVuIHdyb25nLgorKi8KKy8qIHB1c2htOiAqKC0tU1ApIDwtLSBSeCAqLworI2RlZmluZSBTVEFDS19QVVNIX0NPREUgUFJFX0RFQworCisvKiBEZWZpbmUgdGhpcyB0byBub256ZXJvIGlmIHRoZSBub21pbmFsIGFkZHJlc3Mgb2YgdGhlIHN0YWNrIGZyYW1lCisgICBpcyBhdCB0aGUgaGlnaC1hZGRyZXNzIGVuZCBvZiB0aGUgbG9jYWwgdmFyaWFibGVzOworICAgdGhhdCBpcywgZWFjaCBhZGRpdGlvbmFsIGxvY2FsIHZhcmlhYmxlIGFsbG9jYXRlZAorICAgZ29lcyBhdCBhIG1vcmUgbmVnYXRpdmUgb2Zmc2V0IGluIHRoZSBmcmFtZS4gICovCisjZGVmaW5lIEZSQU1FX0dST1dTX0RPV05XQVJEIDEKKworCisvKgorT2Zmc2V0IGZyb20gdGhlIGZyYW1lIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2FsIHZhcmlhYmxlIHNsb3QgdG8gYmUgYWxsb2NhdGVkLgorCitJZiBGUkFNRV9HUk9XU19ET1dOV0FSRCwgZmluZCB0aGUgbmV4dCBzbG90J3Mgb2Zmc2V0IGJ5CitzdWJ0cmFjdGluZyB0aGUgZmlyc3Qgc2xvdCdzIGxlbmd0aCBmcm9tIFNUQVJUSU5HX0ZSQU1FX09GRlNFVC4KK090aGVyd2lzZSwgaXQgaXMgZm91bmQgYnkgYWRkaW5nIHRoZSBsZW5ndGggb2YgdGhlIGZpcnN0IHNsb3QgdG8gdGhlCit2YWx1ZSBTVEFSVElOR19GUkFNRV9PRkZTRVQuCisgIChpJ20gbm90IHN1cmUgaWYgdGhlIGFib3ZlIGlzIHN0aWxsIGNvcnJlY3QuLiBoYWQgdG8gY2hhbmdlIGl0IHRvIGdldAorICAgcmlkIG9mIGFuIG92ZXJmdWxsLiAgLS1tZXcgMmZlYjkzICkKKyovCisjZGVmaW5lIFNUQVJUSU5HX0ZSQU1FX09GRlNFVCAwCisKKy8qCitPZmZzZXQgZnJvbSB0aGUgc3RhY2sgcG9pbnRlciByZWdpc3RlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gYXQgd2hpY2gKK291dGdvaW5nIGFyZ3VtZW50cyBhcmUgcGxhY2VkLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YKK3plcm8gaXMgdXNlZC4gIFRoaXMgaXMgdGhlIHByb3BlciB2YWx1ZSBmb3IgbW9zdCBtYWNoaW5lcy4KKworSWYgQVJHU19HUk9XX0RPV05XQVJELCB0aGlzIGlzIHRoZSBvZmZzZXQgdG8gdGhlIGxvY2F0aW9uIGFib3ZlCit0aGUgZmlyc3QgbG9jYXRpb24gYXQgd2hpY2ggb3V0Z29pbmcgYXJndW1lbnRzIGFyZSBwbGFjZWQuCisqLworI2RlZmluZSBTVEFDS19QT0lOVEVSX09GRlNFVCAwCisKKy8qCitPZmZzZXQgZnJvbSB0aGUgYXJndW1lbnQgcG9pbnRlciByZWdpc3RlciB0byB0aGUgZmlyc3QgYXJndW1lbnQncworYWRkcmVzcy4gIE9uIHNvbWUgbWFjaGluZXMgaXQgbWF5IGRlcGVuZCBvbiB0aGUgZGF0YSB0eXBlIG9mIHRoZQorZnVuY3Rpb24uCisKK0lmIEFSR1NfR1JPV19ET1dOV0FSRCwgdGhpcyBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBsb2NhdGlvbiBhYm92ZQordGhlIGZpcnN0IGFyZ3VtZW50J3MgYWRkcmVzcy4KKyovCisjZGVmaW5lIEZJUlNUX1BBUk1fT0ZGU0VUKEZVTkRFQ0wpIDAKKworCisvKgorQSBDIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgUlRMIHJlcHJlc2VudGluZyB0aGUgYWRkcmVzcyBpbiBhIHN0YWNrCitmcmFtZSB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgY2FsbGVyJ3MgZnJhbWUgaXMgc3RvcmVkLiAgQXNzdW1lIHRoYXQKK0ZSQU1FQUREUiBpcyBhbiBSVEwgZXhwcmVzc2lvbiBmb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YWNrIGZyYW1lCitpdHNlbGYuCisKK0lmIHlvdSBkb24ndCBkZWZpbmUgdGhpcyBtYWNybywgdGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIHRoZSB2YWx1ZQorb2YgRlJBTUVBRERSIC0gdGhhdCBpcywgdGhlIHN0YWNrIGZyYW1lIGFkZHJlc3MgaXMgYWxzbyB0aGUKK2FkZHJlc3Mgb2YgdGhlIHN0YWNrIHdvcmQgdGhhdCBwb2ludHMgdG8gdGhlIHByZXZpb3VzIGZyYW1lLgorKi8KKyNkZWZpbmUgRFlOQU1JQ19DSEFJTl9BRERSRVNTKEZSQU1FQUREUikgcGx1c19jb25zdGFudCAoKEZSQU1FQUREUiksIDQpCisKKworLyoKK0EgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIFJUTCByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4KK2FkZHJlc3MgZm9yIHRoZSBmcmFtZSBDT1VOVCBzdGVwcyB1cCBmcm9tIHRoZSBjdXJyZW50IGZyYW1lLCBhZnRlcgordGhlIHByb2xvZ3VlLiAgRlJBTUVBRERSIGlzIHRoZSBmcmFtZSBwb2ludGVyIG9mIHRoZSBDT1VOVAorZnJhbWUsIG9yIHRoZSBmcmFtZSBwb2ludGVyIG9mIHRoZSBDT1VOVCAtIDEgZnJhbWUgaWYKK1JFVFVSTl9BRERSX0lOX1BSRVZJT1VTX0ZSQU1FIGlzIGRlZmluZWQuCisKK1RoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBtdXN0IGFsd2F5cyBiZSB0aGUgY29ycmVjdCBhZGRyZXNzIHdoZW4KK0NPVU5UIGlzIHplcm8sIGJ1dCBtYXkgYmUgTlVMTF9SVFggaWYgdGhlcmUgaXMgbm90IHdheSB0bworZGV0ZXJtaW5lIHRoZSByZXR1cm4gYWRkcmVzcyBvZiBvdGhlciBmcmFtZXMuCisqLworI2RlZmluZSBSRVRVUk5fQUREUl9SVFgoQ09VTlQsIEZSQU1FQUREUikgYXZyMzJfcmV0dXJuX2FkZHIoQ09VTlQsIEZSQU1FQUREUikKKworCisvKgorQSBDIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgUlRMIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlCitpbmNvbWluZyByZXR1cm4gYWRkcmVzcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGFueSBmdW5jdGlvbiwgYmVmb3JlIHRoZQorcHJvbG9ndWUuICBUaGlzIFJUTCBpcyBlaXRoZXIgYSBSRUcsIGluZGljYXRpbmcgdGhhdCB0aGUgcmV0dXJuCit2YWx1ZSBpcyBzYXZlZCBpbiAnUkVHJywgb3IgYSBNRU0gcmVwcmVzZW50aW5nIGEgbG9jYXRpb24gaW4KK3RoZSBzdGFjay4KKworWW91IG9ubHkgbmVlZCB0byBkZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IGNhbGwgZnJhbWUKK2RlYnVnZ2luZyBpbmZvcm1hdGlvbiBsaWtlIHRoYXQgcHJvdmlkZWQgYnkgRFdBUkYgMi4KKworSWYgdGhpcyBSVEwgaXMgYSBSRUcsIHlvdSBzaG91bGQgYWxzbyBkZWZpbmUKK0RXQVJGX0ZSQU1FX1JFVFVSTl9DT0xVTU4gdG8gRFdBUkZfRlJBTUVfUkVHTlVNIChSRUdOTykuCisqLworI2RlZmluZSBJTkNPTUlOR19SRVRVUk5fQUREUl9SVFggZ2VuX3J0eF9SRUcgKFBtb2RlLCBMUl9SRUdOVU0pCisKKworCisvKgorQSBDIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgYW4gaW50ZWdlciBnaXZpbmcgdGhlIG9mZnNldCwgaW4gYnl0ZXMsCitmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgc3RhY2sgcG9pbnRlciByZWdpc3RlciB0byB0aGUgdG9wIG9mIHRoZSBzdGFjaworZnJhbWUgYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkgZnVuY3Rpb24sIGJlZm9yZSB0aGUgcHJvbG9ndWUuICBUaGUgdG9wIG9mCit0aGUgZnJhbWUgaXMgZGVmaW5lZCB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlCitwcmV2aW91cyBmcmFtZSwganVzdCBiZWZvcmUgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uCisKK1lvdSBvbmx5IG5lZWQgdG8gZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBjYWxsIGZyYW1lCitkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gbGlrZSB0aGF0IHByb3ZpZGVkIGJ5IERXQVJGIDIuCisqLworI2RlZmluZSBJTkNPTUlOR19GUkFNRV9TUF9PRkZTRVQgMAorCisKKy8qKiBFeGNlcHRpb24gSGFuZGxpbmcgU3VwcG9ydCAqKi8KKworLyogVXNlIHNldGp1bXAvbG9uZ2p1bXAgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZy4gKi8KKyNkZWZpbmUgRFdBUkYyX1VOV0lORF9JTkZPIDAKKyNkZWZpbmUgTVVTVF9VU0VfU0pMSl9FWENFUFRJT05TIDEKKworLyoKK0EgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIHRoZSBOdGggcmVnaXN0ZXIgbnVtYmVyIHVzZWQgZm9yCitkYXRhIGJ5IGV4Y2VwdGlvbiBoYW5kbGVycywgb3IgSU5WQUxJRF9SRUdOVU0gaWYgZmV3ZXIgdGhhbgorTiByZWdpc3RlcnMgYXJlIHVzYWJsZS4KKworVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBsaWJyYXJ5IHJvdXRpbmVzIGNvbW11bmljYXRlIHdpdGggdGhlIGV4Y2VwdGlvbgoraGFuZGxlcnMgdmlhIGEgc2V0IG9mIGFncmVlZCB1cG9uIHJlZ2lzdGVycy4gIElkZWFsbHkgdGhlc2UgcmVnaXN0ZXJzCitzaG91bGQgYmUgY2FsbC1jbG9iYmVyZWQ7IGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBjYWxsLXNhdmVkIHJlZ2lzdGVycywKK2J1dCBtYXkgbmVnYXRpdmVseSBpbXBhY3QgY29kZSBzaXplLiAgVGhlIHRhcmdldCBtdXN0IHN1cHBvcnQgYXQgbGVhc3QKKzIgZGF0YSByZWdpc3RlcnMsIGJ1dCBzaG91bGQgZGVmaW5lIDQgaWYgdGhlcmUgYXJlIGVub3VnaCBmcmVlIHJlZ2lzdGVycy4KKworWW91IG11c3QgZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBjYWxsIGZyYW1lIGV4Y2VwdGlvbgoraGFuZGxpbmcgbGlrZSB0aGF0IHByb3ZpZGVkIGJ5IERXQVJGIDIuCisqLworLyoKKyAgVXNlIHI5LXIxMQorKi8KKyNkZWZpbmUgRUhfUkVUVVJOX0RBVEFfUkVHTk8oTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChOPDMpID8gSU5URVJOQUxfUkVHTlVNKE4rOSkgOiBJTlZBTElEX1JFR05VTSkKKworLyoKK0EgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIFJUTCByZXByZXNlbnRpbmcgYSBsb2NhdGlvbiBpbiB3aGljaAordG8gc3RvcmUgYSBzdGFjayBhZGp1c3RtZW50IHRvIGJlIGFwcGxpZWQgYmVmb3JlIGZ1bmN0aW9uIHJldHVybi4KK1RoaXMgaXMgdXNlZCB0byB1bndpbmQgdGhlIHN0YWNrIHRvIGFuIGV4Y2VwdGlvbiBoYW5kbGVyJ3MgY2FsbCBmcmFtZS4KK0l0IHdpbGwgYmUgYXNzaWduZWQgemVybyBvbiBjb2RlIHBhdGhzIHRoYXQgcmV0dXJuIG5vcm1hbGx5LgorCitUeXBpY2FsbHkgdGhpcyBpcyBhIGNhbGwtY2xvYmJlcmVkIGhhcmQgcmVnaXN0ZXIgdGhhdCBpcyBvdGhlcndpc2UKK3VudG91Y2hlZCBieSB0aGUgZXBpbG9ndWUsIGJ1dCBjb3VsZCBhbHNvIGJlIGEgc3RhY2sgc2xvdC4KKworWW91IG11c3QgZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBjYWxsIGZyYW1lIGV4Y2VwdGlvbgoraGFuZGxpbmcgbGlrZSB0aGF0IHByb3ZpZGVkIGJ5IERXQVJGIDIuCisqLworLyoKKyAgVXNlIHI4CisqLworI2RlZmluZSBFSF9SRVRVUk5fU1RBQ0tBREpfUkVHTk8gSU5URVJOQUxfUkVHTlVNKDgpCisjZGVmaW5lIEVIX1JFVFVSTl9TVEFDS0FESl9SVFggZ2VuX3J0eF9SRUcoU0ltb2RlLCBFSF9SRVRVUk5fU1RBQ0tBREpfUkVHTk8pCisKKy8qCitBIEMgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBSVEwgcmVwcmVzZW50aW5nIGEgbG9jYXRpb24gaW4gd2hpY2gKK3RvIHN0b3JlIHRoZSBhZGRyZXNzIG9mIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIHdoaWNoIHdlIHNob3VsZAorcmV0dXJuLiAgSXQgd2lsbCBub3QgYmUgYXNzaWduZWQgb24gY29kZSBwYXRocyB0aGF0IHJldHVybiBub3JtYWxseS4KKworVHlwaWNhbGx5IHRoaXMgaXMgdGhlIGxvY2F0aW9uIGluIHRoZSBjYWxsIGZyYW1lIGF0IHdoaWNoIHRoZSBub3JtYWwKK3JldHVybiBhZGRyZXNzIGlzIHN0b3JlZC4gIEZvciB0YXJnZXRzIHRoYXQgcmV0dXJuIGJ5IHBvcHBpbmcgYW4KK2FkZHJlc3Mgb2ZmIHRoZSBzdGFjaywgdGhpcyBtaWdodCBiZSBhIG1lbW9yeSBhZGRyZXNzIGp1c3QgYmVsb3cKK3RoZSB0YXJnZXQgY2FsbCBmcmFtZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIGN1cnJlbnQgY2FsbAorZnJhbWUuICBFSF9SRVRVUk5fU1RBQ0tBREpfUlRYIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gYXNzaWduZWQsCitzbyBpdCBtYXkgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGxvY2F0aW9uIG9mIHRoZSB0YXJnZXQgY2FsbCBmcmFtZS4KKworU29tZSB0YXJnZXRzIGhhdmUgbW9yZSBjb21wbGV4IHJlcXVpcmVtZW50cyB0aGFuIHN0b3JpbmcgdG8gYW4KK2FkZHJlc3MgY2FsY3VsYWJsZSBkdXJpbmcgaW5pdGlhbCBjb2RlIGdlbmVyYXRpb24uICBJbiB0aGF0IGNhc2UKK3RoZSBlaF9yZXR1cm4gaW5zdHJ1Y3Rpb24gcGF0dGVybiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorCitJZiB5b3Ugd2FudCB0byBzdXBwb3J0IGNhbGwgZnJhbWUgZXhjZXB0aW9uIGhhbmRsaW5nLCB5b3UgbXVzdAorZGVmaW5lIGVpdGhlciB0aGlzIG1hY3JvIG9yIHRoZSBlaF9yZXR1cm4gaW5zdHJ1Y3Rpb24gcGF0dGVybi4KKyovCisvKgorICBXZSBkZWZpbmUgdGhlIGVoX3JldHVybiBpbnN0cnVjdGlvbiBwYXR0ZXJuLCBzbyB0aGlzIGlzbid0IG5lZWRlZC4KKyovCisvKiAjZGVmaW5lIEVIX1JFVFVSTl9IQU5ETEVSX1JUWCBnZW5fcnR4X1JFRyhQbW9kZSwgUkVUX1JFR0lTVEVSKSAqLworCisvKgorICBUaGlzIG1hY3JvIGNob29zZXMgdGhlIGVuY29kaW5nIG9mIHBvaW50ZXJzIGVtYmVkZGVkIGluIHRoZQorICBleGNlcHRpb24gaGFuZGxpbmcgc2VjdGlvbnMuIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcyBzaG91bGQgYmUKKyAgZGVmaW5lZCBzdWNoIHRoYXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBzZWN0aW9uIHdpbGwgbm90IHJlcXVpcmUKKyAgZHluYW1pYyByZWxvY2F0aW9ucywgYW5kIHNvIG1heSBiZSByZWFkLW9ubHkuCisKKyAgY29kZSBpcyAwIGZvciBkYXRhLCAxIGZvciBjb2RlIGxhYmVscywgMiBmb3IgZnVuY3Rpb24KKyAgcG9pbnRlcnMuIGdsb2JhbCBpcyB0cnVlIGlmIHRoZSBzeW1ib2wgbWF5IGJlIGFmZmVjdGVkIGJ5IGR5bmFtaWMKKyAgcmVsb2NhdGlvbnMuIFRoZSBtYWNybyBzaG91bGQgcmV0dXJuIGEgY29tYmluYXRpb24gb2YgdGhlIERXX0VIX1BFXyoKKyAgZGVmaW5lcyBhcyBmb3VuZCBpbiBkd2FyZjIuaC4KKworICBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLCBwb2ludGVycyB3aWxsIG5vdCBiZSBlbmNvZGVkIGJ1dAorICByZXByZXNlbnRlZCBkaXJlY3RseS4KKyovCisjZGVmaW5lIEFTTV9QUkVGRVJSRURfRUhfREFUQV9GT1JNQVQoQ09ERSwgR0xPQkFMKQlcCisgICgoZmxhZ19waWMgJiYgKEdMT0JBTCkgPyBEV19FSF9QRV9pbmRpcmVjdCA6IDApCVwKKyAgIHwgKGZsYWdfcGljID8gRFdfRUhfUEVfcGNyZWwgOiBEV19FSF9QRV9hYnNwdHIpCVwKKyAgIHwgRFdfRUhfUEVfc2RhdGE0KQorCisvKiBUb0RvOiBUaGUgcmVzdCBvZiB0aGlzIHN1YnNlY3Rpb24gKi8KKworLyoqIFNwZWNpZnlpbmcgSG93IFN0YWNrIENoZWNraW5nIGlzIERvbmUgKiovCisvKiBUb0RvOiBBbGwgaW4gdGhpcyBzdWJzZWN0aW9uICovCisKKy8qKiBSZWdpc3RlcnMgVGhhdCBBZGRyZXNzIHRoZSBTdGFjayBGcmFtZSAqKi8KKworLyoKK1RoZSByZWdpc3RlciBudW1iZXIgb2YgdGhlIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXIsIHdoaWNoIG11c3QgYWxzbyBiZSBhCitmaXhlZCByZWdpc3RlciBhY2NvcmRpbmcgdG8gRklYRURfUkVHSVNURVJTLiAgT24gbW9zdCBtYWNoaW5lcywKK3RoZSBoYXJkd2FyZSBkZXRlcm1pbmVzIHdoaWNoIHJlZ2lzdGVyIHRoaXMgaXMuCisqLworLyogVXNpbmcgcjEzIGFzIHN0YWNrIHBvaW50ZXIuICovCisjZGVmaW5lIFNUQUNLX1BPSU5URVJfUkVHTlVNIElOVEVSTkFMX1JFR05VTSgxMykKKworLyoKK1RoZSByZWdpc3RlciBudW1iZXIgb2YgdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIsIHdoaWNoIGlzIHVzZWQgdG8KK2FjY2VzcyBhdXRvbWF0aWMgdmFyaWFibGVzIGluIHRoZSBzdGFjayBmcmFtZS4gIE9uIHNvbWUgbWFjaGluZXMsIHRoZQoraGFyZHdhcmUgZGV0ZXJtaW5lcyB3aGljaCByZWdpc3RlciB0aGlzIGlzLiAgT24gb3RoZXIgbWFjaGluZXMsIHlvdSBjYW4KK2Nob29zZSBhbnkgcmVnaXN0ZXIgeW91IHdpc2ggZm9yIHRoaXMgcHVycG9zZS4KKyovCisvKiBVc2UgcjcgKi8KKyNkZWZpbmUgRlJBTUVfUE9JTlRFUl9SRUdOVU0gSU5URVJOQUxfUkVHTlVNKDcpCisKKworCisvKgorVGhlIHJlZ2lzdGVyIG51bWJlciBvZiB0aGUgYXJnIHBvaW50ZXIgcmVnaXN0ZXIsIHdoaWNoIGlzIHVzZWQgdG8gYWNjZXNzCit0aGUgZnVuY3Rpb24ncyBhcmd1bWVudCBsaXN0LiAgT24gc29tZSBtYWNoaW5lcywgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKK2ZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICBPbiBzb21lIG1hY2hpbmVzLCB0aGUgaGFyZHdhcmUgZGV0ZXJtaW5lcyB3aGljaAorcmVnaXN0ZXIgdGhpcyBpcy4gIE9uIG90aGVyIG1hY2hpbmVzLCB5b3UgY2FuIGNob29zZSBhbnkgcmVnaXN0ZXIgeW91Cit3aXNoIGZvciB0aGlzIHB1cnBvc2UuICBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSByZWdpc3RlciBhcyB0aGUgZnJhbWUKK3BvaW50ZXIgcmVnaXN0ZXIsIHRoZW4geW91IG11c3QgbWFyayBpdCBhcyBhIGZpeGVkIHJlZ2lzdGVyIGFjY29yZGluZyB0bworRklYRURfUkVHSVNURVJTLCBvciBhcnJhbmdlIHRvIGJlIGFibGUgdG8gZWxpbWluYXRlIGl0IChzZWUgU2VjdGlvbgorMTAuMTAuNSBbRWxpbWluYXRpb25dLCBwYWdlIDIyNCkuCisqLworLyogVXNpbmcgcjUgKi8KKyNkZWZpbmUgQVJHX1BPSU5URVJfUkVHTlVNIElOVEVSTkFMX1JFR05VTSg0KQorCisKKy8qCitSZWdpc3RlciBudW1iZXJzIHVzZWQgZm9yIHBhc3NpbmcgYSBmdW5jdGlvbidzIHN0YXRpYyBjaGFpbiBwb2ludGVyLiAgSWYKK3JlZ2lzdGVyIHdpbmRvd3MgYXJlIHVzZWQsIHRoZSByZWdpc3RlciBudW1iZXIgYXMgc2VlbiBieSB0aGUgY2FsbGVkCitmdW5jdGlvbiBpcyBTVEFUSUNfQ0hBSU5fSU5DT01JTkdfUkVHTlVNLCB3aGlsZSB0aGUgcmVnaXN0ZXIKK251bWJlciBhcyBzZWVuIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIFNUQVRJQ19DSEFJTl9SRUdOVU0uICBJZgordGhlc2UgcmVnaXN0ZXJzIGFyZSB0aGUgc2FtZSwgU1RBVElDX0NIQUlOX0lOQ09NSU5HX1JFR05VTSBuZWVkCitub3QgYmUgZGVmaW5lZC4KKworVGhlIHN0YXRpYyBjaGFpbiByZWdpc3RlciBuZWVkIG5vdCBiZSBhIGZpeGVkIHJlZ2lzdGVyLgorCitJZiB0aGUgc3RhdGljIGNoYWluIGlzIHBhc3NlZCBpbiBtZW1vcnksIHRoZXNlIG1hY3JvcyBzaG91bGQgbm90IGJlCitkZWZpbmVkOyBpbnN0ZWFkLCB0aGUgbmV4dCB0d28gbWFjcm9zIHNob3VsZCBiZSBkZWZpbmVkLgorKi8KKy8qIFVzaW5nIHIwICovCisjZGVmaW5lIFNUQVRJQ19DSEFJTl9SRUdOVU0gSU5URVJOQUxfUkVHTlVNKDApCisKKworLyoqIEVsaW1pbmF0aW5nIEZyYW1lIFBvaW50ZXIgYW5kIEFyZyBQb2ludGVyICoqLworCisvKgorQSBDIGV4cHJlc3Npb24gd2hpY2ggaXMgbm9uemVybyBpZiBhIGZ1bmN0aW9uIG11c3QgaGF2ZSBhbmQgdXNlIGEgZnJhbWUKK3BvaW50ZXIuICBUaGlzIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkICBpbiB0aGUgcmVsb2FkIHBhc3MuICBJZiBpdHMgdmFsdWUgaXMKK25vbnplcm8gdGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZSBhIGZyYW1lIHBvaW50ZXIuCisKK1RoZSBleHByZXNzaW9uIGNhbiBpbiBwcmluY2lwbGUgZXhhbWluZSB0aGUgY3VycmVudCBmdW5jdGlvbiBhbmQgZGVjaWRlCithY2NvcmRpbmcgdG8gdGhlIGZhY3RzLCBidXQgb24gbW9zdCBtYWNoaW5lcyB0aGUgY29uc3RhbnQgMCBvciB0aGUKK2NvbnN0YW50IDEgc3VmZmljZXMuICBVc2UgMCB3aGVuIHRoZSBtYWNoaW5lIGFsbG93cyBjb2RlIHRvIGJlIGdlbmVyYXRlZAord2l0aCBubyBmcmFtZSBwb2ludGVyLCBhbmQgZG9pbmcgc28gc2F2ZXMgc29tZSB0aW1lIG9yIHNwYWNlLiAgVXNlIDEKK3doZW4gdGhlcmUgaXMgbm8gcG9zc2libGUgYWR2YW50YWdlIHRvIGF2b2lkaW5nIGEgZnJhbWUgcG9pbnRlci4KKworSW4gY2VydGFpbiBjYXNlcywgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGtub3cgaG93IHRvIHByb2R1Y2UgdmFsaWQgY29kZQord2l0aG91dCBhIGZyYW1lIHBvaW50ZXIuICBUaGUgY29tcGlsZXIgcmVjb2duaXplcyB0aG9zZSBjYXNlcyBhbmQKK2F1dG9tYXRpY2FsbHkgZ2l2ZXMgdGhlIGZ1bmN0aW9uIGEgZnJhbWUgcG9pbnRlciByZWdhcmRsZXNzIG9mIHdoYXQKK0ZSQU1FX1BPSU5URVJfUkVRVUlSRUQgc2F5cy4gIFlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0Cit0aGVtLgorCitJbiBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBhIGZyYW1lIHBvaW50ZXIsIHRoZSBmcmFtZSBwb2ludGVyCityZWdpc3RlciBjYW4gYmUgYWxsb2NhdGVkIGZvciBvcmRpbmFyeSB1c2FnZSwgdW5sZXNzIHlvdSBtYXJrIGl0IGFzIGEKK2ZpeGVkIHJlZ2lzdGVyLiAgU2VlIEZJWEVEX1JFR0lTVEVSUyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCisvKiBXZSBuZWVkIHRoZSBmcmFtZSBwb2ludGVyIHdoZW4gY29tcGlsaW5nIGZvciBwcm9maWxpbmcgKi8KKyNkZWZpbmUgRlJBTUVfUE9JTlRFUl9SRVFVSVJFRCAoY3VycmVudF9mdW5jdGlvbl9wcm9maWxlKQorCisvKgorQSBDIHN0YXRlbWVudCB0byBzdG9yZSBpbiB0aGUgdmFyaWFibGUgREVQVEhfVkFSIHRoZSBkaWZmZXJlbmNlCitiZXR3ZWVuIHRoZSBmcmFtZSBwb2ludGVyIGFuZCB0aGUgc3RhY2sgcG9pbnRlciB2YWx1ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoZSBmdW5jdGlvbiBwcm9sb2d1ZS4gIFRoZSB2YWx1ZSB3b3VsZCBiZSBjb21wdXRlZCBmcm9tIGluZm9ybWF0aW9uCitzdWNoIGFzIHRoZSByZXN1bHQgb2YgZ2V0X2ZyYW1lX3NpemUgKCkgYW5kIHRoZSB0YWJsZXMgb2YKK3JlZ2lzdGVycyByZWdzX2V2ZXJfbGl2ZSBhbmQgY2FsbF91c2VkX3JlZ3MuCisKK0lmIEVMSU1JTkFCTEVfUkVHUyBpcyBkZWZpbmVkLCB0aGlzIG1hY3JvIHdpbGwgYmUgbm90IGJlIHVzZWQgYW5kCituZWVkIG5vdCBiZSBkZWZpbmVkLiAgT3RoZXJ3aXNlLCBpdCBtdXN0IGJlIGRlZmluZWQgZXZlbiBpZgorRlJBTUVfUE9JTlRFUl9SRVFVSVJFRCBpcyBkZWZpbmVkIHRvIGFsd2F5cyBiZSB0cnVlOyBpbiB0aGF0CitjYXNlLCB5b3UgbWF5IHNldCBERVBUSF9WQVIgdG8gYW55dGhpbmcuCisqLworI2RlZmluZSBJTklUSUFMX0ZSQU1FX1BPSU5URVJfT0ZGU0VUKERFUFRIX1ZBUikgKChERVBUSF9WQVIpID0gZ2V0X2ZyYW1lX3NpemUoKSkKKworLyoKK0lmIGRlZmluZWQsIHRoaXMgbWFjcm8gc3BlY2lmaWVzIGEgdGFibGUgb2YgcmVnaXN0ZXIgcGFpcnMgdXNlZCB0bworZWxpbWluYXRlIHVubmVlZGVkIHJlZ2lzdGVycyB0aGF0IHBvaW50IGludG8gdGhlIHN0YWNrIGZyYW1lLiAgSWYgaXQgaXMgbm90CitkZWZpbmVkLCB0aGUgb25seSBlbGltaW5hdGlvbiBhdHRlbXB0ZWQgYnkgdGhlIGNvbXBpbGVyIGlzIHRvIHJlcGxhY2UKK3JlZmVyZW5jZXMgdG8gdGhlIGZyYW1lIHBvaW50ZXIgd2l0aCByZWZlcmVuY2VzIHRvIHRoZSBzdGFjayBwb2ludGVyLgorCitUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvIGlzIGEgbGlzdCBvZiBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBlYWNoCitvZiB3aGljaCBzcGVjaWZpZXMgYW4gb3JpZ2luYWwgYW5kIHJlcGxhY2VtZW50IHJlZ2lzdGVyLgorCitPbiBzb21lIG1hY2hpbmVzLCB0aGUgcG9zaXRpb24gb2YgdGhlIGFyZ3VtZW50IHBvaW50ZXIgaXMgbm90IGtub3duIHVudGlsCit0aGUgY29tcGlsYXRpb24gaXMgY29tcGxldGVkLiAgSW4gc3VjaCBhIGNhc2UsIGEgc2VwYXJhdGUgaGFyZCByZWdpc3RlcgorbXVzdCBiZSB1c2VkIGZvciB0aGUgYXJndW1lbnQgcG9pbnRlci4gIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIGVsaW1pbmF0ZWQgYnkKK3JlcGxhY2luZyBpdCB3aXRoIGVpdGhlciB0aGUgZnJhbWUgcG9pbnRlciBvciB0aGUgYXJndW1lbnQgcG9pbnRlciwKK2RlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgZnJhbWUgcG9pbnRlciBoYXMgYmVlbiBlbGltaW5hdGVkLgorCitJbiB0aGlzIGNhc2UsIHlvdSBtaWdodCBzcGVjaWZ5OgorICAjZGVmaW5lIEVMSU1JTkFCTEVfUkVHUyAgXAorICB7e0FSR19QT0lOVEVSX1JFR05VTSwgU1RBQ0tfUE9JTlRFUl9SRUdOVU19LCBcCisgICB7QVJHX1BPSU5URVJfUkVHTlVNLCBGUkFNRV9QT0lOVEVSX1JFR05VTX0sIFwKKyAgIHtGUkFNRV9QT0lOVEVSX1JFR05VTSwgU1RBQ0tfUE9JTlRFUl9SRUdOVU19fQorCitOb3RlIHRoYXQgdGhlIGVsaW1pbmF0aW9uIG9mIHRoZSBhcmd1bWVudCBwb2ludGVyIHdpdGggdGhlIHN0YWNrIHBvaW50ZXIgaXMKK3NwZWNpZmllZCBmaXJzdCBzaW5jZSB0aGF0IGlzIHRoZSBwcmVmZXJyZWQgZWxpbWluYXRpb24uCisqLworI2RlZmluZSBFTElNSU5BQkxFX1JFR1MJCQkJCVwKK3sJCQkJCQkJXAorICB7IEZSQU1FX1BPSU5URVJfUkVHTlVNLCBTVEFDS19QT0lOVEVSX1JFR05VTSB9LAlcCisgIHsgQVJHX1BPSU5URVJfUkVHTlVNLCBTVEFDS19QT0lOVEVSX1JFR05VTSB9LAkJXAorICB7IEFSR19QT0lOVEVSX1JFR05VTSwgRlJBTUVfUE9JTlRFUl9SRUdOVU0gfQkJXAorfQorCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGNvbXBpbGVyIGlzIGFsbG93ZWQgdG8gdHJ5Cit0byByZXBsYWNlIHJlZ2lzdGVyIG51bWJlciBGUk9NIHdpdGggcmVnaXN0ZXIgbnVtYmVyCitUTy4gIFRoaXMgbWFjcm8gbmVlZCBvbmx5IGJlIGRlZmluZWQgaWYgRUxJTUlOQUJMRV9SRUdTCitpcyBkZWZpbmVkLCBhbmQgd2lsbCB1c3VhbGx5IGJlIHRoZSBjb25zdGFudCAxLCBzaW5jZSBtb3N0IG9mIHRoZSBjYXNlcworcHJldmVudGluZyByZWdpc3RlciBlbGltaW5hdGlvbiBhcmUgdGhpbmdzIHRoYXQgdGhlIGNvbXBpbGVyIGFscmVhZHkKK2tub3dzIGFib3V0LgorKi8KKyNkZWZpbmUgQ0FOX0VMSU1JTkFURShGUk9NLCBUTykgMQorCisvKgorVGhpcyBtYWNybyBpcyBzaW1pbGFyIHRvIElOSVRJQUxfRlJBTUVfUE9JTlRFUl9PRkZTRVQuICBJdAorc3BlY2lmaWVzIHRoZSBpbml0aWFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHBhaXIgb2YKK3JlZ2lzdGVycy4gIFRoaXMgbWFjcm8gbXVzdCBiZSBkZWZpbmVkIGlmIEVMSU1JTkFCTEVfUkVHUyBpcworZGVmaW5lZC4KKyovCisjZGVmaW5lIElOSVRJQUxfRUxJTUlOQVRJT05fT0ZGU0VUKEZST00sIFRPLCBPRkZTRVQpCQlcCisgICgoT0ZGU0VUKSA9IGF2cjMyX2luaXRpYWxfZWxpbWluYXRpb25fb2Zmc2V0KEZST00sIFRPKSkKKworLyoqIFBhc3NpbmcgRnVuY3Rpb24gQXJndW1lbnRzIG9uIHRoZSBTdGFjayAqKi8KKworCisvKgorQSBDIGV4cHJlc3Npb24uICBJZiBub256ZXJvLCBwdXNoIGluc25zIHdpbGwgYmUgdXNlZCB0byBwYXNzCitvdXRnb2luZyBhcmd1bWVudHMuCitJZiB0aGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyBub3QgaGF2ZSBhIHB1c2ggaW5zdHJ1Y3Rpb24sIHNldCBpdCB0byB6ZXJvLgorVGhhdCBkaXJlY3RzIEdDQyB0byB1c2UgYW4gYWx0ZXJuYXRlIHN0cmF0ZWd5OiB0bworYWxsb2NhdGUgdGhlIGVudGlyZSBhcmd1bWVudCBibG9jayBhbmQgdGhlbiBzdG9yZSB0aGUgYXJndW1lbnRzIGludG8KK2l0LiAgV2hlbiBQVVNIX0FSR1MgaXMgbm9uemVybywgUFVTSF9ST1VORElORyBtdXN0IGJlIGRlZmluZWQgdG9vLgorKi8KKyNkZWZpbmUgUFVTSF9BUkdTIDEKKworCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHB1c2hlZCBvbnRvIHRoZQorc3RhY2sgd2hlbiBhbiBpbnN0cnVjdGlvbiBhdHRlbXB0cyB0byBwdXNoIE5QVVNIRUQgYnl0ZXMuCisKK09uIHNvbWUgbWFjaGluZXMsIHRoZSBkZWZpbml0aW9uCisKKyAgI2RlZmluZSBQVVNIX1JPVU5ESU5HKEJZVEVTKSAoQllURVMpCisKK3dpbGwgc3VmZmljZS4gIEJ1dCBvbiBvdGhlciBtYWNoaW5lcywgaW5zdHJ1Y3Rpb25zIHRoYXQgYXBwZWFyCit0byBwdXNoIG9uZSBieXRlIGFjdHVhbGx5IHB1c2ggdHdvIGJ5dGVzIGluIGFuIGF0dGVtcHQgdG8gbWFpbnRhaW4KK2FsaWdubWVudC4gIFRoZW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlCisKKyAgI2RlZmluZSBQVVNIX1JPVU5ESU5HKEJZVEVTKSAoKChCWVRFUykgKyAxKSAmIH4xKQorKi8KKy8qIFB1c2ggNCBieXRlcyBhdCB0aGUgdGltZS4gKi8KKyNkZWZpbmUgUFVTSF9ST1VORElORyhOUFVTSEVEKSAoKChOUFVTSEVEKSArIDMpICYgfjMpCisKKy8qCitBIEMgZXhwcmVzc2lvbi4gIElmIG5vbnplcm8sIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzcGFjZSByZXF1aXJlZCBmb3IKK291dGdvaW5nIGFyZ3VtZW50cyB3aWxsIGJlIGNvbXB1dGVkIGFuZCBwbGFjZWQgaW50byB0aGUgdmFyaWFibGUKK2N1cnJlbnRfZnVuY3Rpb25fb3V0Z29pbmdfYXJnc19zaXplLiAgTm8gc3BhY2Ugd2lsbCBiZSBwdXNoZWQKK29udG8gdGhlIHN0YWNrIGZvciBlYWNoIGNhbGw7IGluc3RlYWQsIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSBzaG91bGQKK2luY3JlYXNlIHRoZSBzdGFjayBmcmFtZSBzaXplIGJ5IHRoaXMgYW1vdW50LgorCitTZXR0aW5nIGJvdGggUFVTSF9BUkdTIGFuZCBBQ0NVTVVMQVRFX09VVEdPSU5HX0FSR1MgaXMgbm90IHByb3Blci4KKyovCisjZGVmaW5lIEFDQ1VNVUxBVEVfT1VUR09JTkdfQVJHUyAwCisKKworCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IHNob3VsZCBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGl0cyBvd24KK2FyZ3VtZW50cyB0aGF0IGEgZnVuY3Rpb24gcG9wcyBvbiByZXR1cm5pbmcsIG9yIDAgaWYgdGhlCitmdW5jdGlvbiBwb3BzIG5vIGFyZ3VtZW50cyBhbmQgdGhlIGNhbGxlciBtdXN0IHRoZXJlZm9yZSBwb3AgdGhlbSBhbGwKK2FmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorCitGVU5ERUNMIGlzIGEgQyB2YXJpYWJsZSB3aG9zZSB2YWx1ZSBpcyBhIHRyZWUgbm9kZSB0aGF0IGRlc2NyaWJlcwordGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uLiAgTm9ybWFsbHkgaXQgaXMgYSBub2RlIG9mIHR5cGUKK0ZVTkNUSU9OX0RFQ0wgdGhhdCBkZXNjcmliZXMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbi4KK0Zyb20gdGhpcyB5b3UgY2FuIG9idGFpbiB0aGUgREVDTF9BVFRSSUJVVEVTIG9mIHRoZSBmdW5jdGlvbi4KKworRlVOVFlQRSBpcyBhIEMgdmFyaWFibGUgd2hvc2UgdmFsdWUgaXMgYSB0cmVlIG5vZGUgdGhhdAorZGVzY3JpYmVzIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbi4gIE5vcm1hbGx5IGl0IGlzIGEgbm9kZSBvZiB0eXBlCitGVU5DVElPTl9UWVBFIHRoYXQgZGVzY3JpYmVzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLgorRnJvbSB0aGlzIGl0IGlzIHBvc3NpYmxlIHRvIG9idGFpbiB0aGUgZGF0YSB0eXBlcyBvZiB0aGUgdmFsdWUgYW5kCithcmd1bWVudHMgKGlmIGtub3duKS4KKworV2hlbiBhIGNhbGwgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uIGlzIGJlaW5nIGNvbnNpZGVyZWQsIEZVTkRFQ0wKK3dpbGwgY29udGFpbiBhbiBpZGVudGlmaWVyIG5vZGUgZm9yIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLiAgVGh1cywgaWYKK3lvdSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHZhcmlvdXMgbGlicmFyeSBmdW5jdGlvbnMsIHlvdSBjYW4gZG8gc28KK2J5IHRoZWlyIG5hbWVzLiAgTm90ZSB0aGF0IGBgbGlicmFyeSBmdW5jdGlvbicnIGluIHRoaXMgY29udGV4dCBtZWFucworYSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gYXJpdGhtZXRpYywgd2hvc2UgbmFtZSBpcyBrbm93biBzcGVjaWFsbHkKK2luIHRoZSBjb21waWxlciBhbmQgd2FzIG5vdCBtZW50aW9uZWQgaW4gdGhlIEMgY29kZSBiZWluZyBjb21waWxlZC4KKworU1RBQ0tfU0laRSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGFyZ3VtZW50cyBwYXNzZWQgb24gdGhlCitzdGFjay4gIElmIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzIGlzIHBhc3NlZCwgaXQgaXMgemVybywgYW5kCithcmd1bWVudCBwb3BwaW5nIHdpbGwgYWx3YXlzIGJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi4KKworT24gdGhlIFZBWCwgYWxsIGZ1bmN0aW9ucyBhbHdheXMgcG9wIHRoZWlyIGFyZ3VtZW50cywgc28gdGhlIGRlZmluaXRpb24KK29mIHRoaXMgbWFjcm8gaXMgU1RBQ0tfU0laRS4gIE9uIHRoZSA2ODAwMCwgdXNpbmcgdGhlIHN0YW5kYXJkCitjYWxsaW5nIGNvbnZlbnRpb24sIG5vIGZ1bmN0aW9ucyBwb3AgdGhlaXIgYXJndW1lbnRzLCBzbyB0aGUgdmFsdWUgb2YKK3RoZSBtYWNybyBpcyBhbHdheXMgMCBpbiB0aGlzIGNhc2UuICBCdXQgYW4gYWx0ZXJuYXRpdmUgY2FsbGluZworY29udmVudGlvbiBpcyBhdmFpbGFibGUgaW4gd2hpY2ggZnVuY3Rpb25zIHRoYXQgdGFrZSBhIGZpeGVkIG51bWJlciBvZgorYXJndW1lbnRzIHBvcCB0aGVtIGJ1dCBvdGhlciBmdW5jdGlvbnMgKHN1Y2ggYXMgcHJpbnRmKSBwb3AKK25vdGhpbmcgKHRoZSBjYWxsZXIgcG9wcyBhbGwpLiAgV2hlbiB0aGlzIGNvbnZlbnRpb24gaXMgaW4gdXNlLAorRlVOVFlQRSBpcyBleGFtaW5lZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGZ1bmN0aW9uIHRha2VzIGEgZml4ZWQKK251bWJlciBvZiBhcmd1bWVudHMuCisqLworI2RlZmluZSBSRVRVUk5fUE9QU19BUkdTKEZVTkRFQ0wsIEZVTlRZUEUsIFNUQUNLX1NJWkUpIDAKKworCisvKlJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FuIHdlIHVzZSBhIHNpbmdsZSByZXR1cm4gaW5zdHJ1Y3Rpb24qLworI2RlZmluZSBVU0VfUkVUVVJOX0lOU04oSVNDT05EKSBhdnIzMl91c2VfcmV0dXJuX2luc24oSVNDT05EKQorCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCBzaG91bGQgaW5kaWNhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhIGNhbGwgc2VxdWVuY2UKK3BvcHMgb2ZmIHRoZSBzdGFjay4gIEl0IGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiBSRVRVUk5fUE9QU19BUkdTCit3aGVuIGNvbXBpbGluZyBhIGZ1bmN0aW9uIGNhbGwuCisKK0NVTSBpcyB0aGUgdmFyaWFibGUgaW4gd2hpY2ggYWxsIGFyZ3VtZW50cyB0byB0aGUgY2FsbGVkIGZ1bmN0aW9uCitoYXZlIGJlZW4gYWNjdW11bGF0ZWQuCisKK09uIGNlcnRhaW4gYXJjaGl0ZWN0dXJlcywgc3VjaCBhcyB0aGUgU0g1LCBhIGNhbGwgdHJhbXBvbGluZSBpcyB1c2VkCit0aGF0IHBvcHMgY2VydGFpbiByZWdpc3RlcnMgb2ZmIHRoZSBzdGFjaywgZGVwZW5kaW5nIG9uIHRoZSBhcmd1bWVudHMKK3RoYXQgaGF2ZSBiZWVuIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICBTaW5jZSB0aGlzIGlzIGEgcHJvcGVydHkgb2YgdGhlCitjYWxsIHNpdGUsIG5vdCBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uLCBSRVRVUk5fUE9QU19BUkdTIGlzIG5vdAorYXBwcm9wcmlhdGUuCisqLworI2RlZmluZSBDQUxMX1BPUFNfQVJHUyhDVU0pIDAKKworLyogUGFzc2luZyBBcmd1bWVudHMgaW4gUmVnaXN0ZXJzICovCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYSBmdW5jdGlvbiBhcmd1bWVudCBpcyBwYXNzZWQKK2luIGEgcmVnaXN0ZXIsIGFuZCB3aGljaCByZWdpc3Rlci4KKworVGhlIGFyZ3VtZW50cyBhcmUgQ1VNLCB3aGljaCBzdW1tYXJpemVzIGFsbCB0aGUgcHJldmlvdXMKK2FyZ3VtZW50czsgTU9ERSwgdGhlIG1hY2hpbmUgbW9kZSBvZiB0aGUgYXJndW1lbnQ7IFRZUEUsCit0aGUgZGF0YSB0eXBlIG9mIHRoZSBhcmd1bWVudCBhcyBhIHRyZWUgbm9kZSBvciAwIGlmIHRoYXQgaXMgbm90IGtub3duCisod2hpY2ggaGFwcGVucyBmb3IgQyBzdXBwb3J0IGxpYnJhcnkgZnVuY3Rpb25zKTsgYW5kIE5BTUVELAord2hpY2ggaXMgMSBmb3IgYW4gb3JkaW5hcnkgYXJndW1lbnQgYW5kIDAgZm9yIG5hbWVsZXNzIGFyZ3VtZW50cyB0aGF0Citjb3JyZXNwb25kIHRvICcuLi4nIGluIHRoZSBjYWxsZWQgZnVuY3Rpb24ncyBwcm90b3R5cGUuCitUWVBFIGNhbiBiZSBhbiBpbmNvbXBsZXRlIHR5cGUgaWYgYSBzeW50YXggZXJyb3IgaGFzIHByZXZpb3VzbHkKK29jY3VycmVkLgorCitUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgdXN1YWxseSBlaXRoZXIgYSByZWcgUlRYIGZvciB0aGUKK2hhcmQgcmVnaXN0ZXIgaW4gd2hpY2ggdG8gcGFzcyB0aGUgYXJndW1lbnQsIG9yIHplcm8gdG8gcGFzcyB0aGUKK2FyZ3VtZW50IG9uIHRoZSBzdGFjay4KKworRm9yIG1hY2hpbmVzIGxpa2UgdGhlIFZBWCBhbmQgNjgwMDAsIHdoZXJlIG5vcm1hbGx5IGFsbCBhcmd1bWVudHMgYXJlCitwdXNoZWQsIHplcm8gc3VmZmljZXMgYXMgYSBkZWZpbml0aW9uLgorCitUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gY2FuIGFsc28gYmUgYSBwYXJhbGxlbCBSVFguICBUaGlzIGlzCit1c2VkIHdoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkIGluIG11bHRpcGxlIGxvY2F0aW9ucy4gIFRoZSBtb2RlIG9mIHRoZQorb2YgdGhlIHBhcmFsbGVsIHNob3VsZCBiZSB0aGUgbW9kZSBvZiB0aGUgZW50aXJlIGFyZ3VtZW50LiAgVGhlCitwYXJhbGxlbCBob2xkcyBhbnkgbnVtYmVyIG9mIGV4cHJfbGlzdCBwYWlyczsgZWFjaCBvbmUKK2Rlc2NyaWJlcyB3aGVyZSBwYXJ0IG9mIHRoZSBhcmd1bWVudCBpcyBwYXNzZWQuICBJbiBlYWNoCitleHByX2xpc3QgdGhlIGZpcnN0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZyBSVFggZm9yIHRoZSBoYXJkCityZWdpc3RlciBpbiB3aGljaCB0byBwYXNzIHRoaXMgcGFydCBvZiB0aGUgYXJndW1lbnQsIGFuZCB0aGUgbW9kZSBvZiB0aGUKK3JlZ2lzdGVyIFJUWCBpbmRpY2F0ZXMgaG93IGxhcmdlIHRoaXMgcGFydCBvZiB0aGUgYXJndW1lbnQgaXMuICBUaGUKK3NlY29uZCBvcGVyYW5kIG9mIHRoZSBleHByX2xpc3QgaXMgYSBjb25zdF9pbnQgd2hpY2ggZ2l2ZXMKK3RoZSBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgZW50aXJlIGFyZ3VtZW50IG9mIHdoZXJlIHRoaXMgcGFydCBzdGFydHMuCitBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBmaXJzdCBleHByX2xpc3QgaW4gdGhlIHBhcmFsbGVsCitSVFggbWF5IGhhdmUgYSBmaXJzdCBvcGVyYW5kIG9mIHplcm8uICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUKK2FyZ3VtZW50IGlzIGFsc28gc3RvcmVkIG9uIHRoZSBzdGFjay4KKworVGhlIGxhc3QgdGltZSB0aGlzIG1hY3JvIGlzIGNhbGxlZCwgaXQgaXMgY2FsbGVkIHdpdGggTU9ERSA9PSBWT0lEbW9kZSwKK2FuZCBpdHMgcmVzdWx0IGlzIHBhc3NlZCB0byB0aGUgY2FsbCBvciBjYWxsX3ZhbHVlCitwYXR0ZXJuIGFzIG9wZXJhbmRzIDIgYW5kIDMgcmVzcGVjdGl2ZWx5LgorCitUaGUgdXN1YWwgd2F5IHRvIG1ha2UgdGhlIElTTyBsaWJyYXJ5ICdzdGRhcmcuaCcgd29yayBvbiBhIG1hY2hpbmUKK3doZXJlIHNvbWUgYXJndW1lbnRzIGFyZSB1c3VhbGx5IHBhc3NlZCBpbiByZWdpc3RlcnMsIGlzIHRvIGNhdXNlCituYW1lbGVzcyBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIG9uIHRoZSBzdGFjayBpbnN0ZWFkLiAgVGhpcyBpcyBkb25lCitieSBtYWtpbmcgRlVOQ1RJT05fQVJHIHJldHVybiAwIHdoZW5ldmVyIE5BTUVEIGlzIDAuCisKK1lvdSBtYXkgdXNlIHRoZSBtYWNybyBNVVNUX1BBU1NfSU5fU1RBQ0sgKE1PREUsIFRZUEUpCitpbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvIHRvIGRldGVybWluZSBpZiB0aGlzIGFyZ3VtZW50IGlzIG9mIGEKK3R5cGUgdGhhdCBtdXN0IGJlIHBhc3NlZCBpbiB0aGUgc3RhY2suICBJZiBSRUdfUEFSTV9TVEFDS19TUEFDRQoraXMgbm90IGRlZmluZWQgYW5kIEZVTkNUSU9OX0FSRyByZXR1cm5zIG5vbnplcm8gZm9yIHN1Y2ggYW4KK2FyZ3VtZW50LCB0aGUgY29tcGlsZXIgd2lsbCBhYm9ydC4gIElmIFJFR19QQVJNX1NUQUNLX1NQQUNFIGlzCitkZWZpbmVkLCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb21wdXRlZCBpbiB0aGUgc3RhY2sgYW5kIHRoZW4gbG9hZGVkIGludG8KK2EgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX0FSRyhDVU0sIE1PREUsIFRZUEUsIE5BTUVEKSBcCisgIGF2cjMyX2Z1bmN0aW9uX2FyZygmKENVTSksIE1PREUsIFRZUEUsIE5BTUVEKQorCisKKworCisvKgorQSBDIHR5cGUgZm9yIGRlY2xhcmluZyBhIHZhcmlhYmxlIHRoYXQgaXMgdXNlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgb2YKK0ZVTkNUSU9OX0FSRyBhbmQgb3RoZXIgcmVsYXRlZCB2YWx1ZXMuICBGb3Igc29tZSB0YXJnZXQgbWFjaGluZXMsCit0aGUgdHlwZSBpbnQgc3VmZmljZXMgYW5kIGNhbiBob2xkIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YKK2FyZ3VtZW50IHNvIGZhci4KKworVGhlcmUgaXMgbm8gbmVlZCB0byByZWNvcmQgaW4gQ1VNVUxBVElWRV9BUkdTIGFueXRoaW5nIGFib3V0IHRoZQorYXJndW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHBhc3NlZCBvbiB0aGUgc3RhY2suICBUaGUgY29tcGlsZXIgaGFzIG90aGVyCit2YXJpYWJsZXMgdG8ga2VlcCB0cmFjayBvZiB0aGF0LiAgRm9yIHRhcmdldCBtYWNoaW5lcyBvbiB3aGljaCBhbGwKK2FyZ3VtZW50cyBhcmUgcGFzc2VkIG9uIHRoZSBzdGFjaywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSBhbnl0aGluZyBpbgorQ1VNVUxBVElWRV9BUkdTOyBob3dldmVyLCB0aGUgZGF0YSBzdHJ1Y3R1cmUgbXVzdCBleGlzdCBhbmQKK3Nob3VsZCBub3QgYmUgZW1wdHksIHNvIHVzZSBpbnQuCisqLwordHlwZWRlZiBzdHJ1Y3QgYXZyMzJfYXJncworeworICAvKiBJbmRleCByZXByZXNlbnRpbmcgdGhlIGFyZ3VtZW50IHJlZ2lzdGVyIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGFyZ3VtZW50CisgICAgIHdpbGwgb2NjdXB5ICovCisgIGludCBpbmRleDsKKyAgLyogQSBtYXNrIHdpdGggYml0cyByZXByZXNlbnRpbmcgdGhlIGFyZ3VtZW50IHJlZ2lzdGVyczogaWYgYSBiaXQgaXMgc2V0CisgICAgIHRoZW4gdGhpcyByZWdpc3RlciBpcyB1c2VkIGZvciBhbiBhcmd1ZW1udCAqLworICBpbnQgdXNlZF9pbmRleDsKKyAgLyogVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbm9ueW1vdXMgYXJndW1lbnRzICovCisgIGludCB1c2VzX2Fub255bW91c19hcmdzOworICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmFtZWQgYXJndW1lbnRzIHB1c2hlZCBvbiB0aGUgc3RhY2sgKi8KKyAgaW50IHN0YWNrX3B1c2hlZF9hcmdzX3NpemU7CisgIC8qIFNldCB0byB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gbmVlZHMgYSBSZXR1cm4gVmFsdWUgUG9pbnRlciAqLworICBpbnQgdXNlX3J2cDsKKworfSBDVU1VTEFUSVZFX0FSR1M7CisKKworI2RlZmluZSBGSVJTVF9DVU1fUkVHX0lOREVYIDAKKyNkZWZpbmUgTEFTVF9DVU1fUkVHX0lOREVYIDQKKyNkZWZpbmUgR0VUX1JFR19JTkRFWChDVU0pICgoQ1VNKS0+aW5kZXgpCisjZGVmaW5lIFNFVF9SRUdfSU5ERVgoQ1VNLCBJTkRFWCkgKChDVU0pLT5pbmRleCA9IChJTkRFWCkpOworI2RlZmluZSBHRVRfVVNFRF9JTkRFWChDVU0sIElOREVYKSAoKENVTSktPnVzZWRfaW5kZXggJiAoMSA8PCAoSU5ERVgpKSkKKyNkZWZpbmUgU0VUX1VTRURfSU5ERVgoQ1VNLCBJTkRFWCkJCVwKKyAgZG8JCQkJCQlcCisgICAgewkJCQkJCVwKKyAgICAgIGlmIChJTkRFWCA+PSAwKQkJCQlcCisgICAgICAgIChDVU0pLT51c2VkX2luZGV4IHw9ICgxIDw8IChJTkRFWCkpOwlcCisgICAgfQkJCQkJCVwKKyAgd2hpbGUgKDApCisjZGVmaW5lIFNFVF9JTkRFWEVTX1VOVVNFRChDVU0pICgoQ1VNKS0+dXNlZF9pbmRleCA9IDApCisKKworLyoKKyAgIEEgQyBzdGF0ZW1lbnQgKHNhbnMgc2VtaWNvbG9uKSBmb3IgaW5pdGlhbGl6aW5nIHRoZSB2YXJpYWJsZSBjdW0gZm9yIHRoZQorICAgc3RhdGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJndW1lbnQgbGlzdC4gVGhlIHZhcmlhYmxlIGhhcyB0eXBlCisgICBDVU1VTEFUSVZFX0FSR1MuIFRoZSB2YWx1ZSBvZiBGTlRZUEUgaXMgdGhlIHRyZWUgbm9kZSBmb3IgdGhlIGRhdGEgdHlwZSBvZgorICAgdGhlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgYXJncywgb3IgMCBpZiB0aGUgYXJncyBhcmUgdG8gYSBjb21waWxlcgorICAgc3VwcG9ydCBsaWJyYXJ5IGZ1bmN0aW9uLiBGb3IgZGlyZWN0IGNhbGxzIHRoYXQgYXJlIG5vdCBsaWJjYWxscywgRk5ERUNMCisgICBjb250YWluIHRoZSBkZWNsYXJhdGlvbiBub2RlIG9mIHRoZSBmdW5jdGlvbi4gRk5ERUNMIGlzIGFsc28gc2V0IHdoZW4KKyAgIElOSVRfQ1VNVUxBVElWRV9BUkdTIGlzIHVzZWQgdG8gZmluZCBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbiBiZWluZworICAgY29tcGlsZWQuICBOX05BTUVEX0FSR1MgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgbmFtZWQgYXJndW1lbnRzLCBpbmNsdWRpbmcgYQorICAgc3RydWN0dXJlIHJldHVybiBhZGRyZXNzIGlmIGl0IGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciwgd2hlbiBtYWtpbmcgYSBjYWxsLgorICAgV2hlbiBwcm9jZXNzaW5nIGluY29taW5nIGFyZ3VtZW50cywgTl9OQU1FRF9BUkdTIGlzIHNldCB0byAtMS4KKworICAgV2hlbiBwcm9jZXNzaW5nIGEgY2FsbCB0byBhIGNvbXBpbGVyIHN1cHBvcnQgbGlicmFyeSBmdW5jdGlvbiwgTElCTkFNRQorICAgaWRlbnRpZmllcyB3aGljaCBvbmUuICBJdCBpcyBhIHN5bWJvbF9yZWYgcnR4IHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZQorICAgZnVuY3Rpb24sIGFzIGEgc3RyaW5nLiBMSUJOQU1FIGlzIDAgd2hlbiBhbiBvcmRpbmFyeSBDIGZ1bmN0aW9uIGNhbGwgaXMKKyAgIGJlaW5nIHByb2Nlc3NlZC4gVGh1cywgZWFjaCB0aW1lIHRoaXMgbWFjcm8gaXMgY2FsbGVkLCBlaXRoZXIgTElCTkFNRSBvcgorICAgRk5UWVBFIGlzIG5vbnplcm8sIGJ1dCBuZXZlciBib3RoIG9mIHRoZW0gYXQgb25jZS4KKyovCisjZGVmaW5lIElOSVRfQ1VNVUxBVElWRV9BUkdTKENVTSwgRk5UWVBFLCBMSUJOQU1FLCBGTkRFQ0wsIE5fTkFNRURfQVJHUykgXAorICBhdnIzMl9pbml0X2N1bXVsYXRpdmVfYXJncygmKENVTSksIEZOVFlQRSwgTElCTkFNRSwgRk5ERUNMKQorCisKKy8qCitBIEMgc3RhdGVtZW50IChzYW5zIHNlbWljb2xvbikgdG8gdXBkYXRlIHRoZSBzdW1tYXJpemVyIHZhcmlhYmxlCitDVU0gdG8gYWR2YW5jZSBwYXN0IGFuIGFyZ3VtZW50IGluIHRoZSBhcmd1bWVudCBsaXN0LiAgVGhlCit2YWx1ZXMgTU9ERSwgVFlQRSBhbmQgTkFNRUQgZGVzY3JpYmUgdGhhdCBhcmd1bWVudC4KK09uY2UgdGhpcyBpcyBkb25lLCB0aGUgdmFyaWFibGUgQ1VNIGlzIHN1aXRhYmxlIGZvciBhbmFseXppbmcKK3RoZSBmb2xsb3dpbmcgYXJndW1lbnQgd2l0aCBGVU5DVElPTl9BUkcsIGV0Yy4KKworVGhpcyBtYWNybyBuZWVkIG5vdCBkbyBhbnl0aGluZyBpZiB0aGUgYXJndW1lbnQgaW4gcXVlc3Rpb24gd2FzIHBhc3NlZAorb24gdGhlIHN0YWNrLiAgVGhlIGNvbXBpbGVyIGtub3dzIGhvdyB0byB0cmFjayB0aGUgYW1vdW50IG9mIHN0YWNrIHNwYWNlCit1c2VkIGZvciBhcmd1bWVudHMgd2l0aG91dCBhbnkgc3BlY2lhbCBoZWxwLgorKi8KKyNkZWZpbmUgRlVOQ1RJT05fQVJHX0FEVkFOQ0UoQ1VNLCBNT0RFLCBUWVBFLCBOQU1FRCkgXAorICBhdnIzMl9mdW5jdGlvbl9hcmdfYWR2YW5jZSgmKENVTSksIE1PREUsIFRZUEUsIE5BTUVEKQorCisvKgorSWYgZGVmaW5lZCwgYSBDIGV4cHJlc3Npb24gd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyLCBhbmQgaW4gd2hpY2ggZGlyZWN0aW9uLAordG8gcGFkIG91dCBhbiBhcmd1bWVudCB3aXRoIGV4dHJhIHNwYWNlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBvZiB0eXBlCitlbnVtIGRpcmVjdGlvbjogZWl0aGVyICd1cHdhcmQnIHRvIHBhZCBhYm92ZSB0aGUgYXJndW1lbnQsCisnZG93bndhcmQnIHRvIHBhZCBiZWxvdywgb3IgJ25vbmUnIHRvIGluaGliaXQgcGFkZGluZy4KKworVGhlIGFtb3VudCBvZiBwYWRkaW5nIGlzIGFsd2F5cyBqdXN0IGVub3VnaCB0byByZWFjaCB0aGUgbmV4dAorbXVsdGlwbGUgb2YgRlVOQ1RJT05fQVJHX0JPVU5EQVJZOyB0aGlzIG1hY3JvIGRvZXMgbm90IGNvbnRyb2wKK2l0LgorCitUaGlzIG1hY3JvIGhhcyBhIGRlZmF1bHQgZGVmaW5pdGlvbiB3aGljaCBpcyByaWdodCBmb3IgbW9zdCBzeXN0ZW1zLgorRm9yIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHRoZSBkZWZhdWx0IGlzIHRvIHBhZCB1cHdhcmQuICBGb3IKK2JpZy1lbmRpYW4gbWFjaGluZXMsIHRoZSBkZWZhdWx0IGlzIHRvIHBhZCBkb3dud2FyZCBmb3IgYW4gYXJndW1lbnQgb2YKK2NvbnN0YW50IHNpemUgc2hvcnRlciB0aGFuIGFuIGludCwgYW5kIHVwd2FyZCBvdGhlcndpc2UuCisqLworI2RlZmluZSBGVU5DVElPTl9BUkdfUEFERElORyhNT0RFLCBUWVBFKSBcCisgIGF2cjMyX2Z1bmN0aW9uX2FyZ19wYWRkaW5nKE1PREUsIFRZUEUpCisKKy8qCisgIFNwZWNpZnkgcGFkZGluZyBmb3IgdGhlIGxhc3QgZWxlbWVudCBvZiBhIGJsb2NrIG1vdmUgYmV0d2VlbiByZWdpc3RlcnMKKyAgYW5kIG1lbW9yeS4gRmlyc3QgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBvbmx5IGVsZW1lbnQuIERlZmluaW5nCisgIHRoaXMgbWFjcm8gYWxsb3dzIGJldHRlciBjb250cm9sIG9mIHJlZ2lzdGVyIGZ1bmN0aW9uIHBhcmFtZXRlcnMgb24KKyAgYmlnLWVuZGlhbiBtYWNoaW5lcywgd2l0aG91dCB1c2luZyBQQVJBTExFTCBydGwuIEluIHBhcnRpY3VsYXIsCisgIE1VU1RfUEFTU19JTl9TVEFDSyBuZWVkIG5vdCB0ZXN0IHBhZGRpbmcgYW5kIG1vZGUgb2YgdHlwZXMgaW4gcmVnaXN0ZXJzLAorICBhcyB0aGVyZSBpcyBubyBsb25nZXIgYSAid3JvbmciIHBhcnQgb2YgYSByZWdpc3RlcjsgRm9yIGV4YW1wbGUsIGEgdGhyZWUKKyAgYnl0ZSBhZ2dyZWdhdGUgbWF5IGJlIHBhc3NlZCBpbiB0aGUgaGlnaCBwYXJ0IG9mIGEgcmVnaXN0ZXIgaWYgc28gcmVxdWlyZWQuCisqLworI2RlZmluZSBCTE9DS19SRUdfUEFERElORyhNT0RFLCBUWVBFLCBGSVJTVCkgXAorICBhdnIzMl9mdW5jdGlvbl9hcmdfcGFkZGluZyhNT0RFLCBUWVBFKQorCisvKgorSWYgZGVmaW5lZCwgYSBDIGV4cHJlc3Npb24gd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZWZhdWx0CitpbXBsZW1lbnRhdGlvbiBvZiB2YV9hcmcgd2lsbCBhdHRlbXB0IHRvIHBhZCBkb3duIGJlZm9yZSByZWFkaW5nIHRoZQorbmV4dCBhcmd1bWVudCwgaWYgdGhhdCBhcmd1bWVudCBpcyBzbWFsbGVyIHRoYW4gaXRzIGFsaWduZWQgc3BhY2UgYXMKK2NvbnRyb2xsZWQgYnkgUEFSTV9CT1VOREFSWS4gIElmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQsIGFsbCBzdWNoCithcmd1bWVudHMgYXJlIHBhZGRlZCBkb3duIGlmIEJZVEVTX0JJR19FTkRJQU4gaXMgdHJ1ZS4KKyovCisjZGVmaW5lIFBBRF9WQVJBUkdTX0RPV04gXAorICAoRlVOQ1RJT05fQVJHX1BBRERJTkcgKFRZUEVfTU9ERSAodHlwZSksIHR5cGUpID09IGRvd253YXJkKQorCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGlzIG5vbnplcm8gaWYgUkVHTk8gaXMgdGhlIG51bWJlciBvZiBhIGhhcmQKK3JlZ2lzdGVyIGluIHdoaWNoIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgc29tZXRpbWVzIHBhc3NlZC4gIFRoaXMgZG9lcworbm90IGluY2x1ZGUgaW1wbGljaXQgYXJndW1lbnRzIHN1Y2ggYXMgdGhlIHN0YXRpYyBjaGFpbiBhbmQKK3RoZSBzdHJ1Y3R1cmUtdmFsdWUgYWRkcmVzcy4gIE9uIG1hbnkgbWFjaGluZXMsIG5vIHJlZ2lzdGVycyBjYW4gYmUKK3VzZWQgZm9yIHRoaXMgcHVycG9zZSBzaW5jZSBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSBwdXNoZWQgb24gdGhlCitzdGFjay4KKyovCisvKgorICBVc2UgcjggLSByMTIgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyovCisjZGVmaW5lIEZVTkNUSU9OX0FSR19SRUdOT19QKFJFR05PKSBcCisgIChSRUdOTyA+PSAzICYmIFJFR05PIDw9IDcpCisKKy8qIE51bWJlciBvZiByZWdpc3RlcnMgdXNlZCBmb3IgcGFzc2luZyBmdW5jdGlvbiBhcmd1bWVudHMgKi8KKyNkZWZpbmUgTlVNX0FSR19SRUdTIDUKKworLyoKK0lmIGRlZmluZWQsIHRoZSBvcmRlciBpbiB3aGljaCBhcmd1bWVudHMgYXJlIGxvYWRlZCBpbnRvIHRoZWlyCityZXNwZWN0aXZlIGFyZ3VtZW50IHJlZ2lzdGVycyBpcyByZXZlcnNlZCBzbyB0aGF0IHRoZSBsYXN0Cithcmd1bWVudCBpcyBsb2FkZWQgZmlyc3QuICBUaGlzIG1hY3JvIG9ubHkgYWZmZWN0cyBhcmd1bWVudHMKK3Bhc3NlZCBpbiByZWdpc3RlcnMuCisqLworLyogI2RlZmluZSBMT0FEX0FSR1NfUkVWRVJTRUQgKi8KKworLyoqIEhvdyBTY2FsYXIgRnVuY3Rpb24gVmFsdWVzIEFyZSBSZXR1cm5lZCAqKi8KKworLyogQVZSMzIgaXMgdXNpbmcgcjEyIGFzIHJldHVybiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUkVUX1JFR0lTVEVSICgxNSAtIDEyKQorCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0byBjcmVhdGUgYW4gUlRYIHJlcHJlc2VudGluZyB0aGUgcGxhY2Ugd2hlcmUgYSBsaWJyYXJ5CitmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgb2YgbW9kZSBNT0RFLiAgSWYgdGhlIHByZWNpc2UgZnVuY3Rpb24KK2JlaW5nIGNhbGxlZCBpcyBrbm93biwgRlVOQyBpcyBhIHRyZWUgbm9kZQorKEZVTkNUSU9OX0RFQ0wpIGZvciBpdDsgb3RoZXJ3aXNlLCBmdW5jIGlzIGEgbnVsbAorcG9pbnRlci4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGEgZGlmZmVyZW50IHZhbHVlLXJldHVybmluZworY29udmVudGlvbiBmb3Igc3BlY2lmaWMgZnVuY3Rpb25zIHdoZW4gYWxsIHRoZWlyIGNhbGxzIGFyZQora25vd24uCisKK05vdGUgdGhhdCAibGlicmFyeSBmdW5jdGlvbiIgaW4gdGhpcyBjb250ZXh0IG1lYW5zIGEgY29tcGlsZXIKK3N1cHBvcnQgcm91dGluZSwgdXNlZCB0byBwZXJmb3JtIGFyaXRobWV0aWMsIHdob3NlIG5hbWUgaXMga25vd24KK3NwZWNpYWxseSBieSB0aGUgY29tcGlsZXIgYW5kIHdhcyBub3QgbWVudGlvbmVkIGluIHRoZSBDIGNvZGUgYmVpbmcKK2NvbXBpbGVkLgorCitUaGUgZGVmaW5pdGlvbiBvZiBMSUJSQVJZX1ZBTFVFIG5lZWQgbm90IGJlIGNvbmNlcm5lZCBhZ2dyZWdhdGUKK2RhdGEgdHlwZXMsIGJlY2F1c2Ugbm9uZSBvZiB0aGUgbGlicmFyeSBmdW5jdGlvbnMgcmV0dXJucyBzdWNoIHR5cGVzLgorKi8KKyNkZWZpbmUgTElCQ0FMTF9WQUxVRShNT0RFKSBhdnIzMl9saWJjYWxsX3ZhbHVlKE1PREUpCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGlzIG5vbnplcm8gaWYgUkVHTk8gaXMgdGhlIG51bWJlciBvZiBhIGhhcmQKK3JlZ2lzdGVyIGluIHdoaWNoIHRoZSB2YWx1ZXMgb2YgY2FsbGVkIGZ1bmN0aW9uIG1heSBjb21lIGJhY2suCisKK0EgcmVnaXN0ZXIgd2hvc2UgdXNlIGZvciByZXR1cm5pbmcgdmFsdWVzIGlzIGxpbWl0ZWQgdG8gc2VydmluZyBhcyB0aGUKK3NlY29uZCBvZiBhIHBhaXIgKGZvciBhIHZhbHVlIG9mIHR5cGUgZG91YmxlLCBzYXkpIG5lZWQgbm90IGJlCityZWNvZ25pemVkIGJ5IHRoaXMgbWFjcm8uICBTbyBmb3IgbW9zdCBtYWNoaW5lcywgdGhpcyBkZWZpbml0aW9uCitzdWZmaWNlczoKKyAgI2RlZmluZSBGVU5DVElPTl9WQUxVRV9SRUdOT19QKE4pICgoTikgPT0gMCkKKworSWYgdGhlIG1hY2hpbmUgaGFzIHJlZ2lzdGVyIHdpbmRvd3MsIHNvIHRoYXQgdGhlIGNhbGxlciBhbmQgdGhlIGNhbGxlZAorZnVuY3Rpb24gdXNlIGRpZmZlcmVudCByZWdpc3RlcnMgZm9yIHRoZSByZXR1cm4gdmFsdWUsIHRoaXMgbWFjcm8KK3Nob3VsZCByZWNvZ25pemUgb25seSB0aGUgY2FsbGVyJ3MgcmVnaXN0ZXIgbnVtYmVycy4KKyovCisvKgorICBXaGVuIHJldHVybmluZyBhIHZhbHVlIG9mIG1vZGUgREltb2RlLCByMTE6cjEwIGlzIHVzZWQsIGVsc2UgcjEyIGlzIHVzZWQuCisqLworI2RlZmluZSBGVU5DVElPTl9WQUxVRV9SRUdOT19QKFJFR05PKSAoKFJFR05PKSA9PSBSRVRfUkVHSVNURVIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFR05PKSA9PSBJTlRFUk5BTF9SRUdOVU0oMTEpKQorCisKKy8qKiBIb3cgTGFyZ2UgVmFsdWVzIEFyZSBSZXR1cm5lZCAqKi8KKworCisvKgorRGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgMSBpZiBhbGwgc3RydWN0dXJlIGFuZCB1bmlvbiByZXR1cm4gdmFsdWVzIG11c3QgYmUKK2luIG1lbW9yeS4gIFNpbmNlIHRoaXMgcmVzdWx0cyBpbiBzbG93ZXIgY29kZSwgdGhpcyBzaG91bGQgYmUgZGVmaW5lZAorb25seSBpZiBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBjb21waWxlcnMgb3Igd2l0aCBhbiBBQkkuCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgMCwgdGhlbiB0aGUgY29udmVudGlvbnMgdXNlZCBmb3Igc3RydWN0dXJlCithbmQgdW5pb24gcmV0dXJuIHZhbHVlcyBhcmUgZGVjaWRlZCBieSB0aGUgUkVUVVJOX0lOX01FTU9SWSBtYWNyby4KKworSWYgbm90IGRlZmluZWQsIHRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIDEuCisqLworI2RlZmluZSBERUZBVUxUX1BDQ19TVFJVQ1RfUkVUVVJOIDAKKworCisKKworLyoqIEdlbmVyYXRpbmcgQ29kZSBmb3IgUHJvZmlsaW5nICoqLworCisvKgorQSBDIHN0YXRlbWVudCBvciBjb21wb3VuZCBzdGF0ZW1lbnQgdG8gb3V0cHV0IHRvIEZJTEUgc29tZQorYXNzZW1ibGVyIGNvZGUgdG8gY2FsbCB0aGUgcHJvZmlsaW5nIHN1YnJvdXRpbmUgbWNvdW50LgorCitUaGUgZGV0YWlscyBvZiBob3cgbWNvdW50IGV4cGVjdHMgdG8gYmUgY2FsbGVkIGFyZSBkZXRlcm1pbmVkIGJ5Cit5b3VyIG9wZXJhdGluZyBzeXN0ZW0gZW52aXJvbm1lbnQsIG5vdCBieSBHQ0MuICBUbyBmaWd1cmUgdGhlbSBvdXQsCitjb21waWxlIGEgc21hbGwgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nIHVzaW5nIHRoZSBzeXN0ZW0ncyBpbnN0YWxsZWQgQworY29tcGlsZXIgYW5kIGxvb2sgYXQgdGhlIGFzc2VtYmxlciBjb2RlIHRoYXQgcmVzdWx0cy4KKworT2xkZXIgaW1wbGVtZW50YXRpb25zIG9mIG1jb3VudCBleHBlY3QgdGhlIGFkZHJlc3Mgb2YgYSBjb3VudGVyCit2YXJpYWJsZSB0byBiZSBsb2FkZWQgaW50byBzb21lIHJlZ2lzdGVyLiAgVGhlIG5hbWUgb2YgdGhpcyB2YXJpYWJsZSBpcworJ0xQJyBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIExBQkVMTk8sIHNvIHlvdSB3b3VsZCBnZW5lcmF0ZQordGhlIG5hbWUgdXNpbmcgJ0xQJWQnIGluIGEgZnByaW50Zi4KKyovCisvKiBUb0RvOiBmaXhtZSAqLworI2lmbmRlZiBGVU5DVElPTl9QUk9GSUxFUgorI2RlZmluZSBGVU5DVElPTl9QUk9GSUxFUihGSUxFLCBMQUJFTE5PKSBcCisgIGZwcmludGYoKEZJTEUpLCAiLyogcHJvZmlsZXIgJWQgKi8iLCAoTEFCRUxOTykpCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRyYW1wb2xpbmVzIGZvciBOZXN0ZWQgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorQSBDIHN0YXRlbWVudCB0byBvdXRwdXQsIG9uIHRoZSBzdHJlYW0gRklMRSwgYXNzZW1ibGVyIGNvZGUgZm9yIGEKK2Jsb2NrIG9mIGRhdGEgdGhhdCBjb250YWlucyB0aGUgY29uc3RhbnQgcGFydHMgb2YgYSB0cmFtcG9saW5lLiAgVGhpcworY29kZSBzaG91bGQgbm90IGluY2x1ZGUgYSBsYWJlbCAtIHRoZSBsYWJlbCBpcyB0YWtlbiBjYXJlIG9mCithdXRvbWF0aWNhbGx5LgorCitJZiB5b3UgZG8gbm90IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBtZWFucyBubyB0ZW1wbGF0ZSBpcyBuZWVkZWQKK2ZvciB0aGUgdGFyZ2V0LiAgRG8gbm90IGRlZmluZSB0aGlzIG1hY3JvIG9uIHN5c3RlbXMgd2hlcmUgdGhlIGJsb2NrIG1vdmUKK2NvZGUgdG8gY29weSB0aGUgdHJhbXBvbGluZSBpbnRvIHBsYWNlIHdvdWxkIGJlIGxhcmdlciB0aGFuIHRoZSBjb2RlCit0byBnZW5lcmF0ZSBpdCBvbiB0aGUgc3BvdC4KKyovCisvKiBUb0RvOiBjb3JyZWN0PyAqLworI2RlZmluZSBUUkFNUE9MSU5FX1RFTVBMQVRFKEZJTEUpIGF2cjMyX3RyYW1wb2xpbmVfdGVtcGxhdGUoRklMRSk7CisKKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgdHJhbXBvbGluZSwgYXMgYW4gaW50ZWdlci4KKyovCisvKiBUb0RvOiBmaXhtZSAqLworI2RlZmluZSBUUkFNUE9MSU5FX1NJWkUgMHgwQworCisvKgorQWxpZ25tZW50IHJlcXVpcmVkIGZvciB0cmFtcG9saW5lcywgaW4gYml0cy4KKworSWYgeW91IGRvbid0IGRlZmluZSB0aGlzIG1hY3JvLCB0aGUgdmFsdWUgb2YgQklHR0VTVF9BTElHTk1FTlQKK2lzIHVzZWQgZm9yIGFsaWduaW5nIHRyYW1wb2xpbmVzLgorKi8KKyNkZWZpbmUgVFJBTVBPTElORV9BTElHTk1FTlQgMTYKKworLyoKK0EgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUgcGFydHMgb2YgYSB0cmFtcG9saW5lLgorQUREUiBpcyBhbiBSVFggZm9yIHRoZSBhZGRyZXNzIG9mIHRoZSB0cmFtcG9saW5lOyBGTkFERFIgaXMKK2FuIFJUWCBmb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIG5lc3RlZCBmdW5jdGlvbjsgU1RBVElDX0NIQUlOIGlzIGFuCitSVFggZm9yIHRoZSBzdGF0aWMgY2hhaW4gdmFsdWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbgord2hlbiBpdCBpcyBjYWxsZWQuCisqLworI2RlZmluZSBJTklUSUFMSVpFX1RSQU1QT0xJTkUoQUREUiwgRk5BRERSLCBTVEFUSUNfQ0hBSU4pIFwKKyAgYXZyMzJfaW5pdGlhbGl6ZV90cmFtcG9saW5lKEFERFIsIEZOQUREUiwgU1RBVElDX0NIQUlOKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltcGxpY2l0IENhbGxzIHRvIExpYnJhcnkgUm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGFpbCBjYWxsaW5nLiAgKi8KKworLyogQSBDIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiBpdCBpcyBvayB0byBwZXJmb3JtIGEgc2libGluZworICAgY2FsbCB0byBERUNMLiAgKi8KKyNkZWZpbmUgRlVOQ1RJT05fT0tfRk9SX1NJQkNBTEwoREVDTCkgMAorCisjZGVmaW5lIE9WRVJSSURFX09QVElPTlMgIGF2cjMyX292ZXJyaWRlX29wdGlvbnMgKCkKKworI2RlZmluZSBPUFRJTUlaQVRJT05fT1BUSU9OUyhMRVZFTCwgU0laRSkgYXZyMzJfb3B0aW1pemF0aW9uX29wdGlvbnMgKExFVkVMLCBTSVpFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGRyZXNzaW5nIE1vZGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGlzIG5vbnplcm8gaWYgdGhlIG1hY2hpbmUgc3VwcG9ydHMgcHJlLWluY3JlbWVudCwKK3ByZS1kZWNyZW1lbnQsIHBvc3QtaW5jcmVtZW50LCBvciBwb3N0LWRlY3JlbWVudCBhZGRyZXNzaW5nIHJlc3BlY3RpdmVseS4KKyovCisvKgorICBBVlIzMiBzdXBwb3J0cyBScCsrIGFuZCAtLVJwCisqLworI2RlZmluZSBIQVZFX1BSRV9JTkNSRU1FTlQgMAorI2RlZmluZSBIQVZFX1BSRV9ERUNSRU1FTlQgMQorI2RlZmluZSBIQVZFX1BPU1RfSU5DUkVNRU5UIDEKKyNkZWZpbmUgSEFWRV9QT1NUX0RFQ1JFTUVOVCAwCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGlzIG5vbnplcm8gaWYgdGhlIG1hY2hpbmUgc3VwcG9ydHMgcHJlLSBvcgorcG9zdC1hZGRyZXNzIHNpZGUtZWZmZWN0IGdlbmVyYXRpb24gaW52b2x2aW5nIGNvbnN0YW50cyBvdGhlciB0aGFuCit0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IG9wZXJhbmQuCisqLworI2RlZmluZSBIQVZFX1BSRV9NT0RJRllfRElTUCAwCisjZGVmaW5lIEhBVkVfUE9TVF9NT0RJRllfRElTUCAwCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0aGF0IGlzIG5vbnplcm8gaWYgdGhlIG1hY2hpbmUgc3VwcG9ydHMgcHJlLSBvcgorcG9zdC1hZGRyZXNzIHNpZGUtZWZmZWN0IGdlbmVyYXRpb24gaW52b2x2aW5nIGEgcmVnaXN0ZXIgZGlzcGxhY2VtZW50LgorKi8KKyNkZWZpbmUgSEFWRV9QUkVfTU9ESUZZX1JFRyAwCisjZGVmaW5lIEhBVkVfUE9TVF9NT0RJRllfUkVHIDAKKworLyoKK0EgQyBleHByZXNzaW9uIHRoYXQgaXMgMSBpZiB0aGUgUlRYIFggaXMgYSBjb25zdGFudCB3aGljaAoraXMgYSB2YWxpZCBhZGRyZXNzLiAgT24gbW9zdCBtYWNoaW5lcywgdGhpcyBjYW4gYmUgZGVmaW5lZCBhcworQ09OU1RBTlRfUCAoWCksIGJ1dCBhIGZldyBtYWNoaW5lcyBhcmUgbW9yZSByZXN0cmljdGl2ZQoraW4gd2hpY2ggY29uc3RhbnQgYWRkcmVzc2VzIGFyZSBzdXBwb3J0ZWQuCisKK0NPTlNUQU5UX1AgYWNjZXB0cyBpbnRlZ2VyLXZhbHVlcyBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlCitub3QgZXhwbGljaXRseSBrbm93biwgc3VjaCBhcyBzeW1ib2xfcmVmLCBsYWJlbF9yZWYsIGFuZAoraGlnaCBleHByZXNzaW9ucyBhbmQgY29uc3QgYXJpdGhtZXRpYyBleHByZXNzaW9ucywgaW4KK2FkZGl0aW9uIHRvIGNvbnN0X2ludCBhbmQgY29uc3RfZG91YmxlIGV4cHJlc3Npb25zLgorKi8KKyNkZWZpbmUgQ09OU1RBTlRfQUREUkVTU19QKFgpIENPTlNUQU5UX1AoWCkKKworLyoKK0EgbnVtYmVyLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoYXQgY2FuIGFwcGVhciBpbiBhIHZhbGlkCittZW1vcnkgYWRkcmVzcy4gIE5vdGUgdGhhdCBpdCBpcyB1cCB0byB5b3UgdG8gc3BlY2lmeSBhIHZhbHVlIGVxdWFsIHRvCit0aGUgbWF4aW11bSBudW1iZXIgdGhhdCBHT19JRl9MRUdJVElNQVRFX0FERFJFU1Mgd291bGQgZXZlcgorYWNjZXB0LgorKi8KKyNkZWZpbmUgTUFYX1JFR1NfUEVSX0FERFJFU1MgMgorCisvKgorQSBDIGNvbXBvdW5kIHN0YXRlbWVudCB3aXRoIGEgY29uZGl0aW9uYWwgZ290byBMQUJFTDsKK2V4ZWN1dGVkIGlmIFggKGFuIFJUWCkgaXMgYSBsZWdpdGltYXRlIG1lbW9yeSBhZGRyZXNzIG9uIHRoZQordGFyZ2V0IG1hY2hpbmUgZm9yIGEgbWVtb3J5IG9wZXJhbmQgb2YgbW9kZSBNT0RFLgorCitJdCB1c3VhbGx5IHBheXMgdG8gZGVmaW5lIHNldmVyYWwgc2ltcGxlciBtYWNyb3MgdG8gc2VydmUgYXMKK3N1YnJvdXRpbmVzIGZvciB0aGlzIG9uZS4gIE90aGVyd2lzZSBpdCBtYXkgYmUgdG9vIGNvbXBsaWNhdGVkIHRvCit1bmRlcnN0YW5kLgorCitUaGlzIG1hY3JvIG11c3QgZXhpc3QgaW4gdHdvIHZhcmlhbnRzOiBhIHN0cmljdCB2YXJpYW50IGFuZCBhCitub24tc3RyaWN0IG9uZS4gIFRoZSBzdHJpY3QgdmFyaWFudCBpcyB1c2VkIGluIHRoZSByZWxvYWQgcGFzcy4gIEl0CittdXN0IGJlIGRlZmluZWQgc28gdGhhdCBhbnkgcHNldWRvLXJlZ2lzdGVyIHRoYXQgaGFzIG5vdCBiZWVuCithbGxvY2F0ZWQgYSBoYXJkIHJlZ2lzdGVyIGlzIGNvbnNpZGVyZWQgYSBtZW1vcnkgcmVmZXJlbmNlLiAgSW4KK2NvbnRleHRzIHdoZXJlIHNvbWUga2luZCBvZiByZWdpc3RlciBpcyByZXF1aXJlZCwgYSBwc2V1ZG8tcmVnaXN0ZXIKK3dpdGggbm8gaGFyZCByZWdpc3RlciBtdXN0IGJlIHJlamVjdGVkLgorCitUaGUgbm9uLXN0cmljdCB2YXJpYW50IGlzIHVzZWQgaW4gb3RoZXIgcGFzc2VzLiAgSXQgbXVzdCBiZSBkZWZpbmVkIHRvCithY2NlcHQgYWxsIHBzZXVkby1yZWdpc3RlcnMgaW4gZXZlcnkgY29udGV4dCB3aGVyZSBzb21lIGtpbmQgb2YKK3JlZ2lzdGVyIGlzIHJlcXVpcmVkLgorCitDb21waWxlciBzb3VyY2UgZmlsZXMgdGhhdCB3YW50IHRvIHVzZSB0aGUgc3RyaWN0IHZhcmlhbnQgb2YgdGhpcworbWFjcm8gZGVmaW5lIHRoZSBtYWNybyBSRUdfT0tfU1RSSUNULiAgWW91IHNob3VsZCB1c2UgYW4KKyNpZmRlZiBSRUdfT0tfU1RSSUNUIGNvbmRpdGlvbmFsIHRvIGRlZmluZSB0aGUgc3RyaWN0IHZhcmlhbnQKK2luIHRoYXQgY2FzZSBhbmQgdGhlIG5vbi1zdHJpY3QgdmFyaWFudCBvdGhlcndpc2UuCisKK1N1YnJvdXRpbmVzIHRvIGNoZWNrIGZvciBhY2NlcHRhYmxlIHJlZ2lzdGVycyBmb3IgdmFyaW91cyBwdXJwb3NlcyAob25lCitmb3IgYmFzZSByZWdpc3RlcnMsIG9uZSBmb3IgaW5kZXggcmVnaXN0ZXJzLCBhbmQgc28gb24pIGFyZSB0eXBpY2FsbHkKK2Ftb25nIHRoZSBzdWJyb3V0aW5lcyB1c2VkIHRvIGRlZmluZSBHT19JRl9MRUdJVElNQVRFX0FERFJFU1MuCitUaGVuIG9ubHkgdGhlc2Ugc3Vicm91dGluZSBtYWNyb3MgbmVlZCBoYXZlIHR3byB2YXJpYW50czsgdGhlIGhpZ2hlcgorbGV2ZWxzIG9mIG1hY3JvcyBtYXkgYmUgdGhlIHNhbWUgd2hldGhlciBzdHJpY3Qgb3Igbm90LgorCitOb3JtYWxseSwgY29uc3RhbnQgYWRkcmVzc2VzIHdoaWNoIGFyZSB0aGUgc3VtIG9mIGEgc3ltYm9sX3JlZgorYW5kIGFuIGludGVnZXIgYXJlIHN0b3JlZCBpbnNpZGUgYSBjb25zdCBSVFggdG8gbWFyayB0aGVtIGFzCitjb25zdGFudC4gIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZWNvZ25pemUgc3VjaCBzdW1zCitzcGVjaWZpY2FsbHkgYXMgbGVnaXRpbWF0ZSBhZGRyZXNzZXMuICBOb3JtYWxseSB5b3Ugd291bGQgc2ltcGx5CityZWNvZ25pemUgYW55IGNvbnN0IGFzIGxlZ2l0aW1hdGUuCisKK1VzdWFsbHkgUFJJTlRfT1BFUkFORF9BRERSRVNTIGlzIG5vdCBwcmVwYXJlZCB0byBoYW5kbGUgY29uc3RhbnQKK3N1bXMgdGhhdCBhcmUgbm90IG1hcmtlZCB3aXRoICBjb25zdC4gIEl0IGFzc3VtZXMgdGhhdCBhIG5ha2VkCitwbHVzIGluZGljYXRlcyBpbmRleGluZy4gIElmIHNvLCB0aGVuIHlvdSBtdXN0IHJlamVjdCBzdWNoCituYWtlZCBjb25zdGFudCBzdW1zIGFzIGlsbGVnaXRpbWF0ZSBhZGRyZXNzZXMsIHNvIHRoYXQgbm9uZSBvZiB0aGVtIHdpbGwKK2JlIGdpdmVuIHRvIFBSSU5UX09QRVJBTkRfQUREUkVTUy4KKworT24gc29tZSBtYWNoaW5lcywgd2hldGhlciBhIHN5bWJvbGljIGFkZHJlc3MgaXMgbGVnaXRpbWF0ZSBkZXBlbmRzIG9uCit0aGUgc2VjdGlvbiB0aGF0IHRoZSBhZGRyZXNzIHJlZmVycyB0by4gIE9uIHRoZXNlIG1hY2hpbmVzLCBkZWZpbmUgdGhlCittYWNybyBFTkNPREVfU0VDVElPTl9JTkZPIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZQorc3ltYm9sX3JlZiwgYW5kIHRoZW4gY2hlY2sgZm9yIGl0IGhlcmUuICBXaGVuIHlvdSBzZWUgYQorY29uc3QsIHlvdSB3aWxsIGhhdmUgdG8gbG9vayBpbnNpZGUgaXQgdG8gZmluZCB0aGUKK3N5bWJvbF9yZWYgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBzZWN0aW9uLgorCitUaGUgYmVzdCB3YXkgdG8gbW9kaWZ5IHRoZSBuYW1lIHN0cmluZyBpcyBieSBhZGRpbmcgdGV4dCB0byB0aGUKK2JlZ2lubmluZywgd2l0aCBzdWl0YWJsZSBwdW5jdHVhdGlvbiB0byBwcmV2ZW50IGFueSBhbWJpZ3VpdHkuICBBbGxvY2F0ZQordGhlIG5ldyBuYW1lIGluIHNhdmVhYmxlX29ic3RhY2suICBZb3Ugd2lsbCBoYXZlIHRvIG1vZGlmeQorQVNNX09VVFBVVF9MQUJFTFJFRiB0byByZW1vdmUgYW5kIGRlY29kZSB0aGUgYWRkZWQgdGV4dCBhbmQKK291dHB1dCB0aGUgbmFtZSBhY2NvcmRpbmdseSwgYW5kIGRlZmluZSBTVFJJUF9OQU1FX0VOQ09ESU5HIHRvCithY2Nlc3MgdGhlIG9yaWdpbmFsIG5hbWUgc3RyaW5nLgorCitZb3UgY2FuIGNoZWNrIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaGVyZSBpbnRvIHRoZSBzeW1ib2xfcmVmIGluCit0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1hY3JvcyBHT19JRl9MRUdJVElNQVRFX0FERFJFU1MgYW5kCitQUklOVF9PUEVSQU5EX0FERFJFU1MuCisqLworI2lmZGVmIFJFR19PS19TVFJJQ1QKKyMgIGRlZmluZSBHT19JRl9MRUdJVElNQVRFX0FERFJFU1MoTU9ERSwgWCwgTEFCRUwpCVwKKyAgZG8JCQkJCQkJXAorICAgIHsJCQkJCQkJXAorICAgICAgaWYgKGF2cjMyX2xlZ2l0aW1hdGVfYWRkcmVzcyhNT0RFLCBYLCAxKSkJCVwKKwlnb3RvIExBQkVMOwkJCQkJXAorICAgIH0JCQkJCQkJXAorICB3aGlsZSAoMCkKKyNlbHNlCisjICBkZWZpbmUgR09fSUZfTEVHSVRJTUFURV9BRERSRVNTKE1PREUsIFgsIExBQkVMKQlcCisgIGRvCQkJCQkJCVwKKyAgICB7CQkJCQkJCVwKKyAgICAgIGlmIChhdnIzMl9sZWdpdGltYXRlX2FkZHJlc3MoTU9ERSwgWCwgMCkpCQlcCisJZ290byBMQUJFTDsJCQkJCVwKKyAgICB9CQkJCQkJCVwKKyAgd2hpbGUgKDApCisjZW5kaWYKKworCisKKy8qCitBIEMgY29tcG91bmQgc3RhdGVtZW50IHRoYXQgYXR0ZW1wdHMgdG8gcmVwbGFjZSBYIHdpdGggYSB2YWxpZAorbWVtb3J5IGFkZHJlc3MgZm9yIGFuIG9wZXJhbmQgb2YgbW9kZSBNT0RFLiAgd2luIHdpbGwgYmUgYQorQyBzdGF0ZW1lbnQgbGFiZWwgZWxzZXdoZXJlIGluIHRoZSBjb2RlOyB0aGUgbWFjcm8gZGVmaW5pdGlvbiBtYXkgdXNlCisKKyAgR09fSUZfTEVHSVRJTUFURV9BRERSRVNTIChNT0RFLCBYLCBXSU4pOworCit0byBhdm9pZCBmdXJ0aGVyIHByb2Nlc3NpbmcgaWYgdGhlIGFkZHJlc3MgaGFzIGJlY29tZSBsZWdpdGltYXRlLgorCitYIHdpbGwgYWx3YXlzIGJlIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIGJyZWFrX291dF9tZW1vcnlfcmVmcywKK2FuZCBPTERYIHdpbGwgYmUgdGhlIG9wZXJhbmQgdGhhdCB3YXMgZ2l2ZW4gdG8gdGhhdCBmdW5jdGlvbiB0byBwcm9kdWNlCitYLgorCitUaGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhpcyBtYWNybyBzaG91bGQgbm90IGFsdGVyIHRoZSBzdWJzdHJ1Y3R1cmUgb2YKK1guICBJZiBpdCB0cmFuc2Zvcm1zIFggaW50byBhIG1vcmUgbGVnaXRpbWF0ZSBmb3JtLCBpdAorc2hvdWxkIGFzc2lnbiBYICh3aGljaCB3aWxsIGFsd2F5cyBiZSBhIEMgdmFyaWFibGUpIGEgbmV3IHZhbHVlLgorCitJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGlzIG1hY3JvIHRvIGNvbWUgdXAgd2l0aCBhIGxlZ2l0aW1hdGUKK2FkZHJlc3MuICBUaGUgY29tcGlsZXIgaGFzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgc28gaW4gYWxsIGNhc2VzLiAgSW4KK2ZhY3QsIGl0IGlzIHNhZmUgZm9yIHRoaXMgbWFjcm8gdG8gZG8gbm90aGluZy4gIEJ1dCBvZnRlbiBhCittYWNoaW5lLWRlcGVuZGVudCBzdHJhdGVneSBjYW4gZ2VuZXJhdGUgYmV0dGVyIGNvZGUuCisqLworI2RlZmluZSBMRUdJVElNSVpFX0FERFJFU1MoWCwgT0xEWCwgTU9ERSwgV0lOKQkJCVwKKyAgZG8JCQkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICBpZiAoR0VUX0NPREUoWCkgPT0gUExVUwkJCQkJXAorCSAgJiYgR0VUX0NPREUoWEVYUChYLCAwKSkgPT0gUkVHCQkJXAorCSAgJiYgR0VUX0NPREUoWEVYUChYLCAxKSkgPT0gQ09OU1RfSU5UCQkJXAorCSAgJiYgIUNPTlNUX09LX0ZPUl9DT05TVFJBSU5UX1AoSU5UVkFMKFhFWFAoWCwgMSkpLAlcCisJCQkJCSdLJywgIktzMTYiKSkJCVwKKwl7CQkJCQkJCVwKKwkgIHJ0eCBpbmRleCA9IGZvcmNlX3JlZyhTSW1vZGUsIFhFWFAoWCwgMSkpOwkJXAorCSAgWCA9IGdlbl9ydHhfUExVUyggU0ltb2RlLCBYRVhQKFgsIDApLCBpbmRleCk7CQlcCisJfQkJCQkJCQlcCisgICAgICBHT19JRl9MRUdJVElNQVRFX0FERFJFU1MoTU9ERSwgWCwgV0lOKTsJCQlcCisgICAgfQkJCQkJCQkJXAorICB3aGlsZSgwKQorCisKKy8qCitBIEMgc3RhdGVtZW50IG9yIGNvbXBvdW5kIHN0YXRlbWVudCB3aXRoIGEgY29uZGl0aW9uYWwKK2dvdG8gTEFCRUw7IGV4ZWN1dGVkIGlmIG1lbW9yeSBhZGRyZXNzIFggKGFuIFJUWCkgY2FuIGhhdmUKK2RpZmZlcmVudCBtZWFuaW5ncyBkZXBlbmRpbmcgb24gdGhlIG1hY2hpbmUgbW9kZSBvZiB0aGUgbWVtb3J5CityZWZlcmVuY2UgaXQgaXMgdXNlZCBmb3Igb3IgaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQgZm9yIHNvbWUgbW9kZXMKK2J1dCBub3Qgb3RoZXJzLgorCitBdXRvaW5jcmVtZW50IGFuZCBhdXRvZGVjcmVtZW50IGFkZHJlc3NlcyB0eXBpY2FsbHkgaGF2ZSBtb2RlLWRlcGVuZGVudAorZWZmZWN0cyBiZWNhdXNlIHRoZSBhbW91bnQgb2YgdGhlIGluY3JlbWVudCBvciBkZWNyZW1lbnQgaXMgdGhlIHNpemUKK29mIHRoZSBvcGVyYW5kIGJlaW5nIGFkZHJlc3NlZC4gIFNvbWUgbWFjaGluZXMgaGF2ZSBvdGhlciBtb2RlLWRlcGVuZGVudAorYWRkcmVzc2VzLiAgTWFueSBSSVNDIG1hY2hpbmVzIGhhdmUgbm8gbW9kZS1kZXBlbmRlbnQgYWRkcmVzc2VzLgorCitZb3UgbWF5IGFzc3VtZSB0aGF0IEFERFIgaXMgYSB2YWxpZCBhZGRyZXNzIGZvciB0aGUgbWFjaGluZS4KKyovCisjZGVmaW5lIEdPX0lGX01PREVfREVQRU5ERU5UX0FERFJFU1MoQUREUiwgTEFCRUwpCVwKKyAgZG8JCQkJCQkJXAorICAgIHsJCQkJCQkJXAorICAgICAgaWYgKEdFVF9DT0RFIChBRERSKSA9PSBQT1NUX0lOQwkJCVwKKwkgIHx8IEdFVF9DT0RFIChBRERSKSA9PSBQUkVfREVDKQkJXAorCWdvdG8gTEFCRUw7CQkJCQlcCisgICAgfQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisvKgorQSBDIGV4cHJlc3Npb24gdGhhdCBpcyBub256ZXJvIGlmIFggaXMgYSBsZWdpdGltYXRlIGNvbnN0YW50IGZvcgorYW4gaW1tZWRpYXRlIG9wZXJhbmQgb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgWW91IGNhbiBhc3N1bWUgdGhhdAorWCBzYXRpc2ZpZXMgQ09OU1RBTlRfUCwgc28geW91IG5lZWQgbm90IGNoZWNrIHRoaXMuICBJbiBmYWN0LAorJzEnIGlzIGEgc3VpdGFibGUgZGVmaW5pdGlvbiBmb3IgdGhpcyBtYWNybyBvbiBtYWNoaW5lcyB3aGVyZQorYW55dGhpbmcgQ09OU1RBTlRfUCBpcyB2YWxpZC4KKyovCisjZGVmaW5lIExFR0lUSU1BVEVfQ09OU1RBTlRfUChYKSBhdnIzMl9sZWdpdGltYXRlX2NvbnN0YW50X3AoWCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb25kaXRpb24gQ29kZSBTdGF0dXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKK0MgY29kZSBmb3IgYSBkYXRhIHR5cGUgd2hpY2ggaXMgdXNlZCBmb3IgZGVjbGFyaW5nIHRoZSBtZGVwCitjb21wb25lbnQgb2YgY2Nfc3RhdHVzLiAgSXQgZGVmYXVsdHMgdG8gaW50LgorCitUaGlzIG1hY3JvIGlzIG5vdCB1c2VkIG9uIG1hY2hpbmVzIHRoYXQgZG8gbm90IHVzZSBjYzAuCisqLworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgZmxhZ3M7CisgIHJ0eCB2YWx1ZTsKKyAgaW50IGZwZmxhZ3M7CisgIHJ0eCBmcHZhbHVlOworICBpbnQgY29uZF9leGVjX2NtcF9jbG9iYmVyZWQ7Cit9IGF2cjMyX3N0YXR1c19yZWc7CisKKworI2RlZmluZSBDQ19TVEFUVVNfTURFUCBhdnIzMl9zdGF0dXNfcmVnCisKKy8qCitBIEMgZXhwcmVzc2lvbiB0byBpbml0aWFsaXplIHRoZSBtZGVwIGZpZWxkIHRvICJlbXB0eSIuCitUaGUgZGVmYXVsdCBkZWZpbml0aW9uIGRvZXMgbm90aGluZywgc2luY2UgbW9zdCBtYWNoaW5lcyBkb24ndCB1c2UKK3RoZSBmaWVsZCBhbnl3YXkuICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGZpZWxkLCB5b3Ugc2hvdWxkIHByb2JhYmx5CitkZWZpbmUgdGhpcyBtYWNybyB0byBpbml0aWFsaXplIGl0LgorCitUaGlzIG1hY3JvIGlzIG5vdCB1c2VkIG9uIG1hY2hpbmVzIHRoYXQgZG8gbm90IHVzZSBjYzAuCisqLworCisjZGVmaW5lIENDX1NUQVRVU19NREVQX0lOSVQgIFwKKyAgIChjY19zdGF0dXMubWRlcC5mbGFncyA9IENDX05PTkUgLCBjY19zdGF0dXMubWRlcC5jb25kX2V4ZWNfY21wX2Nsb2JiZXJlZCA9IDAsIGNjX3N0YXR1cy5tZGVwLnZhbHVlID0gMCkKKworI2RlZmluZSBGUENDX1NUQVRVU19JTklUIFwKKyAgIChjY19zdGF0dXMubWRlcC5mcGZsYWdzID0gQ0NfTk9ORSAsIGNjX3N0YXR1cy5tZGVwLmZwdmFsdWUgPSAwKQorCisvKgorQSBDIGNvbXBvdW5kIHN0YXRlbWVudCB0byBzZXQgdGhlIGNvbXBvbmVudHMgb2YgY2Nfc3RhdHVzCithcHByb3ByaWF0ZWx5IGZvciBhbiBpbnNuIElOU04gd2hvc2UgYm9keSBpcyBFWFAuICBJdCBpcwordGhpcyBtYWNybydzIHJlc3BvbnNpYmlsaXR5IHRvIHJlY29nbml6ZSBpbnNucyB0aGF0IHNldCB0aGUgY29uZGl0aW9uCitjb2RlIGFzIGEgYnlwcm9kdWN0IG9mIG90aGVyIGFjdGl2aXR5IGFzIHdlbGwgYXMgdGhvc2UgdGhhdCBleHBsaWNpdGx5CitzZXQgKGNjMCkuCisKK1RoaXMgbWFjcm8gaXMgbm90IHVzZWQgb24gbWFjaGluZXMgdGhhdCBkbyBub3QgdXNlIGNjMC4KKworSWYgdGhlcmUgYXJlIGluc25zIHRoYXQgZG8gbm90IHNldCB0aGUgY29uZGl0aW9uIGNvZGUgYnV0IGRvIGFsdGVyCitvdGhlciBtYWNoaW5lIHJlZ2lzdGVycywgdGhpcyBtYWNybyBtdXN0IGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZXkKK2ludmFsaWRhdGUgdGhlIGV4cHJlc3Npb25zIHRoYXQgdGhlIGNvbmRpdGlvbiBjb2RlIGlzIHJlY29yZGVkIGFzCityZWZsZWN0aW5nLiAgRm9yIGV4YW1wbGUsIG9uIHRoZSA2ODAwMCwgaW5zbnMgdGhhdCBzdG9yZSBpbiBhZGRyZXNzCityZWdpc3RlcnMgZG8gbm90IHNldCB0aGUgY29uZGl0aW9uIGNvZGUsIHdoaWNoIG1lYW5zIHRoYXQgdXN1YWxseQorTk9USUNFX1VQREFURV9DQyBjYW4gbGVhdmUgY2Nfc3RhdHVzIHVuYWx0ZXJlZCBmb3Igc3VjaAoraW5zbnMuICBCdXQgc3VwcG9zZSB0aGF0IHRoZSBwcmV2aW91cyBpbnNuIHNldCB0aGUgY29uZGl0aW9uIGNvZGUKK2Jhc2VkIG9uIGxvY2F0aW9uICdhNEBAKDEwMiknIGFuZCB0aGUgY3VycmVudCBpbnNuIHN0b3JlcyBhIG5ldwordmFsdWUgaW4gJ2E0Jy4gIEFsdGhvdWdoIHRoZSBjb25kaXRpb24gY29kZSBpcyBub3QgY2hhbmdlZCBieQordGhpcywgaXQgd2lsbCBubyBsb25nZXIgYmUgdHJ1ZSB0aGF0IGl0IHJlZmxlY3RzIHRoZSBjb250ZW50cyBvZgorJ2E0QEAoMTAyKScuICBUaGVyZWZvcmUsIE5PVElDRV9VUERBVEVfQ0MgbXVzdCBhbHRlcgorY2Nfc3RhdHVzIGluIHRoaXMgY2FzZSB0byBzYXkgdGhhdCBub3RoaW5nIGlzIGtub3duIGFib3V0IHRoZQorY29uZGl0aW9uIGNvZGUgdmFsdWUuCisKK1RoZSBkZWZpbml0aW9uIG9mIE5PVElDRV9VUERBVEVfQ0MgbXVzdCBiZSBwcmVwYXJlZCB0byBkZWFsCit3aXRoIHRoZSByZXN1bHRzIG9mIHBlZXBob2xlIG9wdGltaXphdGlvbjogaW5zbnMgd2hvc2UgcGF0dGVybnMgYXJlCitwYXJhbGxlbCBSVFhzIGNvbnRhaW5pbmcgdmFyaW91cyByZWcsIG1lbSBvcgorY29uc3RhbnRzIHdoaWNoIGFyZSBqdXN0IHRoZSBvcGVyYW5kcy4gIFRoZSBSVEwgc3RydWN0dXJlIG9mIHRoZXNlCitpbnNucyBpcyBub3Qgc3VmZmljaWVudCB0byBpbmRpY2F0ZSB3aGF0IHRoZSBpbnNucyBhY3R1YWxseSBkby4gIFdoYXQKK05PVElDRV9VUERBVEVfQ0Mgc2hvdWxkIGRvIHdoZW4gaXQgc2VlcyBvbmUgaXMganVzdCB0byBydW4KK0NDX1NUQVRVU19JTklULgorCitBIHBvc3NpYmxlIGRlZmluaXRpb24gb2YgTk9USUNFX1VQREFURV9DQyBpcyB0byBjYWxsIGEgZnVuY3Rpb24KK3RoYXQgbG9va3MgYXQgYW4gYXR0cmlidXRlIChzZWUgSW5zbiBBdHRyaWJ1dGVzKSBuYW1lZCwgZm9yIGV4YW1wbGUsCisnY2MnLiAgVGhpcyBhdm9pZHMgaGF2aW5nIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHBhdHRlcm5zIGluCit0d28gcGxhY2VzLCB0aGUgJ21kJyBmaWxlIGFuZCBpbiBOT1RJQ0VfVVBEQVRFX0NDLgorKi8KKworI2RlZmluZSBOT1RJQ0VfVVBEQVRFX0NDKEVYUCwgSU5TTikgYXZyMzJfbm90aWNlX3VwZGF0ZV9jYyhFWFAsIElOU04pCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlc2NyaWJpbmcgUmVsYXRpdmUgQ29zdHMgb2YgT3BlcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoKK0EgQyBleHByZXNzaW9uIGZvciB0aGUgY29zdCBvZiBtb3ZpbmcgZGF0YSBvZiBtb2RlIE1PREUgZnJvbSBhCityZWdpc3RlciBpbiBjbGFzcyBGUk9NIHRvIG9uZSBpbiBjbGFzcyBUTy4gIFRoZSBjbGFzc2VzIGFyZQorZXhwcmVzc2VkIHVzaW5nIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgc3VjaCBhcyBHRU5FUkFMX1JFR1MuICBBCit2YWx1ZSBvZiAyIGlzIHRoZSBkZWZhdWx0OyBvdGhlciB2YWx1ZXMgYXJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvCit0aGF0LgorCitJdCBpcyBub3QgcmVxdWlyZWQgdGhhdCB0aGUgY29zdCBhbHdheXMgZXF1YWwgMiB3aGVuIEZST00gaXMgdGhlCitzYW1lIGFzIFRPOyBvbiBzb21lIG1hY2hpbmVzIGl0IGlzIGV4cGVuc2l2ZSB0byBtb3ZlIGJldHdlZW4KK3JlZ2lzdGVycyBpZiB0aGV5IGFyZSBub3QgZ2VuZXJhbCByZWdpc3RlcnMuCisKK0lmIHJlbG9hZCBzZWVzIGFuIGluc24gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBzZXQgYmV0d2VlbiB0d28KK2hhcmQgcmVnaXN0ZXJzLCBhbmQgaWYgUkVHSVNURVJfTU9WRV9DT1NUIGFwcGxpZWQgdG8gdGhlaXIKK2NsYXNzZXMgcmV0dXJucyBhIHZhbHVlIG9mIDIsIHJlbG9hZCBkb2VzIG5vdCBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUKK2NvbnN0cmFpbnRzIG9mIHRoZSBpbnNuIGFyZSBtZXQuICBTZXR0aW5nIGEgY29zdCBvZiBvdGhlciB0aGFuIDIgd2lsbAorYWxsb3cgcmVsb2FkIHRvIHZlcmlmeSB0aGF0IHRoZSBjb25zdHJhaW50cyBhcmUgbWV0LiAgWW91IHNob3VsZCBkbyB0aGlzCitpZiB0aGUgbW92bSBwYXR0ZXJuJ3MgY29uc3RyYWludHMgZG8gbm90IGFsbG93IHN1Y2ggY29weWluZy4KKyovCisjZGVmaW5lIFJFR0lTVEVSX01PVkVfQ09TVChNT0RFLCBGUk9NLCBUTykgXAorICAoKEdFVF9NT0RFX1NJWkUoTU9ERSkgPD0gNCkgPyAyOiAgICAgICAgIFwKKyAgIChHRVRfTU9ERV9TSVpFKE1PREUpIDw9IDgpID8gMzogICAgICAgICBcCisgICA0KQorCisvKgorQSBDIGV4cHJlc3Npb24gZm9yIHRoZSBjb3N0IG9mIG1vdmluZyBkYXRhIG9mIG1vZGUgTU9ERSBiZXR3ZWVuIGEKK3JlZ2lzdGVyIG9mIGNsYXNzIENMQVNTIGFuZCBtZW1vcnk7IElOIGlzIHplcm8gaWYgdGhlIHZhbHVlCitpcyB0byBiZSB3cml0dGVuIHRvIG1lbW9yeSwgbm9uemVybyBpZiBpdCBpcyB0byBiZSByZWFkIGluLiAgVGhpcyBjb3N0CitpcyByZWxhdGl2ZSB0byB0aG9zZSBpbiBSRUdJU1RFUl9NT1ZFX0NPU1QuICBJZiBtb3ZpbmcgYmV0d2VlbgorcmVnaXN0ZXJzIGFuZCBtZW1vcnkgaXMgbW9yZSBleHBlbnNpdmUgdGhhbiBiZXR3ZWVuIHR3byByZWdpc3RlcnMsIHlvdQorc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHRvIGV4cHJlc3MgdGhlIHJlbGF0aXZlIGNvc3QuCisKK0lmIHlvdSBkbyBub3QgZGVmaW5lIHRoaXMgbWFjcm8sIEdDQyB1c2VzIGEgZGVmYXVsdCBjb3N0IG9mIDQgcGx1cwordGhlIGNvc3Qgb2YgY29weWluZyB2aWEgYSBzZWNvbmRhcnkgcmVsb2FkIHJlZ2lzdGVyLCBpZiBvbmUgaXMKK25lZWRlZC4gIElmIHlvdXIgbWFjaGluZSByZXF1aXJlcyBhIHNlY29uZGFyeSByZWxvYWQgcmVnaXN0ZXIgdG8gY29weQorYmV0d2VlbiBtZW1vcnkgYW5kIGEgcmVnaXN0ZXIgb2YgQ0xBU1MgYnV0IHRoZSByZWxvYWQgbWVjaGFuaXNtIGlzCittb3JlIGNvbXBsZXggdGhhbiBjb3B5aW5nIHZpYSBhbiBpbnRlcm1lZGlhdGUsIGRlZmluZSB0aGlzIG1hY3JvIHRvCityZWZsZWN0IHRoZSBhY3R1YWwgY29zdCBvZiB0aGUgbW92ZS4KKworR0NDIGRlZmluZXMgdGhlIGZ1bmN0aW9uIG1lbW9yeV9tb3ZlX3NlY29uZGFyeV9jb3N0IGlmCitzZWNvbmRhcnkgcmVsb2FkcyBhcmUgbmVlZGVkLiAgSXQgY29tcHV0ZXMgdGhlIGNvc3RzIGR1ZSB0byBjb3B5aW5nIHZpYQorYSBzZWNvbmRhcnkgcmVnaXN0ZXIuICBJZiB5b3VyIG1hY2hpbmUgY29waWVzIGZyb20gbWVtb3J5IHVzaW5nIGEKK3NlY29uZGFyeSByZWdpc3RlciBpbiB0aGUgY29udmVudGlvbmFsIHdheSBidXQgdGhlIGRlZmF1bHQgYmFzZSB2YWx1ZSBvZgorNCBpcyBub3QgY29ycmVjdCBmb3IgeW91ciBtYWNoaW5lLCBkZWZpbmUgdGhpcyBtYWNybyB0byBhZGQgc29tZSBvdGhlcgordmFsdWUgdG8gdGhlIHJlc3VsdCBvZiB0aGF0IGZ1bmN0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0IGZ1bmN0aW9uCithcmUgdGhlIHNhbWUgYXMgdG8gdGhpcyBtYWNyby4KKyovCisvKgorICBNZW1vcnkgbW92ZXMgYXJlIGNvc3RseQorKi8KKyNkZWZpbmUgTUVNT1JZX01PVkVfQ09TVChNT0RFLCBDTEFTUywgSU4pICAgICAgICAgICAgXAorICAoKChJTikgPyAoKEdFVF9NT0RFX1NJWkUoTU9ERSkgPCA0KSA/IDQgOiAgICAgICAgICBcCisgICAgICAgICAgICAoR0VUX01PREVfU0laRShNT0RFKSA+IDgpID8gNiA6ICAgICAgICAgIFwKKyAgICAgICAgICAgIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogKChHRVRfTU9ERV9TSVpFKE1PREUpID4gOCkgPyA2IDogMykpKQorCisvKgorQSBDIGV4cHJlc3Npb24gZm9yIHRoZSBjb3N0IG9mIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgQSB2YWx1ZSBvZiAxIGlzCit0aGUgZGVmYXVsdDsgb3RoZXIgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGF0LgorKi8KKyAgLyogVHJ5IHRvIHVzZSBjb25kaXRpb25hbHMgYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworI2RlZmluZSBCUkFOQ0hfQ09TVCAoVEFSR0VUX0JSQU5DSF9QUkVEID8gMyA6IDQpCisKKy8qQSBDIGV4cHJlc3Npb24gZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSB2aWEgY29uZGl0aW9uYWwKKyAgZXhlY3V0aW9uIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGEgYnJhbmNoLiBBIHZhbHVlIG9mIEJSQU5DSF9DT1NUKzEgaXMgdGhlIGRlZmF1bHQKKyAgaWYgdGhlIG1hY2hpbmUgZG9lcyBub3QgdXNlIGNjMCwgYW5kIDEgaWYgaXQgZG9lcyB1c2UgY2MwLiovCisjZGVmaW5lIE1BWF9DT05ESVRJT05BTF9FWEVDVVRFIDQKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIGFzIGEgQyBleHByZXNzaW9uIHdoaWNoIGlzIG5vbnplcm8gaWYgYWNjZXNzaW5nIGxlc3MKK3RoYW4gYSB3b3JkIG9mIG1lbW9yeSAoaS5lLjogYSBjaGFyIG9yIGEgc2hvcnQpIGlzIG5vCitmYXN0ZXIgdGhhbiBhY2Nlc3NpbmcgYSB3b3JkIG9mIG1lbW9yeSwgaS5lLiwgaWYgc3VjaCBhY2Nlc3MKK3JlcXVpcmUgbW9yZSB0aGFuIG9uZSBpbnN0cnVjdGlvbiBvciBpZiB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIGNvc3QKK2JldHdlZW4gYnl0ZSBhbmQgKGFsaWduZWQpIHdvcmQgbG9hZHMuCisKK1doZW4gdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCwgdGhlIGNvbXBpbGVyIHdpbGwgYWNjZXNzIGEgZmllbGQgYnkKK2ZpbmRpbmcgdGhlIHNtYWxsZXN0IGNvbnRhaW5pbmcgb2JqZWN0OyB3aGVuIGl0IGlzIGRlZmluZWQsIGEgZnVsbHdvcmQKK2xvYWQgd2lsbCBiZSB1c2VkIGlmIGFsaWdubWVudCBwZXJtaXRzLiAgVW5sZXNzIGJ5dGVzIGFjY2Vzc2VzIGFyZQorZmFzdGVyIHRoYW4gd29yZCBhY2Nlc3NlcywgdXNpbmcgd29yZCBhY2Nlc3NlcyBpcyBwcmVmZXJhYmxlIHNpbmNlIGl0CittYXkgZWxpbWluYXRlIHN1YnNlcXVlbnQgbWVtb3J5IGFjY2VzcyBpZiBzdWJzZXF1ZW50IGFjY2Vzc2VzIG9jY3VyIHRvCitvdGhlciBmaWVsZHMgaW4gdGhlIHNhbWUgd29yZCBvZiB0aGUgc3RydWN0dXJlLCBidXQgdG8gZGlmZmVyZW50IGJ5dGVzLgorKi8KKyNkZWZpbmUgU0xPV19CWVRFX0FDQ0VTUyAxCisKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIGlmIGl0IGlzIGFzIGdvb2Qgb3IgYmV0dGVyIHRvIGNhbGwgYSBjb25zdGFudAorZnVuY3Rpb24gYWRkcmVzcyB0aGFuIHRvIGNhbGwgYW4gYWRkcmVzcyBrZXB0IGluIGEgcmVnaXN0ZXIuCisqLworI2RlZmluZSBOT19GVU5DVElPTl9DU0UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGp1c3RpbmcgdGhlIEluc3RydWN0aW9uIFNjaGVkdWxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERpdmlkaW5nIHRoZSBPdXRwdXQgaW50byBTZWN0aW9ucyAoVGV4dHMsIERhdGEsIC4uLikgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorQSBDIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcsIGluY2x1ZGluZyBzcGFjaW5nLCBjb250YWluaW5nIHRoZQorYXNzZW1ibGVyIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBwcmVjZWRlIGluc3RydWN0aW9ucyBhbmQgcmVhZC1vbmx5IGRhdGEuCitOb3JtYWxseSAiXHQudGV4dCIgaXMgcmlnaHQuCisqLworI2RlZmluZSBURVhUX1NFQ1RJT05fQVNNX09QICJcdC50ZXh0IgorLyoKK0EgQyBzdGF0ZW1lbnQgdGhhdCBzd2l0Y2hlcyB0byB0aGUgZGVmYXVsdCBzZWN0aW9uIGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb25zLgorTm9ybWFsbHkgdGhpcyBpcyBub3QgbmVlZGVkLCBhcyBzaW1wbHkgZGVmaW5pbmcgVEVYVF9TRUNUSU9OX0FTTV9PUAoraXMgZW5vdWdoLiAgVGhlIE1JUFMgcG9ydCB1c2VzIHRoaXMgdG8gc29ydCBhbGwgZnVuY3Rpb25zIGFmdGVyIGFsbCBkYXRhCitkZWNsYXJhdGlvbnMuCisqLworLyogI2RlZmluZSBURVhUX1NFQ1RJT04gKi8KKworLyoKK0EgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLCBpbmNsdWRpbmcgc3BhY2luZywgY29udGFpbmluZyB0aGUKK2Fzc2VtYmxlciBvcGVyYXRpb24gdG8gaWRlbnRpZnkgdGhlIGZvbGxvd2luZyBkYXRhIGFzIHdyaXRhYmxlIGluaXRpYWxpemVkCitkYXRhLiAgTm9ybWFsbHkgIlx0LmRhdGEiIGlzIHJpZ2h0LgorKi8KKyNkZWZpbmUgREFUQV9TRUNUSU9OX0FTTV9PUCAiXHQuZGF0YSIKKworLyoKK0lmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLCBpbmNsdWRpbmcgc3BhY2luZywKK2NvbnRhaW5pbmcgdGhlIGFzc2VtYmxlciBvcGVyYXRpb24gdG8gaWRlbnRpZnkgdGhlIGZvbGxvd2luZyBkYXRhIGFzCitzaGFyZWQgZGF0YS4gIElmIG5vdCBkZWZpbmVkLCBEQVRBX1NFQ1RJT05fQVNNX09QIHdpbGwgYmUgdXNlZC4KKyovCisKKy8qCitBIEMgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZywgaW5jbHVkaW5nIHNwYWNpbmcsIGNvbnRhaW5pbmcKK3RoZSBhc3NlbWJsZXIgb3BlcmF0aW9uIHRvIGlkZW50aWZ5IHRoZSBmb2xsb3dpbmcgZGF0YSBhcyByZWFkLW9ubHkKK2luaXRpYWxpemVkIGRhdGEuCisqLworI3VuZGVmIFJFQURPTkxZX0RBVEFfU0VDVElPTl9BU01fT1AKKyNkZWZpbmUgUkVBRE9OTFlfREFUQV9TRUNUSU9OX0FTTV9PUCBcCisgICgoVEFSR0VUX1VTRV9ST0RBVEFfU0VDVElPTikgPyAgXAorICAgIlx0LnNlY3Rpb25cdC5yb2RhdGEiIDogICAgICAgICAgICAgICAgXAorICAgVEVYVF9TRUNUSU9OX0FTTV9PUCApCisKKworLyoKK0lmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLCBpbmNsdWRpbmcgc3BhY2luZywKK2NvbnRhaW5pbmcgdGhlIGFzc2VtYmxlciBvcGVyYXRpb24gdG8gaWRlbnRpZnkgdGhlIGZvbGxvd2luZyBkYXRhIGFzCit1bmluaXRpYWxpemVkIGdsb2JhbCBkYXRhLiAgSWYgbm90IGRlZmluZWQsIGFuZCBuZWl0aGVyCitBU01fT1VUUFVUX0JTUyBub3IgQVNNX09VVFBVVF9BTElHTkVEX0JTUyBhcmUgZGVmaW5lZCwKK3VuaW5pdGlhbGl6ZWQgZ2xvYmFsIGRhdGEgd2lsbCBiZSBvdXRwdXQgaW4gdGhlIGRhdGEgc2VjdGlvbiBpZgorLWZuby1jb21tb24gaXMgcGFzc2VkLCBvdGhlcndpc2UgQVNNX09VVFBVVF9DT01NT04gd2lsbCBiZQordXNlZC4KKyovCisjZGVmaW5lIEJTU19TRUNUSU9OX0FTTV9PUAkiXHQuc2VjdGlvblx0LmJzcyIKKworLyoKK0lmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLCBpbmNsdWRpbmcgc3BhY2luZywKK2NvbnRhaW5pbmcgdGhlIGFzc2VtYmxlciBvcGVyYXRpb24gdG8gaWRlbnRpZnkgdGhlIGZvbGxvd2luZyBkYXRhIGFzCit1bmluaXRpYWxpemVkIGdsb2JhbCBzaGFyZWQgZGF0YS4gIElmIG5vdCBkZWZpbmVkLCBhbmQKK0JTU19TRUNUSU9OX0FTTV9PUCBpcywgdGhlIGxhdHRlciB3aWxsIGJlIHVzZWQuCisqLworLyojZGVmaW5lIFNIQVJFRF9CU1NfU0VDVElPTl9BU01fT1AgIlx0cnNlZ1x0c2hhcmVkX2Jic19zZWN0aW9uOmRhdGE6bm9yb290KDApXG4iKi8KKy8qCitJZiBkZWZpbmVkLCBhIEMgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZywgaW5jbHVkaW5nIHNwYWNpbmcsCitjb250YWluaW5nIHRoZSBhc3NlbWJsZXIgb3BlcmF0aW9uIHRvIGlkZW50aWZ5IHRoZSBmb2xsb3dpbmcgZGF0YSBhcworaW5pdGlhbGl6YXRpb24gY29kZS4gIElmIG5vdCBkZWZpbmVkLCBHQ0Mgd2lsbCBhc3N1bWUgc3VjaCBhIHNlY3Rpb24gZG9lcworbm90IGV4aXN0LgorKi8KKyN1bmRlZiAgSU5JVF9TRUNUSU9OX0FTTV9PUAorI2RlZmluZSBJTklUX1NFQ1RJT05fQVNNX09QICJcdC5zZWN0aW9uXHQuaW5pdCIKKworLyoKK0lmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLCBpbmNsdWRpbmcgc3BhY2luZywKK2NvbnRhaW5pbmcgdGhlIGFzc2VtYmxlciBvcGVyYXRpb24gdG8gaWRlbnRpZnkgdGhlIGZvbGxvd2luZyBkYXRhIGFzCitmaW5hbGl6YXRpb24gY29kZS4gIElmIG5vdCBkZWZpbmVkLCBHQ0Mgd2lsbCBhc3N1bWUgc3VjaCBhIHNlY3Rpb24gZG9lcworbm90IGV4aXN0LgorKi8KKyN1bmRlZiAgRklOSV9TRUNUSU9OX0FTTV9PUAorI2RlZmluZSBGSU5JX1NFQ1RJT05fQVNNX09QICJcdC5zZWN0aW9uXHQuZmluaSIKKworLyoKK0lmIGRlZmluZWQsIGFuIEFTTSBzdGF0ZW1lbnQgdGhhdCBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCBzZWN0aW9uCit2aWEgU0VDVElPTl9PUCwgY2FsbHMgRlVOQ1RJT04sIGFuZCBzd2l0Y2hlcyBiYWNrIHRvCit0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIGluIGNydHN0dWZmLmMgaWYKK0lOSVRfU0VDVElPTl9BU01fT1Agb3IgRklOSV9TRUNUSU9OX0FTTV9PUCB0byBjYWxscwordG8gaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBmdW5jdGlvbnMgZnJvbSB0aGUgaW5pdCBhbmQgZmluaQorc2VjdGlvbnMuICBCeSBkZWZhdWx0LCB0aGlzIG1hY3JvIHVzZXMgYSBzaW1wbGUgZnVuY3Rpb24gY2FsbC4gIFNvbWUKK3BvcnRzIG5lZWQgaGFuZC1jcmFmdGVkIGFzc2VtYmx5IGNvZGUgdG8gYXZvaWQgZGVwZW5kZW5jaWVzIG9uCityZWdpc3RlcnMgaW5pdGlhbGl6ZWQgaW4gdGhlIGZ1bmN0aW9uIHByb2xvZ3VlIG9yIHRvIGVuc3VyZSB0aGF0Citjb25zdGFudCBwb29scyBkb24ndCBlbmQgdXAgdG9vIGZhciB3YXkgaW4gdGhlIHRleHQgc2VjdGlvbi4KKyovCisjZGVmaW5lIENSVF9DQUxMX1NUQVRJQ19GVU5DVElPTihTRUNUSU9OX09QLCBGVU5DKSAgICAgIFwKKyAgIGFzbSAoIFNFQ1RJT05fT1AgIlxuIiBcCisgICAgICAgICAibWNhbGwgICByNlsiIFVTRVJfTEFCRUxfUFJFRklYICNGVU5DICJAZ290XVxuIiBcCisgICAgICAgICBURVhUX1NFQ1RJT05fQVNNX09QKTsKKworCisvKgorRGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgYW4gZXhwcmVzc2lvbiB3aXRoIGEgbm9uemVybyB2YWx1ZSBpZiBqdW1wCit0YWJsZXMgKGZvciB0YWJsZWp1bXAgaW5zbnMpIHNob3VsZCBiZSBvdXRwdXQgaW4gdGhlIHRleHQKK3NlY3Rpb24sIGFsb25nIHdpdGggdGhlIGFzc2VtYmxlciBpbnN0cnVjdGlvbnMuICBPdGhlcndpc2UsIHRoZQorcmVhZG9ubHkgZGF0YSBzZWN0aW9uIGlzIHVzZWQuCisKK1RoaXMgbWFjcm8gaXMgaXJyZWxldmFudCBpZiB0aGVyZSBpcyBubyBzZXBhcmF0ZSByZWFkb25seSBkYXRhIHNlY3Rpb24uCisqLworLyogUHV0IGp1bXAgdGFibGVzIGluIHRleHQgc2VjdGlvbiBpZiB3ZSBoYXZlIGNhY2hlcy4gT3RoZXJ3aXNlIGFzc3VtZSB0aGF0CisgICBsb2FkaW5nIGRhdGEgZnJvbSBjb2RlIG1lbW9yeSBpcyBzbG93LiAqLworI2RlZmluZSBKVU1QX1RBQkxFU19JTl9URVhUX1NFQ1RJT04gICAgXAorICAgIChUQVJHRVRfQ0FDSEVTID8gMSA6IDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWUjMyX0FMV0FZU19QSUMKKyNkZWZpbmUgQVZSMzJfQUxXQVlTX1BJQyAwCisjZW5kaWYKKworLyogR09UIGlzIHNldCB0byByNiAqLworI2RlZmluZSBQSUNfT0ZGU0VUX1RBQkxFX1JFR05VTSBJTlRFUk5BTF9SRUdOVU0oNikKKworLyoKK0EgQyBleHByZXNzaW9uIHRoYXQgaXMgbm9uemVybyBpZiBYIGlzIGEgbGVnaXRpbWF0ZSBpbW1lZGlhdGUKK29wZXJhbmQgb24gdGhlIHRhcmdldCBtYWNoaW5lIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLgorWW91IGNhbiBhc3N1bWUgdGhhdCBYIHNhdGlzZmllcyBDT05TVEFOVF9QLCBzbyB5b3UgbmVlZCBub3QKK2NoZWNrIHRoaXMuICBZb3UgY2FuIGFsc28gYXNzdW1lIGZsYWdfcGljIGlzIHRydWUsIHNvIHlvdSBuZWVkIG5vdAorY2hlY2sgaXQgZWl0aGVyLiAgWW91IG5lZWQgbm90IGRlZmluZSB0aGlzIG1hY3JvIGlmIGFsbCBjb25zdGFudHMKKyhpbmNsdWRpbmcgU1lNQk9MX1JFRikgY2FuIGJlIGltbWVkaWF0ZSBvcGVyYW5kcyB3aGVuIGdlbmVyYXRpbmcKK3Bvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuCisqLworLyogV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIGFueXRoaW5nIHRoYXQgY29udGFpbnMgYSBzeW1ib2wsCisgICBub3IgY2FuIHdlIGluZGlyZWN0IHZpYSB0aGUgY29uc3RhbnQgcG9vbC4gICovCisjZGVmaW5lIExFR0lUSU1BVEVfUElDX09QRVJBTkRfUChYKSBhdnIzMl9sZWdpdGltYXRlX3BpY19vcGVyYW5kX3AoWCkKKworCisvKiBXZSBuZWVkIHRvIGtub3cgd2hlbiB3ZSBhcmUgbWFraW5nIGEgY29uc3RhbnQgcG9vbDsgdGhpcyBkZXRlcm1pbmVzCisgICB3aGV0aGVyIGRhdGEgbmVlZHMgdG8gYmUgaW4gdGhlIEdPVCBvciBjYW4gYmUgcmVmZXJlbmNlZCB2aWEgYSBHT1QKKyAgIG9mZnNldC4gICovCitleHRlcm4gaW50IG1ha2luZ19jb25zdF90YWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5pbmcgdGhlIE91dHB1dCBBc3NlbWJsZXIgTGFuZ3VhZ2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorQSBDIHN0cmluZyBjb25zdGFudCBkZXNjcmliaW5nIGhvdyB0byBiZWdpbiBhIGNvbW1lbnQgaW4gdGhlIHRhcmdldAorYXNzZW1ibGVyIGxhbmd1YWdlLiAgVGhlIGNvbXBpbGVyIGFzc3VtZXMgdGhhdCB0aGUgY29tbWVudCB3aWxsIGVuZCBhdAordGhlIGVuZCBvZiB0aGUgbGluZS4KKyovCisjZGVmaW5lIEFTTV9DT01NRU5UX1NUQVJUICIjICIKKworLyoKK0EgQyBzdHJpbmcgY29uc3RhbnQgZm9yIHRleHQgdG8gYmUgb3V0cHV0IGJlZm9yZSBlYWNoIGFzbQorc3RhdGVtZW50IG9yIGdyb3VwIG9mIGNvbnNlY3V0aXZlIG9uZXMuICBOb3JtYWxseSB0aGlzIGlzCisiI0FQUCIsIHdoaWNoIGlzIGEgY29tbWVudCB0aGF0IGhhcyBubyBlZmZlY3Qgb24gbW9zdAorYXNzZW1ibGVycyBidXQgdGVsbHMgdGhlIEdOVSBhc3NlbWJsZXIgdGhhdCBpdCBtdXN0IGNoZWNrIHRoZSBsaW5lcwordGhhdCBmb2xsb3cgZm9yIGFsbCB2YWxpZCBhc3NlbWJsZXIgY29uc3RydWN0cy4KKyovCisjdW5kZWYgQVNNX0FQUF9PTgorI2RlZmluZSBBU01fQVBQX09OICIjQVBQXG4iCisKKy8qCitBIEMgc3RyaW5nIGNvbnN0YW50IGZvciB0ZXh0IHRvIGJlIG91dHB1dCBhZnRlciBlYWNoIGFzbQorc3RhdGVtZW50IG9yIGdyb3VwIG9mIGNvbnNlY3V0aXZlIG9uZXMuICBOb3JtYWxseSB0aGlzIGlzCisiI05PX0FQUCIsIHdoaWNoIHRlbGxzIHRoZSBHTlUgYXNzZW1ibGVyIHRvIHJlc3VtZSBtYWtpbmcgdGhlCit0aW1lLXNhdmluZyBhc3N1bXB0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3Igb3JkaW5hcnkgY29tcGlsZXIgb3V0cHV0LgorKi8KKyN1bmRlZiBBU01fQVBQX09GRgorI2RlZmluZSBBU01fQVBQX09GRiAiI05PX0FQUFxuIgorCisKKworI2RlZmluZSBGSUxFX0FTTV9PUCAJCSJcdC5maWxlXG4iCisjZGVmaW5lIElERU5UX0FTTV9PUCAJCSJcdC5pZGVudFx0IgorI2RlZmluZSBTRVRfQVNNX09QCQkiXHQuc2V0XHQiCisKKworLyoKKyAqIE91dHB1dCBhc3NlbWJseSBkaXJlY3RpdmVzIHRvIHN3aXRjaCB0byBzZWN0aW9uIG5hbWUuIFRoZSBzZWN0aW9uCisgKiBzaG91bGQgaGF2ZSBhdHRyaWJ1dGVzIGFzIHNwZWNpZmllZCBieSBmbGFncywgd2hpY2ggaXMgYSBiaXQgbWFzaworICogb2YgdGhlIFNFQ1RJT05fKiBmbGFncyBkZWZpbmVkIGluICdvdXRwdXQuaCcuIElmIGFsaWduIGlzIG5vbnplcm8sCisgKiBpdCBjb250YWlucyBhbiBhbGlnbm1lbnQgaW4gYnl0ZXMgdG8gYmUgdXNlZCBmb3IgdGhlIHNlY3Rpb24sCisgKiBvdGhlcndpc2Ugc29tZSB0YXJnZXQgZGVmYXVsdCBzaG91bGQgYmUgdXNlZC4gT25seSB0YXJnZXRzIHRoYXQKKyAqIG11c3Qgc3BlY2lmeSBhbiBhbGlnbm1lbnQgd2l0aGluIHRoZSBzZWN0aW9uIGRpcmVjdGl2ZSBuZWVkIHBheQorICogYXR0ZW50aW9uIHRvIGFsaWduIC0tIHdlIHdpbGwgc3RpbGwgdXNlIEFTTV9PVVRQVVRfQUxJR04uCisgKgorICogTk9URTogVGhpcyBvbmUgbXVzdCBub3QgYmUgbW92ZWQgdG8gYXZyMzIuYworICovCisjdW5kZWYgVEFSR0VUX0FTTV9OQU1FRF9TRUNUSU9OCisjZGVmaW5lIFRBUkdFVF9BU01fTkFNRURfU0VDVElPTiBkZWZhdWx0X2VsZl9hc21fbmFtZWRfc2VjdGlvbgorCisKKy8qCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIGFzIGEgQyBleHByZXNzaW9uLiAgWW91IHNob3VsZCBkZWZpbmUgdGhlCitleHByZXNzaW9uIHRvIGhhdmUgYSBub256ZXJvIHZhbHVlIGlmIEdDQyBzaG91bGQgb3V0cHV0IHRoZSBjb25zdGFudAorcG9vbCBmb3IgYSBmdW5jdGlvbiBiZWZvcmUgdGhlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbiwgb3IgYSB6ZXJvIHZhbHVlIGlmCitHQ0Mgc2hvdWxkIG91dHB1dCB0aGUgY29uc3RhbnQgcG9vbCBhZnRlciB0aGUgZnVuY3Rpb24uICBJZiB5b3UgZG8KK25vdCBkZWZpbmUgdGhpcyBtYWNybywgdGhlIHVzdWFsIGNhc2UsIEdDQyB3aWxsIG91dHB1dCB0aGUgY29uc3RhbnQKK3Bvb2wgYmVmb3JlIHRoZSBmdW5jdGlvbi4KKyovCisjZGVmaW5lIENPTlNUQU5UX1BPT0xfQkVGT1JFX0ZVTkNUSU9OIDAKKworCisvKgorRGVmaW5lIHRoaXMgbWFjcm8gYXMgYSBDIGV4cHJlc3Npb24gd2hpY2ggaXMgbm9uemVybyBpZiB0aGUgY29uc3RhbnQKK0VYUCwgb2YgdHlwZSB0cmVlLCBzaG91bGQgYmUgb3V0cHV0IGFmdGVyIHRoZSBjb2RlIGZvciBhCitmdW5jdGlvbi4gIFRoZSBjb21waWxlciB3aWxsIG5vcm1hbGx5IG91dHB1dCBhbGwgY29uc3RhbnRzIGJlZm9yZSB0aGUKK2Z1bmN0aW9uOyB5b3UgbmVlZCBub3QgZGVmaW5lIHRoaXMgbWFjcm8gaWYgdGhpcyBpcyBPSy4KKyovCisjZGVmaW5lIENPTlNUQU5UX0FGVEVSX0ZVTkNUSU9OX1AoRVhQKSAxCisKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIGFzIGEgQyBleHByZXNzaW9uIHdoaWNoIGlzIG5vbnplcm8gaWYgQyBpcwordXNlZCBhcyBhIGxvZ2ljYWwgbGluZSBzZXBhcmF0b3IgYnkgdGhlIGFzc2VtYmxlci4KKworSWYgeW91IGRvIG5vdCBkZWZpbmUgdGhpcyBtYWNybywgdGhlIGRlZmF1bHQgaXMgdGhhdCBvbmx5Cit0aGUgY2hhcmFjdGVyICc7JyBpcyB0cmVhdGVkIGFzIGEgbG9naWNhbCBsaW5lIHNlcGFyYXRvci4KKyovCisjZGVmaW5lIElTX0FTTV9MT0dJQ0FMX0xJTkVfU0VQQVJBVE9SKEMpICgoQykgPT0gJ1xuJykKKworCisvKiogT3V0cHV0IG9mIFVuaW5pdGlhbGl6ZWQgVmFyaWFibGVzICoqLworCisvKgorQSBDIHN0YXRlbWVudCAoc2FucyBzZW1pY29sb24pIHRvIG91dHB1dCB0byB0aGUgc3RkaW8gc3RyZWFtCitTVFJFQU0gdGhlIGFzc2VtYmxlciBkZWZpbml0aW9uIG9mIGEgY29tbW9uLWxhYmVsIG5hbWVkCitOQU1FIHdob3NlIHNpemUgaXMgU0laRSBieXRlcy4gIFRoZSB2YXJpYWJsZSBST1VOREVECitpcyB0aGUgc2l6ZSByb3VuZGVkIHVwIHRvIHdoYXRldmVyIGFsaWdubWVudCB0aGUgY2FsbGVyIHdhbnRzLgorCitVc2UgdGhlIGV4cHJlc3Npb24gYXNzZW1ibGVfbmFtZShTVFJFQU0sIE5BTUUpIHRvCitvdXRwdXQgdGhlIG5hbWUgaXRzZWxmOyBiZWZvcmUgYW5kIGFmdGVyIHRoYXQsIG91dHB1dCB0aGUgYWRkaXRpb25hbAorYXNzZW1ibGVyIHN5bnRheCBmb3IgZGVmaW5pbmcgdGhlIG5hbWUsIGFuZCBhIG5ld2xpbmUuCisKK1RoaXMgbWFjcm8gY29udHJvbHMgaG93IHRoZSBhc3NlbWJsZXIgZGVmaW5pdGlvbnMgb2YgdW5pbml0aWFsaXplZAorY29tbW9uIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG91dHB1dC4KKyovCisvKgorI2RlZmluZSBBU01fT1VUUFVUX0NPTU1PTihTVFJFQU0sIE5BTUUsIFNJWkUsIFJPVU5ERUQpIFwKKyAgYXZyMzJfYXNtX291dHB1dF9jb21tb24oU1RSRUFNLCBOQU1FLCBTSVpFLCBST1VOREVEKQorKi8KKworI2RlZmluZSBBU01fT1VUUFVUX0NPTU1PTihGSUxFLCBOQU1FLCBTSVpFLCBST1VOREVEKQlcCisgIGRvCQkJCQkJCVwKKyAgICB7CQkJCQkJCVwKKyAgICAgIGZwdXRzICgiXHQuY29tbSAiLCAoRklMRSkpOwkJCVwKKyAgICAgIGFzc2VtYmxlX25hbWUgKChGSUxFKSwgKE5BTUUpKTsJCQlcCisgICAgICBmcHJpbnRmICgoRklMRSksICIsJWRcbiIsIChTSVpFKSk7CQlcCisgICAgfQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisvKgorICogTGlrZSBBU01fT1VUUFVUX0JTUyBleGNlcHQgdGFrZXMgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBhcyBhCisgKiBzZXBhcmF0ZSwgZXhwbGljaXQgYXJndW1lbnQuICBJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IGlzIHVzZWQKKyAqIGluIHBsYWNlIG9mIEFTTV9PVVRQVVRfQlNTLCBhbmQgZ2l2ZXMgeW91IG1vcmUgZmxleGliaWxpdHkgaW4KKyAqIGhhbmRsaW5nIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIHZhcmlhYmxlLiAgVGhlIGFsaWdubWVudCBpcworICogc3BlY2lmaWVkIGFzIHRoZSBudW1iZXIgb2YgYml0cy4KKyAqCisgKiBUcnkgdG8gdXNlIGZ1bmN0aW9uIGFzbV9vdXRwdXRfYWxpZ25lZF9ic3MgZGVmaW5lZCBpbiBmaWxlIHZhcmFzbS5jCisgKiB3aGVuIGRlZmluaW5nIHRoaXMgbWFjcm8uCisgKi8KKyNkZWZpbmUgQVNNX09VVFBVVF9BTElHTkVEX0JTUyhTVFJFQU0sIERFQ0wsIE5BTUUsIFNJWkUsIEFMSUdOTUVOVCkgXAorICBhc21fb3V0cHV0X2FsaWduZWRfYnNzIChTVFJFQU0sIERFQ0wsIE5BTUUsIFNJWkUsIEFMSUdOTUVOVCkKKworLyoKK0EgQyBzdGF0ZW1lbnQgKHNhbnMgc2VtaWNvbG9uKSB0byBvdXRwdXQgdG8gdGhlIHN0ZGlvIHN0cmVhbQorU1RSRUFNIHRoZSBhc3NlbWJsZXIgZGVmaW5pdGlvbiBvZiBhIGxvY2FsLWNvbW1vbi1sYWJlbCBuYW1lZAorTkFNRSB3aG9zZSBzaXplIGlzIFNJWkUgYnl0ZXMuICBUaGUgdmFyaWFibGUgUk9VTkRFRAoraXMgdGhlIHNpemUgcm91bmRlZCB1cCB0byB3aGF0ZXZlciBhbGlnbm1lbnQgdGhlIGNhbGxlciB3YW50cy4KKworVXNlIHRoZSBleHByZXNzaW9uIGFzc2VtYmxlX25hbWUoU1RSRUFNLCBOQU1FKSB0bworb3V0cHV0IHRoZSBuYW1lIGl0c2VsZjsgYmVmb3JlIGFuZCBhZnRlciB0aGF0LCBvdXRwdXQgdGhlIGFkZGl0aW9uYWwKK2Fzc2VtYmxlciBzeW50YXggZm9yIGRlZmluaW5nIHRoZSBuYW1lLCBhbmQgYSBuZXdsaW5lLgorCitUaGlzIG1hY3JvIGNvbnRyb2xzIGhvdyB0aGUgYXNzZW1ibGVyIGRlZmluaXRpb25zIG9mIHVuaW5pdGlhbGl6ZWQKK3N0YXRpYyB2YXJpYWJsZXMgYXJlIG91dHB1dC4KKyovCisjZGVmaW5lIEFTTV9PVVRQVVRfTE9DQUwoRklMRSwgTkFNRSwgU0laRSwgUk9VTkRFRCkJXAorICBkbwkJCQkJCQlcCisgICAgewkJCQkJCQlcCisgICAgICBmcHV0cyAoIlx0Lmxjb21tICIsIChGSUxFKSk7CQkJXAorICAgICAgYXNzZW1ibGVfbmFtZSAoKEZJTEUpLCAoTkFNRSkpOwkJCVwKKyAgICAgIGZwcmludGYgKChGSUxFKSwgIiwlZCwgJWRcbiIsIChTSVpFKSwgMik7CQlcCisgICAgfQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisKKy8qCitBIEMgc3RhdGVtZW50IChzYW5zIHNlbWljb2xvbikgdG8gb3V0cHV0IHRvIHRoZSBzdGRpbyBzdHJlYW0KK1NUUkVBTSB0aGUgYXNzZW1ibGVyIGRlZmluaXRpb24gb2YgYSBsYWJlbCBuYW1lZCBOQU1FLgorVXNlIHRoZSBleHByZXNzaW9uIGFzc2VtYmxlX25hbWUoU1RSRUFNLCBOQU1FKSB0bworb3V0cHV0IHRoZSBuYW1lIGl0c2VsZjsgYmVmb3JlIGFuZCBhZnRlciB0aGF0LCBvdXRwdXQgdGhlIGFkZGl0aW9uYWwKK2Fzc2VtYmxlciBzeW50YXggZm9yIGRlZmluaW5nIHRoZSBuYW1lLCBhbmQgYSBuZXdsaW5lLgorKi8KKyNkZWZpbmUgQVNNX09VVFBVVF9MQUJFTChTVFJFQU0sIE5BTUUpIGF2cjMyX2FzbV9vdXRwdXRfbGFiZWwoU1RSRUFNLCBOQU1FKQorCisvKiBBIEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFwcHJvcHJpYXRlIGFzc2VtYmxlciBkaXJlY3RpdmUgdG8KKyAqIHNwZWNpZnkgdGhlIHNpemUgb2YgYSBzeW1ib2wsIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4gT24gc3lzdGVtcworICogdGhhdCB1c2UgRUxGLCB0aGUgZGVmYXVsdCAoaW4gJ2NvbmZpZy9lbGZvcy5oJykgaXMgJyJcdC5zaXplXHQiJzsKKyAqIG9uIG90aGVyIHN5c3RlbXMsIHRoZSBkZWZhdWx0IGlzIG5vdCB0byBkZWZpbmUgdGhpcyBtYWNyby4KKyAqCisgKiBEZWZpbmUgdGhpcyBtYWNybyBvbmx5IGlmIGl0IGlzIGNvcnJlY3QgdG8gdXNlIHRoZSBkZWZhdWx0CisgKiBkZWZpbml0aW9ucyBvZiBBU01fIE9VVFBVVF9TSVpFX0RJUkVDVElWRSBhbmQKKyAqIEFTTV9PVVRQVVRfTUVBU1VSRURfU0laRSBmb3IgeW91ciBzeXN0ZW0uIElmIHlvdSBuZWVkIHlvdXIgb3duCisgKiBjdXN0b20gZGVmaW5pdGlvbnMgb2YgdGhvc2UgbWFjcm9zLCBvciBpZiB5b3UgZG8gbm90IG5lZWQgZXhwbGljaXQKKyAqIHN5bWJvbCBzaXplcyBhdCBhbGwsIGRvIG5vdCBkZWZpbmUgdGhpcyBtYWNyby4KKyAqLworI2RlZmluZSBTSVpFX0FTTV9PUCAiXHQuc2l6ZVx0IgorCisKKy8qCitBIEMgc3RhdGVtZW50IChzYW5zIHNlbWljb2xvbikgdG8gb3V0cHV0IHRvIHRoZSBzdGRpbyBzdHJlYW0KK1NUUkVBTSBzb21lIGNvbW1hbmRzIHRoYXQgd2lsbCBtYWtlIHRoZSBsYWJlbCBOQU1FIGdsb2JhbDsKK3RoYXQgaXMsIGF2YWlsYWJsZSBmb3IgcmVmZXJlbmNlIGZyb20gb3RoZXIgZmlsZXMuICBVc2UgdGhlIGV4cHJlc3Npb24KK2Fzc2VtYmxlX25hbWUoU1RSRUFNLCBOQU1FKSB0byBvdXRwdXQgdGhlIG5hbWUKK2l0c2VsZjsgYmVmb3JlIGFuZCBhZnRlciB0aGF0LCBvdXRwdXQgdGhlIGFkZGl0aW9uYWwgYXNzZW1ibGVyIHN5bnRheAorZm9yIG1ha2luZyB0aGF0IG5hbWUgZ2xvYmFsLCBhbmQgYSBuZXdsaW5lLgorKi8KKyNkZWZpbmUgR0xPQkFMX0FTTV9PUCAiXHQuZ2xvYmxcdCIKKworCisKKy8qCitBIEMgZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHdlYWsgc3ltYm9scy4KKworSWYgeW91IGRvbid0IGRlZmluZSB0aGlzIG1hY3JvLCBkZWZhdWx0cy5oIHByb3ZpZGVzIGEgZGVmYXVsdAorZGVmaW5pdGlvbi4gIElmIGVpdGhlciBBU01fV0VBS0VOX0xBQkVMIG9yIEFTTV9XRUFLRU5fREVDTAoraXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBpcyAnMSc7IG90aGVyd2lzZSwgaXQgaXMKKycwJy4gIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgd2VhayBzeW1ib2wgc3VwcG9ydAord2l0aCBhIGNvbXBpbGVyIGZsYWcgc3VjaCBhcyAtbWVsZi4KKyovCisjZGVmaW5lIFNVUFBPUlRTX1dFQUsgMQorCisvKgorQSBDIHN0YXRlbWVudCAoc2FucyBzZW1pY29sb24pIHRvIG91dHB1dCB0byB0aGUgc3RkaW8gc3RyZWFtCitTVFJFQU0gYSByZWZlcmVuY2UgaW4gYXNzZW1ibGVyIHN5bnRheCB0byBhIGxhYmVsIG5hbWVkCitOQU1FLiAgVGhpcyBzaG91bGQgYWRkICdfJyB0byB0aGUgZnJvbnQgb2YgdGhlIG5hbWUsIGlmIHRoYXQKK2lzIGN1c3RvbWFyeSBvbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sIGFzIGl0IGlzIGluIG1vc3QgQmVya2VsZXkgVW5peAorc3lzdGVtcy4gIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBhc3NlbWJsZV9uYW1lLgorKi8KKyNkZWZpbmUgQVNNX09VVFBVVF9MQUJFTFJFRihTVFJFQU0sIE5BTUUpIFwKKyAgYXZyMzJfYXNtX291dHB1dF9sYWJlbHJlZihTVFJFQU0sIE5BTUUpCisKKworCisvKgorQSBDIGV4cHJlc3Npb24gdG8gYXNzaWduIHRvIE9VVFZBUiAod2hpY2ggaXMgYSB2YXJpYWJsZSBvZiB0eXBlCitjaGFyICopIGEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZyBtYWRlIGZyb20gdGhlIHN0cmluZworTkFNRSBhbmQgdGhlIG51bWJlciBOVU1CRVIsIHdpdGggc29tZSBzdWl0YWJsZSBwdW5jdHVhdGlvbgorYWRkZWQuICBVc2UgYWxsb2NhIHRvIGdldCBzcGFjZSBmb3IgdGhlIHN0cmluZy4KKworVGhlIHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gQVNNX09VVFBVVF9MQUJFTFJFRiB0bworcHJvZHVjZSBhbiBhc3NlbWJsZXIgbGFiZWwgZm9yIGFuIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBuYW1lIGlzCitOQU1FLiAgVGhlcmVmb3JlLCB0aGUgc3RyaW5nIG11c3QgYmUgc3VjaCBhcyB0byByZXN1bHQgaW4gdmFsaWQKK2Fzc2VtYmxlciBjb2RlLiAgVGhlIGFyZ3VtZW50IE5VTUJFUiBpcyBkaWZmZXJlbnQgZWFjaCB0aW1lIHRoaXMKK21hY3JvIGlzIGV4ZWN1dGVkOyBpdCBwcmV2ZW50cyBjb25mbGljdHMgYmV0d2VlbiBzaW1pbGFybHktbmFtZWQKK2ludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMgaW4gZGlmZmVyZW50IHNjb3Blcy4KKworSWRlYWxseSB0aGlzIHN0cmluZyBzaG91bGQgbm90IGJlIGEgdmFsaWQgQyBpZGVudGlmaWVyLCB0byBwcmV2ZW50IGFueQorY29uZmxpY3Qgd2l0aCB0aGUgdXNlcidzIG93biBzeW1ib2xzLiAgTW9zdCBhc3NlbWJsZXJzIGFsbG93IHBlcmlvZHMKK29yIHBlcmNlbnQgc2lnbnMgaW4gYXNzZW1ibGVyIHN5bWJvbHM7IHB1dHRpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZXNlCitiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgbnVtYmVyIHdpbGwgc3VmZmljZS4KKyovCisjZGVmaW5lIEFTTV9GT1JNQVRfUFJJVkFURV9OQU1FKE9VVFZBUiwgTkFNRSwgTlVNQkVSKQkJXAorICBkbwkJCQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIChPVVRWQVIpID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKChOQU1FKSkgKyAxMCk7CVwKKyAgICAgIHNwcmludGYgKChPVVRWQVIpLCAiJXMuJWQiLCAoTkFNRSksIChOVU1CRVIpKTsJCVwKKyAgICB9CQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisKKy8qKiBNYWNyb3MgQ29udHJvbGxpbmcgSW5pdGlhbGl6YXRpb24gUm91dGluZXMgKiovCisKKworLyoKK0lmIGRlZmluZWQsIG1haW4gd2lsbCBub3QgY2FsbCBfX21haW4gYXMgZGVzY3JpYmVkIGFib3ZlLgorVGhpcyBtYWNybyBzaG91bGQgYmUgZGVmaW5lZCBmb3Igc3lzdGVtcyB0aGF0IGNvbnRyb2wgc3RhcnQtdXAgY29kZQorb24gYSBzeW1ib2wtYnktc3ltYm9sIGJhc2lzLCBzdWNoIGFzIE9TRi8xLCBhbmQgc2hvdWxkIG5vdAorYmUgZGVmaW5lZCBleHBsaWNpdGx5IGZvciBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBJTklUX1NFQ1RJT05fQVNNX09QLgorKi8KKy8qCisgIF9fbWFpbiBpcyBub3QgZGVmaW5lZCB3aGVuIGRlYnVnZ2luZy4KKyovCisjZGVmaW5lIEhBU19JTklUX1NFQ1RJT04KKworCisvKiogT3V0cHV0IG9mIEFzc2VtYmxlciBJbnN0cnVjdGlvbnMgKiovCisKKy8qCitBIEMgaW5pdGlhbGl6ZXIgY29udGFpbmluZyB0aGUgYXNzZW1ibGVyJ3MgbmFtZXMgZm9yIHRoZSBtYWNoaW5lCityZWdpc3RlcnMsIGVhY2ggb25lIGFzIGEgQyBzdHJpbmcgY29uc3RhbnQuICBUaGlzIGlzIHdoYXQgdHJhbnNsYXRlcworcmVnaXN0ZXIgbnVtYmVycyBpbiB0aGUgY29tcGlsZXIgaW50byBhc3NlbWJsZXIgbGFuZ3VhZ2UuCisqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTCVwKK3sJCQlcCisgICJwYyIsICAibHIiLAkJXAorICAic3AiLCAgInIxMiIsCQlcCisgICJyMTEiLCAicjEwIiwJCVwKKyAgInI5IiwgICJyOCIsCQlcCisgICJyNyIsICAicjYiLAkJXAorICAicjUiLCAgInI0IiwJCVwKKyAgInIzIiwgICJyMiIsCQlcCisgICJyMSIsICAicjAiLAkJXAorICAiZjE1IiwiZjE0IiwJCVwKKyAgImYxMyIsImYxMiIsCQlcCisgICJmMTEiLCJmMTAiLAkJXAorICAiZjkiLCAiZjgiLAkJXAorICAiZjciLCAiZjYiLAkJXAorICAiZjUiLCAiZjQiLAkJXAorICAiZjMiLCAiZjIiLAkJXAorICAiZjEiLCAiZjAiCQlcCit9CisKKy8qCitBIEMgY29tcG91bmQgc3RhdGVtZW50IHRvIG91dHB1dCB0byBzdGRpbyBzdHJlYW0gU1RSRUFNIHRoZQorYXNzZW1ibGVyIHN5bnRheCBmb3IgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCBYLiAgWCBpcyBhbgorUlRMIGV4cHJlc3Npb24uCisKK0NPREUgaXMgYSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9mIHNldmVyYWwgd2F5cworb2YgcHJpbnRpbmcgdGhlIG9wZXJhbmQuICBJdCBpcyB1c2VkIHdoZW4gaWRlbnRpY2FsIG9wZXJhbmRzIG11c3QgYmUKK3ByaW50ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LiAgQ09ERSBjb21lcyBmcm9tCit0aGUgJyUnIHNwZWNpZmljYXRpb24gdGhhdCB3YXMgdXNlZCB0byByZXF1ZXN0IHByaW50aW5nIG9mIHRoZQorb3BlcmFuZC4gIElmIHRoZSBzcGVjaWZpY2F0aW9uIHdhcyBqdXN0ICclZGlnaXQnIHRoZW4KK0NPREUgaXMgMDsgaWYgdGhlIHNwZWNpZmljYXRpb24gd2FzICclbHRyIGRpZ2l0JwordGhlbiBDT0RFIGlzIHRoZSBBU0NJSSBjb2RlIGZvciBsdHIuCisKK0lmIFggaXMgYSByZWdpc3RlciwgdGhpcyBtYWNybyBzaG91bGQgcHJpbnQgdGhlIHJlZ2lzdGVyJ3MgbmFtZS4KK1RoZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gYW4gYXJyYXkgcmVnX25hbWVzIHdob3NlIHR5cGUgaXMKK2NoYXIgKltdLiAgcmVnX25hbWVzIGlzIGluaXRpYWxpemVkIGZyb20gUkVHSVNURVJfTkFNRVMuCisKK1doZW4gdGhlIG1hY2hpbmUgZGVzY3JpcHRpb24gaGFzIGEgc3BlY2lmaWNhdGlvbiAnJXB1bmN0JworKGEgJyUnIGZvbGxvd2VkIGJ5IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyKSwgdGhpcyBtYWNybyBpcyBjYWxsZWQKK3dpdGggYSBudWxsIHBvaW50ZXIgZm9yIFggYW5kIHRoZSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgZm9yCitDT0RFLgorKi8KKyNkZWZpbmUgUFJJTlRfT1BFUkFORChTVFJFQU0sIFgsIENPREUpIGF2cjMyX3ByaW50X29wZXJhbmQoU1RSRUFNLCBYLCBDT0RFKQorCisvKiBBIEMgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkIGp1c3QgcHJpb3IgdG8gdGhlIG91dHB1dCBvZgorICAgYXNzZW1ibGVyIGNvZGUgZm9yIElOU04sIHRvIG1vZGlmeSB0aGUgZXh0cmFjdGVkIG9wZXJhbmRzIHNvCisgICB0aGV5IHdpbGwgYmUgb3V0cHV0IGRpZmZlcmVudGx5LgorCisgICBIZXJlIHRoZSBhcmd1bWVudCBPUFZFQyBpcyB0aGUgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG9wZXJhbmRzCisgICBleHRyYWN0ZWQgZnJvbSBJTlNOLCBhbmQgTk9QRVJBTkRTIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YKKyAgIHRoZSB2ZWN0b3Igd2hpY2ggY29udGFpbiBtZWFuaW5nZnVsIGRhdGEgZm9yIHRoaXMgaW5zbi4KKyAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgd2hhdCB3aWxsIGJlIHVzZWQgdG8gY29udmVydCB0aGUgaW5zbgorICAgdGVtcGxhdGUgaW50byBhc3NlbWJsZXIgY29kZSwgc28geW91IGNhbiBjaGFuZ2UgdGhlIGFzc2VtYmxlciBvdXRwdXQKKyAgIGJ5IGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUgdmVjdG9yLiAgKi8KKyNkZWZpbmUgRklOQUxfUFJFU0NBTl9JTlNOKElOU04sIE9QVkVDLCBOT1BFUkFORFMpIFwKKyAgYXZyMzJfZmluYWxfcHJlc2Nhbl9pbnNuICgoSU5TTiksIChPUFZFQyksIChOT1BFUkFORFMpKQorCisvKgorQSBDIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvIHRydWUgaWYgQ09ERSBpcyBhIHZhbGlkCitwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgZm9yIHVzZSBpbiB0aGUgUFJJTlRfT1BFUkFORCBtYWNyby4gIElmCitQUklOVF9PUEVSQU5EX1BVTkNUX1ZBTElEX1AgaXMgbm90IGRlZmluZWQsIGl0IG1lYW5zIHRoYXQgbm8KK3B1bmN0dWF0aW9uIGNoYXJhY3RlcnMgKGV4Y2VwdCBmb3IgdGhlIHN0YW5kYXJkIG9uZSwgJyUnKSBhcmUgdXNlZAoraW4gdGhpcyB3YXkuCisqLworI2RlZmluZSBQUklOVF9PUEVSQU5EX1BVTkNUX1ZBTElEX1AoQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoQ09ERSkgPT0gJz8nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKENPREUpID09ICchJykpCisKKy8qCitBIEMgY29tcG91bmQgc3RhdGVtZW50IHRvIG91dHB1dCB0byBzdGRpbyBzdHJlYW0gU1RSRUFNIHRoZQorYXNzZW1ibGVyIHN5bnRheCBmb3IgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCB0aGF0IGlzIGEgbWVtb3J5IHJlZmVyZW5jZQord2hvc2UgYWRkcmVzcyBpcyBYLiAgWCBpcyBhbiBSVEwgZXhwcmVzc2lvbi4KKworT24gc29tZSBtYWNoaW5lcywgdGhlIHN5bnRheCBmb3IgYSBzeW1ib2xpYyBhZGRyZXNzIGRlcGVuZHMgb24gdGhlCitzZWN0aW9uIHRoYXQgdGhlIGFkZHJlc3MgcmVmZXJzIHRvLiAgT24gdGhlc2UgbWFjaGluZXMsIGRlZmluZSB0aGUgbWFjcm8KK0VOQ09ERV9TRUNUSU9OX0lORk8gdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlCitzeW1ib2xfcmVmLCBhbmQgdGhlbiBjaGVjayBmb3IgaXQgaGVyZS4gIChzZWUgQXNzZW1ibGVyIEZvcm1hdC4pCisqLworI2RlZmluZSBQUklOVF9PUEVSQU5EX0FERFJFU1MoU1RSRUFNLCBYKSBhdnIzMl9wcmludF9vcGVyYW5kX2FkZHJlc3MoU1RSRUFNLCBYKQorCisKKy8qKiBPdXRwdXQgb2YgRGlzcGF0Y2ggVGFibGVzICoqLworCisvKgorICogQSBDIHN0YXRlbWVudCB0byBvdXRwdXQgdG8gdGhlIHN0ZGlvIHN0cmVhbSBzdHJlYW0gYW4gYXNzZW1ibGVyCisgKiBwc2V1ZG8taW5zdHJ1Y3Rpb24gdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvCisgKiBsYWJlbHMuIHZhbHVlIGFuZCByZWwgYXJlIHRoZSBudW1iZXJzIG9mIHR3byBpbnRlcm5hbCBsYWJlbHMuIFRoZQorICogZGVmaW5pdGlvbnMgb2YgdGhlc2UgbGFiZWxzIGFyZSBvdXRwdXQgdXNpbmcKKyAqICgqdGFyZ2V0bS5hc21fb3V0LmludGVybmFsX2xhYmVsKSwgYW5kIHRoZXkgbXVzdCBiZSBwcmludGVkIGluIHRoZQorICogc2FtZSB3YXkgaGVyZS4gRm9yIGV4YW1wbGUsCisgKgorICogICAgICAgICBmcHJpbnRmIChzdHJlYW0sICJcdC53b3JkIEwlZC1MJWRcbiIsCisgKiAgICAgICAgICAgICAgICAgIHZhbHVlLCByZWwpCisgKgorICogWW91IG11c3QgcHJvdmlkZSB0aGlzIG1hY3JvIG9uIG1hY2hpbmVzIHdoZXJlIHRoZSBhZGRyZXNzZXMgaW4gYQorICogZGlzcGF0Y2ggdGFibGUgYXJlIHJlbGF0aXZlIHRvIHRoZSB0YWJsZSdzIG93biBhZGRyZXNzLiBJZiBkZWZpbmVkLAorICogR0NDIHdpbGwgYWxzbyB1c2UgdGhpcyBtYWNybyBvbiBhbGwgbWFjaGluZXMgd2hlbiBwcm9kdWNpbmcKKyAqIFBJQy4gYm9keSBpcyB0aGUgYm9keSBvZiB0aGUgQUREUl9ESUZGX1ZFQzsgaXQgaXMgcHJvdmlkZWQgc28gdGhhdAorICogdGhlIG1vZGUgYW5kIGZsYWdzIGNhbiBiZSByZWFkLgorICovCisjZGVmaW5lIEFTTV9PVVRQVVRfQUREUl9ESUZGX0VMVChTVFJFQU0sIEJPRFksIFZBTFVFLCBSRUwpCSAgICBcCisgICAgZnByaW50ZihTVFJFQU0sICJcdGJyYWxcdCVzTCVkXG4iLCBMT0NBTF9MQUJFTF9QUkVGSVgsIFZBTFVFKQorCisvKgorVGhpcyBtYWNybyBzaG91bGQgYmUgcHJvdmlkZWQgb24gbWFjaGluZXMgd2hlcmUgdGhlIGFkZHJlc3NlcworaW4gYSBkaXNwYXRjaCB0YWJsZSBhcmUgYWJzb2x1dGUuCisKK1RoZSBkZWZpbml0aW9uIHNob3VsZCBiZSBhIEMgc3RhdGVtZW50IHRvIG91dHB1dCB0byB0aGUgc3RkaW8gc3RyZWFtCitTVFJFQU0gYW4gYXNzZW1ibGVyIHBzZXVkby1pbnN0cnVjdGlvbiB0byBnZW5lcmF0ZSBhIHJlZmVyZW5jZSB0bworYSBsYWJlbC4gIFZBTFVFIGlzIHRoZSBudW1iZXIgb2YgYW4gaW50ZXJuYWwgbGFiZWwgd2hvc2UKK2RlZmluaXRpb24gaXMgb3V0cHV0IHVzaW5nIEFTTV9PVVRQVVRfSU5URVJOQUxfTEFCRUwuCitGb3IgZXhhbXBsZSwKKworZnByaW50ZihTVFJFQU0sICJcdC53b3JkIEwlZFxuIiwgVkFMVUUpCisqLworCisjZGVmaW5lIEFTTV9PVVRQVVRfQUREUl9WRUNfRUxUKFNUUkVBTSwgVkFMVUUpICBcCisgIGZwcmludGYoU1RSRUFNLCAiXHQubG9uZyAlc0wlZFxuIiwgTE9DQUxfTEFCRUxfUFJFRklYLCBWQUxVRSkKKworLyoqIEFzc2VtYmxlciBDb21tYW5kcyBmb3IgRXhjZXB0aW9uIFJlZ2lvbnMgKi8KKworLyogVG9EbzogQWxsIG9mIHRoaXMgc3Vic2VjdGlvbiAqLworCisvKiogQXNzZW1ibGVyIENvbW1hbmRzIGZvciBBbGlnbm1lbnQgKi8KKworCisvKgorQSBDIHN0YXRlbWVudCB0byBvdXRwdXQgdG8gdGhlIHN0ZGlvIHN0cmVhbSBTVFJFQU0gYW4gYXNzZW1ibGVyCitjb21tYW5kIHRvIGFkdmFuY2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gYSBtdWx0aXBsZSBvZiAyIHRvIHRoZQorUE9XRVIgYnl0ZXMuICBQT1dFUiB3aWxsIGJlIGEgQyBleHByZXNzaW9uIG9mIHR5cGUgaW50LgorKi8KKyNkZWZpbmUgQVNNX09VVFBVVF9BTElHTihTVFJFQU0sIFBPV0VSKQkJCVwKKyAgZG8JCQkJCQkJXAorICAgIHsJCQkJCQkJXAorICAgICAgaWYgKChQT1dFUikgIT0gMCkJCQkJCVwKKwlmcHJpbnRmKFNUUkVBTSwgIlx0LmFsaWduXHQlZFxuIiwgUE9XRVIpOwlcCisgICAgfQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisvKgorTGlrZSBBU01fT1VUUFVUX0FMSUdOLCBleGNlcHQgdGhhdCB0aGUgXG5vcCIgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBmb3IgcGFkZGluZywgaWYKK25lY2Vzc2FyeS4KKyovCisjZGVmaW5lIEFTTV9PVVRQVVRfQUxJR05fV0lUSF9OT1AoU1RSRUFNLCBQT1dFUikgXAorIGZwcmludGYoU1RSRUFNLCAiXHQuYmFsaWdud1x0JWQsIDB4ZDcwM1xuIiwgKDEgPDwgUE9XRVIpKQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udHJvbGxpbmcgRGVidWdnaW5nIEluZm9ybWF0aW9uIEZvcm1hdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIb3cgdG8gcmVudW1iZXIgcmVnaXN0ZXJzIGZvciBkYnggYW5kIGdkYi4gICovCisjZGVmaW5lIERCWF9SRUdJU1RFUl9OVU1CRVIoUkVHTk8pIEFTTV9SRUdOVU0gKFJFR05PKQorCisvKiBUaGUgRFdBUkYgMiBDRkEgY29sdW1uIHdoaWNoIHRyYWNrcyB0aGUgcmV0dXJuIGFkZHJlc3MuICAqLworI2RlZmluZSBEV0FSRl9GUkFNRV9SRVRVUk5fQ09MVU1OIERXQVJGX0ZSQU1FX1JFR05VTShMUl9SRUdOVU0pCisKKy8qCitEZWZpbmUgdGhpcyBtYWNybyBpZiBHQ0Mgc2hvdWxkIHByb2R1Y2UgZHdhcmYgdmVyc2lvbiAyIGZvcm1hdAorZGVidWdnaW5nIG91dHB1dCBpbiByZXNwb25zZSB0byB0aGUgLWcgb3B0aW9uLgorCitUbyBzdXBwb3J0IG9wdGlvbmFsIGNhbGwgZnJhbWUgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB5b3UgbXVzdCBhbHNvCitkZWZpbmUgSU5DT01JTkdfUkVUVVJOX0FERFJfUlRYIGFuZCBlaXRoZXIgc2V0CitSVFhfRlJBTUVfUkVMQVRFRF9QIG9uIHRoZSBwcm9sb2d1ZSBpbnNucyBpZiB5b3UgdXNlIFJUTCBmb3IgdGhlCitwcm9sb2d1ZSwgb3IgY2FsbCBkd2FyZjJvdXRfZGVmX2NmYSBhbmQgZHdhcmYyb3V0X3JlZ19zYXZlCithcyBhcHByb3ByaWF0ZSBmcm9tIFRBUkdFVF9BU01fRlVOQ1RJT05fUFJPTE9HVUUgaWYgeW91IGRvbid0LgorKi8KKyNkZWZpbmUgRFdBUkYyX0RFQlVHR0lOR19JTkZPIDEKKworCisjZGVmaW5lIERXQVJGMl9BU01fTElORV9ERUJVR19JTkZPIDEKKyNkZWZpbmUgRFdBUkYyX0ZSQU1FX0lORk8gMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1pc2NlbGxhbmVvdXMgUGFyYW1ldGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb0RvOiBhIGxvdCAqLworCisvKgorQW4gYWxpYXMgZm9yIGEgbWFjaGluZSBtb2RlIG5hbWUuICBUaGlzIGlzIHRoZSBtYWNoaW5lIG1vZGUgdGhhdAorZWxlbWVudHMgb2YgYSBqdW1wLXRhYmxlIHNob3VsZCBoYXZlLgorKi8KKyNkZWZpbmUgQ0FTRV9WRUNUT1JfTU9ERSBTSW1vZGUKKworLyoKK0RlZmluZSB0aGlzIG1hY3JvIHRvIGJlIGEgQyBleHByZXNzaW9uIHRvIGluZGljYXRlIHdoZW4ganVtcC10YWJsZXMKK3Nob3VsZCBjb250YWluIHJlbGF0aXZlIGFkZHJlc3Nlcy4gIElmIGp1bXAtdGFibGVzIG5ldmVyIGNvbnRhaW4KK3JlbGF0aXZlIGFkZHJlc3NlcywgdGhlbiB5b3UgbmVlZCBub3QgZGVmaW5lIHRoaXMgbWFjcm8uCisqLworI2RlZmluZSBDQVNFX1ZFQ1RPUl9QQ19SRUxBVElWRSAwCisKKy8qIEluY3JlYXNlIHRoZSB0aHJlc2hvbGQgZm9yIHVzaW5nIHRhYmxlIGp1bXBzIG9uIHRoZSBVQyBhcmNoLiAqLworI2RlZmluZSBDQVNFX1ZBTFVFU19USFJFU0hPTEQgIChUQVJHRVRfQlJBTkNIX1BSRUQgPyA0IDogNykKKworLyoKK1RoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGEgc2luZ2xlIGluc3RydWN0aW9uIGNhbiBtb3ZlIHF1aWNrbHkKK2JldHdlZW4gbWVtb3J5IGFuZCByZWdpc3RlcnMgb3IgYmV0d2VlbiB0d28gbWVtb3J5IGxvY2F0aW9ucy4KKyovCisjZGVmaW5lIE1PVkVfTUFYICgyKlVOSVRTX1BFUl9XT1JEKQorCisKKy8qIEEgQyBleHByZXNzaW9uIHRoYXQgaXMgbm9uemVybyBpZiBvbiB0aGlzIG1hY2hpbmUgdGhlIG51bWJlciBvZiBiaXRzIGFjdHVhbGx5IHVzZWQKKyAgIGZvciB0aGUgY291bnQgb2YgYSBzaGlmdCBvcGVyYXRpb24gaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQKKyAgIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgYmVpbmcgc2hpZnRlZC4gV2hlbiB0aGlzIG1hY3JvIGlzIG5vbnplcm8sIHRoZSBjb21waWxlciB3aWxsCisgICBhc3N1bWUgdGhhdCBpdCBpcyBzYWZlIHRvIG9taXQgYSBzaWduLWV4dGVuZCwgemVyby1leHRlbmQsIGFuZCBjZXJ0YWluIGJpdHdpc2UgJ2FuZCcKKyAgIGluc3RydWN0aW9ucyB0aGF0IHRydW5jYXRlcyB0aGUgY291bnQgb2YgYSBzaGlmdCBvcGVyYXRpb24uIE9uIG1hY2hpbmVzIHRoYXQgaGF2ZQorICAgaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIGJpdC1maWVsZHMgYXQgdmFyaWFibGUgcG9zaXRpb25zLCB3aGljaCBtYXkgaW5jbHVkZSAnYml0IHRlc3QnCisgICAzNzggR05VIENvbXBpbGVyIENvbGxlY3Rpb24gKEdDQykgSW50ZXJuYWxzCisgICBpbnN0cnVjdGlvbnMsIGEgbm9uemVybyBTSElGVF9DT1VOVF9UUlVOQ0FURUQgYWxzbyBlbmFibGVzIGRlbGV0aW9uIG9mIHRydW5jYXRpb25zCisgICBvZiB0aGUgdmFsdWVzIHRoYXQgc2VydmUgYXMgYXJndW1lbnRzIHRvIGJpdC1maWVsZCBpbnN0cnVjdGlvbnMuCisgICBJZiBib3RoIHR5cGVzIG9mIGluc3RydWN0aW9ucyB0cnVuY2F0ZSB0aGUgY291bnQgKGZvciBzaGlmdHMpIGFuZCBwb3NpdGlvbiAoZm9yIGJpdC1maWVsZAorICAgb3BlcmF0aW9ucyksIG9yIGlmIG5vIHZhcmlhYmxlLXBvc2l0aW9uIGJpdC1maWVsZCBpbnN0cnVjdGlvbnMgZXhpc3QsIHlvdSBzaG91bGQgZGVmaW5lCisgICB0aGlzIG1hY3JvLgorICAgSG93ZXZlciwgb24gc29tZSBtYWNoaW5lcywgc3VjaCBhcyB0aGUgODAzODYgYW5kIHRoZSA2ODB4MCwgdHJ1bmNhdGlvbiBvbmx5IGFwcGxpZXMKKyAgIHRvIHNoaWZ0IG9wZXJhdGlvbnMgYW5kIG5vdCB0aGUgKHJlYWwgb3IgcHJldGVuZGVkKSBiaXQtZmllbGQgb3BlcmF0aW9ucy4gRGVmaW5lIFNISUZUXworICAgQ09VTlRfVFJVTkNBVEVEIHRvIGJlIHplcm8gb24gc3VjaCBtYWNoaW5lcy4gSW5zdGVhZCwgYWRkIHBhdHRlcm5zIHRvIHRoZSAnbWQnIGZpbGUKKyAgIHRoYXQgaW5jbHVkZSB0aGUgaW1wbGllZCB0cnVuY2F0aW9uIG9mIHRoZSBzaGlmdCBpbnN0cnVjdGlvbnMuCisgICBZb3UgbmVlZCBub3QgZGUMbmUgdGhpcyBtYWNybyBpZiBpdCB3b3VsZCBhbHdheXMgaGF2ZSB0aGUgdmFsdWUgb2YgemVyby4gKi8KKyNkZWZpbmUgU0hJRlRfQ09VTlRfVFJVTkNBVEVEIDEKKworLyoKK0EgQyBleHByZXNzaW9uIHdoaWNoIGlzIG5vbnplcm8gaWYgb24gdGhpcyBtYWNoaW5lIGl0IGlzIHNhZmUgdG8KK2NvbnZlcnQgYW4gaW50ZWdlciBvZiBJTlBSRUMgYml0cyB0byBvbmUgb2YgT1VUUFJFQworYml0cyAod2hlcmUgT1VUUFJFQyBpcyBzbWFsbGVyIHRoYW4gSU5QUkVDKSBieSBtZXJlbHkKK29wZXJhdGluZyBvbiBpdCBhcyBpZiBpdCBoYWQgb25seSBPVVRQUkVDIGJpdHMuCisKK09uIG1hbnkgbWFjaGluZXMsIHRoaXMgZXhwcmVzc2lvbiBjYW4gYmUgMS4KKworV2hlbiBUUlVMWV9OT09QX1RSVU5DQVRJT04gcmV0dXJucyAxIGZvciBhIHBhaXIgb2Ygc2l6ZXMgZm9yCittb2RlcyBmb3Igd2hpY2ggTU9ERVNfVElFQUJMRV9QIGlzIDAsIHN1Ym9wdGltYWwgY29kZSBjYW4gcmVzdWx0LgorSWYgdGhpcyBpcyB0aGUgY2FzZSwgbWFraW5nIFRSVUxZX05PT1BfVFJVTkNBVElPTiByZXR1cm4gMCBpbgorc3VjaCBjYXNlcyBtYXkgaW1wcm92ZSB0aGluZ3MuCisqLworI2RlZmluZSBUUlVMWV9OT09QX1RSVU5DQVRJT04oT1VUUFJFQywgSU5QUkVDKSAxCisKKy8qCitBbiBhbGlhcyBmb3IgdGhlIG1hY2hpbmUgbW9kZSBmb3IgcG9pbnRlcnMuICBPbiBtb3N0IG1hY2hpbmVzLCBkZWZpbmUKK3RoaXMgdG8gYmUgdGhlIGludGVnZXIgbW9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB3aWR0aCBvZiBhIGhhcmR3YXJlCitwb2ludGVyOyBTSW1vZGUgb24gMzItYml0IG1hY2hpbmUgb3IgREltb2RlIG9uIDY0LWJpdCBtYWNoaW5lcy4KK09uIHNvbWUgbWFjaGluZXMgeW91IG11c3QgZGVmaW5lIHRoaXMgdG8gYmUgb25lIG9mIHRoZSBwYXJ0aWFsIGludGVnZXIKK21vZGVzLCBzdWNoIGFzIFBTSW1vZGUuCisKK1RoZSB3aWR0aCBvZiBQbW9kZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSB2YWx1ZSBvZgorUE9JTlRFUl9TSVpFLiAgSWYgaXQgaXMgbm90IGVxdWFsLCB5b3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvCitQT0lOVEVSU19FWFRFTkRfVU5TSUdORUQgdG8gc3BlY2lmeSBob3cgcG9pbnRlcnMgYXJlIGV4dGVuZGVkCit0byBQbW9kZS4KKyovCisjZGVmaW5lIFBtb2RlIFNJbW9kZQorCisvKgorQW4gYWxpYXMgZm9yIHRoZSBtYWNoaW5lIG1vZGUgdXNlZCBmb3IgbWVtb3J5IHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zCitiZWluZyBjYWxsZWQsIGluIGNhbGwgUlRMIGV4cHJlc3Npb25zLiAgT24gbW9zdCBtYWNoaW5lcyB0aGlzCitzaG91bGQgYmUgUUltb2RlLgorKi8KKyNkZWZpbmUgRlVOQ1RJT05fTU9ERSBTSW1vZGUKKworCisjZGVmaW5lIFJFR19TX1AoeCkgXAorIChSRUdfUCAoeCkgfHwgKEdFVF9DT0RFICh4KSA9PSBTVUJSRUcgJiYgUkVHX1AgKFhFWFAgKHgsIDApKSkpCisKKworLyogSWYgZGVmaW5lZCwgbW9kaWZpZXMgdGhlIGxlbmd0aCBhc3NpZ25lZCB0byBpbnN0cnVjdGlvbiBJTlNOIGFzIGEKKyAgIGZ1bmN0aW9uIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuICBMRU5HVEggaXMgYW4gbHZhbHVlCisgICB0aGF0IGNvbnRhaW5zIHRoZSBpbml0aWFsbHkgY29tcHV0ZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGFuZCBzaG91bGQKKyAgIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY29ycmVjdCBsZW5ndGggb2YgdGhlIGluc24uICAqLworI2RlZmluZSBBREpVU1RfSU5TTl9MRU5HVEgoSU5TTiwgTEVOR1RIKSBcCisgICgoTEVOR1RIKSA9IGF2cjMyX2FkanVzdF9pbnNuX2xlbmd0aCAoKElOU04pLCAoTEVOR1RIKSkpCisKKworI2RlZmluZSBDTFpfREVGSU5FRF9WQUxVRV9BVF9aRVJPKG1vZGUsIHZhbHVlKSBcCisgICh2YWx1ZSA9IDMyLCAobW9kZSA9PSBTSW1vZGUpKQorCisjZGVmaW5lIENUWl9ERUZJTkVEX1ZBTFVFX0FUX1pFUk8obW9kZSwgdmFsdWUpIFwKKyAgKHZhbHVlID0gMzIsIChtb2RlID09IFNJbW9kZSkpCisKKyNkZWZpbmUgVU5JVFNfUEVSX1NJTURfV09SRCBVTklUU19QRVJfV09SRAorCisjZGVmaW5lIFNUT1JFX0ZMQUdfVkFMVUUgMQorCisKKy8qIElGLWNvbnZlcnNpb24gbWFjcm9zLiAqLworI2RlZmluZSBJRkNWVF9NT0RJRllfSU5TTiggQ0VfSU5GTywgUEFUVEVSTiwgSU5TTiApICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQQVRURVJOKSA9IGF2cjMyX2lmY3Z0X21vZGlmeV9pbnNuIChDRV9JTkZPLCBQQVRURVJOLCBJTlNOLCAmbnVtX3RydWVfY2hhbmdlcyk7IFwKKyAgfQorCisjZGVmaW5lIElGQ1ZUX0VYVFJBX0ZJRUxEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IG51bV9jb25kX2Nsb2JiZXJfaW5zbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgbnVtX2V4dHJhX21vdmVfaW5zbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJ0eCBleHRyYV9tb3ZlX2luc25zW01BWF9DT05ESVRJT05BTF9FWEVDVVRFXTsgICAgICAgIFwKKyAgcnR4IG1vdmVkX2luc25zW01BWF9DT05ESVRJT05BTF9FWEVDVVRFXTsKKworI2RlZmluZSBJRkNWVF9JTklUX0VYVFJBX0ZJRUxEUyggQ0VfSU5GTyApICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKENFX0lORk8pLT5udW1fY29uZF9jbG9iYmVyX2luc25zID0gMDsgICAgICAgXAorICAgIChDRV9JTkZPKS0+bnVtX2V4dHJhX21vdmVfaW5zbnMgPSAwOyAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgSUZDVlRfTU9ESUZZX0NBTkNFTCggQ0VfSU5GTyApICBhdnIzMl9pZmN2dF9tb2RpZnlfY2FuY2VsIChDRV9JTkZPLCAmbnVtX3RydWVfY2hhbmdlcykKKworI2RlZmluZSBJRkNWVF9BTExPV19NT0RJRllfVEVTVF9JTl9JTlNOIDEKKyNkZWZpbmUgSUZDVlRfQ09ORF9FWEVDX0JFRk9SRV9SRUxPQUQgKFRBUkdFVF9DT05EX0VYRUNfQkVGT1JFX1JFTE9BRCkKKworZW51bSBhdnIzMl9idWlsdGlucworeworICBBVlIzMl9CVUlMVElOX01UU1IsCisgIEFWUjMyX0JVSUxUSU5fTUZTUiwKKyAgQVZSMzJfQlVJTFRJTl9NVERSLAorICBBVlIzMl9CVUlMVElOX01GRFIsCisgIEFWUjMyX0JVSUxUSU5fQ0FDSEUsCisgIEFWUjMyX0JVSUxUSU5fU1lOQywKKyAgQVZSMzJfQlVJTFRJTl9TU1JGLAorICBBVlIzMl9CVUlMVElOX0NTUkYsCisgIEFWUjMyX0JVSUxUSU5fVExCUiwKKyAgQVZSMzJfQlVJTFRJTl9UTEJTLAorICBBVlIzMl9CVUlMVElOX1RMQlcsCisgIEFWUjMyX0JVSUxUSU5fQlJFQUtQT0lOVCwKKyAgQVZSMzJfQlVJTFRJTl9YQ0hHLAorICBBVlIzMl9CVUlMVElOX0xEWEksCisgIEFWUjMyX0JVSUxUSU5fQlNXQVAxNiwKKyAgQVZSMzJfQlVJTFRJTl9CU1dBUDMyLAorICBBVlIzMl9CVUlMVElOX0NPUCwKKyAgQVZSMzJfQlVJTFRJTl9NVkNSX1csCisgIEFWUjMyX0JVSUxUSU5fTVZSQ19XLAorICBBVlIzMl9CVUlMVElOX01WQ1JfRCwKKyAgQVZSMzJfQlVJTFRJTl9NVlJDX0QsCisgIEFWUjMyX0JVSUxUSU5fTVVMU0FUSEhfSCwKKyAgQVZSMzJfQlVJTFRJTl9NVUxTQVRISF9XLAorICBBVlIzMl9CVUlMVElOX01VTFNBVFJOREhIX0gsCisgIEFWUjMyX0JVSUxUSU5fTVVMU0FUUk5EV0hfVywKKyAgQVZSMzJfQlVJTFRJTl9NVUxTQVRXSF9XLAorICBBVlIzMl9CVUlMVElOX01BQ1NBVEhIX1csCisgIEFWUjMyX0JVSUxUSU5fU0FUQUREX0gsCisgIEFWUjMyX0JVSUxUSU5fU0FUU1VCX0gsCisgIEFWUjMyX0JVSUxUSU5fU0FUQUREX1csCisgIEFWUjMyX0JVSUxUSU5fU0FUU1VCX1csCisgIEFWUjMyX0JVSUxUSU5fTVVMV0hfRCwKKyAgQVZSMzJfQlVJTFRJTl9NVUxOV0hfRCwKKyAgQVZSMzJfQlVJTFRJTl9NQUNXSF9ELAorICBBVlIzMl9CVUlMVElOX01BQ0hIX0QsCisgIEFWUjMyX0JVSUxUSU5fTVVTRlIsCisgIEFWUjMyX0JVSUxUSU5fTVVTVFIsCisgIEFWUjMyX0JVSUxUSU5fU0FUUywKKyAgQVZSMzJfQlVJTFRJTl9TQVRVLAorICBBVlIzMl9CVUlMVElOX1NBVFJORFMsCisgIEFWUjMyX0JVSUxUSU5fU0FUUk5EVSwKKyAgQVZSMzJfQlVJTFRJTl9NRU1TLAorICBBVlIzMl9CVUlMVElOX01FTUMsCisgIEFWUjMyX0JVSUxUSU5fTUVNVAorfTsKKworCisjZGVmaW5lIEZMT0FUX0xJQl9DT01QQVJFX1JFVFVSTlNfQk9PTChNT0RFLCBDT01QQVJJU09OKSBcCisgICgoTU9ERSA9PSBTRm1vZGUpIHx8IChNT0RFID09IERGbW9kZSkpCisKKyNkZWZpbmUgUkVOQU1FX0xJQlJBUllfU0VUICIuc2V0IgorCisvKiBNYWtlIEFCSV9OQU1FIGFuIGFsaWFzIGZvciBfX0dDQ19OQU1FLiAgKi8KKyNkZWZpbmUgUkVOQU1FX0xJQlJBUlkoR0NDX05BTUUsIEFCSV9OQU1FKQkJXAorICBfX2FzbV9fICgiLmdsb2JsXHRfX2F2cjMyXyIgI0FCSV9OQU1FICJcbiIJCVwKKwkgICAiLnNldFx0X19hdnIzMl8iICNBQklfTkFNRSAJXAorCSAgICAgIiwgX18iICNHQ0NfTkFNRSAiXG4iKTsKKworLyogR2l2ZSBsaWJnY2MgZnVuY3Rpb25zIGF2cjMyIEFCSSBuYW1lLiAgKi8KKyNpZmRlZiBMX211bGRpMworI2RlZmluZSBERUNMQVJFX0xJQlJBUllfUkVOQU1FUyBSRU5BTUVfTElCUkFSWSAobXVsZGkzLCBtdWw2NCkKKyNlbmRpZgorI2lmZGVmIExfZGl2ZGkzCisjZGVmaW5lIERFQ0xBUkVfTElCUkFSWV9SRU5BTUVTIFJFTkFNRV9MSUJSQVJZIChkaXZkaTMsIHNkaXY2NCkKKyNlbmRpZgorI2lmZGVmIExfdWRpdmRpMworI2RlZmluZSBERUNMQVJFX0xJQlJBUllfUkVOQU1FUyBSRU5BTUVfTElCUkFSWSAodWRpdmRpMywgdWRpdjY0KQorI2VuZGlmCisjaWZkZWYgTF9tb2RkaTMKKyNkZWZpbmUgREVDTEFSRV9MSUJSQVJZX1JFTkFNRVMgUkVOQU1FX0xJQlJBUlkgKG1vZGRpMywgc21vZDY0KQorI2VuZGlmCisjaWZkZWYgTF91bW9kZGkzCisjZGVmaW5lIERFQ0xBUkVfTElCUkFSWV9SRU5BTUVTIFJFTkFNRV9MSUJSQVJZICh1bW9kZGkzLCB1bW9kNjQpCisjZW5kaWYKKyNpZmRlZiBMX2FzaGxkaTMKKyNkZWZpbmUgREVDTEFSRV9MSUJSQVJZX1JFTkFNRVMgUkVOQU1FX0xJQlJBUlkgKGFzaGxkaTMsIGxzbDY0KQorI2VuZGlmCisjaWZkZWYgTF9sc2hyZGkzCisjZGVmaW5lIERFQ0xBUkVfTElCUkFSWV9SRU5BTUVTIFJFTkFNRV9MSUJSQVJZIChsc2hyZGkzLCBsc3I2NCkKKyNlbmRpZgorI2lmZGVmIExfYXNocmRpMworI2RlZmluZSBERUNMQVJFX0xJQlJBUllfUkVOQU1FUyBSRU5BTUVfTElCUkFSWSAoYXNocmRpMywgYXNyNjQpCisjZW5kaWYKKworI2lmZGVmIExfZml4c2ZkaQorI2RlZmluZSBERUNMQVJFX0xJQlJBUllfUkVOQU1FUyBSRU5BTUVfTElCUkFSWSAoZml4c2ZkaSwgZjMyX3RvX3M2NCkKKyNlbmRpZgorI2lmZGVmIExfZml4dW5zc2ZkaQorI2RlZmluZSBERUNMQVJFX0xJQlJBUllfUkVOQU1FUyBSRU5BTUVfTElCUkFSWSAoZml4dW5zc2ZkaSwgZjMyX3RvX3U2NCkKKyNlbmRpZgorI2lmZGVmIExfZmxvYXRkaWRmCisjZGVmaW5lIERFQ0xBUkVfTElCUkFSWV9SRU5BTUVTIFJFTkFNRV9MSUJSQVJZIChmbG9hdGRpZGYsIHM2NF90b19mNjQpCisjZW5kaWYKKyNpZmRlZiBMX2Zsb2F0ZGlzZgorI2RlZmluZSBERUNMQVJFX0xJQlJBUllfUkVOQU1FUyBSRU5BTUVfTElCUkFSWSAoZmxvYXRkaXNmLCBzNjRfdG9fZjMyKQorI2VuZGlmCisKKyNlbmRpZgotLS0gL2Rldi9udWxsCisrKyBiL2djYy9jb25maWcvYXZyMzIvYXZyMzIubWQKQEAgLTAsMCArMSw0ODkzIEBACis7OyAgIEFWUjMyIG1hY2hpbmUgZGVzY3JpcHRpb24gZmlsZS4KKzs7ICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbi4KKzs7Cis7OyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+Cis7OworOzsgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7ICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7OyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKzs7IC0qLSBNb2RlOiBTY2hlbWUgLSotCisKKyhkZWZpbmVfYXR0ciAidHlwZSIgImFsdSxhbHUyLGFsdV9zYXQsbXVsaGgsbXVsd2gsbXVsd3dfdyxtdWx3d19kLGRpdixtYWNoaF93LG1hY3d3X3csbWFjd3dfZCxicmFuY2gsY2FsbCxsb2FkLGxvYWRfcm0sc3RvcmUsbG9hZDIsbG9hZDQsc3RvcmUyLHN0b3JlNCxmbXVsLGZjbXBzLGZjbXBkLGZjYXN0LGZtdixmbXZjcHUsZmxkZCxmc3RkLGZsZHMsZnN0cyxmc3RtIgorICAoY29uc3Rfc3RyaW5nICJhbHUiKSkKKworCisoZGVmaW5lX2F0dHIgImNjIiAibm9uZSxzZXRfdm5jeixzZXRfbmN6LHNldF9jeixzZXRfeixzZXRfel9pZl9ub3RfdjIsYmxkLGNvbXBhcmUsY21wX2NvbmRfaW5zbixjbG9iYmVyLGNhbGxfc2V0LGZwY29tcGFyZSxmcm9tX2ZwY2MiCisgIChjb25zdF9zdHJpbmcgIm5vbmUiKSkKKworCis7IE5CISBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIGVudW0gYXJjaGl0ZWN0dXJlX3R5cGUgaW4gYXZyMzIuaAorKGRlZmluZV9hdHRyICJwaXBlbGluZSIgImFwLHVjcjEsdWNyMix1Y3Iybm9tdWwiCisgIChjb25zdCAoc3ltYm9sX3JlZiAiYXZyMzJfYXJjaC0+YXJjaF90eXBlIikpKQorCis7IEluc24gbGVuZ3RoIGluIGJ5dGVzCisoZGVmaW5lX2F0dHIgImxlbmd0aCIgIiIKKyAgKGNvbnN0X2ludCA0KSkKKworOyBTaWduYWwgaWYgYW4gaW5zbiBpcyBwcmVkaWNhYmxlIGFuZCBoZW5jZSBjYW4gYmUgY29uZGl0aW9uYWxseSBleGVjdXRlZC4KKyhkZWZpbmVfYXR0ciAicHJlZGljYWJsZSIgIm5vLHllcyIgKGNvbnN0X3N0cmluZyAibm8iKSkKKworOzsgVXNlcyBvZiBVTlNQRUMgaW4gdGhpcyBmaWxlOgorKGRlZmluZV9jb25zdGFudHMKKyAgWyhVTlNQRUNfUFVTSE0gICAgICAgICAgICAgICAgMCkKKyAgIChVTlNQRUNfUE9QTSAgICAgICAgICAgICAgICAgMSkKKyAgIChVTlNQRUNfVURJVk1PRFNJNF9JTlRFUk5BTAkyKQorICAgKFVOU1BFQ19ESVZNT0RTSTRfSU5URVJOQUwgICAzKQorICAgKFVOU1BFQ19TVE0gICAgICAgICAgICAgICAgICA0KQorICAgKFVOU1BFQ19MRE0gICAgICAgICAgICAgICAgICA1KQorICAgKFVOU1BFQ19NT1ZTSUNDICAgICAgICAgICAgICA2KQorICAgKFVOU1BFQ19BRERTSUNDICAgICAgICAgICAgICA3KQorICAgKFVOU1BFQ19DT05EX01JICAgICAgICAgICAgICA4KQorICAgKFVOU1BFQ19DT05EX1BMICAgICAgICAgICAgICA5KQorICAgKFVOU1BFQ19QSUNfU1lNICAgICAgICAgICAgICAxMCkKKyAgIChVTlNQRUNfUElDX0JBU0UgICAgICAgICAgICAgMTEpCisgICAoVU5TUEVDX1NUT1JFX01VTFRJUExFICAgICAgIDEyKQorICAgKFVOU1BFQ19TVE1GUCAgICAgICAgICAgICAgICAxMykKKyAgIChVTlNQRUNfRlBDQ19UT19SRUcgICAgICAgICAgMTQpCisgICAoVU5TUEVDX1JFR19UT19DQyAgICAgICAgICAgIDE1KQorICAgKFVOU1BFQ19GT1JDRV9NSU5JUE9PTCAgICAgICAxNikKKyAgIChVTlNQRUNfU0FUUyAgICAgICAgICAgICAgICAgMTcpCisgICAoVU5TUEVDX1NBVFUgICAgICAgICAgICAgICAgIDE4KQorICAgKFVOU1BFQ19TQVRSTkRTICAgICAgICAgICAgICAxOSkKKyAgIChVTlNQRUNfU0FUUk5EVSAgICAgICAgICAgICAgMjApCisgIF0pCisKKyhkZWZpbmVfY29uc3RhbnRzCisgIFsoVlVOU1BFQ19FUElMT0dVRSAgICAgICAgICAgICAgICAgIDApCisgICAoVlVOU1BFQ19DQUNIRSAgICAgICAgICAgICAgICAgICAgIDEpCisgICAoVlVOU1BFQ19NVFNSICAgICAgICAgICAgICAgICAgICAgIDIpCisgICAoVlVOU1BFQ19NRlNSICAgICAgICAgICAgICAgICAgICAgIDMpCisgICAoVlVOU1BFQ19CTE9DS0FHRSAgICAgICAgICAgICAgICAgIDQpCisgICAoVlVOU1BFQ19TWU5DICAgICAgICAgICAgICAgICAgICAgIDUpCisgICAoVlVOU1BFQ19UTEJSICAgICAgICAgICAgICAgICAgICAgIDYpCisgICAoVlVOU1BFQ19UTEJXICAgICAgICAgICAgICAgICAgICAgIDcpCisgICAoVlVOU1BFQ19UTEJTICAgICAgICAgICAgICAgICAgICAgIDgpCisgICAoVlVOU1BFQ19CUkVBS1BPSU5UICAgICAgICAgICAgICAgIDkpCisgICAoVlVOU1BFQ19NVERSICAgICAgICAgICAgICAgICAgICAgIDEwKQorICAgKFZVTlNQRUNfTUZEUiAgICAgICAgICAgICAgICAgICAgICAxMSkKKyAgIChWVU5TUEVDX01WQ1IgICAgICAgICAgICAgICAgICAgICAgMTIpCisgICAoVlVOU1BFQ19NVlJDICAgICAgICAgICAgICAgICAgICAgIDEzKQorICAgKFZVTlNQRUNfQ09QICAgICAgICAgICAgICAgICAgICAgICAxNCkKKyAgIChWVU5TUEVDX0FMSUdOICAgICAgICAgICAgICAgICAgICAgMTUpCisgICAoVlVOU1BFQ19QT09MX1NUQVJUICAgICAgICAgICAgICAgIDE2KQorICAgKFZVTlNQRUNfUE9PTF9FTkQgICAgICAgICAgICAgICAgICAxNykKKyAgIChWVU5TUEVDX1BPT0xfNCAgICAgICAgICAgICAgICAgICAgMTgpCisgICAoVlVOU1BFQ19QT09MXzggICAgICAgICAgICAgICAgICAgIDE5KQorICAgKFZVTlNQRUNfUE9PTF8xNiAgICAgICAgICAgICAgICAgICAyMCkKKyAgIChWVU5TUEVDX01VU0ZSICAgICAgICAgICAgICAgICAgICAgMjEpCisgICAoVlVOU1BFQ19NVVNUUiAgICAgICAgICAgICAgICAgICAgIDIyKQorICAgKFZVTlNQRUNfU1lOQ19DTVBYQ0hHICAgICAgICAgICAgICAyMykKKyAgIChWVU5TUEVDX1NZTkNfU0VUX0xPQ0tfQU5EX0xPQUQgICAgMjQpCisgICAoVlVOU1BFQ19TWU5DX1NUT1JFX0lGX0xPQ0sgICAgICAgIDI1KQorICAgKFZVTlNQRUNfRUhfUkVUVVJOICAgICAgICAgICAgICAgICAyNikKKyAgIChWVU5TUEVDX0ZSUyAgICAgICAgICAgICAgICAgICAgICAgMjcpCisgICAoVlVOU1BFQ19DU1JGICAgICAgICAgICAgICAgICAgICAgIDI4KQorICAgKFZVTlNQRUNfU1NSRiAgICAgICAgICAgICAgICAgICAgICAyOSkKKyAgIF0pCisKKyhkZWZpbmVfY29uc3RhbnRzCisgIFsKKyAgIDs7IFI3ID0gMTUtNyA9IDgKKyAgIChGUF9SRUdOVU0gICA4KQorICAgOzsgUmV0dXJuIFJlZ2lzdGVyID0gUjEyID0gMTUgLSAxMiA9IDMKKyAgIChSRVRWQUxfUkVHTlVNICAgMykKKyAgIDs7IFNQID0gUjEzID0gMTUgLSAxMyA9IDIKKyAgIChTUF9SRUdOVU0gICAyKQorICAgOzsgTFIgPSBSMTQgPSAxNSAtIDE0ID0gMQorICAgKExSX1JFR05VTSAgIDEpCisgICA7OyBQQyA9IFIxNSA9IDE1IC0gMTUgPSAwCisgICAoUENfUkVHTlVNICAgMCkKKyAgIDs7IEZQU1IgPSBHRU5FUkFMX1JFR1MgKyAxID0gMTcKKyAgIChGUENDX1JFR05VTSAxNykKKyAgIF0pCisKKworCisKKzs7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7OyBNYWNyb3MKKzs7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzs7IEludGVnZXIgTW9kZXMgZm9yIGJhc2ljIGFsdSBpbnNucworKGRlZmluZV9tb2RlX21hY3JvIElOVE0gW1NJIEhJIFFJXSkKKyhkZWZpbmVfbW9kZV9hdHRyICBhbHVfY2NfYXR0ciBbKFNJICJzZXRfdm5jeiIpIChISSAiY2xvYmJlciIpIChRSSAiY2xvYmJlciIpXSkKKworOzsgTW92ZSB3b3JkIG1vZGVzCisoZGVmaW5lX21vZGVfbWFjcm8gTU9WTSBbU0kgVjJISSBWNFFJXSkKKworOzsgRm9yIG1vdi9hZGRjYyBpbnNucworKGRlZmluZV9tb2RlX21hY3JvIEFERENDIFtTSSBISSBRSV0pCisoZGVmaW5lX21vZGVfbWFjcm8gTU9WQ0MgW1NGIFNJIEhJIFFJXSkKKyhkZWZpbmVfbW9kZV9tYWNybyBDTVAgW0RJIFNJIEhJIFFJXSkKKyhkZWZpbmVfbW9kZV9hdHRyICBzdG9yZV9wb3N0Zml4IFsoU0YgIi53IikgKFNJICIudyIpIChISSAiLmgiKSAoUUkgIi5iIildKQorKGRlZmluZV9tb2RlX2F0dHIgIGxvYWRfcG9zdGZpeCBbKFNGICIudyIpIChTSSAiLnciKSAoSEkgIi5zaCIpIChRSSAiLnViIildKQorKGRlZmluZV9tb2RlX2F0dHIgIGxvYWRfcG9zdGZpeF9zIFsoU0kgIi53IikgKEhJICIuc2giKSAoUUkgIi5zYiIpXSkKKyhkZWZpbmVfbW9kZV9hdHRyICBsb2FkX3Bvc3RmaXhfdSBbKFNJICIudyIpIChISSAiLnVoIikgKFFJICIudWIiKV0pCisoZGVmaW5lX21vZGVfYXR0ciAgcHJlZF9tZW1fY29uc3RyYWludCBbKFNGICJSS3UxMSIpIChTSSAiUkt1MTEiKSAoSEkgIlJLdTEwIikgKFFJICJSS3UwOSIpXSkKKyhkZWZpbmVfbW9kZV9hdHRyICBjbXBfY29uc3RyYWludCBbKERJICJyS3UyMCIpIChTSSAicktzMjEiKSAoSEkgInIiKSAoUUkgInIiKV0pCisoZGVmaW5lX21vZGVfYXR0ciAgY21wX3ByZWRpY2F0ZSBbKERJICJyZWdpc3Rlcl9pbW1lZGlhdGVfb3BlcmFuZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJICJyZWdpc3Rlcl9jb25zdF9pbnRfb3BlcmFuZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhJICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUUkgInJlZ2lzdGVyX29wZXJhbmQiKV0pCisoZGVmaW5lX21vZGVfYXR0ciAgY21wX2xlbmd0aCBbKERJICI2IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0kgIjQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChISSAiNCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFJICI0IildKQorCis7OyBGb3IgYWxsIGNvbmRpdGlvbmFsIGluc25zCisoZGVmaW5lX2NvZGVfbWFjcm8gYW55X2NvbmQgW2VxIG5lIGd0IGdlIGx0IGxlIGd0dSBnZXUgbHR1IGxldV0pCisoZGVmaW5lX2NvZGVfYXR0ciBjb25kIFsoZXEgImVxIikgKG5lICJuZSIpIChndCAiZ3QiKSAoZ2UgImdlIikgKGx0ICJsdCIpIChsZSAibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgKGd0dSAiaGkiKSAoZ2V1ICJocyIpIChsdHUgImxvIikgKGxldSAibHMiKV0pCisoZGVmaW5lX2NvZGVfYXR0ciBpbnZjb25kIFsoZXEgIm5lIikgKG5lICJlcSIpIChndCAibGUiKSAoZ2UgImx0IikgKGx0ICJnZSIpIChsZSAiZ3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd0dSAibHMiKSAoZ2V1ICJsbyIpIChsdHUgImhzIikgKGxldSAiaGkiKV0pCisKKzs7IEZvciBsb2dpY2FsIG9wZXJhdGlvbnMKKyhkZWZpbmVfY29kZV9tYWNybyBsb2dpY2FsIFthbmQgaW9yIHhvcl0pCisoZGVmaW5lX2NvZGVfYXR0ciBsb2dpY2FsX2luc24gWyhhbmQgImFuZCIpIChpb3IgIm9yIikgKHhvciAiZW9yIildKQorCis7OyBQcmVkaWNhYmxlIG9wZXJhdGlvbnMgd2l0aCB0aHJlZSByZWdpc3RlciBvcGVyYW5kcyAKKyhkZWZpbmVfY29kZV9tYWNybyBwcmVkaWNhYmxlX29wMyBbYW5kIGlvciB4b3IgcGx1cyBtaW51c10pCisoZGVmaW5lX2NvZGVfYXR0ciBwcmVkaWNhYmxlX2luc24zIFsoYW5kICJhbmQiKSAoaW9yICJvciIpICh4b3IgImVvciIpIChwbHVzICJhZGQiKSAobWludXMgInN1YiIpXSkKKyhkZWZpbmVfY29kZV9hdHRyIHByZWRpY2FibGVfY29tbXV0YXRpdmUzIFsoYW5kICIlIikgKGlvciAiJSIpICh4b3IgIiUiKSAocGx1cyAiJSIpIChtaW51cyAiIildKQorCis7OyBMb2FkIHRoZSBwcmVkaWNhdGVzCisoaW5jbHVkZSAicHJlZGljYXRlcy5tZCIpCisKKworOzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzs7IEF1dG9tYXRvbiBwaXBlbGluZSBkZXNjcmlwdGlvbiBmb3IgYXZyMzIKKzs7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyhkZWZpbmVfYXV0b21hdG9uICJhdnIzMl9hcCIpCisKKworKGRlZmluZV9jcHVfdW5pdCAiaXMiICJhdnIzMl9hcCIpCisoZGVmaW5lX2NwdV91bml0ICJhMSxtMSxkYSIgImF2cjMyX2FwIikKKyhkZWZpbmVfY3B1X3VuaXQgImEyLG0yLGQiICJhdnIzMl9hcCIpCisKKzs7QWx1IGluc3RydWN0aW9ucworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJhbHVfb3AiIDEKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJhbHUiKSkKKyAgImlzLGExLGEyIikKKworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJhbHUyX29wIiAyCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAiYWx1MiIpKQorICAiaXMsaXMrYTEsYTErYTIsYTIiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImFsdV9zYXRfb3AiIDIKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJhbHVfc2F0IikpCisgICJpcyxhMSxhMiIpCisKKworOztNdWwgaW5zdHJ1Y3Rpb25zCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gIm11bGhoX29wIiAyCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAibXVsaGgsbXVsd2giKSkKKyAgImlzLG0xLG0yIikKKworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJtdWx3d193X29wIiAzCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAibXVsd3dfdyIpKQorICAiaXMsbTEsbTErbTIsbTIiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gIm11bHd3X2Rfb3AiIDUKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJtdWx3d19kIikpCisgICJpcyxtMSxtMSttMixtMSttMixtMixtMiIpCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAiZGl2X29wIiAzMworICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgImRpdiIpKQorICAiaXMsbTEsbTEqMzEgKyBtMiozMSxtMiIpCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAibWFjaGhfd19vcCIgMworICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgIm1hY2hoX3ciKSkKKyAgImlzKjIsbTEsbTIiKQorCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAibWFjd3dfd19vcCIgNAorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgIm1hY3d3X3ciKSkKKyAgImlzKjIsbTEsbTEsbTIiKQorCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAibWFjd3dfZF9vcCIgNgorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgIm1hY3d3X2QiKSkKKyAgImlzKjIsbTEsbTErbTIsbTErbTIsbTIiKQorCis7O0J5cGFzc2VzIGZvciBNYWMgaW5zdHJ1Y3Rpb25zLCBiZWNhdXNlIG9mIGFjY3VtdWxhdG9yIGNhY2hlLgorOztTZXQgbGF0ZW5jeSBhcyBsb3cgYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gbGV0IHRoZSBjb21waWxlciBsZXQKKzs7bXVsIC0+IG1hYyBhbmQgbWFjIC0+IG1hYyBjb21iaW5hdGlvbnMgd2hpY2ggdXNlIHRoZSBzYW1lCis7O2FjY3VtdWxhdG9yIGNhY2hlIGJlIHBsYWNlZCBjbG9zZSB0b2dldGhlciB0byBhdm9pZCBhbnkKKzs7aW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBydWluIHRoZSBhY2N1bXVsYXRvciBjYWNoZSBjb21lIGluYmV0d2Vlbi4KKyhkZWZpbmVfYnlwYXNzIDQgIm1hY2hoX3dfb3AiICJhbHVfb3AsYWx1Ml9vcCxhbHVfc2F0X29wLGxvYWRfb3AiICJhdnIzMl9tdWxfd2F3X2J5cGFzcyIpCisoZGVmaW5lX2J5cGFzcyA1ICJtYWN3d193X29wIiAiYWx1X29wLGFsdTJfb3AsYWx1X3NhdF9vcCxsb2FkX29wIiAiYXZyMzJfbXVsX3dhd19ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgNyAibWFjd3dfZF9vcCIgImFsdV9vcCxhbHUyX29wLGFsdV9zYXRfb3AsbG9hZF9vcCIgImF2cjMyX211bF93YXdfYnlwYXNzIikKKworKGRlZmluZV9ieXBhc3MgMyAibXVsaGhfb3AiICJhbHVfb3AsYWx1Ml9vcCxhbHVfc2F0X29wLGxvYWRfb3AiICJhdnIzMl9tdWxfd2F3X2J5cGFzcyIpCisoZGVmaW5lX2J5cGFzcyA0ICJtdWx3d193X29wIiAiYWx1X29wLGFsdTJfb3AsYWx1X3NhdF9vcCxsb2FkX29wIiAiYXZyMzJfbXVsX3dhd19ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgNiAibXVsd3dfZF9vcCIgImFsdV9vcCxhbHUyX29wLGFsdV9zYXRfb3AsbG9hZF9vcCIgImF2cjMyX211bF93YXdfYnlwYXNzIikKKworCis7O0J5cGFzc2VzIGZvciBhbGwgbXVsL21hYyBpbnN0cnVjdGlvbnMgZm9sbG93ZWQgYnkgYW4gaW5zdHJ1Y3Rpb24KKzs7d2hpY2ggcmVhZHMgdGhlIG91dHB1dCBBTkQgd3JpdGVzIHRoZSByZXN1bHQgdG8gdGhlIHNhbWUgcmVnaXN0ZXIuCis7O1RoaXMgd2lsbCBnZW5lcmF0ZSBhbiBXcml0ZSBBZnRlciBXcml0ZSBoYXphcmQgd2hpY2ggZ2l2ZXMgYW4KKzs7ZXh0cmEgY3ljbGUgYmVmb3JlIHRoZSByZXN1bHQgaXMgcmVhZHkuCisoZGVmaW5lX2J5cGFzcyAwICJtYWNoaF93X29wIiAibWFjaGhfd19vcCIgImF2cjMyX3ZhbGlkX21hY21hY19ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgMCAibWFjd3dfd19vcCIgIm1hY3d3X3dfb3AiICJhdnIzMl92YWxpZF9tYWNtYWNfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDAgIm1hY3d3X2Rfb3AiICJtYWN3d19kX29wIiAiYXZyMzJfdmFsaWRfbWFjbWFjX2J5cGFzcyIpCisKKyhkZWZpbmVfYnlwYXNzIDAgIm11bGhoX29wIiAibWFjaGhfd19vcCIgImF2cjMyX3ZhbGlkX211bG1hY19ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgMCAibXVsd3dfd19vcCIgIm1hY3d3X3dfb3AiICJhdnIzMl92YWxpZF9tdWxtYWNfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDAgIm11bHd3X2Rfb3AiICJtYWN3d19kX29wIiAiYXZyMzJfdmFsaWRfbXVsbWFjX2J5cGFzcyIpCisKKzs7QnJhbmNoIGFuZCBjYWxsIGluc3RydWN0aW9ucworOztXZSBhc3N1bWUgdGhhdCBhbGwgYnJhbmNoZXMgYW5kIHJjYWxscyBhcmUgcHJlZGljdGVkIGNvcnJlY3RseSA6LSkKKzs7d2hpbGUgY2FsbHMgdXNlIGEgbG90IG9mIGN5Y2xlcy4KKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAiYnJhbmNoX29wIiAwCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAiYnJhbmNoIikpCisgICJub3RoaW5nIikKKworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJjYWxsX29wIiAxMAorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgImNhbGwiKSkKKyAgIm5vdGhpbmciKQorCisKKzs7TG9hZCBzdG9yZSBpbnN0cnVjdGlvbnMKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAibG9hZF9vcCIgMgorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgImxvYWQiKSkKKyAgImlzLGRhLGQiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImxvYWRfcm1fb3AiIDMKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJsb2FkX3JtIikpCisgICJpcyxkYSxkIikKKworCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gInN0b3JlX29wIiAwCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAic3RvcmUiKSkKKyAgImlzLGRhLGQiKQorCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAibG9hZF9kb3VibGVfb3AiIDMKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJsb2FkMiIpKQorICAiaXMsZGEsZGErZCxkIikKKworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJsb2FkX3F1YWRfb3AiIDQKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJsb2FkNCIpKQorICAiaXMsZGEsZGErZCxkYStkLGQiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gInN0b3JlX2RvdWJsZV9vcCIgMAorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgInN0b3JlMiIpKQorICAiaXMsZGEsZGErZCxkIikKKworCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gInN0b3JlX3F1YWRfb3AiIDAKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJzdG9yZTQiKSkKKyAgImlzLGRhLGRhK2QsZGErZCxkIikKKworOztGb3Igc3RvcmUgdGhlIG9wZXJhbmQgdG8gd3JpdGUgdG8gbWVtb3J5IGlzIHJlYWQgaW4gZCBhbmQKKzs7dGhlIHJlYWwgbGF0ZW5jeSBiZXR3ZWVuIGFueSBpbnN0cnVjdGlvbiBhbmQgYSBzdG9yZSBpcyB0aGVyZWZvcmUKKzs7b25lIGxlc3MgdGhhbiBmb3IgdGhlIGluc3RydWN0aW9ucyB3aGljaCByZWFkcyB0aGUgb3BlcmFuZHMgaW4gdGhlIGZpcnN0Cis7O2V4Y2VjdXRpb24gc3RhZ2UKKyhkZWZpbmVfYnlwYXNzIDIgImxvYWRfZG91YmxlX29wIiAic3RvcmVfZG91YmxlX29wIiAiYXZyMzJfc3RvcmVfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDMgImxvYWRfcXVhZF9vcCIgInN0b3JlX3F1YWRfb3AiICJhdnIzMl9zdG9yZV9ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgMSAibG9hZF9vcCIgInN0b3JlX29wIiAiYXZyMzJfc3RvcmVfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDIgImxvYWRfcm1fb3AiICJzdG9yZV9vcCIgImF2cjMyX3N0b3JlX2J5cGFzcyIpCisoZGVmaW5lX2J5cGFzcyAxICJhbHVfc2F0X29wIiAic3RvcmVfb3AiICJhdnIzMl9zdG9yZV9ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgMSAiYWx1Ml9vcCIgInN0b3JlX29wIiAiYXZyMzJfc3RvcmVfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDEgIm11bGhoX29wIiAic3RvcmVfb3AiICJhdnIzMl9zdG9yZV9ieXBhc3MiKQorKGRlZmluZV9ieXBhc3MgMiAibXVsd3dfd19vcCIgInN0b3JlX29wIiAiYXZyMzJfc3RvcmVfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDQgIm11bHd3X2Rfb3AiICJzdG9yZV9vcCIgImF2cjMyX3N0b3JlX2J5cGFzcyIgKQorKGRlZmluZV9ieXBhc3MgMiAibWFjaGhfd19vcCIgInN0b3JlX29wIiAiYXZyMzJfc3RvcmVfYnlwYXNzIikKKyhkZWZpbmVfYnlwYXNzIDMgIm1hY3d3X3dfb3AiICJzdG9yZV9vcCIgImF2cjMyX3N0b3JlX2J5cGFzcyIpCisoZGVmaW5lX2J5cGFzcyA1ICJtYWN3d19kX29wIiAic3RvcmVfb3AiICJhdnIzMl9zdG9yZV9ieXBhc3MiKQorCisKKzsgQnlwYXNzIGZvciBsb2FkIGRvdWJsZSBvcGVyYXRpb24uIElmIG9ubHkgdGhlIGZpcnN0IGxvYWRlZCB3b3JkIGlzIG5lZWRlZAorOyB0aGVuIHRoZSBsYXRlbmN5IGlzIDIKKyhkZWZpbmVfYnlwYXNzIDIgImxvYWRfZG91YmxlX29wIgorICAgICAgICAgICAgICAgICAibG9hZF9vcCxsb2FkX3JtX29wLGFsdV9zYXRfb3AsIGFsdTJfb3AsIGFsdV9vcCwgbXVsaGhfb3AsIG11bHd3X3dfb3AsCisgICAgICAgICAgICAgICAgICBtdWx3d19kX29wLCBtYWNoaF93X29wLCBtYWN3d193X29wLCBtYWN3d19kX29wIgorICAgICAgICAgICAgICAgICAiYXZyMzJfdmFsaWRfbG9hZF9kb3VibGVfYnlwYXNzIikKKworOyBCeXBhc3MgZm9yIGxvYWQgcXVhZCBvcGVyYXRpb24uIElmIG9ubHkgdGhlIGZpcnN0IG9yIHNlY29uZCBsb2FkZWQgd29yZCBpcyBuZWVkZWQKKzsgd2Ugc2V0IHRoZSBsYXRlbmN5IHRvIDIKKyhkZWZpbmVfYnlwYXNzIDIgImxvYWRfcXVhZF9vcCIKKyAgICAgICAgICAgICAgICAgImxvYWRfb3AsbG9hZF9ybV9vcCxhbHVfc2F0X29wLCBhbHUyX29wLCBhbHVfb3AsIG11bGhoX29wLCBtdWx3d193X29wLAorICAgICAgICAgICAgICAgICAgbXVsd3dfZF9vcCwgbWFjaGhfd19vcCwgbWFjd3dfd19vcCwgbWFjd3dfZF9vcCIKKyAgICAgICAgICAgICAgICAgImF2cjMyX3ZhbGlkX2xvYWRfcXVhZF9ieXBhc3MiKQorCisKKzs7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7OyBFbmQgb2YgQXV0b21hdG9uIHBpcGVsaW5lIGRlc2NyaXB0aW9uIGZvciBhdnIzMgorOzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKGRlZmluZV9jb25kX2V4ZWMKKyAgWyhtYXRjaF9vcGVyYXRvciAwICJhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIgorICAgIFsobWF0Y2hfb3BlcmFuZDpDTVAgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSAgICAgICAgIAorICAgICAobWF0Y2hfb3BlcmFuZDpDTVAgMiAiPENNUDpjbXBfcHJlZGljYXRlPiIgIjxDTVA6Y21wX2NvbnN0cmFpbnQ+IildKV0KKyAgIlRBUkdFVF9WMl9JTlNOUyIgCisgICIlISIKKykKKworKGRlZmluZV9jb25kX2V4ZWMKKyAgWyhtYXRjaF9vcGVyYXRvciAwICJhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIgorICAgICBbKGFuZDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpICAgICAgICAgCisgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgIm9uZV9iaXRfc2V0X29wZXJhbmQiICJpIikpCisgICAgICAoY29uc3RfaW50IDApXSldCisgICJUQVJHRVRfVjJfSU5TTlMiIAorICAiJSEiCisgICkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgbW92ZQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKzs7PT0gY2hhciAtIDggYml0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfZXhwYW5kICJtb3ZxaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UUkgMCAibm9uaW1tZWRpYXRlX29wZXJhbmQiICIiKQorCShtYXRjaF9vcGVyYW5kOlFJIDEgImdlbmVyYWxfb3BlcmFuZCIgIiIpKV0KKyAgIiIKKyAgeworICAgaWYgKCAhbm9fbmV3X3BzZXVkb3MgKXsKKyAgICAgaWYgKEdFVF9DT0RFIChvcGVyYW5kc1sxXSkgPT0gTUVNICYmIG9wdGltaXplKXsKKyAgICAgICAgIHJ0eCByZWcgPSBnZW5fcmVnX3J0eCAoU0ltb2RlKTsKKworICAgICAgICAgZW1pdF9pbnNuIChnZW5femVyb19leHRlbmRxaXNpMiAocmVnLCBvcGVyYW5kc1sxXSkpOworICAgICAgICAgb3BlcmFuZHNbMV0gPSBnZW5fbG93cGFydCAoUUltb2RlLCByZWcpOworICAgICB9CisKKyAgICAgLyogT25lIG9mIHRoZSBvcHMgaGFzIHRvIGJlIGluIGEgcmVnaXN0ZXIuICAqLworICAgICBpZiAoR0VUX0NPREUgKG9wZXJhbmRzWzBdKSA9PSBNRU0pCisgICAgICAgb3BlcmFuZHNbMV0gPSBmb3JjZV9yZWcgKFFJbW9kZSwgb3BlcmFuZHNbMV0pOworICAgfQorCisgIH0pCisKKyhkZWZpbmVfaW5zbiAiKm1vdnFpX2ludGVybmFsIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpRSSAwICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIj1yLHIsbSxyIikKKwkobWF0Y2hfb3BlcmFuZDpRSSAxICJnZW5lcmFsX29wZXJhbmQiICAicktzMDgsbSxyLGkiKSldCisgICJyZWdpc3Rlcl9vcGVyYW5kIChvcGVyYW5kc1swXSwgUUltb2RlKQorICAgfHwgcmVnaXN0ZXJfb3BlcmFuZCAob3BlcmFuZHNbMV0sIFFJbW9kZSkiCisgICJACisgICBtb3ZcdCUwLCAlMQorICAgbGQudWJcdCUwLCAlMQorICAgc3QuYlx0JTAsICUxCisgICBtb3ZcdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiw0LDQsNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUsbG9hZF9ybSxzdG9yZSxhbHUiKV0pCisKKworCis7Oz09IHNob3J0IC0gMTYgYml0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2V4cGFuZCAibW92aGkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiIikKKwkobWF0Y2hfb3BlcmFuZDpISSAxICJnZW5lcmFsX29wZXJhbmQiICIiKSldCisgICIiCisgIHsKKyAgIGlmICggIW5vX25ld19wc2V1ZG9zICl7CisgICAgIGlmIChHRVRfQ09ERSAob3BlcmFuZHNbMV0pID09IE1FTSAmJiBvcHRpbWl6ZSl7CisgICAgICAgICBydHggcmVnID0gZ2VuX3JlZ19ydHggKFNJbW9kZSk7CisKKyAgICAgICAgIGVtaXRfaW5zbiAoZ2VuX2V4dGVuZGhpc2kyIChyZWcsIG9wZXJhbmRzWzFdKSk7CisgICAgICAgICBvcGVyYW5kc1sxXSA9IGdlbl9sb3dwYXJ0IChISW1vZGUsIHJlZyk7CisgICAgIH0KKworICAgICAvKiBPbmUgb2YgdGhlIG9wcyBoYXMgdG8gYmUgaW4gYSByZWdpc3Rlci4gICovCisgICAgIGlmIChHRVRfQ09ERSAob3BlcmFuZHNbMF0pID09IE1FTSkKKyAgICAgICBvcGVyYW5kc1sxXSA9IGZvcmNlX3JlZyAoSEltb2RlLCBvcGVyYW5kc1sxXSk7CisgICB9CisKKyAgfSkKKworCisoZGVmaW5lX2luc24gIiptb3ZoaV9pbnRlcm5hbCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAibm9uaW1tZWRpYXRlX29wZXJhbmQiICI9cixyLG0sciIpCisJKG1hdGNoX29wZXJhbmQ6SEkgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgInJLczA4LG0scixpIikpXQorICAicmVnaXN0ZXJfb3BlcmFuZCAob3BlcmFuZHNbMF0sIEhJbW9kZSkKKyAgIHx8IHJlZ2lzdGVyX29wZXJhbmQgKG9wZXJhbmRzWzFdLCBISW1vZGUpIgorICAiQAorICAgbW92XHQlMCwgJTEKKyAgIGxkLnNoXHQlMCwgJTEKKyAgIHN0LmhcdCUwLCAlMQorICAgbW92XHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCw0LDQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1LGxvYWRfcm0sc3RvcmUsYWx1IildKQorCisKKzs7PT0gaW50IC0gMzIgYml0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9leHBhbmQgIm1vdm1pc2FsaWduc2kiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiIikKKwkobWF0Y2hfb3BlcmFuZDpTSSAxICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIiIpKV0KKyAgIlRBUkdFVF9VTkFMSUdORURfV09SRCIKKyAgeworICB9CispCisKKworKGRlZmluZV9leHBhbmQgIm1vdjxtb2RlPiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6TU9WTSAwICJhdnIzMl9ub25fcm13X25vbmltbWVkaWF0ZV9vcGVyYW5kIiAiIikKKwkobWF0Y2hfb3BlcmFuZDpNT1ZNIDEgImF2cjMyX25vbl9ybXdfZ2VuZXJhbF9vcGVyYW5kIiAiIikpXQorICAiIgorICB7CisKKyAgICAvKiBPbmUgb2YgdGhlIG9wcyBoYXMgdG8gYmUgaW4gYSByZWdpc3Rlci4gICovCisgICAgaWYgKEdFVF9DT0RFIChvcGVyYW5kc1swXSkgPT0gTUVNKQorICAgICAgb3BlcmFuZHNbMV0gPSBmb3JjZV9yZWcgKDxNT0RFPm1vZGUsIG9wZXJhbmRzWzFdKTsKKworCisgICAgLyogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBpbW1lZGlhdGUgY29uc3RhbnRzIGFzIHRoZXNlIG1heQorICAgICAgIG9jY3VyIGR1cmluZyByZWxvYWRpbmcsIHNpbmNlIGl0IHNlZW1zIGxpa2UgcmVsb2FkIGRvZXMKKyAgICAgICBub3QgY2hlY2sgaWYgdGhlIGltbWVkaWF0ZSBpcyBsZWdpdGltYXRlLiBEb24ndCBrbm93IGlmCisgICAgICAgdGhpcyBpcyBhIGJ1Zz8gKi8KKyAgICBpZiAoIHJlbG9hZF9pbl9wcm9ncmVzcworICAgICAgICAgJiYgYXZyMzJfaW1tX2luX2NvbnN0X3Bvb2wKKyAgICAgICAgICYmIEdFVF9DT0RFKG9wZXJhbmRzWzFdKSA9PSBDT05TVF9JTlQKKyAgICAgICAgICYmICFhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wKElOVFZBTChvcGVyYW5kc1sxXSksICdLJywgIktzMjEiKSApeworICAgICAgICBvcGVyYW5kc1sxXSA9IGZvcmNlX2NvbnN0X21lbShTSW1vZGUsIG9wZXJhbmRzWzFdKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgUk1XIG1lbW9yeSBvcGVyYW5kcy4gVGhleSBhcmUgbm90IGFsbG93ZWQgZm9yIG1vdiBvcGVyYXRpb25zCisgICAgICAgb25seSB0aGUgYXRvbWljIG1lbWMvcy90IG9wZXJhdGlvbnMgKi8KKyAgICBpZiAoICFyZWxvYWRfaW5fcHJvZ3Jlc3MKKyAgICAgICAgICYmIGF2cjMyX3Jtd19tZW1vcnlfb3BlcmFuZCAob3BlcmFuZHNbMF0sIDxNT0RFPm1vZGUpICl7CisgICAgICAgb3BlcmFuZHNbMF0gPSBjb3B5X3J0eCAob3BlcmFuZHNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgWEVYUChvcGVyYW5kc1swXSwgMCkgPSBmb3JjZV9yZWcgKDxNT0RFPm1vZGUsIFhFWFAob3BlcmFuZHNbMF0sIDApKTsKKyAgICB9CisKKyAgICBpZiAoICFyZWxvYWRfaW5fcHJvZ3Jlc3MKKyAgICAgICAgICYmIGF2cjMyX3Jtd19tZW1vcnlfb3BlcmFuZCAob3BlcmFuZHNbMV0sIDxNT0RFPm1vZGUpICl7CisgICAgICAgb3BlcmFuZHNbMV0gPSBjb3B5X3J0eCAob3BlcmFuZHNbMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgWEVYUChvcGVyYW5kc1sxXSwgMCkgPSBmb3JjZV9yZWcgKDxNT0RFPm1vZGUsIFhFWFAob3BlcmFuZHNbMV0sIDApKTsKKyAgICB9CisKKyAgICBpZiAoIChmbGFnX3BpYyB8fCBUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MpCisgICAgICAgICAmJiAhYXZyMzJfbGVnaXRpbWF0ZV9waWNfb3BlcmFuZF9wKG9wZXJhbmRzWzFdKSApCisgICAgICBvcGVyYW5kc1sxXSA9IGxlZ2l0aW1pemVfcGljX2FkZHJlc3MgKG9wZXJhbmRzWzFdLCA8TU9ERT5tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9fbmV3X3BzZXVkb3MgPyBvcGVyYW5kc1swXSA6IDApKTsKKyAgICBlbHNlIGlmICggZmxhZ19waWMgJiYgYXZyMzJfYWRkcmVzc19vcGVyYW5kKG9wZXJhbmRzWzFdLCBHRVRfTU9ERShvcGVyYW5kc1sxXSkpICkKKyAgICAgIC8qIElmIHdlIGhhdmUgYW4gYWRkcmVzcyBvcGVyYW5kIHRoZW4gdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBwaWMgcmVnaXN0ZXIuICovCisgICAgICBjdXJyZW50X2Z1bmN0aW9uX3VzZXNfcGljX29mZnNldF90YWJsZSA9IDE7CisgIH0pCisKKworCisoZGVmaW5lX2luc24gIm1vdjxtb2RlPl9pbnRlcm5hbCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6TU9WTSAwICJhdnIzMl9ub25fcm13X25vbmltbWVkaWF0ZV9vcGVyYW5kIiAiPXIsICAgciwgICByLHIscixRLHIiKQorCShtYXRjaF9vcGVyYW5kOk1PVk0gMSAiYXZyMzJfbm9uX3Jtd19nZW5lcmFsX29wZXJhbmQiICAgICAgInJLczA4LEtzMjEsSixuLFEscixXIikpXQorICAiKHJlZ2lzdGVyX29wZXJhbmQgKG9wZXJhbmRzWzBdLCA8TU9ERT5tb2RlKQorICAgIHx8IHJlZ2lzdGVyX29wZXJhbmQgKG9wZXJhbmRzWzFdLCA8TU9ERT5tb2RlKSkKKyAgICYmICFhdnIzMl9ybXdfbWVtb3J5X29wZXJhbmQgKG9wZXJhbmRzWzBdLCA8TU9ERT5tb2RlKSAKKyAgICYmICFhdnIzMl9ybXdfbWVtb3J5X29wZXJhbmQgKG9wZXJhbmRzWzFdLCA8TU9ERT5tb2RlKSIKKyAgeworICAgIHN3aXRjaCAod2hpY2hfYWx0ZXJuYXRpdmUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMTogcmV0dXJuICJtb3ZcdCUwLCAlMSI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmICggVEFSR0VUX1YyX0lOU05TICkKKyAgICAgICAgICAgcmV0dXJuICJtb3ZoXHQlMCwgaGkoJTEpIjsKKyAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICAgIGNhc2UgMzogcmV0dXJuICJtb3ZcdCUwLCBsbyglMSlcO29yaFx0JTAsaGkoJTEpIjsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKCAoUkVHX1AoWEVYUChvcGVyYW5kc1sxXSwgMCkpCisgICAgICAgICAgICAgICYmIFJFR05PKFhFWFAob3BlcmFuZHNbMV0sIDApKSA9PSBTUF9SRUdOVU0pCisgICAgICAgICAgICAgfHwgKEdFVF9DT0RFKFhFWFAob3BlcmFuZHNbMV0sIDApKSA9PSBQTFVTCisgICAgICAgICAgICAgICAgICYmIFJFR05PKFhFWFAoWEVYUChvcGVyYW5kc1sxXSwgMCksIDApKSA9PSBTUF9SRUdOVU0KKwkgICAgICAgICAmJiBHRVRfQ09ERShYRVhQKFhFWFAob3BlcmFuZHNbMV0sIDApLCAxKSkgPT0gQ09OU1RfSU5UCisJICAgICAgICAgJiYgSU5UVkFMKFhFWFAoWEVYUChvcGVyYW5kc1sxXSwgMCksIDEpKSAlIDQgPT0gMAorCSAgICAgICAgICYmIElOVFZBTChYRVhQKFhFWFAob3BlcmFuZHNbMV0sIDApLCAxKSkgPD0gMHgxRkMpICkKKyAgICAgICAgICByZXR1cm4gImxkZHNwXHQlMCwgJTEiOworCWVsc2UgaWYgKCBhdnIzMl9jb25zdF9wb29sX3JlZl9vcGVyYW5kKG9wZXJhbmRzWzFdLCBHRVRfTU9ERShvcGVyYW5kc1sxXSkpICkKKyAgICAgICAgICByZXR1cm4gImxkZHBjXHQlMCwgJTEiOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuICJsZC53XHQlMCwgJTEiOworICAgICAgY2FzZSA1OgorICAgICAgICBpZiAoIChSRUdfUChYRVhQKG9wZXJhbmRzWzBdLCAwKSkKKyAgICAgICAgICAgICAgJiYgUkVHTk8oWEVYUChvcGVyYW5kc1swXSwgMCkpID09IFNQX1JFR05VTSkKKyAgICAgICAgICAgICB8fCAoR0VUX0NPREUoWEVYUChvcGVyYW5kc1swXSwgMCkpID09IFBMVVMKKyAgICAgICAgICAgICAgICAgJiYgUkVHTk8oWEVYUChYRVhQKG9wZXJhbmRzWzBdLCAwKSwgMCkpID09IFNQX1JFR05VTQorCSAgICAgICAgICYmIEdFVF9DT0RFKFhFWFAoWEVYUChvcGVyYW5kc1swXSwgMCksIDEpKSA9PSBDT05TVF9JTlQKKwkgICAgICAgICAmJiBJTlRWQUwoWEVYUChYRVhQKG9wZXJhbmRzWzBdLCAwKSwgMSkpICUgNCA9PSAwCisJICAgICAgICAgJiYgSU5UVkFMKFhFWFAoWEVYUChvcGVyYW5kc1swXSwgMCksIDEpKSA8PSAweDFGQykgKQorICAgICAgICAgIHJldHVybiAic3Rkc3BcdCUwLCAlMSI7CisJZWxzZQorICAgICAgICAgIHJldHVybiAic3Qud1x0JTAsICUxIjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKCBUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MgKQorICAgICAgICAgIHJldHVybiAibGRhLndcdCUwLCAlMSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gImxkLndcdCUwLCByNlslMUBnb3RdIjsKKyAgICAgIGRlZmF1bHQ6CisJYWJvcnQoKTsKKyAgICB9CisgIH0KKyAgCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCw0LDgsNCw0LDgiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1LGFsdSxhbHUsYWx1Mixsb2FkLHN0b3JlLGxvYWQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUsbm9uZSxzZXRfel9pZl9ub3RfdjIsc2V0X3osbm9uZSxub25lLGNsb2JiZXIiKV0pCisKKworKGRlZmluZV9leHBhbmQgInJlbG9hZF9vdXRfcm13X21lbW9yeV9vcGVyYW5kIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAwICJhZGRyZXNzX29wZXJhbmQiICIiKSkKKyAgIChzZXQgKG1lbTpTSSAobWF0Y2hfZHVwIDIpKQorICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpXQorICAiIgorICB7CisgICBvcGVyYW5kc1swXSA9IFhFWFAob3BlcmFuZHNbMF0sIDApOworICB9CispCisKKyhkZWZpbmVfZXhwYW5kICJyZWxvYWRfaW5fcm13X21lbW9yeV9vcGVyYW5kIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJhZGRyZXNzX29wZXJhbmQiICIiKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChtZW06U0kgKG1hdGNoX2R1cCAyKSkpXQorICAiIgorICB7CisgICBvcGVyYW5kc1sxXSA9IFhFWFAob3BlcmFuZHNbMV0sIDApOworICB9CispCisKKworOzsgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgbG9hZGluZyBjb25zdGFudHMgd2hpY2ggY2Fubm90IGJlIGxvYWRlZAorOzsgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RhbnQgcG9vbCBiZWNhdXNlIHRoZSBvZmZzZXQgaXMgdG9vIGxhcmdlCis7OyBoaWdoIGFuZCBsb19zdW0gYXJlIHVzZWQgZXZlbiB0b3VnaCBmb3Igb3VyIGNhc2UgaXQgc2hvdWxkIGJlCis7OyBsb3cgYW5kIGhpZ2ggc3VtIDotKQorKGRlZmluZV9pbnNuICJtb3Zfc3ltYm9sX2xvIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShoaWdoOlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgImltbWVkaWF0ZV9vcGVyYW5kIiAiaSIgKSkpXQorICAiIgorICAibW92XHQlMCwgbG8oJTEpIgorICBbKHNldF9hdHRyICJ0eXBlIiAiYWx1IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorKQorCisoZGVmaW5lX2luc24gImFkZF9zeW1ib2xfaGkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKGxvX3N1bTpTSSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJpIiApKSldCisgICIiCisgICJvcmhcdCUwLCBoaSglMSkiCisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHUiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IildCispCisKKworCis7OyBXaGVuIGdlbmVyYXRpbmcgcGljLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIHN5bWJvbCBvZmZzZXQgaW50byBhIHJlZ2lzdGVyLgorOzsgU28gdGhhdCB0aGUgb3B0aW1pemVyIGRvZXMgbm90IGNvbmZ1c2UgdGhpcyB3aXRoIGEgbm9ybWFsIHN5bWJvbCBsb2FkCis7OyB3ZSB1c2UgYW4gdW5zcGVjLiAgVGhlIG9mZnNldCB3aWxsIGJlIGxvYWRlZCBmcm9tIGEgY29uc3RhbnQgcG9vbCBlbnRyeSwKKzs7IHNpbmNlIHRoYXQgaXMgdGhlIG9ubHkgdHlwZSBvZiByZWxvY2F0aW9uIHdlIGNhbiB1c2UuCisoZGVmaW5lX2luc24gInBpY19sb2FkX2FkZHIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHVuc3BlYzpTSSBbKG1hdGNoX29wZXJhbmQ6U0kgMSAiIiAiIildIFVOU1BFQ19QSUNfU1lNKSldCisgICJmbGFnX3BpYyAmJiBDT05TVEFOVF9QT09MX0FERFJFU1NfUChYRVhQKG9wZXJhbmRzWzFdLCAwKSkiCisgICJsZGRwY1x0JTAsICUxIgorICBbKHNldF9hdHRyICJ0eXBlIiAibG9hZCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKV0KKykKKworKGRlZmluZV9pbnNuICJwaWNfY29tcHV0ZV9nb3RfZnJvbV9wYyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIityIikKKwkodW5zcGVjOlNJIFsobWludXM6U0kgKHBjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAwKSldIFVOU1BFQ19QSUNfQkFTRSkpCisgICAodXNlIChsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMSAiIiAiIikpKV0KKyAgImZsYWdfcGljIgorICB7CisgICAoKnRhcmdldG0uYXNtX291dC5pbnRlcm5hbF9sYWJlbCkgKGFzbV9vdXRfZmlsZSwgIkwiLAorCSAJCSAgICAgQ09ERV9MQUJFTF9OVU1CRVIgKG9wZXJhbmRzWzFdKSk7CisgICByZXR1cm4gXCJyc3ViXHQlMCwgcGNcIjsKKyAgfQorICBbKHNldF9hdHRyICJjYyIgImNsb2JiZXIiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIyIildCispCisKKzs7PT0gbG9uZyBsb25nIGludCAtIDY0IGJpdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9leHBhbmQgIm1vdmRpIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpESSAwICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIiIpCisJKG1hdGNoX29wZXJhbmQ6REkgMSAiZ2VuZXJhbF9vcGVyYW5kIiAiIikpXQorICAiIgorICB7CisKKyAgICAvKiBPbmUgb2YgdGhlIG9wcyBoYXMgdG8gYmUgaW4gYSByZWdpc3Rlci4gICovCisgICAgaWYgKEdFVF9DT0RFIChvcGVyYW5kc1swXSkgIT0gUkVHKQorICAgICAgb3BlcmFuZHNbMV0gPSBmb3JjZV9yZWcgKERJbW9kZSwgb3BlcmFuZHNbMV0pOworCisgIH0pCisKKworKGRlZmluZV9pbnNuX2FuZF9zcGxpdCAiKm1vdmRpX2ludGVybmFsIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpESSAwICJub25pbW1lZGlhdGVfb3BlcmFuZCIgICAgICI9cixyLCAgIHIsICAgcixyLHIsbSIpCisJKG1hdGNoX29wZXJhbmQ6REkgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgICAgICAgICAiciwgS3MwOCxLczIxLEcsbixtLHIiKSldCisgICJyZWdpc3Rlcl9vcGVyYW5kIChvcGVyYW5kc1swXSwgREltb2RlKQorICAgfHwgcmVnaXN0ZXJfb3BlcmFuZCAob3BlcmFuZHNbMV0sIERJbW9kZSkiCisgIHsKKyAgICBzd2l0Y2ggKHdoaWNoX2FsdGVybmF0aXZlICl7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuICIjIjsKKyAgICBjYXNlIDU6CisgICAgICBpZiAoIGF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQob3BlcmFuZHNbMV0sIEdFVF9NT0RFKG9wZXJhbmRzWzFdKSkpCisgICAgICAgIHJldHVybiAibGQuZFx0JTAsIHBjWyUxIC0gLl0iOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gImxkLmRcdCUwLCAlMSI7CisgICAgY2FzZSA2OgorICAgICAgcmV0dXJuICJzdC5kXHQlMCwgJTEiOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorOzsgTGV0cyBzcGxpdCBhbGwgcmVnLT5yZWcgb3IgaW1tLT5yZWcgdHJhbnNmZXJzIGludG8gdHdvIFNJbW9kZSB0cmFuc2ZlcnMgCisgICJyZWxvYWRfY29tcGxldGVkICYmCisgICAoUkVHX1AgKG9wZXJhbmRzWzBdKSAmJgorICAgKFJFR19QIChvcGVyYW5kc1sxXSkgCisgICAgfHwgR0VUX0NPREUgKG9wZXJhbmRzWzFdKSA9PSBDT05TVF9JTlQKKyAgICB8fCBHRVRfQ09ERSAob3BlcmFuZHNbMV0pID09IENPTlNUX0RPVUJMRSkpIgorICBbKHNldCAobWF0Y2hfZHVwIDApIChtYXRjaF9kdXAgMSkpCisgICAoc2V0IChtYXRjaF9kdXAgMikgKG1hdGNoX2R1cCAzKSldCisgIHsKKyAgICBvcGVyYW5kc1syXSA9IGdlbl9oaWdocGFydCAoU0ltb2RlLCBvcGVyYW5kc1swXSk7CisgICAgb3BlcmFuZHNbMF0gPSBnZW5fbG93cGFydCAoU0ltb2RlLCBvcGVyYW5kc1swXSk7CisgICAgaWYgKCBSRUdfUChvcGVyYW5kc1sxXSkgKXsKKyAgICAgIG9wZXJhbmRzWzNdID0gZ2VuX2hpZ2hwYXJ0KFNJbW9kZSwgb3BlcmFuZHNbMV0pOworICAgICAgb3BlcmFuZHNbMV0gPSBnZW5fbG93cGFydChTSW1vZGUsIG9wZXJhbmRzWzFdKTsKKyAgICB9IGVsc2UgaWYgKCBHRVRfQ09ERShvcGVyYW5kc1sxXSkgPT0gQ09OU1RfRE9VQkxFIAorICAgICAgICAgICAgICAgIHx8IEdFVF9DT0RFKG9wZXJhbmRzWzFdKSA9PSBDT05TVF9JTlQgKXsKKyAgICAgIHJ0eCBzcGxpdF9jb25zdFsyXTsKKyAgICAgIGF2cjMyX3NwbGl0X2NvbnN0X2V4cHIgKERJbW9kZSwgU0ltb2RlLCBvcGVyYW5kc1sxXSwgc3BsaXRfY29uc3QpOworICAgICAgb3BlcmFuZHNbM10gPSBzcGxpdF9jb25zdFsxXTsKKyAgICAgIG9wZXJhbmRzWzFdID0gc3BsaXRfY29uc3RbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIGludGVybmFsX2Vycm9yKCJJbGxlZ2FsIG9wZXJhbmRbMV0gZm9yIG1vdmRpIHNwbGl0ISIpOworICAgIH0KKyAgfQorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIiosKiwqLCosKiw0LDQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiKiwqLCosKiwqLGxvYWQyLHN0b3JlMiIpCisgICAoc2V0X2F0dHIgImNjIiAiKiwqLCosKiwqLG5vbmUsbm9uZSIpXSkKKworCis7Oz09IDEyOCBiaXRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2V4cGFuZCAibW92dGkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlRJIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiIikKKwkobWF0Y2hfb3BlcmFuZDpUSSAxICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIiIpKV0KKyAgIlRBUkdFVF9BUkNIX0FQIiAgICAKKyAgeyAgICAgCisgICAgICAgIAorICAgIC8qIE9uZSBvZiB0aGUgb3BzIGhhcyB0byBiZSBpbiBhIHJlZ2lzdGVyLiAgKi8KKyAgICBpZiAoR0VUX0NPREUgKG9wZXJhbmRzWzBdKSAhPSBSRUcpCisgICAgICBvcGVyYW5kc1sxXSA9IGZvcmNlX3JlZyAoVEltb2RlLCBvcGVyYW5kc1sxXSk7CisKKyAgICAvKiBXZSBtdXN0IGZpeCBhbnkgcHJlX2RlYyBmb3IgbG9hZHMgYW5kIHBvc3RfaW5jIHN0b3JlcyAqLworICAgIGlmICggR0VUX0NPREUgKG9wZXJhbmRzWzBdKSA9PSBNRU0KKyAgICAgICAgICYmIEdFVF9DT0RFIChYRVhQKG9wZXJhbmRzWzBdLDApKSA9PSBQT1NUX0lOQyApeworICAgICAgIGVtaXRfbW92ZV9pbnNuKGdlbl9ydHhfTUVNKFRJbW9kZSwgWEVYUChYRVhQKG9wZXJhbmRzWzBdLDApLDApKSwgb3BlcmFuZHNbMV0pOworICAgICAgIGVtaXRfaW5zbihnZW5fYWRkc2kzKFhFWFAoWEVYUChvcGVyYW5kc1swXSwwKSwwKSwgWEVYUChYRVhQKG9wZXJhbmRzWzBdLDApLDApLCBHRU5fSU5UKEdFVF9NT0RFX1NJWkUoVEltb2RlKSkpKTsKKyAgICAgICBET05FOworICAgIH0KKworICAgIGlmICggR0VUX0NPREUgKG9wZXJhbmRzWzFdKSA9PSBNRU0KKyAgICAgICAgICYmIEdFVF9DT0RFIChYRVhQKG9wZXJhbmRzWzFdLDApKSA9PSBQUkVfREVDICl7CisgICAgICAgZW1pdF9pbnNuKGdlbl9hZGRzaTMoWEVYUChYRVhQKG9wZXJhbmRzWzFdLDApLDApLCBYRVhQKFhFWFAob3BlcmFuZHNbMV0sMCksMCksIEdFTl9JTlQoLUdFVF9NT0RFX1NJWkUoVEltb2RlKSkpKTsKKyAgICAgICBlbWl0X21vdmVfaW5zbihvcGVyYW5kc1swXSwgZ2VuX3J0eF9NRU0oVEltb2RlLCBYRVhQKFhFWFAob3BlcmFuZHNbMV0sMCksMCkpKTsKKyAgICAgICBET05FOworICAgIH0KKyAgfSkKKworCisoZGVmaW5lX2luc25fYW5kX3NwbGl0ICIqbW92dGlfaW50ZXJuYWwiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlRJIDAgImF2cjMyX21vdnRpX2RzdF9vcGVyYW5kIiAgIj1yLCZyLCAgICByLCAgICA8Ukt1MDAscixyIikKKwkobWF0Y2hfb3BlcmFuZDpUSSAxICJhdnIzMl9tb3Z0aV9zcmNfb3BlcmFuZCIgICIgcixSS3UwMD4sUkt1MDAsciwgICAgIG4sVCIpKV0KKyAgIihyZWdpc3Rlcl9vcGVyYW5kIChvcGVyYW5kc1swXSwgVEltb2RlKQorICAgIHx8IHJlZ2lzdGVyX29wZXJhbmQgKG9wZXJhbmRzWzFdLCBUSW1vZGUpKSIKKyAgeworICAgIHN3aXRjaCAod2hpY2hfYWx0ZXJuYXRpdmUgKXsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAyOgorICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuICIjIjsKKyAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiAibGRtXHQlcDEsICUwIjsKKyAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiAic3RtXHQlcDAsICUxIjsKKyAgICBjYXNlIDU6CisgICAgICAgIHJldHVybiAibGQuZFx0JVUwLCBwY1slMSAtIC5dXDtsZC5kXHQlQjAsIHBjWyUxIC0gLiArIDhdIjsKKyAgICB9CisgIH0KKworICAicmVsb2FkX2NvbXBsZXRlZCAmJgorICAgKFJFR19QIChvcGVyYW5kc1swXSkgJiYKKyAgIChSRUdfUCAob3BlcmFuZHNbMV0pIAorICAgIC8qIElmIHRoaXMgaXMgYSBsb2FkIGZyb20gdGhlIGNvbnN0YW50IHBvb2wgd2Ugc3BsaXQgaXQgaW50bworICAgICAgIHR3byBkb3VibGUgbG9hZHMuICovCisgICAgfHwgKEdFVF9DT0RFIChvcGVyYW5kc1sxXSkgPT0gTUVNCisgICAgICAgICYmIEdFVF9DT0RFIChYRVhQIChvcGVyYW5kc1sxXSwgMCkpID09IFNZTUJPTF9SRUYKKyAgICAgICAgJiYgQ09OU1RBTlRfUE9PTF9BRERSRVNTX1AgKFhFWFAgKG9wZXJhbmRzWzFdLCAwKSkpICAgICAgICAgICAgICAgCisgICAgLyogSWYgdGhpcyBpcyBhIGxvYWQgd2hlcmUgdGhlIHBvaW50ZXIgcmVnaXN0ZXIgaXMgYSBwYXJ0CisgICAgICAgb2YgdGhlIHJlZ2lzdGVyIGxpc3QsIHdlIG11c3Qgc3BsaXQgaXQgaW50byB0d28gZG91YmxlCisgICAgICAgbG9hZHMgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIGV4Y2VwdGlvbiBzYWZlLiAqLworICAgIHx8IChHRVRfQ09ERSAob3BlcmFuZHNbMV0pID09IE1FTQorICAgICAgICAmJiByZWdpc3Rlcl9vcGVyYW5kIChYRVhQIChvcGVyYW5kc1sxXSwgMCksIFNJbW9kZSkKKyAgICAgICAgJiYgcmVnX292ZXJsYXBfbWVudGlvbmVkX3AgKG9wZXJhbmRzWzBdLCBYRVhQIChvcGVyYW5kc1sxXSwgMCkpKSAgICAgICAgICAgICAgIAorICAgIHx8IEdFVF9DT0RFIChvcGVyYW5kc1sxXSkgPT0gQ09OU1RfSU5UCisgICAgfHwgR0VUX0NPREUgKG9wZXJhbmRzWzFdKSA9PSBDT05TVF9ET1VCTEUpKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKSAobWF0Y2hfZHVwIDEpKQorICAgKHNldCAobWF0Y2hfZHVwIDIpIChtYXRjaF9kdXAgMykpXQorICB7CisgICAgb3BlcmFuZHNbMl0gPSBzaW1wbGlmeV9nZW5fc3VicmVnICggREltb2RlLCBvcGVyYW5kc1swXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEltb2RlLCAwICk7CisgICAgb3BlcmFuZHNbMF0gPSBzaW1wbGlmeV9nZW5fc3VicmVnICggREltb2RlLCBvcGVyYW5kc1swXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEltb2RlLCA4ICk7CisgICAgaWYgKCBSRUdfUChvcGVyYW5kc1sxXSkgKXsKKyAgICAgIG9wZXJhbmRzWzNdID0gc2ltcGxpZnlfZ2VuX3N1YnJlZyAoIERJbW9kZSwgb3BlcmFuZHNbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEltb2RlLCAwICk7CisgICAgICBvcGVyYW5kc1sxXSA9IHNpbXBsaWZ5X2dlbl9zdWJyZWcgKCBESW1vZGUsIG9wZXJhbmRzWzFdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJbW9kZSwgOCApOworICAgIH0gZWxzZSBpZiAoIEdFVF9DT0RFKG9wZXJhbmRzWzFdKSA9PSBDT05TVF9ET1VCTEUgCisgICAgICAgICAgICAgICAgfHwgR0VUX0NPREUob3BlcmFuZHNbMV0pID09IENPTlNUX0lOVCApeworICAgICAgcnR4IHNwbGl0X2NvbnN0WzJdOworICAgICAgYXZyMzJfc3BsaXRfY29uc3RfZXhwciAoVEltb2RlLCBESW1vZGUsIG9wZXJhbmRzWzFdLCBzcGxpdF9jb25zdCk7CisgICAgICBvcGVyYW5kc1szXSA9IHNwbGl0X2NvbnN0WzFdOworICAgICAgb3BlcmFuZHNbMV0gPSBzcGxpdF9jb25zdFswXTsKKyAgICB9IGVsc2UgaWYgKGF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQgKG9wZXJhbmRzWzFdLCBHRVRfTU9ERShvcGVyYW5kc1sxXSkpKXsKKyAgICAgIHJ0eCBzcGxpdF9jb25zdFsyXTsKKyAgICAgIHJ0eCBjb3AgPSBhdm9pZF9jb25zdGFudF9wb29sX3JlZmVyZW5jZSAob3BlcmFuZHNbMV0pOworICAgICAgaWYgKG9wZXJhbmRzWzFdID09IGNvcCkKKyAgICAgICAgY29wID0gZ2V0X3Bvb2xfY29uc3RhbnQgKFhFWFAgKG9wZXJhbmRzWzFdLCAwKSk7CisgICAgICBhdnIzMl9zcGxpdF9jb25zdF9leHByIChUSW1vZGUsIERJbW9kZSwgY29wLCBzcGxpdF9jb25zdCk7CisgICAgICBvcGVyYW5kc1szXSA9IGZvcmNlX2NvbnN0X21lbSAoREltb2RlLCBzcGxpdF9jb25zdFsxXSk7IAorICAgICAgb3BlcmFuZHNbMV0gPSBmb3JjZV9jb25zdF9tZW0gKERJbW9kZSwgc3BsaXRfY29uc3RbMF0pOyAKKyAgIH0gZWxzZSB7CisgICAgICBydHggcHRyX3JlZyA9IFhFWFAgKG9wZXJhbmRzWzFdLCAwKTsKKyAgICAgIG9wZXJhbmRzWzFdID0gZ2VuX3J0eF9NRU0gKERJbW9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fcnR4X1BMVVMgKCBTSW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VOX0lOVCAoOCkgKSk7CisgICAgICBvcGVyYW5kc1szXSA9IGdlbl9ydHhfTUVNIChESW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfcmVnKTsKKyAgICAgICAgICAgICAgCisgICAgICAvKiBDaGVjayBpZiB0aGUgZmlyc3QgbG9hZCB3aWxsIGNsb2JiZXIgdGhlIHBvaW50ZXIuCisgICAgICAgICBJZiBzbywgd2UgbXVzdCBzd2l0Y2ggdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiAqLworICAgICAgaWYgKCByZWdfb3ZlcmxhcF9tZW50aW9uZWRfcCAob3BlcmFuZHNbMF0sIHB0cl9yZWcpICkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdlIG5lZWQgdG8gc3dpdGNoIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucworICAgICAgICAgICAgIHNvIHRoYXQgdGhlIHBvaW50ZXIgcmVnaXN0ZXIgZG9lcyBub3QgZ2V0IGNsb2JiZXJlZAorICAgICAgICAgICAgIGFmdGVyIHRoZSBmaXJzdCBkb3VibGUgd29yZCBsb2FkLiAqLworICAgICAgICAgIHJ0eCB0bXA7CisgICAgICAgICAgdG1wID0gb3BlcmFuZHNbMF07CisgICAgICAgICAgb3BlcmFuZHNbMF0gPSBvcGVyYW5kc1syXTsKKyAgICAgICAgICBvcGVyYW5kc1syXSA9IHRtcDsKKyAgICAgICAgICB0bXAgPSBvcGVyYW5kc1sxXTsKKyAgICAgICAgICBvcGVyYW5kc1sxXSA9IG9wZXJhbmRzWzNdOworICAgICAgICAgIG9wZXJhbmRzWzNdID0gdG1wOworICAgICAgICB9CisKKworICAgfQorICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIiosKiw0LDQsKiw4IikKKyAgIChzZXRfYXR0ciAidHlwZSIgIiosKixsb2FkNCxzdG9yZTQsKixsb2FkNCIpXSkKKworCis7Oz09IGZsb2F0IC0gMzIgYml0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2V4cGFuZCAibW92c2YiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiIikKKwkobWF0Y2hfb3BlcmFuZDpTRiAxICJnZW5lcmFsX29wZXJhbmQiICIiKSldCisgICIiCisgIHsKKworCisgICAgLyogT25lIG9mIHRoZSBvcHMgaGFzIHRvIGJlIGluIGEgcmVnaXN0ZXIuICAqLworICAgIGlmIChHRVRfQ09ERSAob3BlcmFuZHNbMF0pICE9IFJFRykKKyAgICAgIG9wZXJhbmRzWzFdID0gZm9yY2VfcmVnIChTRm1vZGUsIG9wZXJhbmRzWzFdKTsKKworICB9KQorCisoZGVmaW5lX2luc24gIiptb3ZzZl9pbnRlcm5hbCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0YgMCAibm9uaW1tZWRpYXRlX29wZXJhbmQiICAgICAiPXIscixyLHIsbSIpCisJKG1hdGNoX29wZXJhbmQ6U0YgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgICAgICAgICAiciwgRyxGLG0sciIpKV0KKyAgIihyZWdpc3Rlcl9vcGVyYW5kIChvcGVyYW5kc1swXSwgU0Ztb2RlKQorICAgIHx8IHJlZ2lzdGVyX29wZXJhbmQgKG9wZXJhbmRzWzFdLCBTRm1vZGUpKSIKKyAgeworICAgIHN3aXRjaCAod2hpY2hfYWx0ZXJuYXRpdmUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMTogcmV0dXJuICJtb3ZcdCUwLCAlMSI7CisgICAgICBjYXNlIDI6IAorICAgICAgIHsKKyAgICAgICAgSE9TVF9XSURFX0lOVCB0YXJnZXRfZmxvYXRbMl07CisgICAgICAgIHJlYWxfdG9fdGFyZ2V0ICh0YXJnZXRfZmxvYXQsIENPTlNUX0RPVUJMRV9SRUFMX1ZBTFVFIChvcGVyYW5kc1sxXSksIFNGbW9kZSk7CisgICAgICAgIGlmICggVEFSR0VUX1YyX0lOU05TIAorICAgICAgICAgICAgICYmIGF2cjMyX2hpMTZfaW1tZWRpYXRlX29wZXJhbmQgKEdFTl9JTlQgKHRhcmdldF9mbG9hdFswXSksIFZPSURtb2RlKSApCisgICAgICAgICAgIHJldHVybiAibW92aFx0JTAsIGhpKCUxKSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuICJtb3ZcdCUwLCBsbyglMSlcO29yaFx0JTAsIGhpKCUxKSI7CisgICAgICAgfQorICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoIChSRUdfUChYRVhQKG9wZXJhbmRzWzFdLCAwKSkKKyAgICAgICAgICAgICAgJiYgUkVHTk8oWEVYUChvcGVyYW5kc1sxXSwgMCkpID09IFNQX1JFR05VTSkKKyAgICAgICAgICAgICB8fCAoR0VUX0NPREUoWEVYUChvcGVyYW5kc1sxXSwgMCkpID09IFBMVVMKKyAgICAgICAgICAgICAgICAgJiYgUkVHTk8oWEVYUChYRVhQKG9wZXJhbmRzWzFdLCAwKSwgMCkpID09IFNQX1JFR05VTQorCSAgICAgICAgICYmIEdFVF9DT0RFKFhFWFAoWEVYUChvcGVyYW5kc1sxXSwgMCksIDEpKSA9PSBDT05TVF9JTlQKKwkgICAgICAgICAmJiBJTlRWQUwoWEVYUChYRVhQKG9wZXJhbmRzWzFdLCAwKSwgMSkpICUgNCA9PSAwCisJICAgICAgICAgJiYgSU5UVkFMKFhFWFAoWEVYUChvcGVyYW5kc1sxXSwgMCksIDEpKSA8PSAweDFGQykgKQorICAgICAgICAgIHJldHVybiAibGRkc3BcdCUwLCAlMSI7CisgICAgICAgICAgZWxzZSBpZiAoIGF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQob3BlcmFuZHNbMV0sIEdFVF9NT0RFKG9wZXJhbmRzWzFdKSkgKQorICAgICAgICAgIHJldHVybiAibGRkcGNcdCUwLCAlMSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gImxkLndcdCUwLCAlMSI7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmICggKFJFR19QKFhFWFAob3BlcmFuZHNbMF0sIDApKQorICAgICAgICAgICAgICAmJiBSRUdOTyhYRVhQKG9wZXJhbmRzWzBdLCAwKSkgPT0gU1BfUkVHTlVNKQorICAgICAgICAgICAgIHx8IChHRVRfQ09ERShYRVhQKG9wZXJhbmRzWzBdLCAwKSkgPT0gUExVUworICAgICAgICAgICAgICAgICAmJiBSRUdOTyhYRVhQKFhFWFAob3BlcmFuZHNbMF0sIDApLCAwKSkgPT0gU1BfUkVHTlVNCisJICAgICAgICAgJiYgR0VUX0NPREUoWEVYUChYRVhQKG9wZXJhbmRzWzBdLCAwKSwgMSkpID09IENPTlNUX0lOVAorCSAgICAgICAgICYmIElOVFZBTChYRVhQKFhFWFAob3BlcmFuZHNbMF0sIDApLCAxKSkgJSA0ID09IDAKKwkgICAgICAgICAmJiBJTlRWQUwoWEVYUChYRVhQKG9wZXJhbmRzWzBdLCAwKSwgMSkpIDw9IDB4MUZDKSApCisgICAgICAgICAgcmV0dXJuICJzdGRzcFx0JTAsICUxIjsKKwllbHNlCisgICAgICAgICAgcmV0dXJuICJzdC53XHQlMCwgJTEiOworICAgICAgZGVmYXVsdDoKKwlhYm9ydCgpOworICAgIH0KKyAgfQorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCw4LDQsNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUsYWx1LGFsdTIsbG9hZCxzdG9yZSIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSxub25lLGNsb2JiZXIsbm9uZSxub25lIildKQorCisKKworOzs9PSBkb3VibGUgLSA2NCBiaXRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgIm1vdmRmIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpERiAwICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIiIpCisJKG1hdGNoX29wZXJhbmQ6REYgMSAiZ2VuZXJhbF9vcGVyYW5kIiAiIikpXQorICAiIgorICB7CisgICAgLyogT25lIG9mIHRoZSBvcHMgaGFzIHRvIGJlIGluIGEgcmVnaXN0ZXIuICAqLworICAgIGlmIChHRVRfQ09ERSAob3BlcmFuZHNbMF0pICE9IFJFRyl7CisgICAgICBvcGVyYW5kc1sxXSA9IGZvcmNlX3JlZyAoREZtb2RlLCBvcGVyYW5kc1sxXSk7CisgICAgfQorICB9KQorCisKKyhkZWZpbmVfaW5zbl9hbmRfc3BsaXQgIiptb3ZkZl9pbnRlcm5hbCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REYgMCAibm9uaW1tZWRpYXRlX29wZXJhbmQiICAgICAiPXIscixyLHIsbSIpCisJKG1hdGNoX29wZXJhbmQ6REYgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgICAgICAgICAiIHIsRyxGLG0sciIpKV0KKyAgIlRBUkdFVF9TT0ZUX0ZMT0FUCisgICAmJiAocmVnaXN0ZXJfb3BlcmFuZCAob3BlcmFuZHNbMF0sIERGbW9kZSkKKyAgICAgICB8fCByZWdpc3Rlcl9vcGVyYW5kIChvcGVyYW5kc1sxXSwgREZtb2RlKSkiCisgIHsKKyAgICBzd2l0Y2ggKHdoaWNoX2FsdGVybmF0aXZlICl7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6IAorICAgICAgICByZXR1cm4gIiMiOworICAgIGNhc2UgMzoKKyAgICAgIGlmICggYXZyMzJfY29uc3RfcG9vbF9yZWZfb3BlcmFuZChvcGVyYW5kc1sxXSwgR0VUX01PREUob3BlcmFuZHNbMV0pKSkKKyAgICAgICAgcmV0dXJuICJsZC5kXHQlMCwgcGNbJTEgLSAuXSI7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAibGQuZFx0JTAsICUxIjsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gInN0LmRcdCUwLCAlMSI7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0KCk7CisgICAgfQorICB9CisgICJUQVJHRVRfU09GVF9GTE9BVAorICAgJiYgcmVsb2FkX2NvbXBsZXRlZAorICAgJiYgKFJFR19QIChvcGVyYW5kc1swXSkgCisgICAgICAgICYmIChSRUdfUCAob3BlcmFuZHNbMV0pCisgICAgICAgICAgICB8fCBHRVRfQ09ERSAob3BlcmFuZHNbMV0pID09IENPTlNUX0RPVUJMRSkpIgorICBbKHNldCAobWF0Y2hfZHVwIDApIChtYXRjaF9kdXAgMSkpCisgICAoc2V0IChtYXRjaF9kdXAgMikgKG1hdGNoX2R1cCAzKSldCisgICIKKyAgIHsKKyAgICBvcGVyYW5kc1syXSA9IGdlbl9oaWdocGFydCAoU0ltb2RlLCBvcGVyYW5kc1swXSk7CisgICAgb3BlcmFuZHNbMF0gPSBnZW5fbG93cGFydCAoU0ltb2RlLCBvcGVyYW5kc1swXSk7CisgICAgb3BlcmFuZHNbM10gPSBnZW5faGlnaHBhcnQoU0ltb2RlLCBvcGVyYW5kc1sxXSk7CisgICAgb3BlcmFuZHNbMV0gPSBnZW5fbG93cGFydChTSW1vZGUsIG9wZXJhbmRzWzFdKTsKKyAgIH0KKyAgIgorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIiosKiwqLDQsNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICIqLCosKixsb2FkMixzdG9yZTIiKQorICAgKHNldF9hdHRyICJjYyIgIiosKiwqLG5vbmUsbm9uZSIpXSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBDb25kaXRpb25hbCBNb3ZlcworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJsZDxtb2RlPl9wcmVkaWNhYmxlIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpNT1ZDQyAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShtYXRjaF9vcGVyYW5kOk1PVkNDIDEgImF2cjMyX25vbl9ybXdfbWVtb3J5X29wZXJhbmQiICI8TU9WQ0M6cHJlZF9tZW1fY29uc3RyYWludD4iKSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgICJsZDxNT1ZDQzpsb2FkX3Bvc3RmaXg+JT9cdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY21wX2NvbmRfaW5zbiIpCisgICAoc2V0X2F0dHIgInR5cGUiICJsb2FkIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorKQorCisKKyhkZWZpbmVfaW5zbiAic3Q8bW9kZT5fcHJlZGljYWJsZSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6TU9WQ0MgMCAiYXZyMzJfbm9uX3Jtd19tZW1vcnlfb3BlcmFuZCIgIj08TU9WQ0M6cHJlZF9tZW1fY29uc3RyYWludD4iKQorCShtYXRjaF9vcGVyYW5kOk1PVkNDIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpXQorICAiVEFSR0VUX1YyX0lOU05TIgorICAic3Q8TU9WQ0M6c3RvcmVfcG9zdGZpeD4lP1x0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAidHlwZSIgInN0b3JlIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorKQorCisoZGVmaW5lX2luc24gIm1vdjxtb2RlPl9wcmVkaWNhYmxlIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpNT1ZDQyAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShtYXRjaF9vcGVyYW5kOk1PVkNDIDEgImF2cjMyX2NvbmRfcmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICJyS3MwOCIpKV0KKyAgIiIKKyAgIm1vdiU/XHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImNtcF9jb25kX2luc24iKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IE1vdmUgY2h1bmtzIG9mIG1lbW9yeQorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisoZGVmaW5lX2V4cGFuZCAibW92bWVtc2kiCisgIFsobWF0Y2hfb3BlcmFuZDpCTEsgMCAiZ2VuZXJhbF9vcGVyYW5kIiAiIikKKyAgIChtYXRjaF9vcGVyYW5kOkJMSyAxICJnZW5lcmFsX29wZXJhbmQiICIiKQorICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiY29uc3RfaW50X29wZXJhbmQiICIiKQorICAgKG1hdGNoX29wZXJhbmQ6U0kgMyAiY29uc3RfaW50X29wZXJhbmQiICIiKV0KKyAgIiIKKyAgIgorICAgaWYgKGF2cjMyX2dlbl9tb3ZtZW1zaSAob3BlcmFuZHMpKQorICAgICBET05FOworICAgRkFJTDsKKyAgIgorICApCisKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IEJpdCBmaWVsZCBpbnN0cnVjdGlvbnMKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IEluc3RydWN0aW9ucyB0byBpbnNlcnQgb3IgZXh0cmFjdCBiaXQtZmllbGRzCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfaW5zbiAiaW5zdiIKKyAgWyAoc2V0ICh6ZXJvX2V4dHJhY3Q6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIityIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IikpCisgICAgICAgICAobWF0Y2hfb3BlcmFuZCAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKV0KKyAgIiIKKyAgImJmaW5zXHQlMCwgJTMsICUyLCAlMSIKKyAgWyhzZXRfYXR0ciAidHlwZSIgImFsdSIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgInNldF9uY3oiKV0pCisKKworCisoZGVmaW5lX2V4cGFuZCAiZXh0diIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgKHNpZ25fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpKSldCisgICIiCisgIHsKKyAgIGlmICggSU5UVkFMKG9wZXJhbmRzWzJdKSA+PSAzMiApCisgICAgICBGQUlMOworICB9CispCisKKyhkZWZpbmVfZXhwYW5kICJleHR6diIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpKSldCisgICIiCisgIHsKKyAgIGlmICggSU5UVkFMKG9wZXJhbmRzWzJdKSA+PSAzMiApCisgICAgICBGQUlMOworICB9CispCisKKyhkZWZpbmVfaW5zbiAiZXh0dl9pbnRlcm5hbCIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICAoc2lnbl9leHRyYWN0OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMyAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IikpKV0KKyAgIklOVFZBTChvcGVyYW5kc1syXSkgPCAzMiIKKyAgImJmZXh0c1x0JTAsICUxLCAlMywgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHUiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfbmN6IildKQorCisKKyhkZWZpbmVfaW5zbiAiZXh0enZfaW50ZXJuYWwiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDMgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpKSldCisgICJJTlRWQUwob3BlcmFuZHNbMl0pIDwgMzIiCisgICJiZmV4dHVcdCUwLCAlMSwgJTMsICUyIgorICBbKHNldF9hdHRyICJ0eXBlIiAiYWx1IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X25jeiIpXSkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IFNvbWUgcGVlcGhvbGVzIGZvciBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjYXN0IGluc3RydWN0aW9ucworOzsgZm9sbG93ZWQgYnkgYmZpbnMuCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6UUkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZCAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgNCAiaW1tZWRpYXRlX29wZXJhbmQiICIiKSkKKyAgICAgICAgKG1hdGNoX2R1cCAwKSldCisgICIoKHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pICYmCisgICAgKElOVFZBTChvcGVyYW5kc1szXSkgPD0gOCkpKSIKKyAgWyhzZXQgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfZHVwIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgNCkpCisgICAgICAgIChtYXRjaF9kdXAgMSkpXQorICApCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZCAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgNCAiaW1tZWRpYXRlX29wZXJhbmQiICIiKSkKKyAgICAgICAgKG1hdGNoX2R1cCAwKSldCisgICIoKHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pICYmCisgICAgKElOVFZBTChvcGVyYW5kc1szXSkgPD0gMTYpKSkiCisgIFsoc2V0ICh6ZXJvX2V4dHJhY3Q6U0kgKG1hdGNoX2R1cCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDQpKQorICAgICAgICAobWF0Y2hfZHVwIDEpKV0KKyAgKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBwdXNoIGJ5dGVzCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBJbXBsZW1lbnRzIHRoZSBwdXNoIGluc3RydWN0aW9uCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc24gInB1c2htIgorICBbKHNldCAobWVtOkJMSyAocHJlX2RlYzpCTEsgKHJlZzpTSSBTUF9SRUdOVU0pKSkKKyAgICAgICAgKHVuc3BlYzpCTEsgWyhtYXRjaF9vcGVyYW5kIDAgImNvbnN0X2ludF9vcGVyYW5kIiAiIildCisgICAgICAgICAgICAgICAgICAgIFVOU1BFQ19QVVNITSkpXQorICAiIgorICB7CisgICAgaWYgKElOVFZBTChvcGVyYW5kc1swXSkpIHsKKyAgICAgIHJldHVybiAicHVzaG1cdCVyMCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0KKyAgWyhzZXRfYXR0ciAidHlwZSIgInN0b3JlIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiMiIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9pbnNuICJzdG0iCisgIFsodW5zcGVjIFsobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAxICJjb25zdF9pbnRfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAyICJjb25zdF9pbnRfb3BlcmFuZCIgIiIpXQorCSAgIFVOU1BFQ19TVE0pXQorICAiIgorICB7CisgICAgaWYgKElOVFZBTChvcGVyYW5kc1sxXSkpIHsKKyAgICAgIGlmIChJTlRWQUwob3BlcmFuZHNbMl0pICE9IDApCisgICAgICAgICByZXR1cm4gInN0bVx0LS0lMCwgJXMxIjsKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiAic3RtXHQlMCwgJXMxIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAic3RvcmUiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisKKworKGRlZmluZV9pbnNuICJwb3BtIgorICBbKHVuc3BlYyBbKG1hdGNoX29wZXJhbmQgMCAiY29uc3RfaW50X29wZXJhbmQiICIiKV0KKwkgICBVTlNQRUNfUE9QTSldCisgICIiCisgIHsKKyAgICBpZiAoSU5UVkFMKG9wZXJhbmRzWzBdKSkgeworICAgICAgcmV0dXJuICJwb3BtICAgJXIwIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAibG9hZCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjIiKV0pCisKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBhZGQKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IEFkZHMgcmVnMSB3aXRoIHJlZzIgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiByZWcwLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJhZGQ8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpJTlRNIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyLHIscixyIikKKwkocGx1czpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiUwLHIsMCxyLDAiKQorICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOklOVE0gMiAiYXZyMzJfYWRkX29wZXJhbmQiICJyLHIsSXMwOCxJczE2LElzMjEiKSkpXQorICAiIgorICAiQAorICAgYWRkICAgICAlMCwgJTIKKyAgIGFkZCAgICAgJTAsICUxLCAlMgorICAgc3ViICAgICAlMCwgJW4yCisgICBzdWIgICAgICUwLCAlMSwgJW4yCisgICBzdWIgICAgICUwLCAlbjIiCisKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiw0LDIsNCw0IikKKyAgIChzZXRfYXR0ciAiY2MiICI8SU5UTTphbHVfY2NfYXR0cj4iKV0pCisKKyhkZWZpbmVfaW5zbiAiYWRkPG1vZGU+M19sc2wiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOklOVE0gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkocGx1czpJTlRNIChhc2hpZnQ6SU5UTSAobWF0Y2hfb3BlcmFuZDpJTlRNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAzICJhdnIzMl9hZGRfc2hpZnRfaW1tZWRpYXRlX29wZXJhbmQiICJLdTAyIikpCisgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisgICIiCisgICJhZGQgICAgICUwLCAlMiwgJTEgPDwgJTMiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIjxJTlRNOmFsdV9jY19hdHRyPiIpXSkKKworKGRlZmluZV9pbnNuICJhZGQ8bW9kZT4zX2xzbDIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOklOVE0gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkocGx1czpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgIChhc2hpZnQ6SU5UTSAobWF0Y2hfb3BlcmFuZDpJTlRNIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAzICJhdnIzMl9hZGRfc2hpZnRfaW1tZWRpYXRlX29wZXJhbmQiICJLdTAyIikpKSldCisgICIiCisgICJhZGQgICAgICUwLCAlMSwgJTIgPDwgJTMiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIjxJTlRNOmFsdV9jY19hdHRyPiIpXSkKKworCisoZGVmaW5lX2luc24gImFkZDxtb2RlPjNfbXVsIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpJTlRNIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHBsdXM6SU5UTSAobXVsdDpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDQiICkpCisgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisgICIoSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAwKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAyKSB8fAorICAgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gNCkgfHwgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gOCkiCisgICJhZGQgICAgICUwLCAlMiwgJTEgPDwgJXAzIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICI8SU5UTTphbHVfY2NfYXR0cj4iKV0pCisKKyhkZWZpbmVfaW5zbiAiYWRkPG1vZGU+M19tdWwyIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpJTlRNIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHBsdXM6SU5UTSAobWF0Y2hfb3BlcmFuZDpJTlRNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAobXVsdDpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDQiICkpKSldCisgICIoSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAwKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAyKSB8fAorICAgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gNCkgfHwgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gOCkiCisgICJhZGQgICAgICUwLCAlMSwgJTIgPDwgJXAzIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICI8SU5UTTphbHVfY2NfYXR0cj4iKV0pCisKKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChhc2hpZnQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICIiKSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShwbHVzOlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgNCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSldCisgICIocGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkgJiYKKyAgICAoSU5UVkFMKG9wZXJhbmRzWzJdKSA8IDQgJiYgSU5UVkFMKG9wZXJhbmRzWzJdKSA+IDApKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAzKQorCShwbHVzOlNJIChhc2hpZnQ6U0kgKG1hdGNoX2R1cCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMikpCisgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgNCkpKV0KKyAgKQorCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKGFzaGlmdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMyAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJKHBsdXM6U0kgKG1hdGNoX29wZXJhbmQ6U0kgNCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMCkpKV0KKyAgIihwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSAmJgorICAgIChJTlRWQUwob3BlcmFuZHNbMl0pIDwgNCAmJiBJTlRWQUwob3BlcmFuZHNbMl0pID4gMCkpIgorICBbKHNldCAobWF0Y2hfZHVwIDMpCisJKHBsdXM6U0kgKGFzaGlmdDpTSSAobWF0Y2hfZHVwIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAyKSkKKyAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCA0KSkpXQorICApCisKKyhkZWZpbmVfaW5zbiAiYWRkZGkzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpESSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIsciIpCisJKHBsdXM6REkgKG1hdGNoX29wZXJhbmQ6REkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiUwLHIiKQorCQkgKG1hdGNoX29wZXJhbmQ6REkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIsciIpKSldCisgICIiCisgICJACisgICBhZGQgICAgICUwLCAlMlw7YWRjICAgICVtMCwgJW0wLCAlbTIKKyAgIGFkZCAgICAgJTAsICUxLCAlMlw7YWRjICAgICVtMCwgJW0xLCAlbTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjYsOCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUyIikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfdm5jeiIpXSkKKworCisoZGVmaW5lX2luc24gImFkZDxtb2RlPl9pbW1fcHJlZGljYWJsZSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SU5UTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorCShwbHVzOklOVE0gKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOklOVE0gMSAiYXZyMzJfY29uZF9pbW1lZGlhdGVfb3BlcmFuZCIgIiVJczA4IikpKV0KKyAgIiIKKyAgInN1YiU/XHQlMCwgLSUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBzdWJ0cmFjdAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgU3VidHJhY3QgcmVnMiBvciBpbW1lZGlhdGUgdmFsdWUgZnJvbSByZWcwIGFuZCBwdXRzIHRoZSByZXN1bHQgaW4gcmVnMC4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9pbnNuICJzdWI8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpJTlRNIDAgImdlbmVyYWxfb3BlcmFuZCIgIj1yLHIscixyLHIscixyIikKKwkobWludXM6SU5UTSAobWF0Y2hfb3BlcmFuZDpJTlRNIDEgIm5vbm1lbW9yeV9vcGVyYW5kIiAiMCxyLDAsciwwLHIsS3MwOCIpCisJCSAgKG1hdGNoX29wZXJhbmQ6SU5UTSAyICJub25tZW1vcnlfb3BlcmFuZCIgInIscixLczA4LEtzMTYsS3MyMSwwLHIiKSkpXQorICAiIgorICAiQAorICAgc3ViICAgICAlMCwgJTIKKyAgIHN1YiAgICAgJTAsICUxLCAlMgorICAgc3ViICAgICAlMCwgJTIKKyAgIHN1YiAgICAgJTAsICUxLCAlMgorICAgc3ViICAgICAlMCwgJTIKKyAgIHJzdWIgICAgJTAsICUxCisgICByc3ViICAgICUwLCAlMiwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCwyLDQsNCwyLDQiKQorICAgKHNldF9hdHRyICJjYyIgIjxJTlRNOmFsdV9jY19hdHRyPiIpXSkKKworKGRlZmluZV9pbnNuICIqc3ViPG1vZGU+M19tdWwiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOklOVE0gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkobWludXM6SU5UTSAobWF0Y2hfb3BlcmFuZDpJTlRNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgKG11bHQ6SU5UTSAobWF0Y2hfb3BlcmFuZDpJTlRNIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDQiICkpKSldCisgICIoSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAwKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAyKSB8fAorICAgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gNCkgfHwgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gOCkiCisgICJzdWIgICAgICUwLCAlMSwgJTIgPDwgJXAzIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICI8SU5UTTphbHVfY2NfYXR0cj4iKV0pCisKKyhkZWZpbmVfaW5zbiAiKnN1Yjxtb2RlPjNfbHNsIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpJTlRNIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKG1pbnVzOklOVE0gIChtYXRjaF9vcGVyYW5kOklOVE0gMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgKGFzaGlmdDpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDMgImF2cjMyX2FkZF9zaGlmdF9pbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDIiKSkpKV0KKyAgIiIKKyAgInN1YiAgICAgJTAsICUxLCAlMiA8PCAlMyIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiPElOVE06YWx1X2NjX2F0dHI+IildKQorCisKKyhkZWZpbmVfaW5zbiAic3ViZGkzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpESSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIsciIpCisJKG1pbnVzOkRJIChtYXRjaF9vcGVyYW5kOkRJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlMCxyIikKKwkJIChtYXRjaF9vcGVyYW5kOkRJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyLHIiKSkpXQorICAiIgorICAiQAorICAgc3ViICAgICAlMCwgJTJcO3NiYyAgICAlbTAsICVtMCwgJW0yCisgICBzdWIgICAgICUwLCAlMSwgJTJcO3NiYyAgICAlbTAsICVtMSwgJW0yIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI2LDgiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1MiIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X3ZuY3oiKV0pCisKKworKGRlZmluZV9pbnNuICJzdWI8bW9kZT5faW1tX3ByZWRpY2FibGUiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOklOVE0gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIityIikKKwkobWludXM6SU5UTSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOklOVE0gMSAiYXZyMzJfY29uZF9pbW1lZGlhdGVfb3BlcmFuZCIgIktzMDgiKSkpXQorICAiIgorICAic3ViJT9cdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY21wX2NvbmRfaW5zbiIpCisgICAoc2V0X2F0dHIgInByZWRpY2FibGUiICJ5ZXMiKV0pCisKKyhkZWZpbmVfaW5zbiAicnN1Yjxtb2RlPl9pbW1fcHJlZGljYWJsZSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SU5UTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorCShtaW51czpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMSAiYXZyMzJfY29uZF9pbW1lZGlhdGVfb3BlcmFuZCIgICJLczA4IikKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAwKSkpXQorICAiIgorICAicnN1YiU/XHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImNtcF9jb25kX2luc24iKQorICAgKHNldF9hdHRyICJwcmVkaWNhYmxlIiAieWVzIildKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBtdWx0aXBseQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgTXVsdGlwbHkgb3AxIGFuZCBvcDIgYW5kIHB1dCB0aGUgdmFsdWUgaW4gb3AwLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyhkZWZpbmVfaW5zbiAibXVscWkzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpRSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgICAgICAgICI9cixyLHIiKQorCShtdWx0OlFJIChtYXRjaF9vcGVyYW5kOlFJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlMCxyLHIiKQorCQkgKG1hdGNoX29wZXJhbmQ6UUkgMiAiYXZyMzJfbXVsX29wZXJhbmQiICJyLHIsS3MwOCIpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyIKKyAgeworICAgc3dpdGNoICh3aGljaF9hbHRlcm5hdGl2ZSl7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICJtdWwgICAgICUwLCAlMiI7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuICJtdWwgICAgICUwLCAlMSwgJTIiOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAibXVsICAgICAlMCwgJTEsICUyIjsKKyAgICBkZWZhdWx0OgorICAgICAgZ2NjX3VucmVhY2hhYmxlKCk7CisgICB9CisgIH0KKyAgWyhzZXRfYXR0ciAidHlwZSIgIm11bHd3X3csbXVsd3dfdyxtdWx3aCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCw0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisoZGVmaW5lX2luc24gIm11bHNpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAgICAgICAiPXIscixyIikKKwkobXVsdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiJTAscixyIikKKwkJIChtYXRjaF9vcGVyYW5kOlNJIDIgImF2cjMyX211bF9vcGVyYW5kIiAicixyLEtzMDgiKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMiCisgIHsKKyAgIHN3aXRjaCAod2hpY2hfYWx0ZXJuYXRpdmUpeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAibXVsICAgICAlMCwgJTIiOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiAibXVsICAgICAlMCwgJTEsICUyIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIm11bCAgICAgJTAsICUxLCAlMiI7CisgICAgZGVmYXVsdDoKKyAgICAgIGdjY191bnJlYWNoYWJsZSgpOworICAgfQorICB9CisgIFsoc2V0X2F0dHIgInR5cGUiICJtdWx3d193LG11bHd3X3csbXVsd2giKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIyLDQsNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworCisoZGVmaW5lX2luc24gIm11bGhpc2kzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShtdWx0OlNJCisJIChzaWduX2V4dGVuZDpTSSAobWF0Y2hfb3BlcmFuZDpISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiJXIiKSkKKwkgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQIgorICAibXVsaGgudyAlMCwgJTE6YiwgJTI6YiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgIm11bGhoIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhtYXRjaF9zY3JhdGNoOkRJIDYgInIiKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobXVsdDpTSQorCSAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKQorICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkpKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKGFzaGlmdHJ0OlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMTYpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQCisgICAmJiAocGVlcDJfcmVnX2RlYWRfcCgxLCBvcGVyYW5kc1swXSkgfHwgKFJFR05PKG9wZXJhbmRzWzBdKSA9PSBSRUdOTyhvcGVyYW5kc1szXSkpKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCA0KSAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpCisgICAoc2V0IChtYXRjaF9kdXAgNikKKyAgICAgICAgKGFzaGlmdDpESSAobXVsdDpESSAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX2R1cCA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX2R1cCAyKSkpCisgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAxNikpKQorICAgKHNldCAobWF0Y2hfZHVwIDMpIChtYXRjaF9kdXAgNSkpXQorCisgICJ7CisgICAgIG9wZXJhbmRzWzRdID0gZ2VuX3J0eF9SRUcoU0ltb2RlLCBSRUdOTyhvcGVyYW5kc1sxXSkpOworICAgICBvcGVyYW5kc1s1XSA9IGdlbl9oaWdocGFydCAoU0ltb2RlLCBvcGVyYW5kc1s0XSk7CisgICB9IgorICApCisKKyhkZWZpbmVfaW5zbiAibXVsbmhpc2kzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAobXVsdDpTSQorICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChuZWc6SEkgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgICAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpKV0KKyAgIiFUQVJHRVRfTk9fTVVMX0lOU05TICYmIFRBUkdFVF9EU1AiCisgICJtdWxuaGgudyAlMCwgJTE6YiwgJTI6YiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgIm11bGhoIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9pbnNuICJtYWNoaXNpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIityIikKKwkocGx1czpTSSAobXVsdDpTSQorICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlciIpKQorICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDApKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQIgorICAibWFjaGgudyAlMCwgJTE6YiwgJTI6YiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgIm1hY2hoX3ciKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisKKworKGRlZmluZV9pbnNuICJtdWxzaWRpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkobXVsdDpESQorCSAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiVyIikpCisJIChzaWduX2V4dGVuZDpESSAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMiCisgICJtdWxzLmQgICUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJtdWx3d19kIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9pbnNuICJ1bXVsc2lkaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKG11bHQ6REkKKwkgKHplcm9fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlciIpKQorCSAoemVyb19leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpKV0KKyAgIiFUQVJHRVRfTk9fTVVMX0lOU05TIgorICAibXVsdS5kICAlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJ0eXBlIiAibXVsd3dfZCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKyhkZWZpbmVfaW5zbiAiKm11bGFjY3NpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIityIikKKwkocGx1czpTSSAobXVsdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiJXIiKQorCQkJICAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKQorCQkgKG1hdGNoX2R1cCAwKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMiCisgICJtYWMgICAgICUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJtYWN3d193IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9pbnNuICIqbXVsYWNjc2lkaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIrciIpCisJKHBsdXM6REkgKG11bHQ6REkKKwkJICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiVyIikpCisJCSAgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorCQkgKG1hdGNoX2R1cCAwKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMiCisgICJtYWNzLmQgICUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJtYWN3d19kIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9pbnNuICIqdW11bGFjY3NpZGkzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpESSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorCShwbHVzOkRJIChtdWx0OkRJCisJCSAgKHplcm9fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlciIpKQorCQkgICh6ZXJvX2V4dGVuZDpESSAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSkKKwkJIChtYXRjaF9kdXAgMCkpKV0KKyAgIiFUQVJHRVRfTk9fTVVMX0lOU05TIgorICAibWFjdS5kICAlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJ0eXBlIiAibWFjd3dfZCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKworCis7OyBUcnkgdG8gYXZvaWQgV3JpdGUtQWZ0ZXItV3JpdGUgaGF6YXJkcyBmb3IgbXVsIG9wZXJhdGlvbnMKKzs7IGlmIGl0IGNhbiBiZSBkb25lCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobXVsdDpTSQorCSAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQgMSAiZ2VuZXJhbF9vcGVyYW5kIiAiIikpCisgICAgICAgICAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQgMiAiZ2VuZXJhbF9vcGVyYW5kIiAiIikpKSkKKyAgIChzZXQgKG1hdGNoX2R1cCAwKQorCShtYXRjaF9vcGVyYXRvcjpTSSAzICJhbHVfb3BlcmF0b3IiIFsobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCA0ICJnZW5lcmFsX29wZXJhbmQiICIiKV0pKV0KKyAgInBlZXAyX3JlZ19kZWFkX3AoMSwgb3BlcmFuZHNbMl0pIgorICBbKHNldCAobWF0Y2hfZHVwIDUpCisgICAgICAgIChtdWx0OlNJCisgICAgICAgICAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkKKyAgICAgICAgIChzaWduX2V4dGVuZDpTSSAobWF0Y2hfZHVwIDIpKSkpCisgICAoc2V0IChtYXRjaF9kdXAgMCkKKwkobWF0Y2hfb3BfZHVwIDMgWyhtYXRjaF9kdXAgNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDQpXSkpXQorICAie29wZXJhbmRzWzVdID0gZ2VuX3J0eF9SRUcoU0ltb2RlLCBSRUdOTyhvcGVyYW5kc1syXSkpO30iCisgICkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IERTUCBpbnN0cnVjdGlvbnMKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfaW5zbiAibXVsc2F0aGhfaCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKHNzX3RydW5jYXRlOkhJIChhc2hpZnRydDpTSSAobXVsdDpTSSAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiVyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMTUpKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMgJiYgVEFSR0VUX0RTUCIKKyAgIm11bHNhdGhoLmhcdCUwLCAlMTpiLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgIm11bGhoIildKQorCisoZGVmaW5lX2luc24gIm11bHNhdHJuZGhoX2giCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgIChzc190cnVuY2F0ZTpISSAoYXNoaWZ0cnQ6U0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGx1czpTSSAobXVsdDpTSSAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiVyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMTA3Mzc0MTgyNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAxNSkpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQIgorICAibXVsc2F0cm5kaGguaFx0JTAsICUxOmIsICUyOmIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAibXVsaGgiKV0pCisKKyhkZWZpbmVfaW5zbiAibXVsc2F0aGhfdyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKHNzX3RydW5jYXRlOlNJIChhc2hpZnQ6REkgKG11bHQ6REkgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMSkpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQIgorICAibXVsc2F0aGgud1x0JTAsICUxOmIsICUyOmIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAibXVsaGgiKV0pCisKKyhkZWZpbmVfaW5zbiAibXVsc2F0d2hfdyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKHNzX3RydW5jYXRlOlNJIChhc2hpZnRydDpESSAobXVsdDpESSAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAxNSkpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQIgorICAibXVsc2F0d2gud1x0JTAsICUxLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgIm11bHdoIildKQorCisoZGVmaW5lX2luc24gIm11bHNhdHJuZHdoX3ciCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgIChzc190cnVuY2F0ZTpTSSAoYXNoaWZ0cnQ6REkgKHBsdXM6REkgKG11bHQ6REkgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMTA3Mzc0MTgyNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAxNSkpKSldCisgICIhVEFSR0VUX05PX01VTF9JTlNOUyAmJiBUQVJHRVRfRFNQIgorICAibXVsc2F0cm5kd2gud1x0JTAsICUxLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgIm11bHdoIildKQorCisoZGVmaW5lX2luc24gIm1hY3NhdGhoX3ciCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIrciIpCisgICAgICAgIChwbHVzOlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgKHNzX3RydW5jYXRlOlNJIChhc2hpZnQ6REkgKG11bHQ6REkgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIlciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMSkpKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMgJiYgVEFSR0VUX0RTUCIKKyAgIm1hY3NhdGhoLndcdCUwLCAlMTpiLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgIm11bGhoIildKQorCisKKyhkZWZpbmVfaW5zbiAibXVsd2hfZCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKGFzaGlmdDpESSAobXVsdDpESSAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAxNikpKV0KKyAgIiFUQVJHRVRfTk9fTVVMX0lOU05TICYmIFRBUkdFVF9EU1AiCisgICJtdWx3aC5kXHQlMCwgJTEsICUyOmIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAibXVsd2giKV0pCisKKworKGRlZmluZV9pbnNuICJtdWxud2hfZCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKGFzaGlmdDpESSAobXVsdDpESSAobm90OkRJIChzaWduX2V4dGVuZDpESSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAxNikpKV0KKyAgIiFUQVJHRVRfTk9fTVVMX0lOU05TICYmIFRBUkdFVF9EU1AiCisgICJtdWxud2guZFx0JTAsICUxLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgIm11bHdoIildKQorCisoZGVmaW5lX2luc24gIm1hY3doX2QiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIrciIpCisgICAgICAgIChwbHVzOkRJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgKGFzaGlmdDpESSAobXVsdDpESSAoc2lnbl9leHRlbmQ6REkgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiVyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMTYpKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMgJiYgVEFSR0VUX0RTUCIKKyAgIm1hY3doLmRcdCUwLCAlMSwgJTI6YiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpCisgICAoc2V0X2F0dHIgInR5cGUiICJtdWx3aCIpXSkKKworKGRlZmluZV9pbnNuICJtYWNoaF9kIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpESSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorICAgICAgICAocGx1czpESSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgIChtdWx0OkRJIChzaWduX2V4dGVuZDpESSAobWF0Y2hfb3BlcmFuZDpISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiJXIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25fZXh0ZW5kOkRJIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKSkpXQorICAiIVRBUkdFVF9OT19NVUxfSU5TTlMgJiYgVEFSR0VUX0RTUCIKKyAgIm1hY2hoLmRcdCUwLCAlMTpiLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgIm11bHdoIildKQorCisoZGVmaW5lX2luc24gInNhdGFkZF93IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAoc3NfcGx1czpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKV0KKyAgIlRBUkdFVF9EU1AiCisgICJzYXRhZGQud1x0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHVfc2F0IildKQorCisoZGVmaW5lX2luc24gInNhdHN1Yl93IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAoc3NfbWludXM6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpXQorICAiVEFSR0VUX0RTUCIKKyAgInNhdHN1Yi53XHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdV9zYXQiKV0pCisKKyhkZWZpbmVfaW5zbiAic2F0YWRkX2giCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgIChzc19wbHVzOkhJIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpXQorICAiVEFSR0VUX0RTUCIKKyAgInNhdGFkZC5oXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdV9zYXQiKV0pCisKKyhkZWZpbmVfaW5zbiAic2F0c3ViX2giCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgIChzc19taW51czpISSAobWF0Y2hfb3BlcmFuZDpISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpISSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisgICJUQVJHRVRfRFNQIgorICAic2F0c3ViLmhcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1X3NhdCIpXSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBzbWluCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBTZXQgcmVnMCB0byB0aGUgc21hbGxlc3QgdmFsdWUgb2YgcmVnMSBhbmQgcmVnMi4gSXQgaXMgdXNlZCBmb3Igc2lnbmVkCis7OyB2YWx1ZXMgaW4gdGhlIHJlZ2lzdGVycy4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfaW5zbiAic21pbnNpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkoc21pbjpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisJCSAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisgICIiCisgICJtaW4gICAgICUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IHNtYXgKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IFNldCByZWcwIHRvIHRoZSBsYXJnZXN0IHZhbHVlIG9mIHJlZzEgYW5kIHJlZzIuIEl0IGlzIHVzZWQgZm9yIHNpZ25lZAorOzsgdmFsdWVzIGluIHRoZSByZWdpc3RlcnMuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc24gInNtYXhzaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHNtYXg6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorCQkgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpXQorICAiIgorICAibWF4ICAgICAlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgTG9naWNhbCBvcGVyYXRpb25zCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworOzsgU3BsaXQgdXAgc2ltcGxlIERJbW9kZSBsb2dpY2FsIG9wZXJhdGlvbnMuICBTaW1wbHkgcGVyZm9ybSB0aGUgbG9naWNhbAorOzsgb3BlcmF0aW9uIG9uIHRoZSB1cHBlciBhbmQgbG93ZXIgaGFsdmVzIG9mIHRoZSByZWdpc3RlcnMuCisoZGVmaW5lX3NwbGl0CisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtYXRjaF9vcGVyYXRvcjpESSA2ICJsb2dpY2FsX2JpbmFyeV9vcGVyYXRvciIKKwkgIFsobWF0Y2hfb3BlcmFuZDpESSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkgICAobWF0Y2hfb3BlcmFuZDpESSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiIildKSldCisgICJyZWxvYWRfY29tcGxldGVkIgorICBbKHNldCAobWF0Y2hfZHVwIDApIChtYXRjaF9vcF9kdXA6U0kgNiBbKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpXSkpCisgICAoc2V0IChtYXRjaF9kdXAgMykgKG1hdGNoX29wX2R1cDpTSSA2IFsobWF0Y2hfZHVwIDQpIChtYXRjaF9kdXAgNSldKSldCisgICIKKyAgeworICAgIG9wZXJhbmRzWzNdID0gZ2VuX2hpZ2hwYXJ0IChTSW1vZGUsIG9wZXJhbmRzWzBdKTsKKyAgICBvcGVyYW5kc1swXSA9IGdlbl9sb3dwYXJ0IChTSW1vZGUsIG9wZXJhbmRzWzBdKTsKKyAgICBvcGVyYW5kc1s0XSA9IGdlbl9oaWdocGFydCAoU0ltb2RlLCBvcGVyYW5kc1sxXSk7CisgICAgb3BlcmFuZHNbMV0gPSBnZW5fbG93cGFydCAoU0ltb2RlLCBvcGVyYW5kc1sxXSk7CisgICAgb3BlcmFuZHNbNV0gPSBnZW5faGlnaHBhcnQgKFNJbW9kZSwgb3BlcmFuZHNbMl0pOworICAgIG9wZXJhbmRzWzJdID0gZ2VuX2xvd3BhcnQgKFNJbW9kZSwgb3BlcmFuZHNbMl0pOworICB9IgorKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBMb2dpY2FsIG9wZXJhdGlvbnMgd2l0aCBzaGlmdGVkIG9wZXJhbmQKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfaW5zbiAiPGNvZGU+c2lfbHNoaWZ0IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAobG9naWNhbDpTSSAobWF0Y2hfb3BlcmF0b3I6U0kgNCAibG9naWNhbF9zaGlmdF9vcGVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMyAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IildKQorICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisgICIiCisgIHsKKyAgIGlmICggR0VUX0NPREUob3BlcmFuZHNbNF0pID09IEFTSElGVCApCisgICAgICByZXR1cm4gIjxsb2dpY2FsX2luc24+XHQlMCwgJTEsICUyIDw8ICUzIjsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAiPGxvZ2ljYWxfaW5zbj5cdCUwLCAlMSwgJTIgPj4gJTMiOworICAgICAgfQorCisgIFsoc2V0X2F0dHIgImNjIiAic2V0X3oiKV0KKykKKworCis7OyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOzsgUGVlcGhvbGVzIGZvciBkZXRlY3RpbmcgbG9naWNhbCBvcGVyYW50aW9ucworOzsgd2l0aCBzaGlmdGVkIG9wZXJhbmRzCis7OyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisoZGVmaW5lX3BlZXBob2xlCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWF0Y2hfb3BlcmF0b3I6U0kgNSAibG9naWNhbF9zaGlmdF9vcGVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpXSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobG9naWNhbDpTSSAobWF0Y2hfb3BlcmFuZDpTSSA0ICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKSkpXQorICAiKGRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbM10pKSB8fCAoUkVHTk8ob3BlcmFuZHNbM10pID09IFJFR05PKG9wZXJhbmRzWzBdKSkiCisgIHsKKyAgIGlmICggR0VUX0NPREUob3BlcmFuZHNbNV0pID09IEFTSElGVCApCisgICAgICByZXR1cm4gIjxsb2dpY2FsX2luc24+XHQlMCwgJTQsICUxIDw8ICUyIjsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAiPGxvZ2ljYWxfaW5zbj5cdCUwLCAlNCwgJTEgPj4gJTIiOworICB9CisgIFsoc2V0X2F0dHIgImNjIiAic2V0X3oiKV0KKyAgKQorCisoZGVmaW5lX3BlZXBob2xlCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWF0Y2hfb3BlcmF0b3I6U0kgNSAibG9naWNhbF9zaGlmdF9vcGVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpXSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobG9naWNhbDpTSSAobWF0Y2hfZHVwIDMpCisgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDQgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkpXQorICAiKGRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbM10pKSB8fCAoUkVHTk8ob3BlcmFuZHNbM10pID09IFJFR05PKG9wZXJhbmRzWzBdKSkiCisgIHsKKyAgIGlmICggR0VUX0NPREUob3BlcmFuZHNbNV0pID09IEFTSElGVCApCisgICAgICByZXR1cm4gIjxsb2dpY2FsX2luc24+XHQlMCwgJTQsICUxIDw8ICUyIjsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAiPGxvZ2ljYWxfaW5zbj5cdCUwLCAlNCwgJTEgPj4gJTIiOworICB9CisgIFsoc2V0X2F0dHIgImNjIiAic2V0X3oiKV0KKyAgKQorCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWF0Y2hfb3BlcmF0b3I6U0kgNSAibG9naWNhbF9zaGlmdF9vcGVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpXSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobG9naWNhbDpTSSAobWF0Y2hfb3BlcmFuZDpTSSA0ICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAwKSkpXQorICAiKHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pKSB8fCAoUkVHTk8ob3BlcmFuZHNbM10pID09IFJFR05PKG9wZXJhbmRzWzBdKSkiCisKKyAgWyhzZXQgKG1hdGNoX2R1cCAzKQorICAgICAgICAobG9naWNhbDpTSSAgKG1hdGNoX29wX2R1cDpTSSA1IFsobWF0Y2hfZHVwIDEpIChtYXRjaF9kdXAgMildKQorICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCA0KSkpXQorCisgICIiCispCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWF0Y2hfb3BlcmF0b3I6U0kgNSAibG9naWNhbF9zaGlmdF9vcGVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIiIpXSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobG9naWNhbDpTSSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDQgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkpXQorICAiKHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pKSB8fCAoUkVHTk8ob3BlcmFuZHNbM10pID09IFJFR05PKG9wZXJhbmRzWzBdKSkiCisKKyAgWyhzZXQgKG1hdGNoX2R1cCAzKQorICAgICAgICAobG9naWNhbDpTSSAobWF0Y2hfb3BfZHVwOlNJIDUgWyhtYXRjaF9kdXAgMSkgKG1hdGNoX2R1cCAyKV0pCisgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgNCkpKV0KKworICAiIgorKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGFuZAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgU3RvcmUgdGhlIHJlc3VsdCBhZnRlciBhIGJpdHdpc2UgbG9naWNhbC1hbmQgYmV0d2VlbiByZWcwIGFuZCByZWcyIGluIHJlZzAuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfaW5zbiAiYW5kbnNpIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorICAgICAgICAoYW5kOlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAobm90OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKSldCisgICIiCisgICJhbmRuICAgICUwLCAlMSIKKyAgWyhzZXRfYXR0ciAiY2MiICJzZXRfeiIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjIiKV0KKykKKworCisoZGVmaW5lX2luc24gImFuZHNpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAiYXZyMzJfcm13X21lbW9yeV9vcl9yZWdpc3Rlcl9vcGVyYW5kIiAgICAgICAgICAiPVkscixyLHIsICAgciwgICByLHIscixyLHIiKQorCShhbmQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAiYXZyMzJfcm13X21lbW9yeV9vcl9yZWdpc3Rlcl9vcGVyYW5kIiAgIiUwLHIsMCwwLCAgIDAsICAgMCwwLDAsMCxyIiApCisJCShtYXRjaF9vcGVyYW5kOlNJIDIgIm5vbm1lbW9yeV9vcGVyYW5kIiAgICAgICAgICAgICAgICAgICAgICIgTixNLE4sS3UxNixLczE3LEosTCxyLGksciIpKSldCisgICIiCisgICJACisgICBtZW1jXHQlMCwgJXoyCisgICBiZmV4dHVcdCUwLCAlMSwgMCwgJXoyCisgICBjYnJcdCUwLCAlejIKKyAgIGFuZGxcdCUwLCAlMiwgQ09ICisgICBhbmRsXHQlMCwgbG8oJTIpCisgICBhbmRoXHQlMCwgaGkoJTIpLCBDT0gKKyAgIGFuZGhcdCUwLCBoaSglMikKKyAgIGFuZFx0JTAsICUyCisgICBhbmRoXHQlMCwgaGkoJTIpXDthbmRsXHQlMCwgbG8oJTIpCisgICBhbmRcdCUwLCAlMSwgJTIiCisgIAorICBbKHNldF9hdHRyICJsZW5ndGgiICI0LDQsMiw0LDQsNCw0LDIsOCw0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lLHNldF96LHNldF96LHNldF96LHNldF96LHNldF96LHNldF96LHNldF96LHNldF96LHNldF96IildKQorCisoZGVmaW5lX2luc24gImFuZGRpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj0mciwmciIpCisJKGFuZDpESSAobWF0Y2hfb3BlcmFuZDpESSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiJTAsciIpCisgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIsciIpKSldCisgICIiCisgICIjIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI4IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildCispCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IG9yCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBTdG9yZSB0aGUgcmVzdWx0IGFmdGVyIGEgYml0d2lzZSBpbmNsdXNpdmUtb3IgYmV0d2VlbiByZWcwIGFuZCByZWcyIGluIHJlZzAuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfaW5zbiAiaW9yc2kzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJhdnIzMl9ybXdfbWVtb3J5X29yX3JlZ2lzdGVyX29wZXJhbmQiICAgICAgICAgICI9WSxyLHIsICAgcixyLHIsciIpCisJKGlvcjpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJhdnIzMl9ybXdfbWVtb3J5X29yX3JlZ2lzdGVyX29wZXJhbmQiICAiJTAsMCwwLCAgIDAsMCwwLHIiICkKKwkJKG1hdGNoX29wZXJhbmQ6U0kgMiAibm9ubWVtb3J5X29wZXJhbmQiICAgICAgICAgICAgICAgICAgICAgIiBPLE8sS3UxNixKLHIsaSxyIikpKV0KKyAgIiIKKyAgIkAKKyAgIG1lbXNcdCUwLCAlcDIKKyAgIHNiclx0JTAsICVwMgorICAgb3JsXHQlMCwgJTIKKyAgIG9yaFx0JTAsIGhpKCUyKQorICAgb3JcdCUwLCAlMgorICAgb3JoXHQlMCwgaGkoJTIpXDtvcmxcdCUwLCBsbyglMikKKyAgIG9yXHQlMCwgJTEsICUyIgorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQsMiw0LDQsMiw4LDQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUsc2V0X3osc2V0X3osc2V0X3osc2V0X3osc2V0X3osc2V0X3oiKV0pCisKKworKGRlZmluZV9pbnNuICJpb3JkaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIsJnIiKQorCShpb3I6REkgKG1hdGNoX29wZXJhbmQ6REkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiUwLHIiKQorICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkRJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyLHIiKSkpXQorICAiIgorICAiIyIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiOCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyB4b3IgYnl0ZXMKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IFN0b3JlIHRoZSByZXN1bHQgYWZ0ZXIgYSBiaXR3aXNlIGV4Y2x1c2l2ZS1vciBiZXR3ZWVuIHJlZzAgYW5kIHJlZzIgaW4gcmVnMC4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9pbnNuICJ4b3JzaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgImF2cjMyX3Jtd19tZW1vcnlfb3JfcmVnaXN0ZXJfb3BlcmFuZCIgICAgICAgICAgIj1ZLHIsICAgcixyLHIsciIpCisJKHhvcjpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJhdnIzMl9ybXdfbWVtb3J5X29yX3JlZ2lzdGVyX29wZXJhbmQiICAiJTAsMCwgICAwLDAsMCxyIiApCisJCShtYXRjaF9vcGVyYW5kOlNJIDIgIm5vbm1lbW9yeV9vcGVyYW5kIiAgICAgICAgICAgICAgICAgICAgICIgTyxLdTE2LEoscixpLHIiKSkpXQorICAiIgorICAiQAorICAgbWVtdFx0JTAsICVwMgorICAgZW9ybFx0JTAsICUyCisgICBlb3JoXHQlMCwgaGkoJTIpCisgICBlb3JcdCUwLCAlMgorICAgZW9yaFx0JTAsIGhpKCUyKVw7ZW9ybFx0JTAsIGxvKCUyKQorICAgZW9yXHQlMCwgJTEsICUyIgorICAKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCw0LDQsMiw4LDQiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUsc2V0X3osc2V0X3osc2V0X3osc2V0X3osc2V0X3oiKV0pCisKKworKGRlZmluZV9pbnNuICJ4b3JkaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIsJnIiKQorCSh4b3I6REkgKG1hdGNoX29wZXJhbmQ6REkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiUwLHIiKQorICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkRJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyLHIiKSkpXQorICAiIgorICAiIyIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiOCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBUaHJlZSBvcGVyYW5kIHByZWRpY2FibGUgaW5zbnMKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9pbnNuICI8cHJlZGljYWJsZV9pbnNuMz48bW9kZT5fcHJlZGljYWJsZSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SU5UTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShwcmVkaWNhYmxlX29wMzpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMSAicmVnaXN0ZXJfb3BlcmFuZCIgIjxwcmVkaWNhYmxlX2NvbW11dGF0aXZlMz5yIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SU5UTSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgICI8cHJlZGljYWJsZV9pbnNuMz4lP1x0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY21wX2NvbmRfaW5zbiIpCisgICAoc2V0X2F0dHIgInByZWRpY2FibGUiICJ5ZXMiKV0KKykKKworKGRlZmluZV9pbnNuX2FuZF9zcGxpdCAiPHByZWRpY2FibGVfaW5zbjM+PG1vZGU+X2ltbV9jbG9iYmVyX3ByZWRpY2FibGUiCisgIFsocGFyYWxsZWwgCisgICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SU5UTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAgIChwcmVkaWNhYmxlX29wMzpJTlRNIChtYXRjaF9vcGVyYW5kOklOVE0gMSAicmVnaXN0ZXJfb3BlcmFuZCIgIjxwcmVkaWNhYmxlX2NvbW11dGF0aXZlMz5yIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpJTlRNIDIgImF2cjMyX21vdl9pbW1lZGlhdGVfb3BlcmFuZCIgIkpLczIxIikpKQorICAgICAoY2xvYmJlciAobWF0Y2hfb3BlcmFuZDpJTlRNIDMgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKSldKV0KKyAgIlRBUkdFVF9WMl9JTlNOUyIKKyAgeworICAgaWYgKCBjdXJyZW50X2luc25fcHJlZGljYXRlICE9IE5VTExfUlRYICkgCisgICAgICB7CisgICAgICAgaWYgKCBhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChJTlRWQUwgKG9wZXJhbmRzWzJdKSwgJ0snLCAiS3MwOCIpICkKKyAgICAgICAgICByZXR1cm4gIiUhIG1vdiU/XHQlMywgJTJcOzxwcmVkaWNhYmxlX2luc24zPiU/XHQlMCwgJTEsICUzIjsKKyAgICAgICBlbHNlIGlmICggYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoSU5UVkFMIChvcGVyYW5kc1syXSksICdLJywgIktzMjEiKSApCisgICAgICAgICAgcmV0dXJuICIlISBtb3ZcdCUzLCAlMlw7PHByZWRpY2FibGVfaW5zbjM+JT9cdCUwLCAlMSwgJTMiOworICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gIiUhIG1vdmhcdCUzLCBoaSglMilcOzxwcmVkaWNhYmxlX2luc24zPiU/XHQlMCwgJTEsICUzIjsKKyAgICAgICB9CisgICBlbHNlCisgICAgICB7CisgICAgICAgaWYgKCAhYXZyMzJfY29uZF9pbW1fY2xvYmJlcl9zcGxpdHRhYmxlIChpbnNuLCBvcGVyYW5kcykgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGF2cjMyX2NvbnN0X29rX2Zvcl9jb25zdHJhaW50X3AgKElOVFZBTCAob3BlcmFuZHNbMl0pLCAnSycsICJLczA4IikgKQorICAgICAgICAgICAgICAgICAgIHJldHVybiAibW92JT9cdCUzLCAlMlw7PHByZWRpY2FibGVfaW5zbjM+JT9cdCUwLCAlMSwgJTMiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChJTlRWQUwgKG9wZXJhbmRzWzJdKSwgJ0snLCAiS3MyMSIpICkKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1vdlx0JTMsICUyXDs8cHJlZGljYWJsZV9pbnNuMz4lP1x0JTAsICUxLCAlMyI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIHJldHVybiAibW92aFx0JTMsIGhpKCUyKVw7PHByZWRpY2FibGVfaW5zbjM+JT9cdCUwLCAlMSwgJTMiOworICAgICAgICAgIH0KKyAgICAgICByZXR1cm4gIiMiOworICAgICAgfQorICAgICAgCisgIH0KKyAgOzsgSWYgd2UgZmluZCBvdXQgdGhhdCB3ZSBjb3VsZCBub3QgYWN0dWFsbHkgZG8gaWYtY29udmVyc2lvbiBvbiB0aGUgYmxvY2sKKyAgOzsgY29udGFpbmluZyB0aGlzIGluc24gd2UgY29udmVydCBpdCBiYWNrIHRvIG5vcm1hbCBpbW1lZGlhdGUgZm9ybWF0CisgIDs7IHRvIGF2b2lkIG91dHB1dGluZyBhIHJlZHVuZGFudCBtb3ZlIGluc24KKyAgOzsgRG8gbm90IHNwbGl0IHVudGlsIGFmdGVyIHdlIGhhdmUgY2hlY2tlZCBpZiB3ZSBjYW4gbWFrZSB0aGUgaW5zbiAKKyAgOzsgY29uZGl0aW9uYWwuCisgICIoR0VUX0NPREUgKFBBVFRFUk4gKGluc24pKSAhPSBDT05EX0VYRUMKKyAgICAmJiBjZnVuLT5tYWNoaW5lLT5pZmN2dF9hZnRlcl9yZWxvYWQKKyAgICAmJiBhdnIzMl9jb25kX2ltbV9jbG9iYmVyX3NwbGl0dGFibGUgKGluc24sIG9wZXJhbmRzKSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMCkKKyAgICAgICAgKHByZWRpY2FibGVfb3AzOklOVE0gKG1hdGNoX2R1cCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDIpKSldCisgICIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjgiKQorICAgKHNldF9hdHRyICJjYyIgImNtcF9jb25kX2luc24iKQorICAgKHNldF9hdHRyICJwcmVkaWNhYmxlIiAieWVzIildCisgICkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBaZXJvIGV4dGVuZCBwcmVkaWNhYmxlIGluc25zCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc25fYW5kX3NwbGl0ICJ6ZXJvX2V4dGVuZGhpc2lfY2xvYmJlcl9wcmVkaWNhYmxlIgorICBbKHBhcmFsbGVsIAorICAgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICAgKHplcm9fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgICAoY2xvYmJlciAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiPSZyIikpXSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgIHsKKyAgIGlmICggY3VycmVudF9pbnNuX3ByZWRpY2F0ZSAhPSBOVUxMX1JUWCApIAorICAgICAgeworICAgICAgICAgcmV0dXJuICIlISBtb3ZcdCUyLCAweGZmZmZcO2FuZCU/XHQlMCwgJTEsICUyIjsKKyAgICAgICB9CisgICBlbHNlCisgICAgICB7CisgICAgICAgcmV0dXJuICIjIjsKKyAgICAgIH0KKyAgICAgIAorICB9CisgIDs7IElmIHdlIGZpbmQgb3V0IHRoYXQgd2UgY291bGQgbm90IGFjdHVhbGx5IGRvIGlmLWNvbnZlcnNpb24gb24gdGhlIGJsb2NrCisgIDs7IGNvbnRhaW5pbmcgdGhpcyBpbnNuIHdlIGNvbnZlcnQgaXQgYmFjayB0byBub3JtYWwgaW1tZWRpYXRlIGZvcm1hdAorICA7OyB0byBhdm9pZCBvdXRwdXRpbmcgYSByZWR1bmRhbnQgbW92ZSBpbnNuCisgIDs7IERvIG5vdCBzcGxpdCB1bnRpbCBhZnRlciB3ZSBoYXZlIGNoZWNrZWQgaWYgd2UgY2FuIG1ha2UgdGhlIGluc24gCisgIDs7IGNvbmRpdGlvbmFsLgorICAiKEdFVF9DT0RFIChQQVRURVJOIChpbnNuKSkgIT0gQ09ORF9FWEVDCisgICAgJiYgY2Z1bi0+bWFjaGluZS0+aWZjdnRfYWZ0ZXJfcmVsb2FkKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKQorICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpXQorICAiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI4IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorICApCisKKyhkZWZpbmVfaW5zbl9hbmRfc3BsaXQgInplcm9fZXh0ZW5kcWlzaV9jbG9iYmVyX3ByZWRpY2FibGUiCisgIFsocGFyYWxsZWwgCisgICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6UUkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgIChjbG9iYmVyIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKSldKV0KKyAgIlRBUkdFVF9WMl9JTlNOUyIKKyAgeworICAgaWYgKCBjdXJyZW50X2luc25fcHJlZGljYXRlICE9IE5VTExfUlRYICkgCisgICAgICB7CisgICAgICAgICByZXR1cm4gIiUhIG1vdlx0JTIsIDB4ZmZcO2FuZCU/XHQlMCwgJTEsICUyIjsKKyAgICAgICB9CisgICBlbHNlCisgICAgICB7CisgICAgICAgcmV0dXJuICIjIjsKKyAgICAgIH0KKyAgICAgIAorICB9CisgIDs7IElmIHdlIGZpbmQgb3V0IHRoYXQgd2UgY291bGQgbm90IGFjdHVhbGx5IGRvIGlmLWNvbnZlcnNpb24gb24gdGhlIGJsb2NrCisgIDs7IGNvbnRhaW5pbmcgdGhpcyBpbnNuIHdlIGNvbnZlcnQgaXQgYmFjayB0byBub3JtYWwgaW1tZWRpYXRlIGZvcm1hdAorICA7OyB0byBhdm9pZCBvdXRwdXRpbmcgYSByZWR1bmRhbnQgbW92ZSBpbnNuCisgIDs7IERvIG5vdCBzcGxpdCB1bnRpbCBhZnRlciB3ZSBoYXZlIGNoZWNrZWQgaWYgd2UgY2FuIG1ha2UgdGhlIGluc24gCisgIDs7IGNvbmRpdGlvbmFsLgorICAiKEdFVF9DT0RFIChQQVRURVJOIChpbnNuKSkgIT0gQ09ORF9FWEVDCisgICAgJiYgY2Z1bi0+bWFjaGluZS0+aWZjdnRfYWZ0ZXJfcmVsb2FkKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKQorICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpXQorICAiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI4IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorICApCisKKyhkZWZpbmVfaW5zbl9hbmRfc3BsaXQgInplcm9fZXh0ZW5kcWloaV9jbG9iYmVyX3ByZWRpY2FibGUiCisgIFsocGFyYWxsZWwgCisgICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgICAoemVyb19leHRlbmQ6SEkgKG1hdGNoX29wZXJhbmQ6UUkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgIChjbG9iYmVyIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKSldKV0KKyAgIlRBUkdFVF9WMl9JTlNOUyIKKyAgeworICAgaWYgKCBjdXJyZW50X2luc25fcHJlZGljYXRlICE9IE5VTExfUlRYICkgCisgICAgICB7CisgICAgICAgICByZXR1cm4gIiUhIG1vdlx0JTIsIDB4ZmZcO2FuZCU/XHQlMCwgJTEsICUyIjsKKyAgICAgICB9CisgICBlbHNlCisgICAgICB7CisgICAgICAgcmV0dXJuICIjIjsKKyAgICAgIH0KKyAgICAgIAorICB9CisgIDs7IElmIHdlIGZpbmQgb3V0IHRoYXQgd2UgY291bGQgbm90IGFjdHVhbGx5IGRvIGlmLWNvbnZlcnNpb24gb24gdGhlIGJsb2NrCisgIDs7IGNvbnRhaW5pbmcgdGhpcyBpbnNuIHdlIGNvbnZlcnQgaXQgYmFjayB0byBub3JtYWwgaW1tZWRpYXRlIGZvcm1hdAorICA7OyB0byBhdm9pZCBvdXRwdXRpbmcgYSByZWR1bmRhbnQgbW92ZSBpbnNuCisgIDs7IERvIG5vdCBzcGxpdCB1bnRpbCBhZnRlciB3ZSBoYXZlIGNoZWNrZWQgaWYgd2UgY2FuIG1ha2UgdGhlIGluc24gCisgIDs7IGNvbmRpdGlvbmFsLgorICAiKEdFVF9DT0RFIChQQVRURVJOIChpbnNuKSkgIT0gQ09ORF9FWEVDCisgICAgJiYgY2Z1bi0+bWFjaGluZS0+aWZjdnRfYWZ0ZXJfcmVsb2FkKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKQorICAgICAgICAoemVyb19leHRlbmQ6SEkgKG1hdGNoX2R1cCAxKSkpXQorICAiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI4IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorICApCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBkaXZtb2QKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IFNpZ25lZCBkaXZpc2lvbiB0aGF0IHByb2R1Y2VzIGJvdGggYSBxdW90aWVudCBhbmQgYSByZW1haW5kZXIuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2V4cGFuZCAiZGl2bW9kc2k0IgorICBbKHBhcmFsbGVsIFsKKyAgICAgKHBhcmFsbGVsIFsKKyAgICAgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJICAgIChkaXY6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorCQkgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpCisgICAgICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCSAgICAobW9kOlNJIChtYXRjaF9kdXAgMSkKKwkJICAgIChtYXRjaF9kdXAgMikpKV0pCisgICAgICh1c2UgKG1hdGNoX2R1cCA0KSldKV0KKyAgIiIKKyAgeworICAgIGlmICghIG5vX25ld19wc2V1ZG9zKSB7CisgICAgICBvcGVyYW5kc1s0XSA9IGdlbl9yZWdfcnR4IChESW1vZGUpOworCisgICAgICBlbWl0X2luc24oZ2VuX2Rpdm1vZHNpNF9pbnRlcm5hbChvcGVyYW5kc1s0XSxvcGVyYW5kc1sxXSxvcGVyYW5kc1syXSkpOworICAgICAgZW1pdF9tb3ZlX2luc24ob3BlcmFuZHNbMF0sIGdlbl9ydHhfU1VCUkVHKCBTSW1vZGUsIG9wZXJhbmRzWzRdLCA0KSk7CisgICAgICBlbWl0X21vdmVfaW5zbihvcGVyYW5kc1szXSwgZ2VuX3J0eF9TVUJSRUcoIFNJbW9kZSwgb3BlcmFuZHNbNF0sIDApKTsKKworICAgICAgRE9ORTsKKyAgICB9IGVsc2UgeworICAgICAgRkFJTDsKKyAgICB9CisKKyAgfSkKKworCisoZGVmaW5lX2luc24gImRpdm1vZHNpNF9pbnRlcm5hbCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkodW5zcGVjOkRJIFsobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisJCSAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpXQorCQkgICBVTlNQRUNfRElWTU9EU0k0X0lOVEVSTkFMKSldCisgICIiCisgICJkaXZzICAgICUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJkaXYiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgdWRpdm1vZAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgVW5zaWduZWQgZGl2aXNpb24gdGhhdCBwcm9kdWNlcyBib3RoIGEgcXVvdGllbnQgYW5kIGEgcmVtYWluZGVyLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgInVkaXZtb2RzaTQiCisgWyhwYXJhbGxlbCBbCisgICAgKHBhcmFsbGVsIFsKKyAgICAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkgICAodWRpdjpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisJCSAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSkKKyAgICAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMyAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkgICAodW1vZDpTSSAobWF0Y2hfZHVwIDEpCisJCSAgICAobWF0Y2hfZHVwIDIpKSldKQorICAgICh1c2UgKG1hdGNoX2R1cCA0KSldKV0KKyAgIiIKKyAgeworICAgIGlmICghIG5vX25ld19wc2V1ZG9zKSB7CisgICAgICBvcGVyYW5kc1s0XSA9IGdlbl9yZWdfcnR4IChESW1vZGUpOworCisgICAgICBlbWl0X2luc24oZ2VuX3VkaXZtb2RzaTRfaW50ZXJuYWwob3BlcmFuZHNbNF0sb3BlcmFuZHNbMV0sb3BlcmFuZHNbMl0pKTsKKyAgICAgIGVtaXRfbW92ZV9pbnNuKG9wZXJhbmRzWzBdLCBnZW5fcnR4X1NVQlJFRyggU0ltb2RlLCBvcGVyYW5kc1s0XSwgNCkpOworICAgICAgZW1pdF9tb3ZlX2luc24ob3BlcmFuZHNbM10sIGdlbl9ydHhfU1VCUkVHKCBTSW1vZGUsIG9wZXJhbmRzWzRdLCAwKSk7CisKKyAgICAgIERPTkU7CisgICAgfSBlbHNlIHsKKyAgICAgIEZBSUw7CisgICAgfQorICB9KQorCisoZGVmaW5lX2luc24gInVkaXZtb2RzaTRfaW50ZXJuYWwiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHVuc3BlYzpESSBbKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorCQkgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0KKwkJICAgVU5TUEVDX1VESVZNT0RTSTRfSU5URVJOQUwpKV0KKyAgIiIKKyAgImRpdnUgICAgJTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgImRpdiIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBBcml0aG1ldGljLXNoaWZ0IGxlZnQKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IEFyaXRobWV0aWMtc2hpZnQgcmVnMCBsZWZ0IGJ5IHJlZzIgb3IgaW1tZWRpYXRlIHZhbHVlLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisoZGVmaW5lX2luc24gImFzaGxzaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICAgICAgICAiPXIscixyIikKKwkoYXNoaWZ0OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyLDAsciIpCisJCSAgIChtYXRjaF9vcGVyYW5kOlNJIDIgIm5vbm1lbW9yeV9vcGVyYW5kIiAicixLdTA1LEt1MDUiKSkpXQorICAiIgorICAiQAorICAgbHNsICAgICAlMCwgJTEsICUyCisgICBsc2wgICAgICUwLCAlMgorICAgbHNsICAgICAlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0LDIsNCIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X25jeiIpXSkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgQXJpdGhtZXRpYy1zaGlmdCByaWdodAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQXJpdGhtZXRpYy1zaGlmdCByZWcwIHJpZ2h0IGJ5IGFuIGltbWVkaWF0ZSB2YWx1ZS4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9pbnNuICJhc2hyc2kzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgICAgICAgICAgICAiPXIscixyIikKKwkoYXNoaWZ0cnQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIsMCxyIikKKwkJICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJub25tZW1vcnlfb3BlcmFuZCIgInIsS3UwNSxLdTA1IikpKV0KKyAgIiIKKyAgIkAKKyAgIGFzciAgICAgJTAsICUxLCAlMgorICAgYXNyICAgICAlMCwgJTIKKyAgIGFzciAgICAgJTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCwyLDQiKQorICAgKHNldF9hdHRyICJjYyIgInNldF9uY3oiKV0pCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IExvZ2ljYWwgc2hpZnQgcmlnaHQKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IExvZ2ljYWwgc2hpZnQgcmVnMCByaWdodCBieSBhbiBpbW1lZGlhdGUgdmFsdWUuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfaW5zbiAibHNocnNpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLHIsciIpCisJKGxzaGlmdHJ0OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyLDAsciIpCisJCSAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAibm9ubWVtb3J5X29wZXJhbmQiICJyLEt1MDUsS3UwNSIpKSldCisgICIiCisgICJACisgICBsc3IgICAgICUwLCAlMSwgJTIKKyAgIGxzciAgICAgJTAsICUyCisgICBsc3IgICAgICUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQsMiw0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfbmN6IildKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IG5lZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgTmVnYXRlIG9wZXJhbmQgMSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBvcGVyYW5kIDAuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc24gIm5lZ3NpMiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLHIiKQorCShuZWc6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIjAsciIpKSldCisgICIiCisgICJACisgICBuZWdcdCUwCisgICByc3ViXHQlMCwgJTEsIDAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X3ZuY3oiKV0pCisKKyhkZWZpbmVfaW5zbiAibmVnc2kyX3ByZWRpY2FibGUiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIrciIpCisJKG5lZzpTSSAobWF0Y2hfZHVwIDApKSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgICJyc3ViJT9cdCUwLCAwIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXSkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgYWJzCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBTdG9yZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2Ygb3BlcmFuZCAxIGludG8gb3BlcmFuZCAwLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJhYnNzaTIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKGFiczpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiMCIpKSldCisgICIiCisgICJhYnNcdCUwIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfeiIpXSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBvbmVfY21wbAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgU3RvcmUgdGhlIGJpdHdpc2UtY29tcGxlbWVudCBvZiBvcGVyYW5kIDEgaW50byBvcGVyYW5kIDAuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfaW5zbiAib25lX2NtcGxzaTIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyIikKKwkobm90OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIwLHIiKSkpXQorICAiIgorICAiQAorICAgY29tXHQlMAorICAgcnN1Ylx0JTAsICUxLCAtMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiw0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfeiIpXSkKKworCisoZGVmaW5lX2luc24gIm9uZV9jbXBsc2kyX3ByZWRpY2FibGUiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIrciIpCisJKG5vdDpTSSAobWF0Y2hfZHVwIDApKSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgICJyc3ViJT9cdCUwLCAtMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY21wX2NvbmRfaW5zbiIpCisgICAoc2V0X2F0dHIgInByZWRpY2FibGUiICJ5ZXMiKV0pCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgQml0IGxvYWQKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IExvYWQgYSBiaXQgaW50byBaIGFuZCBDIGZsYWdzCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc24gImJsZHNpIgorICBbKHNldCAoY2MwKQorICAgICAgICAoYW5kOlNJIChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJvbmVfYml0X3NldF9vcGVyYW5kIiAiaSIpKSldCisgICIiCisgICJibGRcdCUwLCAlcDEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImJsZCIpXQorICApCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgQ29tcGFyZQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQ29tcGFyZSByZWcwIHdpdGggcmVnMSBvciBhbiBpbW1lZGlhdGUgdmFsdWUuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfZXhwYW5kICJjbXA8bW9kZT4iCisgIFsoc2V0IChjYzApCisJKGNvbXBhcmU6Q01QCisJIChtYXRjaF9vcGVyYW5kOkNNUCAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkgKG1hdGNoX29wZXJhbmQ6Q01QIDEgIjxDTVA6Y21wX3ByZWRpY2F0ZT4iICAiIikpKV0KKyAgIiIKKyAgInsKKyAgIGF2cjMyX2NvbXBhcmVfb3AwID0gb3BlcmFuZHNbMF07CisgICBhdnIzMl9jb21wYXJlX29wMSA9IG9wZXJhbmRzWzFdOworICB9IgorKQorCisoZGVmaW5lX2luc24gImNtcDxtb2RlPl9pbnRlcm5hbCIKKyAgWyhzZXQgKGNjMCkKKyAgICAgICAgKGNvbXBhcmU6Q01QCisgICAgICAgICAobWF0Y2hfb3BlcmFuZDpDTVAgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgKG1hdGNoX29wZXJhbmQ6Q01QIDEgIjxDTVA6Y21wX3ByZWRpY2F0ZT4iICI8Q01QOmNtcF9jb25zdHJhaW50PiIpKSldCisgICIiCisgIHsKKyAgIHNldF9uZXh0X2luc25fY29uZChpbnNuLAorICAgICAgICAgICAgICAgICAgICAgIGF2cjMyX291dHB1dF9jbXAoZ2V0X25leHRfaW5zbl9jb25kKGluc24pLCBHRVRfTU9ERSAob3BlcmFuZHNbMF0pLCBvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0pKTsKKyAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjb21wYXJlIildKQorCisKKzs7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBUZXN0IGlmIHplcm8KKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IENvbXBhcmUgcmVnIGFnYWluc3QgemVybyBhbmQgc2V0IHRoZSBjb25kaXRpb24gY29kZXMuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworKGRlZmluZV9leHBhbmQgInRzdHNpIgorICBbKHNldCAoY2MwKQorCShtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKSldCisgICIiCisgIHsKKyAgIGF2cjMyX2NvbXBhcmVfb3AwID0gb3BlcmFuZHNbMF07CisgICBhdnIzMl9jb21wYXJlX29wMSA9IGNvbnN0MF9ydHg7CisgIH0KKykKKworKGRlZmluZV9pbnNuICJ0c3RzaV9pbnRlcm5hbCIKKyAgWyhzZXQgKGNjMCkKKwkobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKV0KKyAgIiIKKyAgeworICAgc2V0X25leHRfaW5zbl9jb25kKGluc24sCisgICAgIGF2cjMyX291dHB1dF9jbXAoZ2V0X25leHRfaW5zbl9jb25kKGluc24pLCBTSW1vZGUsIG9wZXJhbmRzWzBdLCBjb25zdDBfcnR4KSk7CisKKyAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIikKKyAgIChzZXRfYXR0ciAiY2MiICJjb21wYXJlIildKQorCisKKyhkZWZpbmVfZXhwYW5kICJ0c3RkaSIKKyAgWyhzZXQgKGNjMCkKKwkobWF0Y2hfb3BlcmFuZDpESSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpXQorICAiIgorICB7CisgICBhdnIzMl9jb21wYXJlX29wMCA9IG9wZXJhbmRzWzBdOworICAgYXZyMzJfY29tcGFyZV9vcDEgPSBjb25zdDBfcnR4OworICB9CispCisKKyhkZWZpbmVfaW5zbiAidHN0ZGlfaW50ZXJuYWwiCisgIFsoc2V0IChjYzApCisJKG1hdGNoX29wZXJhbmQ6REkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSldCisgICIiCisgIHsKKyAgIHNldF9uZXh0X2luc25fY29uZChpbnNuLAorICAgICBhdnIzMl9vdXRwdXRfY21wKGdldF9uZXh0X2luc25fY29uZChpbnNuKSwgREltb2RlLCBvcGVyYW5kc1swXSwgY29uc3QwX3J0eCkpOworICAgcmV0dXJuICIiOworICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1MiIpCisgICAoc2V0X2F0dHIgImNjIiAiY29tcGFyZSIpXSkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IENvbnZlcnQgb3BlcmFuZHMKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc24gInRydW5jZGlzaTIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgImdlbmVyYWxfb3BlcmFuZCIgIiIpCisJKHRydW5jYXRlOlNJIChtYXRjaF9vcGVyYW5kOkRJIDEgImdlbmVyYWxfb3BlcmFuZCIgIiIpKSldCisgICIiCisgICJ0cnVuY2Rpc2kyIikKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgRXh0ZW5kCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyhkZWZpbmVfaW5zbiAiZXh0ZW5kaGlzaTIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyLHIsciIpCisJKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDEgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiMCxyLDxSS3UwMD4sbSIpKSldCisgICIiCisgIHsKKyAgIHN3aXRjaCAoIHdoaWNoX2FsdGVybmF0aXZlICl7CisgICAgIGNhc2UgMDoKKyAgICAgICByZXR1cm4gICAgImNhc3RzLmhcdCUwIjsKKyAgICAgY2FzZSAxOgorICAgICAgIHJldHVybiAgICAiYmZleHRzXHQlMCwgJTEsIDAsIDE2IjsKKyAgICAgY2FzZSAyOgorICAgICBjYXNlIDM6CisgICAgICAgcmV0dXJuICAgICJsZC5zaFx0JTAsICUxIjsKKyAgICAgZGVmYXVsdDoKKyAgICAgICBhYm9ydCgpOworICAgfQorICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCwyLDQiKQorICAgKHNldF9hdHRyICJjYyIgInNldF9uY3osc2V0X25jeixub25lLG5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1LGFsdSxsb2FkX3JtLGxvYWRfcm0iKV0pCisKKyhkZWZpbmVfaW5zbiAiZXh0ZW5kcWlzaTIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyLHIsciIpCisJKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOlFJIDEgImV4dGVuZHFpX29wZXJhbmQiICIwLHIsUkt1MDAsbSIpKSldCisgICIiCisgIHsKKyAgIHN3aXRjaCAoIHdoaWNoX2FsdGVybmF0aXZlICl7CisgICAgIGNhc2UgMDoKKyAgICAgICByZXR1cm4gICAgImNhc3RzLmJcdCUwIjsKKyAgICAgY2FzZSAxOgorICAgICAgIHJldHVybiAgICAiYmZleHRzXHQlMCwgJTEsIDAsIDgiOworICAgICBjYXNlIDI6CisgICAgIGNhc2UgMzoKKyAgICAgICByZXR1cm4gICAgImxkLnNiXHQlMCwgJTEiOworICAgICBkZWZhdWx0OgorICAgICAgIGFib3J0KCk7CisgICB9CisgIH0KKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiw0LDIsNCIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X25jeixzZXRfbmN6LG5vbmUsbm9uZSIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUsYWx1LGxvYWRfcm0sbG9hZF9ybSIpXSkKKworKGRlZmluZV9pbnNuICJleHRlbmRxaWhpMiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLHIscixyIikKKwkoc2lnbl9leHRlbmQ6SEkgKG1hdGNoX29wZXJhbmQ6UUkgMSAiZXh0ZW5kcWlfb3BlcmFuZCIgIjAscixSS3UwMCxtIikpKV0KKyAgIiIKKyAgeworICAgc3dpdGNoICggd2hpY2hfYWx0ZXJuYXRpdmUgKXsKKyAgICAgY2FzZSAwOgorICAgICAgIHJldHVybiAgICAiY2FzdHMuYlx0JTAiOworICAgICBjYXNlIDE6CisgICAgICAgcmV0dXJuICAgICJiZmV4dHNcdCUwLCAlMSwgMCwgOCI7CisgICAgIGNhc2UgMjoKKyAgICAgY2FzZSAzOgorICAgICAgIHJldHVybiAgICAibGQuc2JcdCUwLCAlMSI7CisgICAgIGRlZmF1bHQ6CisgICAgICAgYWJvcnQoKTsKKyAgIH0KKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICIyLDQsMiw0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfbmN6LHNldF9uY3osbm9uZSxub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSxhbHUsbG9hZF9ybSxsb2FkX3JtIildKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IFplcm8tZXh0ZW5kCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisoZGVmaW5lX2luc24gInplcm9fZXh0ZW5kaGlzaTIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyLHIsciIpCisJKHplcm9fZXh0ZW5kOlNJIChtYXRjaF9vcGVyYW5kOkhJIDEgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAiMCxyLDxSS3UwMD4sbSIpKSldCisgICIiCisgIHsKKyAgIHN3aXRjaCAoIHdoaWNoX2FsdGVybmF0aXZlICl7CisgICAgIGNhc2UgMDoKKyAgICAgICByZXR1cm4gICAgImNhc3R1LmhcdCUwIjsKKyAgICAgY2FzZSAxOgorICAgICAgIHJldHVybiAgICAiYmZleHR1XHQlMCwgJTEsIDAsIDE2IjsKKyAgICAgY2FzZSAyOgorICAgICBjYXNlIDM6CisgICAgICAgcmV0dXJuICAgICJsZC51aFx0JTAsICUxIjsKKyAgICAgZGVmYXVsdDoKKyAgICAgICBhYm9ydCgpOworICAgfQorICB9CisKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiw0LDIsNCIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X25jeixzZXRfbmN6LG5vbmUsbm9uZSIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUsYWx1LGxvYWRfcm0sbG9hZF9ybSIpXSkKKworKGRlZmluZV9pbnNuICJ6ZXJvX2V4dGVuZHFpc2kyIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIscixyLHIiKQorCSh6ZXJvX2V4dGVuZDpTSSAobWF0Y2hfb3BlcmFuZDpRSSAxICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIjAsciw8Ukt1MDA+LG0iKSkpXQorICAiIgorICB7CisgICBzd2l0Y2ggKCB3aGljaF9hbHRlcm5hdGl2ZSApeworICAgICBjYXNlIDA6CisgICAgICAgcmV0dXJuICAgICJjYXN0dS5iXHQlMCI7CisgICAgIGNhc2UgMToKKyAgICAgICByZXR1cm4gICAgImJmZXh0dVx0JTAsICUxLCAwLCA4IjsKKyAgICAgY2FzZSAyOgorICAgICBjYXNlIDM6CisgICAgICAgcmV0dXJuICAgICJsZC51Ylx0JTAsICUxIjsKKyAgICAgZGVmYXVsdDoKKyAgICAgICBhYm9ydCgpOworICAgfQorICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCwyLDQiKQorICAgKHNldF9hdHRyICJjYyIgInNldF9uY3osIHNldF9uY3osIG5vbmUsIG5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1LCBhbHUsIGxvYWRfcm0sIGxvYWRfcm0iKV0pCisKKyhkZWZpbmVfaW5zbiAiemVyb19leHRlbmRxaWhpMiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLHIscixyIikKKwkoemVyb19leHRlbmQ6SEkgKG1hdGNoX29wZXJhbmQ6UUkgMSAibm9uaW1tZWRpYXRlX29wZXJhbmQiICIwLHIsPFJLdTAwPixtIikpKV0KKyAgIiIKKyAgeworICAgc3dpdGNoICggd2hpY2hfYWx0ZXJuYXRpdmUgKXsKKyAgICAgY2FzZSAwOgorICAgICAgIHJldHVybiAgICAiY2FzdHUuYlx0JTAiOworICAgICBjYXNlIDE6CisgICAgICAgcmV0dXJuICAgICJiZmV4dHVcdCUwLCAlMSwgMCwgOCI7CisgICAgIGNhc2UgMjoKKyAgICAgY2FzZSAzOgorICAgICAgIHJldHVybiAgICAibGQudWJcdCUwLCAlMSI7CisgICAgIGRlZmF1bHQ6CisgICAgICAgYWJvcnQoKTsKKyAgIH0KKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICIyLDQsMiw0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfbmN6LCBzZXRfbmN6LCBub25lLCBub25lIikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSwgYWx1LCBsb2FkX3JtLCBsb2FkX3JtIildKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IENvbmRpdGlvbmFsIGxvYWQgYW5kIGV4dGVuZCBpbnNucworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJsZHNpPG1vZGU+X3ByZWRpY2FibGVfc2UiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgIChzaWduX2V4dGVuZDpTSSAKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kOklOVE0gMSAibWVtb3J5X29wZXJhbmQiICI8SU5UTTpwcmVkX21lbV9jb25zdHJhaW50PiIpKSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgICJsZDxJTlRNOmxvYWRfcG9zdGZpeF9zPiU/XHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImNtcF9jb25kX2luc24iKQorICAgKHNldF9hdHRyICJ0eXBlIiAibG9hZCIpCisgICAoc2V0X2F0dHIgInByZWRpY2FibGUiICJ5ZXMiKV0KKykKKworKGRlZmluZV9pbnNuICJsZHNpPG1vZGU+X3ByZWRpY2FibGVfemUiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICh6ZXJvX2V4dGVuZDpTSSAKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kOklOVE0gMSAibWVtb3J5X29wZXJhbmQiICI8SU5UTTpwcmVkX21lbV9jb25zdHJhaW50PiIpKSldCisgICJUQVJHRVRfVjJfSU5TTlMiCisgICJsZDxJTlRNOmxvYWRfcG9zdGZpeF91PiU/XHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImNtcF9jb25kX2luc24iKQorICAgKHNldF9hdHRyICJ0eXBlIiAibG9hZCIpCisgICAoc2V0X2F0dHIgInByZWRpY2FibGUiICJ5ZXMiKV0KKykKKworKGRlZmluZV9pbnNuICJsZGhpX3ByZWRpY2FibGVfemUiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICh6ZXJvX2V4dGVuZDpISSAKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kOlFJIDEgIm1lbW9yeV9vcGVyYW5kIiAiUktzMTAiKSkpXQorICAiVEFSR0VUX1YyX0lOU05TIgorICAibGQudWIlP1x0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIikKKyAgIChzZXRfYXR0ciAidHlwZSIgImxvYWQiKQorICAgKHNldF9hdHRyICJwcmVkaWNhYmxlIiAieWVzIildCispCisKKyhkZWZpbmVfaW5zbiAibGRoaV9wcmVkaWNhYmxlX3NlIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAoc2lnbl9leHRlbmQ6SEkgCisgICAgICAgICAobWF0Y2hfb3BlcmFuZDpRSSAxICJtZW1vcnlfb3BlcmFuZCIgIlJLczEwIikpKV0KKyAgIlRBUkdFVF9WMl9JTlNOUyIKKyAgImxkLnNiJT9cdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY21wX2NvbmRfaW5zbiIpCisgICAoc2V0X2F0dHIgInR5cGUiICJsb2FkIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXQorKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBDb25kaXRpb25hbCBzZXQgcmVnaXN0ZXIKKzs7IHNye2NvbmQ0fSAgcmQKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOztCZWNhdXNlIG9mIHRoZSBzYW1lIGlzc3VlIGFzIHdpdGggY29uZGl0aW9uYWwgbW92ZXMgYW5kIGFkZHMgd2UgbXVzdAorOztub3Qgc2VwYXJhdGUgdGhlIGNvbXBhcmUgaW5zdHJjdXRpb24gZnJvbSB0aGUgc2NjIGluc3RydWN0aW9uIGFzCis7O3RoZXkgbWlnaHQgYmUgc2hlZHVsZWQgImJhZGx5Ii4KKworKGRlZmluZV9pbnNuICJzPGNvZGU+IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShhbnlfY29uZDpTSSAoY2MwKQorICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAwKSkpXQorICAiIgorICAic3I8Y29uZD5cdCUwIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisoZGVmaW5lX2luc24gInNtaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkodW5zcGVjOlNJIFsoY2MwKQorICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDApXSBVTlNQRUNfQ09ORF9NSSkpXQorICAiIgorICAic3JtaVx0JTAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKyhkZWZpbmVfaW5zbiAic3BsIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCSh1bnNwZWM6U0kgWyhjYzApCisgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMCldIFVOU1BFQ19DT05EX1BMKSldCisgICIiCisgICJzcnBsXHQlMCIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBDb25kaXRpb25hbCBicmFuY2gKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IEJyYW5jaCB0byBsYWJlbCBpZiB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBjb2RlcyBhcmUgc2V0LgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBicmFuY2ggaWYgbmVnYXRpdmUKKyhkZWZpbmVfaW5zbiAiYm1pIgorICBbKHNldCAocGMpCisJKGlmX3RoZW5fZWxzZSAodW5zcGVjOkNDIFsoY2MwKSAoY29uc3RfaW50IDApXSBVTlNQRUNfQ09ORF9NSSkKKwkJICAgICAgKGxhYmVsX3JlZiAobWF0Y2hfb3BlcmFuZCAwICIiICIiKSkKKwkJICAgICAgKHBjKSkpXQorICAiIgorICAiYnJtaSAgICAlMCIKKyAgWyhzZXRfYXR0ciAidHlwZSIgImJyYW5jaCIpCisgICAoc2V0IChhdHRyICJsZW5ndGgiKQorCShjb25kIFsoYW5kIChsZSAobWludXMgKG1hdGNoX2R1cCAwKSAocGMpKSAoY29uc3RfaW50IDI1NCkpCisJCSAgICAobGUgKG1pbnVzIChwYykgKG1hdGNoX2R1cCAwKSkgKGNvbnN0X2ludCAyNTYpKSkKKwkgICAgICAgKGNvbnN0X2ludCAyKV0gOyB1c2UgY29tcGFjdCBicmFuY2gKKyAgICAgICAgICAgICAgKGNvbnN0X2ludCA0KSkpIDsgdXNlIGV4dGVuZGVkIGJyYW5jaAorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKyhkZWZpbmVfaW5zbiAiKmJtaS1yZXZlcnNlIgorICBbKHNldCAocGMpCisJKGlmX3RoZW5fZWxzZSAodW5zcGVjOkNDIFsoY2MwKSAoY29uc3RfaW50IDApXSBVTlNQRUNfQ09ORF9NSSkKKwkJICAgICAgKHBjKQorCQkgICAgICAobGFiZWxfcmVmIChtYXRjaF9vcGVyYW5kIDAgIiIgIiIpKSkpXQorICAiIgorICAiYnJwbCAgICAlMCIKKyAgWyhzZXRfYXR0ciAidHlwZSIgImJyYW5jaCIpCisgICAoc2V0IChhdHRyICJsZW5ndGgiKQorCShjb25kIFsoYW5kIChsZSAobWludXMgKG1hdGNoX2R1cCAwKSAocGMpKSAoY29uc3RfaW50IDI1NCkpCisJCSAgICAobGUgKG1pbnVzIChwYykgKG1hdGNoX2R1cCAwKSkgKGNvbnN0X2ludCAyNTYpKSkKKwkgICAgICAgKGNvbnN0X2ludCAyKV0gOyB1c2UgY29tcGFjdCBicmFuY2gKKyAgICAgICAgICAgICAgKGNvbnN0X2ludCA0KSkpIDsgdXNlIGV4dGVuZGVkIGJyYW5jaAorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKV0pCisKKzsgYnJhbmNoIGlmIHBvc2l0aXZlCisoZGVmaW5lX2luc24gImJwbCIKKyAgWyhzZXQgKHBjKQorCShpZl90aGVuX2Vsc2UgKHVuc3BlYzpDQyBbKGNjMCkgKGNvbnN0X2ludCAwKV0gVU5TUEVDX0NPTkRfUEwpCisJCSAgICAgIChsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMCAiIiAiIikpCisJCSAgICAgIChwYykpKV0KKyAgIiIKKyAgImJycGwgICAgJTAiCisgIFsoc2V0X2F0dHIgInR5cGUiICJicmFuY2giKQorICAgKHNldCAoYXR0ciAibGVuZ3RoIikKKwkoY29uZCBbKGFuZCAobGUgKG1pbnVzIChtYXRjaF9kdXAgMCkgKHBjKSkgKGNvbnN0X2ludCAyNTQpKQorCQkgICAgKGxlIChtaW51cyAocGMpIChtYXRjaF9kdXAgMCkpIChjb25zdF9pbnQgMjU2KSkpCisJICAgICAgIChjb25zdF9pbnQgMildIDsgdXNlIGNvbXBhY3QgYnJhbmNoCisgICAgICAgICAgICAgIChjb25zdF9pbnQgNCkpKSA7IHVzZSBleHRlbmRlZCBicmFuY2gKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisoZGVmaW5lX2luc24gIipicGwtcmV2ZXJzZSIKKyAgWyhzZXQgKHBjKQorCShpZl90aGVuX2Vsc2UgKHVuc3BlYzpDQyBbKGNjMCkgKGNvbnN0X2ludCAwKV0gVU5TUEVDX0NPTkRfUEwpCisJCSAgICAgIChwYykKKwkJICAgICAgKGxhYmVsX3JlZiAobWF0Y2hfb3BlcmFuZCAwICIiICIiKSkpKV0KKyAgIiIKKyAgImJybWkgICAgJTAiCisgIFsoc2V0X2F0dHIgInR5cGUiICJicmFuY2giKQorICAgKHNldCAoYXR0ciAibGVuZ3RoIikKKwkoY29uZCBbKGFuZCAobGUgKG1pbnVzIChtYXRjaF9kdXAgMCkgKHBjKSkgKGNvbnN0X2ludCAyNTQpKQorCQkgICAgKGxlIChtaW51cyAocGMpIChtYXRjaF9kdXAgMCkpIChjb25zdF9pbnQgMjU2KSkpCisJICAgICAgIChjb25zdF9pbnQgMildIDsgdXNlIGNvbXBhY3QgYnJhbmNoCisgICAgICAgICAgICAgIChjb25zdF9pbnQgNCkpKSA7IHVzZSBleHRlbmRlZCBicmFuY2gKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCis7IGJyYW5jaCBpZiBlcXVhbAorKGRlZmluZV9pbnNuICJiPGNvZGU+IgorICBbKHNldCAocGMpCisJKGlmX3RoZW5fZWxzZSAoYW55X2NvbmQ6Q0MgKGNjMCkKKwkJCSAgKGNvbnN0X2ludCAwKSkKKwkJICAgICAgKGxhYmVsX3JlZiAobWF0Y2hfb3BlcmFuZCAwICIiICIiKSkKKwkJICAgICAgKHBjKSkpXQorICAiIgorICAiYnI8Y29uZD4gICAgJTAgIgorICBbKHNldF9hdHRyICJ0eXBlIiAiYnJhbmNoIikKKyAgIChzZXQgKGF0dHIgImxlbmd0aCIpCisJKGNvbmQgWyhhbmQgKGxlIChtaW51cyAobWF0Y2hfZHVwIDApIChwYykpIChjb25zdF9pbnQgMjU0KSkKKwkJICAgIChsZSAobWludXMgKHBjKSAobWF0Y2hfZHVwIDApKSAoY29uc3RfaW50IDI1NikpKQorCSAgICAgICAoY29uc3RfaW50IDIpXSA7IHVzZSBjb21wYWN0IGJyYW5jaAorICAgICAgICAgICAgICAoY29uc3RfaW50IDQpKSkgOyB1c2UgZXh0ZW5kZWQgYnJhbmNoCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworCisoZGVmaW5lX2luc24gIipiPGNvZGU+LXJldmVyc2UiCisgIFsoc2V0IChwYykKKwkoaWZfdGhlbl9lbHNlIChhbnlfY29uZDpDQyAoY2MwKQorCQkJICAoY29uc3RfaW50IDApKQorCQkgICAgICAocGMpCisJCSAgICAgIChsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMCAiIiAiIikpKSldCisgICIiCisgICJicjxpbnZjb25kPiAgICAlMCAiCisgIFsoc2V0X2F0dHIgInR5cGUiICJicmFuY2giKQorICAgKHNldCAoYXR0ciAibGVuZ3RoIikKKwkoY29uZCBbKGFuZCAobGUgKG1pbnVzIChtYXRjaF9kdXAgMCkgKHBjKSkgKGNvbnN0X2ludCAyNTQpKQorCQkgICAgKGxlIChtaW51cyAocGMpIChtYXRjaF9kdXAgMCkpIChjb25zdF9pbnQgMjU2KSkpCisJICAgICAgIChjb25zdF9pbnQgMildIDsgdXNlIGNvbXBhY3QgYnJhbmNoCisgICAgICAgICAgICAgIChjb25zdF9pbnQgNCkpKSA7IHVzZSBleHRlbmRlZCBicmFuY2gKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7IENvbmRpdGlvbmFsIEFkZC9TdWJ0cmFjdAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHN1Yntjb25kNH0gIFJkLCBpbW0KKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyhkZWZpbmVfZXhwYW5kICJhZGQ8bW9kZT5jYyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6QUREQ0MgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChpZl90aGVuX2Vsc2U6QUREQ0MgKG1hdGNoX29wZXJhdG9yIDEgImF2cjMyX2NvbXBhcmlzb25fb3BlcmF0b3IiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1hdGNoX2R1cCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCA1KV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6QUREQ0MgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsdXM6QUREQ0MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6QUREQ0MgMyAiIiAiIikpKSldCisgICIiCisgIHsKKyAgIGlmICggIShHRVRfQ09ERSAob3BlcmFuZHNbM10pID09IENPTlNUX0lOVAorICAgICAgICAgIHx8IChUQVJHRVRfVjJfSU5TTlMgJiYgUkVHX1Aob3BlcmFuZHNbM10pKSkgKXsKKyAgICAgIEZBSUw7CisgICB9CisKKyAgIC8qIERlbGV0ZSBjb21wYXJlIGluc3RydWN0aW9uIGFzIGl0IGlzIG1lcmdlZCBpbnRvIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KKyAgIHJlbW92ZV9pbnNuIChnZXRfbGFzdF9pbnNuX2FueXdoZXJlICgpKTsKKworICAgb3BlcmFuZHNbNF0gPSBhdnIzMl9jb21wYXJlX29wMDsKKyAgIG9wZXJhbmRzWzVdID0gYXZyMzJfY29tcGFyZV9vcDE7CisgICAKKyAgIGlmICggVEFSR0VUX1YyX0lOU05TIAorICAgICAgICAmJiBSRUdfUChvcGVyYW5kc1szXSkgCisgICAgICAgICYmIFJFR05PKG9wZXJhbmRzWzBdKSAhPSBSRUdOTyhvcGVyYW5kc1syXSkgKXsKKyAgICAgICBlbWl0X21vdmVfaW5zbiAob3BlcmFuZHNbMF0sIG9wZXJhbmRzWzJdKTsKKyAgICAgICBvcGVyYW5kc1syXSA9IG9wZXJhbmRzWzBdOworICAgfQorICB9CisgICkKKworKGRlZmluZV9pbnNuICJhZGQ8QUREQ0M6bW9kZT5jY19jbXA8Q01QOm1vZGU+X3JlZyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6QUREQ0MgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKGlmX3RoZW5fZWxzZTpBRERDQyAobWF0Y2hfb3BlcmF0b3IgMSAiYXZyMzJfY29tcGFyaXNvbl9vcGVyYXRvciIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpDTVAgNCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6Q01QIDUgIjxDTVA6Y21wX3ByZWRpY2F0ZT4iICI8Q01QOmNtcF9jb25zdHJhaW50PiIpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsdXM6QUREQ0MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkFERENDIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6QUREQ0MgMyAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpKV0KKyAgIlRBUkdFVF9WMl9JTlNOUyIKKyAgeworICAgb3BlcmFuZHNbMV0gPSBhdnIzMl9vdXRwdXRfY21wKG9wZXJhbmRzWzFdLCBHRVRfTU9ERShvcGVyYW5kc1s0XSksIG9wZXJhbmRzWzRdLCBvcGVyYW5kc1s1XSk7CisgICByZXR1cm4gImFkZCVpMVx0JTAsICUyLCAlMyI7CisgIH0KKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiOCIpCisgICAoc2V0X2F0dHIgImNjIiAiY21wX2NvbmRfaW5zbiIpXSkKKworKGRlZmluZV9pbnNuICJhZGQ8QUREQ0M6bW9kZT5jY19jbXA8Q01QOm1vZGU+IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpBRERDQyAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAoaWZfdGhlbl9lbHNlOkFERENDIChtYXRjaF9vcGVyYXRvciAxICJhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhtYXRjaF9vcGVyYW5kOkNNUCA0ICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpDTVAgNSAiPENNUDpjbXBfcHJlZGljYXRlPiIgIjxDTVA6Y21wX2NvbnN0cmFpbnQ+IildKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkFERENDIDIgInJlZ2lzdGVyX29wZXJhbmQiICIwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGx1czpBRERDQyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpBRERDQyAzICJhdnIzMl9jb25kX2ltbWVkaWF0ZV9vcGVyYW5kIiAiSXMwOCIpKSkpXQorICAiIgorICB7CisgICBvcGVyYW5kc1sxXSA9IGF2cjMyX291dHB1dF9jbXAob3BlcmFuZHNbMV0sIEdFVF9NT0RFKG9wZXJhbmRzWzRdKSwgb3BlcmFuZHNbNF0sIG9wZXJhbmRzWzVdKTsKKyAgIHJldHVybiAic3ViJWkxXHQlMCwgLSUzIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICI4IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbXBfY29uZF9pbnNuIildKQorCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsgQ29uZGl0aW9uYWwgTW92ZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IG1vdntjb25kNH0gIFJkLCAoUnMvaW1tKQorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2V4cGFuZCAibW92PG1vZGU+Y2MiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOk1PVkNDIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoaWZfdGhlbl9lbHNlOk1PVkNDIChtYXRjaF9vcGVyYXRvciAxICJhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhtYXRjaF9kdXAgNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgNSldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOk1PVkNDIDIgImF2cjMyX2NvbmRfcmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOk1PVkNDIDMgImF2cjMyX2NvbmRfcmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICIiKSkpXQorICAiIgorICB7CisgICAvKiBEZWxldGUgY29tcGFyZSBpbnN0cnVjdGlvbiBhcyBpdCBpcyBtZXJnZWQgaW50byB0aGlzIGluc3RydWN0aW9uICovCisgICByZW1vdmVfaW5zbiAoZ2V0X2xhc3RfaW5zbl9hbnl3aGVyZSAoKSk7CisKKyAgIG9wZXJhbmRzWzRdID0gYXZyMzJfY29tcGFyZV9vcDA7CisgICBvcGVyYW5kc1s1XSA9IGF2cjMyX2NvbXBhcmVfb3AxOworICB9CisgICkKKworCisoZGVmaW5lX2luc24gIm1vdjxNT1ZDQzptb2RlPmNjX2NtcDxDTVA6bW9kZT4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOk1PVkNDIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyLHIiKQorICAgICAgICAoaWZfdGhlbl9lbHNlOk1PVkNDIChtYXRjaF9vcGVyYXRvciAxICJhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhtYXRjaF9vcGVyYW5kOkNNUCA0ICJyZWdpc3Rlcl9vcGVyYW5kIiAicixyLHIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6Q01QIDUgIjxDTVA6Y21wX3ByZWRpY2F0ZT4iICI8Q01QOmNtcF9jb25zdHJhaW50Piw8Q01QOmNtcF9jb25zdHJhaW50Piw8Q01QOmNtcF9jb25zdHJhaW50PiIpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpNT1ZDQyAyICJhdnIzMl9jb25kX3JlZ2lzdGVyX2ltbWVkaWF0ZV9vcGVyYW5kIiAiMCwgcktzMDgscktzMDgiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOk1PVkNDIDMgImF2cjMyX2NvbmRfcmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICJyS3MwOCwwLHJLczA4IikpKV0KKyAgIiIKKyAgeworICAgb3BlcmFuZHNbMV0gPSBhdnIzMl9vdXRwdXRfY21wKG9wZXJhbmRzWzFdLCBHRVRfTU9ERShvcGVyYW5kc1s0XSksIG9wZXJhbmRzWzRdLCBvcGVyYW5kc1s1XSk7CisgICAgICAgICAgIAorICAgc3dpdGNoKCB3aGljaF9hbHRlcm5hdGl2ZSApeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAibW92JWkxICAgICUwLCAlMyI7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuICJtb3YlMSAgICAlMCwgJTIiOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAibW92JTEgICAgJTAsICUyXDttb3YlaTEgICAgJTAsICUzIjsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICI4LDgsMTIiKQorICAgKHNldF9hdHRyICJjYyIgImNtcF9jb25kX2luc24iKV0pCisKKyAgCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsganVtcAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgSnVtcCBpbnNpZGUgYSBmdW5jdGlvbjsgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gYSBsYWJlbC4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfaW5zbiAianVtcCIKKyAgWyhzZXQgKHBjKQorCShsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMCAiIiAiIikpKV0KKyAgIiIKKyAgeworICAgIGlmIChnZXRfYXR0cl9sZW5ndGgoaW5zbikgPiA0KQorICAgICAgcmV0dXJuICJDYW4ndCBqdW1wIHRoaXMgZmFyIjsKKyAgICByZXR1cm4gKGdldF9hdHRyX2xlbmd0aChpbnNuKSA9PSAyID8KKwkgICAgInJqbXAgICAgJTAiIDogImJyYWwgICAgJTAiKTsKKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAiYnJhbmNoIikKKyAgIChzZXQgKGF0dHIgImxlbmd0aCIpCisJKGNvbmQgWyhhbmQgKGxlIChtaW51cyAobWF0Y2hfZHVwIDApIChwYykpIChjb25zdF9pbnQgMTAyMikpCisJCSAgICAobGUgKG1pbnVzIChwYykgKG1hdGNoX2R1cCAwKSkgKGNvbnN0X2ludCAxMDI0KSkpCisJICAgICAgIChjb25zdF9pbnQgMikgOyB1c2UgcmptcAorCSAgICAgICAobGUgKG1hdGNoX2R1cCAwKSAoY29uc3RfaW50IDEwNDg1NzUpKQorCSAgICAgICAoY29uc3RfaW50IDQpXSA7IHVzZSBicmFsCisJICAgICAgKGNvbnN0X2ludCA4KSkpIDsgZG8gc29tZXRoaW5nIGVsc2UKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBjYWxsCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBTdWJyb3V0aW5lIGNhbGwgaW5zdHJ1Y3Rpb24gcmV0dXJuaW5nIG5vIHZhbHVlLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJjYWxsX2ludGVybmFsIgorICBbKHBhcmFsbGVsIFsoY2FsbCAobWVtOlNJIChtYXRjaF9vcGVyYW5kOlNJIDAgImF2cjMyX2NhbGxfb3BlcmFuZCIgInIsVSxULFciKSkKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMSAiIiAiIikpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgIiIKKyAgeworICAgc3dpdGNoICh3aGljaF9hbHRlcm5hdGl2ZSl7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICJpY2FsbFx0JTAiOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiAicmNhbGxcdCUwIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIm1jYWxsXHQlMCI7CisgICAgY2FzZSAzOgorICAgICAgaWYgKCBUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MgKQorICAgICAgICByZXR1cm4gImNhbGxcdCUwIjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICJtY2FsbFx0cjZbJTBAZ290XSI7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0KCk7CisgICB9CisgIH0KKyAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIyLDQsNCwxMCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXSkKKworCisoZGVmaW5lX2V4cGFuZCAiY2FsbCIKKyAgWyhwYXJhbGxlbCBbKGNhbGwgKG1hdGNoX29wZXJhbmQ6U0kgMCAiIiAiIikKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMSAiIiAiIikpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgIiIKKyAgeworICAgcnR4IGNhbGxfYWRkcmVzczsKKyAgIGlmICggR0VUX0NPREUob3BlcmFuZHNbMF0pICE9IE1FTSApCisgICAgICBGQUlMOworCisgICBjYWxsX2FkZHJlc3MgPSBYRVhQKG9wZXJhbmRzWzBdLCAwKTsKKworICAgLyogSWYgYXNzZW1ibGVyIHN1cHBvcnRzIGNhbGwgcHNldWRvIGluc24gYW5kIHRoZSBjYWxsCisgICAgICBhZGRyZXNzIGlzIGEgc3ltYm9sIHRoZW4gbm90aGluZyBzcGVjaWFsIG5lZWRzIHRvIGJlIGRvbmUuICovCisgICBpZiAoIFRBUkdFVF9IQVNfQVNNX0FERFJfUFNFVURPUworICAgICAgICAmJiAoR0VUX0NPREUoY2FsbF9hZGRyZXNzKSA9PSBTWU1CT0xfUkVGKSApeworICAgICAgLyogV2UgbXVzdCBob3dldmVyIG1hcmsgdGhlIGZ1bmN0aW9uIGFzIHVzaW5nIHRoZSBHT1QgaWYKKyAgICAgICAgIGZsYWdfcGljIGlzIHNldCwgc2luY2UgdGhlIGNhbGwgaW5zbiBtaWdodCB0dXJuIGludG8KKyAgICAgICAgIGEgbWNhbGwgdXNpbmcgdGhlIEdPVCBwdHIgcmVnaXN0ZXIuICovCisgICAgICBpZiAoIGZsYWdfcGljICl7CisgICAgICAgICBjdXJyZW50X2Z1bmN0aW9uX3VzZXNfcGljX29mZnNldF90YWJsZSA9IDE7CisgICAgICAgICBlbWl0X2NhbGxfaW5zbihnZW5fY2FsbF9pbnRlcm5hbChjYWxsX2FkZHJlc3MsIG9wZXJhbmRzWzFdKSk7CisgICAgICAgICBET05FOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgaWYgKCBmbGFnX3BpYyAmJgorICAgICAgICAgIEdFVF9DT0RFKGNhbGxfYWRkcmVzcykgPT0gU1lNQk9MX1JFRiApeworICAgICAgIGN1cnJlbnRfZnVuY3Rpb25fdXNlc19waWNfb2Zmc2V0X3RhYmxlID0gMTsKKyAgICAgICBlbWl0X2NhbGxfaW5zbihnZW5fY2FsbF9pbnRlcm5hbChjYWxsX2FkZHJlc3MsIG9wZXJhbmRzWzFdKSk7CisgICAgICAgRE9ORTsKKyAgICAgfQorCisgICAgIGlmICggIVNZTUJPTF9SRUZfUkNBTExfRlVOQ1RJT05fUChvcGVyYW5kc1swXSkgKXsKKyAgICAgICBpZiAoIG9wdGltaXplX3NpemUgJiYKKyAgICAgICAgICAgICBHRVRfQ09ERShjYWxsX2FkZHJlc3MpID09IFNZTUJPTF9SRUYgKXsKKyAgICAgICAgIGNhbGxfYWRkcmVzcyA9IGZvcmNlX2NvbnN0X21lbShTSW1vZGUsIGNhbGxfYWRkcmVzcyk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGNhbGxfYWRkcmVzcyA9IGZvcmNlX3JlZyhTSW1vZGUsIGNhbGxfYWRkcmVzcyk7CisgICAgICAgfQorICAgICB9CisgICB9CisgICBlbWl0X2NhbGxfaW5zbihnZW5fY2FsbF9pbnRlcm5hbChjYWxsX2FkZHJlc3MsIG9wZXJhbmRzWzFdKSk7CisgICBET05FOworICB9CispCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGNhbGxfdmFsdWUKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IFN1YnJ1dGluZSBjYWxsIGluc3RydWN0aW9uIHJldHVybmluZyBhIHZhbHVlLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgImNhbGxfdmFsdWUiCisgICBbKHBhcmFsbGVsIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgIiIgIiIpCisgICAgICAgICAgICAgICAgICAgIChjYWxsIChtYXRjaF9vcGVyYW5kOlNJIDEgIiIgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDIgIiIgIiIpKSkKKyAgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgICIiCisgICB7CisgICAgcnR4IGNhbGxfYWRkcmVzczsKKyAgICBpZiAoIEdFVF9DT0RFKG9wZXJhbmRzWzFdKSAhPSBNRU0gKQorICAgICAgRkFJTDsKKworICAgIGNhbGxfYWRkcmVzcyA9IFhFWFAob3BlcmFuZHNbMV0sIDApOworCisgICAgLyogSWYgYXNzZW1ibGVyIHN1cHBvcnRzIGNhbGwgcHNldWRvIGluc24gYW5kIHRoZSBjYWxsCisgICAgICAgYWRkcmVzcyBpcyBhIHN5bWJvbCB0aGVuIG5vdGhpbmcgc3BlY2lhbCBuZWVkcyB0byBiZSBkb25lLiAqLworICAgIGlmICggVEFSR0VUX0hBU19BU01fQUREUl9QU0VVRE9TCisgICAgICAgICAmJiAoR0VUX0NPREUoY2FsbF9hZGRyZXNzKSA9PSBTWU1CT0xfUkVGKSApeworICAgICAgIC8qIFdlIG11c3QgaG93ZXZlciBtYXJrIHRoZSBmdW5jdGlvbiBhcyB1c2luZyB0aGUgR09UIGlmCisgICAgICAgICAgZmxhZ19waWMgaXMgc2V0LCBzaW5jZSB0aGUgY2FsbCBpbnNuIG1pZ2h0IHR1cm4gaW50bworICAgICAgICAgIGEgbWNhbGwgdXNpbmcgdGhlIEdPVCBwdHIgcmVnaXN0ZXIuICovCisgICAgICAgaWYgKCBmbGFnX3BpYyApIHsKKyAgICAgICAgICBjdXJyZW50X2Z1bmN0aW9uX3VzZXNfcGljX29mZnNldF90YWJsZSA9IDE7CisgICAgICAgICAgZW1pdF9jYWxsX2luc24oZ2VuX2NhbGxfdmFsdWVfaW50ZXJuYWwob3BlcmFuZHNbMF0sIGNhbGxfYWRkcmVzcywgb3BlcmFuZHNbMl0pKTsKKyAgICAgICAgICBET05FOworICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCBmbGFnX3BpYyAmJgorICAgICAgICAgICBHRVRfQ09ERShjYWxsX2FkZHJlc3MpID09IFNZTUJPTF9SRUYgKXsKKyAgICAgICAgY3VycmVudF9mdW5jdGlvbl91c2VzX3BpY19vZmZzZXRfdGFibGUgPSAxOworICAgICAgICBlbWl0X2NhbGxfaW5zbihnZW5fY2FsbF92YWx1ZV9pbnRlcm5hbChvcGVyYW5kc1swXSwgY2FsbF9hZGRyZXNzLCBvcGVyYW5kc1syXSkpOworICAgICAgICBET05FOworICAgICAgfQorCisgICAgICBpZiAoICFTWU1CT0xfUkVGX1JDQUxMX0ZVTkNUSU9OX1Aob3BlcmFuZHNbMV0pICl7CisgICAgICAgIGlmICggb3B0aW1pemVfc2l6ZSAmJgorICAgICAgICAgICAgIEdFVF9DT0RFKGNhbGxfYWRkcmVzcykgPT0gU1lNQk9MX1JFRil7CisgICAgICAgICAgY2FsbF9hZGRyZXNzID0gZm9yY2VfY29uc3RfbWVtKFNJbW9kZSwgY2FsbF9hZGRyZXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjYWxsX2FkZHJlc3MgPSBmb3JjZV9yZWcoU0ltb2RlLCBjYWxsX2FkZHJlc3MpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVtaXRfY2FsbF9pbnNuKGdlbl9jYWxsX3ZhbHVlX2ludGVybmFsKG9wZXJhbmRzWzBdLCBjYWxsX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNbMl0pKTsKKyAgICBET05FOworCisgICB9KQorCisoZGVmaW5lX2luc24gImNhbGxfdmFsdWVfaW50ZXJuYWwiCisgIFsocGFyYWxsZWwgWyhzZXQgKG1hdGNoX29wZXJhbmQgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLHIscixyIikKKyAgICAgICAgICAgICAgICAgICAoY2FsbCAobWVtOlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgImF2cjMyX2NhbGxfb3BlcmFuZCIgInIsVSxULFciKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAyICIiICIiKSkpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgOzsgT3BlcmFuZCAyIG5vdCB1c2VkIG9uIHRoZSBBVlIzMi4KKyAgIiIKKyAgeworICAgc3dpdGNoICh3aGljaF9hbHRlcm5hdGl2ZSl7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICJpY2FsbFx0JTEiOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiAicmNhbGxcdCUxIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIm1jYWxsXHQlMSI7CisgICAgY2FzZSAzOgorICAgICAgaWYgKCBUQVJHRVRfSEFTX0FTTV9BRERSX1BTRVVET1MgKQorICAgICAgICByZXR1cm4gImNhbGxcdCUxIjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICJtY2FsbFx0cjZbJTFAZ290XSI7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0KCk7CisgICB9CisgIH0KKyAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIyLDQsNCwxMCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2FsbF9zZXQiKV0pCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgdW50eXBlZF9jYWxsCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBTdWJydXRpbmUgY2FsbCBpbnN0cnVjdGlvbiByZXR1cm5pbmcgYSB2YWx1ZSBvZiBhbnkgdHlwZS4KKzs7IFRoZSBjb2RlIGlzIGNvcGllZCBmcm9tIG02OGsubWQgKGV4Y2VwdCBnZW5fYmxvY2thZ2UgaXMgcmVtb3ZlZCkKKzs7IEZpeG1lIQorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgInVudHlwZWRfY2FsbCIKKyAgWyhwYXJhbGxlbCBbKGNhbGwgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfY2FsbF9vcGVyYW5kIiAiIikKKwkJICAgIChjb25zdF9pbnQgMCkpCisJICAgICAgKG1hdGNoX29wZXJhbmQgMSAiIiAiIikKKwkgICAgICAobWF0Y2hfb3BlcmFuZCAyICIiICIiKV0pXQorICAiIgorICB7CisgICAgaW50IGk7CisKKyAgICBlbWl0X2NhbGxfaW5zbiAoR0VOX0NBTEwgKG9wZXJhbmRzWzBdLCBjb25zdDBfcnR4LCBOVUxMLCBjb25zdDBfcnR4KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgWFZFQ0xFTiAob3BlcmFuZHNbMl0sIDApOyBpKyspIHsKKyAgICAgIHJ0eCBzZXQgPSBYVkVDRVhQIChvcGVyYW5kc1syXSwgMCwgaSk7CisgICAgICBlbWl0X21vdmVfaW5zbiAoU0VUX0RFU1QgKHNldCksIFNFVF9TUkMgKHNldCkpOworICAgIH0KKworICAgIC8qIFRoZSBvcHRpbWl6ZXIgZG9lcyBub3Qga25vdyB0aGF0IHRoZSBjYWxsIHNldHMgdGhlIGZ1bmN0aW9uIHZhbHVlCisgICAgICAgcmVnaXN0ZXJzIHdlIHN0b3JlZCBpbiB0aGUgcmVzdWx0IGJsb2NrLiAgV2UgYXZvaWQgcHJvYmxlbXMgYnkKKyAgICAgICBjbGFpbWluZyB0aGF0IGFsbCBoYXJkIHJlZ2lzdGVycyBhcmUgdXNlZCBhbmQgY2xvYmJlcmVkIGF0IHRoaXMKKyAgICAgICBwb2ludC4gICovCisgICAgZW1pdF9pbnNuIChnZW5fYmxvY2thZ2UgKCkpOworCisgICAgRE9ORTsKKyAgfSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyByZXR1cm4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9pbnNuICJyZXR1cm4iCisgIFsocmV0dXJuKV0KKyAgIlVTRV9SRVRVUk5fSU5TTiAoRkFMU0UpIgorICB7CisgICBhdnIzMl9vdXRwdXRfcmV0dXJuX2luc3RydWN0aW9uKFRSVUUsIEZBTFNFLCBOVUxMLCBOVUxMKTsKKyAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImNhbGwiKV0KKyAgKQorCisKKyhkZWZpbmVfaW5zbiAicmV0dXJuX2NvbmQiCisgIFsoc2V0IChwYykgCisgICAgICAgIChpZl90aGVuX2Vsc2UgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfY29tcGFyaXNvbl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAocmV0dXJuKQorICAgICAgICAgICAgICAgICAgICAgIChwYykpKV0KKyAgIlVTRV9SRVRVUk5fSU5TTiAoVFJVRSkiCisgICJyZXQlMFx0cjEyIjsKKyAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKV0pCisgIAorKGRlZmluZV9pbnNuICJyZXR1cm5fY29uZF9wcmVkaWNhYmxlIgorICBbKHJldHVybildCisgICJVU0VfUkVUVVJOX0lOU04gKFRSVUUpIgorICAicmV0JT9cdHIxMiI7CisgIFsoc2V0X2F0dHIgInR5cGUiICJjYWxsIikKKyAgIChzZXRfYXR0ciAicHJlZGljYWJsZSIgInllcyIpXSkKKworCisoZGVmaW5lX2luc24gInJldHVybl9pbW0iCisgIFsocGFyYWxsZWwgWyhzZXQgKHJlZyBSRVRWQUxfUkVHTlVNKSAobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKSkKKyAgICAgICAgICAgICAgKHVzZSAocmVnIFJFVFZBTF9SRUdOVU0pKQorICAgICAgICAgICAgICAocmV0dXJuKV0pXQorICAiVVNFX1JFVFVSTl9JTlNOIChGQUxTRSkgJiYKKyAgICgoSU5UVkFMKG9wZXJhbmRzWzBdKSA9PSAtMSkgfHwgKElOVFZBTChvcGVyYW5kc1swXSkgPT0gMCkgfHwgKElOVFZBTChvcGVyYW5kc1swXSkgPT0gMSkpIgorICB7CisgICBhdnIzMl9vdXRwdXRfcmV0dXJuX2luc3RydWN0aW9uKFRSVUUsIEZBTFNFLCBOVUxMLCBvcGVyYW5kc1swXSk7CisgICByZXR1cm4gIiI7CisgIH0KKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJjYWxsIildCisgICkKKworKGRlZmluZV9pbnNuICJyZXR1cm5faW1tX2NvbmQiCisgIFsocGFyYWxsZWwgWyhzZXQgKHJlZyBSRVRWQUxfUkVHTlVNKSAobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKSkKKyAgICAgICAgICAgICAgKHVzZSAocmVnIFJFVFZBTF9SRUdOVU0pKQorICAgICAgICAgICAgICAoc2V0IChwYykgCisgICAgICAgICAgICAgICAgICAgKGlmX3RoZW5fZWxzZSAobWF0Y2hfb3BlcmFuZCAxICJhdnIzMl9jb21wYXJpc29uX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJldHVybikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYykpKV0pXQorICAiVVNFX1JFVFVSTl9JTlNOIChUUlVFKSAmJgorICAgKChJTlRWQUwob3BlcmFuZHNbMF0pID09IC0xKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzBdKSA9PSAwKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzBdKSA9PSAxKSkiCisgICJyZXQlMVx0JTAiOworICBbKHNldF9hdHRyICJ0eXBlIiAiY2FsbCIpXQorICApCisKKyhkZWZpbmVfaW5zbiAicmV0dXJuX2ltbV9wcmVkaWNhYmxlIgorICBbKHBhcmFsbGVsIFsoc2V0IChyZWcgUkVUVkFMX1JFR05VTSkgKG1hdGNoX29wZXJhbmQgMCAiaW1tZWRpYXRlX29wZXJhbmQiICJpIikpCisgICAgICAgICAgICAgICh1c2UgKHJlZyBSRVRWQUxfUkVHTlVNKSkKKyAgICAgICAgICAgICAgKHJldHVybildKV0KKyAgIlVTRV9SRVRVUk5fSU5TTiAoVFJVRSkgJiYKKyAgICgoSU5UVkFMKG9wZXJhbmRzWzBdKSA9PSAtMSkgfHwgKElOVFZBTChvcGVyYW5kc1swXSkgPT0gMCkgfHwgKElOVFZBTChvcGVyYW5kc1swXSkgPT0gMSkpIgorICAicmV0JT9cdCUwIjsKKyAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKQorICAgKHNldF9hdHRyICJwcmVkaWNhYmxlIiAieWVzIildKQorCisoZGVmaW5lX2luc24gInJldHVybl88bW9kZT5yZWciCisgIFsoc2V0IChyZWcgUkVUVkFMX1JFR05VTSkgKG1hdGNoX29wZXJhbmQ6TU9WTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKQorICAgKHVzZSAocmVnIFJFVFZBTF9SRUdOVU0pKQorICAgKHJldHVybildCisgICJVU0VfUkVUVVJOX0lOU04gKFRSVUUpIgorICAicmV0JT9cdCUwIjsKKyAgWyhzZXRfYXR0ciAidHlwZSIgImNhbGwiKQorICAgKHNldF9hdHRyICJwcmVkaWNhYmxlIiAieWVzIildKQorCisoZGVmaW5lX2luc24gInJldHVybl88bW9kZT5yZWdfY29uZCIKKyAgWyhzZXQgKHJlZyBSRVRWQUxfUkVHTlVNKSAobWF0Y2hfb3BlcmFuZDpNT1ZNIDAgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpCisgICAodXNlIChyZWcgUkVUVkFMX1JFR05VTSkpCisgICAoc2V0IChwYykgCisgICAgICAgIChpZl90aGVuX2Vsc2UgKG1hdGNoX29wZXJhdG9yIDEgImF2cjMyX2NvbXBhcmlzb25fb3BlcmF0b3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2MwKSAoY29uc3RfaW50IDApXSkKKyAgICAgICAgICAgICAgICAgICAgICAocmV0dXJuKQorICAgICAgICAgICAgICAgICAgICAgIChwYykpKV0KKyAgIlVTRV9SRVRVUk5fSU5TTiAoVFJVRSkiCisgICJyZXQlMVx0JTAiOworICBbKHNldF9hdHRyICJ0eXBlIiAiY2FsbCIpXSkKKyAgCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBub3AKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IE5vLW9wIGluc3RydWN0aW9uLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJub3AiCisgIFsoY29uc3RfaW50IDApXQorICAiIgorICAibm9wIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgbm9ubG9jYWxfZ290b19yZWNlaXZlcgorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgRm9yIHRhcmdldHMgd2l0aCBhIHJldHVybiBzdGFjayB3ZSBtdXN0IG1ha2Ugc3VyZSB0byBmbHVzaCB0aGUgcmV0dXJuIHN0YWNrCis7OyBzaW5jZSBpdCB3aWxsIGJlIGNvcnJ1cHQgYWZ0ZXIgYSBub25sb2NhbCBnb3RvLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgIm5vbmxvY2FsX2dvdG9fcmVjZWl2ZXIiCisgIFsoY29uc3RfaW50IDApXQorICAiVEFSR0VUX1JFVFVSTl9TVEFDSyIKKyAgIgorICAgeworICAgIGVtaXRfaW5zbiAoIGdlbl9mcnMoKSApOworICAgIERPTkU7CisgICB9CisgICIKKyAgKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGJ1aWx0aW5fc2V0am1wX3JlY2VpdmVyCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBGb3IgcGljIGNvZGUgd2UgbmVlZCB0byByZWxvYWQgdGhlIHBpYyByZWdpc3Rlci4KKzs7IEZvciB0YXJnZXRzIHdpdGggYSByZXR1cm4gc3RhY2sgd2UgbXVzdCBtYWtlIHN1cmUgdG8gZmx1c2ggdGhlIHJldHVybiBzdGFjaworOzsgc2luY2UgaXQgd2lsbCBwcm9iYWJseSBiZSBjb3JydXB0ZWQuCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2V4cGFuZCAiYnVpbHRpbl9zZXRqbXBfcmVjZWl2ZXIiCisgIFsobGFiZWxfcmVmIChtYXRjaF9vcGVyYW5kIDAgIiIgIiIpKV0KKyAgImZsYWdfcGljIgorICAiCisgICB7CisgICAgaWYgKCBUQVJHRVRfUkVUVVJOX1NUQUNLICkgCisgICAgIGVtaXRfaW5zbiAoIGdlbl9mcnMoKSApOworCisgICAgYXZyMzJfbG9hZF9waWNfcmVnaXN0ZXIgKCk7CisgICAgRE9ORTsKKyAgIH0KKyAgIgorKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGluZGlyZWN0X2p1bXAKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IEp1bXAgdG8gYW4gYWRkcmVzcyBpbiByZWcgb3IgbWVtb3J5LgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgImluZGlyZWN0X2p1bXAiCisgIFsoc2V0IChwYykKKwkobWF0Y2hfb3BlcmFuZDpTSSAwICJnZW5lcmFsX29wZXJhbmQiICIiKSldCisgICIiCisgIHsKKyAgICAvKiBPbmUgb2YgdGhlIG9wcyBoYXMgdG8gYmUgaW4gYSByZWdpc3Rlci4gICovCisgICAgaWYgKCAoZmxhZ19waWMgfHwgVEFSR0VUX0hBU19BU01fQUREUl9QU0VVRE9TICkKKyAgICAgICAgICYmICFhdnIzMl9sZWdpdGltYXRlX3BpY19vcGVyYW5kX3Aob3BlcmFuZHNbMF0pICkKKyAgICAgIG9wZXJhbmRzWzBdID0gbGVnaXRpbWl6ZV9waWNfYWRkcmVzcyAob3BlcmFuZHNbMF0sIFNJbW9kZSwgMCk7CisgICAgZWxzZSBpZiAoIGZsYWdfcGljICYmIGF2cjMyX2FkZHJlc3Nfb3BlcmFuZChvcGVyYW5kc1swXSwgR0VUX01PREUob3BlcmFuZHNbMF0pKSApCisgICAgICAvKiBJZiB3ZSBoYXZlIGFuIGFkZHJlc3Mgb3BlcmFuZCB0aGVuIHRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgcGljIHJlZ2lzdGVyLiAqLworICAgICAgY3VycmVudF9mdW5jdGlvbl91c2VzX3BpY19vZmZzZXRfdGFibGUgPSAxOworICB9KQorCisKKyhkZWZpbmVfaW5zbiAiaW5kaXJlY3RfanVtcF9pbnRlcm5hbCIKKyAgWyhzZXQgKHBjKQorCShtYXRjaF9vcGVyYW5kOlNJIDAgImF2cjMyX25vbl9ybXdfZ2VuZXJhbF9vcGVyYW5kIiAicixtLFciKSldCisgICIiCisgIHsKKyAgICBzd2l0Y2goIHdoaWNoX2FsdGVybmF0aXZlICl7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiAibW92XHRwYywgJTAiOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoIGF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQob3BlcmFuZHNbMF0sIEdFVF9NT0RFKG9wZXJhbmRzWzBdKSkgKQorICAgICAgICAgIHJldHVybiAibGRkcGNcdHBjLCAlMCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gImxkLndcdHBjLCAlMCI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmICggZmxhZ19waWMgKQorICAgICAgICAgIHJldHVybiAibGQud1x0cGMsIHI2WyUwQGdvdF0iOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuICJsZGEud1x0cGMsICUwIjsKKyAgICAgIGRlZmF1bHQ6CisJYWJvcnQoKTsKKyAgICB9CisgICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIsNCw4IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImNhbGwsY2FsbCxjYWxsIikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lLG5vbmUsY2xvYmJlciIpXSkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGNhc2VzaSBhbmQgdGFibGVqdW1wCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX2luc24gInRhYmxlanVtcF9hZGQiCisgIFsoc2V0IChwYykKKwkocGx1czpTSSAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgIChtdWx0OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA0IiApKSkpCisgICAodXNlIChsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMyAiIiAiIikpKV0KKyAgImZsYWdfcGljICYmCisgICAoKElOVFZBTChvcGVyYW5kc1syXSkgPT0gMCkgfHwgKElOVFZBTChvcGVyYW5kc1syXSkgPT0gMikgfHwKKyAgICAoSU5UVkFMKG9wZXJhbmRzWzJdKSA9PSA0KSB8fCAoSU5UVkFMKG9wZXJhbmRzWzJdKSA9PSA4KSkiCisgICJhZGRcdHBjLCAlMCwgJTEgPDwgJXAyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildKQorCisoZGVmaW5lX2luc24gInRhYmxlanVtcF9pbnNuIgorICBbKHNldCAocGMpIChtYXRjaF9vcGVyYW5kOlNJIDAgIm1lbW9yeV9vcGVyYW5kIiAibSIpKQorICAgKHVzZSAobGFiZWxfcmVmIChtYXRjaF9vcGVyYW5kIDEgIiIgIiIpKSldCisgICIhZmxhZ19waWMiCisgICJsZC53XHRwYywgJTAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiY2FsbCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworKGRlZmluZV9leHBhbmQgImNhc2VzaSIKKyAgWyhtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQk7IGluZGV4IHRvIGp1bXAgb24KKyAgIChtYXRjaF9vcGVyYW5kOlNJIDEgImNvbnN0X2ludF9vcGVyYW5kIiAiIikJOyBsb3dlciBib3VuZAorICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiY29uc3RfaW50X29wZXJhbmQiICIiKQk7IHRvdGFsIHJhbmdlCisgICAobWF0Y2hfb3BlcmFuZDpTSSAzICIiICIiKQkJCTsgdGFibGUgbGFiZWwKKyAgIChtYXRjaF9vcGVyYW5kOlNJIDQgIiIgIiIpXQkJCTsgT3V0IG9mIHJhbmdlIGxhYmVsCisgICIiCisgICIKKyAgeworICAgIHJ0eCByZWc7CisgICAgcnR4IGluZGV4ID0gb3BlcmFuZHNbMF07CisgICAgcnR4IGxvd19ib3VuZCA9IG9wZXJhbmRzWzFdOworICAgIHJ0eCByYW5nZSA9IG9wZXJhbmRzWzJdOworICAgIHJ0eCB0YWJsZV9sYWJlbCA9IG9wZXJhbmRzWzNdOworICAgIHJ0eCBvb3JfbGFiZWwgPSBvcGVyYW5kc1s0XTsKKworICAgIGluZGV4ID0gZm9yY2VfcmVnICggU0ltb2RlLCBpbmRleCApOworICAgIGlmIChsb3dfYm91bmQgIT0gY29uc3QwX3J0eCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wKElOVFZBTCAobG93X2JvdW5kKSwgJ0knLCBcIklzMjFcIikpeworICAgICAgICAgIHJlZyA9IGZvcmNlX3JlZyhTSW1vZGUsIEdFTl9JTlQgKElOVFZBTCAobG93X2JvdW5kKSkpOworCSAgZW1pdF9pbnNuIChnZW5fc3Vic2kzIChyZWcsIGluZGV4LAorCQkJICAgICAgICAgcmVnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVnID0gZ2VuX3JlZ19ydHggKFNJbW9kZSk7CisgICAgICAgICAgZW1pdF9pbnNuIChnZW5fYWRkc2kzIChyZWcsIGluZGV4LAorCQkgICAgICAgICAJIEdFTl9JTlQgKC1JTlRWQUwgKGxvd19ib3VuZCkpKSk7CisgICAgICAgIH0KKwlpbmRleCA9IHJlZzsKKyAgICAgIH0KKworICAgIGlmICghYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcCAoSU5UVkFMIChyYW5nZSksICdLJywgXCJLczIxXCIpKQorICAgICAgcmFuZ2UgPSBmb3JjZV9yZWcgKFNJbW9kZSwgcmFuZ2UpOworCisgICAgZW1pdF9jbXBfYW5kX2p1bXBfaW5zbnMgKCBpbmRleCwgcmFuZ2UsIEdUVSwgTlVMTF9SVFgsIFNJbW9kZSwgMSwgb29yX2xhYmVsICk7CisgICAgcmVnID0gZ2VuX3JlZ19ydHggKFNJbW9kZSk7CisgICAgZW1pdF9tb3ZlX2luc24gKCByZWcsIGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgdGFibGVfbGFiZWwpKTsKKworICAgIGlmICggZmxhZ19waWMgKSAKKyAgICAgICBlbWl0X2p1bXBfaW5zbiAoIGdlbl90YWJsZWp1bXBfYWRkICggcmVnLCBpbmRleCwgR0VOX0lOVCg0KSwgdGFibGVfbGFiZWwpKTsKKyAgICBlbHNlCisgICAgICAgZW1pdF9qdW1wX2luc24gKCAKKyAgICAgICAgICAgZ2VuX3RhYmxlanVtcF9pbnNuICggZ2VuX3J0eF9NRU0gKCBTSW1vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9ydHhfUExVUyAoIFNJbW9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fcnR4X01VTFQgKCBTSW1vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fSU5UKDQpKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9sYWJlbCkpOworICAgIERPTkU7CisgIH0iCispCisKKworCisoZGVmaW5lX2luc24gInByZWZldGNoIgorICBbKHByZWZldGNoIChtYXRjaF9vcGVyYW5kOlNJIDAgImF2cjMyX2tzMTZfYWRkcmVzc19vcGVyYW5kIiAicCIpCisJICAgICAobWF0Y2hfb3BlcmFuZCAxICJjb25zdF9pbnRfb3BlcmFuZCIgIiIpCisJICAgICAobWF0Y2hfb3BlcmFuZCAyICJjb25zdF9pbnRfb3BlcmFuZCIgIiIpKV0KKyAgIiIKKyAgeworICAgICByZXR1cm4gInByZWZcdCUwIjsKKyAgfQorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAibG9hZCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IHByb2xvZ3VlCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBUaGlzIHBhdHRlcm4sIGlmIGRlZmluZWQsIGVtaXRzIFJUTCBmb3IgZW50cnkgdG8gYSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uCis7OyBlbnRyeSBpIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBzdGFjayBmcmFtZSwgaW5pdGlhbGl6aW5nIHRoZSBmcmFtZQorOzsgcG9pbnRlciByZWdpc3Rlciwgc2F2aW5nIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMsIGV0Yy4KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfZXhwYW5kICJwcm9sb2d1ZSIKKyAgWyhjbG9iYmVyIChjb25zdF9pbnQgMCkpXQorICAiIgorICAiCisgIGF2cjMyX2V4cGFuZF9wcm9sb2d1ZSgpOworICBET05FOworICAiCisgICkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgZWhfcmV0dXJuCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyBUaGlzIHBhdHRlcm4sIGlmIGRlZmluZWQsIGFmZmVjdHMgdGhlIHdheSBfX2J1aWx0aW5fZWhfcmV0dXJuLCBhbmQKKzs7IHRoZW5jZSB0aGUgY2FsbCBmcmFtZSBleGNlcHRpb24gaGFuZGxpbmcgbGlicmFyeSByb3V0aW5lcywgYXJlCis7OyBidWlsdC4gSXQgaXMgaW50ZW5kZWQgdG8gaGFuZGxlIG5vbi10cml2aWFsIGFjdGlvbnMgbmVlZGVkIGFsb25nCis7OyB0aGUgYWJub3JtYWwgcmV0dXJuIHBhdGguCis7OworOzsgVGhlIGFkZHJlc3Mgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQKKzs7IHJldHVybiBpcyBwYXNzZWQgYXMgb3BlcmFuZCB0byB0aGlzIHBhdHRlcm4uIEl0IHdpbGwgbm9ybWFsbHkgbmVlZAorOzsgdG8gY29waWVkIGJ5IHRoZSBwYXR0ZXJuIHRvIHNvbWUgc3BlY2lhbCByZWdpc3RlciBvciBtZW1vcnkKKzs7IGxvY2F0aW9uLiBJZiB0aGUgcGF0dGVybiBuZWVkcyB0byBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZQorOzsgdGFyZ2V0IGNhbGwgZnJhbWUgaW4gb3JkZXIgdG8gZG8gc28sIGl0IG1heSB1c2UKKzs7IEVIX1JFVFVSTl9TVEFDS0FESl9SVFgsIGlmIGRlZmluZWQ7IGl0IHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KKzs7IGFzc2lnbmVkLgorOzsKKzs7IElmIHRoaXMgcGF0dGVybiBpcyBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgdG8KKzs7IHNpbXBseSBjb3B5IHRoZSByZXR1cm4gYWRkcmVzcyB0byBFSF9SRVRVUk5fSEFORExFUl9SVFguIEVpdGhlcgorOzsgdGhhdCBtYWNybyBvciB0aGlzIHBhdHRlcm4gbmVlZHMgdG8gYmUgZGVmaW5lZCBpZiBjYWxsIGZyYW1lCis7OyBleGNlcHRpb24gaGFuZGxpbmcgaXMgdG8gYmUgdXNlZC4KKworOzsgV2UgY2FuJ3QgZXhwYW5kIHRoaXMgYmVmb3JlIHdlIGtub3cgd2hlcmUgdGhlIGxpbmsgcmVnaXN0ZXIgaXMgc3RvcmVkLgorKGRlZmluZV9pbnNuX2FuZF9zcGxpdCAiZWhfcmV0dXJuIgorICBbKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0KKwkJICAgIFZVTlNQRUNfRUhfUkVUVVJOKQorICAgKGNsb2JiZXIgKG1hdGNoX3NjcmF0Y2g6U0kgMSAiPSZyIikpXQorICAiIgorICAiIyIKKyAgInJlbG9hZF9jb21wbGV0ZWQiCisgIFsoY29uc3RfaW50IDApXQorICAiCisgIHsKKyAgICBhdnIzMl9zZXRfcmV0dXJuX2FkZHJlc3MgKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSk7CisgICAgRE9ORTsKKyAgfSIKKyAgKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGZmc3NpMgorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICJmZnNzaTIiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAgKGZmczpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSkgXQorICAiIgorICAibW92ICAgICUwLCAlMQorICAgYnJldiAgICUwCisgICBjbHogICAgJTAsICUwCisgICBzdWIgICAgJTAsIC0xCisgICBjcCAgICAgJTAsIDMzCisgICBtb3ZlcSAgJTAsIDAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjE4IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildCisgICkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IHN3YXBfaAorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICIqc3dhcF9oIgorICBbIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgIChpb3I6U0kgKGFzaGlmdDpTSSAobWF0Y2hfZHVwIDApIChjb25zdF9pbnQgMTYpKQorICAgICAgICAgICAgICAgICAobHNoaWZ0cnQ6U0kgKG1hdGNoX2R1cCAwKSAoY29uc3RfaW50IDE2KSkpKV0KKyAgIiIKKyAgInN3YXAuaCAgICAlMCIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiIpXQorICApCisKKyhkZWZpbmVfaW5zbl9hbmRfc3BsaXQgImJzd2FwXzE2IgorICBbIChzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAiYXZyMzJfYnN3YXBfb3BlcmFuZCIgIj1yLFJLczEzLHIiKQorICAgICAgICAgKGlvcjpISSAoYW5kOkhJIChsc2hpZnRydDpISSAobWF0Y2hfb3BlcmFuZDpISSAxICJhdnIzMl9ic3dhcF9vcGVyYW5kIiAicixyLFJLczEzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDI1NSkpCisgICAgICAgICAgICAgICAgIChhc2hpZnQ6SEkgKGFuZDpISSAobWF0Y2hfZHVwIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDI1NSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA4KSkpKV0KKyAgIiIKKyAgeworICAgc3dpdGNoICggd2hpY2hfYWx0ZXJuYXRpdmUgKXsKKyAgICAgY2FzZSAwOgorICAgICAgIGlmICggUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzFdKSkKKyAgICAgICAgIHJldHVybiAic3dhcC5iaFx0JTAiOworICAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiAibW92XHQlMCwgJTFcO3N3YXAuYmhcdCUwIjsKKyAgICAgY2FzZSAxOgorICAgICAgIHJldHVybiAic3Rzd3AuaFx0JTAsICUxIjsKKyAgICAgY2FzZSAyOgorICAgICAgIHJldHVybiAibGRzd3Auc2hcdCUwLCAlMSI7CisgICAgIGRlZmF1bHQ6CisgICAgICAgYWJvcnQoKTsKKyAgICAgfQorICB9CisKKyAgIihyZWxvYWRfY29tcGxldGVkICYmCisgICAgIFJFR19QKG9wZXJhbmRzWzBdKSAmJiBSRUdfUChvcGVyYW5kc1sxXSkKKyAgICAgJiYgKFJFR05PKG9wZXJhbmRzWzBdKSAhPSBSRUdOTyhvcGVyYW5kc1sxXSkpKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKSAobWF0Y2hfZHVwIDEpKQorICAgKHNldCAobWF0Y2hfZHVwIDApCisgICAgICAgIChpb3I6SEkgKGFuZDpISSAobHNoaWZ0cnQ6SEkgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDI1NSkpCisgICAgICAgICAgICAgICAgKGFzaGlmdDpISSAoYW5kOkhJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNTUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA4KSkpKV0KKyAgIiIKKworICBbKHNldF9hdHRyICJsZW5ndGgiICI0LDQsNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUsc3RvcmUsbG9hZF9ybSIpXQorICApCisKKyhkZWZpbmVfaW5zbl9hbmRfc3BsaXQgImJzd2FwXzMyIgorICBbIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAiYXZyMzJfYnN3YXBfb3BlcmFuZCIgIj1yLFJLczE0LHIiKQorICAgICAgICAgKGlvcjpTSSAoaW9yOlNJIChsc2hpZnRydDpTSSAoYW5kOlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgImF2cjMyX2Jzd2FwX29wZXJhbmQiICJyLHIsUktzMTQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgLTE2Nzc3MjE2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxzaGlmdHJ0OlNJIChhbmQ6U0kgKG1hdGNoX2R1cCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMTY3MTE2ODApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDgpKSkKKyAgICAgICAgICAgICAgICAgKGlvcjpTSSAoYXNoaWZ0OlNJIChhbmQ6U0kgKG1hdGNoX2R1cCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDY1MjgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKGFzaGlmdDpTSSAoYW5kOlNJIChtYXRjaF9kdXAgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNTUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNCkpKSkpXQorICAiIgorICB7CisgICAgc3dpdGNoICggd2hpY2hfYWx0ZXJuYXRpdmUgKXsKKyAgICAgY2FzZSAwOgorICAgICAgIGlmICggUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzFdKSkKKyAgICAgICAgIHJldHVybiAic3dhcC5iXHQlMCI7CisgICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuICIjIjsKKyAgICAgY2FzZSAxOgorICAgICAgIHJldHVybiAic3Rzd3Aud1x0JTAsICUxIjsKKyAgICAgY2FzZSAyOgorICAgICAgIHJldHVybiAibGRzd3Aud1x0JTAsICUxIjsKKyAgICAgZGVmYXVsdDoKKyAgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorICAiKHJlbG9hZF9jb21wbGV0ZWQgJiYKKyAgICBSRUdfUChvcGVyYW5kc1swXSkgJiYgUkVHX1Aob3BlcmFuZHNbMV0pCisgICAgJiYgKFJFR05PKG9wZXJhbmRzWzBdKSAhPSBSRUdOTyhvcGVyYW5kc1sxXSkpKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKSAobWF0Y2hfZHVwIDEpKQorICAgKHNldCAobWF0Y2hfZHVwIDApCisgICAgICAgIChpb3I6U0kgKGlvcjpTSSAobHNoaWZ0cnQ6U0kgKGFuZDpTSSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IC0xNjc3NzIxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAobHNoaWZ0cnQ6U0kgKGFuZDpTSSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDE2NzExNjgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDgpKSkKKyAgICAgICAgICAgICAgICAoaW9yOlNJIChhc2hpZnQ6U0kgKGFuZDpTSSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA2NTI4MCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAoYXNoaWZ0OlNJIChhbmQ6U0kgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMjU1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNCkpKSkpXQorICAiIgorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQsNCw0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSxzdG9yZSxsb2FkX3JtIildCisgICkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBibG9ja2FnZQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgVU5TUEVDX1ZPTEFUSUxFIGlzIGNvbnNpZGVyZWQgdG8gdXNlIGFuZCBjbG9iYmVyIGFsbCBoYXJkIHJlZ2lzdGVycyBhbmQKKzs7IGFsbCBvZiBtZW1vcnkuICBUaGlzIGJsb2NrcyBpbnNucyBmcm9tIGJlaW5nIG1vdmVkIGFjcm9zcyB0aGlzIHBvaW50LgorCisoZGVmaW5lX2luc24gImJsb2NrYWdlIgorICBbKHVuc3BlY192b2xhdGlsZSBbKGNvbnN0X2ludCAwKV0gVlVOU1BFQ19CTE9DS0FHRSldCisgICIiCisgICIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjAiKV0KKykKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgY2x6c2kyCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisoZGVmaW5lX2luc24gImNsenNpMiIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICAoY2x6OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKSBdCisgICIiCisgICJjbHogICAgJTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfeiIpXQorICApCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGN0enNpMgorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICJjdHpzaTIiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIsciIpCisgICAgICAgICAoY3R6OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIwLHIiKSkpIF0KKyAgIiIKKyAgIkAKKyAgIGJyZXZcdCUwXDtjbHpcdCUwLCAlMAorICAgbW92XHQlMCwgJTFcO2JyZXZcdCUwXDtjbHpcdCUwLCAlMCIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiOCIpCisgICAoc2V0X2F0dHIgImNjIiAic2V0X3oiKV0KKyAgKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBjYWNoZSBpbnN0cnVjdGlvbnMKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhkZWZpbmVfaW5zbiAiY2FjaGUiCisgIFsgKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAiYXZyMzJfa3MxMV9hZGRyZXNzX29wZXJhbmQiICJwIikKKyAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDUiKV0gVlVOU1BFQ19DQUNIRSldCisgICIiCisgICJjYWNoZSAgICAlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKV0KKyAgKQorCisoZGVmaW5lX2luc24gInN5bmMiCisgIFsgKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA4IildIFZVTlNQRUNfU1lOQyldCisgICIiCisgICJzeW5jICAgICUwIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IildCisgICkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgVExCIGluc3RydWN0aW9ucworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICJ0bGJyIgorICBbICh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfVExCUildCisgICIiCisgICJ0bGJyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIildCisgICkKKworKGRlZmluZV9pbnNuICJ0bGJ3IgorICBbICh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfVExCVyldCisgICIiCisgICJ0bGJ3IgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIildCisgICkKKworKGRlZmluZV9pbnNuICJ0bGJzIgorICBbICh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfVExCUyldCisgICIiCisgICJ0bGJzIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIildCisgICkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgQnJlYWtwb2ludCBpbnN0cnVjdGlvbgorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICJicmVha3BvaW50IgorICBbICh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfQlJFQUtQT0lOVCldCisgICIiCisgICJicmVha3BvaW50IgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIildCisgICkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBtdHNyL21mc3IgaW5zdHJ1Y3Rpb24KKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhkZWZpbmVfaW5zbiAibXRzciIKKyAgWyAodW5zcGVjX3ZvbGF0aWxlIFsobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKQorICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIildIFZVTlNQRUNfTVRTUildCisgICIiCisgICJtdHNyXHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKV0KKyAgKQorCisoZGVmaW5lX2luc24gIm1mc3IiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAgKHVuc3BlY192b2xhdGlsZTpTSSBbKG1hdGNoX29wZXJhbmQgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJpIildIFZVTlNQRUNfTUZTUikpIF0KKyAgIiIKKyAgIm1mc3JcdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorICApCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IG10ZHIvbWZkciBpbnN0cnVjdGlvbgorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICJtdGRyIgorICBbICh1bnNwZWNfdm9sYXRpbGUgWyhtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIiAiaSIpCisgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0gVlVOU1BFQ19NVERSKV0KKyAgIiIKKyAgIm10ZHJcdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorICApCisKKyhkZWZpbmVfaW5zbiAibWZkciIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICAodW5zcGVjX3ZvbGF0aWxlOlNJIFsobWF0Y2hfb3BlcmFuZCAxICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKV0gVlVOU1BFQ19NRkRSKSkgXQorICAiIgorICAibWZkclx0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IildCisgICkKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgbXVzZnIKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhkZWZpbmVfaW5zbiAibXVzZnIiCisgIFsgKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0gVlVOU1BFQ19NVVNGUildCisgICIiCisgICJtdXNmclx0JTAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIiKQorICAgKHNldF9hdHRyICJjYyIgImNsb2JiZXIiKV0KKyAgKQorCisoZGVmaW5lX2luc24gIm11c3RyIgorICBbIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgICh1bnNwZWNfdm9sYXRpbGU6U0kgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfTVVTVFIpKSBdCisgICIiCisgICJtdXN0clx0JTAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIiKV0KKyAgKQorCisoZGVmaW5lX2luc24gInNzcmYiCisgIFsgKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IildIFZVTlNQRUNfU1NSRildCisgICIiCisgICJzc3JmICAgICUwIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildCisgICkKKworKGRlZmluZV9pbnNuICJjc3JmIgorICBbICh1bnNwZWNfdm9sYXRpbGUgWyhtYXRjaF9vcGVyYW5kOlNJIDAgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpXSBWVU5TUEVDX0NTUkYpXQorICAiIgorICAiY3NyZiAgICAlMCIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMiIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorICApCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IEZsdXNoIFJldHVybiBTdGFjayBpbnN0cnVjdGlvbgorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGRlZmluZV9pbnNuICJmcnMiCisgIFsgKHVuc3BlY192b2xhdGlsZSBbKGNvbnN0X2ludCAwKV0gVlVOU1BFQ19GUlMpXQorICAiIgorICAiZnJzIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildCisgICkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBTYXR1cmF0aW9uIFJvdW5kIFNjYWxlIGluc3RydWN0aW9uCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisoZGVmaW5lX2luc24gInNhdHMiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorICAgICAgICAgKHVuc3BlYzpTSSBbKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IikKKyAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpXQorICAgICAgICAgICAgICAgICAgICBVTlNQRUNfU0FUUykpIF0KKyAgIlRBUkdFVF9EU1AiCisgICJzYXRzXHQlMCA+PiAlMSwgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHVfc2F0IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorICApCisKKyhkZWZpbmVfaW5zbiAic2F0dSIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIrciIpCisgICAgICAgICAodW5zcGVjOlNJIFsobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAxICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDUiKQorICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IildCisgICAgICAgICAgICAgICAgICAgIFVOU1BFQ19TQVRVKSkgXQorICAiVEFSR0VUX0RTUCIKKyAgInNhdHVcdCUwID4+ICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgImFsdV9zYXQiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IildCisgICkKKworKGRlZmluZV9pbnNuICJzYXRybmRzIgorICBbIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIityIikKKyAgICAgICAgICh1bnNwZWM6U0kgWyhtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDEgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpCisgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDUiKV0KKyAgICAgICAgICAgICAgICAgICAgVU5TUEVDX1NBVFJORFMpKSBdCisgICJUQVJHRVRfRFNQIgorICAic2F0cm5kc1x0JTAgPj4gJTEsICUyIgorICBbKHNldF9hdHRyICJ0eXBlIiAiYWx1X3NhdCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKV0KKyAgKQorCisoZGVmaW5lX2luc24gInNhdHJuZHUiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorICAgICAgICAgKHVuc3BlYzpTSSBbKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA1IikKKyAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpXQorICAgICAgICAgICAgICAgICAgICBVTlNQRUNfU0FUUk5EVSkpIF0KKyAgIlRBUkdFVF9EU1AiCisgICJzYXRzXHQlMCA+PiAlMSwgJTIiCisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHVfc2F0IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorICApCisKKzs7IFNwZWNpYWwgcGF0dGVybnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgY29uc3RhbnQgcG9vbAorCisoZGVmaW5lX2luc24gImFsaWduXzQiCisgIFsodW5zcGVjX3ZvbGF0aWxlIFsoY29uc3RfaW50IDApXSBWVU5TUEVDX0FMSUdOKV0KKyAgIiIKKyAgeworICAgYXNzZW1ibGVfYWxpZ24gKDMyKTsKKyAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICIyIildCispCisKKyhkZWZpbmVfaW5zbiAiY29uc3R0YWJsZV9zdGFydCIKKyAgWyh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfUE9PTF9TVEFSVCldCisgICIiCisgIHsKKyAgIHJldHVybiAiLmNwb29sIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICIwIildCisgICkKKworKGRlZmluZV9pbnNuICJjb25zdHRhYmxlX2VuZCIKKyAgWyh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfUE9PTF9FTkQpXQorICAiIgorICB7CisgICBtYWtpbmdfY29uc3RfdGFibGUgPSBGQUxTRTsKKyAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICIwIildCispCisKKworKGRlZmluZV9pbnNuICJjb25zdHRhYmxlXzQiCisgIFsodW5zcGVjX3ZvbGF0aWxlIFsobWF0Y2hfb3BlcmFuZCAwICIiICIiKV0gVlVOU1BFQ19QT09MXzQpXQorICAiIgorICB7CisgICAgbWFraW5nX2NvbnN0X3RhYmxlID0gVFJVRTsKKyAgICBzd2l0Y2ggKEdFVF9NT0RFX0NMQVNTIChHRVRfTU9ERSAob3BlcmFuZHNbMF0pKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgTU9ERV9GTE9BVDoKKyAgICAgIHsKKyAgICAgICAgUkVBTF9WQUxVRV9UWVBFIHI7CisgICAgICAgIGNoYXIgcmVhbF9zdHJpbmdbMTAyNF07CisgICAgICAgIFJFQUxfVkFMVUVfRlJPTV9DT05TVF9ET1VCTEUgKHIsIG9wZXJhbmRzWzBdKTsKKyAgICAgICAgcmVhbF90b19kZWNpbWFsKHJlYWxfc3RyaW5nLCAmciwgMTAyNCwgMCwgMSk7CisgICAgICAgIGFzbV9mcHJpbnRmIChhc21fb3V0X2ZpbGUsICJcdC5mbG9hdFx0JXNcbiIsIHJlYWxfc3RyaW5nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlbWJsZV9pbnRlZ2VyIChvcGVyYW5kc1swXSwgNCwgMCwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IildCispCisKKyhkZWZpbmVfaW5zbiAiY29uc3R0YWJsZV84IgorICBbKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQgMCAiIiAiIildIFZVTlNQRUNfUE9PTF84KV0KKyAgIiIKKyAgeworICAgIG1ha2luZ19jb25zdF90YWJsZSA9IFRSVUU7CisgICAgc3dpdGNoIChHRVRfTU9ERV9DTEFTUyAoR0VUX01PREUgKG9wZXJhbmRzWzBdKSkpCisgICAgICB7CisgICAgICAgY2FzZSBNT0RFX0ZMT0FUOgorICAgICAgICB7CisgICAgICAgICBSRUFMX1ZBTFVFX1RZUEUgcjsgCisgICAgICAgICBjaGFyIHJlYWxfc3RyaW5nWzEwMjRdOworICAgICAgICAgUkVBTF9WQUxVRV9GUk9NX0NPTlNUX0RPVUJMRSAociwgb3BlcmFuZHNbMF0pOworICAgICAgICAgcmVhbF90b19kZWNpbWFsKHJlYWxfc3RyaW5nLCAmciwgMTAyNCwgMCwgMSk7CisgICAgICAgICBhc21fZnByaW50ZiAoYXNtX291dF9maWxlLCAiXHQuZG91YmxlXHQlc1xuIiwgcmVhbF9zdHJpbmcpOworICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgYXNzZW1ibGVfaW50ZWdlcihvcGVyYW5kc1swXSwgOCwgMCwgMSk7CisgICAgICAgIGJyZWFrOworICAgICB9CisgICAgcmV0dXJuICIiOworICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjgiKV0KKykKKworKGRlZmluZV9pbnNuICJjb25zdHRhYmxlXzE2IgorICBbKHVuc3BlY192b2xhdGlsZSBbKG1hdGNoX29wZXJhbmQgMCAiIiAiIildIFZVTlNQRUNfUE9PTF8xNildCisgICIiCisgIHsKKyAgICBtYWtpbmdfY29uc3RfdGFibGUgPSBUUlVFOworICAgIGFzc2VtYmxlX2ludGVnZXIob3BlcmFuZHNbMF0sIDE2LCAwLCAxKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMTYiKV0KKykKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisoZGVmaW5lX2luc24gImNvcCIKKyAgWyAodW5zcGVjX3ZvbGF0aWxlIFsobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDMiKQorICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDEgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNCIpCisgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA0IikKKyAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAzICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDQiKQorICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDQgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNyIpXSBWVU5TUEVDX0NPUCldCisgICIiCisgICJjb3BcdGNwJTAsIGNyJTEsIGNyJTIsIGNyJTMsICU0IgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IildCisgICkKKworKGRlZmluZV9pbnNuICJtdmNyc2kiCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJhdnIzMl9jb3BfbW92ZV9vcGVyYW5kIiAiPXIsPCxaIikKKyAgICAgICAgICh1bnNwZWNfdm9sYXRpbGU6U0kgWyhtYXRjaF9vcGVyYW5kIDEgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwMyxLdTAzLEt1MDMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA0LEt1MDQsS3UwNCIpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVU5TUEVDX01WQ1IpKSBdCisgICIiCisgICJACisgICBtdmNyLndcdGNwJTEsICUwLCBjciUyCisgICBzdGNtLndcdGNwJTEsICUwLCBjciUyCisgICBzdGMud1x0Y3AlMSwgJTAsIGNyJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKV0KKyAgKQorCisoZGVmaW5lX2luc24gIm12Y3JkaSIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDAgImF2cjMyX2NvcF9tb3ZlX29wZXJhbmQiICI9ciw8LFoiKQorICAgICAgICAgKHVuc3BlY192b2xhdGlsZTpESSBbKG1hdGNoX29wZXJhbmQgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTAzLEt1MDMsS3UwMyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDQsS3UwNCxLdTA0IildCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZVTlNQRUNfTVZDUikpIF0KKyAgIiIKKyAgIkAKKyAgIG12Y3IuZFx0Y3AlMSwgJTAsIGNyJTIKKyAgIHN0Y20uZFx0Y3AlMSwgJTAsIGNyJTItY3IlaTIKKyAgIHN0Yy5kXHRjcCUxLCAlMCwgY3IlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorICApCisKKyhkZWZpbmVfaW5zbiAibXZyY3NpIgorICBbICh1bnNwZWNfdm9sYXRpbGU6U0kgWyhtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwMyxLdTAzLEt1MDMiKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDEgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNCxLdTA0LEt1MDQiKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgImF2cjMyX2NvcF9tb3ZlX29wZXJhbmQiICJyLD4sWiIpXQorICAgICAgICAgICAgICAgICAgICAgICAgVlVOU1BFQ19NVlJDKV0KKyAgIiIKKyAgeworICAgc3dpdGNoICh3aGljaF9hbHRlcm5hdGl2ZSl7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICJtdnJjLndcdGNwJTAsIGNyJTEsICUyIjsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gImxkY20ud1x0Y3AlMCwgJTIsIGNyJTEiOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAibGRjLndcdGNwJTAsIGNyJTEsICUyIjsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQoKTsKKyAgIH0KKyAgfQorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IildCisgICkKKworKGRlZmluZV9pbnNuICJtdnJjZGkiCisgIFsgKHVuc3BlY192b2xhdGlsZTpESSBbKG1hdGNoX29wZXJhbmQgMCAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTAzLEt1MDMsS3UwMyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA0LEt1MDQsS3UwNCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REkgMiAiYXZyMzJfY29wX21vdmVfb3BlcmFuZCIgInIsPixaIildCisgICAgICAgICAgICAgICAgICAgICAgICBWVU5TUEVDX01WUkMpXQorICAiIgorICB7CisgICBzd2l0Y2ggKHdoaWNoX2FsdGVybmF0aXZlKXsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gIm12cmMuZFx0Y3AlMCwgY3IlMSwgJTIiOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiAibGRjbS5kXHRjcCUwLCAlMiwgY3IlMS1jciVpMSI7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuICJsZGMuZFx0Y3AlMCwgY3IlMSwgJTIiOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgfQorICB9CisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKV0KKyAgKQorCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBlcGlsb2d1ZQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgVGhpcyBwYXR0ZXJuIGVtaXRzIFJUTCBmb3IgZXhpdCBmcm9tIGEgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBleGl0IGlzCis7OyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZSBzdGFjayBmcmFtZSwgcmVzdG9yaW5nIGNhbGxlZSBzYXZlZAorOzsgcmVnaXN0ZXJzIGFuZCBlbWl0dGluZyB0aGUgcmV0dXJuIGluc3RydWN0aW9uLgorOzsgVG9EbzogdXNpbmcgVEFSR0VUX0FTTV9GVU5DVElPTl9QUk9MT0dVRSBpbnN0ZWFkLgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9leHBhbmQgImVwaWxvZ3VlIgorICBbKHVuc3BlY192b2xhdGlsZSBbKHJldHVybildIFZVTlNQRUNfRVBJTE9HVUUpXQorICAiIgorICAiCisgIGlmIChVU0VfUkVUVVJOX0lOU04gKEZBTFNFKSl7CisgICAgICBlbWl0X2p1bXBfaW5zbiAoZ2VuX3JldHVybiAoKSk7CisgICAgICBET05FOworICB9CisgIGVtaXRfanVtcF9pbnNuIChnZW5fcnR4X1VOU1BFQ19WT0xBVElMRSAoVk9JRG1vZGUsCisJZ2VuX3J0dmVjICgxLAorCQlnZW5fcnR4X1JFVFVSTiAoVk9JRG1vZGUpKSwKKwlWVU5TUEVDX0VQSUxPR1VFKSk7CisgIERPTkU7CisgICIKKyAgKQorCisoZGVmaW5lX2luc24gIiplcGlsb2d1ZV9pbnNucyIKKyAgWyh1bnNwZWNfdm9sYXRpbGUgWyhyZXR1cm4pXSBWVU5TUEVDX0VQSUxPR1VFKV0KKyAgIiIKKyAgeworICAgIGF2cjMyX291dHB1dF9yZXR1cm5faW5zdHJ1Y3Rpb24gKEZBTFNFLCBGQUxTRSwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuICIiOworICB9CisgIDsgTGVuZ3RoIGlzIGFic29sdXRlIHdvcnN0IGNhc2UKKyAgWyhzZXRfYXR0ciAidHlwZSIgImJyYW5jaCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjEyIildCisgICkKKworKGRlZmluZV9pbnNuICIqZXBpbG9ndWVfaW5zbnNfcmV0X2ltbSIKKyAgWyhwYXJhbGxlbCBbKHNldCAocmVnIFJFVFZBTF9SRUdOVU0pIChtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIiAiaSIpKQorICAgICAgICAgICAgICAodXNlIChyZWcgUkVUVkFMX1JFR05VTSkpCisgICAgICAgICAgICAgICh1bnNwZWNfdm9sYXRpbGUgWyhyZXR1cm4pXSBWVU5TUEVDX0VQSUxPR1VFKV0pXQorICAiKChJTlRWQUwob3BlcmFuZHNbMF0pID09IC0xKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzBdKSA9PSAwKSB8fCAoSU5UVkFMKG9wZXJhbmRzWzBdKSA9PSAxKSkiCisgIHsKKyAgICBhdnIzMl9vdXRwdXRfcmV0dXJuX2luc3RydWN0aW9uIChGQUxTRSwgRkFMU0UsIE5VTEwsIG9wZXJhbmRzWzBdKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgOyBMZW5ndGggaXMgYWJzb2x1dGUgd29yc3QgY2FzZQorICBbKHNldF9hdHRyICJ0eXBlIiAiYnJhbmNoIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiMTIiKV0KKyAgKQorCisoZGVmaW5lX2luc24gInNpYmNhbGxfZXBpbG9ndWUiCisgIFsodW5zcGVjX3ZvbGF0aWxlIFsoY29uc3RfaW50IDApXSBWVU5TUEVDX0VQSUxPR1VFKV0KKyAgIiIKKyAgeworICAgYXZyMzJfb3V0cHV0X3JldHVybl9pbnN0cnVjdGlvbiAoRkFMU0UsIEZBTFNFLCAgTlVMTCwgTlVMTCk7CisgICByZXR1cm4gIiI7CisgIH0KKzs7IExlbmd0aCBpcyBhYnNvbHV0ZSB3b3JzdCBjYXNlCisgIFsoc2V0X2F0dHIgInR5cGUiICJicmFuY2giKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIxMiIpXQorICApCisKKyhkZWZpbmVfaW5zbiAiKnNpYmNhbGxfZXBpbG9ndWVfaW5zbnNfcmV0X2ltbSIKKyAgWyhwYXJhbGxlbCBbKHNldCAocmVnIFJFVFZBTF9SRUdOVU0pIChtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIiAiaSIpKQorICAgICAgICAgICAgICAodXNlIChyZWcgUkVUVkFMX1JFR05VTSkpCisgICAgICAgICAgICAgICh1bnNwZWNfdm9sYXRpbGUgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfRVBJTE9HVUUpXSldCisgICIoKElOVFZBTChvcGVyYW5kc1swXSkgPT0gLTEpIHx8IChJTlRWQUwob3BlcmFuZHNbMF0pID09IDApIHx8IChJTlRWQUwob3BlcmFuZHNbMF0pID09IDEpKSIKKyAgeworICAgIGF2cjMyX291dHB1dF9yZXR1cm5faW5zdHJ1Y3Rpb24gKEZBTFNFLCBGQUxTRSwgTlVMTCwgb3BlcmFuZHNbMF0pOworICAgIHJldHVybiAiIjsKKyAgfQorICA7IExlbmd0aCBpcyBhYnNvbHV0ZSB3b3JzdCBjYXNlCisgIFsoc2V0X2F0dHIgInR5cGUiICJicmFuY2giKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIxMiIpXQorICApCisKKyhkZWZpbmVfaW5zbiAibGR4aSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkobWVtOlNJIChwbHVzOlNJCisgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgKG11bHQ6U0kgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDMgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDQpKSkpKV0KKyAgIihJTlRWQUwob3BlcmFuZHNbM10pID09IDI0IHx8IElOVFZBTChvcGVyYW5kc1szXSkgPT0gMTYgfHwgSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSA4CisgICB8fCBJTlRWQUwob3BlcmFuZHNbM10pID09IDApIgorICB7CisgICBzd2l0Y2ggKCBJTlRWQUwob3BlcmFuZHNbM10pICl7CisgICAgY2FzZSAwOgorICAgICAgICAgcmV0dXJuICJsZC53ICAgICUwLCAlMVslMjpiIDw8IDJdIjsKKyAgICBjYXNlIDg6CisgICAgICAgICByZXR1cm4gImxkLncgICAgJTAsICUxWyUyOmwgPDwgMl0iOworICAgIGNhc2UgMTY6CisgICAgICAgICByZXR1cm4gImxkLncgICAgJTAsICUxWyUyOnUgPDwgMl0iOworICAgIGNhc2UgMjQ6CisgICAgICAgICByZXR1cm4gImxkLncgICAgJTAsICUxWyUyOnQgPDwgMl0iOworICAgIGRlZmF1bHQ6CisgICAgICAgICBpbnRlcm5hbF9lcnJvcigiaWxsZWdhbCBvcGVyYW5kIGZvciBsZHhpIik7CisgICB9CisgIH0KKyAgWyhzZXRfYXR0ciAidHlwZSIgImxvYWQiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJub25lIildKQorCisKKworCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUGVlcGhvbGUgb3B0aW1pemluZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQ2hhbmdpbmcKKzs7ICAgc3ViICAgICByOCwgcjcsIDgKKzs7ICAgc3QudyAgICByOFsweDBdLCByMTIKKzs7IHRvCis7OyAgIHN1YiAgICAgcjgsIHI3LCA4Cis7OyAgIHN0LncgICAgcjdbLTB4OF0sIHIxMgorOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyAoc2V0IChyZWc6U0kgOSByOCkKKzsgICAgICAocGx1czpTSSAocmVnL2Y6U0kgNiByNykKKzsgICAgICAgICAgICAgICAoY29uc3RfaW50IC4uLikpKQorOyAoc2V0IChtZW06U0kgKHJlZzpTSSA5IHI4KSkKKzsgICAgICAocmVnOlNJIDEyIHIxMikpCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkocGx1czpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkJIChtYXRjaF9vcGVyYW5kOlNJIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWVtOlNJIChtYXRjaF9kdXAgMCkpCisJKG1hdGNoX29wZXJhbmQ6U0kgMyAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKV0KKyAgIlJFR05PKG9wZXJhbmRzWzBdKSAhPSBSRUdOTyhvcGVyYW5kc1sxXSkgJiYgYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcChJTlRWQUwob3BlcmFuZHNbMl0pLCAnSycsIFwiS3MxNlwiKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKQorCShwbHVzOlNJIChtYXRjaF9kdXAgMSkKKwkJIChtYXRjaF9kdXAgMikpKQorICAgKHNldCAobWVtOlNJIChwbHVzOlNJIChtYXRjaF9kdXAgMSkKKwkJCSAobWF0Y2hfZHVwIDIpKSkKKwkobWF0Y2hfZHVwIDMpKV0KKyAgIiIpCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IFBlZXBob2xlIG9wdGltaXppbmcKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IENoYW5naW5nCis7OyAgIHN1YiAgICAgcjYsIHI3LCA0Cis7OyAgIGxkLncgICAgcjYsIHI2WzB4MF0KKzs7IHRvCis7OyAgIHN1YiAgICAgcjYsIHI3LCA0Cis7OyAgIGxkLncgICAgcjYsIHI3Wy0weDRdCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7IChzZXQgKHJlZzpTSSA3IHI2KQorOyAgICAgIChwbHVzOlNJIChyZWcvZjpTSSA2IHI3KQorOyAgICAgICAgICAgICAgIChjb25zdF9pbnQgLTQgWzB4ZmZmZmZmZmNdKSkpCis7IChzZXQgKHJlZzpTSSA3IHI2KQorOyAgICAgIChtZW06U0kgKHJlZzpTSSA3IHI2KSkpCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkocGx1czpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkJIChtYXRjaF9vcGVyYW5kOlNJIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobWVtOlNJIChtYXRjaF9kdXAgMCkpKV0KKyAgIlJFR05PKG9wZXJhbmRzWzBdKSAhPSBSRUdOTyhvcGVyYW5kc1sxXSkgJiYgYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcChJTlRWQUwob3BlcmFuZHNbMl0pLCAnSycsIFwiS3MxNlwiKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAwKQorCShwbHVzOlNJIChtYXRjaF9kdXAgMSkKKwkJIChtYXRjaF9kdXAgMikpKQorICAgKHNldCAobWF0Y2hfZHVwIDMpCisJKG1lbTpTSSAocGx1czpTSSAobWF0Y2hfZHVwIDEpCisJCQkgKG1hdGNoX2R1cCAyKSkpKV0KKyAgIiIpCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IFBlZXBob2xlIG9wdGltaXppbmcKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IENoYW5naW5nCis7OyAgIGxkLnNiICAgcjAsIHI3Wy0weDZdCis7OyAgIGNhc2hzLmIgcjAKKzs7IHRvCis7OyAgIGxkLnNiICAgcjAsIHI3Wy0weDZdCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpRSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobWF0Y2hfb3BlcmFuZDpRSSAxICJsb2FkX3NiX21lbW9yeV9vcGVyYW5kIiAiIikpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShzaWduX2V4dGVuZDpTSSAobWF0Y2hfZHVwIDApKSldCisgICIoUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzJdKSB8fCBwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMikKKwkoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpXQorICAiIikKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUGVlcGhvbGUgb3B0aW1pemluZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQ2hhbmdpbmcKKzs7ICAgbGQudWIgICByMCwgcjdbLTB4Nl0KKzs7ICAgY2FzaHUuYiByMAorOzsgdG8KKzs7ICAgbGQudWIgICByMCwgcjdbLTB4Nl0KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlFJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtYXRjaF9vcGVyYW5kOlFJIDEgIm1lbW9yeV9vcGVyYW5kIiAiIikpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCSh6ZXJvX2V4dGVuZDpTSSAobWF0Y2hfZHVwIDApKSldCisgICIoUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzJdKSkgfHwgcGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMikKKwkoemVyb19leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpXQorICAiIikKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUGVlcGhvbGUgb3B0aW1pemluZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQ2hhbmdpbmcKKzs7ICAgbGQuc2ggICByMCwgcjdbLTB4Nl0KKzs7ICAgY2FzdHMuaCByMAorOzsgdG8KKzs7ICAgbGQuc2ggICByMCwgcjdbLTB4Nl0KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtYXRjaF9vcGVyYW5kOkhJIDEgIm1lbW9yeV9vcGVyYW5kIiAiIikpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShzaWduX2V4dGVuZDpTSSAobWF0Y2hfZHVwIDApKSldCisgICIoUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzJdKSkgfHwgcGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMikKKwkoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpXQorICAiIikKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUGVlcGhvbGUgb3B0aW1pemluZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQ2hhbmdpbmcKKzs7ICAgbGQudWggICByMCwgcjdbLTB4Nl0KKzs7ICAgY2FzdHUuaCByMAorOzsgdG8KKzs7ICAgbGQudWggICByMCwgcjdbLTB4Nl0KKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtYXRjaF9vcGVyYW5kOkhJIDEgIm1lbW9yeV9vcGVyYW5kIiAiIikpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorCSh6ZXJvX2V4dGVuZDpTSSAobWF0Y2hfZHVwIDApKSldCisgICIoUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzJdKSkgfHwgcGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMikKKwkoemVyb19leHRlbmQ6U0kgKG1hdGNoX2R1cCAxKSkpXQorICAiIikKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUGVlcGhvbGUgb3B0aW1pemluZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgQ2hhbmdpbmcKKzs7ICAgbXVsICAgICByZCwgcngsIHJ5Cis7OyAgIGFkZCAgICAgcmQyLCByZCAgCis7OyBvcgorOzsgICBhZGQgICAgIHJkMiwgcmQsIHJkMiAgCis7OyB0bworOzsgICBtYWMgICAgIHJkMiwgcngsIHJ5Cis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKG11bHQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMyAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChwbHVzOlNJIChtYXRjaF9kdXAgMykKKyAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAwKSkpXQorICAicGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMykKKwkocGx1czpTSSAobXVsdDpTSSAobWF0Y2hfZHVwIDEpCisJCQkgIChtYXRjaF9kdXAgMikpCisJCSAobWF0Y2hfZHVwIDMpKSldCisgICIiKQorCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKG11bHQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMyAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChwbHVzOlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKSkpXQorICAicGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMykKKwkocGx1czpTSSAobXVsdDpTSSAobWF0Y2hfZHVwIDEpCisJCQkgIChtYXRjaF9kdXAgMikpCisJCSAobWF0Y2hfZHVwIDMpKSldCisgICIiKQorCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IFBlZXBob2xlIG9wdGltaXppbmcKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7IENoYW5naW5nCis7OyAgIGJmZXh0dSAgcmQsIHJzLCBrNSwgMSBvciBhbmQoaC9sKSByZCwgb25lX2JpdF9zZXRfbWFzaworOzsgdG8KKzs7ICAgYmxkICAgICBycywgazUKKzs7Cis7OyBJZiByZCBpcyBkZWFkIGFmdGVyIHRoZSBvcGVyYXRpb24uCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisoZGVmaW5lX3BlZXBob2xlMgorICBbIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAoemVyb19leHRyYWN0OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKQorICAgIChzZXQgKGNjMCkKKyAgICAgICAgIChtYXRjaF9kdXAgMCkpXQorICAicGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChjYzApCisgICAgICAgIChhbmQ6U0kgKG1hdGNoX2R1cCAxKQorICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMikpKV0KKyAgIm9wZXJhbmRzWzJdID0gR0VOX0lOVCgxIDw8IElOVFZBTChvcGVyYW5kc1syXSkpOyIpCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgIChhbmQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgIm9uZV9iaXRfc2V0X29wZXJhbmQiICIiKSkpCisgICAgKHNldCAoY2MwKQorICAgICAgICAgKG1hdGNoX2R1cCAwKSldCisgICJwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSIKKyAgWyhzZXQgKGNjMCkKKyAgICAgICAgKGFuZDpTSSAobWF0Y2hfZHVwIDEpCisgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAyKSkpXQorICAiIikKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUGVlcGhvbGUgb3B0aW1pemluZworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgTG9hZCB3aXRoIGV4dHJhY3RlZCBpbmRleDogbGQudyAgUmQsIFJiW1JpOnt0L3UvYi9sfSA8PCAyXQorOzsKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisoZGVmaW5lX3BlZXBob2xlCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoemVyb19leHRyYWN0OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJhdnIzMl9leHRyYWN0X3NoaWZ0X29wZXJhbmQiICIiKSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWVtOlNJIChwbHVzOlNJIChtdWx0OlNJIChtYXRjaF9kdXAgMCkgKGNvbnN0X2ludCA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSA0ICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpKSldCisKKyAgIihkZWFkX29yX3NldF9wKGluc24sIG9wZXJhbmRzWzBdKSkiCisgIHsKKyAgIHN3aXRjaCAoIElOVFZBTChvcGVyYW5kc1syXSkgKXsKKyAgICBjYXNlIDA6CisgICAgICAgICByZXR1cm4gImxkLncgICAgJTMsICU0WyUxOmIgPDwgMl0iOworICAgIGNhc2UgODoKKyAgICAgICAgIHJldHVybiAibGQudyAgICAlMywgJTRbJTE6bCA8PCAyXSI7CisgICAgY2FzZSAxNjoKKyAgICAgICAgIHJldHVybiAibGQudyAgICAlMywgJTRbJTE6dSA8PCAyXSI7CisgICAgY2FzZSAyNDoKKyAgICAgICAgIHJldHVybiAibGQudyAgICAlMywgJTRbJTE6dCA8PCAyXSI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgIGludGVybmFsX2Vycm9yKCJpbGxlZ2FsIG9wZXJhbmQgZm9yIGxkeGkiKTsKKyAgIH0KKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAibG9hZCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImNsb2JiZXIiKV0KKyAgKQorCisKKworKGRlZmluZV9wZWVwaG9sZQorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKGFuZDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikgKGNvbnN0X2ludCAyNTUpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChtZW06U0kgKHBsdXM6U0kgKG11bHQ6U0kgKG1hdGNoX2R1cCAwKSAoY29uc3RfaW50IDQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkpKV0KKworICAiKGRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbMF0pKSIKKworICAibGQudyAgICAlMiwgJTNbJTE6YiA8PCAyXSIKKyAgWyhzZXRfYXR0ciAidHlwZSIgImxvYWQiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildCisgICkKKworCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiYXZyMzJfZXh0cmFjdF9zaGlmdF9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKyAgICAgICAgKG1lbTpTSSAocGx1czpTSSAobXVsdDpTSSAobWF0Y2hfZHVwIDApIChjb25zdF9pbnQgNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgNCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkpXQorCisgICIocGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkpCisgICB8fCAoUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFR05PKG9wZXJhbmRzWzNdKSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMykKKwkobWVtOlNJIChwbHVzOlNJCisgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgNCkKKyAgICAgICAgICAgICAgICAgKG11bHQ6U0kgKHplcm9fZXh0cmFjdDpTSSAobWF0Y2hfZHVwIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgNCkpKSkpXQorICApCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoemVyb19leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6UUkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChtZW06U0kgKHBsdXM6U0kgKG11bHQ6U0kgKG1hdGNoX2R1cCAwKSAoY29uc3RfaW50IDQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkpKV0KKworICAiKHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pKQorICAgfHwgKFJFR05PKG9wZXJhbmRzWzBdKSA9PSBSRUdOTyhvcGVyYW5kc1syXSkpIgorICBbKHNldCAobWF0Y2hfZHVwIDIpCisJKG1lbTpTSSAocGx1czpTSQorICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDMpCisgICAgICAgICAgICAgICAgIChtdWx0OlNJICh6ZXJvX2V4dHJhY3Q6U0kgKG1hdGNoX2R1cCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDQpKSkpKV0KKyAgIm9wZXJhbmRzWzFdID0gZ2VuX3J0eF9SRUcoU0ltb2RlLCBSRUdOTyhvcGVyYW5kc1sxXSkpOyIKKyAgKQorCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoYW5kOlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMjU1KSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWVtOlNJIChwbHVzOlNJIChtdWx0OlNJIChtYXRjaF9kdXAgMCkgKGNvbnN0X2ludCA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpKSldCisKKyAgIihwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSkKKyAgIHx8IChSRUdOTyhvcGVyYW5kc1swXSkgPT0gUkVHTk8ob3BlcmFuZHNbMl0pKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAyKQorCShtZW06U0kgKHBsdXM6U0kKKyAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKQorICAgICAgICAgICAgICAgICAobXVsdDpTSSAoemVyb19leHRyYWN0OlNJIChtYXRjaF9kdXAgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA0KSkpKSldCisgICIiCisgICkKKworCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobHNoaWZ0cnQ6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDI0KSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWVtOlNJIChwbHVzOlNJIChtdWx0OlNJIChtYXRjaF9kdXAgMCkgKGNvbnN0X2ludCA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpKSldCisKKyAgIihwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSkKKyAgIHx8IChSRUdOTyhvcGVyYW5kc1swXSkgPT0gUkVHTk8ob3BlcmFuZHNbMl0pKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAyKQorCShtZW06U0kgKHBsdXM6U0kKKyAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKQorICAgICAgICAgICAgICAgICAobXVsdDpTSSAoemVyb19leHRyYWN0OlNJIChtYXRjaF9kdXAgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9pbnQgNCkpKSkpXQorICAiIgorICApCisKKworOzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzs7IEFORE4KKzs7Cis7OyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobm90OlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAoYW5kOlNJIChtYXRjaF9kdXAgMikKKyAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDApKSldCisgICJwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSIKKworICBbKHNldCAobWF0Y2hfZHVwIDIpCisgICAgICAgIChhbmQ6U0kgIChtYXRjaF9kdXAgMikKKyAgICAgICAgICAgICAgICAgKG5vdDpTSSAobWF0Y2hfZHVwIDEpKQorICAgICAgICAgICAgICAgICApKV0KKyAgIiIKKykKKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChub3Q6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChhbmQ6U0kgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMikKKyAgICAgICAgICAgICAgICApKV0KKyAgInBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pIgorCisgIFsoc2V0IChtYXRjaF9kdXAgMikKKyAgICAgICAgKGFuZDpTSSAgKG1hdGNoX2R1cCAyKQorICAgICAgICAgICAgICAgICAobm90OlNJIChtYXRjaF9kdXAgMSkpCisgICAgICAgICAgICAgICAgICkpXQorCisgICIiCispCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgQWRkYWJzIHBlZXBob2xlCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfcGVlcGhvbGUKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAJKGFiczpTSSAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAJKHBsdXM6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMyAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorIAkJIChtYXRjaF9kdXAgMikpKV0KKyAgImRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbMl0pIgorICAiYWRkYWJzICAlMCwgJTMsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfeiIpXSkKKworKGRlZmluZV9wZWVwaG9sZQorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorIAkoYWJzOlNJIChtYXRjaF9vcGVyYW5kOlNJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorIAkocGx1czpTSSAobWF0Y2hfZHVwIDIpCisgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDMgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKV0KKyAgImRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbMl0pIgorICAiYWRkYWJzICAlMCwgJTMsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJzZXRfeiIpXSkKKworCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBEZXRlY3Qgcm91bmRpbmdzCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhkZWZpbmVfaW5zbiAiKnJvdW5kIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorICAgICAgICAoYXNoaWZ0cnQ6U0kgKHBsdXM6U0kgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAiaW1tZWRpYXRlX29wZXJhbmQiICJpIikpCisgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKSkpXQorICAiYXZyMzJfcm5kX29wZXJhbmRzKG9wZXJhbmRzWzFdLCBvcGVyYW5kc1syXSkiCisKKyAgInNhdHJuZHMgICAgJTAgPj4gJTIsIDMxIgorCisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHVfc2F0IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorCisgICkKKworCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkocGx1czpTSSAobWF0Y2hfZHVwIDApCisgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDEgImltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWF0Y2hfZHVwIDApCisJKGFzaGlmdHJ0OlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKV0KKyAgImF2cjMyX3JuZF9vcGVyYW5kcyhvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pIgorCisgIFsoc2V0IChtYXRjaF9kdXAgMCkKKyAgICAgICAgKGFzaGlmdHJ0OlNJIChwbHVzOlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMSkpCisgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDIpKSldCisgICkKKworKGRlZmluZV9wZWVwaG9sZQorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisJKHBsdXM6U0kgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKSkpCisgICAoc2V0IChtYXRjaF9kdXAgMCkKKwkoYXNoaWZ0cnQ6U0kgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJpIikpKV0KKyAgImF2cjMyX3JuZF9vcGVyYW5kcyhvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pIgorCisgICJzYXRybmRzICAgICUwID4+ICUyLCAzMSIKKworICBbKHNldF9hdHRyICJ0eXBlIiAiYWx1X3NhdCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJjYyIgImNsb2JiZXIiKV0KKworICApCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgbWNhbGwKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyhkZWZpbmVfcGVlcGhvbGUKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAgICAgICIiKQorCShtYXRjaF9vcGVyYW5kIDEgImF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQiICAiIikpCisgICAocGFyYWxsZWwgWyhjYWxsIChtZW06U0kgKG1hdGNoX2R1cCAwKSkKKyAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMiAiIiAiIikpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgImRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbMF0pIgorICAibWNhbGwgICAgJTEiCisgIFsoc2V0X2F0dHIgInR5cGUiICJjYWxsIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorKQorCisoZGVmaW5lX3BlZXBob2xlCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICAgICAgICAiIikKKwkobWF0Y2hfb3BlcmFuZCAxICJhdnIzMl9jb25zdF9wb29sX3JlZl9vcGVyYW5kIiAgIiIpKQorICAgKHBhcmFsbGVsIFsoc2V0IChtYXRjaF9vcGVyYW5kIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgIChjYWxsIChtZW06U0kgKG1hdGNoX2R1cCAyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAzICIiICIiKSkpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgImRlYWRfb3Jfc2V0X3AoaW5zbiwgb3BlcmFuZHNbMl0pIgorICAibWNhbGwgICAgJTEiCisgIFsoc2V0X2F0dHIgInR5cGUiICJjYWxsIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2FsbF9zZXQiKV0KKykKKworCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgICAiIikKKwkobWF0Y2hfb3BlcmFuZCAxICJhdnIzMl9jb25zdF9wb29sX3JlZl9vcGVyYW5kIiAgIiIpKQorICAgKHBhcmFsbGVsIFsoY2FsbCAobWVtOlNJIChtYXRjaF9kdXAgMCkpCisgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDIgIiIgIiIpKQorICAgICAgICAgICAgICAoY2xvYmJlciAocmVnOlNJIExSX1JFR05VTSkpXSldCisgICJwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSIKKyAgWyhwYXJhbGxlbCBbKGNhbGwgKG1lbTpTSSAobWF0Y2hfZHVwIDEpKQorICAgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDIpKQorICAgICAgICAgICAgICAoY2xvYmJlciAocmVnOlNJIExSX1JFR05VTSkpXSldCisgICIiCispCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICAgICAiIikKKwkobWF0Y2hfb3BlcmFuZCAxICJhdnIzMl9jb25zdF9wb29sX3JlZl9vcGVyYW5kIiAgIiIpKQorICAgKHBhcmFsbGVsIFsoc2V0IChtYXRjaF9vcGVyYW5kIDIgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAgICAgICAgICAgIChjYWxsIChtZW06U0kgKG1hdGNoX2R1cCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAzICIiICIiKSkpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgIihwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSB8fCAoUkVHTk8ob3BlcmFuZHNbMl0pID09IFJFR05PKG9wZXJhbmRzWzBdKSkpIgorICBbKHBhcmFsbGVsIFsoc2V0IChtYXRjaF9kdXAgMikKKyAgICAgICAgICAgICAgICAgICAoY2FsbCAobWVtOlNJIChtYXRjaF9kdXAgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKSkpCisgICAgICAgICAgICAgIChjbG9iYmVyIChyZWc6U0kgTFJfUkVHTlVNKSldKV0KKyAgIiIKKykKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgUmV0dXJuaW5nIGEgdmFsdWUKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisoZGVmaW5lX3BlZXBob2xlCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kIDAgInJlZ2lzdGVyX29wZXJhbmQiICIiKQorICAgICAgICAobWF0Y2hfb3BlcmFuZCAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpCisgICAocmV0dXJuKV0KKyAgIlVTRV9SRVRVUk5fSU5TTiAoVFJVRSkgJiYgKFJFR05PKG9wZXJhbmRzWzBdKSA9PSBSRVRWQUxfUkVHTlVNKQorICAgJiYgKFJFR05PKG9wZXJhbmRzWzFdKSAhPSBMUl9SRUdOVU0pCisgICAmJiAoUkVHTk9fUkVHX0NMQVNTKFJFR05PKG9wZXJhbmRzWzFdKSkgPT0gR0VORVJBTF9SRUdTKSIKKyAgInJldGFsICAgICUxIgorICBbKHNldF9hdHRyICJ0eXBlIiAiY2FsbCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjIiKV0KKyAgKQorCisKKyhkZWZpbmVfcGVlcGhvbGUKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAobWF0Y2hfb3BlcmFuZCAxICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKSkKKyAgIChyZXR1cm4pXQorICAiKFVTRV9SRVRVUk5fSU5TTiAoRkFMU0UpICYmIChSRUdOTyhvcGVyYW5kc1swXSkgPT0gUkVUVkFMX1JFR05VTSkgJiYKKyAgICgoSU5UVkFMKG9wZXJhbmRzWzFdKSA9PSAtMSkgfHwgKElOVFZBTChvcGVyYW5kc1sxXSkgPT0gMCkgfHwgKElOVFZBTChvcGVyYW5kc1sxXSkgPT0gMSkpKSIKKyAgeworICAgIGF2cjMyX291dHB1dF9yZXR1cm5faW5zdHJ1Y3Rpb24gKFRSVUUsIEZBTFNFLCBOVUxMLCBvcGVyYW5kc1sxXSk7CisgICAgcmV0dXJuICIiOworICB9CisgIFsoc2V0X2F0dHIgInR5cGUiICJjYWxsIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpXQorICApCisKKyhkZWZpbmVfcGVlcGhvbGUKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAobWF0Y2hfb3BlcmFuZCAxICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKSkKKyAgICh1bnNwZWNfdm9sYXRpbGUgWyhyZXR1cm4pXSBWVU5TUEVDX0VQSUxPR1VFKV0KKyAgIihSRUdOTyhvcGVyYW5kc1swXSkgPT0gUkVUVkFMX1JFR05VTSkgJiYKKyAgICgoSU5UVkFMKG9wZXJhbmRzWzFdKSA9PSAtMSkgfHwgKElOVFZBTChvcGVyYW5kc1sxXSkgPT0gMCkgfHwgKElOVFZBTChvcGVyYW5kc1sxXSkgPT0gMSkpIgorICB7CisgICAgYXZyMzJfb3V0cHV0X3JldHVybl9pbnN0cnVjdGlvbiAoRkFMU0UsIEZBTFNFLCBOVUxMLCBvcGVyYW5kc1sxXSk7CisgICAgcmV0dXJuICIiOworICB9CisgIDsgTGVuZ3RoIGlzIGFic29sdXRlIHdvcnN0IGNhc2UKKyAgWyhzZXRfYXR0ciAidHlwZSIgImJyYW5jaCIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjEyIildCisgICkKKworKGRlZmluZV9wZWVwaG9sZQorICBbKHNldCAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAoaWZfdGhlbl9lbHNlIChtYXRjaF9vcGVyYXRvciAxICJhdnIzMl9jb21wYXJpc29uX29wZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1hdGNoX29wZXJhbmQgNCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgNSAicmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICJyS3MyMSIpXSkKKyAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAyICJhdnIzMl9jb25kX3JlZ2lzdGVyX2ltbWVkaWF0ZV9vcGVyYW5kIiAicktzMDgiKQorICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDMgImF2cjMyX2NvbmRfcmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICJyS3MwOCIpKSkKKyAgIChyZXR1cm4pXQorICAiVVNFX1JFVFVSTl9JTlNOIChUUlVFKSAmJiAoUkVHTk8ob3BlcmFuZHNbMF0pID09IFJFVFZBTF9SRUdOVU0pIgorICB7CisgICBvcGVyYW5kc1sxXSA9IGF2cjMyX291dHB1dF9jbXAob3BlcmFuZHNbMV0sIEdFVF9NT0RFKG9wZXJhbmRzWzRdKSwgb3BlcmFuZHNbNF0sIG9wZXJhbmRzWzVdKTsKKworICAgaWYgKCBHRVRfQ09ERShvcGVyYW5kc1syXSkgPT0gUkVHCisgICAgICAgICYmIEdFVF9DT0RFKG9wZXJhbmRzWzNdKSA9PSBSRUcKKyAgICAgICAgJiYgUkVHTk8ob3BlcmFuZHNbMl0pICE9IExSX1JFR05VTQorICAgICAgICAmJiBSRUdOTyhvcGVyYW5kc1szXSkgIT0gTFJfUkVHTlVNICl7CisgICAgICByZXR1cm4gInJldCUxICAgICUyXDtyZXQlaTEgICAgJTMiOworICAgfSBlbHNlIGlmICggR0VUX0NPREUob3BlcmFuZHNbMl0pID09IFJFRworICAgICAgICAgICAgICAgJiYgR0VUX0NPREUob3BlcmFuZHNbM10pID09IENPTlNUX0lOVCApeworICAgICAgaWYgKCBJTlRWQUwob3BlcmFuZHNbM10pID09IC0xCisgICAgICAgICAgIHx8IElOVFZBTChvcGVyYW5kc1szXSkgPT0gMAorICAgICAgICAgICB8fCBJTlRWQUwob3BlcmFuZHNbM10pID09IDEgKXsKKyAgICAgICAgcmV0dXJuICJyZXQlMSAgICAlMlw7cmV0JWkxICAgICVkMyI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIm1vdiUxICAgIHIxMiwgJTJcO21vdiVpMSAgICByMTIsICUzXDtyZXRhbCAgICByMTIiOworICAgICAgfQorICAgfSBlbHNlIGlmICggR0VUX0NPREUob3BlcmFuZHNbMl0pID09IENPTlNUX0lOVAorICAgICAgICAgICAgICAgJiYgR0VUX0NPREUob3BlcmFuZHNbM10pID09IFJFRyApeworICAgICAgaWYgKCBJTlRWQUwob3BlcmFuZHNbMl0pID09IC0xCisgICAgICAgICAgIHx8IElOVFZBTChvcGVyYW5kc1syXSkgPT0gMAorICAgICAgICAgICB8fCBJTlRWQUwob3BlcmFuZHNbMl0pID09IDEgKXsKKyAgICAgICAgcmV0dXJuICJyZXQlMSAgICAlZDJcO3JldCVpMSAgICAlMyI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIm1vdiUxICAgIHIxMiwgJTJcO21vdiVpMSAgICByMTIsICUzXDtyZXRhbCAgICByMTIiOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGlmICggKElOVFZBTChvcGVyYW5kc1syXSkgPT0gLTEKKyAgICAgICAgICAgIHx8IElOVFZBTChvcGVyYW5kc1syXSkgPT0gMAorICAgICAgICAgICAgfHwgSU5UVkFMKG9wZXJhbmRzWzJdKSA9PSAxICkKKyAgICAgICAgICAgJiYgKElOVFZBTChvcGVyYW5kc1szXSkgPT0gLTEKKyAgICAgICAgICAgICAgIHx8IElOVFZBTChvcGVyYW5kc1szXSkgPT0gMAorICAgICAgICAgICAgICAgfHwgSU5UVkFMKG9wZXJhbmRzWzNdKSA9PSAxICkpeworICAgICAgICByZXR1cm4gInJldCUxICAgICVkMlw7cmV0JWkxICAgICVkMyI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIm1vdiUxICAgIHIxMiwgJTJcO21vdiVpMSAgICByMTIsICUzXDtyZXRhbCAgICByMTIiOworICAgICAgfQorICAgfQorICB9CisKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMTAiKQorICAgKHNldF9hdHRyICJjYyIgIm5vbmUiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiY2FsbCIpXSkKKyAgCisKKworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgbXVsbmhoLncKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChuZWc6SEkgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChtdWx0OlNJCisgICAgICAgICAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX2R1cCAwKSkKKyAgICAgICAgIChzaWduX2V4dGVuZDpTSSAobWF0Y2hfb3BlcmFuZDpISSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikpKSldCisgICIocGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkpIHx8IChSRUdOTyhvcGVyYW5kc1syXSkgPT0gUkVHTk8ob3BlcmFuZHNbMF0pKSIKKyAgWyAoc2V0IChtYXRjaF9kdXAgMikKKyAgICAgICAgIChtdWx0OlNJCisgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChuZWc6SEkgKG1hdGNoX2R1cCAxKSkpCisgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9kdXAgMykpKSldCisgICIiCisgICkKKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChuZWc6SEkgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgIChtdWx0OlNJCisgICAgICAgICAoc2lnbl9leHRlbmQ6U0kgKG1hdGNoX29wZXJhbmQ6SEkgMyAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKQorICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9kdXAgMCkpKSldCisgICIocGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkpIHx8IChSRUdOTyhvcGVyYW5kc1syXSkgPT0gUkVHTk8ob3BlcmFuZHNbMF0pKSIKKyAgWyAoc2V0IChtYXRjaF9kdXAgMikKKyAgICAgICAgIChtdWx0OlNJCisgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChuZWc6SEkgKG1hdGNoX2R1cCAxKSkpCisgICAgICAgICAgKHNpZ25fZXh0ZW5kOlNJIChtYXRjaF9kdXAgMykpKSldCisgICIiCisgICkKKworCisKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IFZlY3RvciBzZXQgYW5kIGV4dHJhY3Qgb3BlcmF0aW9ucworOzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKGRlZmluZV9pbnNuICJ2ZWNfc2V0djJoaV9oaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VjJISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorICAgICAgICAodmVjX21lcmdlOlYySEkKKyAgICAgICAgIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICh2ZWNfZHVwbGljYXRlOlYySEkKKyAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKQorICAgICAgICAgKGNvbnN0X2ludCAxKSkpXQorICAiIgorICAiYmZpbnNcdCUwLCAlMSwgMTYsIDE2IgorICBbKHNldF9hdHRyICJ0eXBlIiAiYWx1IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXSkKKworKGRlZmluZV9pbnNuICJ2ZWNfc2V0djJoaV9sbyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VjJISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiK3IiKQorICAgICAgICAodmVjX21lcmdlOlYySEkKKyAgICAgICAgIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICh2ZWNfZHVwbGljYXRlOlYySEkKKyAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKQorICAgICAgICAgKGNvbnN0X2ludCAyKSkpXQorICAiIgorICAiYmZpbnNcdCUwLCAlMSwgMCwgMTYiCisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHUiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildKQorCisoZGVmaW5lX2V4cGFuZCAidmVjX3NldHYyaGkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlYySEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisgICAgICAgICh2ZWNfbWVyZ2U6VjJISQorICAgICAgICAgKG1hdGNoX2R1cCAwKQorICAgICAgICAgKHZlY19kdXBsaWNhdGU6VjJISQorICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIiKSkKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKV0KKyAgIiIKKyAgeyBvcGVyYW5kc1syXSA9IEdFTl9JTlQoSU5UVkFMKG9wZXJhbmRzWzJdKSArIDEpOyB9CisgICkKKworKGRlZmluZV9pbnNuICJ2ZWNfZXh0cmFjdHYyaGkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICh2ZWNfc2VsZWN0OkhJCisgICAgICAgICAobWF0Y2hfb3BlcmFuZDpWMkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgIChwYXJhbGxlbCBbKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJpIildKSkpXQorICAiIgorICB7CisgICBpZiAoIElOVFZBTChvcGVyYW5kc1syXSkgPT0gMCApCisgICAgICByZXR1cm4gImJmZXh0dVx0JTAsICUxLCAxNiwgMTYiOworICAgZWxzZQorICAgICAgcmV0dXJuICJiZmV4dHVcdCUwLCAlMSwgMCwgMTYiOworICB9CisgIFsoc2V0X2F0dHIgInR5cGUiICJhbHUiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAiY2MiICJjbG9iYmVyIildKQorCisoZGVmaW5lX2luc24gInZlY19leHRyYWN0djRxaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UUkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKyAgICAgICAgKHZlY19zZWxlY3Q6UUkKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kOlY0UUkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgKHBhcmFsbGVsIFsobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKV0pKSldCisgICIiCisgIHsKKyAgIHN3aXRjaCAoIElOVFZBTChvcGVyYW5kc1syXSkgKXsKKyAgICAgY2FzZSAwOgorICAgICAgIHJldHVybiAiYmZleHR1XHQlMCwgJTEsIDI0LCA4IjsKKyAgICAgY2FzZSAxOgorICAgICAgIHJldHVybiAiYmZleHR1XHQlMCwgJTEsIDE2LCA4IjsKKyAgICAgY2FzZSAyOgorICAgICAgIHJldHVybiAiYmZleHR1XHQlMCwgJTEsIDgsIDgiOworICAgICBjYXNlIDM6CisgICAgICAgcmV0dXJuICJiZmV4dHVcdCUwLCAlMSwgMCwgOCI7CisgICAgIGRlZmF1bHQ6CisgICAgICAgYWJvcnQoKTsKKyAgIH0KKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAiYWx1IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXSkKKworCisoZGVmaW5lX2luc24gImNvbmNhdHYyaGkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlYySEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLCByLCByIikKKyAgICAgICAgKHZlY19jb25jYXQ6VjJISQorICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIsIHIsIDAiKQorICAgICAgICAgKG1hdGNoX29wZXJhbmQ6SEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIsIDAsIHIiKSkpXQorICAiIgorICAiQAorICAgbW92XHQlMCwgJTFcO2JmaW5zXHQlMCwgJTIsIDAsIDE2CisgICBiZmluc1x0JTAsICUyLCAwLCAxNgorICAgYmZpbnNcdCUwLCAlMSwgMTYsIDE2IgorICBbKHNldF9hdHRyICJsZW5ndGgiICI2LCA0LCA0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSIpXSkKKworCis7OyBMb2FkIHRoZSBhdG9taWMgb3BlcmF0aW9uIGRlc2NyaXB0aW9uCisoaW5jbHVkZSAic3luYy5tZCIpCisKKzs7IExvYWQgdGhlIFNJTUQgZGVzY3JpcHRpb24KKyhpbmNsdWRlICJzaW1kLm1kIikKKworOzsgTG9hZCB0aGUgRlAgY29wckFvY2Vzc29yIHBhdHRlcm5zCisoaW5jbHVkZSAiZnBjcC5tZCIpCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9hdnIzMi9hdnIzMi1tb2Rlcy5kZWYKQEAgLTAsMCArMSBAQAorVkVDVE9SX01PREVTIChJTlQsIDQpOyAgICAgICAgLyogICAgICAgICAgICBWNFFJIFYySEkgKi8KLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL2F2cjMyLm9wdApAQCAtMCwwICsxLDg2IEBACis7IE9wdGlvbnMgZm9yIHRoZSBBVE1FTCBBVlIzMiBwb3J0IG9mIHRoZSBjb21waWxlci4KKworOyBDb3B5cmlnaHQgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbi4KKzsKKzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorOworOyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorOyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorOyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorOyB2ZXJzaW9uLgorOworOyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCis7IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCis7IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorOyBmb3IgbW9yZSBkZXRhaWxzLgorOworOyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorOyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCis7IFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKzsgMDIxMTAtMTMwMSwgVVNBLgorCittdXNlLXJvZGF0YS1zZWN0aW9uCitUYXJnZXQgUmVwb3J0IE1hc2soVVNFX1JPREFUQV9TRUNUSU9OKQorVXNlIHNlY3Rpb24gLnJvZGF0YSBmb3IgcmVhZC1vbmx5IGRhdGEgaW5zdGVhZCBvZiAudGV4dC4KKworbWhhcmQtZmxvYXQKK1RhcmdldCBSZXBvcnQgVW5kb2N1bWVudGVkIE1hc2soSEFSRF9GTE9BVCkKK1VzZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCisKK21zb2Z0LWZsb2F0CitUYXJnZXQgUmVwb3J0IFVuZG9jdW1lbnRlZCBJbnZlcnNlTWFzayhIQVJEX0ZMT0FULCBTT0ZUX0ZMT0FUKQorVXNlIHNvZnR3YXJlIGZsb2F0aW5nLXBvaW50IGxpYnJhcnkgZm9yIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMuCisKK21mb3JjZS1kb3VibGUtYWxpZ24KK1RhcmdldCBSZXBvcnQgUmVqZWN0TmVnYXRpdmUgTWFzayhGT1JDRV9ET1VCTEVfQUxJR04pCitGb3JjZSBkb3VibGUtd29yZCBhbGlnbm1lbnQgZm9yIGRvdWJsZS13b3JkIG1lbW9yeSBhY2Nlc3Nlcy4KKworbW5vLWluaXQtZ290CitUYXJnZXQgUmVwb3J0IFJlamVjdE5lZ2F0aXZlIE1hc2soTk9fSU5JVF9HT1QpCitEbyBub3QgaW5pdGlhbGl6ZSBHT1QgcmVnaXN0ZXIgYmVmb3JlIHVzaW5nIGl0IHdoZW4gY29tcGlsaW5nIFBJQyBjb2RlLgorCittcmVsYXgKK1RhcmdldCBSZXBvcnQgTWFzayhSRUxBWCkKK0xldCBpbnZva2VkIGFzc2VtYmxlciBhbmQgbGlua2VyIGRvIHJlbGF4aW5nIChFbmFibGVkIGJ5IGRlZmF1bHQgd2hlbiBvcHRpbWl6YXRpb24gbGV2ZWwgaXMgPjEpLgorCittbWQtcmVvcmctb3B0CitUYXJnZXQgUmVwb3J0IFVuZG9jdW1lbnRlZCBNYXNrKE1EX1JFT1JHX09QVElNSVpBVElPTikKK1BlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgb3B0aW1pemF0aW9ucyBpbiByZW9yZyBzdGFnZS4KKworbWFzbS1hZGRyLXBzZXVkb3MKK1RhcmdldCBSZXBvcnQgTWFzayhIQVNfQVNNX0FERFJfUFNFVURPUykgCitVc2UgYXNzZW1ibGVyIHBzZXVkby1pbnN0cnVjdGlvbnMgbGRhLncgYW5kIGNhbGwgZm9yIGhhbmRsaW5nIGRpcmVjdCBhZGRyZXNzZXMuIChFbmFibGVkIGJ5IGRlZmF1bHQpCisKK21wYXJ0PQorVGFyZ2V0IFJlcG9ydCBSZWplY3ROZWdhdGl2ZSBKb2luZWQgVmFyKGF2cjMyX3BhcnRfbmFtZSkKK1NwZWNpZnkgdGhlIEFWUjMyIHBhcnQgbmFtZQorCittY3B1PQorVGFyZ2V0IFJlcG9ydCBSZWplY3ROZWdhdGl2ZSBKb2luZWQgVW5kb2N1bWVudGVkIFZhcihhdnIzMl9wYXJ0X25hbWUpCitTcGVjaWZ5IHRoZSBBVlIzMiBwYXJ0IG5hbWUgKGRlcHJlY2F0ZWQpCisKK21hcmNoPQorVGFyZ2V0IFJlcG9ydCBSZWplY3ROZWdhdGl2ZSBKb2luZWQgVmFyKGF2cjMyX2FyY2hfbmFtZSkKK1NwZWNpZnkgdGhlIEFWUjMyIGFyY2hpdGVjdHVyZSBuYW1lCisKK21mYXN0LWZsb2F0CitUYXJnZXQgUmVwb3J0IE1hc2soRkFTVF9GTE9BVCkKK0VuYWJsZSBmYXN0IGZsb2F0aW5nLXBvaW50IGxpYnJhcnkuIEVuYWJsZWQgYnkgZGVmYXVsdCBpZiB0aGUgLWZ1bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIHN3aXRjaCBpcyBzcGVjaWZpZWQuCisKK21pbW0taW4tY29uc3QtcG9vbAorVGFyZ2V0IFJlcG9ydCBWYXIoYXZyMzJfaW1tX2luX2NvbnN0X3Bvb2wpIEluaXQoLTEpCitQdXQgbGFyZ2UgaW1tZWRpYXRlcyBpbiBjb25zdGFudCBwb29sLiBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgYXJjaHMgd2l0aCBpbnNuLWNhY2hlLgorCittbm8tcGljCitUYXJnZXQgUmVwb3J0IFJlamVjdE5lZ2F0aXZlIE1hc2soTk9fUElDKQorRG8gbm90IGdlbmVyYXRlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUuIChkZXByZWNhdGVkLCB1c2UgLWZuby1waWMgaW5zdGVhZCkKKworbWNvbmQtZXhlYy1iZWZvcmUtcmVsb2FkCitUYXJnZXQgUmVwb3J0IFVuZG9jdW1lbnRlZCBNYXNrKENPTkRfRVhFQ19CRUZPUkVfUkVMT0FEKSAKK0VuYWJsZSBleHBlcmltZW50YWwgY29uZGl0aW9uYWwgZXhlY3V0aW9uIHByZXBhcmF0aW9uIGJlZm9yZSB0aGUgcmVsb2FkIHN0YWdlLiAKKworbXJtdy1hZGRyZXNzYWJsZS1kYXRhCitUYXJnZXQgUmVwb3J0IE1hc2soUk1XX0FERFJFU1NBQkxFX0RBVEEpCitTaWduYWwgdGhhdCBhbGwgZGF0YSBpcyBpbiByYW5nZSBmb3IgdGhlIEF0b21pYyBSZWFkLU1vZGlmeS1Xcml0ZSBtZW1vcnkgaW5zdHJ1Y3Rpb25zLCBhbmQgdGhhdAorZ2NjIGNhbiBzYWZlbHkgZ2VuZXJhdGUgdGhlc2Ugd2hlbmV2ZXIgcG9zc2libGUuIAorCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9hdnIzMi9hdnIzMi1wcm90b3MuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAgIFByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGF2cjMyLmMKKyAgIENvcHlyaWdodCAyMDAzLTIwMDYgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+CisgICBJbml0aWFsIHBvcnRpbmcgYnkgQW5kZXJzIO+/vWRsYW5kLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworCisjaWZuZGVmIEFWUjMyX1BST1RPU19ICisjZGVmaW5lIEFWUjMyX1BST1RPU19ICisKK2V4dGVybiBjb25zdCBpbnQgc3dhcF9yZWdbXTsKKworZXh0ZXJuIGludCBhdnIzMl92YWxpZF9tYWNtYWNfYnlwYXNzIChydHgsIHJ0eCk7CitleHRlcm4gaW50IGF2cjMyX3ZhbGlkX211bG1hY19ieXBhc3MgKHJ0eCwgcnR4KTsKKworZXh0ZXJuIGludCBhdnIzMl9kZWNvZGVfbGNvbW1fc3ltYm9sX29mZnNldCAocnR4LCBpbnQgKik7CitleHRlcm4gdm9pZCBhdnIzMl9lbmNvZGVfbGNvbW1fc3ltYm9sX29mZnNldCAodHJlZSwgY2hhciAqLCBpbnQpOworCitleHRlcm4gY29uc3QgY2hhciAqYXZyMzJfc3RyaXBfbmFtZV9lbmNvZGluZyAoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIHJ0eCBhdnIzMl9nZXRfbm90ZV9yZWdfZXF1aXYgKHJ0eCBpbnNuKTsKKworZXh0ZXJuIGludCBhdnIzMl91c2VfcmV0dXJuX2luc24gKGludCBpc2NvbmQpOworCitleHRlcm4gdm9pZCBhdnIzMl9tYWtlX3JlZ2xpc3QxNiAoaW50IHJlZ2xpc3QxNl92ZWN0LCBjaGFyICpyZWdsaXN0MTZfc3RyaW5nKTsKKworZXh0ZXJuIHZvaWQgYXZyMzJfbWFrZV9yZWdsaXN0OCAoaW50IHJlZ2xpc3Q4X3ZlY3QsIGNoYXIgKnJlZ2xpc3Q4X3N0cmluZyk7CitleHRlcm4gdm9pZCBhdnIzMl9tYWtlX2ZwX3JlZ2xpc3RfdyAoaW50IHJlZ2xpc3RfbWFzaywgY2hhciAqcmVnbGlzdF9zdHJpbmcpOworZXh0ZXJuIHZvaWQgYXZyMzJfbWFrZV9mcF9yZWdsaXN0X2QgKGludCByZWdsaXN0X21hc2ssIGNoYXIgKnJlZ2xpc3Rfc3RyaW5nKTsKKworZXh0ZXJuIHZvaWQgYXZyMzJfb3V0cHV0X3JldHVybl9pbnN0cnVjdGlvbiAoaW50IHNpbmdsZV9yZXRfaW5zdCwKKwkJCQkJICAgICBpbnQgaXNjb25kLCBydHggY29uZCwKKwkJCQkJICAgICBydHggcjEyX2ltbSk7CitleHRlcm4gdm9pZCBhdnIzMl9leHBhbmRfcHJvbG9ndWUgKHZvaWQpOworZXh0ZXJuIHZvaWQgYXZyMzJfc2V0X3JldHVybl9hZGRyZXNzIChydHggc291cmNlLCBydHggc2NyYXRjaCk7CisKK2V4dGVybiBpbnQgYXZyMzJfaGFyZF9yZWdub19tb2RlX29rIChpbnQgcmVnbm8sIGVudW0gbWFjaGluZV9tb2RlIG1vZGUpOworZXh0ZXJuIGludCBhdnIzMl9leHRyYV9jb25zdHJhaW50X3MgKHJ0eCB2YWx1ZSwgY29uc3QgaW50IHN0cmljdCk7CitleHRlcm4gaW50IGF2cjMyX2VoX3JldHVybl9kYXRhX3JlZ25vIChjb25zdCBpbnQgbik7CitleHRlcm4gaW50IGF2cjMyX2luaXRpYWxfZWxpbWluYXRpb25fb2Zmc2V0IChjb25zdCBpbnQgZnJvbSwgY29uc3QgaW50IHRvKTsKK2V4dGVybiBydHggYXZyMzJfZnVuY3Rpb25fYXJnIChDVU1VTEFUSVZFX0FSR1MgKiBjdW0sIGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisJCQkgICAgICAgdHJlZSB0eXBlLCBpbnQgbmFtZWQpOworZXh0ZXJuIHZvaWQgYXZyMzJfaW5pdF9jdW11bGF0aXZlX2FyZ3MgKENVTVVMQVRJVkVfQVJHUyAqIGN1bSwgdHJlZSBmbnR5cGUsCisJCQkJCXJ0eCBsaWJuYW1lLCB0cmVlIGZuZGVjbCk7CitleHRlcm4gdm9pZCBhdnIzMl9mdW5jdGlvbl9hcmdfYWR2YW5jZSAoQ1VNVUxBVElWRV9BUkdTICogY3VtLAorCQkJCQllbnVtIG1hY2hpbmVfbW9kZSBtb2RlLAorCQkJCQl0cmVlIHR5cGUsIGludCBuYW1lZCk7CisjaWZkZWYgQVJHU19TSVpFX1JUWAorLyogZXhwci5oIGRlZmluZXMgQVJHU19TSVpFX1JUWCBhbmQgYGVudW0gZGlyZWN0aW9uJy4gICovCitleHRlcm4gZW51bSBkaXJlY3Rpb24gYXZyMzJfZnVuY3Rpb25fYXJnX3BhZGRpbmcgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisJCQkJCQkgIHRyZWUgdHlwZSk7CisjZW5kaWYgLyogQVJHU19TSVpFX1JUWCAqLworZXh0ZXJuIHJ0eCBhdnIzMl9mdW5jdGlvbl92YWx1ZSAodHJlZSB2YWx0eXBlLCB0cmVlIGZ1bmMsIGJvb2wgb3V0Z29pbmcpOworZXh0ZXJuIHJ0eCBhdnIzMl9saWJjYWxsX3ZhbHVlIChlbnVtIG1hY2hpbmVfbW9kZSBtb2RlKTsKK2V4dGVybiBpbnQgYXZyMzJfc2NoZWRfdXNlX2RmYV9waXBlbGluZV9pbnRlcmZhY2UgKHZvaWQpOworZXh0ZXJuIGJvb2wgYXZyMzJfcmV0dXJuX2luX21lbW9yeSAodHJlZSB0eXBlLCB0cmVlIGZudHlwZSk7CitleHRlcm4gdm9pZCBhdnIzMl9yZWdzX3RvX3NhdmUgKGNoYXIgKm9wZXJhbmQpOworZXh0ZXJuIHZvaWQgYXZyMzJfdGFyZ2V0X2FzbV9mdW5jdGlvbl9wcm9sb2d1ZSAoRklMRSAqIGZpbGUsCisJCQkJCQlIT1NUX1dJREVfSU5UIHNpemUpOworZXh0ZXJuIHZvaWQgYXZyMzJfdGFyZ2V0X2FzbV9mdW5jdGlvbl9lcGlsb2d1ZSAoRklMRSAqIGZpbGUsCisJCQkJCQlIT1NUX1dJREVfSU5UIHNpemUpOworZXh0ZXJuIHZvaWQgYXZyMzJfdHJhbXBvbGluZV90ZW1wbGF0ZSAoRklMRSAqIGZpbGUpOworZXh0ZXJuIHZvaWQgYXZyMzJfaW5pdGlhbGl6ZV90cmFtcG9saW5lIChydHggYWRkciwgcnR4IGZuYWRkciwKKwkJCQkJIHJ0eCBzdGF0aWNfY2hhaW4pOworZXh0ZXJuIGludCBhdnIzMl9sZWdpdGltYXRlX2FkZHJlc3MgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB4LAorCQkJCSAgICAgaW50IHN0cmljdCk7CitleHRlcm4gaW50IGF2cjMyX2xlZ2l0aW1hdGVfY29uc3RhbnRfcCAocnR4IHgpOworCitleHRlcm4gaW50IGF2cjMyX2xlZ2l0aW1hdGVfcGljX29wZXJhbmRfcCAocnR4IHgpOworCitleHRlcm4gcnR4IGF2cjMyX2ZpbmRfc3ltYm9sIChydHggeCk7CitleHRlcm4gdm9pZCBhdnIzMl9zZWxlY3Rfc2VjdGlvbiAocnR4IGV4cCwgaW50IHJlbG9jLCBpbnQgYWxpZ24pOworZXh0ZXJuIHZvaWQgYXZyMzJfZW5jb2RlX3NlY3Rpb25faW5mbyAodHJlZSBkZWNsLCBydHggcnRsLCBpbnQgZmlyc3QpOworZXh0ZXJuIHZvaWQgYXZyMzJfYXNtX2ZpbGVfZW5kIChGSUxFICogc3RyZWFtKTsKK2V4dGVybiB2b2lkIGF2cjMyX2FzbV9vdXRwdXRfYXNjaWkgKEZJTEUgKiBzdHJlYW0sIGNoYXIgKnB0ciwgaW50IGxlbik7CitleHRlcm4gdm9pZCBhdnIzMl9hc21fb3V0cHV0X2NvbW1vbiAoRklMRSAqIHN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgIGludCBzaXplLCBpbnQgcm91bmRlZCk7CitleHRlcm4gdm9pZCBhdnIzMl9hc21fb3V0cHV0X2xhYmVsIChGSUxFICogc3RyZWFtLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGF2cjMyX2FzbV9kZWNsYXJlX29iamVjdF9uYW1lIChGSUxFICogc3RyZWFtLCBjaGFyICpuYW1lLAorCQkJCQkgICB0cmVlIGRlY2wpOworZXh0ZXJuIHZvaWQgYXZyMzJfYXNtX2dsb2JhbGl6ZV9sYWJlbCAoRklMRSAqIHN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBhdnIzMl9hc21fd2Vha2VuX2xhYmVsIChGSUxFICogc3RyZWFtLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGF2cjMyX2FzbV9vdXRwdXRfZXh0ZXJuYWwgKEZJTEUgKiBzdHJlYW0sIHRyZWUgZGVjbCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBhdnIzMl9hc21fb3V0cHV0X2V4dGVybmFsX2xpYmNhbGwgKEZJTEUgKiBzdHJlYW0sIHJ0eCBzeW1yZWYpOworZXh0ZXJuIHZvaWQgYXZyMzJfYXNtX291dHB1dF9sYWJlbHJlZiAoRklMRSAqIHN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBhdnIzMl9ub3RpY2VfdXBkYXRlX2NjIChydHggZXhwLCBydHggaW5zbik7CitleHRlcm4gdm9pZCBhdnIzMl9wcmludF9vcGVyYW5kIChGSUxFICogc3RyZWFtLCBydHggeCwgaW50IGNvZGUpOworZXh0ZXJuIHZvaWQgYXZyMzJfcHJpbnRfb3BlcmFuZF9hZGRyZXNzIChGSUxFICogc3RyZWFtLCBydHggeCk7CisKK2V4dGVybiBpbnQgYXZyMzJfc3ltYm9sIChydHggeCk7CisKK2V4dGVybiB2b2lkIGF2cjMyX3NlbGVjdF9ydHhfc2VjdGlvbiAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSwgcnR4IHgsCisJCQkJICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBhbGlnbik7CisKK2V4dGVybiBpbnQgYXZyMzJfbG9hZF9tdWx0aXBsZV9vcGVyYXRpb24gKHJ0eCBvcCwgZW51bSBtYWNoaW5lX21vZGUgbW9kZSk7CitleHRlcm4gaW50IGF2cjMyX3N0b3JlX211bHRpcGxlX29wZXJhdGlvbiAocnR4IG9wLCBlbnVtIG1hY2hpbmVfbW9kZSBtb2RlKTsKKworZXh0ZXJuIGludCBhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wIChIT1NUX1dJREVfSU5UIHZhbHVlLCBjaGFyIGMsCisJCQkJCSAgICBjb25zdCBjaGFyICpzdHIpOworCitleHRlcm4gYm9vbCBhdnIzMl9jYW5ub3RfZm9yY2VfY29uc3RfbWVtIChydHggeCk7CisKK2V4dGVybiB2b2lkIGF2cjMyX2luaXRfYnVpbHRpbnMgKHZvaWQpOworCitleHRlcm4gcnR4IGF2cjMyX2V4cGFuZF9idWlsdGluICh0cmVlIGV4cCwgcnR4IHRhcmdldCwgcnR4IHN1YnRhcmdldCwKKwkJCQkgZW51bSBtYWNoaW5lX21vZGUgbW9kZSwgaW50IGlnbm9yZSk7CisKK2V4dGVybiBib29sIGF2cjMyX211c3RfcGFzc19pbl9zdGFjayAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSwgdHJlZSB0eXBlKTsKKworZXh0ZXJuIGJvb2wgYXZyMzJfc3RyaWN0X2FyZ3VtZW50X25hbWluZyAoQ1VNVUxBVElWRV9BUkdTICogY2EpOworCitleHRlcm4gYm9vbCBhdnIzMl9wYXNzX2J5X3JlZmVyZW5jZSAoQ1VNVUxBVElWRV9BUkdTICogY3VtLAorCQkJCSAgICAgZW51bSBtYWNoaW5lX21vZGUgbW9kZSwKKwkJCQkgICAgIHRyZWUgdHlwZSwgYm9vbCBuYW1lZCk7CisKK2V4dGVybiBydHggYXZyMzJfZ2VuX2xvYWRfbXVsdGlwbGUgKHJ0eCAqIHJlZ3MsIGludCBjb3VudCwgcnR4IGZyb20sCisJCQkJICAgIGludCB3cml0ZV9iYWNrLCBpbnQgaW5fc3RydWN0X3AsCisJCQkJICAgIGludCBzY2FsYXJfcCk7CitleHRlcm4gcnR4IGF2cjMyX2dlbl9zdG9yZV9tdWx0aXBsZSAocnR4ICogcmVncywgaW50IGNvdW50LCBydHggdG8sCisJCQkJICAgICBpbnQgaW5fc3RydWN0X3AsIGludCBzY2FsYXJfcCk7CitleHRlcm4gaW50IGF2cjMyX2dlbl9tb3ZtZW1zaSAocnR4ICogb3BlcmFuZHMpOworCitleHRlcm4gaW50IGF2cjMyX3JuZF9vcGVyYW5kcyAocnR4IGFkZCwgcnR4IHNoaWZ0KTsKK2V4dGVybiBpbnQgYXZyMzJfYWRqdXN0X2luc25fbGVuZ3RoIChydHggaW5zbiwgaW50IGxlbmd0aCk7CisKK2V4dGVybiBpbnQgc3ltYm9sX21lbnRpb25lZF9wIChydHggeCk7CitleHRlcm4gaW50IGxhYmVsX21lbnRpb25lZF9wIChydHggeCk7CitleHRlcm4gcnR4IGxlZ2l0aW1pemVfcGljX2FkZHJlc3MgKHJ0eCBvcmlnLCBlbnVtIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggcmVnKTsKK2V4dGVybiBpbnQgYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAocnR4IHgsIGludCBzdHJpY3RfcCk7CitleHRlcm4gaW50IGF2cjMyX2xlZ2l0aW1hdGVfaW5kZXhfcCAoZW51bSBtYWNoaW5lX21vZGUgbW9kZSwgcnR4IGluZGV4LAorCQkJCSAgICAgaW50IHN0cmljdF9wKTsKKworZXh0ZXJuIGludCBhdnIzMl9jb25zdF9kb3VibGVfaW1tZWRpYXRlIChydHggdmFsdWUpOworZXh0ZXJuIHZvaWQgYXZyMzJfaW5pdF9leHBhbmRlcnMgKHZvaWQpOworZXh0ZXJuIHJ0eCBhdnIzMl9yZXR1cm5fYWRkciAoaW50IGNvdW50LCBydHggZnJhbWUpOworZXh0ZXJuIGJvb2wgYXZyMzJfZ290X21lbnRpb25lZF9wIChydHggYWRkcik7CisKK2V4dGVybiB2b2lkIGF2cjMyX2ZpbmFsX3ByZXNjYW5faW5zbiAocnR4IGluc24sIHJ0eCAqIG9wdmVjLCBpbnQgbm9wZXJhbmRzKTsKKworZXh0ZXJuIGludCBhdnIzMl9leHBhbmRfbW92Y2MgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsIHJ0eCBvcGVyYW5kc1tdKTsKK2V4dGVybiBpbnQgYXZyMzJfZXhwYW5kX2FkZGNjIChlbnVtIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggb3BlcmFuZHNbXSk7CisjaWZkZWYgUlRYX0NPREUKK2V4dGVybiBpbnQgYXZyMzJfZXhwYW5kX3NjYyAoUlRYX0NPREUgY29uZCwgcnR4ICogb3BlcmFuZHMpOworI2VuZGlmCisKK2V4dGVybiBpbnQgYXZyMzJfc3RvcmVfYnlwYXNzIChydHggaW5zbl9vdXQsIHJ0eCBpbnNuX2luKTsKK2V4dGVybiBpbnQgYXZyMzJfbXVsX3dhd19ieXBhc3MgKHJ0eCBpbnNuX291dCwgcnR4IGluc25faW4pOworZXh0ZXJuIGludCBhdnIzMl92YWxpZF9sb2FkX2RvdWJsZV9ieXBhc3MgKHJ0eCBpbnNuX291dCwgcnR4IGluc25faW4pOworZXh0ZXJuIGludCBhdnIzMl92YWxpZF9sb2FkX3F1YWRfYnlwYXNzIChydHggaW5zbl9vdXQsIHJ0eCBpbnNuX2luKTsKK2V4dGVybiBydHggYXZyMzJfb3V0cHV0X2NtcCAocnR4IGNvbmQsIGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisJCQkgICAgIHJ0eCBvcDAsIHJ0eCBvcDEpOworCitydHggZ2V0X25leHRfaW5zbl9jb25kIChydHggY3VyX2luc24pOworaW50IHNldF9uZXh0X2luc25fY29uZCAocnR4IGN1cl9pbnNuLCBydHggY29uZCk7Cit2b2lkIGF2cjMyX292ZXJyaWRlX29wdGlvbnMgKHZvaWQpOwordm9pZCBhdnIzMl9sb2FkX3BpY19yZWdpc3RlciAodm9pZCk7CisjaWZkZWYgR0NDX0JBU0lDX0JMT0NLX0gKK3J0eCBhdnIzMl9pZmN2dF9tb2RpZnlfaW5zbiAoY2VfaWZfYmxvY2tfdCAqY2VfaW5mbywgcnR4IHBhdHRlcm4sIHJ0eCBpbnNuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fdHJ1ZV9jaGFuZ2VzKTsKK3J0eCBhdnIzMl9pZmN2dF9tb2RpZnlfdGVzdCAoY2VfaWZfYmxvY2tfdCAqY2VfaW5mbywgcnR4IHRlc3QgKTsKK3ZvaWQgYXZyMzJfaWZjdnRfbW9kaWZ5X2NhbmNlbCAoIGNlX2lmX2Jsb2NrX3QgKmNlX2luZm8sIGludCAqbnVtX3RydWVfY2hhbmdlcyk7CisjZW5kaWYKK3ZvaWQgYXZyMzJfb3B0aW1pemF0aW9uX29wdGlvbnMgKGludCBsZXZlbCwgaW50IHNpemUpOworaW50IGF2cjMyX2NvbnN0X29rX2Zvcl9tb3ZlIChIT1NUX1dJREVfSU5UIGMpOworCit2b2lkIGF2cjMyX3NwbGl0X2NvbnN0X2V4cHIgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbWFjaGluZV9tb2RlIG5ld19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHggZXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eCAqc3BsaXRfZXhwcik7Cit2b2lkIGF2cjMyX2dldF9pbnR2YWwgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHJ0eCBjb25zdF9leHByLCAKKyAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9XSURFX0lOVCAqdmFsKTsKKworaW50IGF2cjMyX2NvbmRfaW1tX2Nsb2JiZXJfc3BsaXR0YWJsZSAocnR4IGluc24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnR4IG9wZXJhbmRzW10pOworCisKKyNlbmRpZiAvKiBBVlIzMl9QUk9UT1NfSCAqLwotLS0gL2Rldi9udWxsCisrKyBiL2djYy9jb25maWcvYXZyMzIvY3J0aS5hc20KQEAgLTAsMCArMSw2NCBAQAorLyoKKyAgIEluaXQvZmluaSBzdHVmZiBmb3IgQVZSMzIuCisgICBDb3B5cmlnaHQgMjAwMy0yMDA2IEF0bWVsIENvcnBvcmF0aW9uLgorCisgICBXcml0dGVuIGJ5IFJvbm55IFBlZGVyc2VuLCBBdG1lbCBOb3J3YXksIDxycGVkZXJzZW5AYXRtZWwuY29tPgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworCQorLyogVGhlIGNvZGUgaW4gc2VjdGlvbnMgLmluaXQgYW5kIC5maW5pIGlzIHN1cHBvc2VkIHRvIGJlIGEgc2luZ2xlCisgICByZWd1bGFyIGZ1bmN0aW9uLiAgVGhlIGZ1bmN0aW9uIGluIC5pbml0IGlzIGNhbGxlZCBkaXJlY3RseSBmcm9tCisgICBzdGFydCBpbiBjcnQxLmFzbS4gIFRoZSBmdW5jdGlvbiBpbiAuZmluaSBpcyBhdGV4aXQoKWVkIGluIGNydDEuYXNtCisgICB0b28uCisKKyAgIGNydGkuYXNtIGNvbnRyaWJ1dGVzIHRoZSBwcm9sb2d1ZSBvZiBhIGZ1bmN0aW9uIHRvIHRoZXNlIHNlY3Rpb25zLAorICAgYW5kIGNydG4uYXNtIGNvbWVzIHVwIHRoZSBlcGlsb2d1ZS4gIFNUQVJURklMRV9TUEVDIHNob3VsZCBsaXN0CisgICBjcnRpLm8gYmVmb3JlIGFueSBvdGhlciBvYmplY3QgZmlsZXMgdGhhdCBtaWdodCBhZGQgY29kZSB0byAuaW5pdAorICAgb3IgLmZpbmkgc2VjdGlvbnMsIGFuZCBFTkRGSUxFX1NQRUMgc2hvdWxkIGxpc3QgY3J0bi5vIGFmdGVyIGFueQorICAgc3VjaCBvYmplY3QgZmlsZXMuICAqLworCQkKKwkuZmlsZQkJImNydGkuYXNtIgorCisJLnNlY3Rpb24JIi5pbml0IgorLyogSnVzdCBsb2FkIHRoZSBHT1QgKi8KKwkuYWxpZ24gMgorCS5nbG9iYWwJX2luaXQKK19pbml0OgorCXN0bQktLXNwLCByNiwgbHIKKwlsZGRwYwlyNiwgMWYJCQorMDoJCisJcnN1YglyNiwgcGMKKwlyam1wCTJmCisJLmFsaWduCTIKKzE6CS5sb25nCTBiIC0gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCQkKKzI6CQorCQkJCQorCS5zZWN0aW9uCSIuZmluaSIKKy8qIEp1c3QgbG9hZCB0aGUgR09UICovCisJLmFsaWduCTIKKwkuZ2xvYmFsCV9maW5pCitfZmluaToKKwlzdG0JLS1zcCwgcjYsIGxyCisJbGRkcGMJcjYsIDFmCQkKKzA6CQorCXJzdWIJcjYsIHBjCisJcmptcAkyZgorCS5hbGlnbgkyCisxOgkubG9uZwkwYiAtIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwkJCisyOgkKKwotLS0gL2Rldi9udWxsCisrKyBiL2djYy9jb25maWcvYXZyMzIvY3J0bi5hc20KQEAgLTAsMCArMSw0NCBAQAorLyogICBDb3B5cmlnaHQgKEMpIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgV3JpdHRlbiBCeSBOaWNrIENsaWZ0b24KKworICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICBsYXRlciB2ZXJzaW9uLgorCisgIEluIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCisgIGNvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIHdpdGggb3RoZXIgcHJvZ3JhbXMsIGFuZCB0byBkaXN0cmlidXRlCisgIHRob3NlIHByb2dyYW1zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcworICBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucyBkbyBhcHBseSBpbiBvdGhlcgorICByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBmaWxlLCBhbmQKKyAgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGFub3RoZXIgcHJvZ3JhbS4pCisKKyAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKKyAgICAgY29tcGlsZWQgd2l0aCBHQ0MgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCisgICAgIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAgICAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQorICAgICB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorKi8KKworCisKKwkKKwkuZmlsZQkJImNydG4uYXNtIgorCisJLnNlY3Rpb24JIi5pbml0IgorCWxkbQlzcCsrLCByNiwgcGMKKwkJCQorCS5zZWN0aW9uCSIuZmluaSIKKwlsZG0Jc3ArKywgcjYsIHBjCisJCQotLS0gL2Rldi9udWxsCisrKyBiL2djYy9jb25maWcvYXZyMzIvZnBjcC5tZApAQCAtMCwwICsxLDU1MSBAQAorOzsgICBBVlIzMiBtYWNoaW5lIGRlc2NyaXB0aW9uIGZpbGUgZm9yIEZsb2F0aW5nLVBvaW50IGluc3RydWN0aW9ucy4KKzs7ICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbi4KKzs7Cis7OyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+Cis7OworOzsgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7ICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7OyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKzs7IC0qLSBNb2RlOiBTY2hlbWUgLSotCisKKzs7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7OyBBdXRvbWF0b24gcGlwZWxpbmUgZGVzY3JpcHRpb24gZm9yIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yIGluc25zCis7OyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKGRlZmluZV9jcHVfdW5pdCAiZmlkLGZtMSxmbTIsZm0zLGZtNCxmd2IsZmNtcCxmY2FzdCIgImF2cjMyX2FwIikKKworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJmbXZfb3AiIDEKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJmbXYiKSkKKyAgImlzLGRhLGQsZmlkLGZ3YiIpCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAiZm11bF9vcCIgNQorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgImZtdWwiKSkKKyAgImlzLGRhLGQsZmlkLGZtMSxmbTIsZm0zLGZtNCxmd2IiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImZjbXBzX29wIiAxCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAiZmNtcHMiKSkKKyAgImlzLGRhLGQsZmlkLGZjbXAiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImZjbXBkX29wIiAyCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAiZmNtcGQiKSkKKyAgImlzLGRhLGQsZmlkKjIsZmNtcCIpCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAiZmNhc3Rfb3AiIDMKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJmY2FzdCIpKQorICAiaXMsZGEsZCxmaWQsZmNtcCxmY2FzdCxmd2IiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImZtdmNwdV9vcCIgMgorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgImZtdmNwdSIpKQorICAiaXMsZGEsZCIpCisKKyhkZWZpbmVfaW5zbl9yZXNlcnZhdGlvbiAiZmxkZF9vcCIgMQorICAoYW5kIChlcV9hdHRyICJwaXBlbGluZSIgImFwIikKKyAgICAgICAoZXFfYXR0ciAidHlwZSIgImZsZGQiKSkKKyAgImlzLGRhLGQsZndiIikKKworKGRlZmluZV9pbnNuX3Jlc2VydmF0aW9uICJmbGRzX29wIiAxCisgIChhbmQgKGVxX2F0dHIgInBpcGVsaW5lIiAiYXAiKQorICAgICAgIChlcV9hdHRyICJ0eXBlIiAiZmxkcyIpKQorICAiaXMsZGEsZCxmd2IiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImZzdHNfb3AiIDAKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJmc3RzIikpCisgICJpcyxkYSoyLGQiKQorCisoZGVmaW5lX2luc25fcmVzZXJ2YXRpb24gImZzdGRfb3AiIDAKKyAgKGFuZCAoZXFfYXR0ciAicGlwZWxpbmUiICJhcCIpCisgICAgICAgKGVxX2F0dHIgInR5cGUiICJmc3RkIikpCisgICJpcyxkYSoyLGQiKQorCisKKyhkZWZpbmVfaW5zbiAiKm1vdnNmX2ZwY3AiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAgICAgIj1mLGYscixmLG0scixyLHIsbSIpCisJKG1hdGNoX29wZXJhbmQ6U0YgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgICAgICAgICAiIGYscixmLG0sZixyLEcsbSxyIikpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJACisgICBmbW92LnNcdCUwLCAlMQorICAgZm1vdi5zXHQlMCwgJTEKKyAgIGZtb3Yuc1x0JTAsICUxCisgICBmbGQuc1x0JTAsICUxCisgICBmc3Quc1x0JTAsICUxCisgICBtb3ZcdCUwLCAlMQorICAgbW92XHQlMCwgJTEKKyAgIGxkLndcdCUwLCAlMQorICAgc3Qud1x0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0LDQsNCw0LDQsMiw0LDQsNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmbXYsZmxkcyxmbXZjcHUsZmxkcyxmc3RzLGFsdSxhbHUsbG9hZCxzdG9yZSIpXSkKKworKGRlZmluZV9pbnNuX2FuZF9zcGxpdCAiKm1vdmRmX2ZwY3AiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRGIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIiAgICAgIj1mLGYscixmLG0scixyLG0iKQorCShtYXRjaF9vcGVyYW5kOkRGIDEgImdlbmVyYWxfb3BlcmFuZCIgICAgICAgICAgIiBmLHIsZixtLGYscixtLHIiKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgIkAKKyAgIGZtb3YuZFx0JTAsICUxCisgICBmbW92LmRcdCUwLCAlMQorICAgZm1vdi5kXHQlMCwgJTEKKyAgIGZsZC5kXHQlMCwgJTEKKyAgIGZzdC5kXHQlMCwgJTEKKyAgIG1vdlx0JTAsICUxXDttb3ZcdCVtMCwgJW0xCisgICBsZC5kXHQlMCwgJTEKKyAgIHN0LmRcdCUwLCAlMSIKKworICAiVEFSR0VUX0hBUkRfRkxPQVQKKyAgICYmIHJlbG9hZF9jb21wbGV0ZWQKKyAgICYmIChSRUdfUChvcGVyYW5kc1swXSkgJiYgIChSRUdOT19SRUdfQ0xBU1MoUkVHTk8ob3BlcmFuZHNbMF0pKSA9PSBHRU5FUkFMX1JFR1MpKQorICAgJiYgKFJFR19QKG9wZXJhbmRzWzFdKSAmJiAgKFJFR05PX1JFR19DTEFTUyhSRUdOTyhvcGVyYW5kc1sxXSkpID09IEdFTkVSQUxfUkVHUykpIgorICBbKHNldCAobWF0Y2hfZHVwIDApIChtYXRjaF9kdXAgMSkpCisgICAoc2V0IChtYXRjaF9kdXAgMikgKG1hdGNoX2R1cCAzKSldCisgICIKKyAgIHsKKyAgICBvcGVyYW5kc1syXSA9IGdlbl9oaWdocGFydCAoU0ltb2RlLCBvcGVyYW5kc1swXSk7CisgICAgb3BlcmFuZHNbMF0gPSBnZW5fbG93cGFydCAoU0ltb2RlLCBvcGVyYW5kc1swXSk7CisgICAgb3BlcmFuZHNbM10gPSBnZW5faGlnaHBhcnQoU0ltb2RlLCBvcGVyYW5kc1sxXSk7CisgICAgb3BlcmFuZHNbMV0gPSBnZW5fbG93cGFydChTSW1vZGUsIG9wZXJhbmRzWzFdKTsKKyAgIH0KKyAgIgorCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQsNCw0LDQsNCw0LDQsNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmbXYsZmxkZCxmbXZjcHUsZmxkZCxmc3RkLGFsdTIsbG9hZDIsc3RvcmUyIildKQorCisKKyhkZWZpbmVfaW5zbiAibXVsc2YzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTRiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKwkJIChtYXRjaF9vcGVyYW5kOlNGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUIgorICAiZm11bC5zXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdWwiKV0pCisKKyhkZWZpbmVfaW5zbiAibm11bHNmMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0YgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIj1mIikKKwkobmVnOlNGIChtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTRiAyICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmbm11bC5zXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdWwiKV0pCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKQorCQkgKG1hdGNoX29wZXJhbmQ6U0YgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6U0YgICAgICAgICAgMyAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJKG5lZzpTRiAobWF0Y2hfZHVwIDApKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCAmJgorICAgKHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pIHx8IChSRUdOTyhvcGVyYW5kc1szXSkgPT0gUkVHTk8ob3BlcmFuZHNbMF0pKSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMykKKwkobmVnOlNGIChtdWx0OlNGIChtYXRjaF9kdXAgMSkKKwkJCSAobWF0Y2hfZHVwIDIpKSkpXQorKQorCisKKyhkZWZpbmVfaW5zbiAibWFjc2YzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTRiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShwbHVzOlNGIChtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0YgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkKKyAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0YgMyAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIjAiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmbWFjLnNcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9pbnNuICJubWFjc2YzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTRiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShwbHVzOlNGICAobmVnOlNGIChtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0YgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpCisgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTRiAzICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiMCIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZubWFjLnNcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0YgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJKG11bHQ6U0YgKG1hdGNoX29wZXJhbmQ6U0YgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJCSAobWF0Y2hfb3BlcmFuZDpTRiAyICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTRiAgICAgICAgICAzICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobWludXM6U0YKKwkgKG1hdGNoX2R1cCAzKQorCSAobWF0Y2hfZHVwIDApKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCAmJiBwZWVwMl9yZWdfZGVhZF9wKDIsIG9wZXJhbmRzWzBdKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAzKQorCShwbHVzOlNGICAobmVnOlNGIChtdWx0OlNGIChtYXRjaF9kdXAgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAyKSkpCisgICAgICAgICAgICAgICAgICAobWF0Y2hfZHVwIDMpKSldCispCisKKworKGRlZmluZV9pbnNuICJtc3ViYWNzZjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG1pbnVzOlNGIChtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpCisgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTRiAzICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiMCIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZtc2Muc1x0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmbXVsIildKQorCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTRiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobXVsdDpTRiAobWF0Y2hfb3BlcmFuZDpTRiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkJIChtYXRjaF9vcGVyYW5kOlNGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDMgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtaW51czpTRgorCSAobWF0Y2hfZHVwIDApCisJIChtYXRjaF9kdXAgMykpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUICYmIHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pIgorICBbKHNldCAobWF0Y2hfZHVwIDMpCisJKG1pbnVzOlNGICAobXVsdDpTRiAobWF0Y2hfZHVwIDEpCisJCQkgICAgKG1hdGNoX2R1cCAyKSkKKwkJICAgKG1hdGNoX2R1cCAzKSkpXQorKQorCisoZGVmaW5lX2luc24gIm5tc3ViYWNzZjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG1pbnVzOlNGICAobmVnOlNGIChtdWx0OlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpKQorICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNGIDMgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIwIikpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUIgorICAiZm5tc2Muc1x0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmbXVsIildKQorCisKKworKGRlZmluZV9pbnNuICJhZGRzZjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKHBsdXM6U0YgKG1hdGNoX29wZXJhbmQ6U0YgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKQorCQkgKG1hdGNoX29wZXJhbmQ6U0YgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmYWRkLnNcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9pbnNuICJzdWJzZjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG1pbnVzOlNGIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUIgorICAiZnN1Yi5zXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdWwiKV0pCisKKworKGRlZmluZV9pbnNuICJuZWdzZjIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG5lZzpTRiAobWF0Y2hfb3BlcmFuZDpTRiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZuZWcuc1x0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdiIpXSkKKworKGRlZmluZV9pbnNuICJhYnNzZjIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKGFiczpTRiAobWF0Y2hfb3BlcmFuZDpTRiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZhYnMuc1x0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdiIpXSkKKworKGRlZmluZV9pbnNuICJ0cnVuY2Rmc2YyIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTRiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShmbG9hdF90cnVuY2F0ZTpTRgorICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmY2FzdGQuc1x0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZjYXN0IildKQorCisoZGVmaW5lX2luc24gImV4dGVuZHNmZGYyIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpERiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShmbG9hdF9leHRlbmQ6REYKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUIgorICAiZmNhc3RzLmRcdCUwLCAlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmY2FzdCIpXSkKKworKGRlZmluZV9pbnNuICJtdWxkZjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG11bHQ6REYgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKQorCQkgKG1hdGNoX29wZXJhbmQ6REYgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmbXVsLmRcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9pbnNuICJubXVsZGYzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpERiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShuZWc6REYgKG11bHQ6REYgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKQorICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkRGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZubXVsLmRcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9wZWVwaG9sZTIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REYgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJKG11bHQ6REYgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJCSAobWF0Y2hfb3BlcmFuZDpERiAyICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpERiAgICAgICAgICAzICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobmVnOkRGIChtYXRjaF9kdXAgMCkpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUICYmCisgICAocGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkgfHwgKFJFR05PKG9wZXJhbmRzWzNdKSA9PSBSRUdOTyhvcGVyYW5kc1swXSkpKSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAzKQorCShuZWc6REYgKG11bHQ6REYgKG1hdGNoX2R1cCAxKQorCQkJIChtYXRjaF9kdXAgMikpKSldCispCisKKyhkZWZpbmVfaW5zbiAibWFjZGYzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpERiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiPWYiKQorCShwbHVzOkRGIChtdWx0OkRGIChtYXRjaF9vcGVyYW5kOkRGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkKKyAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMyAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIjAiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmbWFjLmRcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9pbnNuICJtc3ViYWNkZjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG1pbnVzOkRGIChtdWx0OkRGIChtYXRjaF9vcGVyYW5kOkRGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkRGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpCisgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpERiAzICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiMCIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZtc2MuZFx0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmbXVsIildKQorCisoZGVmaW5lX3BlZXBob2xlMgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpERiAgICAgICAgICAwICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkobXVsdDpERiAobWF0Y2hfb3BlcmFuZDpERiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkJIChtYXRjaF9vcGVyYW5kOkRGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKSkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOkRGICAgICAgICAgIDMgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtaW51czpERgorCSAobWF0Y2hfZHVwIDApCisJIChtYXRjaF9kdXAgMykpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUICYmIHBlZXAyX3JlZ19kZWFkX3AoMiwgb3BlcmFuZHNbMF0pIgorICBbKHNldCAobWF0Y2hfZHVwIDMpCisJKG1pbnVzOkRGICAobXVsdDpERiAobWF0Y2hfZHVwIDEpCisJCQkgICAgKG1hdGNoX2R1cCAyKSkKKwkJICAgKG1hdGNoX2R1cCAzKSkpXQorICApCisKKyhkZWZpbmVfaW5zbiAibm1zdWJhY2RmMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REYgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIj1mIikKKwkobWludXM6REYgIChuZWc6REYgKG11bHQ6REYgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpCisgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMyAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIjAiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmbm1zYy5kXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdWwiKV0pCisKKyhkZWZpbmVfaW5zbiAibm1hY2RmMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REYgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIj1mIikKKwkocGx1czpERiAgKG5lZzpERiAobXVsdDpERiAobWF0Y2hfb3BlcmFuZDpERiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkRGIDIgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikpKQorICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMyAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIjAiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmbm1hYy5kXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdWwiKV0pCisKKyhkZWZpbmVfcGVlcGhvbGUyCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKQorCShtdWx0OkRGIChtYXRjaF9vcGVyYW5kOkRGIDEgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICIiKQorCQkgKG1hdGNoX29wZXJhbmQ6REYgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX29wZXJhbmQ6REYgICAgICAgICAgMyAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJKG1pbnVzOkRGCisJIChtYXRjaF9kdXAgMykKKwkgKG1hdGNoX2R1cCAwKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQgJiYgcGVlcDJfcmVnX2RlYWRfcCgyLCBvcGVyYW5kc1swXSkiCisgIFsoc2V0IChtYXRjaF9kdXAgMykKKwkocGx1czpERiAgKG5lZzpERiAobXVsdDpERiAobWF0Y2hfZHVwIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9kdXAgMikpKQorICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAzKSkpXQorKQorCisoZGVmaW5lX2luc24gImFkZGRmMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REYgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIj1mIikKKwkocGx1czpERiAobWF0Y2hfb3BlcmFuZDpERiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpCisJCSAobWF0Y2hfb3BlcmFuZDpERiAyICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZhZGQuZFx0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmbXVsIildKQorCisoZGVmaW5lX2luc24gInN1YmRmMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REYgICAgICAgICAgMCAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgIj1mIikKKwkobWludXM6REYgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKQorICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6REYgMiAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJmc3ViLmRcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiZm11bCIpXSkKKworKGRlZmluZV9pbnNuICJuZWdkZjIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKG5lZzpERiAobWF0Y2hfb3BlcmFuZDpERiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZuZWcuZFx0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdiIpXSkKKworKGRlZmluZV9pbnNuICJhYnNkZjIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkRGICAgICAgICAgIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICI9ZiIpCisJKGFiczpERiAobWF0Y2hfb3BlcmFuZDpERiAxICJhdnIzMl9mcF9yZWdpc3Rlcl9vcGVyYW5kIiAiZiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgImZhYnMuZFx0JTAsICUxIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdiIpXSkKKworCisoZGVmaW5lX2V4cGFuZCAiY21wZGYiCisgIFsoc2V0IChjYzApCisJKGNvbXBhcmU6REYKKwkgKG1hdGNoX29wZXJhbmQ6REYgMCAiZ2VuZXJhbF9vcGVyYW5kIiAiIikKKwkgKG1hdGNoX29wZXJhbmQ6REYgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgIiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgInsKKyAgIHJ0eCB0bXByZWc7CisgICBpZiAoICFSRUdfUChvcGVyYW5kc1swXSkgKQorICAgICBvcGVyYW5kc1swXSA9IGZvcmNlX3JlZyhERm1vZGUsIG9wZXJhbmRzWzBdKTsKKworICAgaWYgKCAhUkVHX1Aob3BlcmFuZHNbMV0pICkKKyAgICAgb3BlcmFuZHNbMV0gPSBmb3JjZV9yZWcoREZtb2RlLCBvcGVyYW5kc1sxXSk7CisKKyAgIGF2cjMyX2NvbXBhcmVfb3AwID0gb3BlcmFuZHNbMF07CisgICBhdnIzMl9jb21wYXJlX29wMSA9IG9wZXJhbmRzWzFdOworCisgICBlbWl0X2luc24oZ2VuX2NtcGRmX2ludGVybmFsKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSkpOworCisgICB0bXByZWcgPSBnZW5fcmVnX3J0eChTSW1vZGUpOworICAgZW1pdF9pbnNuKGdlbl9mcGNjX3RvX3JlZyh0bXByZWcpKTsKKyAgIGVtaXRfaW5zbihnZW5fcmVnX3RvX2NjKHRtcHJlZykpOworCisgICBET05FOworICB9IgorKQorCisoZGVmaW5lX2luc24gImNtcGRmX2ludGVybmFsIgorICBbKHNldCAocmVnOkNDIEZQQ0NfUkVHTlVNKQorCShjb21wYXJlOkNDCisJIChtYXRjaF9vcGVyYW5kOkRGIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKwkgKG1hdGNoX29wZXJhbmQ6REYgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgIHsKKyAgIGlmICghcnR4X2VxdWFsX3AoY2NfcHJldl9zdGF0dXMubWRlcC5mcHZhbHVlLCBTRVRfU1JDKFBBVFRFUk4gKGluc24pKSkgKQorICAgICAgcmV0dXJuICJmY21wLmRcdCUwLCAlMSI7CisgICByZXR1cm4gIiI7CisgIH0KKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmY21wZCIpCisgICAoc2V0X2F0dHIgImNjIiAiZnBjb21wYXJlIildKQorCisoZGVmaW5lX2V4cGFuZCAiY21wc2YiCisgIFsoc2V0IChjYzApCisJKGNvbXBhcmU6U0YKKwkgKG1hdGNoX29wZXJhbmQ6U0YgMCAiZ2VuZXJhbF9vcGVyYW5kIiAiIikKKwkgKG1hdGNoX29wZXJhbmQ6U0YgMSAiZ2VuZXJhbF9vcGVyYW5kIiAgIiIpKSldCisgICJUQVJHRVRfSEFSRF9GTE9BVCIKKyAgInsKKyAgIHJ0eCB0bXByZWc7CisgICBpZiAoICFSRUdfUChvcGVyYW5kc1swXSkgKQorICAgICBvcGVyYW5kc1swXSA9IGZvcmNlX3JlZyhTRm1vZGUsIG9wZXJhbmRzWzBdKTsKKworICAgaWYgKCAhUkVHX1Aob3BlcmFuZHNbMV0pICkKKyAgICAgb3BlcmFuZHNbMV0gPSBmb3JjZV9yZWcoU0Ztb2RlLCBvcGVyYW5kc1sxXSk7CisKKyAgIGF2cjMyX2NvbXBhcmVfb3AwID0gb3BlcmFuZHNbMF07CisgICBhdnIzMl9jb21wYXJlX29wMSA9IG9wZXJhbmRzWzFdOworCisgICBlbWl0X2luc24oZ2VuX2NtcHNmX2ludGVybmFsKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSkpOworCisgICB0bXByZWcgPSBnZW5fcmVnX3J0eChTSW1vZGUpOworICAgZW1pdF9pbnNuKGdlbl9mcGNjX3RvX3JlZyh0bXByZWcpKTsKKyAgIGVtaXRfaW5zbihnZW5fcmVnX3RvX2NjKHRtcHJlZykpOworCisgICBET05FOworICB9IgorKQorCisoZGVmaW5lX2luc24gImNtcHNmX2ludGVybmFsIgorICBbKHNldCAocmVnOkNDIEZQQ0NfUkVHTlVNKQorCShjb21wYXJlOkNDCisJIChtYXRjaF9vcGVyYW5kOlNGIDAgImF2cjMyX2ZwX3JlZ2lzdGVyX29wZXJhbmQiICJmIikKKwkgKG1hdGNoX29wZXJhbmQ6U0YgMSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIgImYiKSkpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgIHsKKyAgIGlmICghcnR4X2VxdWFsX3AoY2NfcHJldl9zdGF0dXMubWRlcC5mcHZhbHVlLCBTRVRfU1JDKFBBVFRFUk4gKGluc24pKSkgKQorICAgICAgcmV0dXJuICJmY21wLnNcdCUwLCAlMSI7CisgICByZXR1cm4gIiI7CisgIH0KKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJmY21wcyIpCisgICAoc2V0X2F0dHIgImNjIiAiZnBjb21wYXJlIildKQorCisoZGVmaW5lX2luc24gImZwY2NfdG9fcmVnIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCSh1bnNwZWM6U0kgWyhyZWc6Q0MgRlBDQ19SRUdOVU0pXQorCQkgICBVTlNQRUNfRlBDQ19UT19SRUcpKV0KKyAgIlRBUkdFVF9IQVJEX0ZMT0FUIgorICAiZm1vdi5zXHQlMCwgZnNyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImZtdmNwdSIpXSkKKworKGRlZmluZV9pbnNuICJyZWdfdG9fY2MiCisgIFsoc2V0IChjYzApCisJKHVuc3BlYzpTSSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0KKwkJICAgVU5TUEVDX1JFR19UT19DQykpXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgICJtdXNmclx0JTAiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjIiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IikKKyAgIChzZXRfYXR0ciAiY2MiICJmcm9tX2ZwY2MiKV0pCisKKyhkZWZpbmVfaW5zbiAic3RtX2ZwIgorICBbKHVuc3BlYyBbKG1hdGNoX29wZXJhbmQgMCAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMSAiY29uc3RfaW50X29wZXJhbmQiICIiKQorICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMiAiY29uc3RfaW50X29wZXJhbmQiICIiKV0KKwkgICBVTlNQRUNfU1RNRlApXQorICAiVEFSR0VUX0hBUkRfRkxPQVQiCisgIHsKKyAgICBpbnQgY29wX3JlZ2xpc3QgPSBJTlRWQUwob3BlcmFuZHNbMV0pOworCisgICAgaWYgKElOVFZBTChvcGVyYW5kc1syXSkgIT0gMCkKKyAgICAgIHJldHVybiAic3RjbS53XHRjcDAsIC0tJTAsICVDMSI7CisgICAgZWxzZQorICAgICAgcmV0dXJuICJzdGNtLndcdGNwMCwgJTAsICVDMSI7CisKKyAgICBpZiAoIGNvcF9yZWdsaXN0ICYgfjB4ZmYgKXsKKyAgICAgIG9wZXJhbmRzWzFdID0gR0VOX0lOVChjb3BfcmVnbGlzdCAmIH4weGZmKTsKKyAgICAgIGlmIChJTlRWQUwob3BlcmFuZHNbMl0pICE9IDApCisgICAgICAgICByZXR1cm4gInN0Y20uZFx0Y3AwLCAtLSUwLCAlRDEiOworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuICJzdGNtLmRcdGNwMCwgJTAsICVEMSI7CisgICAgfQorICB9CisgIFsoc2V0X2F0dHIgInR5cGUiICJmc3RtIikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgImNjIiAibm9uZSIpXSkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL2xpYjFmdW5jcy5TCkBAIC0wLDAgKzEsMjg3NCBAQAorLyogTWFjcm8gZm9yIG1vdmluZyBpbW1lZGlhdGUgdmFsdWUgdG8gcmVnaXN0ZXIuICovCQorLm1hY3JvIG1vdl9pbW0JcmVnLCBpbW0KKy5pZgkoKChcaW1tICYgMHhmZmZmZikgPT0gXGltbSkgfHwgKChcaW1tIHwgMHhmZmYwMDAwMCkgPT0gXGltbSkpCisJbW92CVxyZWcsIFxpbW0KKyNpZiBfX0FWUjMyX1VDX18gPj0gMgorLmVsc2VpZgkoKFxpbW0gJiAweGZmZmYpID09IDApCisJbW92aAlccmVnLCBoaShcaW1tKQorCisjZW5kaWYKKy5lbHNlCisJbW92CVxyZWcsIGxvKFxpbW0pCisJb3JoCVxyZWcsIGhpKFxpbW0pCisuZW5kaWYKKy5lbmRtCisJCisJCisJIAorLyogQWRqdXN0IHRoZSB1bnBhY2tlZCBkb3VibGUgbnVtYmVyIGlmIGl0IGlzIGEgc3Vibm9ybWFsIG51bWJlci4KKyAgIFRoZSBleHBvbmVudCBhbmQgbWFudGlzc2EgcGFpciBhcmUgc3RvcmVkCisgICBpbiBbbWFudF9oaSxtYW50X2xvXSBhbmQgW2V4cF0uIEEgcmVnaXN0ZXIgd2l0aCB0aGUgY29ycmVjdCBzaWduIGJpdCBpbgorICAgdGhlIE1TQiBpcyBwYXNzZWQgaW4gW3NpZ25dLiBOZWVkcyB0d28gc2NyYXRjaAorICAgcmVnaXN0ZXJzIFtzY3JhdGNoMV0gYW5kIFtzY3JhdGNoMl0uIEFuIGFkanVzdGVkIGFuZCBwYWNrZWQgZG91YmxlIGZsb2F0CisgICBpcyBwcmVzZW50IGluIFttYW50X2hpLG1hbnRfbG9dIGFmdGVyIG1hY3JvIGhhcyBleGVjdXRlZCAqLworLm1hY3JvICBhZGp1c3Rfc3Vibm9ybWFsX2RmICAgICBleHAsIG1hbnRfbG8sIG1hbnRfaGksIHNpZ24sIHNjcmF0Y2gxLCBzY3JhdGNoMiAKKyAgICAgICAgLyogV2UgaGF2ZSBhbiBleHBvbmVudCB3aGljaCBpcyA8PTAgaW5kaWNhdGluZyBhIHN1Ym5vcm1hbCBudW1iZXIKKyAgICAgICAgICAgQXMgaXQgc2hvdWxkIGJlIHN0b3JlZCBhcyBpZiB0aGUgZXhwb25lbnQgd2FzIDEgKGFsdGhvdWdoIHRoZQorICAgICAgICAgICBleHBvbmVudCBmaWVsZCBpcyBhbGwgemVyb3MgdG8gaW5kaWNhdGUgYSBzdWJub3JtYWwgbnVtYmVyKQorICAgICAgICAgICB3ZSBoYXZlIHRvIHNoaWZ0IGRvd24gdGhlIG1hbnRpc3NhIHRvIGl0cyBjb3JyZWN0IHBvc2l0aW9uLiAqLworICAgICAgICBuZWcgICAgIFxleHAKKyAgICAgICAgc3ViICAgICBcZXhwLC0xICAgICAgICAgICAgICAgICAgIC8qIGFtb3VudCB0byBzaGlmdCBkb3duICovCisgICAgICAgIGNwLncgICAgXGV4cCw1NAorICAgICAgICBicmxvICAgIDUwZiAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG1vcmUgdGhhbiA1MyBzaGlmdCBzdGVwcywgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlIG1hbnRpc3NhIHdpbGwgZGlzYXBwZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhbnkgcm91bmRpbmcgdG8gb2NjdXIgKi8KKyAgICAgICAgbW92ICAgICBcbWFudF9oaSwgMAorICAgICAgICBtb3YgICAgIFxtYW50X2xvLCAwCisgICAgICAgIHJqbXAgICAgNTJmCis1MDogICAgIAorICAgICAgICBzdWIgICAgIFxleHAsLTEwICAgICAgICAgICAgICAgIC8qIGRvIHRoZSBzaGlmdCB0byBwb3NpdGlvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW50aXNzYSBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSEgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIDEgc3RlcCBzaGlmdCB0byBhZGQgdGhlIHNpZ24gKi8KKyAKKyAgICAgICAgLyogd2hlbiBzaGlmdGluZywgc2F2ZSBhbGwgc2hpZnRlZCBvdXQgYml0cyBpbiBbc2NyYXRjaDJdLiB3ZSBtYXkgbmVlZCB0bworICAgICAgICAgICBsb29rIGF0IHRoZW0gdG8gbWFrZSBjb3JyZWN0IHJvdW5kaW5nLiAqLworIAorICAgICAgICByc3ViICAgIFxzY3JhdGNoMSxcZXhwLDMyICAgICAgIC8qIGdldCBpbnZlcnRlZCBzaGlmdCBjb3VudCAqLworICAgICAgICBjcC53ICAgIFxleHAsMzIgICAgICAgICAgICAgICAgIC8qIGhhbmRsZSBzaGlmdHMgPj0gMzIgc2VwYXJhdGVseSAqLworICAgICAgICBicmhzICAgIDUxZgorIAorICAgICAgICAvKiBzbWFsbCAoPDMyKSBzaGlmdCBhbW91bnQsIGJvdGggd29yZHMgYXJlIHBhcnQgb2YgdGhlIHNoaWZ0ICovCisgICAgICAgIGxzbCAgICAgXHNjcmF0Y2gyLFxtYW50X2xvLFxzY3JhdGNoMSAgICAgICAgICAgICAgIC8qIHNhdmUgYml0cyB0byBzaGlmdCBvdXQgZnJvbSBsc3cqLworICAgICAgICBsc2wgICAgIFxzY3JhdGNoMSxcbWFudF9oaSxcc2NyYXRjaDEgICAgICAgICAgICAgICAvKiBnZXQgYml0cyBmcm9tIG1zdyBkZXN0aW5lZCBmb3IgbHN3Ki8KKyAgICAgICAgbHNyICAgICBcbWFudF9sbyxcbWFudF9sbyxcZXhwICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgZG93biBsc3cgKi8KKyAgICAgICAgbHNyICAgICBcbWFudF9oaSxcbWFudF9oaSxcZXhwICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgZG93biBtc3cgKi8KKyAgICAgICAgb3IgICAgICBcbWFudF9oaSxcc2NyYXRjaDEgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIGJpdHMgZnJvbSBtc3cgd2l0aCBwcmVwYXJlZCBsc3cgKi8KKyAgICAgICAgcmptcCAgICA1MGYKKyAKKyAgICAgICAgLyogbGFyZ2UgKD49MzIpIHNoaWZ0IGFtb3VudCwgb25seSBsc3cgd2lsbCBoYXZlIGJpdHMgbGVmdCBhZnRlciBzaGlmdC4KKyAgICAgICAgICAgbm90ZSB0aGF0IHNoaWZ0IG9wZXJhdGlvbnMgd2lsbCB1c2UgKChzaGlmdCBjb3VudCkgbW9kIDMyKSBzbworICAgICAgICAgICB3ZSBkbyBub3QgbmVlZCB0byBzdWJ0cmFjdCAzMiBmcm9tIHNoaWZ0IGNvdW50LiAqLworNTE6CisgICAgICAgIGxzbCAgICAgXHNjcmF0Y2gyLFxtYW50X2hpLFxzY3JhdGNoMSAgICAgICAgICAgICAgIC8qIHNhdmUgYml0cyB0byBzaGlmdCBvdXQgZnJvbSBtc3cgKi8KKyAgICAgICAgb3IgICAgICBcc2NyYXRjaDIsXG1hbnRfbG8gICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxzbyBzYXZlIGFsbCBiaXRzIGZyb20gbHN3ICovCisgICAgICAgIG1vdiAgICAgXG1hbnRfbG8sXG1hbnRfaGkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1zdyAtPiBsc3cgKGkuZS4gInNoaWZ0IDMyIGZpcnN0IikgKi8KKyAgICAgICAgbW92ICAgICBcbWFudF9oaSwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgbXN3ICovCisgICAgICAgIGxzciAgICAgXG1hbnRfbG8sXG1hbnRfbG8sXGV4cCAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2UgcmVzdCBvZiBzaGlmdCBpbnNpZGUgbHN3ICovCisgCis1MDoKKyAgICAgICAgLyogcmVzdWx0IGlzIGFsbW9zdCByZWFkeSB0byByZXR1cm4sIGV4Y2VwdCB0aGF0IGxlYXN0IHNpZ25pZmljYW50IGJpdAorICAgICAgICAgICBhbmQgdGhlIHBhcnQgd2UgYWxyZWFkeSBzaGlmdGVkIG91dCBtYXkgY2F1c2UgdGhlIHJlc3VsdCB0byBiZQorICAgICAgICAgICByb3VuZGVkICovCisgICAgICAgIGJsZCAgICAgXG1hbnRfbG8sMCAgICAgICAgICAgICAgICAgICAvKiBnZXQgYml0IHRvIGJlIHNoaWZ0ZWQgb3V0ICovCisgICAgICAgIGJyY2MgICAgNTFmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBiaXQgd2FzIDAsIG5vIHJvdW5kaW5nICovCisgCisgICAgICAgIC8qIG1zYiBvZiBwYXJ0IHRvIHJlbW92ZSBpcyAxLCBzbyByb3VuZGluZyBkZXBlbmRzIG9uIHJlc3Qgb2YgYml0cyAqLworICAgICAgICB0c3QgICAgIFxzY3JhdGNoMixcc2NyYXRjaDIgICAgICAgICAgICAgICAgICAgLyogZ2V0IHNoaWZ0ZWQgb3V0IHRhaWwgKi8KKyAgICAgICAgYnJuZSAgICA1MGYgICAgIC8qIGlmIHJlc3QgPiAwLCBkbyByb3VuZCAqLworICAgICAgICBibGQgICAgIFxtYW50X2xvLDEgICAgICAgICAgICAgICAgICAgLyogd2UgaGF2ZSB0byBsb29rIGF0IGxzYiBpbiByZXN1bHQgKi8KKyAgICAgICAgYnJjYyAgICA1MWYgICAvKiBpZiBsc2IgaXMgMCwgZG9uJ3Qgcm91bmQgKi8KKyAKKzUwOgorICAgICAgICAvKiBzdWJub3JtYWwgcmVzdWx0IHJlcXVpcmVzIHJvdW5kaW5nCisgICAgICAgICAgIHJvdW5kaW5nIG1heSBjYXVzZSBzdWJub3JtYWwgdG8gYmVjb21lIHNtYWxsZXN0IG5vcm1hbCBudW1iZXIKKyAgICAgICAgICAgbHVja2lseSwgc21hbGxlc3Qgbm9ybWFsIG51bWJlciBoYXMgZXhhY3RseSB0aGUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgd2UgZ290IGJ5IHJpcHBsaW5nIGEgb25lIGJpdCB1cCBmcm9tIG1hbnRpc3NhIGludG8gZXhwb25lbnQgZmllbGQuICovCisgICAgICAgIHN1YiAgICAgXG1hbnRfbG8sLTEKKyAgICAgICAgc3ViY2MgICBcbWFudF9oaSwtMQorIAorNTE6CisgICAgICAgIC8qIHNoaWZ0IGFuZCByZXR1cm4gcGFja2VkIGRvdWJsZSB3aXRoIGNvcnJlY3Qgc2lnbiAqLworICAgICAgICByb2wgICAgIFxzaWduCisgICAgICAgIHJvciAgICAgXG1hbnRfaGkKKyAgICAgICAgcm9yICAgICBcbWFudF9sbyAgICAgICAgCis1MjogICAgIAorLmVuZG0KKyAKKyAKKy8qIEFkanVzdCBzdWJub3JtYWwgc2luZ2xlIGZsb2F0IG51bWJlciB3aXRoIGV4cG9uZW50IFtleHBdCisgICBhbmQgbWFudGlzc2EgW21hbnRdIGFuZCByb3VuZC4gICAgKi8KKy5tYWNybyAgYWRqdXN0X3N1Ym5vcm1hbF9zZiAgICAgc2YsIGV4cCwgbWFudCwgc2lnbiwgc2NyYXRjaAorICAgICAgICAvKiBzdWJub3JtYWwgbnVtYmVyICovCisgICAgICAgIHJzdWIgICAgXGV4cCxcZXhwLCAxICAgICAgICAgICAgLyogc2hpZnQgYW1vdW50ICovCisgICAgICAgIGNwLncgICAgXGV4cCwgMjUKKyAgICAgICAgbW92aHMgICBcbWFudCwgMCAgICAgICAgICAgICAgICAKKyAgICAgICAgYnJocyAgICA5MGYgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gemVybyAqLworICAgICAgICByc3ViICAgIFxzY3JhdGNoLCBcZXhwLCAzMgorICAgICAgICBsc2wgICAgIFxzY3JhdGNoLCBcbWFudCxcc2NyYXRjaC8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgYml0cyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0cyBkaXNjYXJkZWQgaW4gdGhlIG1hbnRpc3NhICovCisgICAgICAgIHNybmUgICAgXHNjcmF0Y2ggICAgICAgICAgICAgICAgLyogSWYgc28gc2V0IHRoZSBsc2Igb2YgdGhlIHNoaWZ0ZWQgbWFudGlzc2EgKi8gCisgICAgICAgIGxzciAgICAgXG1hbnQsXG1hbnQsXGV4cCAgICAgICAgLyogU2hpZnQgdGhlIG1hbnRpc3NhICovCisgICAgICAgIG9yICAgICAgXG1hbnQsIFxzY3JhdGNoICAgICAgICAgLyogUm91bmQgbHNiIGlmIGFueSBiaXRzIHdlcmUgc2hpZnRlZCBvdXQgICovCisgICAgICAgIC8qIFJvdW5kaW5nIDogICBGb3IgZXhwbGFpbmF0aW9uLCBzZWUgcm91bmRfc2YuICovCisgICAgICAgIG1vdiAgICAgXHNjcmF0Y2gsIDB4N2YgICAgICAgICAgLyogU2V0IHJvdW5kaW5nIGNvbnN0YW50ICovCisgICAgICAgIGJsZCAgICAgXG1hbnQsIDggICAgICAgICAgICAgICAgCisgICAgICAgIHN1YmVxICAgXHNjcmF0Y2gsIC0xICAgICAgICAgICAgLyogRm9yIG9kZCBudW1iZXJzIHVzZSByb3VuZGluZyBjb25zdGFudCAweDgwICovCisgICAgICAgIGFkZCAgICAgXG1hbnQsIFxzY3JhdGNoICAgICAgICAgLyogQWRkIHJvdW5kaW5nIGNvbnN0YW50IHRvIG1hbnRpc3NhICovCisgICAgICAgIC8qIFdlIGNhbid0IG92ZXJmbG93IGJlY2F1c2UgbWFudGlzc2EgaXMgYXQgbGVhc3Qgc2hpZnRlZCBvbmUgcG9zaXRpb24KKyAgICAgICAgICAgdG8gdGhlIHJpZ2h0IHNvIHRoZSBpbXBsaWNpdCBiaXQgaXMgemVyby4gV2UgY2FuIGhvd2V2ZXIgZ2V0IHRoZSBpbXBsaWNpdAorICAgICAgICAgICBiaXQgc2V0IGFmdGVyIHJvdW5kaW5nIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSB0aGUgbG93ZXN0IG5vcm1hbCBudW1iZXIKKyAgICAgICAgICAgYnV0IHRoaXMgaXMgb2sgc2luY2UgdGhpcyBiaXQgaGFzIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBMU0Igb2YgdGhlCisgICAgICAgICAgIGV4cG9uZW50ICovCisgICAgICAgIGxzciAgICAgXHNmLCBcbWFudCwgNworICAgICAgICAvKiBSb3RhdGUgaW4gc2lnbiAqLworICAgICAgICBsc2wgICAgIFxzaWduLCAxCisgICAgICAgIHJvciAgICAgXHNmCis5MDogICAgIAorLmVuZG0KKyAKKyAKKy8qIFJvdW5kIHRoZSB1bnBhY2tlZCBkZiBudW1iZXIgd2l0aCBleHBvbmVudCBbZXhwXSBhbmQKKyAgIG1hbnRpc3NhIFttYW50X2hpLCBtYW50X2xvXS4gVXNlcyBzY3JhdGNoIHJlZ2lzdGVyCisgICBbc2NyYXRjaF0gKi8KKy5tYWNybyAgcm91bmRfZGYgICAgICAgIGV4cCwgbWFudF9sbywgbWFudF9oaSwgc2NyYXRjaAorICAgICAgICBtb3YgICAgIFxzY3JhdGNoLCAweDNmZiAgICAgICAgIC8qIFJvdW5kaW5nIGNvbnN0YW50ICovCisgICAgICAgIGJsZCAgICAgXG1hbnRfbG8sMTEgICAgICAgICAgICAgLyogQ2hlY2sgaWYgbHNiIGluIHRoZSBmaW5hbCByZXN1bHQgaXMgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCAqLworICAgICAgICBzdWJlcSAgIFxzY3JhdGNoLCAtMSAgICAgICAgICAgIC8qIEFkanVzdCByb3VuZGluZyBjb25zdGFudCB0byAweDQwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJvdW5kaW5nIDAuNSB1cHdhcmRzICovICAgCisgICAgICAgIGFkZCAgICAgXG1hbnRfbG8sIFxzY3JhdGNoICAgICAgLyogUm91bmQgKi8KKyAgICAgICAgYWNyICAgICBcbWFudF9oaSAgICAgICAgICAgICAgICAvKiBJZiBvdmVyZmxvd2luZyB3ZSBrbm93IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIGFsbCB6ZXJvcyBpbiB0aGUgYml0cyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQgb3V0IHNvIHdlIGNhbiBsZWF2ZSB0aGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHdlIG11c3QgaW5jcmVhc2UgdGhlIGV4cG9uZW50IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gc2luY2Ugd2UgaGFkIGFuIGltcGxpY2l0IGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIGxvc3QgKyB0aGUgZXh0cmEgb3ZlcmZsb3cgYml0ICovCisgICAgICAgIHN1YmNzICAgXGV4cCwgLTIgICAgICAgICAgICAgICAgLyogVXBkYXRlIGV4cG9uZW50ICovCisuZW5kbSAgICAgICAgICAgCisgCisvKiBSb3VuZCBzaW5nbGUgZmxvYXQgbnVtYmVyIHN0b3JlZCBpbiBbbWFudF0gYW5kIFtleHBdICovCisubWFjcm8gIHJvdW5kX3NmICAgICAgICBleHAsIG1hbnQsIHNjcmF0Y2gKKyAgICAgICAgLyogUm91bmQ6ICAgICAgIAorICAgICAgICAgICAgICAgIEZvciAwLjUgd2Ugcm91bmQgdG8gbmVhcmVzdCBldmVuIGludGVnZXIKKyAgICAgICAgICAgICAgICBmb3IgYWxsIG90aGVyIGNhc2VzIHdlIHJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlci4KKyAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIGRpZ2l0IGxlZnQgb2YgdGhlICJwb2ludCIgKC4pCisgICAgICAgICAgICAgICAgaXMgMSB3ZSBjYW4gYWRkIDB4ODAgdG8gdGhlIG1hbnRpc3NhIHNpbmNlIHRoZQorICAgICAgICAgICAgICAgIGNvcm5lciBjYXNlIDB4MTgwIHdpbGwgcm91bmQgdXAgdG8gMHgyMDAuIElmIHRoZQorICAgICAgICAgICAgICAgIGRpZ2l0IGxlZnQgb2YgdGhlICJwb2ludCIgaXMgMCB3ZSB3aWxsIGhhdmUgdG8KKyAgICAgICAgICAgICAgICBhZGQgMHg3ZiBzaW5jZSB0aGlzIHdpbGwgZ2l2ZSAweGZmIGFuZCBoZW5jZSBhCisgICAgICAgICAgICAgICAgdHJ1bmNhdGlvbi9yb3VuZGluZyBkb3dud2FyZHMgZm9yIHRoZSBjb3JuZXIKKyAgICAgICAgICAgICAgICBjYXNlIHdoZW4gdGhlIDkgbG93ZXN0IGJpdHMgYXJlIDB4MDgwICovCisgICAgICAgIG1vdiAgICAgXHNjcmF0Y2gsIDB4N2YgIC8qIFNldCByb3VuZGluZyBjb25zdGFudCAqLworICAgICAgICAvKiBDaGVjayBpZiB0aGUgbWFudGlzc2EgaXMgZXZlbiBvciBvZGQgKi8KKyAgICAgICAgYmxkICAgICBcbWFudCwgOAorICAgICAgICBzdWJlcSAgIFxzY3JhdGNoLCAtMSAgICAvKiBSb3VuZGluZyBjb25zdGFudCBzaG91bGQgYmUgMHg4MCAqLworICAgICAgICBhZGQgICAgIFxtYW50LCBcc2NyYXRjaAorICAgICAgICBzdWJjcyAgIFxleHAsIC0yICAgICAgICAvKiBBZGp1c3QgZXhwb25lbnQgaWYgd2Ugb3ZlcmZsb3dlZCAqLyAgICAgICAgICAKKy5lbmRtCisgCisgICAgICAgICAgICAgICAgIAorIAorLyogUGFjayBhIHNpbmdsZSBmbG9hdCBudW1iZXIgc3RvcmVkIGluIFttYW50XSBhbmQgW2V4cF0KKyAgIGludG8gYSBzaW5nbGUgZmxvYXQgbnVtYmVyIGluIFtzZl0gICovCisubWFjcm8gIHBhY2tfc2Ygc2YsIGV4cCwgbWFudAorICAgICAgICBibGQgICAgIFxtYW50LDMxICAgICAgICAgICAgICAgICAgLyogaW1wbGljaXQgYml0IHRvIHogKi8KKyAgICAgICAgc3VibmUgICBcZXhwLDEgICAgICAgICAgICAgICAgICAgLyogaWYgc3Vibm9ybWFsIChpbXBsaWNpdCBiaXQgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdCBleHBvbmVudCB0byBzdG9yYWdlIGZvcm1hdCAqLworICAgICAgICAKKyAgICAgICAgbHNyICAgICBcc2YsIFxtYW50LCA3CisgICAgICAgIGJmaW5zICAgXHNmLCBcZXhwLCAyNCwgOAorLmVuZG0gICAKKyAKKy8qIFBhY2sgZXhwb25lbnQgW2V4cF0gYW5kIG1hbnRpc3NhIFttYW50X2hpLCBtYW50X2xvXQorICAgaW50byBbZGZfaGksIGRmX2xvXS4gIFtkZl9oaV0gaXMgc2hpZnRlZAorICAgb25lIGJpdCB1cCBzbyB0aGUgc2lnbiBiaXQgY2FuIGJlIHNoaWZ0ZWQgaW50byBpdCAqLworICAgICAgICAKKy5tYWNybyAgcGFja19kZiAgICAgICAgIGV4cCwgbWFudF9sbywgbWFudF9oaSwgZGZfbG8sIGRmX2hpCisgICAgICAgIGJsZCAgICAgXG1hbnRfaGksMzEgICAgICAgICAgICAgICAgICAvKiBpbXBsaWNpdCBiaXQgdG8geiAqLworICAgICAgICBzdWJuZSAgIFxleHAsMSAgICAgICAgICAgICAgICAgICAvKiBpZiBzdWJub3JtYWwgKGltcGxpY2l0IGJpdCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0IGV4cG9uZW50IHRvIHN0b3JhZ2UgZm9ybWF0ICovCisgCisgICAgICAgIGxzciAgICAgXG1hbnRfbG8sMTEgICAgICAgICAgICAgICAgICAvKiBzaGlmdCBiYWNrIGxzdyAqLworICAgICAgICBvciAgICAgIFxkZl9sbyxcbWFudF9sbyxcbWFudF9oaTw8MjEgICAgICAgICAgLyogY29tYmluZSB3aXRoIGxvdyBiaXRzIGZyb20gbXN3ICovCisgICAgICAgIGxzbCAgICAgXG1hbnRfaGksMSAgICAgICAgICAgICAgICAgICAvKiBnZXQgcmlkIG9mIGltcGxpY2l0IGJpdCAqLworICAgICAgICBsc3IgICAgIFxtYW50X2hpLDExICAgICAgICAgICAgICAgICAgLyogc2hpZnQgYmFjayBtc3cgZXhjZXB0IGZvciBvbmUgc3RlcCovCisgICAgICAgIG9yICAgICAgXGRmX2hpLFxtYW50X2hpLFxleHA8PDIxICAgICAgICAgIC8qIGNvbWJpbmUgbXN3IHdpdGggZXhwb25lbnQgKi8KKy5lbmRtCisgCisvKiBOb3JtYWxpemUgc2luZ2xlIGZsb2F0IG51bWJlciBzdG9yZWQgaW4gW21hbnRdIGFuZCBbZXhwXQorICAgdXNpbmcgc2NyYXRjaCByZWdpc3RlciBbc2NyYXRjaF0gKi8KKy5tYWNybyAgbm9ybWFsaXplX3NmICAgIGV4cCwgbWFudCwgc2NyYXRjaAorICAgICAgICAvKiBBZGp1c3QgZXhwb25lbnQgYW5kIG1hbnRpc3NhICovCisgICAgICAgIGNseiAgICAgXHNjcmF0Y2gsIFxtYW50CisgICAgICAgIHN1YiAgICAgXGV4cCwgXHNjcmF0Y2gKKyAgICAgICAgbHNsICAgICBcbWFudCwgXG1hbnQsIFxzY3JhdGNoCisuZW5kbQorIAorLyogTm9ybWFsaXplIHRoZSBleHBvbmVudCBhbmQgbWFudGlzc2EgcGFpciBzdG9yZWQKKyAgIGluIFttYW50X2hpLG1hbnRfbG9dIGFuZCBbZXhwXS4gTmVlZHMgdHdvIHNjcmF0Y2gKKyAgIHJlZ2lzdGVycyBbc2NyYXRjaDFdIGFuZCBbc2NyYXRjaDJdLiAqLworLm1hY3JvICBub3JtYWxpemVfZGYgICAgICAgICAgICBleHAsIG1hbnRfbG8sIG1hbnRfaGksIHNjcmF0Y2gxLCBzY3JhdGNoMgorICAgICAgICBjbHogICAgIFxzY3JhdGNoMSxcbWFudF9oaSAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB6ZXJvcyBpbiBoaWdoIGJpdHMgKi8KKyAgICAgICAgYnJlcSAgICA4MGYgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIGZvciBzY2FsaW5nIGlmIG5vIHplcm9zIGluIGhpZ2ggYml0cyAqLworICAgICAgICBicmNzICAgIDgxZiAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhbGwgemVyb3MgKi8gICAgICAgICAgIAorIAorICAgICAgICAvKiBzaGlmdCBhbW91bnQgaXMgc21hbGxlciB0aGFuIDMyLCBhbmQgaW52b2x2ZXMgYm90aCBtc3cgYW5kIGxzdyovCisgICAgICAgIHJzdWIgICAgXHNjcmF0Y2gyLFxzY3JhdGNoMSwzMiAgLyogc2hpZnQgbWFudGlzc2EgKi8KKyAgICAgICAgbHNsICAgICBcbWFudF9oaSxcbWFudF9oaSxcc2NyYXRjaDEKKyAgICAgICAgbHNyICAgICBcc2NyYXRjaDIsXG1hbnRfbG8sXHNjcmF0Y2gyCisgICAgICAgIG9yICAgICAgXG1hbnRfaGksXHNjcmF0Y2gyCisgICAgICAgIGxzbCAgICAgXG1hbnRfbG8sXG1hbnRfbG8sXHNjcmF0Y2gxCisgICAgICAgIHN1YiAgICAgXGV4cCxcc2NyYXRjaDEgICAgICAgICAgLyogYWRqdXN0IGV4cG9uZW50ICovCisgICAgICAgIHJqbXAgICAgODBmICAgICAgICAgICAgICAgICAgICAgLyogRmluaXNoZWQgKi8gIAorODE6CisgICAgICAgIC8qIHNoaWZ0IGFtb3VudCBpcyBncmVhdGVyIHRoYW4gMzIgKi8KKyAgICAgICAgY2x6ICAgICBcc2NyYXRjaDEsXG1hbnRfbG8gICAgICAvKiBzaGlmdCBtYW50aXNzYSAqLworICAgICAgICBtb3ZjcyAgIFxzY3JhdGNoMSwgMAorICAgICAgICBzdWJjYyAgIFxzY3JhdGNoMSwtMzIKKyAgICAgICAgbHNsICAgICBcbWFudF9oaSxcbWFudF9sbyxcc2NyYXRjaDEKKyAgICAgICAgbW92ICAgICBcbWFudF9sbywwCisgICAgICAgIHN1YiAgICAgXGV4cCxcc2NyYXRjaDEgICAgICAgICAgLyogYWRqdXN0IGV4cG9uZW50ICovCis4MDogICAgIAorLmVuZG0KKyAgICAgICAgCisgCisvKiBGYXN0IGJ1dCBhcHByb3hpbWF0ZSBtdWx0aXBseSBvZiB0d28gNjQtYml0IG51bWJlcnMgdG8gZ2l2ZSBhIDY0IGJpdCByZXN1bHQuCisgICBUaGUgbXVsdGlwbGljYXRpb24gb2YgW2FsXXhbYmxdIGlzIGRpc2NhcmRlZC4KKyAgIE9wZXJhbmRzIGluIFthaF0sIFthbF0sIFtiaF0sIFtibF0uCisgICBTY3JhdGNoIHJlZ2lzdGVycyBpbiBbc2hdLCBbc2xdLgorICAgUmV0dXJucyByZXN1bHRzIGluIHJlZ2lzdGVycyBbcmhdLCBbcmxdLiovCisubWFjcm8gIG11bF9hcHByb3hfZGYgICBhaCwgYWwsIGJoLCBibCwgcmgsIHJsLCBzaCwgc2wKKyAgICAgICAgbXVsdS5kICBcc2wsIFxhaCwgXGJsCisgICAgICAgIG1hY3UuZCAgXHNsLCBcYWwsIFxiaAorICAgICAgICBtdWx1LmQgIFxybCwgXGFoLCBcYmgKKyAgICAgICAgYWRkICAgICBccmwsIFxzaAorICAgICAgICBhY3IgICAgIFxyaAorLmVuZG0gICAgICAgICAgIAorIAorIAorICAgICAgICAKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjY0X211bCkgfHwgZGVmaW5lZChMX2F2cjMyX2Y2NF9tdWxfZmFzdCkKKyAgICAgICAgLmFsaWduICAyCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9tdWwpCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mNjRfbXVsCisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9tdWwsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9tdWw6CisjZWxzZSAKKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX2Y2NF9tdWxfZmFzdAorICAgICAgICAudHlwZSAgX19hdnIzMl9mNjRfbXVsX2Zhc3QsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9tdWxfZmFzdDoKKyNlbmRpZiAgICAgICAgICAgICAgICAKKyAgICAgICAgb3IgICAgICByMTIsIHIxMCwgcjExIDw8IDEgCisgICAgICAgIGJyZXEgICBfX2F2cjMyX2Y2NF9tdWxfb3AxX3plcm8gICAgICAgIAorCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9tdWwpCisJcHVzaG0JcjQtcjcsIGxyCisjZWxzZQorICAgICAgICBzdG0gICAgIC0tc3AsIHI1LHI2LHI3LGxyICAgICAgIAorI2VuZGlmCisKKyNkZWZpbmUgQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMgMQorI2RlZmluZSBBVlIzMl9GNjRfTVVMX09QMl9JTlRfQklUUyAxMAorI2RlZmluZSBBVlIzMl9GNjRfTVVMX1JFU19JTlRfQklUUyAxMQorCQorICAgICAgICAvKiBvcDEgaW4ge3IxMSxyMTB9Ki8KKyAgICAgICAgLyogb3AyIGluIHtyOSxyOH0qLworICAgICAgICBlb3IgICAgIGxyLCByMTEsIHI5ICAgICAgICAgICAgIC8qIE1TQihscikgPSBTaWduKG9wMSkgXiBTaWduKG9wMikgKi8KKyAKKyAgICAgICAgLyogVW5wYWNrIG9wMSB0byAxLjYzIGZvcm1hdCovICAgICAgICAKKyAgICAgICAgLyogZXhwOiByNyAqLworICAgICAgICAvKiBzZjogIHIxMSwgcjEwICovCisJYmZleHR1CXI3LCByMTEsIDIwLCAxMSAvKiBFeHRyYWN0IGV4cG9uZW50ICovCisKKwltb3YJcjUsIDEKKworICAgICAgICAvKiBDaGVjayBpZiBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAqLworICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X211bF9vcDFfc3Vibm9ybWFsIC8qSWYgbnVtYmVyIGlzIHN1Ym5vcm1hbCwgbm9ybWFsaXplIGl0ICovIAorCisgICAgICAgIGxzbCAgICAgcjExLCAoMTItQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMtMSkgLyogRXh0cmFjdCBtYW50aXNzYSwgbGVhdmUgcm9vbSBmb3IgaW1wbGljaXQgYml0ICovIAorICAgICAgICBvciAgICAgIHIxMSwgcjExLCByMTA+PigzMi0oMTItQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMtMSkpCisgICAgICAgIGxzbCAgICAgcjEwLCAoMTItQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMtMSkKKwliZmlucwlyMTEsIHI1LCAzMiAtICgxICsgQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMpLCAxICsgQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMgLyogSW5zZXJ0IGltcGxpY2l0IGJpdCAqLworCisKKzIyOiAgICAgCisgICAgICAgIC8qIFVucGFjayBvcDIgdG8gMTAuNTQgZm9ybWF0ICovCisgICAgICAgIC8qIGV4cDogcjYgKi8KKyAgICAgICAgLyogc2Y6ICByOSwgcjggKi8KKwliZmV4dHUJcjYsIHI5LCAyMCwgMTEgLyogRXh0cmFjdCBleHBvbmVudCAqLworCisgICAgICAgIC8qIENoZWNrIGlmIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkICovCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mNjRfbXVsX29wMl9zdWJub3JtYWwgLypJZiBudW1iZXIgaXMgc3Vibm9ybWFsLCBub3JtYWxpemUgaXQgKi8gCisKKwlsc2wJcjgsIDEgLyogRXh0cmFjdCBtYW50aXNzYSwgbGVhdmUgcm9vbSBmb3IgaW1wbGljaXQgYml0ICovCisJcm9sCXI5CQorCWJmaW5zCXI5LCByNSwgMzIgLSAoMSArIEFWUjMyX0Y2NF9NVUxfT1AyX0lOVF9CSVRTKSwgMSArIEFWUjMyX0Y2NF9NVUxfT1AyX0lOVF9CSVRTIC8qIEluc2VydCBpbXBsaWNpdCBiaXQgKi8KKworMjM6ICAgICAKKyAKKyAgICAgICAgLyogQ2hlY2sgaWYgYW55IG9wZXJhbmRzIGFyZSBOYU4gb3IgSU5GICovCisgICAgICAgIGNwICAgICAgcjcsIDB4N2ZmCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mNjRfbXVsX29wX25hbl9vcl9pbmYgLyogQ2hlY2sgb3AxIGZvciBOYU4gb3IgSW5mICovCisgICAgICAgIGNwICAgICAgcjYsIDB4N2ZmCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mNjRfbXVsX29wX25hbl9vcl9pbmYgIC8qIENoZWNrIG9wMiBmb3IgTmFOIG9yIEluZiAqLworIAorIAorICAgICAgICAvKiBDYWxjdWxhdGUgbmV3IGV4cG9uZW50IGluIHIxMiovCisgICAgICAgIGFkZCAgICAgcjEyLCByNywgcjYKKyAgICAgICAgc3ViICAgICByMTIsICgxMDIzLTEpCisgCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9tdWwpCisJLyogRG8gdGhlIG11bHRpcGxpY2F0aW9uLgorICAgICAgICAgICBQbGFjZSByZXN1bHQgaW4gW3IxMSwgcjEwLCByNywgcjZdLiBUaGUgcmVzdWx0IGlzIGluIDExLjExNyBmb3JtYXQuICAqLworICAgICAgICBtdWx1LmQgIHI0LCByMTEsIHI4CisgICAgICAgIG1hY3UuZCAgcjQsIHIxMCwgcjkKKyAgICAgICAgbXVsdS5kICByNiwgcjEwLCByOAorICAgICAgICBtdWx1LmQgIHIxMCwgcjExLCByOQorCWFkZAlyNywgcjQKKwlhZGMJcjEwLCByMTAsIHI1CQorCWFjcglyMTEKKyNlbHNlCisJLyogRG8gdGhlIG11bHRpcGxpY2F0aW9uIHVzaW5nIGFwcHJveGltYXRlIGNhbGN1bGF0aW9uLiBkaXNjYXJkIHRoZSBhbCB4IGJsCisJICAgY2FsY3VsYXRpb24uCisgICAgICAgICAgIFBsYWNlIHJlc3VsdCBpbiBbcjExLCByMTAsIHI3XS4gVGhlIHJlc3VsdCBpcyBpbiAxMS44NSBmb3JtYXQuICAqLworCisgICAgICAgIC8qIERvIHRoZSBtdWx0aXBsaWNhdGlvbiB1c2luZyBhcHByb3hpbWF0ZSBjYWxjdWxhdGlvbi4KKyAgICAgICAgIFBsYWNlIHJlc3VsdCBpbiByMTEsIHIxMC4gVXNlIHI3LCByNiBhcyBzY3JhdGNoIHJlZ2lzdGVycyAqLworICAgICAgICBtdWx1LmQgIHI2LCByMTEsIHI4CisgICAgICAgIG1hY3UuZCAgcjYsIHIxMCwgcjkKKyAgICAgICAgbXVsdS5kICByMTAsIHIxMSwgcjkKKyAgICAgICAgYWRkICAgICByMTAsIHI3CisgICAgICAgIGFjciAgICAgcjExCisjZW5kaWYgCisgICAgICAgIC8qIEFkanVzdCBleHBvbmVudCBhbmQgbWFudGlzc2EgKi8KKyAgICAgICAgLyogW3IxMl06ZXhwLCBbcjExLCByMTBdOm1hbnQgW3I3LCByNl06c3RpY2t5IGJpdHMgKi8KKyAgICAgICAgLyogTWFudGlzc2EgbWF5IGJlIG9mIHRoZSBmb3JtYXQgMDAwMDAwMDAwMDAuMHh4eCBvciAwMDAwMDAwMDAwMC4xeHh4LiAqLworICAgICAgICAvKiBJbiB0aGUgZmlyc3QgY2FzZSwgc2hpZnQgb25lIHBvcyB0byBsZWZ0LiovCisgICAgICAgIGJsZCAgICAgcjExLCAzMi1BVlIzMl9GNjRfTVVMX1JFU19JTlRfQklUUy0xCisJYnJlcQkwZgkKKwlsc2wJcjcsIDEKKwlyb2wJcjEwCisJcm9sCXIxMQorCXN1YglyMTIsIDEKKzA6CQorICAgICAgICBjcCAgICAgIHIxMiwgMCAgCisgICAgICAgIGJybGUgICAgX19hdnIzMl9mNjRfbXVsX3Jlc19zdWJub3JtYWwgLypSZXN1bHQgd2FzIHN1Ym5vcm1hbC4qLworIAorICAgICAgICAvKiBDaGVjayBmb3IgSW5mLiAqLworICAgICAgICBjcC53ICAgIHIxMiwgMHg3ZmYKKyAgICAgICAgYnJnZSAgICBfX2F2cjMyX2Y2NF9tdWxfcmVzX2luZgorCisJLyogSW5zZXJ0IGV4cG9uZW50LiAqLworCWJmaW5zCXIxMSwgcjEyLCAyMCwgMTEgIAorCisgICAgICAgIC8qIFJlc3VsdCB3YXMgbm90IHN1Ym5vcm1hbC4gUGVyZm9ybSByb3VuZGluZy4gKi8KKyAgICAgICAgLyogRm9yIHRoZSBmYXN0IHZlcnNpb24gd2UgZGlzY2FyZCB0aGUgc3RpY2t5IGJpdHMgYW5kIGFsd2F5cyByb3VuZAorCSAgIHRoZSBoYWxmd2F5Y2FzZSB1cC4gKi8KKzI0OgkKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjY0X211bCkKKwlvcglyNiwgcjYsIHIxMCA8PCAzMSAvKiBPciBpbiBwYXJpdHkgYml0IGludG8gc3RpY2t5Yml0cyAqLworCW9yCXI3LCByNywgcjYgPj4gMSAgIC8qIE9yIHRvZ2V0aGVyIHN0aWNreSBhbmQgc3RpbGwgbWFrZSB0aGUgbXNiIAorCQkJCSAgICAgb2YgcjcgcmVwcmVzZW50IHRoZSBoYWxmd2F5IGJpdC4gKi8KKwllb3JoCXI3LCAweDgwMDAJICAvKiBUb2dnbGUgaGFsZndheSBiaXQuICovCisJLyogV2Ugc2hvdWxkIG5vdyByb3VuZCB1cCBieSBhZGRpbmcgb25lIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOgorCisJCWhhbGZ3YXkgICBzdGlja3l8cGFyaXR5ICByb3VuZC11cAorCQkgICAwICAgICAgICAgICAgeCAgICAgICAgICAgbm8KKwkJICAgMSAgICAgICAgICAgIDAgICAgICAgICAgIG5vCisJICAgICAgICAgICAxICAgICAgICAgICAgMSAgICAgICAgICAgeWVzCisKKwkgICBTaW5jZSB3ZSBoYXZlIGludmVydGVkIHRoZSBoYWxmd2F5IGJpdCB3ZSBjYW4gdXNlIHRoZSBzYXR1IGluc3RydWN0aW9uCisgICAgICAgICAgIGJ5IHNhdHVyYXRpbmcgdG8gMSBiaXQgdG8gaW1wbGVtZW50IHRoaXMuIAorCSovIAorCXNhdHUJcjcgPj4gMCwgMQorI2Vsc2UKKwlsc3IJcjcsIDMxCisjZW5kaWYJCisJYWRkCXIxMCwgcjcKKwlhY3IJcjExCQorICAgICAgICAKKyAgICAgICAgLyogSW5zZXJ0IHNpZ24gYml0Ki8KKyAgICAgICAgYmxkICAgICBsciwgMzEKKyAgICAgICAgYnN0ICAgICByMTEsIDMxCisgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gcmVzdWx0IGluIFtyMTEscjEwXSAqLworI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfbXVsKQorCXBvcG0JcjQtcjcsIHBjCisjZWxzZQorICAgICAgICBsZG0gICAgIHNwKyssIHI1LCByNiwgcjcscGMKKyNlbmRpZgorIAorIAorX19hdnIzMl9mNjRfbXVsX29wMV9zdWJub3JtYWw6CisJYW5kaAlyMTEsIDB4MDAwZiAvKiBSZW1vdmUgc2lnbiBiaXQgYW5kIGV4cG9uZW50ICovCisgICAgICAgIGNseiAgICAgcjEyLCByMTAgICAgLyogQ291bnQgbGVhZGluZyB6ZXJvcyBpbiBsc3cgKi8KKyAgICAgICAgY2x6ICAgICByNiwgcjExICAgICAvKiBDb3VudCBsZWFkaW5nIHplcm9zIGluIG1zdyAqLworICAgICAgICBzdWJjcwlyMTIsIC0zMiArIEFWUjMyX0Y2NF9NVUxfT1AxX0lOVF9CSVRTIAorCW1vdmNzCXI2LCByMTIKKwlzdWJjYwlyNiwgQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMKKwljcC53CXI2LCAzMgorCWJyZ2UJMGYKKwkJCisgICAgICAgIC8qIHNoaWZ0aW5nIGludm9sdmVzIGJvdGggbXN3IGFuZCBsc3cqLworICAgICAgICByc3ViICAgIHIxMiwgcjYsIDMyICAvKiBzaGlmdCBtYW50aXNzYSAqLworICAgICAgICBsc2wgICAgIHIxMSwgcjExLCByNgorICAgICAgICBsc3IgICAgIHIxMiwgcjEwLCByMTIKKyAgICAgICAgb3IgICAgICByMTEsIHIxMgorICAgICAgICBsc2wgICAgIHIxMCwgcjEwLCByNgorCXN1YglyNiwgMTItQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMKKyAgICAgICAgc3ViICAgICByNywgcjYgICAgICAgICAgLyogYWRqdXN0IGV4cG9uZW50ICovCisgICAgICAgIHJqbXAgICAgMjJiICAgICAgICAgICAgIC8qIEZpbmlzaGVkICovICAKKzA6CisgICAgICAgIC8qIG1zdyBpcyB6ZXJvIHNvIG9ubHkgbmVlZCB0byBjb25zaWRlciBsc3cgKi8KKyAgICAgICAgbHNsICAgICByMTEsIHIxMCwgcjYKKwlicmVxCV9fYXZyMzJfZjY0X211bF9yZXNfemVybworICAgICAgICBtb3YgICAgIHIxMCwgMAorCXN1YglyNiwgMTItQVZSMzJfRjY0X01VTF9PUDFfSU5UX0JJVFMKKyAgICAgICAgc3ViICAgICByNywgcjYgICAgICAgICAgICAvKiBhZGp1c3QgZXhwb25lbnQgKi8KKyAgICAgICAgcmptcCAgICAyMmIKKworIAorX19hdnIzMl9mNjRfbXVsX29wMl9zdWJub3JtYWw6CisJYW5kaAlyOSwgMHgwMDBmICAvKiBSZW1vdmUgc2lnbiBiaXQgYW5kIGV4cG9uZW50ICovCisgICAgICAgIGNseiAgICAgcjEyLCByOCAgICAvKiBDb3VudCBsZWFkaW5nIHplcm9zIGluIGxzdyAqLworICAgICAgICBjbHogICAgIHI1LCByOSAgICAgLyogQ291bnQgbGVhZGluZyB6ZXJvcyBpbiBtc3cgKi8KKyAgICAgICAgc3ViY3MJcjEyLCAtMzIgKyBBVlIzMl9GNjRfTVVMX09QMl9JTlRfQklUUyAKKwltb3ZjcwlyNSwgcjEyCisJc3ViY2MJcjUsIEFWUjMyX0Y2NF9NVUxfT1AyX0lOVF9CSVRTCisJY3AudwlyNSwgMzIKKwlicmdlCTBmCisJCQorICAgICAgICAvKiBzaGlmdGluZyBpbnZvbHZlcyBib3RoIG1zdyBhbmQgbHN3Ki8KKyAgICAgICAgcnN1YiAgICByMTIsIHI1LCAzMiAgLyogc2hpZnQgbWFudGlzc2EgKi8KKyAgICAgICAgbHNsICAgICByOSwgcjksIHI1CisgICAgICAgIGxzciAgICAgcjEyLCByOCwgcjEyCisgICAgICAgIG9yICAgICAgcjksIHIxMgorICAgICAgICBsc2wgICAgIHI4LCByOCwgcjUKKwlzdWIJcjUsIDEyIC0gQVZSMzJfRjY0X01VTF9PUDJfSU5UX0JJVFMKKyAgICAgICAgc3ViICAgICByNiwgcjUgICAgICAgICAgLyogYWRqdXN0IGV4cG9uZW50ICovCisgICAgICAgIHJqbXAgICAgMjNiICAgICAgICAgICAgIC8qIEZpbmlzaGVkICovICAKKzA6CisgICAgICAgIC8qIG1zdyBpcyB6ZXJvIHNvIG9ubHkgbmVlZCB0byBjb25zaWRlciBsc3cgKi8KKyAgICAgICAgbHNsICAgICByOSwgcjgsIHI1CisJYnJlcQlfX2F2cjMyX2Y2NF9tdWxfcmVzX3plcm8KKyAgICAgICAgbW92ICAgICByOCwgMAorCXN1YglyNSwgMTIgLSBBVlIzMl9GNjRfTVVMX09QMl9JTlRfQklUUworICAgICAgICBzdWIgICAgIHI2LCByNSAgICAgICAgICAgIC8qIGFkanVzdCBleHBvbmVudCAqLworICAgICAgICByam1wICAgIDIzYgorICAgICAgICAgICAgICAgIAorIAorX19hdnIzMl9mNjRfbXVsX29wX25hbl9vcl9pbmY6CisgICAgICAgIC8qIFNhbWUgY29kZSBmb3IgT1AxIGFuZCBPUDIqLworICAgICAgICAvKiBTaW5jZSB3ZSBhcmUgaGVyZSwgYXQgbGVhc3Qgb25lIG9mIHRoZSBPUHMgd2VyZSBOYU4gb3IgSU5GKi8KKwlhbmRoCXI5LCAweDAwMGYgIC8qIFJlbW92ZSBzaWduIGJpdCBhbmQgZXhwb25lbnQgKi8KKwlhbmRoCXIxMSwgMHgwMDBmICAvKiBSZW1vdmUgc2lnbiBiaXQgYW5kIGV4cG9uZW50ICovCisgICAgICAgIC8qIE1lcmdlIHRoZSByZWdzIGluIGVhY2ggb3BlcmFuZCB0byBjaGVjayBmb3IgemVybyovCisgICAgICAgIG9yICAgICAgcjExLCByMTAgLyogb3AxICovCisgICAgICAgIG9yICAgICAgcjksIHI4IC8qIG9wMiAqLworICAgICAgICAvKiBDaGVjayBpZiBvcDEgaXMgTmFOIG9yIElORiAqLworICAgICAgICBjcCAgICAgIHI3LCAweDdmZgorICAgICAgICBicm5lICAgIF9fYXZyMzJfZjY0X211bF9vcDFfbm90X25hbmluZgorICAgICAgICAvKiBvcDEgd2FzIE5hTiBvciBJTkYuKi8KKyAgICAgICAgY3AgICAgICByMTEsIDAKKyAgICAgICAgYnJuZSAgICBfX2F2cjMyX2Y2NF9tdWxfcmVzX25hbiAvKiBvcDEgd2FzIE5hTi4gUmVzdWx0IHdpbGwgYmUgTmFOKi8KKyAgICAgICAgLypvcDEgd2FzIElORi4gY2hlY2sgaWYgb3AyIGlzIE5hTiBvciBJTkYqLworICAgICAgICBjcCAgICAgIHI2LCAweDdmZgorICAgICAgICBicm5lICAgIF9fYXZyMzJfZjY0X211bF9yZXNfaW5mIC8qb3AxIHdhcyBJTkYsIG9wMiB3YXMgbmVpdGhlciBOYU4gbm9yIElORiovCisgICAgICAgIC8qIG9wMSBpcyBJTkYsIG9wMiBpcyBlaXRoZXIgTmFOIG9yIElORiovCisgICAgICAgIGNwICAgICAgcjksIDAKKyAgICAgICAgYnJlcSAgICBfX2F2cjMyX2Y2NF9tdWxfcmVzX2luZiAvKm9wMiB3YXMgYWxzbyBJTkYqLworICAgICAgICByam1wICAgIF9fYXZyMzJfZjY0X211bF9yZXNfbmFuIC8qb3AyIHdhcyBOYU4qLworIAorX19hdnIzMl9mNjRfbXVsX29wMV9ub3RfbmFuaW5mOgorICAgICAgICAvKiBvcDEgd2FzIG5vdCBOYU4gbm9yIElORi4gVGhlbiBvcDIgbXVzdCBiZSBOYU4gb3IgSU5GKi8KKyAgICAgICAgY3AgICAgICByOSwgMAorICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X211bF9yZXNfaW5mIC8qb3AyIHdhcyBJTkYsIHJldHVybiBJTkYqLworICAgICAgICByam1wICAgX19hdnIzMl9mNjRfbXVsX3Jlc19uYW4gLyplbHNlIHJldHVybiBOYU4qLworICAgICAgICAKK19fYXZyMzJfZjY0X211bF9yZXNfc3Vibm9ybWFsOi8qIE11bHRpcGx5IHJlc3VsdCB3YXMgc3Vibm9ybWFsLiAqLworI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfbXVsKQorCS8qIENoZWNrIGhvdyBtdWNoIHdlIG11c3Qgc2NhbGUgZG93biB0aGUgbWFudGlzc2EuICovCisJbmVnCXIxMgorCXN1YglyMTIsIC0xICAgICAvKiBXZSBkbyBubyBsb25nZXIgaGF2ZSBhbiBpbXBsaWNpdCBiaXQuICovCisJc2F0dQlyMTIgPj4gMCwgNiAvKiBTYXR1cmF0ZSBzaGlmdCBhbW91bnQgdG8gbWF4IDYzLiAqLworCWNwLncJcjEyLCAzMgorCWJyZ2UJMGYKKwkvKiBTaGlmdCBhbW91bnQgPDMyICovCisJcnN1YglyOCwgcjEyLCAzMgorCW9yCXI2LCByNyAKKwlsc3IJcjcsIHI3LCByMTIKKwlsc2wJcjksIHIxMCwgcjgKKwlvcglyNywgcjkKKwlsc3IJcjEwLCByMTAsIHIxMgorCWxzbAlyOSwgcjExLCByOAorCW9yCXIxMCwgcjkKKwlsc3IJcjExLCByMTEsIHIxMgorCXJqbXAJMjRiCiswOgorCS8qIFNoaWZ0IGFtb3VudCA+PTMyICovCisJcnN1YglyOCwgcjEyLCAzMgorCW1vdmVxCXI5LCAwCisJYnJlcQkwZgorCWxzbAlyOSwgcjExLCByOAorMDoJCisJb3IJcjYsIHI3CisJb3IJcjYsIHI2LCByMTAgPDwgMSAKKwlsc3IJcjEwLCByMTAsIHIxMgorCW9yCXI3LCByOSwgcjEwCisJbHNyCXIxMCwgcjExLCByMTIKKwltb3YJcjExLCAwCQorCXJqbXAJMjRiCQkJCQorI2Vsc2UKKwkvKiBGbHVzaCB0byB6ZXJvIGZvciB0aGUgZmFzdCB2ZXJzaW9uLiAqLworICAgICAgICBtb3YgICAgIHIxMSwgbHIgLypHZXQgY29ycmVjdCBzaWduKi8KKyAgICAgICAgYW5kaCAgICByMTEsIDB4ODAwMCwgQ09ICisgICAgICAgIG1vdiAgICAgcjEwLCAwCisgICAgICAgIGxkbSAgICAgc3ArKywgcjUsIHI2LCByNyxwYworI2VuZGlmCisKK19fYXZyMzJfZjY0X211bF9yZXNfemVybzovKiBNdWx0aXBseSByZXN1bHQgaXMgemVyby4gKi8KKyAgICAgICAgbW92ICAgICByMTEsIGxyIC8qR2V0IGNvcnJlY3Qgc2lnbiovCisgICAgICAgIGFuZGggICAgcjExLCAweDgwMDAsIENPSAorICAgICAgICBtb3YgICAgIHIxMCwgMAorI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfbXVsKQorCXBvcG0JcjQtcjcsIHBjCisjZWxzZQorICAgICAgICBsZG0gICAgIHNwKyssIHI1LCByNiwgcjcscGMKKyNlbmRpZgorIAorX19hdnIzMl9mNjRfbXVsX3Jlc19uYW46ICAgICAgICAvKiBSZXR1cm4gTmFOLiAqLworICAgICAgICBtb3YgICAgIHIxMSwgLTEKKyAgICAgICAgbW92ICAgICByMTAsIC0xCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9tdWwpCisJcG9wbQlyNC1yNywgcGMKKyNlbHNlCisgICAgICAgIGxkbSAgICAgc3ArKywgcjUsIHI2LCByNyxwYworI2VuZGlmCisgICAgICAgIAorX19hdnIzMl9mNjRfbXVsX3Jlc19pbmY6ICAgICAgICAvKiBSZXR1cm4gSU5GLiAqLworCW1vdglyMTEsIDB4ZmZmMDAwMDAKKyAgICAgICAgYmxkICAgICBsciwgMzEKKyAgICAgICAgYnN0ICAgICByMTEsIDMxCisgICAgICAgIG1vdiAgICAgcjEwLCAwCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9tdWwpCisJcG9wbQlyNC1yNywgcGMKKyNlbHNlCisgICAgICAgIGxkbSAgICAgc3ArKywgcjUsIHI2LCByNyxwYworI2VuZGlmCisKK19fYXZyMzJfZjY0X211bF9vcDFfemVybzoKKyAgICAgICAgLyogR2V0IHNpZ24gKi8KKyAgICAgICAgZW9yICAgICByMTEsIHIxMSwgcjkKKyAgICAgICAgYW5kaCAgICByMTEsIDB4ODAwMCwgQ09IICAKKyAgICAgICAgLyogQ2hlY2sgaWYgb3AyIGlzIEluZiBvciBOYU4uICovCisgICAgICAgIGJmZXh0dSAgcjEyLCByOSwgMjAsIDExCisgICAgICAgIGNwLncgICAgcjEyLCAweDdmZgorICAgICAgICByZXRuZSAgIHIxMiAgICAgLyogUmV0dXJuIDAuMCAqLworICAgICAgICAvKiBSZXR1cm4gTmFOICovCisgICAgICAgIG1vdiAgICAgcjEwLCAtMQorICAgICAgICBtb3YgICAgIHIxMSwgLTEKKyAgICAgICAgcmV0ICAgICByMTIKKyAgICAgICAgIAorCisgCisjZW5kaWYKKyAgICAgICAgICAgICAgICAKKyAKKyNpZiAgZGVmaW5lZChMX2F2cjMyX2Y2NF9hZGRzdWIpIHx8IGRlZmluZWQoTF9hdnIzMl9mNjRfYWRkc3ViX2Zhc3QpCisgICAgICAgIC5hbGlnbiAgMgorCitfX2F2cjMyX2Y2NF9zdWJfZnJvbV9hZGQ6CisgICAgICAgIC8qIFN3aXRjaCBzaWduIG9uIG9wMiAqLworICAgICAgICBlb3JoICAgIHI5LCAweDgwMDAKKworI2lmICBkZWZpbmVkKExfYXZyMzJfZjY0X2FkZHN1Yl9mYXN0KQorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjY0X3N1Yl9mYXN0CisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9zdWJfZmFzdCxAZnVuY3Rpb24KK19fYXZyMzJfZjY0X3N1Yl9mYXN0OgorI2Vsc2UJCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mNjRfc3ViCisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9zdWIsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9zdWI6CisjZW5kaWYKKyAgICAgICAgCisgICAgICAgIC8qIG9wMSBpbiB7cjExLHIxMH0qLworICAgICAgICAvKiBvcDIgaW4ge3I5LHI4fSovCisKKyNpZiAgZGVmaW5lZChMX2F2cjMyX2Y2NF9hZGRzdWJfZmFzdCkKKyAgICAgICAgLyogSWYgb3AyIGlzIHplcm8ganVzdCByZXR1cm4gb3AxICovCisgICAgICAgIG9yICAgICAgcjEyLCByOCwgcjkgPDwgMQorICAgICAgICByZXRlcSAgIHIxMiAKKyNlbmRpZgorIAorICAgICAgICAvKiBDaGVjayBzaWducyAqLworICAgICAgICBlb3IgICAgIHIxMiwgcjExLCByOQorICAgICAgICAvKiBEaWZmZXJlbnQgc2lnbnMsIHVzZSBhZGRpdGlvbi4gKi8KKyAgICAgICAgYnJtaSAgICBfX2F2cjMyX2Y2NF9hZGRfZnJvbV9zdWIKKyAKKyAgICAgICAgc3RtICAgICAtLXNwLCByNSwgcjYsIHI3LCBscgorIAorICAgICAgICAvKiBHZXQgc2lnbiBvZiBvcDEgaW50byByMTIgKi8KKyAgICAgICAgbW92ICAgICByMTIsIHIxMQorICAgICAgICBhbmRoICAgIHIxMiwgMHg4MDAwLCBDT0ggICAgICAgICAgICAgICAgCisgCisgICAgICAgIC8qIFJlbW92ZSBzaWduIGZyb20gb3BlcmFuZHMgKi8KKyAgICAgICAgY2JyICAgICByMTEsIDMxCisgICAgICAgIGNiciAgICAgcjksIDMxCisgCisgICAgICAgIC8qIFB1dCB0aGUgbGFyZ2VzdCBudW1iZXIgaW4gW3IxMSwgcjEwXQorICAgICAgICAgICBhbmQgdGhlIHNtYWxsZXN0IG51bWJlciBpbiBbcjksIHI4XSAqLworICAgICAgICBjcCAgICAgIHIxMCwgcjgKKyAgICAgICAgY3BjICAgICByMTEsIHI5CisgICAgICAgIGJyaHMgICAgMWYgLyogU2tpcCBzd2FwIGlmIG9wZXJhbmRzIGFscmVhZHkgY29ycmVjdGx5IG9yZGVyZWQqLworICAgICAgICAvKiBPcGVyYW5kcyB3ZXJlIG5vdCBjb3JyZWN0bHkgb3JkZXJlZCwgc3dhcCB0aGVtKi8KKyAgICAgICAgbW92ICAgICByNywgcjExCisgICAgICAgIG1vdiAgICAgcjExLCByOQorICAgICAgICBtb3YgICAgIHI5LCByNworICAgICAgICBtb3YgICAgIHI3LCByMTAKKyAgICAgICAgbW92ICAgICByMTAsIHI4CisgICAgICAgIG1vdiAgICAgcjgsIHI3CisgICAgICAgIGVvcmggICAgcjEyLCAweDgwMDAgLyogSW52ZXJ0IHNpZ24gaW4gcjEyKi8KKzE6ICAgICAgCisgICAgICAgIC8qIFVucGFjayBsYXJnZXN0IG9wZXJhbmQgLSBvcEggKi8gICAgICAKKyAgICAgICAgLyogZXhwOiByNyAqLworICAgICAgICAvKiBzZjogIHIxMSwgcjEwICovCisgICAgICAgIGxzciAgICAgcjcsIHIxMSwgMjAgLyogRXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICBsc2wgICAgIHIxMSwgMTEgLyogRXh0cmFjdCBtYW50aXNzYSwgbGVhdmUgcm9vbSBmb3IgaW1wbGljaXQgYml0ICovIAorICAgICAgICBvciAgICAgIHIxMSwgcjExLCByMTA+PjIxCisgICAgICAgIGxzbCAgICAgcjEwLCAxMQorICAgICAgICBzYnIgICAgIHIxMSwgMzEgLyogSW5zZXJ0IGltcGxpY2l0IGJpdCAqLworIAorICAgICAgICAKKyAgICAgICAgLyogVW5wYWNrIHNtYWxsZXN0IG9wZXJhbmQgLSBvcEwgKi8KKyAgICAgICAgLyogZXhwOiByNiAqLworICAgICAgICAvKiBzZjogIHI5LCByOCAqLworICAgICAgICBsc3IgICAgIHI2LCByOSwgMjAgLyogRXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X3N1Yl9vcExfc3Vibm9ybWFsIC8qIElmIGVpdGhlciB6ZXJvIG9yIHN1Ym5vcm1hbCAqLworICAgICAgICBsc2wgICAgIHI5LCAxMSAvKiBFeHRyYWN0IG1hbnRpc3NhLCBsZWF2ZSByb29tIGZvciBpbXBsaWNpdCBiaXQgKi8gCisgICAgICAgIG9yICAgICAgcjksIHI5LCByOD4+MjEKKyAgICAgICAgbHNsICAgICByOCwgMTEKKyAgICAgICAgc2JyICAgICByOSwgMzEgLyogSW5zZXJ0IGltcGxpY2l0IGJpdCAqLworIAorCitfX2F2cjMyX2Y2NF9zdWJfb3BMX3N1Ym5vcm1hbF9kb25lOiAgICAgCisgICAgICAgIC8qIG9wSCBpcyBOYU4gb3IgSW5mLiAqLworICAgICAgICBjcC53ICAgIHI3LCAweDdmZgorICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X3N1Yl9vcEhfbmFuX29yX2luZgorCisgICAgICAgIC8qIEdldCBzaGlmdCBhbW91bnQgdG8gc2NhbGUgbWFudGlzc2Egb2Ygb3AyLiAqLworICAgICAgICByc3ViICAgIHI2LCByNworICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X3N1Yl9zaGlmdF9kb25lIC8qIE5vIG5lZWQgdG8gc2hpZnQsIGV4cG9uZW50cyBhcmUgZXF1YWwqLworIAorICAgICAgICAvKiBTY2FsZSBtYW50aXNzYSBbcjksIHI4XSB3aXRoIGFtb3VudCBbcjZdLgorICAgICAgICBVc2VzIHNjcmF0Y2ggcmVnaXN0ZXJzIFtyNV0gYW5kIFtscl0uCisgICAgICAgIEluIElFRUUgbW9kZTpNdXN0IG5vdCBmb3JnZXQgdGhlIHN0aWNreSBiaXRzIHdlIGludGVuZCB0byBzaGlmdCBvdXQuICovCisgCisgICAgICAgIHJzdWIgICAgcjUscjYsMzIgLyogZ2V0ICgzMiAtIHNoaWZ0IGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBzaGlmdCBjb3VudCA+IDMyIHdlIGdldCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUsIGJ1dCB0aGF0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrIGFzIHdlbGwgaW4gdGhlIGNvZGUgYmVsb3cuKSAqLworIAorICAgICAgICBjcC53ICAgIHI2LDMyICAgICAgIC8qIGhhbmRsZSBzaGlmdHMgPj0gMzIgc2VwYXJhdGVseSAqLworICAgICAgICBicmhzICAgIF9fYXZyMzJfZjY0X3N1Yl9sb25nc2hpZnQKKyAKKyAgICAgICAgLyogc21hbGwgKDwzMikgc2hpZnQgYW1vdW50LCBib3RoIHdvcmRzIGFyZSBwYXJ0IG9mIHRoZSBzaGlmdAorICAgICAgICAgICBmaXJzdCByZW1lbWJlciB3aGV0aGVyIHBhcnQgdGhhdCBpcyBsb3N0IGNvbnRhaW5zIGFueSAxIGJpdHMgLi4uICovCisgICAgICAgIGxzbCAgICAgbHIscjgscjUgIC8qIHNoaWZ0IGF3YXkgYml0cyB0aGF0IGFyZSBwYXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG1hbnRpc3NhLiBvbmx5IHBhcnQgdGhhdCBnb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxyIGFyZSBiaXRzIHRoYXQgd2lsbCBiZSBsb3N0ICovCisgCisgICAgICAgIC8qIC4uLiBhbmQgbm93IHRvIHRoZSBhY3R1YWwgc2hpZnQgKi8KKyAgICAgICAgbHNsICAgICByNSxyOSxyNSAgLyogZ2V0IGJpdHMgZnJvbSBtc3cgZGVzdGluZWQgZm9yIGxzdyovCisgICAgICAgIGxzciAgICAgcjgscjgscjYgIC8qIHNoaWZ0IGRvd24gbHN3IG9mIG1hbnRpc3NhICovCisgICAgICAgIGxzciAgICAgcjkscjkscjYgIC8qIHNoaWZ0IGRvd24gbXN3IG9mIG1hbnRpc3NhICovCisgICAgICAgIG9yICAgICAgcjgscjUgICAgIC8qIGNvbWJpbmUgdGhlc2UgYml0cyB3aXRoIHByZXBhcmVkIGxzdyovCisjaWYgIGRlZmluZWQoTF9hdnIzMl9mNjRfYWRkc3ViKQorICAgICAgICBjcC53ICAgIGxyLDAgICAgICAvKiBpZiBhbnkgJzEnIGJpdCBpbiBwYXJ0IHdlIGxvc3QgLi4uKi8KKyAgICAgICAgc3JuZSAgICBscgorICAgICAgICBvciAgICAgIHI4LCBsciAgICAgLyogLi4uIHdlIG5lZWQgdG8gc2V0IHN0aWNreSBiaXQqLworI2VuZGlmCisgICAgICAgIAorX19hdnIzMl9mNjRfc3ViX3NoaWZ0X2RvbmU6ICAgICAKKyAgICAgICAgLyogTm93IHN1YnRyYWN0IHRoZSBtYW50aXNzYXMuICovCisgICAgICAgIHN1YiAgICAgcjEwLCByOAorICAgICAgICBzYmMgICAgIHIxMSwgcjExLCByOQorIAorICAgICAgICAvKiBOb3JtYWxpemUgdGhlIGV4cG9uZW50IGFuZCBtYW50aXNzYSBwYWlyIHN0b3JlZCBpbgorICAgICAgICBbcjExLHIxMF0gYW5kIGV4cG9uZW50IGluIFtyN10uIE5lZWRzIHR3byBzY3JhdGNoIHJlZ2lzdGVycyBbcjZdIGFuZCBbbHJdLiAqLworICAgICAgICBjbHogICAgIHI2LHIxMSAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB6ZXJvcyBpbiBoaWdoIGJpdHMgKi8KKyAgICAgICAgYnJlcSAgICBfX2F2cjMyX2Y2NF9zdWJfbG9uZ25vcm1hbGl6ZV9kb25lICAvKiBObyBuZWVkIGZvciBzY2FsaW5nIGlmIG5vIHplcm9zIGluIGhpZ2ggYml0cyAqLworICAgICAgICBicmNzICAgIF9fYXZyMzJfZjY0X3N1Yl9sb25nbm9ybWFsaXplCisgCisJCisgICAgICAgIC8qIHNoaWZ0IGFtb3VudCBpcyBzbWFsbGVyIHRoYW4gMzIsIGFuZCBpbnZvbHZlcyBib3RoIG1zdyBhbmQgbHN3Ki8KKyAgICAgICAgcnN1YiAgICBscixyNiwzMiAgLyogc2hpZnQgbWFudGlzc2EgKi8KKyAgICAgICAgbHNsICAgICByMTEscjExLHI2CisgICAgICAgIGxzciAgICAgbHIscjEwLGxyCisgICAgICAgIG9yICAgICAgcjExLGxyCisgICAgICAgIGxzbCAgICAgcjEwLHIxMCxyNgorIAorICAgICAgICBzdWIgICAgIHI3LHI2ICAgIC8qIGFkanVzdCBleHBvbmVudCAqLworICAgICAgICBicmxlICAgIF9fYXZyMzJfZjY0X3N1Yl9zdWJub3JtYWxfcmVzdWx0CitfX2F2cjMyX2Y2NF9zdWJfbG9uZ25vcm1hbGl6ZV9kb25lOiAgICAgCisgICAgICAgIAorI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfYWRkc3ViKQorICAgICAgICAvKiBJbnNlcnQgdGhlIGJpdHMgd2Ugd2lsbCByZW1vdmUgZnJvbSB0aGUgbWFudGlzc2EgcjlbMzE6MjFdICovCisgICAgICAgIGxzbCAgICAgcjksIHIxMCwgKDMyIC0gMTEpCisjZWxzZQorICAgICAgICAvKiBLZWVwIHRoZSBsYXN0IGJpdCBzaGlmdGVkIG91dC4gKi8KKyAgICAgICAgYmZleHR1ICByOSwgcjEwLCAxMCwgMQorI2VuZGlmCisgCisgICAgICAgIC8qIFBhY2sgZmluYWwgcmVzdWx0Ki8KKyAgICAgICAgLyogSW5wdXQ6IFtyN106ZXhwLCBbcjExLCByMTBdOm1hbnQsIFtyMTJdOnNpZ24gaW4gTVNCICovCisgICAgICAgIC8qIFJlc3VsdCBpbiBbcjExLHIxMF0gKi8KKyAgICAgICAgLyogSW5zZXJ0IG1hbnRpc3NhICovCisgICAgICAgIGxzciAgICAgcjEwLCAxMQorICAgICAgICBvciAgICAgIHIxMCwgcjEwLCByMTE8PDIxCisgICAgICAgIGxzciAgICAgcjExLCAxMQorICAgICAgICAvKiBJbnNlcnQgZXhwb25lbnQgYW5kIHNpZ24gYml0Ki8KKwliZmlucwlyMTEsIHI3LCAyMCwgMTEKKyAgICAgICAgb3IgICAgICByMTEsIHIxMgorICAgICAgICAKKyAgICAgICAgLyogUm91bmQgKi8gICAgIAorX19hdnIzMl9mNjRfc3ViX3JvdW5kOgorI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfYWRkc3ViKQorCW1vdl9pbW0JcjcsIDB4ODAwMDAwMDAKKyAgICAgICAgYmxkICAgICByMTAsIDAKKyAgICAgICAgc3VibmUgICByNywgLTEgIAorIAorICAgICAgICBjcC53ICAgIHI5LCByNworICAgICAgICBzcmhzICAgIHI5CisjZW5kaWYKKyAgICAgICAgYWRkICAgICByMTAsIHI5CisgICAgICAgIGFjciAgICAgcjExCisgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gcmVzdWx0IGluIFtyMTEscjEwXSAqLworICAgICAgICBsZG0gICAgIHNwKyssIHI1LCByNiwgcjcscGMKKyAKKyAKKyAKK19fYXZyMzJfZjY0X3N1Yl9vcExfc3Vibm9ybWFsOgorICAgICAgICAvKiBFeHRyYWN0IHRoZSBvZiBtYW50aXNzYSAqLworICAgICAgICBsc2wgICAgIHI5LCAxMSAvKiBFeHRyYWN0IG1hbnRpc3NhLCBsZWF2ZSByb29tIGZvciBpbXBsaWNpdCBiaXQgKi8gCisgICAgICAgIG9yICAgICAgcjksIHI5LCByOD4+MjEKKyAgICAgICAgbHNsICAgICByOCwgMTEKKyAKKyAgICAgICAgLyogU2V0IGV4cG9uZW50IHRvIDEgaWYgd2UgZG8gbm90IGhhdmUgYSB6ZXJvLiAqLworICAgICAgICBvciAgICAgIGxyLCByOSwgcjgKKyAgICAgICAgbW92bmUgICByNiwxCisJCisgICAgICAgIC8qIENoZWNrIGlmIG9wSCBpcyBhbHNvIHN1Ym5vcm1hbC4gSWYgc28sIGNsZWFyIGltcGxpY2l0IGJpdCBpbiByMTEqLworICAgICAgICByc3ViICAgIGxyLCByNywgMAorICAgICAgICBtb3ZlcSAgIHI3LDEKKyAgICAgICAgYnN0ICAgICByMTEsIDMxCisJCisgICAgICAgIC8qIENoZWNrIGlmIG9wMSBpcyB6ZXJvLCBpZiBzbyBzZXQgZXhwb25lbnQgdG8gMC4gKi8KKyAgICAgICAgb3IgICAgICBsciwgcjExLCByMTAKKyAgICAgICAgbW92ZXEgICByNywwCisJICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmptcCAgICBfX2F2cjMyX2Y2NF9zdWJfb3BMX3N1Ym5vcm1hbF9kb25lCisgCitfX2F2cjMyX2Y2NF9zdWJfb3BIX25hbl9vcl9pbmY6IAorICAgICAgICAvKiBDaGVjayBpZiBvcEggaXMgTmFOLCBpZiBzbyByZXR1cm4gTmFOICovCisgICAgICAgIGNiciAgICAgcjExLCAzMQorICAgICAgICBvciAgICAgIGxyLCByMTEsIHIxMAorICAgICAgICBicm5lICAgIF9fYXZyMzJfZjY0X3N1Yl9yZXR1cm5fbmFuCisgCisgICAgICAgIC8qIG9wSCBpcyBJbmYuICovCisgICAgICAgIC8qIENoZWNrIGlmIG9wTCBpcyBJbmYuIG9yIE5hTiAqLworICAgICAgICBjcC53ICAgIHI2LCAweDdmZgorICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X3N1Yl9yZXR1cm5fbmFuCisJLyogUmV0dXJuIGluZmluaXR5IHdpdGggY29ycmVjdCBzaWduLiAqLwkKKwlvciAgICAgIHIxMSwgcjEyLCByNyA8PCAyMAorICAgICAgICBsZG0gICAgIHNwKyssIHI1LCByNiwgcjcsIHBjLyogb3BMIG5vdCBJbmYgb3IgTmFOLCByZXR1cm4gb3BIICovCitfX2F2cjMyX2Y2NF9zdWJfcmV0dXJuX25hbjogICAgIAorICAgICAgICBtb3YgICAgIHIxMCwgLTEgLyogR2VuZXJhdGUgTmFOIGluIHIxMSwgcjEwICovCisgICAgICAgIG1vdiAgICAgcjExLCAtMQorICAgICAgICBsZG0gICAgIHNwKyssIHI1LCByNiwgcjcsIHBjLyogb3BMIEluZiBvciBOYU4sIHJldHVybiBOYU4gKi8KKyAKKyAKK19fYXZyMzJfZjY0X3N1Yl9zdWJub3JtYWxfcmVzdWx0OgorI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfYWRkc3ViKQorCS8qIENoZWNrIGhvdyBtdWNoIHdlIG11c3Qgc2NhbGUgZG93biB0aGUgbWFudGlzc2EuICovCisJbmVnCXI3CisJc3ViCXI3LCAtMSAgICAgLyogV2UgZG8gbm8gbG9uZ2VyIGhhdmUgYW4gaW1wbGljaXQgYml0LiAqLworCXNhdHUJcjcgPj4gMCwgNiAvKiBTYXR1cmF0ZSBzaGlmdCBhbW91bnQgdG8gbWF4IDYzLiAqLworCWNwLncJcjcsIDMyCisJYnJnZQkwZgorCS8qIFNoaWZ0IGFtb3VudCA8MzIgKi8KKwlyc3ViCXI4LCByNywgMzIKKwlsc2wJcjksIHIxMCwgcjgKKwlzcm5lCXI2CisJbHNyCXIxMCwgcjEwLCByNworCW9yCXIxMCwgcjYJCS8qIFN0aWNreSBiaXQgZnJvbSB0aGUKKwkJCQkgICBwYXJ0IHRoYXQgd2FzIHNoaWZ0ZWQgb3V0LiAqLworCWxzbAlyOSwgcjExLCByOAorCW9yCXIxMCwgcjEwLCByOQorCWxzcglyMTEsIHIxMCwgcjcKKwkvKiBTZXQgZXhwb25lbnQgKi8KKwltb3YJcjcsIDAKKwlyam1wCV9fYXZyMzJfZjY0X3N1Yl9sb25nbm9ybWFsaXplX2RvbmUKKzA6CisJLyogU2hpZnQgYW1vdW50ID49MzIgKi8KKwlyc3ViCXI4LCByNywgNjQKKwlsc2wJcjksIHIxMSwgcjgKKwlvcglyOSwgcjEwCisJc3JuZQlyNgorCWxzcglyMTAsIHIxMSwgcjcKKwlvcglyMTAsIHI2CQkvKiBTdGlja3kgYml0IGZyb20gdGhlCisJCQkJICAgcGFydCB0aGF0IHdhcyBzaGlmdGVkIG91dC4gKi8KKwltb3YJcjExLCAwCisJLyogU2V0IGV4cG9uZW50ICovCisJbW92CXI3LCAwCisJcmptcAlfX2F2cjMyX2Y2NF9zdWJfbG9uZ25vcm1hbGl6ZV9kb25lCisjZWxzZQorICAgICAgICAvKiBKdXN0IGZsdXNoIHN1Ym5vcm1hbHMgdG8gemVyby4gKi8KKyAgICAgICAgbW92ICAgICByMTAsIDAKKyAgICAgICAgbW92ICAgICByMTEsIDAKKyNlbmRpZgorICAgICAgICBsZG0gICAgIHNwKyssIHI1LCByNiwgcjcsIHBjCisgCitfX2F2cjMyX2Y2NF9zdWJfbG9uZ3NoaWZ0OgorICAgICAgICAvKiBsYXJnZSAoPj0zMikgc2hpZnQgYW1vdW50LCBvbmx5IGxzdyB3aWxsIGhhdmUgYml0cyBsZWZ0IGFmdGVyIHNoaWZ0LgorICAgICAgICAgICBub3RlIHRoYXQgc2hpZnQgb3BlcmF0aW9ucyB3aWxsIHVzZSAoKHNoaWZ0IGNvdW50PXI2KSBtb2QgMzIpIHNvCisgICAgICAgICAgIHdlIGRvIG5vdCBuZWVkIHRvIHN1YnRyYWN0IDMyIGZyb20gc2hpZnQgY291bnQuICovCisgICAgICAgIC8qIFNhdHVyYXRlIHRoZSBzaGlmdCBhbW91bnQgdG8gNjMuIElmIHRoZSBhbW91bnQKKyAgICAgICAgICAgaXMgYW55IGxhcmdlciBvcDIgaXMgaW5zaWduaWZpY2FudC4gKi8KKyAgICAgICAgc2F0dSAgICByNiA+PiAwLCA2CisJCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9hZGRzdWIpCisgICAgICAgIC8qIGZpcnN0IHJlbWVtYmVyIHdoZXRoZXIgcGFydCB0aGF0IGlzIGxvc3QgY29udGFpbnMgYW55IDEgYml0cyAuLi4gKi8KKwltb3ZlcQlsciwgcjgJICAgLyogSWYgc2hpZnQgYW1vdW50IGlzIDMyLCBubyBiaXRzIGZyb20gbXN3IGFyZSBsb3N0LiAqLworCWJyZXEJMGYKKyAgICAgICAgbHNsICAgICBscixyOSxyNSAgIC8qIHNhdmUgYWxsIGxvc3QgYml0cyBmcm9tIG1zdyAqLworICAgICAgICBvciAgICAgIGxyLHI4ICAgICAgLyogYWxzbyBzYXZlIGxvc3QgYml0cyAoYWxsKSBmcm9tIGxzdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93IGxyICE9IDAgaWYgd2UgbG9zZSBhbnkgYml0cyAqLworI2VuZGlmICAKKzA6CQorICAgICAgICAvKiAuLi4gYW5kIG5vdyB0byB0aGUgYWN0dWFsIHNoaWZ0ICovCisgICAgICAgIGxzciAgICAgcjgscjkscjYgICAvKiBNb3ZlIG1zdyB0byBsc3cgYW5kIHNoaWZ0LiAqLworICAgICAgICBtb3YgICAgIHI5LDAgICAgICAgLyogY2xlYXIgbXN3ICovCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9hZGRzdWIpCisgICAgICAgIGNwLncgICAgbHIsMCAgICAgICAvKiBpZiBhbnkgJzEnIGJpdCBpbiBwYXJ0IHdlIGxvc3QgLi4uKi8KKyAgICAgICAgc3JuZSAgICBscgorICAgICAgICBvciAgICAgIHI4LCBsciAgICAgIC8qIC4uLiB3ZSBuZWVkIHRvIHNldCBzdGlja3kgYml0Ki8KKyNlbmRpZgorICAgICAgICByam1wICAgIF9fYXZyMzJfZjY0X3N1Yl9zaGlmdF9kb25lCisgCitfX2F2cjMyX2Y2NF9zdWJfbG9uZ25vcm1hbGl6ZToKKyAgICAgICAgLyogc2hpZnQgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiAzMiAqLworICAgICAgICBjbHogICAgIHI2LHIxMCAgICAgIC8qIHNoaWZ0IG1hbnRpc3NhICovCisgICAgICAgIC8qIElmIHRoZSByZXN1bHRpbmcgbWFudGlzc2EgaXMgemVybyB0aGUgcmVzdWx0IGlzIAorICAgICAgICAgICB6ZXJvIHNvIGZvcmNlIGV4cG9uZW50IHRvIHplcm8uICovCisgICAgICAgIG1vdmNzICAgcjcsIDAKKyAgICAgICAgbW92Y3MgICByNiwgMAorICAgICAgICBtb3ZjcyAgIHIxMiwgMCAgLyogQWxzbyBjbGVhciBzaWduIGJpdC4gQSB6ZXJvIHJlc3VsdCBmcm9tIHN1YnRyYWN0aW9uCisJCQkgICBhbHdheXMgaXMgKzAuMCAqLworICAgICAgICBzdWJjYyAgIHI2LC0zMgorICAgICAgICBsc2wgICAgIHIxMSxyMTAscjYKKyAgICAgICAgbW92ICAgICByMTAsMAorICAgICAgICBzdWIgICAgIHI3LHI2ICAgICAgICAgIC8qIGFkanVzdCBleHBvbmVudCAqLworICAgICAgICBicmxlICAgIF9fYXZyMzJfZjY0X3N1Yl9zdWJub3JtYWxfcmVzdWx0CisgICAgICAgIHJqbXAgICAgX19hdnIzMl9mNjRfc3ViX2xvbmdub3JtYWxpemVfZG9uZQorICAgICAgICAKKyAKKyAgICAgICAgCisJIC5hbGlnbiAgMgorX19hdnIzMl9mNjRfYWRkX2Zyb21fc3ViOgorICAgICAgICAvKiBTd2l0Y2ggc2lnbiBvbiBvcDIgKi8KKyAgICAgICAgZW9yaCAgICByOSwgMHg4MDAwCisKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjY0X2FkZHN1Yl9mYXN0KQorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjY0X2FkZF9mYXN0CisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9hZGRfZmFzdCxAZnVuY3Rpb24KK19fYXZyMzJfZjY0X2FkZF9mYXN0OgorI2Vsc2UJCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mNjRfYWRkCisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9hZGQsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9hZGQ6CisjZW5kaWYKKyAgICAgICAgCisgICAgICAgIC8qIG9wMSBpbiB7cjExLHIxMH0qLworICAgICAgICAvKiBvcDIgaW4ge3I5LHI4fSovCisgCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9hZGRzdWJfZmFzdCkKKyAgICAgICAgLyogSWYgb3AyIGlzIHplcm8ganVzdCByZXR1cm4gb3AxICovCisgICAgICAgIG9yICAgICAgcjEyLCByOCwgcjkgPDwgMQorICAgICAgICByZXRlcSAgIHIxMiAKKyNlbmRpZgorCisgICAgICAgIC8qIENoZWNrIHNpZ25zICovCisgICAgICAgIGVvciAgICAgcjEyLCByMTEsIHI5CisgICAgICAgIC8qIERpZmZlcmVudCBzaWducywgdXNlIHN1YnRyYWN0aW9uLiAqLworICAgICAgICBicm1pICAgIF9fYXZyMzJfZjY0X3N1Yl9mcm9tX2FkZAorIAorICAgICAgICBzdG0gICAgIC0tc3AsIHI1LCByNiwgcjcsIGxyCisgCisgICAgICAgIC8qIEdldCBzaWduIG9mIG9wMSBpbnRvIHIxMiAqLworICAgICAgICBtb3YgICAgIHIxMiwgcjExCisgICAgICAgIGFuZGggICAgcjEyLCAweDgwMDAsIENPSCAgICAgICAgICAgICAgICAKKyAKKyAgICAgICAgLyogUmVtb3ZlIHNpZ24gZnJvbSBvcGVyYW5kcyAqLworICAgICAgICBjYnIgICAgIHIxMSwgMzEKKyAgICAgICAgY2JyICAgICByOSwgMzEKKyAKKyAgICAgICAgLyogUHV0IHRoZSBudW1iZXIgd2l0aCB0aGUgbGFyZ2VzdCBleHBvbmVudCBpbiBbcjExLCByMTBdCisgICAgICAgICAgIGFuZCB0aGUgbnVtYmVyIHdpdGggdGhlIHNtYWxsZXN0IGV4cG9uZW50IGluIFtyOSwgcjhdICovCisgICAgICAgIGNwICAgICAgcjExLCByOQorICAgICAgICBicmhzICAgIDFmIC8qIFNraXAgc3dhcCBpZiBvcGVyYW5kcyBhbHJlYWR5IGNvcnJlY3RseSBvcmRlcmVkICovCisgICAgICAgIC8qIE9wZXJhbmRzIHdlcmUgbm90IGNvcnJlY3RseSBvcmRlcmVkLCBzd2FwIHRoZW0gKi8KKyAgICAgICAgbW92ICAgICByNywgcjExCisgICAgICAgIG1vdiAgICAgcjExLCByOQorICAgICAgICBtb3YgICAgIHI5LCByNworICAgICAgICBtb3YgICAgIHI3LCByMTAKKyAgICAgICAgbW92ICAgICByMTAsIHI4CisgICAgICAgIG1vdiAgICAgcjgsIHI3CisxOiAgICAgIAorCW1vdglsciwgMCAvKiBTZXQgc3RpY2t5IGJpdHMgdG8gemVybyAqLworICAgICAgICAvKiBVbnBhY2sgbGFyZ2VzdCBvcGVyYW5kIC0gb3BIICovICAgICAgCisgICAgICAgIC8qIGV4cDogcjcgKi8KKyAgICAgICAgLyogc2Y6ICByMTEsIHIxMCAqLworCWJmZXh0dQlSNywgUjExLCAyMCwgMTEgLyogRXh0cmFjdCBleHBvbmVudCAqLworCWJmZXh0dQlyMTEsIHIxMSwgMCwgMjAgLyogRXh0cmFjdCBtYW50aXNzYSAqLworICAgICAgICBzYnIgICAgIHIxMSwgMjAgLyogSW5zZXJ0IGltcGxpY2l0IGJpdCAqLworIAorICAgICAgICAvKiBVbnBhY2sgc21hbGxlc3Qgb3BlcmFuZCAtIG9wTCAqLworICAgICAgICAvKiBleHA6IHI2ICovCisgICAgICAgIC8qIHNmOiAgcjksIHI4ICovCisJYmZleHR1CVI2LCBSOSwgMjAsIDExCS8qIEV4dHJhY3QgZXhwb25lbnQgKi8KKwlicmVxCV9fYXZyMzJfZjY0X2FkZF9vcDJfc3Vibm9ybWFsCisJYmZleHR1CXI5LCByOSwgMCwgMjAgICAvKiBFeHRyYWN0IG1hbnRpc3NhICovCisgICAgICAgIHNiciAgICAgcjksIDIwCQkvKiBJbnNlcnQgaW1wbGljaXQgYml0ICovCisKKzI6CQkgCisgICAgICAgIC8qIG9wSCBpcyBOYU4gb3IgSW5mLiAqLworICAgICAgICBjcC53ICAgIHI3LCAweDdmZgorICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X2FkZF9vcEhfbmFuX29yX2luZgorCisgICAgICAgIC8qIEdldCBzaGlmdCBhbW91bnQgdG8gc2NhbGUgbWFudGlzc2Egb2Ygb3AyLiAqLworICAgICAgICByc3ViICAgIHI2LCByNworICAgICAgICBicmVxICAgIF9fYXZyMzJfZjY0X2FkZF9zaGlmdF9kb25lIC8qIE5vIG5lZWQgdG8gc2hpZnQsIGV4cG9uZW50cyBhcmUgZXF1YWwqLworIAorICAgICAgICAvKiBTY2FsZSBtYW50aXNzYSBbcjksIHI4XSB3aXRoIGFtb3VudCBbcjZdLgorICAgICAgICBVc2VzIHNjcmF0Y2ggcmVnaXN0ZXJzIFtyNV0gYW5kIFtscl0uCisgICAgICAgIEluIElFRUUgbW9kZTpNdXN0IG5vdCBmb3JnZXQgdGhlIHN0aWNreSBiaXRzIHdlIGludGVuZCB0byBzaGlmdCBvdXQuICovCisgICAgICAgIHJzdWIgICAgcjUscjYsMzIgLyogZ2V0ICgzMiAtIHNoaWZ0IGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBzaGlmdCBjb3VudCA+IDMyIHdlIGdldCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUsIGJ1dCB0aGF0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrIGFzIHdlbGwgaW4gdGhlIGNvZGUgYmVsb3cuKSAqLworIAorICAgICAgICBjcC53ICAgIHI2LDMyICAgICAgIC8qIGhhbmRsZSBzaGlmdHMgPj0gMzIgc2VwYXJhdGVseSAqLworICAgICAgICBicmhzICAgIF9fYXZyMzJfZjY0X2FkZF9sb25nc2hpZnQKKyAKKyAgICAgICAgLyogc21hbGwgKDwzMikgc2hpZnQgYW1vdW50LCBib3RoIHdvcmRzIGFyZSBwYXJ0IG9mIHRoZSBzaGlmdAorICAgICAgICAgICBmaXJzdCByZW1lbWJlciB3aGV0aGVyIHBhcnQgdGhhdCBpcyBsb3N0IGNvbnRhaW5zIGFueSAxIGJpdHMgLi4uICovCisgICAgICAgIGxzbCAgICAgbHIscjgscjUgIC8qIHNoaWZ0IGF3YXkgYml0cyB0aGF0IGFyZSBwYXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG1hbnRpc3NhLiBvbmx5IHBhcnQgdGhhdCBnb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxyIGFyZSBiaXRzIHRoYXQgd2lsbCBiZSBsb3N0ICovCisgCisgICAgICAgIC8qIC4uLiBhbmQgbm93IHRvIHRoZSBhY3R1YWwgc2hpZnQgKi8KKyAgICAgICAgbHNsICAgICByNSxyOSxyNSAgLyogZ2V0IGJpdHMgZnJvbSBtc3cgZGVzdGluZWQgZm9yIGxzdyovCisgICAgICAgIGxzciAgICAgcjgscjgscjYgIC8qIHNoaWZ0IGRvd24gbHN3IG9mIG1hbnRpc3NhICovCisgICAgICAgIGxzciAgICAgcjkscjkscjYgIC8qIHNoaWZ0IGRvd24gbXN3IG9mIG1hbnRpc3NhICovCisgICAgICAgIG9yICAgICAgcjgscjUgICAgIC8qIGNvbWJpbmUgdGhlc2UgYml0cyB3aXRoIHByZXBhcmVkIGxzdyovCisgICAgICAgIAorX19hdnIzMl9mNjRfYWRkX3NoaWZ0X2RvbmU6ICAgICAKKyAgICAgICAgLyogTm93IGFkZCB0aGUgbWFudGlzc2FzLiAqLworICAgICAgICBhZGQgICAgIHIxMCwgcjgKKyAgICAgICAgYWRjICAgICByMTEsIHIxMSwgcjkKKworICAgICAgICAvKiBDaGVjayBpZiB3ZSBvdmVyZmxvd2VkLiAqLworCWJsZAlyMTEsIDIxIAorICAgICAgICBicmVxCV9fYXZyMzJfZjY0X2FkZF9yZXNfb2Y6CisKK19fYXZyMzJfZjY0X2FkZF9yZXNfb2ZfZG9uZTogICAgCisgICAgICAgIAorICAgICAgICAvKiBQYWNrIGZpbmFsIHJlc3VsdCovCisgICAgICAgIC8qIElucHV0OiBbcjddOmV4cCwgW3IxMSwgcjEwXTptYW50LCBbcjEyXTpzaWduIGluIE1TQiAqLworICAgICAgICAvKiBSZXN1bHQgaW4gW3IxMSxyMTBdICovCisgICAgICAgIC8qIEluc2VydCBleHBvbmVudCBhbmQgc2lnbiBiaXQqLworCWJmaW5zCXIxMSwgcjcsIDIwLCAxMQorCW9yCXIxMSwgcjEyCisgICAgICAgIAorICAgICAgICAvKiBSb3VuZCAqLyAgICAgCitfX2F2cjMyX2Y2NF9hZGRfcm91bmQ6CisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9hZGRzdWIpCisJYmZleHR1CXIxMiwgcjEwLCAwLCAxIC8qIEV4dHJhY3QgcGFyaXR5IGJpdC4qLworCW9yCWxyLCByMTIJICAgICAgIC8qIG9yIGl0IHRvZ2V0aGVyIHdpdGggdGhlIHN0aWNreSBiaXRzLiAqLwkKKwllb3JoCWxyLCAweDgwMDAgICAgIC8qIFRvZ2dsZSByb3VuZCBiaXQuICovCQorCS8qIFdlIHNob3VsZCBub3cgcm91bmQgdXAgYnkgYWRkaW5nIG9uZSBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczoKKworCQloYWxmd2F5ICAgc3RpY2t5fHBhcml0eSAgcm91bmQtdXAKKwkJICAgMCAgICAgICAgICAgIHggICAgICAgICAgIG5vCisJCSAgIDEgICAgICAgICAgICAwICAgICAgICAgICBubworCSAgICAgICAgICAgMSAgICAgICAgICAgIDEgICAgICAgICAgIHllcworCisJICAgU2luY2Ugd2UgaGF2ZSBpbnZlcnRlZCB0aGUgaGFsZndheSBiaXQgd2UgY2FuIHVzZSB0aGUgc2F0dSBpbnN0cnVjdGlvbgorICAgICAgICAgICBieSBzYXR1cmF0aW5nIHRvIDEgYml0IHRvIGltcGxlbWVudCB0aGlzLiAKKwkqLyAKKwlzYXR1CWxyID4+IDAsIDEKKyNlbHNlCisJbHNyCWxyLCAzMQorI2VuZGlmCisgICAgICAgIGFkZCAgICAgcjEwLCBscgorICAgICAgICBhY3IgICAgIHIxMQorICAgICAgICAKKyAgICAgICAgLyogUmV0dXJuIHJlc3VsdCBpbiBbcjExLHIxMF0gKi8KKyAgICAgICAgbGRtICAgICBzcCsrLCByNSwgcjYsIHI3LHBjCisgCisgIAorX19hdnIzMl9mNjRfYWRkX29wSF9uYW5fb3JfaW5mOiAKKyAgICAgICAgLyogQ2hlY2sgaWYgb3BIIGlzIE5hTiwgaWYgc28gcmV0dXJuIE5hTiAqLworICAgICAgICBjYnIgICAgIHIxMSwgMjAKKyAgICAgICAgb3IgICAgICBsciwgcjExLCByMTAKKyAgICAgICAgYnJuZSAgICBfX2F2cjMyX2Y2NF9hZGRfcmV0dXJuX25hbgorIAorICAgICAgICAvKiBvcEggaXMgSW5mLiAqLworICAgICAgICAvKiBDaGVjayBpZiBvcEwgaXMgSW5mLiBvciBOYU4gKi8KKyAgICAgICAgY3AudyAgICByNiwgMHg3ZmYKKyAgICAgICAgYnJlcSAgICBfX2F2cjMyX2Y2NF9hZGRfb3BMX25hbl9vcl9pbmYKKyAgICAgICAgbGRtICAgICBzcCsrLCByNSwgcjYsIHI3LCBwYy8qIG9wTCBub3QgSW5mIG9yIE5hTiwgcmV0dXJuIG9wSCAqLworX19hdnIzMl9mNjRfYWRkX29wTF9uYW5fb3JfaW5mOgorICAgICAgICBjYnIgICAgIHI5LCAyMAorICAgICAgICBvciAgICAgIGxyLCByOSwgcjgKKyAgICAgICAgYnJuZSAgICBfX2F2cjMyX2Y2NF9hZGRfcmV0dXJuX25hbgorICAgICAgICBtb3YgICAgIHIxMCwgMCAgLyogR2VuZXJhdGUgSW5mIGluIHIxMSwgcjEwICovCisJbW92X2ltbSByMTEsIDB4N2ZmMDAwMDAKKyAgICAgICAgbGRtICAgICBzcCsrLCByNSwgcjYsIHI3LCBwYy8qIG9wTCBJbmYsIHJldHVybiBJbmYgKi8KK19fYXZyMzJfZjY0X2FkZF9yZXR1cm5fbmFuOiAgICAgCisgICAgICAgIG1vdiAgICAgcjEwLCAtMSAvKiBHZW5lcmF0ZSBOYU4gaW4gcjExLCByMTAgKi8KKyAgICAgICAgbW92ICAgICByMTEsIC0xCisgICAgICAgIGxkbSAgICAgc3ArKywgcjUsIHI2LCByNywgcGMvKiBvcEwgSW5mIG9yIE5hTiwgcmV0dXJuIE5hTiAqLworIAorIAorX19hdnIzMl9mNjRfYWRkX2xvbmdzaGlmdDoKKyAgICAgICAgLyogbGFyZ2UgKD49MzIpIHNoaWZ0IGFtb3VudCwgb25seSBsc3cgd2lsbCBoYXZlIGJpdHMgbGVmdCBhZnRlciBzaGlmdC4KKyAgICAgICAgICAgbm90ZSB0aGF0IHNoaWZ0IG9wZXJhdGlvbnMgd2lsbCB1c2UgKChzaGlmdCBjb3VudD1yNikgbW9kIDMyKSBzbworICAgICAgICAgICB3ZSBkbyBub3QgbmVlZCB0byBzdWJ0cmFjdCAzMiBmcm9tIHNoaWZ0IGNvdW50LiAqLworICAgICAgICAvKiBTYXR1cmF0ZSB0aGUgc2hpZnQgYW1vdW50IHRvIDYzLiBJZiB0aGUgYW1vdW50CisgICAgICAgICAgIGlzIGFueSBsYXJnZXIgb3AyIGlzIGluc2lnbmlmaWNhbnQuICovCisgICAgICAgIHNhdHUgICAgcjYgPj4gMCwgNgorCS8qIElmIHNoaWZ0IGFtb3VudCBpcyAzMiB0aGVyZSBhcmUgbm8gYml0cyBmcm9tIHRoZSBtc3cgdGhhdCBhcmUgbG9zdC4gKi8KKwltb3ZlcQlsciwgcjgKKwlicmVxCTBmCQorICAgICAgICAvKiBmaXJzdCByZW1lbWJlciB3aGV0aGVyIHBhcnQgdGhhdCBpcyBsb3N0IGNvbnRhaW5zIGFueSAxIGJpdHMgLi4uICovCisgICAgICAgIGxzbCAgICAgbHIscjkscjUgICAvKiBzYXZlIGFsbCBsb3N0IGJpdHMgZnJvbSBtc3cgKi8KKyNpZiBkZWZpbmVkKExfYXZyMzJfZjY0X2FkZHN1YikKKwljcC53CXI4LCAwCisJc3JuZQlyOAkKKyAgICAgICAgb3IgICAgICBscixyOCAgICAgIC8qIGFsc28gc2F2ZSBsb3N0IGJpdHMgKGFsbCkgZnJvbSBsc3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyBsciAhPSAwIGlmIHdlIGxvc2UgYW55IGJpdHMgKi8KKyNlbmRpZiAgCiswOgkKKyAgICAgICAgLyogLi4uIGFuZCBub3cgdG8gdGhlIGFjdHVhbCBzaGlmdCAqLworICAgICAgICBsc3IgICAgIHI4LHI5LHI2ICAgLyogbXN3IC0+IGxzdyBhbmQgbWFrZSByZXN0IG9mIHNoaWZ0IGluc2lkZSBsc3cqLworICAgICAgICBtb3YgICAgIHI5LDAgICAgICAgLyogY2xlYXIgbXN3ICovCisgICAgICAgIHJqbXAgICAgX19hdnIzMl9mNjRfYWRkX3NoaWZ0X2RvbmUKKyAKK19fYXZyMzJfZjY0X2FkZF9yZXNfb2Y6CisJLyogV2Ugb3ZlcmZsb3dlZC4gU2NhbGUgZG93biBtYW50aXNzYSBieSBzaGlmdGluZyByaWdodCBvbmUgcG9zaXRpb24uICovCisJb3IJbHIsIGxyLCBsciA8PCAxIC8qIFJlbWVtYmVyIHN0aWNreWJpdHMqLworCWxzcglyMTEsIDEKKwlyb3IJcjEwCisJcm9yCWxyCisJc3ViCXI3LCAtMQkvKiBJbmNyZW1lbnQgZXhwb25lbnQgKi8KKyAKKyAgICAgICAgLyogQ2xlYXIgbWFudGlzc2EgdG8gc2V0IHJlc3VsdCB0byBJbmYgaWYgdGhlIGV4cG9uZW50IGlzIDI1NS4gKi8KKyAgICAgICAgY3AudyAgICByNywgMHg3ZmYKKyAgICAgICAgbW92ZXEgICByMTAsIDAKKyAgICAgICAgbW92ZXEgICByMTEsIDAKKyAgICAgICAgbW92ZXEgICBsciwgMAorICAgICAgICByam1wICAgIF9fYXZyMzJfZjY0X2FkZF9yZXNfb2ZfZG9uZQorICAgICAgICAKK19fYXZyMzJfZjY0X2FkZF9vcDJfc3Vibm9ybWFsOgkKKwkvKiBTZXQgZXB4cG9uZW50IHRvIDEgKi8KKwltb3YJcjYsIDEKKworCS8qIENoZWNrIGlmIG9wMiBpcyBhbHNvIHN1Ym5vcm1hbC4gKi8KKwljcC53CXI3LCAwCisJYnJuZQkyYgorCisJY2JyCXIxMSwgMjAKKwkvKiBCb3RoIG9wZXJhbmRzIGFyZSBzdWJub3JtYWwuIEp1c3QgYWRkZCB0aGUgbWFudGlzc2FzCisJICAgYW5kIHRoZSBleHBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2V0IHRvIDEgaWYKKwkgICB3ZSBvdmVyZmxvdyBpbnRvIGEgbm9ybWFsIG51bWJlci4gKi8KKwlhZGQJcjEwLCByOAorCWFkYwlyMTEsIHIxMSwgcjkKKworCS8qIEFkZCBzaWduIGJpdCAqLworCW9yCXIxMSwgcjEyCisJCisgICAgICAgIC8qIFJldHVybiByZXN1bHQgaW4gW3IxMSxyMTBdICovCisgICAgICAgIGxkbSAgICAgc3ArKywgcjUsIHI2LCByNyxwYworCQorCQkJCisJIAorI2VuZGlmCisgCisjaWZkZWYgTF9hdnIzMl9mNjRfdG9fdTMyCisgICAgICAgIC8qIFRoaXMgZ29lcyBpbnRvIExfZml4ZGZzaSAqLworI2VuZGlmCisgICAgICAgIAorIAorI2lmZGVmIExfYXZyMzJfZjY0X3RvX3MzMgorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjY0X3RvX3UzMgorICAgICAgICAudHlwZSAgX19hdnIzMl9mNjRfdG9fdTMyLEBmdW5jdGlvbgorX19hdnIzMl9mNjRfdG9fdTMyOgorICAgICAgICBjcC53ICAgIHIxMSwgMAorICAgICAgICByZXRtaSAgIDAgICAgICAgLyogTmVnYXRpdmUgcmV0dXJucyAwICovCisgCisgICAgICAgIC8qIEZhbGx0aHJvdWdoIHRvIGRmIHRvIHNpZ25lZCBzaSBjb252ZXJzaW9uICovIAorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjY0X3RvX3MzMgorICAgICAgICAudHlwZSAgX19hdnIzMl9mNjRfdG9fczMyLEBmdW5jdGlvbgorX19hdnIzMl9mNjRfdG9fczMyOgorICAgICAgICBsc2wgICAgIHIxMixyMTEsMQorICAgICAgICBsc3IgICAgIHIxMiwyMSAgICAgICAgICAgICAgICAgIC8qIGV4dHJhY3QgZXhwb25lbnQqLworICAgICAgICBzdWIgICAgIHIxMiwxMDIzICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gdW5iaWFzZWQgZXhwb25lbnQuKi8KKyAgICAgICAgcmV0bG8gICAwICAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gc21hbGwgZXhwb25lbnQgaW1wbGllcyB6ZXJvLiAqLworIAorMTogICAgICAKKyAgICAgICAgcnN1YiAgICByMTIscjEyLDMxICAgICAgICAgICAgICAvKiBzaGlmdCBjb3VudCA9IDMxIC0gZXhwb25lbnQgKi8KKyAgICAgICAgbW92ICAgICByOSxyMTEgICAgICAgICAgICAgICAgICAvKiBzYXZlIHNpZ24gZm9yIGxhdGVyLi4uKi8KKyAgICAgICAgbHNsICAgICByMTEsMTEgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgZXhwb25lbnQgYW5kIHNpZ24qLworICAgICAgICBzYnIgICAgIHIxMSwzMSAgICAgICAgICAgICAgICAgIC8qIGFkZCBpbXBsaWNpdCBiaXQqLworICAgICAgICBvciAgICAgIHIxMSxyMTEscjEwPj4yMSAgICAgICAgIC8qIGdldCByZXN0IG9mIGJpdHMgZnJvbSBsc3cgb2YgZG91YmxlICovCisgICAgICAgIGxzciAgICAgcjExLHIxMSxyMTIgICAgICAgICAgICAgLyogc2hpZnQgZG93biBtYW50aXNzYSB0byBmaW5hbCBwbGFjZSAqLworICAgICAgICBsc2wgICAgIHI5LDEgICAgICAgICAgICAgICAgICAgIC8qIHNpZ24gLT4gY2FycnkgKi8KKyAgICAgICAgcmV0Y2MgICByMTEgICAgICAgICAgICAgICAgICAgICAvKiBpZiBwb3NpdGl2ZSwgd2UgYXJlIGRvbmUgKi8KKyAgICAgICAgbmVnICAgICByMTEgICAgICAgICAgICAgICAgICAgICAvKiBpZiBuZWdhdGl2ZSBmbG9hdCwgbmVnYXRlIHJlc3VsdCAqLworICAgICAgICByZXQgICAgIHIxMQorIAorI2VuZGlmICAvKiBMX2ZpeGRmc2kqLworIAorI2lmZGVmIExfYXZyMzJfZjY0X3RvX3U2NAorICAgICAgICAvKiBBY3R1YWwgZnVuY3Rpb24gaXMgaW4gTF9maXhkZmRpICovCisjZW5kaWYKKyAgICAgICAgCisjaWZkZWYgTF9hdnIzMl9mNjRfdG9fczY0CisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mNjRfdG9fdTY0CisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF90b191NjQsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF90b191NjQ6CisgICAgICAgIGNwLncgICAgcjExLDAKKyAgICAgICAgLyogTmVnYXRpdmUgbnVtYmVycyByZXR1cm4gemVybyAqLworICAgICAgICBtb3ZtaSAgIHIxMCwgMAorICAgICAgICBtb3ZtaSAgIHIxMSwgMAorICAgICAgICByZXRtaSAgIHIxMQorIAorICAgICAgICAKKyAKKyAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX2Y2NF90b19zNjQKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjY0X3RvX3M2NCxAZnVuY3Rpb24KK19fYXZyMzJfZjY0X3RvX3M2NDoKKyAgICAgICAgbHNsICAgICByOSxyMTEsMQorICAgICAgICBsc3IgICAgIHI5LDIxICAgICAgICAgICAgICAgICAgIC8qIGdldCBleHBvbmVudCovCisgICAgICAgIHN1YiAgICAgcjksMTAyMyAgICAgICAgICAgICAgICAgLyogY29udmVydCB0byBjb3JyZWN0IHJhbmdlKi8KKyAgICAgICAgLyogUmV0dXJuIHplcm8gaWYgZXhwb25lbnQgdG8gc21hbGwgKi8KKyAgICAgICAgbW92bG8gICByMTAsIDAKKyAgICAgICAgbW92bG8gICByMTEsIDAKKyAgICAgICAgcmV0bG8gICByMTEKKyAKKyAgICAgICAgbW92ICAgICByOCxyMTEgICAgICAgICAgICAgICAgICAvKiBzYXZlIHNpZ24gZm9yIGxhdGVyLi4uKi8KKzE6ICAgICAgCisgICAgICAgIGxzbCAgICAgcjExLDExICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGV4cG9uZW50ICovCisgICAgICAgIHNiciAgICAgcjExLDMxICAgICAgICAgICAgICAgICAgLyogYWRkIGltcGxpY2l0IGJpdCovCisgICAgICAgIG9yICAgICAgcjExLHIxMSxyMTA+PjIxICAgICAgICAgLyogZ2V0IHJlc3Qgb2YgYml0cyBmcm9tIGxzdyBvZiBkb3VibGUqLworICAgICAgICBsc2wgICAgIHIxMCwxMSAgICAgICAgICAgICAgICAgIC8qIGFsaWduIGxzdyBjb3JyZWN0bHkgYXMgd2VsbCAqLworICAgICAgICByc3ViICAgIHI5LHI5LDYzICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGNvdW50ID0gNjMgLSBleHBvbmVudCAqLworICAgICAgICBicmVxICAgIDFmCisgCisgICAgICAgIGNwLncgICAgcjksMzIgICAgICAgICAgICAgICAgICAgLyogaXMgc2hpZnQgY291bnQgbW9yZSB0aGFuIG9uZSByZWc/ICovCisgICAgICAgIGJyaHMgICAgMGYKKyAKKyAgICAgICAgbW92ICAgICByMTIscjExICAgICAgICAgICAgICAgICAvKiBzYXZlIG1zdyAqLworICAgICAgICBsc3IgICAgIHIxMCxyMTAscjkgICAgICAgICAgICAgIC8qIHNtYWxsIHNoaWZ0IGNvdW50LCBzaGlmdCBkb3duIGxzdyAqLworICAgICAgICBsc3IgICAgIHIxMSxyMTEscjkgICAgICAgICAgICAgIC8qIHNtYWxsIHNoaWZ0IGNvdW50LCBzaGlmdCBkb3duIG1zdyAqLworICAgICAgICByc3ViICAgIHI5LHI5LDMyICAgICAgICAgICAgICAgIC8qIGdldCAzMi1zaXplIG9mIHNoaWZ0ZWQgb3V0IHRhaWwgKi8KKyAgICAgICAgbHNsICAgICByMTIscjEyLHI5ICAgICAgICAgICAgICAvKiBhbGlnbiBwYXJ0IHRvIG1vdmUgZnJvbSBtc3cgdG8gbHN3ICovCisgICAgICAgIG9yICAgICAgcjEwLHIxMiAgICAgICAgICAgICAgICAgLyogY29tYmluZSB0byBnZXQgbmV3IGxzdyAqLworICAgICAgICByam1wICAgIDFmCisgCiswOgorICAgICAgICBsc3IgICAgIHIxMCxyMTEscjkgICAgICAgICAgICAgIC8qIGxhcmdlIHNoaWZ0IGNvdW50LG9ubHkgbHN3IGdldCBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IHNoaWZ0IGNvdW50IGlzIG1vZHVsbyAzMiovCisgICAgICAgIG1vdiAgICAgcjExLDAgICAgICAgICAgICAgICAgICAgLyogbXN3IHdpbGwgYmUgMCAqLworIAorMToKKyAgICAgICAgbHNsICAgICByOCwxICAgICAgICAgICAgICAgICAgICAvKiBzaWduIC0+IGNhcnJ5ICovCisgICAgICAgIHJldGNjICAgcjExICAgICAgICAgICAgICAgICAgICAgLyogaWYgcG9zaXRpdmUsIHdlIGFyZSBkb25lICovCisgCisgICAgICAgIG5lZyAgICAgcjExICAgICAgICAgICAgICAgICAgICAgLyogaWYgbmVnYXRpdmUgZmxvYXQsIG5lZ2F0ZSByZXN1bHQgKi8KKyAgICAgICAgbmVnICAgICByMTAKKyAgICAgICAgc2NyICAgICByMTEKKyAgICAgICAgcmV0ICAgICByMTEgCisgCisjZW5kaWYKKyAKKyNpZmRlZiBMX2F2cjMyX3UzMl90b19mNjQKKyAgICAgICAgLyogQ29kZSBsb2NhdGVkIGluIExfZmxvYXRzaWRmICovCisjZW5kaWYKKyAgICAgICAgCisjaWZkZWYgTF9hdnIzMl9zMzJfdG9fZjY0CisgICAgICAgIC5nbG9iYWwgX19hdnIzMl91MzJfdG9fZjY0CisgICAgICAgIC50eXBlICBfX2F2cjMyX3UzMl90b19mNjQsQGZ1bmN0aW9uCitfX2F2cjMyX3UzMl90b19mNjQ6CisgICAgICAgIHN1YiAgICAgcjExLCByMTIsIDAgLyogTW92ZSB0byByMTEgYW5kIGZvcmNlIFogZmxhZyB0byBiZSB1cGRhdGVkICovCisgICAgICAgIG1vdiAgICAgcjEyLCAwICAgICAgLyogYWx3YXlzIHBvc2l0aXZlICovCisgICAgICAgIHJqbXAgICAgMGYgICAgICAgICAgLyogSnVtcCB0byBjb21tb24gY29kZSBmb3IgZmxvYXRzaWRmICovCisgICAgICAgIAorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfczMyX3RvX2Y2NAorICAgICAgICAudHlwZSAgX19hdnIzMl9zMzJfdG9fZjY0LEBmdW5jdGlvbgorX19hdnIzMl9zMzJfdG9fZjY0OgorICAgICAgICBtb3YgICAgIHIxMSwgcjEyICAgICAgICAvKiBLZWVwIG9yaWdpbmFsIHZhbHVlIGluIHIxMiBmb3Igc2lnbiAqLworICAgICAgICBhYnMgICAgIHIxMSAgICAgICAgICAgICAvKiBBYnNvbHV0ZSB2YWx1ZSBpZiByMTIgKi8KKzA6ICAgICAgCisgICAgICAgIG1vdiAgICAgcjEwLDAgICAgICAgICAgIC8qIGxldCByZW1haW5pbmcgYml0cyBiZSB6ZXJvICovCisgICAgICAgIHJldGVxICAgcjExICAgICAgICAgICAgIC8qIHplcm8gbG9uZyB3aWxsIHJldHVybiB6ZXJvIGZsb2F0ICovCisgCisgICAgICAgIHB1c2htICAgbHIKKyAgICAgICAgbW92ICAgICByOSwzMSsxMDIzICAgICAgICAgICAgICAvKiBzZXQgZXhwb25lbnQgKi8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgbm9ybWFsaXplX2RmICAgIHI5IC8qZXhwKi8sIHIxMCwgcjExIC8qIG1hbnRpc3NhICovLCByOCwgbHIgLyogc2NyYXRjaCAqLworIAorICAgICAgICAvKiBDaGVjayBpZiBhIHN1Ym5vcm1hbCByZXN1bHQgd2FzIGNyZWF0ZWQgKi8KKyAgICAgICAgY3AudyAgICByOSwgMAorICAgICAgICBicmd0ICAgIDBmCisgICAgICAgIAorICAgICAgICBhZGp1c3Rfc3Vibm9ybWFsX2RmICAgICByOSAvKiBleHAgKi8sIHIxMCwgcjExIC8qIE1hbnRpc3NhICovLCByMTIgLypzaWduKi8sIHI4LCBsciAvKiBzY3JhdGNoICovCisgICAgICAgIHBvcG0gICAgcGMKKzA6CisgICAgICAgIAorICAgICAgICAvKiBSb3VuZCByZXN1bHQgKi8KKyAgICAgICAgcm91bmRfZGYgICAgICAgIHI5IC8qZXhwKi8sIHIxMCwgcjExIC8qIE1hbnRpc3NhICovLCByOCAvKnNjcmF0Y2gqLworICAgICAgICBjcC53ICAgIHI5LDB4N2ZmCisgICAgICAgIGJybHQgICAgMGYKKyAgICAgICAgLypSZXR1cm4gaW5maW5pdHkgKi8KKyAgICAgICAgbW92ICAgICByMTAsIDAKKwltb3ZfaW1tCXIxMSwgMHhmZmUwMDAwMAorICAgICAgICByam1wICAgIF9fZmxvYXRzaWRmX3JldHVybl9vcDEKKyAgICAgICAgCiswOgorIAorICAgICAgICAvKiBQYWNrICovCisgICAgICAgIHBhY2tfZGYgcjkgLypleHAqLywgcjEwLCByMTEgLyogbWFudGlzc2EgKi8sIHIxMCwgcjExIC8qIE91dHB1dCBkZiBudW1iZXIqLworX19mbG9hdHNpZGZfcmV0dXJuX29wMTogCisgICAgICAgIGxzbCAgICAgcjEyLDEgICAgICAgICAgICAgICAgICAvKiBzaGlmdCBpbiBzaWduIGJpdCAqLworICAgICAgICByb3IgICAgIHIxMQorIAorICAgICAgICBwb3BtICAgIHBjCisjZW5kaWYKKyAKKyAKKyNpZmRlZiBMX2F2cjMyX2YzMl9jbXBfZXEKKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX2YzMl9jbXBfZXEKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjMyX2NtcF9lcSxAZnVuY3Rpb24KK19fYXZyMzJfZjMyX2NtcF9lcTogICAgIAorICAgICAgICBjcC53ICAgIHIxMiwgcjExCisgICAgICAgIGJyZXEgICAgMGYgICAgICAKKyAgICAgICAgLyogSWYgbm90IGVxdWFsIGNoZWNrIGZvciArLy0wICovCisgICAgICAgIC8qIE9yIHRvZ2V0aGVyIHRoZSB0d28gdmFsdWVzIGFuZCBzaGlmdCBvdXQgdGhlIHNpZ24gYml0LgorICAgICAgICAgICBJZiB0aGUgcmVzdWx0IGlzIHplcm8sIHRoZW4gdGhlIHR3byB2YWx1ZXMgYXJlIGJvdGggemVyby4gKi8KKyAgICAgICAgb3IgICAgICByMTIsIHIxMQorICAgICAgICBsc2wgICAgIHIxMiwgMQorICAgICAgICByZXRlcSAgIDEKKyAgICAgICAgcmV0ICAgICAwCiswOiAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLyogTnVtYmVycyB3ZXJlIGVxdWFsLiBDaGVjayBmb3IgTmFOIG9yIEluZiAqLworCW1vdl9pbW0JcjExLCAweGZmMDAwMDAwCisgICAgICAgIGxzbCAgICAgcjEyLCAxCisgICAgICAgIGNwLncgICAgcjEyLCByMTEKKyAgICAgICAgcmV0bHMgICAxICAgICAvKiAwIGlmIE5hTiwgMSBvdGhlcndpc2UgKi8KKyAgICAgICAgcmV0ICAgICAwICAgICAKKyNlbmRpZgorICAgICAgICAKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjMyX2NtcF9nZSkgfHwgZGVmaW5lZChMX2F2cjMyX2YzMl9jbXBfbHQpCisjaWZkZWYgTF9hdnIzMl9mMzJfY21wX2dlCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mMzJfY21wX2dlCisgICAgICAgIC50eXBlICBfX2F2cjMyX2YzMl9jbXBfZ2UsQGZ1bmN0aW9uCitfX2F2cjMyX2YzMl9jbXBfZ2U6CisjZW5kaWYgIAorI2lmZGVmIExfYXZyMzJfZjMyX2NtcF9sdAorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX2NtcF9sdAorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfY21wX2x0LEBmdW5jdGlvbgorX19hdnIzMl9mMzJfY21wX2x0OgorI2VuZGlmICAKKyAgICAgICAgbHNsICAgICByMTAsIHIxMiwgMSAgICAgLyogUmVtb3ZlIHNpZ24gYml0cyAqLworICAgICAgICBsc2wgICAgIHI5LCByMTEsIDEKKwlzdWJmZXEJcjEwLCAwCisjaWZkZWYgTF9hdnIzMl9mMzJfY21wX2dlCisJcmV0ZXEJMQkJLyogQm90aCBudW1iZXIgYXJlIHplcm8uIFJldHVybiB0cnVlLiAqLworI2VuZGlmCQorI2lmZGVmIExfYXZyMzJfZjMyX2NtcF9sdAorCXJldGVxCTAJCS8qIEJvdGggbnVtYmVyIGFyZSB6ZXJvLiBSZXR1cm4gZmFsc2UuICovCisjZW5kaWYJCisJbW92X2ltbQlyOCwgMHhmZjAwMDAwMAorICAgICAgICBjcC53ICAgIHIxMCwgcjgKKyAgICAgICAgcmV0aGkgICAwICAgICAgICAgICAgICAgLyogT3AwIGlzIE5hTiAqLyAgICAgICAgICAgICAgICAKKyAgICAgICAgY3AudyAgICByOSwgcjgKKyAgICAgICAgcmV0aGkgICAwICAgICAgICAgICAgICAgLyogT3AxIGlzIE5hbiAqLworIAorICAgICAgICBlb3IgICAgIHI4LCByMTEsIHIxMgorICAgICAgICBibGQgICAgIHIxMiwgMzEKKyNpZmRlZiBMX2F2cjMyX2YzMl9jbXBfZ2UKKyAgICAgICAgc3JjYyAgICByOCAgICAgIC8qIFNldCByZXN1bHQgdG8gdHJ1ZSBpZiBvcDAgaXMgcG9zaXRpdmUqLworI2VuZGlmCisjaWZkZWYgTF9hdnIzMl9mMzJfY21wX2x0CisgICAgICAgIHNyY3MgICAgcjggICAgICAvKiBTZXQgcmVzdWx0IHRvIHRydWUgaWYgb3AwIGlzIG5lZ2F0aXZlKi8KKyNlbmRpZgorICAgICAgICByZXRtaSAgIHI4ICAgICAgLyogUmV0dXJuIGlmIHNpZ25zIGFyZSBkaWZmZXJlbnQgKi8KKyAgICAgICAgYnJjcyAgICAwZiAgICAgIC8qIEJvdGggc2lnbnMgbmVnYXRpdmU/ICovCisgCisgICAgICAgIC8qIEJvdGggc2lnbnMgcG9zaXRpdmUgKi8KKyAgICAgICAgY3AudyAgICByMTIsIHIxMQorI2lmZGVmIExfYXZyMzJfZjMyX2NtcF9nZQorICAgICAgICByZXRocyAgICAxCisgICAgICAgIHJldGxvICAgIDAKKyNlbmRpZgorI2lmZGVmIExfYXZyMzJfZjMyX2NtcF9sdAorICAgICAgICByZXRocyAgICAwCisgICAgICAgIHJldGxvICAgIDEKKyNlbmRpZgorMDoKKyAgICAgICAgLyogQm90aCBzaWducyBuZWdhdGl2ZSAqLworICAgICAgICBjcC53ICAgIHIxMSwgcjEyCisjaWZkZWYgTF9hdnIzMl9mMzJfY21wX2dlCisgICAgICAgIHJldGhzICAgIDEKKyAgICAgICAgcmV0bG8gICAgMAorI2VuZGlmCisjaWZkZWYgTF9hdnIzMl9mMzJfY21wX2x0CisgICAgICAgIHJldGhzICAgIDAKKyAgICAgICAgcmV0bG8gICAgMQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgCisgCisjaWZkZWYgTF9hdnIzMl9mNjRfY21wX2VxCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mNjRfY21wX2VxCisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9jbXBfZXEsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9jbXBfZXE6ICAgICAKKyAgICAgICAgY3AudyAgICByMTAscjgKKyAgICAgICAgY3BjICAgICByMTEscjkKKyAgICAgICAgYnJlcSAgICAwZgorICAgICAgICAKKyAgICAgICAgLyogQXJncyB3ZXJlIG5vdCBlcXVhbCovCisgICAgICAgIC8qIEJvdGggYXJncyBjb3VsZCBiZSB6ZXJvIHdpdGggZGlmZmVyZW50IHNpZ24gYml0cyAqLworICAgICAgICBsc2wgICAgIHIxMSwxICAgICAgICAgICAgICAgICAgIC8qIGdldCByaWQgb2Ygc2lnbiBiaXRzICovCisgICAgICAgIGxzbCAgICAgcjksMQorICAgICAgICBvciAgICAgIHIxMSxyMTAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGFsbCBiaXRzIGFyZSB6ZXJvICovCisgICAgICAgIG9yICAgICAgcjExLHI5CisgICAgICAgIG9yICAgICAgcjExLHI4CisgICAgICAgIHJldGVxICAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgYWxsIHplcm9zIHRoZSBhcmd1bWVudHMgYXJlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gcmV0dXJuIDEgZWxzZSByZXR1cm4gMCAqLworICAgICAgICByZXQgICAgIDAKKzA6ICAgICAgCisgICAgICAgIC8qIGNoZWNrIGZvciBOYU4gKi8KKyAgICAgICAgbHNsICAgICByMTEsMQorCW1vdl9pbW0JcjEyLCAweGZmZTAwMDAwCisgICAgICAgIGNwLncgICAgcjEwLDAKKyAgICAgICAgY3BjICAgICByMTEscjEyICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBuYW4gb3IgaW5mICovCisgICAgICAgIHJldGxzICAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgQXJnIGlzIE5hTiByZXR1cm4gMCBlbHNlIDEqLworICAgICAgICByZXQgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiAgKi8KKyAKKyNlbmRpZgorIAorIAorI2lmICAgZGVmaW5lZChMX2F2cjMyX2Y2NF9jbXBfZ2UpIHx8IGRlZmluZWQoTF9hdnIzMl9mNjRfY21wX2x0KQorIAorI2lmZGVmIExfYXZyMzJfZjY0X2NtcF9nZQorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjY0X2NtcF9nZQorICAgICAgICAudHlwZSAgX19hdnIzMl9mNjRfY21wX2dlLEBmdW5jdGlvbgorX19hdnIzMl9mNjRfY21wX2dlOgorI2VuZGlmICAKKyNpZmRlZiBMX2F2cjMyX2Y2NF9jbXBfbHQKKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX2Y2NF9jbXBfbHQKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjY0X2NtcF9sdCxAZnVuY3Rpb24KK19fYXZyMzJfZjY0X2NtcF9sdDoKKyNlbmRpZiAgCisgCisgICAgICAgIC8qIGNvbXBhcmUgbWFnbml0dWRlIG9mIG9wMSBhbmQgb3AyICovCisgICAgICAgIGxzbCAgICAgcjExLDEgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHNpZ24gYml0IG9mIG9wMSAqLworICAgICAgICBzcmNzICAgIHIxMiAgICAgICAgICAgICAgICAgICAgIC8qIFNpZ24gb3AxIHRvIGxzYiBvZiByMTIqLworCXN1YmZlcQlyMTAsIDAKKwlicmVxCTNmCQkJLyogb3AxIHplcm8gKi8KKyAgICAgICAgbHNsICAgICByOSwxICAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgc2lnbiBiaXQgb2Ygb3AyICovCisgICAgICAgIHJvbCAgICAgcjEyICAgICAgICAgICAgICAgICAgICAgLyogU2lnbiBvcDIgdG8gbHNiIG9mIGxyLCBzaWduIGJpdCBvcDEgYml0IDEgb2YgcjEyKi8KKwkKKyAKKyAgICAgICAgLyogQ2hlY2sgZm9yIE5hbiAqLworCXB1c2htCWxyCisJbW92X2ltbQlsciwgMHhmZmUwMDAwMAorICAgICAgICBjcC53ICAgIHIxMCwwCisgICAgICAgIGNwYyAgICAgcjExLGxyCisgICAgICAgIGJyaGkgICAgMGYgICAgICAvKiBXZSBoYXZlIE5hTiAqLworICAgICAgICBjcC53ICAgIHI4LDAKKyAgICAgICAgY3BjICAgICByOSxscgorICAgICAgICBicmhpICAgIDBmICAgICAgLyogV2UgaGF2ZSBOYU4gKi8KKwlwb3BtCWxyCisgCisgICAgICAgIGNwLncgICAgcjEyLDMgICAgICAgICAgICAgICAgICAgLyogYm90aCBvcGVyYW5kcyBuZWdhdGl2ZSA/Ki8gICAgCisgICAgICAgIGJyZXEgICAgMWYKKyAKKyAgICAgICAgY3AudyAgICByMTIsMSAgICAgICAgICAgICAgICAgICAvKiBib3RoIG9wZXJhbmRzIHBvc2l0aXZlPyAqLworICAgICAgICBicmxvICAgIDJmCisgCisgICAgICAgIC8qIERpZmZlcmVudCBzaWducy4gSWYgc2lnbiBvZiBvcDEgaXMgbmVnYXRpdmUgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgICAgYmV0d2VlbiBvcDEgYW5kIG9wMiB3aWxsIGFsd2F5cyBiZSBuZWdhdGl2ZSwgYW5kIGlmIG9wMSBpcworICAgICAgICAgICBwb3NpdGl2ZSB0aGUgZGlmZmVyZW5jZSB3aWxsIGFsd2F5cyBiZSBwb3NpdGl2ZSAqLyAgICAgICAgICAgCisjaWZkZWYgTF9hdnIzMl9mNjRfY21wX2dlCisJcmV0ZXEJMQorCXJldG5lCTAKKyNlbmRpZgorI2lmZGVmIExfYXZyMzJfZjY0X2NtcF9sdAorCXJldGVxCTAKKwlyZXRuZQkxCisjZW5kaWYKKyAgCisyOgorICAgICAgICAvKiBCb3RoIG9wZXJhbmRzIHBvc2l0aXZlLiBKdXN0IGNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgKi8KKyAgICAgICAgY3AudyAgICByMTAscjgKKyAgICAgICAgY3BjICAgICByMTEscjkKKyNpZmRlZiBMX2F2cjMyX2Y2NF9jbXBfZ2UKKwlyZXRocwkxCisJcmV0bG8JMAorI2VuZGlmCisjaWZkZWYgTF9hdnIzMl9mNjRfY21wX2x0CisJcmV0aHMJMAorCXJldGxvCTEKKyNlbmRpZgorICAgICAgICAgICAgICAgIAorMToKKyAgICAgICAgLyogQm90aCBvcGVyYW5kcyBuZWdhdGl2ZS4gQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSB3aXRoIG9wZXJhbmRzIHN3aXRjaGVkICovCisgICAgICAgIGNwICAgICByOCxyMTAKKyAgICAgICAgY3BjICAgIHI5LHIxMQorI2lmZGVmIExfYXZyMzJfZjY0X2NtcF9nZQorCXJldGhzCTEKKwlyZXRsbwkwCisjZW5kaWYKKyNpZmRlZiBMX2F2cjMyX2Y2NF9jbXBfbHQKKwlyZXRocwkwCisJcmV0bG8JMQorI2VuZGlmCisKKzA6ICAgICAgCisgICAgICAgIHBvcG0gICAgcGMsIHIxMj0wCisjZW5kaWYKKyAKKzM6CisgICAgICAgIGxzbCAgICAgcjksMSAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgc2lnbiBiaXQgb2Ygb3AxICovCisjaWZkZWYgTF9hdnIzMl9mNjRfY21wX2dlCisgICAgICAgIHNyY3MgICAgcjEyCQkgICAgICAgLyogSWYgb3AyIGlzIG5lZ2F0aXZlIHRoZW4gb3AxID49IG9wMi4gKi8JCisjZW5kaWYKKyNpZmRlZiBMX2F2cjMyX2Y2NF9jbXBfbHQKKyAgICAgICAgc3JjYyAgICByMTIJCSAgICAgICAvKiBJZiBvcDIgaXMgcG9zaXR2ZSB0aGVuIG9wMSA8PSBvcDIuICovCisjZW5kaWYKKwlzdWJmZXEJcjgsIDAJCSAgICAgICAKKyNpZmRlZiBMX2F2cjMyX2Y2NF9jbXBfZ2UKKwlyZXRlcQkxCQkgICAgICAgLyogQm90aCBvcGVyYW5kcyBhcmUgemVyby4gUmV0dXJuIHRydWUuICovCisjZW5kaWYKKyNpZmRlZiBMX2F2cjMyX2Y2NF9jbXBfbHQKKwlyZXRlcQkwCQkgICAgICAgLyogQm90aCBvcGVyYW5kcyBhcmUgemVyby4gUmV0dXJuIGZhbHNlLiAqLworI2VuZGlmCisJcmV0CXIxMgorCQkJCSAgICAgICAgCisgCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9kaXYpIHx8IGRlZmluZWQoTF9hdnIzMl9mNjRfZGl2X2Zhc3QpCisgICAgICAgIC5hbGlnbiAgMgorCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9kaXZfZmFzdCkKKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX2Y2NF9kaXZfZmFzdAorICAgICAgICAudHlwZSAgX19hdnIzMl9mNjRfZGl2X2Zhc3QsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9kaXZfZmFzdDoKKyNlbHNlCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mNjRfZGl2CisgICAgICAgIC50eXBlICBfX2F2cjMyX2Y2NF9kaXYsQGZ1bmN0aW9uCitfX2F2cjMyX2Y2NF9kaXY6CisjZW5kaWYKKyAgICAgICAgc3RtICAgICAtLXNwLCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsbHIgCisgICAgICAgIC8qIG9wMSBpbiB7cjExLHIxMH0qLworICAgICAgICAvKiBvcDIgaW4ge3I5LHI4fSovCisgICAgICAgIGVvciAgICAgbHIsIHIxMSwgcjkgICAgICAgICAgICAgLyogTVNCKGxyKSA9IFNpZ24ob3AxKSBeIFNpZ24ob3AyKSAqLworIAorICAgICAgICAKKyAgICAgICAgLyogVW5wYWNrIG9wMSB0byAyLjYyIGZvcm1hdCovICAKKyAgICAgICAgLyogZXhwOiByNyAqLworICAgICAgICAvKiBzZjogIHIxMSwgcjEwICovCisgICAgICAgIGxzciAgICAgcjcsIHIxMSwgMjAgLyogRXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICAgICAgICAgIAorICAgICAgICBsc2wgICAgIHIxMSwgOSAvKiBFeHRyYWN0IG1hbnRpc3NhLCBsZWF2ZSByb29tIGZvciBpbXBsaWNpdCBiaXQgKi8gCisgICAgICAgIG9yICAgICAgcjExLCByMTEsIHIxMD4+MjMKKyAgICAgICAgbHNsICAgICByMTAsIDkKKyAgICAgICAgc2JyICAgICByMTEsIDI5IC8qIEluc2VydCBpbXBsaWNpdCBiaXQgKi8KKyAgICAgICAgYW5kaCAgICByMTEsIDB4M2ZmZiAvKk1hc2sgbGFzdCBwYXJ0IG9mIGV4cG9uZW50IHNpbmNlIHdlIHVzZSAyLjYyIGZvcm1hdCovCisgCisgICAgICAgIGNiciAgICAgcjcsIDExICAgICAgIC8qIENsZWFyIHNpZ24gYml0ICovCisgICAgICAgIC8qIENoZWNrIGlmIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkICovCisgICAgICAgIGJyZXEgICAgMTFmIC8qSWYgbnVtYmVyIGlzIHN1Ym5vcm1hbCwgbm9ybWFsaXplIGl0ICovCisyMjogICAgIAorICAgICAgICBjcCAgICAgIHI3LCAweDdmZgorICAgICAgICBicmdlICAgIDJmICAvKiBDaGVjayBvcDEgZm9yIE5hTiBvciBJbmYgKi8KKworICAgICAgICAvKiBVbnBhY2sgb3AyIHRvIDIuNjIgZm9ybWF0Ki8KKyAgICAgICAgLyogZXhwOiByNiAqLworICAgICAgICAvKiBzZjogIHI5LCByOCAqLworICAgICAgICBsc3IgICAgIHI2LCByOSwgMjAgLyogRXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICAgICAgICAgIAorICAgICAgICBsc2wgICAgIHI5LCA5IC8qIEV4dHJhY3QgbWFudGlzc2EsIGxlYXZlIHJvb20gZm9yIGltcGxpY2l0IGJpdCAqLyAKKyAgICAgICAgb3IgICAgICByOSwgcjksIHI4Pj4yMworICAgICAgICBsc2wgICAgIHI4LCA5CisgICAgICAgIHNiciAgICAgcjksIDI5IC8qIEluc2VydCBpbXBsaWNpdCBiaXQgKi8KKyAgICAgICAgYW5kaCAgICByOSwgMHgzZmZmIC8qTWFzayBsYXN0IHBhcnQgb2YgZXhwb25lbnQgc2luY2Ugd2UgdXNlIDIuNjIgZm9ybWF0Ki8KKyAKKyAgICAgICAgY2JyICAgICByNiwgMTEgICAgICAgLyogQ2xlYXIgc2lnbiBiaXQgKi8KKyAgICAgICAgLyogQ2hlY2sgaWYgbm9ybWFsaXphdGlvbiBpcyBuZWVkZWQgKi8KKyAgICAgICAgYnJlcSAgICAxM2YgLypJZiBudW1iZXIgaXMgc3Vibm9ybWFsLCBub3JtYWxpemUgaXQgKi8KKzIzOiAgICAgICAgICAgICAKKyAgICAgICAgY3AgICAgICByNiwgMHg3ZmYKKyAgICAgICAgYnJnZSAgICAzZiAgLyogQ2hlY2sgb3AyIGZvciBOYU4gb3IgSW5mICovCisKKyAgICAgICAgLyogQ2FsY3VsYXRlIG5ldyBleHBvbmVudCAqLworICAgICAgICBzdWIgICAgIHI3LCByNgorICAgICAgICBzdWIgICAgIHI3LC0xMDIzCisgCisgICAgICAgIC8qIERpdmlkZSAqLworICAgICAgICAvKiBBcHByb3hpbWF0aW5nIDEvZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVjdXJyZW5jZTogKi8KKyAgICAgICAgLyogUltqKzFdID0gUltqXSooMi1SW2pdKmQpICovCisgICAgICAgIC8qIFVzaW5nIDIuNjIgZm9ybWF0ICovCisgICAgICAgIC8qIFRXTzogIHIxMiAqLworICAgICAgICAvKiBkID0gb3AyID0gZGl2aXNvciAoMi42MiBmb3JtYXQpOiByOSxyOCAqLworICAgICAgICAvKiBNdWx0aXBseSByZXN1bHQgOiAgICAgcjUsIHI0ICovCisgICAgICAgIC8qIEluaXRpYWwgZ3Vlc3MgOiAgICAgICByMywgcjIgKi8KKyAgICAgICAgLyogTmV3IGFwcHJveGltYXRpb25zIDogIHIzLCByMiAqLworICAgICAgICAvKiBvcDEgPSBEaXZpZGVuZCAoMi42MiBmb3JtYXQpIDogcjExLCByMTAgKi8KKyAKKwltb3ZfaW1tCXIxMiwgMHg4MDAwMDAwMAorICAgICAgICAgCisgICAgICAgIC8qIExvYWQgaW5pdGlhbCBndWVzcywgdXNpbmcgbG9vay11cCB0YWJsZSAqLworICAgICAgICAvKiBJbml0aWFsIGd1ZXNzIGlzIG9mIGZvcm1hdCAwMS5YWSwgd2hlcmUgWFkgaXMgY29uc3RydWN0ZWQgYXMgZm9sbG93czogKi8KKyAgICAgICAgLyogTGV0IGQgYmUgb2YgZm9sbG93aW5nIGZvcm1hdDogMDAuMXh5Li4uLi4sIHRoZW4gWFk9fnh5ICovCisgICAgICAgIC8qIEZvciBkPTAwLjEwMCA9IDAsNSAgIC0+IGluaXRpYWwgZ3Vlc3M9MDEuMTEgPSAxLDc1ICovCisgICAgICAgIC8qIEZvciBkPTAwLjEwMSA9IDAsNjI1IC0+IGluaXRpYWwgZ3Vlc3M9MDEuMTEgPSAxLDUgICovCisgICAgICAgIC8qIEZvciBkPTAwLjExMCA9IDAsNzUgIC0+IGluaXRpYWwgZ3Vlc3M9MDEuMTEgPSAxLDI1ICovCisgICAgICAgIC8qIEZvciBkPTAwLjExMSA9IDAsODc1IC0+IGluaXRpYWwgZ3Vlc3M9MDEuMTEgPSAxLDAgICovCisgICAgICAgIC8qIHIyIGlzIGFsc28gcGFydCBvZiB0aGUgcmVnIHBhaXIgZm9ybWluZyBpbml0aWFsIGd1ZXNzLCBidXQgaXQqLworICAgICAgICAvKiBpcyBrZXB0IHVuaW5pdGlhbGl6ZWQgdG8gc2F2ZSBvbmUgY3ljbGUgc2luY2UgaXQgaGFzIHNvIGxvdyBzaWduaWZpY2FuY2UqLworIAorICAgICAgICBsc3IgICAgIHIzLCByMTIsIDEKKyAgICAgICAgYmZleHR1ICByNCwgcjksIDI3LCAyCisgICAgICAgIGNvbSAgICAgcjQKKyAgICAgICAgYmZpbnMgICByMywgcjQsIDI4LCAyCisgCisgICAgICAgIC8qIEZpcnN0IGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogQXBwcm94aW1hdGluZyB0byAzMiBiaXRzICovCisgICAgICAgIC8qIHI1ID0gUltqXSpkICovCisgICAgICAgIG11bHUuZCAgcjQsIHIzLCByOQorICAgICAgICAvKiByNSA9IDItUltqXSpkICovCisgICAgICAgIHN1YiAgICByNSwgcjEyLCByNTw8MgorICAgICAgICAvKiByMyA9IFJbal0qKDItUltqXSpkKSAqLworICAgICAgICBtdWx1LmQgIHI0LCByMywgcjUKKyAgICAgICAgbHNsICAgICByMywgcjUsIDIKKyAgICAgICAgIAorICAgICAgICAvKiBTZWNvbmQgYXBwcm94aW1hdGlvbiAqLworICAgICAgICAvKiBBcHByb3hpbWF0aW5nIHRvIDMyIGJpdHMgKi8KKyAgICAgICAgLyogcjUgPSBSW2pdKmQgKi8KKyAgICAgICAgbXVsdS5kICByNCwgcjMsIHI5CisgICAgICAgIC8qIHI1ID0gMi1SW2pdKmQgKi8KKyAgICAgICAgc3ViICAgIHI1LCByMTIsIHI1PDwyCisgICAgICAgIC8qIHIzID0gUltqXSooMi1SW2pdKmQpICovCisgICAgICAgIG11bHUuZCAgcjQsIHIzLCByNQorICAgICAgICBsc2wgICAgIHIzLCByNSwgMgorICAgICAgICAgCisgICAgICAgIC8qIFRoaXJkIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogQXBwcm94aW1hdGluZyB0byAzMiBiaXRzICovCisgICAgICAgIC8qIHI1ID0gUltqXSpkICovCisgICAgICAgIG11bHUuZCAgcjQsIHIzLCByOQorICAgICAgICAvKiByNSA9IDItUltqXSpkICovCisgICAgICAgIHN1YiAgICByNSwgcjEyLCByNTw8MgorICAgICAgICAvKiByMyA9IFJbal0qKDItUltqXSpkKSAqLworICAgICAgICBtdWx1LmQgIHI0LCByMywgcjUKKyAgICAgICAgbHNsICAgICByMywgcjUsIDIKKyAKKyAgICAgICAgLyogRm91cnRoIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogQXBwcm94aW1hdGluZyB0byA2NCBiaXRzICovCisgICAgICAgIC8qIHI1LHI0ID0gUltqXSpkICovCisgICAgICAgIG11bF9hcHByb3hfZGYgICAgICAgIHIzIC8qYWgqLywgcjIgLyphbCovLCByOSAvKmJoKi8sIHI4IC8qYmwqLywgcjUgLypyaCovLCByNCAvKnJsKi8sIHIxIC8qc2gqLywgcjAgLypzbCovCisgICAgICAgIGxzbCAgICByNSwgMgorICAgICAgICBvciAgICAgcjUsIHI1LCByND4+MzAKKyAgICAgICAgbHNsICAgIHI0LCAyCisgICAgICAgIC8qIHI1LHI0ID0gMi1SW2pdKmQgKi8KKyAgICAgICAgbmVnICAgIHI0CisgICAgICAgIHNiYyAgICByNSwgcjEyLCByNQorICAgICAgICAvKiByMyxyMiA9IFJbal0qKDItUltqXSpkKSAqLworICAgICAgICBtdWxfYXBwcm94X2RmICAgICAgICByMyAvKmFoKi8sIHIyIC8qYWwqLywgcjUgLypiaCovLCByNCAvKmJsKi8sIHI1IC8qcmgqLywgcjQgLypybCovLCByMSAvKnNoKi8sIHIwIC8qc2wqLworICAgICAgICBsc2wgICAgcjMsIHI1LCAyCisgICAgICAgIG9yICAgICByMywgcjMsIHI0Pj4zMAorICAgICAgICBsc2wgICAgcjIsIHI0LCAyCisgCisgCisgICAgICAgIC8qIEZpZnRoIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogQXBwcm94aW1hdGluZyB0byA2NCBiaXRzICovCisgICAgICAgIC8qIHI1LHI0ID0gUltqXSpkICovCisgICAgICAgIG11bF9hcHByb3hfZGYgICAgICAgIHIzIC8qYWgqLywgcjIgLyphbCovLCByOSAvKmJoKi8sIHI4IC8qYmwqLywgcjUgLypyaCovLCByNCAvKnJsKi8sIHIxIC8qc2gqLywgcjAgLypzbCovCisgICAgICAgIGxzbCAgICByNSwgMgorICAgICAgICBvciAgICAgcjUsIHI1LCByND4+MzAKKyAgICAgICAgbHNsICAgIHI0LCAyCisgICAgICAgIC8qIHI1LHI0ID0gMi1SW2pdKmQgKi8KKyAgICAgICAgbmVnICAgIHI0CisgICAgICAgIHNiYyAgICByNSwgcjEyLCByNQorICAgICAgICAvKiByMyxyMiA9IFJbal0qKDItUltqXSpkKSAqLworICAgICAgICBtdWxfYXBwcm94X2RmICAgICAgICByMyAvKmFoKi8sIHIyIC8qYWwqLywgcjUgLypiaCovLCByNCAvKmJsKi8sIHI1IC8qcmgqLywgcjQgLypybCovLCByMSAvKnNoKi8sIHIwIC8qc2wqLworICAgICAgICBsc2wgICAgcjMsIHI1LCAyCisgICAgICAgIG9yICAgICByMywgcjMsIHI0Pj4zMAorICAgICAgICBsc2wgICAgcjIsIHI0LCAyCisgCisgCisgICAgICAgIC8qIE11bHRpcGx5IHdpdGggZGl2aWRlbmQgdG8gZ2V0IHF1b3RpZW50ICovCisgICAgICAgIG11bF9hcHByb3hfZGYgICAgICAgIHIzIC8qYWgqLywgcjIgLyphbCovLCByMTEgLypiaCovLCByMTAgLypibCovLCByMyAvKnJoKi8sIHIyIC8qcmwqLywgcjEgLypzaCovLCByMCAvKnNsKi8KKyAKKyAKKyAgICAgICAgLyogVG8gaW5jcmVhc2Ugc3BlZWQsIHRoaXMgcmVzdWx0IGlzIG5vdCBjb3JyZWN0ZWQgYmVmb3JlIGZpbmFsIHJvdW5kaW5nLiovCisgICAgICAgIC8qIFRoaXMgbWF5IGdpdmUgYSBkaWZmZXJlbmNlIHRvIElFRUUgY29tcGxpYW50IGNvZGUgb2YgMSBVTFAuKi8KKwkJCisgCisgICAgICAgIC8qIEFkanVzdCBleHBvbmVudCBhbmQgbWFudGlzc2EgKi8KKyAgICAgICAgLyogcjc6ZXhwLCBbcjMsIHIyXTptYW50LCBbcjUsIHI0XTpzY3JhdGNoKi8KKyAgICAgICAgLyogTWFudGlzc2EgbWF5IGJlIG9mIHRoZSBmb3JtYXQgMC54eHh4IG9yIDEueHh4eC4gKi8KKyAgICAgICAgLyogSW4gdGhlIGZpcnN0IGNhc2UsIHNoaWZ0IG9uZSBwb3MgdG8gbGVmdC4qLworICAgICAgICBibGQgICAgIHIzLCAzMS0zCisJYnJlcQkwZgorCWxzbAlyMiwgMQorCXJvbAlyMworCXN1YglyNywgMQorI2lmIGRlZmluZWQoTF9hdnIzMl9mNjRfZGl2KQorCS8qIFdlIG11c3Qgc2NhbGUgZG93biB0aGUgZGl2aWRlbmQgdG8gNS41OSBmb3JtYXQuICovCisJbHNyCXIxMCwgMworCW9yCXIxMCwgcjEwLCByMTEgPDwgMjkKKwlsc3IJcjExLCAzCisJcmptcCAgICAxZgorI2VuZGlmCQorMDoJCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9kaXYpCisJLyogV2UgbXVzdCBzY2FsZSBkb3duIHRoZSBkaXZpZGVuZCB0byA2LjU4IGZvcm1hdC4gKi8KKwlsc3IJcjEwLCA0CisJb3IJcjEwLCByMTAsIHIxMSA8PCAyOAorCWxzcglyMTEsIDQKKzE6CQorI2VuZGlmCisgICAgICAgIGNwICAgICAgcjcsIDAgICAKKyAgICAgICAgYnJsZSAgICBfX2F2cjMyX2Y2NF9kaXZfcmVzX3N1Ym5vcm1hbCAvKiBSZXN1bHQgd2FzIHN1Ym5vcm1hbC4gKi8KKyAKKyAKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjY0X2RpdikKKwkvKiBJbiBvcmRlciB0byByb3VuZCBjb3JyZWN0bHkgd2UgY2FsY3VsYXRlIHRoZSByZW1haW5kZXI6CQorCSAgIFJlbWFpbmRlciA9IGRpdmlkZW5kWzExOnIxMF0gLSBkaXZpc29yW3I5OnI4XSpxdW90aWVudFtyMzpyMl0gCisJICAgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIHF1b3RpZW50IGlzIGhhbGZ3YXkgYmV0d2VlbiB0aGUgcm91bmQtdXAKKwkgICB2YWx1ZSBhbmQgdGhlIHJvdW5kIGRvd24gdmFsdWUuIElmIHRoZSByZW1haW5kZXIgdGhlbiBpcyBuZWdhdGl2ZQorCSAgIGl0IG1lYW5zIHRoYXQgdGhlIHF1b3RpZW50IHdhcyB0byBiaWcgYW5kIHRoYXQgaXQgc2hvdWxkIG5vdCBiZQorICAgICAgICAgICByb3VuZGVkIHVwLCBpZiB0aGUgcmVtYWluZGVyIGlzIHBvc2l0aXZlIHRoZSBxdW90aWVudCB3YXMgdG8gc21hbGwKKwkgICBhbmQgd2UgbmVlZCB0byByb3VuZCB1cC4gSWYgdGhlIHJlbWFpbmRlciBpcyB6ZXJvIGl0IG1lYW5zIHRoYXQgdGhlCisJICAgcXVvdGllbnQgaXMgZXhhY3QgYnV0IHNpbmNlIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBndWFyZCBiaXQgd2Ugc2hvdWxkCisJICAgcm91bmQgdG8gZXZlbi4gKi8KKworCS8qIFRydW5jYXRlIGFuZCBhZGQgZ3VhcmQgYml0LiAqLworCWFuZGwJcjIsIDB4ZmYwMAorCW9ybAlyMiwgMHgwMDgwCQorCQorCisJLyogTm93IGRvIHRoZSBtdWx0aXBsaWNhdGlvbi4gVGhlIHF1b3RpZW50IGhhcyB0aGUgZm9ybWF0IDQuNjAKKwkgICB3aGlsZSB0aGUgZGl2aXNvciBoYXMgdGhlIGZvcm1hdCAyLjYyIHdoaWNoIGdpdmVzIGEgcmVzdWx0CisJICAgb2YgNi41OCAqLworICAgICAgICBtdWx1LmQgIHIwLCByMywgcjgKKyAgICAgICAgbWFjdS5kICByMCwgcjIsIHI5CisgICAgICAgIG11bHUuZCAgcjQsIHIyLCByOAorICAgICAgICBtdWx1LmQgIHI4LCByMywgcjkKKwlhZGQJcjUsIHIwCisJYWRjCXI4LCByOCwgcjEJCisJYWNyCXI5CisKKworCS8qIENoZWNrIGlmIHJlbWFpbmRlciBpcyBwb3NpdGl2ZSwgbmVnYXRpdmUgb3IgZXF1YWwuICovCisJYmZleHR1CXIxMiwgcjIsIDgsIDEgIC8qIEdldCBwYXJpdHkgYml0IGludG8gYml0IDAgb2YgcjAgKi8gCisJY3AJcjQsIDAKKwljcGMJcjUKK19fYXZyMzJfZjY0X2Rpdl9yb3VuZF9zdWJub3JtYWw6CQorCWNwYwlyOCwgcjEwCisJY3BjCXI5LCByMTEKKwlzcmxvCXI2CS8qIFJlbWFpbmRlciBwb3NpdGl2ZToJIHdlIG5lZWQgdG8gcm91bmQgdXAuKi8KKwltb3ZlcQlyNiwgcjEyICAvKiBSZW1haW5kZXIgemVybzoJIHJvdW5kIHVwIGlmIG1hbnRpc3NhIG9kZC4gKi8KKyNlbHNlCisJYmZleHR1CXI2LCByMiwgNywgMSAgLyogR2V0IGd1YXJkIGJpdCAqLyAJCisjZW5kaWYKKwkvKiBGaW5hbCBwYWNraW5nLCBzY2FsZSBkb3duIG1hbnRpc3NhLiAqLworCWxzcglyMTAsIHIyLCA4CisgICAgICAgIG9yICAgICAgcjEwLCByMTAsIHIzPDwyNAorICAgICAgICBsc3IgICAgIHIxMSwgcjMsIDgKKwkvKiBJbnNlcnQgZXhwb25lbnQgYW5kIHNpZ24gYml0Ki8KKwliZmlucwlyMTEsIHI3LCAyMCwgMTEKKyAgICAgICAgYmxkICAgICBsciwgMzEKKyAgICAgICAgYnN0ICAgICByMTEsIDMxCisKKwkvKiBGaW5hbCByb3VuZGluZyAqLworCWFkZAlyMTAsIHI2CisJYWNyCXIxMQkJCisJICAgICAgICAKKyAgICAgICAgLyogUmV0dXJuIHJlc3VsdCBpbiBbcjExLHIxMF0gKi8KKyAgICAgICAgbGRtICAgICBzcCsrLCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcscGMKKyAKKyAgICAgICAgICAgICAgICAKKzI6CisgICAgICAgIC8qIE9wMSBpcyBOYU4gb3IgaW5mICovCisgICAgICAgIGFuZGggICAgcjExLCAweDAwMGYgLyogRXh0cmFjdCBtYW50aXNzYSAqLworICAgICAgICBvciAgICAgIHIxMSwgcjEwCisgICAgICAgIGJybmUgICAgMTZmICAgICAvKiBSZXR1cm4gTmFOIGlmIG9wMSBpcyBOYU4gKi8KKyAgICAgICAgLyogT3AxIGlzIGluZiBjaGVjayBvcDIgKi8KKyAgICAgICAgbHNyICAgICByNiwgcjksIDIwIC8qIEV4dHJhY3QgZXhwb25lbnQgKi8KKyAgICAgICAgY2JyICAgICByNiwgOCAgICAgICAvKiBDbGVhciBzaWduIGJpdCAqLworICAgICAgICBjcCAgICAgIHI2LCAweDdmZgorICAgICAgICBicm5lICAgIDE3ZiAgICAgLyogSW5mL251bWJlciBnaXZlcyBpbmYsIHJldHVybiBpbmYgKi8KKyAgICAgICAgcmptcCAgICAxNmYgICAgIC8qIFRoZSByZXN0IGdpdmVzIE5hTiovCisgICAgICAgIAorMzogICAgICAKKyAgICAgICAgLyogT3AxIGlzIGEgdmFsaWQgbnVtYmVyLiBPcCAyIGlzIE5hTiBvciBpbmYgKi8KKyAgICAgICAgYW5kaCAgICByOSwgMHgwMDBmIC8qIEV4dHJhY3QgbWFudGlzc2EgKi8KKyAgICAgICAgb3IgICAgICByOSwgcjgKKyAgICAgICAgYnJuZSAgICAxNmYgICAgIC8qIFJldHVybiBOYU4gaWYgb3AyIGlzIE5hTiAqLworICAgICAgICByam1wICAgIDE1ZiAgICAgLyogT3AyIHdhcyBpbmYsIHJldHVybiB6ZXJvKi8KKyAgICAgICAgICAgICAgICAKKzExOiAgICAgLyogT3AxIHdhcyBkZW5vcm1hbC4gRml4IGl0LiAqLworICAgICAgICBsc2wgICAgIHIxMSwgMworICAgICAgICBvciAgICAgIHIxMSwgcjExLCByMTAgPj4gMjkKKyAgICAgICAgbHNsICAgICByMTAsIDMKKyAgICAgICAgLyogQ2hlY2sgaWYgb3AxIGlzIHplcm8uICovCisgICAgICAgIG9yICAgICAgcjQsIHIxMCwgcjExCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mNjRfZGl2X29wMV96ZXJvCisgICAgICAgIG5vcm1hbGl6ZV9kZiAgICByNyAvKmV4cCovLCByMTAsIHIxMSAvKk1hbnRpc3NhKi8sIHI0LCByNSAvKnNjcmF0Y2gqLworICAgICAgICBsc3IgICAgIHIxMCwgMgorICAgICAgICBvciAgICAgIHIxMCwgcjEwLCByMTEgPDwgMzAKKyAgICAgICAgbHNyICAgICByMTEsIDIKKyAgICAgICAgcmptcCAgICAyMmIKKyAKKyAKKzEzOiAgICAgLyogT3AyIHdhcyBkZW5vcm1hbC4gRml4IGl0ICovCisgICAgICAgIGxzbCAgICAgcjksIDMKKyAgICAgICAgb3IgICAgICByOSwgcjksIHI4ID4+IDI5CisgICAgICAgIGxzbCAgICAgcjgsIDMKKyAgICAgICAgLyogQ2hlY2sgaWYgb3AyIGlzIHplcm8uICovCisgICAgICAgIG9yICAgICAgcjQsIHI5LCByOAorICAgICAgICBicmVxICAgIDE3ZiAgICAgLyogRGl2aXNvciBpcyB6ZXJvIC0+IHJldHVybiBJbmYgKi8KKyAgICAgICAgbm9ybWFsaXplX2RmICAgIHI2IC8qZXhwKi8sIHI4LCByOSAvKk1hbnRpc3NhKi8sIHI0LCByNSAvKnNjcmF0Y2gqLyAgICAgCisgICAgICAgIGxzciAgICAgcjgsIDIKKyAgICAgICAgb3IgICAgICByOCwgcjgsIHI5IDw8IDMwCisgICAgICAgIGxzciAgICAgcjksIDIKKyAgICAgICAgcmptcCAgICAyM2IKKyAgICAgICAgCisgCitfX2F2cjMyX2Y2NF9kaXZfcmVzX3N1Ym5vcm1hbDovKiBEaXZpZGUgcmVzdWx0IHdhcyBzdWJub3JtYWwuICovCisjaWYgZGVmaW5lZChMX2F2cjMyX2Y2NF9kaXYpCisJLyogQ2hlY2sgaG93IG11Y2ggd2UgbXVzdCBzY2FsZSBkb3duIHRoZSBtYW50aXNzYS4gKi8KKwluZWcJcjcKKwlzdWIJcjcsIC0xICAgICAvKiBXZSBkbyBubyBsb25nZXIgaGF2ZSBhbiBpbXBsaWNpdCBiaXQuICovCisJc2F0dQlyNyA+PiAwLCA2IC8qIFNhdHVyYXRlIHNoaWZ0IGFtb3VudCB0byBtYXggNjMuICovCisJY3AudwlyNywgMzIKKwlicmdlCTBmCisJLyogU2hpZnQgYW1vdW50IDwzMiAqLworCS8qIFNjYWxlIGRvd24gcXVvdGllbnQgKi8KKwlyc3ViCXI2LCByNywgMzIKKwlsc3IJcjIsIHIyLCByNworCWxzbAlyMTIsIHIzLCByNgorCW9yCXIyLCByMTIKKwlsc3IJcjMsIHIzLCByNworCS8qIFNjYWxlIGRvd24gdGhlIGRpdmlkZW5kIHRvIG1hdGNoIHRoZSBzY2FsaW5nIG9mIHRoZSBxdW90aWVudC4gKi8KKwlsc2wJcjEsIHIxMCwgcjYKKwlsc3IJcjEwLCByMTAsIHI3CisJbHNsCXIxMiwgcjExLCByNgorCW9yCXIxMCwgcjEyCisJbHNyCXIxMSwgcjExLCByNworCW1vdglyMCwgMAorCXJqbXAJMWYKKzA6CisJLyogU2hpZnQgYW1vdW50ID49MzIgKi8KKwlyc3ViCXI2LCByNywgMzIKKwltb3ZlcQlyMCwgMAorCW1vdmVxCXIxMiwgMAorCWJyZXEJMGYKKwlsc2wJcjAsIHIxMCwgcjYKKwlsc2wJcjEyLCByMTEsIHI2CiswOgkKKwlsc3IJcjIsIHIzLCByNworCW1vdglyMywgMAorCS8qIFNjYWxlIGRvd24gdGhlIGRpdmlkZW5kIHRvIG1hdGNoIHRoZSBzY2FsaW5nIG9mIHRoZSBxdW90aWVudC4gKi8KKwlsc3IJcjEsIHIxMCwgcjcKKwlvcglyMSwgcjEyCisJbHNyCXIxMCwgcjExLCByNworCW1vdglyMTEsIDAKKzE6CQorCS8qIFN0YXJ0IHBlcmZvcm1pbmcgdGhlIHNhbWUgcm91bmRpbmcgYXMgZG9uZSBmb3Igbm9ybWFsIG51bWJlcnMKKwkgICBidXQgdGhpcyB0aW1lIHdlIGhhdmUgc2NhbGVkIHRoZSBxdW90aWVudCBhbmQgZGl2aWRlbmQgYW5kIGhlbmNlCisJICAgbmVlZCBhIGxpdHRsZSBkaWZmZXJlbnQgY29tcGFyaXNvbi4gKi8KKwkvKiBUcnVuY2F0ZSBhbmQgYWRkIGd1YXJkIGJpdC4gKi8KKwlhbmRsCXIyLCAweGZmMDAKKwlvcmwJcjIsIDB4MDA4MAkKKwkKKwkvKiBOb3cgZG8gdGhlIG11bHRpcGxpY2F0aW9uLiAqLworICAgICAgICBtdWx1LmQgIHI2LCByMywgcjgKKyAgICAgICAgbWFjdS5kICByNiwgcjIsIHI5CisgICAgICAgIG11bHUuZCAgcjQsIHIyLCByOAorICAgICAgICBtdWx1LmQgIHI4LCByMywgcjkKKwlhZGQJcjUsIHI2CisJYWRjCXI4LCByOCwgcjcJCisJYWNyCXI5CisKKwkvKiBTZXQgZXhwb25lbnQgdG8gMCAqLworCW1vdglyNywgMAkKKworCS8qIENoZWNrIGlmIHJlbWFpbmRlciBpcyBwb3NpdGl2ZSwgbmVnYXRpdmUgb3IgZXF1YWwuICovCisJYmZleHR1CXIxMiwgcjIsIDgsIDEgIC8qIEdldCBwYXJpdHkgYml0IGludG8gYml0IDAgb2YgcjAgKi8gCisJY3AJcjQsIHIwCisJY3BjCXI1LCByMQorCS8qIE5vdyB0aGUgcmVzdCBvZiB0aGUgcm91bmRpbmcgaXMgdGhlIHNhbWUgYXMgZm9yIG5vcm1hbHMuICovCisJcmptcAlfX2F2cjMyX2Y2NF9kaXZfcm91bmRfc3Vibm9ybWFsCisJCisjZW5kaWYKKzE1OgkKKwkvKiBGbHVzaCB0byB6ZXJvIGZvciB0aGUgZmFzdCB2ZXJzaW9uLiAqLworICAgICAgICBtb3YgICAgIHIxMSwgbHIgLypHZXQgY29ycmVjdCBzaWduKi8KKyAgICAgICAgYW5kaCAgICByMTEsIDB4ODAwMCwgQ09ICisgICAgICAgIG1vdiAgICAgcjEwLCAwCisgICAgICAgIGxkbSAgICAgc3ArKywgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LHBjCisJIAorMTY6ICAgICAvKiBSZXR1cm4gTmFOLiAqLworICAgICAgICBtb3YgICAgIHIxMSwgLTEKKyAgICAgICAgbW92ICAgICByMTAsIC0xCisgICAgICAgIGxkbSAgICAgc3ArKywgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LHBjCisgICAgICAgIAorMTc6ICAgICAvKiBSZXR1cm4gSU5GLiAqLworICAgICAgICBtb3YgICAgIHIxMSwgbHIgLypHZXQgY29ycmVjdCBzaWduKi8KKyAgICAgICAgYW5kaCAgICByMTEsIDB4ODAwMCwgQ09ICisgICAgICAgIG9yaCAgICAgcjExLCAweDdmZjAKKyAgICAgICAgbW92ICAgICByMTAsIDAKKyAgICAgICAgbGRtICAgICBzcCsrLCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcscGMKKworX19hdnIzMl9mNjRfZGl2X29wMV96ZXJvOgorICAgICAgICBvciAgICAgIHI1LCByOCwgcjkgPDwgMQorICAgICAgICBicmVxICAgIDE2YiAgICAgICAgICAgICAvKiAwLjAvMC4wIC0+IE5hTiAqLworICAgICAgICBiZmV4dHUgIHI0LCByOSwgMjAsIDExCisgICAgICAgIGNwICAgICAgcjQsIDB4N2ZmCisgICAgICAgIGJybmUgICAgMTViICAgICAgICAgICAgIC8qIFJldHVybiB6ZXJvICovCisgICAgICAgIC8qIENoZWNrIGlmIGRpdmlzb3IgaXMgSW5mIG9yIE5hTiAqLworICAgICAgICBvciAgICAgIHI1LCByOCwgcjkgPDwgMTIKKyAgICAgICAgYnJlcSAgICAxNWIgICAgICAgICAgICAgLyogRGl2aXNvciBpcyBpbmYgLT4gcmV0dXJuIHplcm8gKi8KKyAgICAgICAgcmptcCAgICAxNmIgICAgICAgICAgICAgLyogUmV0dXJuIE5hTiAqLyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKworI2VuZGlmICAKKyAgICAgICAgICAgICAgICAKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjMyX2FkZHN1YikgfHwgZGVmaW5lZChMX2F2cjMyX2YzMl9hZGRzdWJfZmFzdCkKKworICAgICAgICAuYWxpZ24gIDIKK19fYXZyMzJfZjMyX3N1Yl9mcm9tX2FkZDoKKyAgICAgICAgLyogU3dpdGNoIHNpZ24gb24gb3AyICovCisgICAgICAgIGVvcmggICAgcjExLCAweDgwMDAKKworI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfYWRkc3ViX2Zhc3QpCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mMzJfc3ViX2Zhc3QKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjMyX3N1Yl9mYXN0LEBmdW5jdGlvbgorX19hdnIzMl9mMzJfc3ViX2Zhc3Q6CisjZWxzZQorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX3N1YgorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfc3ViLEBmdW5jdGlvbgorX19hdnIzMl9mMzJfc3ViOgorI2VuZGlmIAorIAorICAgICAgICAvKiBDaGVjayBzaWducyAqLworICAgICAgICBlb3IgICAgIHI4LCByMTEsIHIxMgorICAgICAgICAvKiBEaWZmZXJlbnQgc2lnbnMsIHVzZSBzdWJ0cmFjdGlvbi4gKi8KKyAgICAgICAgYnJtaSAgICBfX2F2cjMyX2YzMl9hZGRfZnJvbV9zdWIKKyAKKyAgICAgICAgLyogR2V0IHNpZ24gb2Ygb3AxICovCisgICAgICAgIG1vdiAgICAgcjgsIHIxMgorICAgICAgICBhbmRoICAgIHIxMiwgMHg4MDAwLCBDT0ggICAgICAgICAgICAgICAgCisgCisgICAgICAgIC8qIFJlbW92ZSBzaWduIGZyb20gb3BlcmFuZHMgKi8KKyAgICAgICAgY2JyICAgICByMTEsIDMxCisjaWYgZGVmaW5lZChMX2F2cjMyX2YzMl9hZGRzdWJfZmFzdCkKKyAgICAgICAgcmV0ZXEgICByOCAgICAgIC8qIElmIG9wMiBpcyB6ZXJvIHJldHVybiBvcDEgKi8KKyNlbmRpZgorICAgICAgICBjYnIgICAgIHI4LCAzMQorIAorICAgICAgICAvKiBQdXQgdGhlIG51bWJlciB3aXRoIHRoZSBsYXJnZXN0IGV4cG9uZW50IGluIHIxMAorICAgICAgICAgICBhbmQgdGhlIG51bWJlciB3aXRoIHRoZSBzbWFsbGVzdCBleHBvbmVudCBpbiByOSAqLworICAgICAgICBtYXggICAgIHIxMCwgcjgsIHIxMQorICAgICAgICBtaW4gICAgIHI5LCByOCwgcjExCisgICAgICAgIGNwICAgICAgcjEwLCByOCAvKklmIGxhcmdlc3Qgb3BlcmFuZCAoaW4gUjEwKSBpcyBub3QgZXF1YWwgdG8gb3AxKi8KKyAgICAgICAgc3VibmUgICByMTIsIDEgLyogU3VidHJhY3QgMSBmcm9tIHNpZ24sIHdoaWNoIHdpbGwgaW52ZXJ0IE1TQiBvZiByMTIqLworICAgICAgICBhbmRoICAgIHIxMiwgMHg4MDAwLCBDT0ggLypNYXNrIGFsbCBidXQgTVNCKi8KKyAKKyAgICAgICAgLyogVW5wYWNrIGV4cG9uZW50IGFuZCBtYW50aXNzYSBvZiBvcDEgKi8KKyAgICAgICAgbHNsICAgICByOCwgcjEwLCA4CisgICAgICAgIHNiciAgICAgcjgsIDMxICAvKiBTZXQgaW1wbGljaXQgYml0LiAqLworICAgICAgICBsc3IgICAgIHIxMCwgMjMgCisgICAgICAgICAgICAgICAgCisgICAgICAgIC8qIG9wMSBpcyBOYU4gb3IgSW5mLiAqLworICAgICAgICBjcC53ICAgIHIxMCwgMHhmZgorICAgICAgICBicmVxICAgIF9fYXZyMzJfZjMyX3N1Yl9vcDFfbmFuX29yX2luZgorICAgICAgICAKKyAgICAgICAgLyogVW5wYWNrIGV4cG9uZW50IGFuZCBtYW50aXNzYSBvZiBvcDIgKi8KKyAgICAgICAgbHNsICAgICByMTEsIHI5LCA4CisgICAgICAgIHNiciAgICAgcjExLCAzMSAgLyogU2V0IGltcGxpY2l0IGJpdC4gKi8KKyAgICAgICAgbHNyICAgICByOSwgMjMgIAorIAorI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfYWRkc3ViKQorICAgICAgICAvKiBLZWVwIHN0aWNreSBiaXQgZm9yIGNvcnJlY3QgSUVFRSByb3VuZGluZyAqLworICAgICAgICBzdC53ICAgIC0tc3AsIHIxMgorIAorICAgICAgICAvKiBvcDIgaXMgZWl0aGVyIHplcm8gb3Igc3Vibm9ybWFsLiAqLworICAgICAgICBicmVxICAgIF9fYXZyMzJfZjMyX3N1Yl9vcDJfc3Vibm9ybWFsCiswOiAgICAgIAorICAgICAgICAvKiBHZXQgc2hpZnQgYW1vdW50IHRvIHNjYWxlIG1hbnRpc3NhIG9mIG9wMi4gKi8KKyAgICAgICAgc3ViICAgICByMTIsIHIxMCwgcjkgICAgICAgICAgICAgICAgIAorCisJYnJlcQlfX2F2cjMyX2YzMl9zdWJfc2hpZnRfZG9uZQorIAorICAgICAgICAvKiBTYXR1cmF0ZSB0aGUgc2hpZnQgYW1vdW50IHRvIDMxLiBJZiB0aGUgYW1vdW50CisgICAgICAgICAgIGlzIGFueSBsYXJnZXIgb3AyIGlzIGluc2lnbmlmaWNhbnQuICovCisgICAgICAgIHNhdHUgICAgcjEyID4+IDAsIDUgICAgICAKKworICAgICAgICAvKiBQdXQgdGhlIHJlbWFpbmluZyBiaXRzIGludG8gcjkuKi8KKyAgICAgICAgcnN1YiAgICByOSwgcjEyLCAzMgorICAgICAgICBsc2wgICAgIHI5LCByMTEsIHI5CisJCisJLyogSWYgdGhlIHJlbWFpbmluZyBiaXRzIGFyZSBub24temVybyB0aGVuIHdlIG11c3Qgc3VidHJhY3Qgb25lCisJICAgbW9yZSBmcm9tIG9wTC4gICovCisJc3VibmUJcjgsIDEKKwlzcm5lCXI5CS8qIExTQiBvZiByOSByZXByZXNlbnRzIHN0aWNreSBiaXRzLiAqLworCisgICAgICAgIC8qIFNoaWZ0IG1hbnRpc3NhIG9mIG9wMiB0byBzYW1lIGRlY2ltYWwgcG9pbnQgYXMgdGhlIG1hbnRpc3NhCisgICAgICAgICAgIG9mIG9wMS4gKi8KKyAgICAgICAgbHNyICAgICByMTEsIHIxMSwgcjEyCisgCisKK19fYXZyMzJfZjMyX3N1Yl9zaGlmdF9kb25lOgkKKyAgICAgICAgLyogTm93IHN1YnRyYWN0IHRoZSBtYW50aXNzYXMuICovCisgICAgICAgIHN1YiAgICAgcjgsIHIxMQorIAorICAgICAgICBsZC53ICAgIHIxMiwgc3ArKworIAorICAgICAgICAvKiBOb3JtYWxpemUgcmVzdWx0aW5nIG1hbnRpc3NhLiAqLworICAgICAgICBjbHogICAgIHIxMSwgcjgKKworCXJldGNzCTAKKyAgICAgICAgbHNsICAgICByOCwgcjgsIHIxMQorICAgICAgICBzdWIgICAgIHIxMCwgcjExCisgICAgICAgIGJybGUgICAgX19hdnIzMl9mMzJfc3ViX3N1Ym5vcm1hbF9yZXN1bHQKKworICAgICAgICAvKiBJbnNlcnQgdGhlIGJpdHMgd2Ugd2lsbCByZW1vdmUgZnJvbSB0aGUgbWFudGlzc2EgaW50byByOVszMToyNF0gKi8KKwlvcglyOSwgcjksIHI4IDw8IDI0CisjZWxzZQorICAgICAgICAvKiBJZ25vcmUgc3RpY2t5IGJpdCB0byBzaW1wbGlmeSBhbmQgc3BlZWQgdXAgcm91bmRpbmcgKi8KKyAgICAgICAgLyogb3AyIGlzIGVpdGhlciB6ZXJvIG9yIHN1Ym5vcm1hbC4gKi8KKyAgICAgICAgYnJlcSAgICBfX2F2cjMyX2YzMl9zdWJfb3AyX3N1Ym5vcm1hbAorMDogICAgICAKKyAgICAgICAgLyogR2V0IHNoaWZ0IGFtb3VudCB0byBzY2FsZSBtYW50aXNzYSBvZiBvcDIuICovCisgICAgICAgIHJzdWIgICAgcjksIHIxMCAgICAgICAgICAgICAgICAgCisgCisgICAgICAgIC8qIFNhdHVyYXRlIHRoZSBzaGlmdCBhbW91bnQgdG8gMzEuIElmIHRoZSBhbW91bnQKKyAgICAgICAgICAgaXMgYW55IGxhcmdlciBvcDIgaXMgaW5zaWduaWZpY2FudC4gKi8KKyAgICAgICAgc2F0dSAgICByOSA+PiAwLCA1ICAgICAgCisgCisgICAgICAgIC8qIFNoaWZ0IG1hbnRpc3NhIG9mIG9wMiB0byBzYW1lIGRlY2ltYWwgcG9pbnQgYXMgdGhlIG1hbnRpc3NhCisgICAgICAgICAgIG9mIG9wMS4gKi8KKyAgICAgICAgbHNyICAgICByMTEsIHIxMSwgcjkKKyAKKyAgICAgICAgLyogTm93IHN1YnRyYWN0IHRoZSBtYW50aXNzYXMuICovCisgICAgICAgIHN1YiAgICAgcjgsIHIxMQorIAorICAgICAgICAvKiBOb3JtYWxpemUgcmVzdWx0aW5nIG1hbnRpc3NhLiAqLworICAgICAgICBjbHogICAgIHI5LCByOAorCXJldGNzCTAKKyAgICAgICAgbHNsICAgICByOCwgcjgsIHI5CisgICAgICAgIHN1YiAgICAgcjEwLCByOQorICAgICAgICBicmxlICAgIF9fYXZyMzJfZjMyX3N1Yl9zdWJub3JtYWxfcmVzdWx0ICAgICAgICAKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgLyogUGFjayByZXN1bHQuICovCisgICAgICAgIG9yICAgICAgcjEyLCByMTIsIHI4ID4+IDgKKyAgICAgICAgYmZpbnMgICByMTIsIHIxMCwgMjMsIDggICAgICAgICAKKyAKKyAgICAgICAgLyogUm91bmQgKi8gICAgIAorX19hdnIzMl9mMzJfc3ViX3JvdW5kOgorI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfYWRkc3ViKQorCW1vdl9pbW0JcjEwLCAweDgwMDAwMDAwCisgICAgICAgIGJsZCAgICAgcjEyLCAwCisgICAgICAgIHN1Ym5lICAgcjEwLCAtMSAKKyAgICAgICAgY3AudyAgICByOSwgcjEwCisgICAgICAgIHN1YmhzICAgcjEyLCAtMQorI2Vsc2UKKyAgICAgICAgYmxkICAgICByOCwgNyAKKyAgICAgICAgYWNyICAgICByMTIKKyNlbmRpZiAgCisgICAgICAgIAorICAgICAgICByZXQgICAgIHIxMiAgICAgCisgCisgCitfX2F2cjMyX2YzMl9zdWJfb3AyX3N1Ym5vcm1hbDoKKyAgICAgICAgLyogRml4IGltcGxpY2l0IGJpdCBhbmQgYWRqdXN0IGV4cG9uZW50IG9mIHN1Ym5vcm1hbHMuICovCisgICAgICAgIGNiciAgICAgcjExLCAzMQorICAgICAgICAvKiBTZXQgZXhwb25lbnQgdG8gMSBpZiB3ZSBkbyBub3QgaGF2ZSBhIHplcm8uICovCisgICAgICAgIG1vdm5lICAgcjksMQorIAorICAgICAgICAvKiBDaGVjayBpZiBvcDEgaXMgYWxzbyBzdWJub3JtYWwuICovCisgICAgICAgIGNwLncgICAgcjEwLCAwCisgICAgICAgIGJybmUgICAgMGIKKyAKKyAgICAgICAgY2JyICAgICByOCwgMzEKKyAgICAgICAgIC8qIElmIG9wMSBpcyBub3QgemVybyBzZXQgZXhwb25lbnQgdG8gMS4gKi8KKyAgICAgICAgbW92bmUgICByMTAsMQorICAgICAgICAgICAgICAgIAorICAgICAgICByam1wICAgIDBiCisgCitfX2F2cjMyX2YzMl9zdWJfb3AxX25hbl9vcl9pbmY6IAorICAgICAgICAvKiBDaGVjayBpZiBvcDEgaXMgTmFOLCBpZiBzbyByZXR1cm4gTmFOICovCisgICAgICAgIGxzbCAgICAgcjExLCByOCwgMQorICAgICAgICByZXRuZSAgIC0xCisgCisgICAgICAgIC8qIG9wMSBpcyBJbmYuICovCisgICAgICAgIGJmaW5zICAgcjEyLCByMTAsIDIzLCA4IC8qIEdlbmVyYXRlIEluZiBpbiByMTIgKi8KKyAKKyAgICAgICAgLyogQ2hlY2sgaWYgb3AyIGlzIEluZi4gb3IgTmFOICovCisgICAgICAgIGxzciAgICAgcjExLCByOSwgMjMKKyAgICAgICAgY3AudyAgICByMTEsIDB4ZmYKKyAgICAgICAgcmV0bmUgICByMTIgICAgICAgICAgICAgLyogb3AyIG5vdCBJbmYgb3IgTmFOLCByZXR1cm4gb3AxICovCisgCisgICAgICAgIHJldCAgICAgLTEgICAgICAgICAgICAgIC8qIG9wMiBJbmYgb3IgTmFOLCByZXR1cm4gTmFOICovCisgCitfX2F2cjMyX2YzMl9zdWJfc3Vibm9ybWFsX3Jlc3VsdDoKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG51bWJlciBpcyBzbyBzbWFsbCB0aGF0CisgICAgICAgICAgIGl0IHdpbGwgYmUgcmVwcmVzZW50ZWQgd2l0aCB6ZXJvLiAqLworICAgICAgICByc3ViICAgIHIxMCwgcjEwLCA5CisgICAgICAgIHJzdWIgICAgcjExLCByMTAsIDMyCisgICAgICAgIHJldGNzICAgMAorIAorICAgICAgICAvKiBTaGlmdCB0aGUgbWFudGlzc2EgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbi4qLworICAgICAgICBsc3IgICAgIHIxMCwgcjgsIHIxMAorICAgICAgICAvKiBBZGQgc2lnbiBiaXQuICovCisgICAgICAgIG9yICAgICAgcjEyLCByMTAKKworICAgICAgICAvKiBQdXQgdGhlIHNoaWZ0ZWQgb3V0IGJpdHMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydAorICAgICAgICAgICBvZiByOC4gKi8KKyAgICAgICAgbHNsICAgICByOCwgcjgsIHIxMQorIAorI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfYWRkc3ViKQorICAgICAgICAvKiBBZGQgYWxsIHRoZSByZW1haW5kZXIgYml0cyB1c2VkIGZvciByb3VuZGluZyBpbnRvIHI5ICovCisgICAgICAgIG9yICAgICAgcjksIHI4CisjZWxzZQorICAgICAgICBsc3IgICAgIHI4LCAyNCAKKyNlbmRpZgorICAgICAgICByam1wICAgIF9fYXZyMzJfZjMyX3N1Yl9yb3VuZAorIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLmFsaWduICAyCisKK19fYXZyMzJfZjMyX2FkZF9mcm9tX3N1YjoKKyAgICAgICAgLyogU3dpdGNoIHNpZ24gb24gb3AyICovCisgICAgICAgIGVvcmggICAgcjExLCAweDgwMDAKKworI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfYWRkc3ViX2Zhc3QpCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mMzJfYWRkX2Zhc3QKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjMyX2FkZF9mYXN0LEBmdW5jdGlvbgorX19hdnIzMl9mMzJfYWRkX2Zhc3Q6CisjZWxzZQorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX2FkZAorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfYWRkLEBmdW5jdGlvbgorX19hdnIzMl9mMzJfYWRkOgorI2VuZGlmIAorCQorICAgICAgICAvKiBDaGVjayBzaWducyAqLworICAgICAgICBlb3IgICAgIHI4LCByMTEsIHIxMgorICAgICAgICAvKiBEaWZmZXJlbnQgc2lnbnMsIHVzZSBzdWJ0cmFjdGlvbi4gKi8KKyAgICAgICAgYnJtaSAgICBfX2F2cjMyX2YzMl9zdWJfZnJvbV9hZGQKKyAKKyAgICAgICAgLyogR2V0IHNpZ24gb2Ygb3AxICovCisgICAgICAgIG1vdiAgICAgcjgsIHIxMgorICAgICAgICBhbmRoICAgIHIxMiwgMHg4MDAwLCBDT0ggICAgICAgICAgICAgICAgCisgCisgICAgICAgIC8qIFJlbW92ZSBzaWduIGZyb20gb3BlcmFuZHMgKi8KKyAgICAgICAgY2JyICAgICByMTEsIDMxCisjaWYgZGVmaW5lZChMX2F2cjMyX2YzMl9hZGRzdWJfZmFzdCkKKyAgICAgICAgcmV0ZXEgICByOCAgICAgIC8qIElmIG9wMiBpcyB6ZXJvIHJldHVybiBvcDEgKi8KKyNlbmRpZgorICAgICAgICBjYnIgICAgIHI4LCAzMQorIAorICAgICAgICAvKiBQdXQgdGhlIG51bWJlciB3aXRoIHRoZSBsYXJnZXN0IGV4cG9uZW50IGluIHIxMAorICAgICAgICAgICBhbmQgdGhlIG51bWJlciB3aXRoIHRoZSBzbWFsbGVzdCBleHBvbmVudCBpbiByOSAqLworICAgICAgICBtYXggICAgIHIxMCwgcjgsIHIxMQorICAgICAgICBtaW4gICAgIHI5LCByOCwgcjExCisgCisgICAgICAgIC8qIFVucGFjayBleHBvbmVudCBhbmQgbWFudGlzc2Egb2Ygb3AxICovCisgICAgICAgIGxzbCAgICAgcjgsIHIxMCwgOAorICAgICAgICBzYnIgICAgIHI4LCAzMSAgLyogU2V0IGltcGxpY2l0IGJpdC4gKi8KKyAgICAgICAgbHNyICAgICByMTAsIDIzIAorICAgICAgICAgICAgICAgIAorICAgICAgICAvKiBvcDEgaXMgTmFOIG9yIEluZi4gKi8KKyAgICAgICAgY3AudyAgICByMTAsIDB4ZmYKKyAgICAgICAgYnJlcSAgICBfX2F2cjMyX2YzMl9hZGRfb3AxX25hbl9vcl9pbmYKKyAgICAgICAgCisgICAgICAgIC8qIFVucGFjayBleHBvbmVudCBhbmQgbWFudGlzc2Egb2Ygb3AyICovCisgICAgICAgIGxzbCAgICAgcjExLCByOSwgOAorICAgICAgICBzYnIgICAgIHIxMSwgMzEgIC8qIFNldCBpbXBsaWNpdCBiaXQuICovCisgICAgICAgIGxzciAgICAgcjksIDIzICAKKyAKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjMyX2FkZHN1YikKKyAgICAgICAgLyogb3AyIGlzIGVpdGhlciB6ZXJvIG9yIHN1Ym5vcm1hbC4gKi8KKyAgICAgICAgYnJlcSAgICBfX2F2cjMyX2YzMl9hZGRfb3AyX3N1Ym5vcm1hbAorMDogICAgICAKKyAgICAgICAgLyogS2VlcCBzdGlja3kgYml0IGZvciBjb3JyZWN0IElFRUUgcm91bmRpbmcgKi8KKyAgICAgICAgc3QudyAgICAtLXNwLCByMTIKKyAKKyAgICAgICAgLyogR2V0IHNoaWZ0IGFtb3VudCB0byBzY2FsZSBtYW50aXNzYSBvZiBvcDIuICovCisgICAgICAgIHJzdWIgICAgcjksIHIxMCAgICAgICAgICAgICAgICAgCisgCisgICAgICAgIC8qIFNhdHVyYXRlIHRoZSBzaGlmdCBhbW91bnQgdG8gMzEuIElmIHRoZSBhbW91bnQKKyAgICAgICAgICAgaXMgYW55IGxhcmdlciBvcDIgaXMgaW5zaWduaWZpY2FudC4gKi8KKyAgICAgICAgc2F0dSAgICByOSA+PiAwLCA1ICAgICAgCisgCisgICAgICAgIC8qIFNoaWZ0IG1hbnRpc3NhIG9mIG9wMiB0byBzYW1lIGRlY2ltYWwgcG9pbnQgYXMgdGhlIG1hbnRpc3NhCisgICAgICAgICAgIG9mIG9wMS4gKi8KKyAgICAgICAgbHNyICAgICByMTIsIHIxMSwgcjkKKyAKKyAgICAgICAgLyogUHV0IHRoZSByZW1haW5kaW5nIGJpdHMgaW50byByMTFbMjM6Li5dLiovCisgICAgICAgIHJzdWIgICAgcjksIHI5LCAoMzItOCkKKyAgICAgICAgbHNsICAgICByMTEsIHIxMSwgcjkKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBiaXRzIHdlIHdpbGwgcmVtb3ZlIGZyb20gdGhlIG1hbnRpc3NhIGludG8gcjExWzMxOjI0XSAqLworICAgICAgICBiZmlucyAgIHIxMSwgcjEyLCAyNCwgOAorIAorICAgICAgICAvKiBOb3cgYWRkIHRoZSBtYW50aXNzYXMuICovCisgICAgICAgIGFkZCAgICAgcjgsIHIxMgorIAorICAgICAgICBsZC53ICAgIHIxMiwgc3ArKworI2Vsc2UKKyAgICAgICAgLyogSWdub3JlIHN0aWNreSBiaXQgdG8gc2ltcGxpZnkgYW5kIHNwZWVkIHVwIHJvdW5kaW5nICovCisgICAgICAgIC8qIG9wMiBpcyBlaXRoZXIgemVybyBvciBzdWJub3JtYWwuICovCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mMzJfYWRkX29wMl9zdWJub3JtYWwKKzA6ICAgICAgCisgICAgICAgIC8qIEdldCBzaGlmdCBhbW91bnQgdG8gc2NhbGUgbWFudGlzc2Egb2Ygb3AyLiAqLworICAgICAgICByc3ViICAgIHI5LCByMTAgICAgICAgICAgICAgICAgIAorIAorICAgICAgICAvKiBTYXR1cmF0ZSB0aGUgc2hpZnQgYW1vdW50IHRvIDMxLiBJZiB0aGUgYW1vdW50CisgICAgICAgICAgIGlzIGFueSBsYXJnZXIgb3AyIGlzIGluc2lnbmlmaWNhbnQuICovCisgICAgICAgIHNhdHUgICAgcjkgPj4gMCwgNSAgICAgIAorIAorICAgICAgICAvKiBTaGlmdCBtYW50aXNzYSBvZiBvcDIgdG8gc2FtZSBkZWNpbWFsIHBvaW50IGFzIHRoZSBtYW50aXNzYQorICAgICAgICAgICBvZiBvcDEuICovCisgICAgICAgIGxzciAgICAgcjExLCByMTEsIHI5CisgCisgICAgICAgIC8qIE5vdyBhZGQgdGhlIG1hbnRpc3Nhcy4gKi8KKyAgICAgICAgYWRkICAgICByOCwgcjExCisgICAgICAgIAorI2VuZGlmCisgICAgICAgIC8qIENoZWNrIGlmIHdlIG92ZXJmbG93ZWQuICovCisgICAgICAgIGJyY3MgICAgX19hdnIzMl9mMzJfYWRkX3Jlc19vZgorMTogICAgICAKKyAgICAgICAgLyogUGFjayByZXN1bHQuICovCisgICAgICAgIG9yICAgICAgcjEyLCByMTIsIHI4ID4+IDgKKyAgICAgICAgYmZpbnMgICByMTIsIHIxMCwgMjMsIDggICAgICAgICAKKyAKKyAgICAgICAgLyogUm91bmQgKi8gICAgIAorI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfYWRkc3ViKQorCW1vdl9pbW0JcjEwLCAweDgwMDAwMDAwCisgICAgICAgIGJsZCAgICAgcjEyLCAwCisgICAgICAgIHN1Ym5lICAgcjEwLCAtMSAKKyAgICAgICAgY3AudyAgICByMTEsIHIxMAorICAgICAgICBzdWJocyAgIHIxMiwgLTEKKyNlbHNlCisgICAgICAgIGJsZCAgICAgcjgsIDcgCisgICAgICAgIGFjciAgICAgcjEyCisjZW5kaWYgIAorCisgICAgICAgIHJldCAgICAgcjEyICAgICAKKyAKK19fYXZyMzJfZjMyX2FkZF9vcDJfc3Vibm9ybWFsOgorICAgICAgICAvKiBGaXggaW1wbGljaXQgYml0IGFuZCBhZGp1c3QgZXhwb25lbnQgb2Ygc3Vibm9ybWFscy4gKi8KKyAgICAgICAgY2JyICAgICByMTEsIDMxCisgICAgICAgIC8qIFNldCBleHBvbmVudCB0byAxIGlmIHdlIGRvIG5vdCBoYXZlIGEgemVyby4gKi8KKyAgICAgICAgbW92bmUgICByOSwxCisgCisgICAgICAgIC8qIENoZWNrIGlmIG9wMSBpcyBhbHNvIHN1Ym5vcm1hbC4gKi8KKyAgICAgICAgY3AudyAgICByMTAsIDAKKyAgICAgICAgYnJuZSAgICAwYgorCS8qIEJvdGggb3BlcmFuZHMgc3Vibm9ybWFsLCBqdXN0IGFkZCB0aGUgbWFudGlzc2FzIGFuZCAKKwkgICBwYWNrLiBJZiB0aGUgYWRkaXRpb24gb2YgdGhlIHN1Ym5vcm1hbCBudW1iZXJzIHJlc3VsdHMKKwkgICBpbiBhIG5vcm1hbCBudW1iZXIgdGhlbiB0aGUgZXhwb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5CisJICAgYmUgc2V0IHRvIDEgYnkgdGhlIGFkZGl0aW9uLiAqLworICAgICAgICBjYnIgICAgIHI4LCAzMQorCWFkZAlyMTEsIHI4CisJb3IJcjEyLCByMTIsIHIxMSA+PiA4CisJcmV0CXIxMgorIAorX19hdnIzMl9mMzJfYWRkX29wMV9uYW5fb3JfaW5mOiAKKyAgICAgICAgLyogQ2hlY2sgaWYgb3AxIGlzIE5hTiwgaWYgc28gcmV0dXJuIE5hTiAqLworICAgICAgICBsc2wgICAgIHIxMSwgcjgsIDEKKyAgICAgICAgcmV0bmUgICAtMQorIAorICAgICAgICAvKiBvcDEgaXMgSW5mLiAqLworICAgICAgICBiZmlucyAgIHIxMiwgcjEwLCAyMywgOCAvKiBHZW5lcmF0ZSBJbmYgaW4gcjEyICovCisgCisgICAgICAgIC8qIENoZWNrIGlmIG9wMiBpcyBJbmYuIG9yIE5hTiAqLworICAgICAgICBsc3IgICAgIHIxMSwgcjksIDIzCisgICAgICAgIGNwLncgICAgcjExLCAweGZmCisgICAgICAgIHJldG5lICAgcjEyICAgICAgICAgICAgIC8qIG9wMiBub3QgSW5mIG9yIE5hTiwgcmV0dXJuIG9wMSAqLworIAorICAgICAgICBsc2wgICAgIHI5LCA5CisgICAgICAgIHJldGVxICAgcjEyICAgICAgICAgICAgIC8qIG9wMiBJbmYgcmV0dXJuIG9wMSAqLworICAgICAgICByZXQgICAgIC0xICAgICAgICAgICAgICAvKiBvcDIgaXMgTmFOLCByZXR1cm4gTmFOICovIAorIAorX19hdnIzMl9mMzJfYWRkX3Jlc19vZjoKKyAgICAgICAgLyogV2Ugb3ZlcmZsb3dlZC4gSW5jcmVhc2UgZXhwb25lbnQgYW5kIHNoaWZ0IG1hbnRpc3NhLiovCisgICAgICAgIGxzciAgICAgcjgsIDEKKyAgICAgICAgc3ViICAgICByMTAsIC0xCisgCisgICAgICAgIC8qIENsZWFyIG1hbnRpc3NhIHRvIHNldCByZXN1bHQgdG8gSW5mIGlmIHRoZSBleHBvbmVudCBpcyAyNTUuICovCisgICAgICAgIGNwLncgICAgcjEwLCAyNTUKKyAgICAgICAgbW92ZXEgICByOCwgMAorICAgICAgICBtb3ZlcSAgIHIxMSwgMAorICAgICAgICByam1wICAgIDFiICAgICAgCisgICAgICAgIAorICAgICAgICAKKyNlbmRpZgorCisJCisjaWYgZGVmaW5lZChMX2F2cjMyX2YzMl9kaXYpIHx8IGRlZmluZWQoTF9hdnIzMl9mMzJfZGl2X2Zhc3QpCisJLmFsaWduCTIKKworI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfZGl2X2Zhc3QpCisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mMzJfZGl2X2Zhc3QKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjMyX2Rpdl9mYXN0LEBmdW5jdGlvbgorX19hdnIzMl9mMzJfZGl2X2Zhc3Q6CisjZWxzZQorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX2RpdgorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfZGl2LEBmdW5jdGlvbgorX19hdnIzMl9mMzJfZGl2OgorI2VuZGlmCisJIAorICAgICAgICBlb3IgICAgIHI4LCByMTEsIHIxMiAgICAgICAgICAgIC8qIE1TQihyOCkgPSBTaWduKG9wMSkgXiBTaWduKG9wMikgKi8KKyAKKyAgICAgICAgLyogVW5wYWNrICovCisgICAgICAgIGxzbCAgICAgcjEyLDEKKyAgICAgICAgcmV0ZXEgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gemVybyBpZiBvcDEgaXMgemVybyAqLworICAgICAgICBsc2wgICAgIHIxMSwxCisgICAgICAgIGJyZXEgICAgNGYgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgb3AyIGZvciB6ZXJvICovCisgICAgICAgIAorICAgICAgICAvKiBVbnBhY2sgb3AxKi8gCisgICAgICAgIC8qIGV4cDogcjkgKi8KKyAgICAgICAgLyogc2Y6ICByMTIgKi8KKyAgICAgICAgbHNyICAgICByOSwgcjEyLCAyNAorICAgICAgICBicmVxICAgIDExZiAvKklmIG51bWJlciBpcyBzdWJub3JtYWwqLworICAgICAgICBjcCAgICAgIHI5LCAweGZmCisgICAgICAgIGJyaHMgICAgMmYgIC8qIENoZWNrIG9wMSBmb3IgTmFOIG9yIEluZiAqLyAgICAgIAorICAgICAgICBsc2wgICAgIHIxMiwgNworICAgICAgICBzYnIgICAgIHIxMiwgMzEgLypJbXBsaWNpdCBiaXQqLworMTI6ICAgICAgICAgICAgICAgICAgICAgCisgCisgICAgICAgIC8qIFVucGFjayBvcDIqLworICAgICAgICAvKiBleHA6IHIxMCAqLworICAgICAgICAvKiBzZjogIHIxMSAqLworICAgICAgICBsc3IgICAgIHIxMCwgcjExLCAyNAorICAgICAgICBicmVxICAgIDEzZiAvKklmIG51bWJlciBpcyBzdWJub3JtYWwqLworICAgICAgICBjcCAgICAgIHIxMCwgMHhmZgorICAgICAgICBicmhzICAgIDNmICAvKiBDaGVjayBvcDIgZm9yIE5hTiBvciBJbmYgKi8gICAgICAKKyAgICAgICAgCisgICAgICAgIGxzbCAgICAgcjExLDcKKyAgICAgICAgc2JyICAgICByMTEsIDMxIC8qSW1wbGljaXQgYml0Ki8KKzE0OiAgICAgCisgCisgICAgICAgIC8qIEZvciBVQzMsIHN0b3JlIHdpdGggcHJlZGVjcmVtZW50IGlzIGZhc3RlciB0aGFuIHN0bSAqLworICAgICAgICBzdC53ICAgIC0tc3AsIHI1CisgICAgICAgIHN0LmQgICAgLS1zcCwgcjYKKyAKKyAgICAgICAgLyogQ2FsY3VsYXRlIG5ldyBleHBvbmVudCAqLworICAgICAgICBzdWIgICAgIHI5LCByMTAKKyAgICAgICAgc3ViICAgICByOSwtMTI3CisgCisgICAgICAgIC8qIERpdmlkZSAqLworICAgICAgICAvKiBBcHByb3hpbWF0aW5nIDEvZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVjdXJyZW5jZTogKi8KKyAgICAgICAgLyogUltqKzFdID0gUltqXSooMi1SW2pdKmQpICovCisgICAgICAgIC8qIFVzaW5nIDIuMzAgZm9ybWF0ICovCisgICAgICAgIC8qIFRXTzogIHIxMCAqLworICAgICAgICAvKiBkOiAgICByNSAqLworICAgICAgICAvKiBNdWx0aXBseSByZXN1bHQgOiAgICAgcjYsIHI3ICovCisgICAgICAgIC8qIEluaXRpYWwgZ3Vlc3MgOiAgICAgICByMTEgKi8KKyAgICAgICAgLyogTmV3IGFwcHJveGltYXRpb25zIDogIHIxMSAqLworICAgICAgICAvKiBEaXZpZGVuZCA6ICAgICAgICAgICAgcjEyICovCisKKwkvKiBMb2FkIFRXTyAqLworCW1vdl9pbW0JcjEwLCAweDgwMDAwMDAwIAorICAgICAgICAgCisgICAgICAgIGxzciAgICAgcjEyLCAyICAgICAvKiBHZXQgc2lnbmlmaWNhbmQgb2YgT3AxIGluIDIuMzAgZm9ybWF0ICovCisgICAgICAgIGxzciAgICAgcjUsIHIxMSwgMiAvKiBHZXQgc2lnbmlmaWNhbmQgb2YgT3AyICg9ZCkgaW4gMi4zMCBmb3JtYXQgKi8KKyAKKyAgICAgICAgLyogTG9hZCBpbml0aWFsIGd1ZXNzLCB1c2luZyBsb29rLXVwIHRhYmxlICovCisgICAgICAgIC8qIEluaXRpYWwgZ3Vlc3MgaXMgb2YgZm9ybWF0IDAxLlhZLCB3aGVyZSBYWSBpcyBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOiAqLworICAgICAgICAvKiBMZXQgZCBiZSBvZiBmb2xsb3dpbmcgZm9ybWF0OiAwMC4xeHkuLi4uLiwgdGhlbiBYWT1+eHkgKi8KKyAgICAgICAgLyogRm9yIGQ9MDAuMTAwID0gMCw1ICAgLT4gaW5pdGlhbCBndWVzcz0wMS4xMSA9IDEsNzUgKi8KKyAgICAgICAgLyogRm9yIGQ9MDAuMTAxID0gMCw2MjUgLT4gaW5pdGlhbCBndWVzcz0wMS4xMSA9IDEsNSAgKi8KKyAgICAgICAgLyogRm9yIGQ9MDAuMTEwID0gMCw3NSAgLT4gaW5pdGlhbCBndWVzcz0wMS4xMSA9IDEsMjUgKi8KKyAgICAgICAgLyogRm9yIGQ9MDAuMTExID0gMCw4NzUgLT4gaW5pdGlhbCBndWVzcz0wMS4xMSA9IDEsMCAgKi8KKyAKKyAgICAgICAgbHNyICAgICByMTEsIHIxMCwgMQorICAgICAgICBiZmV4dHUgIHI2LCByNSwgMjcsIDIKKyAgICAgICAgY29tICAgICByNgorICAgICAgICBiZmlucyAgIHIxMSwgcjYsIDI4LCAyCisgCisgICAgICAgIC8qIEZpcnN0IGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogcjcgPSBSW2pdKmQgKi8KKyAgICAgICAgbXVsdS5kICByNiwgcjExLCByNQorICAgICAgICAvKiByNyA9IDItUltqXSpkICovCisgICAgICAgIHN1YiAgICByNywgcjEwLCByNzw8MgorICAgICAgICAvKiByMTEgPSBSW2pdKigyLVJbal0qZCkgKi8KKyAgICAgICAgbXVsdS5kICByNiwgcjExLCByNworICAgICAgICBsc2wgICAgIHIxMSwgcjcsIDIKKyAgICAgICAgIAorICAgICAgICAvKiBTZWNvbmQgYXBwcm94aW1hdGlvbiAqLworICAgICAgICAvKiByNyA9IFJbal0qZCAqLworICAgICAgICBtdWx1LmQgIHI2LCByMTEsIHI1CisgICAgICAgIC8qIHI3ID0gMi1SW2pdKmQgKi8KKyAgICAgICAgc3ViICAgIHI3LCByMTAsIHI3PDwyCisgICAgICAgIC8qIHIxMSA9IFJbal0qKDItUltqXSpkKSAqLworICAgICAgICBtdWx1LmQgIHI2LCByMTEsIHI3CisgICAgICAgIGxzbCAgICAgcjExLCByNywgMgorICAgICAgICAgCisgICAgICAgIC8qIFRoaXJkIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogcjcgPSBSW2pdKmQgKi8KKyAgICAgICAgbXVsdS5kICByNiwgcjExLCByNQorICAgICAgICAvKiByNyA9IDItUltqXSpkICovCisgICAgICAgIHN1YiAgICByNywgcjEwLCByNzw8MgorICAgICAgICAvKiByMTEgPSBSW2pdKigyLVJbal0qZCkgKi8KKyAgICAgICAgbXVsdS5kICByNiwgcjExLCByNworICAgICAgICBsc2wgICAgIHIxMSwgcjcsIDIKKyAKKyAgICAgICAgLyogRm91cnRoIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgLyogcjcgPSBSW2pdKmQgKi8KKyAgICAgICAgbXVsdS5kICByNiwgcjExLCByNQorICAgICAgICAvKiByNyA9IDItUltqXSpkICovCisgICAgICAgIHN1YiAgICByNywgcjEwLCByNzw8MgorICAgICAgICAvKiByMTEgPSBSW2pdKigyLVJbal0qZCkgKi8KKyAgICAgICAgbXVsdS5kICByNiwgcjExLCByNworICAgICAgICBsc2wgICAgIHIxMSwgcjcsIDIKKyAKKyAKKyAgICAgICAgLyogTXVsdGlwbHkgd2l0aCBkaXZpZGVuZCB0byBnZXQgcXVvdGllbnQsIHI3ID0gc2Yob3AxKS9zZihvcDIpICovCisgICAgICAgIG11bHUuZCAgcjYsIHIxMSwgcjEyCisgCisgICAgICAgIC8qIFNoaWZ0IGJ5IDMgdG8gZ2V0IHJlc3VsdCBpbiAxLjMxIGZvcm1hdCwgYXMgcmVxdWlyZWQgYnkgdGhlIGV4cG9uZW50LiAqLworICAgICAgICAvKiBOb3RlIHRoYXQgMS4zMSBmb3JtYXQgaXMgYWxyZWFkeSB1c2VkIGJ5IHRoZSBleHBvbmVudCBpbiByOSwgc2luY2UgKi8KKyAgICAgICAgLyogYSBiaWFzIG9mIDEyNyB3YXMgYWRkZWQgdG8gdGhlIHJlc3VsdCBleHBvbmVudCwgZXZlbiB0aG91Z2ggdGhlIGltcGxpY2l0ICovCisgICAgICAgIC8qIGJpdCB3YXMgaW5zZXJ0ZWQuIFRoaXMgZ2l2ZXMgdGhlIGV4cG9uZW50IGFuIGFkZGl0aW9uYWwgYmlhcyBvZiAxLCB3aGljaCAqLworICAgICAgICAvKiBzdXBwb3J0cyAxLjMxIGZvcm1hdC4gKi8KKwkvL2xzbCAgICAgcjEwLCByNywgMworCisJLyogQWRqdXN0IGV4cG9uZW50IGFuZCBtYW50aXNzYSBpbiBjYXNlIHRoZSByZXN1bHQgaXMgb2YgZm9ybWF0CisJICAgMDAwMC4xeHh4IHRvIDAwMDEueHh4Ki8JCisjaWYgZGVmaW5lZChMX2F2cjMyX2YzMl9kaXYpCisJbHNyCXIxMiwgNAkvKiBTY2FsZSBkaXZpZGVuZCB0byA2LjI2IGZvcm1hdCB0byBtYXRjaCB0aGUKKwkJCSAgIHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhlIGRpdmlzb3IgYW5kIAorCQkJICAgcXVvdGllbnQgdG8gZ2V0IHRoZSByZW1haW5kZXIuICovCisjZW5kaWYKKwlibGQJcjcsIDMxLTMKKwlicmVxCTBmCisJbHNsCXI3LCAxCQorCXN1YglyOSwgMQorI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfZGl2KQorCWxzbAlyMTIsIDEJLyogU2NhbGUgZGl2aWRlbmQgdG8gNS4yNyBmb3JtYXQgdG8gbWF0Y2ggdGhlCisJCQkgICByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoZSBkaXZpc29yIGFuZCAKKwkJCSAgIHF1b3RpZW50IHRvIGdldCB0aGUgcmVtYWluZGVyLiAqLworI2VuZGlmCiswOgkJCisgICAgICAgIGNwICAgICAgcjksIDAgICAKKyAgICAgICAgYnJsZSAgICBfX2F2cjMyX2YzMl9kaXZfcmVzX3N1Ym5vcm1hbCAvKiBSZXN1bHQgd2FzIHN1Ym5vcm1hbC4gKi8KKworCQkKKyNpZiBkZWZpbmVkKExfYXZyMzJfZjMyX2RpdikKKwkvKiBJbiBvcmRlciB0byByb3VuZCBjb3JyZWN0bHkgd2UgY2FsY3VsYXRlIHRoZSByZW1haW5kZXI6CQorCSAgIFJlbWFpbmRlciA9IGRpdmlkZW5kW3IxMl0gLSBkaXZpc29yW3I1XSpxdW90aWVudFtyN10gCisJICAgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIHF1b3RpZW50IGlzIGhhbGZ3YXkgYmV0d2VlbiB0aGUgcm91bmQtdXAKKwkgICB2YWx1ZSBhbmQgdGhlIHJvdW5kIGRvd24gdmFsdWUuIElmIHRoZSByZW1haW5kZXIgdGhlbiBpcyBuZWdhdGl2ZQorCSAgIGl0IG1lYW5zIHRoYXQgdGhlIHF1b3RpZW50IHdhcyB0byBiaWcgYW5kIHRoYXQgaXQgc2hvdWxkIG5vdCBiZQorICAgICAgICAgICByb3VuZGVkIHVwLCBpZiB0aGUgcmVtYWluZGVyIGlzIHBvc2l0aXZlIHRoZSBxdW90aWVudCB3YXMgdG8gc21hbGwKKwkgICBhbmQgd2UgbmVlZCB0byByb3VuZCB1cC4gSWYgdGhlIHJlbWFpbmRlciBpcyB6ZXJvIGl0IG1lYW5zIHRoYXQgdGhlCisJICAgcXVvdGllbnQgaXMgZXhhY3QgYnV0IHNpbmNlIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBndWFyZCBiaXQgd2Ugc2hvdWxkCisJICAgcm91bmQgdG8gZXZlbi4gKi8KKwlhbmRsCXI3LCAweGZmZTAKKwlvcmwJcjcsIDB4MDAxMAorCisJLyogTm93IGRvIHRoZSBtdWx0aXBsaWNhdGlvbi4gVGhlIHF1b3RpZW50IGhhcyB0aGUgZm9ybWF0IDQuMjgKKwkgICB3aGlsZSB0aGUgZGl2aXNvciBoYXMgdGhlIGZvcm1hdCAyLjMwIHdoaWNoIGdpdmVzIGEgcmVzdWx0CisJICAgb2YgNi4yNiAqLworCW11bHUuZAlyMTAsIHI1LCByNworCisJLyogQ2hlY2sgaWYgcmVtYWluZGVyIGlzIHBvc2l0aXZlLCBuZWdhdGl2ZSBvciBlcXVhbC4gKi8KKwliZmV4dHUJcjUsIHI3LCA1LCAxICAvKiBHZXQgcGFyaXR5IGJpdCBpbnRvIGJpdCAwIG9mIHI1ICovIAorCWNwCXIxMCwgMAorX19hdnIzMl9mMzJfZGl2X3JvdW5kX3N1Ym5vcm1hbDoJCisJY3BjCXIxMSwgcjEyCisJc3JsbwlyMTEJLyogUmVtYWluZGVyIHBvc2l0aXZlOgkgd2UgbmVlZCB0byByb3VuZCB1cC4qLworCW1vdmVxCXIxMSwgcjUgIC8qIFJlbWFpbmRlciB6ZXJvOgkgcm91bmQgdXAgaWYgbWFudGlzc2Egb2RkLiAqLworI2Vsc2UKKwliZmV4dHUJcjExLCByNywgNCwgMSAgLyogR2V0IGd1YXJkIGJpdCAqLyAJCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLyogUGFjayBmaW5hbCByZXN1bHQqLworICAgICAgICBsc3IgICAgIHIxMiwgcjcsIDUKKyAgICAgICAgYmZpbnMgICByMTIsIHI5LCAyMywgOAorICAgICAgICAvKiBGb3IgVUMzLCBsb2FkIHdpdGggcG9zdGluY3JlbWVudCBpcyBmYXN0ZXIgdGhhbiBsZG0gKi8KKyAgICAgICAgbGQuZCAgICByNiwgc3ArKworICAgICAgICBsZC53ICAgIHI1LCBzcCsrCisgICAgICAgIGJsZCAgICAgcjgsIDMxCisgICAgICAgIGJzdCAgICAgcjEyLCAzMQorCS8qIFJvdW5kaW5nIGFkZC4gKi8KKwlhZGQJcjEyLCByMTEKKyAgICAgICAgcmV0ICAgICByMTIKKworX19kaXZzZl9yZXR1cm5fb3AxOiAgICAgCisgICAgICAgIGxzbCAgICAgcjgsIDEKKyAgICAgICAgcm9yICAgICByMTIKKyAgICAgICAgcmV0ICAgICByMTIKKyAKKyAKKzI6CisgICAgICAgIC8qIE9wMSBpcyBOYU4gb3IgaW5mICovCisgICAgICAgIHJldG5lICAgLTEgICAgICAvKiBSZXR1cm4gTmFOIGlmIG9wMSBpcyBOYU4gKi8KKyAgICAgICAgLyogT3AxIGlzIGluZiBjaGVjayBvcDIgKi8KKwltb3ZfaW1tCXI5LCAweGZmMDAwMDAwCisgICAgICAgIGNwICAgICAgcjExLCByOQorICAgICAgICBicmxvICAgIF9fZGl2c2ZfcmV0dXJuX29wMSAvKiBpbmYvbnVtYmVyIGdpdmVzIGluZiAqLworICAgICAgICByZXQgICAgIC0xICAgICAgLyogVGhlIHJlc3QgZ2l2ZXMgTmFOKi8KKzM6ICAgICAgCisgICAgICAgIC8qIE9wMiBpcyBOYU4gb3IgaW5mICovCisgICAgICAgIHJldGVxICAgMCAgICAgICAvKiBSZXR1cm4gemVybyBpZiBudW1iZXIvaW5mKi8KKyAgICAgICAgcmV0ICAgICAtMSAgICAgIC8qIFJldHVybiBOYU4qLworNDoKKyAgICAgICAgLyogT3AyIGlzIHplcm8gPyAqLworICAgICAgICB0c3QgICAgIHIxMixyMTIKKyAgICAgICAgcmV0ZXEgICAtMSAgICAgIC8qIDAuMC8wLjAgaXMgTmFOICovCisgICAgICAgIC8qIE5vbnplcm8vMC4wIGlzIEluZi4gU2lnbiBiaXQgd2lsbCBiZSBzaGlmdGVkIGluIGJlZm9yZSByZXR1cm5pbmcqLworCW1vdl9pbW0JcjEyLCAweGZmMDAwMDAwCisgICAgICAgIHJqbXAgICAgX19kaXZzZl9yZXR1cm5fb3AxCisgICAgICAgICAgICAgICAgCisxMTogICAgIC8qIE9wMSB3YXMgZGVub3JtYWwuIEZpeCBpdC4gKi8KKyAgICAgICAgbHNsICAgICByMTIsNworICAgICAgICBjbHogICAgIHI5LHIxMgorICAgICAgICBsc2wgICAgIHIxMixyMTIscjkKKyAgICAgICAgcnN1YiAgICByOSxyOSwxCisgICAgICAgIHJqbXAgICAgMTJiCisgCisxMzogICAgIC8qIE9wMiB3YXMgZGVub3JtYWwuIEZpeCBpdC4gKi8gCisgICAgICAgIGxzbCAgICAgcjExLDcKKyAgICAgICAgY2x6ICAgICByMTAscjExCisgICAgICAgIGxzbCAgICAgcjExLHIxMSxyMTAKKyAgICAgICAgcnN1YiAgICByMTAscjEwLDEKKyAgICAgICAgcmptcCAgICAxNGIKKyAgICAgICAgCisgCitfX2F2cjMyX2YzMl9kaXZfcmVzX3N1Ym5vcm1hbDogICAgIC8qIERpdmlkZSByZXN1bHQgd2FzIHN1Ym5vcm1hbCAqLworI2lmIGRlZmluZWQoTF9hdnIzMl9mMzJfZGl2KQorCS8qIENoZWNrIGhvdyBtdWNoIHdlIG11c3Qgc2NhbGUgZG93biB0aGUgbWFudGlzc2EuICovCisJbmVnCXI5CisJc3ViCXI5LCAtMSAgICAgLyogV2UgZG8gbm8gbG9uZ2VyIGhhdmUgYW4gaW1wbGljaXQgYml0LiAqLworCXNhdHUJcjkgPj4gMCwgNSAvKiBTYXR1cmF0ZSBzaGlmdCBhbW91bnQgdG8gbWF4IDMyLiAqLworCS8qIFNjYWxlIGRvd24gcXVvdGllbnQgKi8KKwlyc3ViCXIxMCwgcjksIDMyCisJbHNyCXI3LCByNywgcjkKKwkvKiBTY2FsZSBkb3duIHRoZSBkaXZpZGVuZCB0byBtYXRjaCB0aGUgc2NhbGluZyBvZiB0aGUgcXVvdGllbnQuICovCisJbHNsCXI2LCByMTIsIHIxMAkvKiBNYWtlIHRoZSBkaXZpZGVudCA2NC1iaXQgYW5kIHB1dCB0aGUgbHN3IGluIHI2ICovCisJbHNyCXIxMiwgcjEyLCByOQorCisJLyogU3RhcnQgcGVyZm9ybWluZyB0aGUgc2FtZSByb3VuZGluZyBhcyBkb25lIGZvciBub3JtYWwgbnVtYmVycworCSAgIGJ1dCB0aGlzIHRpbWUgd2UgaGF2ZSBzY2FsZWQgdGhlIHF1b3RpZW50IGFuZCBkaXZpZGVuZCBhbmQgaGVuY2UKKwkgICBuZWVkIGEgbGl0dGxlIGRpZmZlcmVudCBjb21wYXJpc29uLiAqLworCWFuZGwJcjcsIDB4ZmZlMAorCW9ybAlyNywgMHgwMDEwCisKKwkvKiBOb3cgZG8gdGhlIG11bHRpcGxpY2F0aW9uLiBUaGUgcXVvdGllbnQgaGFzIHRoZSBmb3JtYXQgNC4yOAorCSAgIHdoaWxlIHRoZSBkaXZpc29yIGhhcyB0aGUgZm9ybWF0IDIuMzAgd2hpY2ggZ2l2ZXMgYSByZXN1bHQKKwkgICBvZiA2LjI2ICovCisJbXVsdS5kCXIxMCwgcjUsIHI3CisKKwkvKiBTZXQgZXhwb25lbnQgdG8gMCAqLworCW1vdglyOSwgMAkKKworCS8qIENoZWNrIGlmIHJlbWFpbmRlciBpcyBwb3NpdGl2ZSwgbmVnYXRpdmUgb3IgZXF1YWwuICovCisJYmZleHR1CXI1LCByNywgNSwgMSAgLyogR2V0IHBhcml0eSBiaXQgaW50byBiaXQgMCBvZiByNSAqLyAKKwljcAlyMTAsIHI2CisJcmptcAlfX2F2cjMyX2YzMl9kaXZfcm91bmRfc3Vibm9ybWFsCisKKyNlbHNlCisgICAgICAgIGxkLmQgICAgcjYsIHNwKysKKyAgICAgICAgbGQudyAgICByNSwgc3ArKworICAgICAgICAvKkZsdXNoIHRvIHplcm8qLworCXJldAkwCisjZW5kaWYKKyNlbmRpZgorIAorI2lmZGVmIExfYXZyMzJfZjMyX211bAorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX211bAorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfbXVsLEBmdW5jdGlvbgorIAorICAgICAgICAgICAgICAgIAorX19hdnIzMl9mMzJfbXVsOgorICAgICAgICBtb3YgICAgIHI4LCByMTIKKyAgICAgICAgZW9yICAgICByMTIsIHIxMSAgICAgICAgICAgICAgICAvKiBNU0IocjgpID0gU2lnbihvcDEpIF4gU2lnbihvcDIpICovCisgICAgICAgIGFuZGggICAgcjEyLCAweDgwMDAsIENPSAorICAgICAgICAKKyAgICAgICAgLyogYXJyYW5nZSBvcGVyYW5kcyBzbyB0aGF0IHRoYXQgb3AxID49IG9wMiAqLworICAgICAgICBjYnIgICAgIHI4LCAzMQorICAgICAgICBicmVxICAgIF9fYXZyMzJfZjMyX211bF9vcDFfemVybworICAgICAgICBjYnIgICAgIHIxMSwgMzEKKyAKKyAgICAgICAgLyogUHV0IHRoZSBudW1iZXIgd2l0aCB0aGUgbGFyZ2VzdCBleHBvbmVudCBpbiByMTAKKyAgICAgICAgICAgYW5kIHRoZSBudW1iZXIgd2l0aCB0aGUgc21hbGxlc3QgZXhwb25lbnQgaW4gcjkgKi8KKyAgICAgICAgbWF4ICAgICByMTAsIHI4LCByMTEKKyAgICAgICAgbWluICAgICByOSwgcjgsIHIxMQorIAorICAgICAgICAvKiBVbnBhY2sgZXhwb25lbnQgYW5kIG1hbnRpc3NhIG9mIG9wMSAqLworICAgICAgICBsc2wgICAgIHI4LCByMTAsIDgKKyAgICAgICAgc2JyICAgICByOCwgMzEgIC8qIFNldCBpbXBsaWNpdCBiaXQuICovCisgICAgICAgIGxzciAgICAgcjEwLCAyMyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLyogb3AxIGlzIE5hTiBvciBJbmYuICovCisgICAgICAgIGNwLncgICAgcjEwLCAweGZmCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mMzJfbXVsX29wMV9uYW5fb3JfaW5mCisgICAgICAgIAorICAgICAgICAvKiBVbnBhY2sgZXhwb25lbnQgYW5kIG1hbnRpc3NhIG9mIG9wMiAqLworICAgICAgICBsc2wgICAgIHIxMSwgcjksIDgKKyAgICAgICAgc2JyICAgICByMTEsIDMxICAvKiBTZXQgaW1wbGljaXQgYml0LiAqLworICAgICAgICBsc3IgICAgIHI5LCAyMyAgCisgCisgICAgICAgIC8qIG9wMiBpcyBlaXRoZXIgemVybyBvciBzdWJub3JtYWwuICovCisgICAgICAgIGJyZXEgICAgX19hdnIzMl9mMzJfbXVsX29wMl9zdWJub3JtYWwKKzA6ICAgICAgCisgICAgICAgIC8qIENhbGN1bGF0ZSBuZXcgZXhwb25lbnQgKi8KKyAgICAgICAgYWRkICAgICByOSxyMTAKKyAKKyAgICAgICAgLyogRG8gdGhlIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgIG11bHUuZCAgcjEwLHI4LHIxMQorIAorICAgICAgICAvKiBXZSBtaWdodCBuZWVkIHRvIHNjYWxlIHVwIGJ5IHR3byBpZiB0aGUgTVNCIG9mIHRoZSByZXN1bHQgaXMKKyAgICAgICAgICAgemVyby4gKi8KKyAgICAgICAgbHNsICAgICByOCwgcjExLCAxCisgICAgICAgIG1vdmNjICAgcjExLCByOAorICAgICAgICBzdWJjYyAgIHI5LCAxCisgCisgICAgICAgIC8qIFB1dCB0aGUgc2hpZnRlZCBvdXQgYml0cyBvZiB0aGUgbWFudGlzc2EgaW50byByMTAgKi8KKyAgICAgICAgbHNyICAgICByMTAsIDgKKyAgICAgICAgYmZpbnMgICByMTAsIHIxMSwgMjQsIDgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgc3ViICAgICByOSwoMTI3LTEpICAgICAgICAgICAgICAvKiByZW1vdmUgZXh0cmEgZXhwb25lbnQgYmlhcyAqLworICAgICAgICBicmxlICAgIF9fYXZyMzJfZjMyX211bF9yZXNfc3Vibm9ybWFsCisgCisgICAgICAgIC8qIENoZWNrIGZvciBJbmYuICovCisgICAgICAgIGNwLncgICAgcjksIDB4ZmYKKyAgICAgICAgYnJnZSAgICAxZgorIAorICAgICAgICAvKiBQYWNrIHJlc3VsdC4gKi8KKyAgICAgICAgb3IgICAgICByMTIsIHIxMiwgcjExID4+IDgKKyAgICAgICAgYmZpbnMgICByMTIsIHI5LCAyMywgOCAgICAgICAgICAKKyAKKyAgICAgICAgLyogUm91bmQgKi8gICAgIAorX19hdnIzMl9mMzJfbXVsX3JvdW5kOgorCW1vdl9pbW0JcjgsIDB4ODAwMDAwMDAKKyAgICAgICAgYmxkICAgICByMTIsIDAKKyAgICAgICAgc3VibmUgICByOCwgLTEgIAorIAorICAgICAgICBjcC53ICAgIHIxMCwgcjgKKyAgICAgICAgc3ViaHMgICByMTIsIC0xCisgICAgICAgIAorICAgICAgICByZXQgICAgIHIxMiAgICAgCisgCisxOiAgICAgIAorICAgICAgICAvKiBSZXR1cm4gSW5mICovICAgICAgICAKKyAgICAgICAgb3JoICAgICByMTIsIDB4N2Y4MAorICAgICAgICByZXQgICAgIHIxMgorIAorX19hdnIzMl9mMzJfbXVsX29wMl9zdWJub3JtYWw6CisgICAgICAgIGNiciAgICAgcjExLCAzMQorICAgICAgICBjbHogICAgIHI5LCByMTEKKyAgICAgICAgcmV0Y3MgICAwICAgICAgIC8qIG9wMiBpcyB6ZXJvLiBSZXR1cm4gMCAqLworICAgICAgICBsc2wgICAgIHIxMSwgcjExLCByOQorICAgICAgICByc3ViICAgIHI5LCByOSwgMQorICAgICAgICAgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiBvcDIgaXMgc3Vibm9ybWFsLiAqLworICAgICAgICB0c3QgICAgIHIxMCwgcjEwCisgICAgICAgIGJybmUgICAgMGIKKyAKKyAgICAgICAgLyogb3AyIGlzIHN1Ym5vcm1hbCAqLyAgCisgICAgICAgIGNiciAgICAgcjgsIDMxCisgICAgICAgIGNseiAgICAgcjEwLCByMTEKKyAgICAgICAgcmV0Y3MgICAwICAgICAgIC8qIG9wMSBpcyB6ZXJvLiBSZXR1cm4gMCAqLworICAgICAgICBsc2wgICAgIHI4LCByOCwgcjEwCisgICAgICAgIHJzdWIgICAgcjEwLCByMTAsIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICByam1wICAgIDBiCisgICAgICAgICAgICAgICAgCisgCitfX2F2cjMyX2YzMl9tdWxfb3AxX25hbl9vcl9pbmY6CisgICAgICAgIC8qIENoZWNrIGlmIG9wMSBpcyBOYU4sIGlmIHNvIHJldHVybiBOYU4gKi8KKyAgICAgICAgbHNsICAgICByMTEsIHI4LCAxCisgICAgICAgIHJldG5lICAgLTEKKyAKKyAgICAgICAgLyogb3AxIGlzIEluZi4gKi8KKyAgICAgICAgdHN0ICAgICByOSwgcjkKKyAgICAgICAgcmV0ZXEgICAtMSAgICAgIC8qIEluZiAqIDAgLT4gTmFOICovCisgCisgICAgICAgIGJmaW5zICAgcjEyLCByMTAsIDIzLCA4IC8qIEdlbmVyYXRlIEluZiBpbiByMTIgKi8KKyAKKyAgICAgICAgLyogQ2hlY2sgaWYgb3AyIGlzIEluZi4gb3IgTmFOICovCisgICAgICAgIGxzciAgICAgcjExLCByOSwgMjMKKyAgICAgICAgY3AudyAgICByMTEsIDB4ZmYKKyAgICAgICAgcmV0bmUgICByMTIgICAgICAgICAgICAgLyogb3AyIG5vdCBJbmYgb3IgTmFOLCByZXR1cm4gSW5mbyAqLworIAorICAgICAgICBsc2wgICAgIHI5LCA5CisgICAgICAgIHJldGVxICAgcjEyICAgICAgICAgICAgIC8qIG9wMiBJbmYgcmV0dXJuIEluZiAqLworICAgICAgICByZXQgICAgIC0xICAgICAgICAgICAgICAvKiBvcDIgaXMgTmFOLCByZXR1cm4gTmFOICovIAorICAgICAgICAKK19fYXZyMzJfZjMyX211bF9yZXNfc3Vibm9ybWFsOgorICAgICAgICAvKiBDaGVjayBpZiB0aGUgbnVtYmVyIGlzIHNvIHNtYWxsIHRoYXQKKyAgICAgICAgICAgaXQgd2lsbCBiZSByZXByZXNlbnRlZCB3aXRoIHplcm8uICovCisgICAgICAgIHJzdWIgICAgcjksIHI5LCA5CisgICAgICAgIHJzdWIgICAgcjgsIHI5LCAzMgorICAgICAgICByZXRjcyAgIDAKKyAKKyAgICAgICAgLyogU2hpZnQgdGhlIG1hbnRpc3NhIGludG8gdGhlIGNvcnJlY3QgcG9zaXRpb24uKi8KKyAgICAgICAgbHNyICAgICByOSwgcjExLCByOQorICAgICAgICAvKiBBZGQgc2lnbiBiaXQuICovCisgICAgICAgIG9yICAgICAgcjEyLCByOQorICAgICAgICAvKiBQdXQgdGhlIHNoaWZ0ZWQgb3V0IGJpdHMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydAorICAgICAgICAgICBvZiByOC4gKi8KKyAgICAgICAgbHNsICAgICByMTEsIHIxMSwgcjgKKyAKKyAgICAgICAgLyogQWRkIGFsbCB0aGUgcmVtYWluZGVyIGJpdHMgdXNlZCBmb3Igcm91bmRpbmcgaW50byByMTEgKi8KKyAgICAgICAgYW5kaCAgICByMTAsIDB4MDBGRiAgICAgCisgICAgICAgIG9yICAgICAgcjEwLCByMTEKKyAgICAgICAgcmptcCAgICBfX2F2cjMyX2YzMl9tdWxfcm91bmQKKworX19hdnIzMl9mMzJfbXVsX29wMV96ZXJvOgorICAgICAgICBiZmV4dHUgIHIxMCwgcjExLCAyMywgOAorICAgICAgICBjcC53ICAgIHIxMCwgMHhmZgorICAgICAgICByZXRuZSAgIHIxMgorICAgICAgICByZXRlcSAgIC0xICAgICAgICAKKyAKKyNlbmRpZiAgCisgCisgICAgICAgIAorI2lmZGVmIExfYXZyMzJfczMyX3RvX2YzMgorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfczMyX3RvX2YzMgorICAgICAgICAudHlwZSAgX19hdnIzMl9zMzJfdG9fZjMyLEBmdW5jdGlvbgorX19hdnIzMl9zMzJfdG9fZjMyOgorICAgICAgICBjcCAgICAgIHIxMiwgMAorICAgICAgICByZXRlcSAgIHIxMiAgICAgLyogSWYgemVybyB0aGVuIHJldHVybiB6ZXJvIGZsb2F0ICovCisgICAgICAgIG1vdiAgICAgcjExLCByMTIgLyogS2VlcCB0aGUgc2lnbiAqLworICAgICAgICBhYnMgICAgIHIxMiAgICAgLyogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICAgICAgbW92ICAgICByMTAsIDMxICsgMTI3ICAgLyogU2V0IHRoZSBjb3JyZWN0IGV4cG9uZW50ICovCisgICAgICAgIAorICAgICAgICAvKiBOb3JtYWxpemUgKi8KKyAgICAgICAgbm9ybWFsaXplX3NmICAgIHIxMCAvKmV4cCovLCByMTIgLyptYW50Ki8sIHI5IC8qc2NyYXRjaCovICAgICAgIAorIAorICAgICAgICAvKiBDaGVjayBmb3Igc3Vibm9ybWFsIHJlc3VsdCAqLworICAgICAgICBjcC53ICAgIHIxMCwgMAorICAgICAgICBicmxlICAgIF9fYXZyMzJfczMyX3RvX2YzMl9zdWJub3JtYWwKKyAKKyAgICAgICAgcm91bmRfc2YgICAgICAgIHIxMCAvKmV4cCovLCByMTIgLyptYW50Ki8sIHI5IC8qc2NyYXRjaCovICAgICAgIAorICAgICAgICBwYWNrX3NmICAgICAgICAgcjEyIC8qc2YqLywgcjEwIC8qZXhwKi8sIHIxMiAvKm1hbnQqLworICAgICAgICBsc2wgICAgIHIxMSwgMQorICAgICAgICByb3IgICAgIHIxMgorICAgICAgICByZXQgICAgIHIxMiAgICAgICAgICAgICAKKyAKK19fYXZyMzJfczMyX3RvX2YzMl9zdWJub3JtYWw6CisgICAgICAgIC8qIEFkanVzdCBhIHN1Ym5vcm1hbCByZXN1bHQgKi8KKyAgICAgICAgYWRqdXN0X3N1Ym5vcm1hbF9zZiAgICAgcjEyLypzZiovLCByMTAgLypleHAqLywgcjEyIC8qbWFudCovLCByMTEvKnNpZ24qLywgcjkgLypzY3JhdGNoKi8KKyAgICAgICAgcmV0ICAgICByMTIKKyAgICAgICAgCisjZW5kaWYKKyAKKyNpZmRlZiBMX2F2cjMyX3UzMl90b19mMzIKKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX3UzMl90b19mMzIKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfdTMyX3RvX2YzMixAZnVuY3Rpb24KK19fYXZyMzJfdTMyX3RvX2YzMjoKKyAgICAgICAgY3AgICAgICByMTIsIDAKKyAgICAgICAgcmV0ZXEgICByMTIgICAgIC8qIElmIHplcm8gdGhlbiByZXR1cm4gemVybyBmbG9hdCAqLworICAgICAgICBtb3YgICAgIHIxMCwgMzEgKyAxMjcgICAvKiBTZXQgdGhlIGNvcnJlY3QgZXhwb25lbnQgKi8KKyAgICAgICAgCisgICAgICAgIC8qIE5vcm1hbGl6ZSAqLworICAgICAgICBub3JtYWxpemVfc2YgICAgcjEwIC8qZXhwKi8sIHIxMiAvKm1hbnQqLywgcjkgLypzY3JhdGNoKi8gICAgICAgCisgCisgICAgICAgIC8qIENoZWNrIGZvciBzdWJub3JtYWwgcmVzdWx0ICovCisgICAgICAgIGNwLncgICAgcjEwLCAwCisgICAgICAgIGJybGUgICAgX19hdnIzMl91MzJfdG9fZjMyX3N1Ym5vcm1hbAorIAorICAgICAgICByb3VuZF9zZiAgICAgICAgcjEwIC8qZXhwKi8sIHIxMiAvKm1hbnQqLywgcjkgLypzY3JhdGNoKi8gICAgICAgCisgICAgICAgIHBhY2tfc2YgICAgICAgICByMTIgLypzZiovLCByMTAgLypleHAqLywgcjEyIC8qbWFudCovCisgICAgICAgIGxzciAgICAgcjEyLDEgICAvKiBTaWduIGJpdCBpcyAwIGZvciB1bnNpZ25lZCBpbnQgKi8KKyAgICAgICAgcmV0ICAgICByMTIgICAgICAgICAgICAgCisgCitfX2F2cjMyX3UzMl90b19mMzJfc3Vibm9ybWFsOgorICAgICAgICAvKiBBZGp1c3QgYSBzdWJub3JtYWwgcmVzdWx0ICovCisgICAgICAgIG1vdiAgICAgcjgsIDAKKyAgICAgICAgYWRqdXN0X3N1Ym5vcm1hbF9zZiAgICAgcjEyLypzZiovLHIxMCAvKmV4cCovLCByMTIgLyptYW50Ki8scjgvKnNpZ24qLywgcjkgLypzY3JhdGNoKi8KKyAgICAgICAgcmV0ICAgICByMTIKKyAgICAgICAgCisgICAgICAgIAorI2VuZGlmCisgICAgICAgIAorIAorI2lmZGVmIExfYXZyMzJfZjMyX3RvX3MzMgorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX3RvX3MzMgorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfdG9fczMyLEBmdW5jdGlvbgorX19hdnIzMl9mMzJfdG9fczMyOgorICAgICAgICBiZmV4dHUgIHIxMSwgcjEyLCAyMywgOAorICAgICAgICBzdWIgICAgIHIxMSwxMjcgICAgICAgICAgICAgICAgIC8qIEZpeCBiaWFzICovCisgICAgICAgIHJldGxvICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRpdmUgZXhwb25lbnQgeWllbGRzIHplcm8gaW50ZWdlciAqLworIAorICAgICAgICAvKiBTaGlmdCBtYW50aXNzYSBpbnRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgICAgcnN1YiAgICByMTEscjExLDMxICAgICAgLyogU2hpZnQgYW1vdW50ICovCisgICAgICAgIGxzbCAgICAgcjEwLHIxMiw4ICAgICAgIC8qIEdldCBtYW50aXNzYSAqLworICAgICAgICBzYnIgICAgIHIxMCwzMSAgICAgICAgICAvKiBBZGQgaW1wbGljaXQgYml0ICovCisgICAgICAgIGxzciAgICAgcjEwLHIxMCxyMTEgICAgIC8qIFBlcmZvcm0gc2hpZnQgKi8KKyAgICAgICAgbHNsICAgICByMTIsMSAgICAgICAgICAgLyogQ2hlY2sgc2lnbiAqLworICAgICAgICByZXRjYyAgIHIxMCAgICAgICAgICAgICAvKiBpZiBwb3NpdGl2ZSwgd2UgYXJlIGRvbmUgKi8KKyAgICAgICAgbmVnICAgICByMTAgICAgICAgICAgICAgLyogaWYgbmVnYXRpdmUgZmxvYXQsIG5lZ2F0ZSByZXN1bHQgKi8KKyAgICAgICAgcmV0ICAgICByMTAKKyAKKyNlbmRpZiAgCisgICAgICAgIAorI2lmZGVmIExfYXZyMzJfZjMyX3RvX3UzMgorICAgICAgICAuZ2xvYmFsIF9fYXZyMzJfZjMyX3RvX3UzMgorICAgICAgICAudHlwZSAgX19hdnIzMl9mMzJfdG9fdTMyLEBmdW5jdGlvbgorX19hdnIzMl9mMzJfdG9fdTMyOgorICAgICAgICBjcCAgICAgIHIxMiwwCisgICAgICAgIHJldG1pICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRpdmUgbnVtYmVycyBnaXZlcyAwICovCisgICAgICAgIGJmZXh0dSAgcjExLCByMTIsIDIzLCA4ICAgICAgICAgLyogRXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICBzdWIgICAgIHIxMSwxMjcgICAgICAgICAgICAgICAgIC8qIEZpeCBiaWFzICovCisgICAgICAgIHJldGxvICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRpdmUgZXhwb25lbnQgeWllbGRzIHplcm8gaW50ZWdlciAqLworIAorICAgICAgICAvKiBTaGlmdCBtYW50aXNzYSBpbnRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgICAgcnN1YiAgICByMTEscjExLDMxICAgICAgLyogU2hpZnQgYW1vdW50ICovCisgICAgICAgIGxzbCAgICAgcjEyLDggICAgICAgICAgIC8qIEdldCBtYW50aXNzYSAqLworICAgICAgICBzYnIgICAgIHIxMiwzMSAgICAgICAgICAvKiBBZGQgaW1wbGljaXQgYml0ICovCisgICAgICAgIGxzciAgICAgcjEyLHIxMixyMTEgICAgIC8qIFBlcmZvcm0gc2hpZnQgKi8KKyAgICAgICAgcmV0ICAgICByMTIKKyAKKyNlbmRpZiAgCisgCisjaWZkZWYgTF9hdnIzMl9mMzJfdG9fZjY0CisgICAgICAgIC5nbG9iYWwgX19hdnIzMl9mMzJfdG9fZjY0CisgICAgICAgIC50eXBlICBfX2F2cjMyX2YzMl90b19mNjQsQGZ1bmN0aW9uCisgCitfX2F2cjMyX2YzMl90b19mNjQ6CisgICAgICAgIGxzbCAgICAgcjExLHIxMiwxICAgICAgICAgICAgICAgLyogUmVtb3ZlIHNpZ24gYml0LCBrZWVwIG9yaWdpbmFsIHZhbHVlIGluIHIxMiovCisgICAgICAgIG1vdmVxICAgcjEwLCAwCisgICAgICAgIHJldGVxICAgcjExICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHplcm8gaWYgaW5wdXQgaXMgemVybyAqLworIAorICAgICAgICBiZmV4dHUgIHI5LHIxMSwyNCw4ICAgICAgICAgICAgICAvKiBHZXQgZXhwb25lbnQgKi8KKyAgICAgICAgY3AudyAgICByOSwweGZmICAgICAgICAgICAgICAgICAvKiBjaGVjayBmb3IgTmFOIG9yIGluZiAqLworICAgICAgICBicmVxICAgIDBmCisgCisgICAgICAgIGxzbCAgICAgcjExLDcgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCBzZiBtYW50aXNzYSB0byBkZiBmb3JtYXQgKi8KKyAgICAgICAgbW92ICAgICByMTAsMAorIAorICAgICAgICAvKiBDaGVjayBpZiBpbXBsaWNpdCBiaXQgc2hvdWxkIGJlIHNldCAqLworICAgICAgICBjcC53ICAgIHI5LCAwCisgICAgICAgIHN1YmVxICAgcjksLTEgICAgICAgICAgICAgICAgICAgIC8qIEFkanVzdCBleHBvbmVudCBpZiBpdCB3YXMgMCAqLworICAgICAgICBzcm5lICAgIHI4CisgICAgICAgIG9yICAgICAgcjExLCByMTEsIHI4IDw8IDMxICAgICAgLyogU2V0IGltcGxpY2l0IGJpdCBpZiBuZWVkZWQgKi8KKyAgICAgICAgc3ViICAgICByOSwoMTI3LTB4M2ZmKSAgICAgICAgICAvKiBDb252ZXJ0IGV4cG9uZW50IHRvIGRmIGZvcm1hdCBleHBvbmVudCAqLworIAorICAgICAgICAvKldlIGtub3cgdGhhdCBsb3cgcmVnaXN0ZXIgb2YgbWFudGlzc2EgaXMgMCwgYW5kIHdpbGwgYmUgdW5hZmZlY3RlZCBieSBub3JtYWxpemF0aW9uLiovCisgICAgICAgIC8qV2UgY2FuIHRoZXJlZm9yZSB1c2UgdGhlIGZhc3RlciBub3JtYWxpemVfc2YgZnVuY3Rpb24gaW5zdGVhZCBvZiBub3JtYWxpemVfZGYuKi8KKyAgICAgICAgbm9ybWFsaXplX3NmICAgIHI5IC8qZXhwKi8sIHIxMSAvKm1hbnRpc3NhKi8sIHI4IC8qc2NyYXRjaCovCisgICAgICAgIHBhY2tfZGYgICAgICAgICByOSAvKmV4cCovLCByMTAsIHIxMSAvKm1hbnRpc3NhKi8sIHIxMCwgcjExIC8qZGYqLworIAorX19leHRlbmRzZmRmX3JldHVybl9vcDE6ICAgICAgICAKKyAgICAgICAgLyogUm90YXRlIGluIHNpZ24gYml0ICovCisgICAgICAgIGxzbCAgICAgcjEyLCAxCisgICAgICAgIHJvciAgICAgcjExCisgICAgICAgIHJldCAgICAgcjExCisgICAgICAgICAgICAgICAgICAgICAgICAKKzA6CisgICAgICAgIC8qIEluZiBvciBOYU4qLworCW1vdl9pbW0JcjEwLCAweGZmZTAwMDAwCisgICAgICAgIGxzbCAgICAgcjExLDggICAgICAgICAgICAgICAgICAgLyogY2hlY2sgbWFudGlzc2EgKi8KKyAgICAgICAgbW92bmUgICByMTEsIC0xICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gTmFOICovCisgICAgICAgIG1vdmVxICAgcjExLCByMTAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGluZiAqLworICAgICAgICByam1wICAgIF9fZXh0ZW5kc2ZkZl9yZXR1cm5fb3AxCisjZW5kaWYgICAgICAgICAgICAgICAgICAKKyAKKyAKKyNpZmRlZiBMX2F2cjMyX2Y2NF90b19mMzIKKyAgICAgICAgLmdsb2JhbCBfX2F2cjMyX2Y2NF90b19mMzIKKyAgICAgICAgLnR5cGUgIF9fYXZyMzJfZjY0X3RvX2YzMixAZnVuY3Rpb24KKyAKK19fYXZyMzJfZjY0X3RvX2YzMjoKKyAgICAgICAgLyogVW5wYWNrICovCisgICAgICAgIGxzbCAgICAgcjkscjExLDEgICAgICAgICAgICAgICAgLyogVW5wYWNrIGV4cG9uZW50ICovCisgICAgICAgIGxzciAgICAgcjksMjEKKyAKKyAgICAgICAgcmV0ZXEgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBleHBvbmVudCBpcyAwIHRoZSBudW1iZXIgaXMgc28gc21hbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBjb252ZXJzaW9uIHRvIHNpbmdsZSBmbG9hdCBnaXZlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gKi8KKyAKKyAgICAgICAgbHNsICAgICByOCxyMTEsMTAgICAgICAgICAgICAgICAgICAvKiBBZGp1c3QgbWFudGlzc2EgKi8KKyAgICAgICAgb3IgICAgICByMTIscjgscjEwPj4yMgorIAorICAgICAgICBsc2wgICAgIHIxMCwxMCAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbG93IHBhcnQgb2YgdGhlIG1hbnRpc3NhLiovCisgICAgICAgIG5lZyAgICAgcjEwCisgICAgICAgIHJvbCAgICAgcjEyICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgd2VyZSByZW1haW5pbmcgYml0cyB0aGVuIHNldCBsc2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtYW50aXNzYSB0byAxICovCisgCisgICAgICAgIGNwICAgICAgcjksMHg3ZmYKKyAgICAgICAgYnJlcSAgICAyZiAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgTmFOIG9yIGluZiAqLworIAorICAgICAgICBzdWIgICAgIHI5LCgweDNmZi0xMjcpICAgICAgICAgIC8qIEFkanVzdCBiaWFzIG9mIGV4cG9uZW50ICovCisgICAgICAgIHNiciAgICAgcjEyLDMxICAgICAgICAgICAgICAgICAgLyogc2V0IHRoZSBpbXBsaWNpdCBiaXQuKi8KKyAKKyAgICAgICAgY3AudyAgICByOSwgMCAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3Igc3Vibm9ybWFsIG51bWJlciAqLworICAgICAgICBicmxlICAgIDNmCisgCisgICAgICAgIHJvdW5kX3NmICAgICAgICByOSAvKmV4cCovLCByMTIgLyptYW50Ki8sIHIxMCAvKnNjcmF0Y2gqLyAgICAgICAKKyAgICAgICAgcGFja19zZiAgICAgICAgIHIxMiAvKnNmKi8sIHI5IC8qZXhwKi8sIHIxMiAvKm1hbnQqLworX190cnVuY2Rmc2ZfcmV0dXJuX29wMTogCisgICAgICAgIC8qIFJvdGF0ZSBpbiBzaWduIGJpdCAqLworICAgICAgICBsc2wgICAgIHIxMSwgMQorICAgICAgICByb3IgICAgIHIxMgorICAgICAgICByZXQgICAgIHIxMiAgICAgICAgICAgICAKKyAgICAgICAgCisyOgorICAgICAgICAvKiBOYU4gb3IgaW5mICovCisgICAgICAgIGNiciAgICAgcjEyLDMxICAgICAgICAgICAgICAgICAgLyogY2xlYXIgaW1wbGljaXQgYml0ICovCisgICAgICAgIHJldG5lICAgLTEgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIE5hTiBpZiBtYW50aXNzYSBub3QgemVybyAqLworCW1vdl9pbW0JcjEyLCAweGZmMDAwMDAwCisgICAgICAgIHJldCAgICAgcjEyICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGluZiAqLworIAorMzogICAgICAvKiBSZXN1bHQgaXMgc3Vibm9ybWFsLiBBZGp1c3QgaXQuKi8KKyAgICAgICAgYWRqdXN0X3N1Ym5vcm1hbF9zZiAgICAgcjEyLypzZiovLHI5IC8qZXhwKi8sIHIxMiAvKm1hbnQqLywgcjExLypzaWduKi8sIHIxMCAvKnNjcmF0Y2gqLworICAgICAgICByZXQgICAgIHIxMgorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyNlbmRpZgorIAorI2lmIGRlZmluZWQoTF9tdWxzaTMpICYmIChfX0FWUjMyX1VDX18gPT0gMykKKwkuZ2xvYmFsIF9fbXVsc2kzCisJLnR5cGUgX19tdWxzaTMsQGZ1bmN0aW9uCisKK19fbXVsc2kzOgorCW1vdiByOSwgMAorMDoKKwlsc3IgcjExLCAxCisJYWRkY3MgcjksIHI5LCByMTIKKwlicmVxIDFmCisJbHNsIHIxMiwgMQorCXJqbXAgMGIKKzE6CisJcmV0IHI5CisjZW5kaWYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL2xpYjJmdW5jcy5TCkBAIC0wLDAgKzEsMjEgQEAKKwkuYWxpZ24JNAorCS5nbG9iYWwgX19ub25sb2NhbF9nb3RvCisJLnR5cGUgIF9fbm9ubG9jYWxfZ290byxAZnVuY3Rpb24KKworLyogX19ub25sb2NhbF9nb3RvOglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgbm9ubG9jYWxfZ290bydzIGluIGdjYy4KKworCXBhcmFtZXRlciAwIChyMTIpID0gTmV3IEZyYW1lIFBvaW50ZXIKKwlwYXJhbWV0ZXIgMSAocjExKSA9IEFkZHJlc3MgdG8gZ290bworCXBhcmFtZXRlciAyIChyMTApID0gTmV3IFN0YWNrIFBvaW50ZXIKKworCVRoaXMgZnVuY3Rpb24gaW52YWxpZGF0ZXMgdGhlIHJldHVybiBzdGFjaywgc2luY2UgaXQgcmV0dXJucyBmcm9tIGEKKwlmdW5jdGlvbiB3aXRob3V0IHVzaW5nIGEgcmV0dXJuIGluc3RydWN0aW9uLgorKi8KK19fbm9ubG9jYWxfZ290bzoKKwltb3YJcjcsIHIxMgorCW1vdglzcCwgcjEwCisJZnJzCQkJIyBGbHVzaCByZXR1cm4gc3RhY2sKKwltb3YJcGMsIHIxMQorCisKKwkJCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9hdnIzMi9saW51eC1lbGYuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAgIExpbnV4L0VsZiBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDYgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+CisgICBhbmQgSO+/vXZhcmQgU2tpbm5lbW9lbiwgQXRtZWwgTm9yd2F5LCA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworCisKKy8qIGVsZm9zLmggc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLiAgTm93IGp1c3Qgb3ZlcnJpZGUKKyAgIGFueSBjb25mbGljdGluZyBkZWZpbml0aW9ucyBhbmQgYWRkIGFueSBleHRyYXMuICAqLworCisvKiBSdW4tdGltZSBUYXJnZXQgU3BlY2lmaWNhdGlvbi4gICovCisjdW5kZWYgIFRBUkdFVF9WRVJTSU9OCisjZGVmaW5lIFRBUkdFVF9WRVJTSU9OICBmcHV0cyAoIiAoQVZSMzIgR05VL0xpbnV4IHdpdGggRUxGKSIsIHN0ZGVycik7CisKKy8qIERvIG5vdCBhc3N1bWUgYW55dGhpbmcgYWJvdXQgaGVhZGVyIGZpbGVzLiAgKi8KKyNkZWZpbmUgTk9fSU1QTElDSVRfRVhURVJOX0MKKworLyogVGhlIEdOVSBDKysgc3RhbmRhcmQgbGlicmFyeSByZXF1aXJlcyB0aGF0IHRoZXNlIG1hY3JvcyBiZSBkZWZpbmVkLiAgKi8KKyN1bmRlZiBDUExVU1BMVVNfQ1BQX1NQRUMKKyNkZWZpbmUgQ1BMVVNQTFVTX0NQUF9TUEVDICItRF9HTlVfU09VUkNFICUoY3BwKSIKKworLyogTm93IHdlIGRlZmluZSB0aGUgc3RyaW5ncyB1c2VkIHRvIGJ1aWxkIHRoZSBzcGVjIGZpbGUuICAqLworI3VuZGVmICBMSUJfU1BFQworI2RlZmluZSBMSUJfU1BFQyBcCisgICIle3B0aHJlYWQ6LWxwdGhyZWFkfSBcCisgICAle3NoYXJlZDotbGN9IFwKKyAgICV7IXNoYXJlZDole3Byb2ZpbGU6LWxjX3B9JXshcHJvZmlsZTotbGN9fSIKKworLyogUHJvdmlkZSBhIFNUQVJURklMRV9TUEVDIGFwcHJvcHJpYXRlIGZvciBHTlUvTGludXguICBIZXJlIHdlIGFkZAorICAgdGhlIEdOVS9MaW51eCBtYWdpY2FsIGNydGJlZ2luLm8gZmlsZSAoc2VlIGNydHN0dWZmLmMpIHdoaWNoCisgICBwcm92aWRlcyBwYXJ0IG9mIHRoZSBzdXBwb3J0IGZvciBnZXR0aW5nIEMrKyBmaWxlLXNjb3BlIHN0YXRpYworICAgb2JqZWN0IGNvbnN0cnVjdGVkIGJlZm9yZSBlbnRlcmluZyBgbWFpbicuICAqLworCisjdW5kZWYgIFNUQVJURklMRV9TUEVDCisjZGVmaW5lIFNUQVJURklMRV9TUEVDIFwKKyAgIiV7IXNoYXJlZDogXAorICAgICAle3BnOmdjcnQxLm8lc30gJXshcGc6JXtwOmdjcnQxLm8lc30gXAorCQkgICAgICAgJXshcDole3Byb2ZpbGU6Z2NydDEubyVzfSBcCisJCQkgJXshcHJvZmlsZTpjcnQxLm8lc319fX0gXAorICAgY3J0aS5vJXMgJXshc2hhcmVkOmNydGJlZ2luLm8lc30gJXtzaGFyZWQ6Y3J0YmVnaW5TLm8lc30iCisKKy8qIFByb3ZpZGUgYSBFTkRGSUxFX1NQRUMgYXBwcm9wcmlhdGUgZm9yIEdOVS9MaW51eC4gIEhlcmUgd2UgdGFjayBvbgorICAgdGhlIEdOVS9MaW51eCBtYWdpY2FsIGNydGVuZC5vIGZpbGUgKHNlZSBjcnRzdHVmZi5jKSB3aGljaAorICAgcHJvdmlkZXMgcGFydCBvZiB0aGUgc3VwcG9ydCBmb3IgZ2V0dGluZyBDKysgZmlsZS1zY29wZSBzdGF0aWMKKyAgIG9iamVjdCBjb25zdHJ1Y3RlZCBiZWZvcmUgZW50ZXJpbmcgYG1haW4nLCBmb2xsb3dlZCBieSBhIG5vcm1hbAorICAgR05VL0xpbnV4ICJmaW5hbGl6ZXIiIGZpbGUsIGBjcnRuLm8nLiAgKi8KKworI3VuZGVmICBFTkRGSUxFX1NQRUMKKyNkZWZpbmUgRU5ERklMRV9TUEVDIFwKKyAgIiV7IXNoYXJlZDpjcnRlbmQubyVzfSAle3NoYXJlZDpjcnRlbmRTLm8lc30gY3J0bi5vJXMiCisKKyN1bmRlZiBBU01fU1BFQworI2RlZmluZSBBU01fU1BFQyAiJXshbW5vLXBpYzoleyFmbm8tcGljOi0tcGljfX0gJXttcmVsYXh8Tyo6JXttbm8tcmVsYXh8TzB8TzE6IDs6LS1saW5rcmVsYXh9fSAle21jcHU9KjotbWNwdT0lKn0iCisgCisjdW5kZWYgIExJTktfU1BFQworI2RlZmluZSBMSU5LX1NQRUMgIiV7dmVyc2lvbjotdn0gXAorICAgJXtzdGF0aWM6LUJzdGF0aWN9IFwKKyAgICV7c2hhcmVkOi1zaGFyZWR9IFwKKyAgICV7c3ltYm9saWM6LUJzeW1ib2xpY30gXAorICAgJXtyZHluYW1pYzotZXhwb3J0LWR5bmFtaWN9IFwKKyAgICV7IWR5bmFtaWMtbGlua2VyOi1keW5hbWljLWxpbmtlciAvbGliL2xkLXVDbGliYy5zby4wfSBcCisgICAle21yZWxheHxPKjole21uby1yZWxheHxPMHxPMTogOzotLXJlbGF4fX0iCisKKyNkZWZpbmUgVEFSR0VUX09TX0NQUF9CVUlMVElOUygpIExJTlVYX1RBUkdFVF9PU19DUFBfQlVJTFRJTlMoKQorCisvKiBUaGlzIGlzIGhvdyB3ZSB0ZWxsIHRoZSBhc3NlbWJsZXIgdGhhdCB0d28gc3ltYm9scyBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgKi8KKyNkZWZpbmUgQVNNX09VVFBVVF9ERUYoRklMRSwgTkFNRTEsIE5BTUUyKSBcCisgIGRvCQkJCQkgICBcCisgICAgewkJCQkJICAgXAorICAgICAgYXNzZW1ibGVfbmFtZSAoRklMRSwgTkFNRTEpOyAJICAgXAorICAgICAgZnB1dHMgKCIgPSAiLCBGSUxFKTsJCSAgIFwKKyAgICAgIGFzc2VtYmxlX25hbWUgKEZJTEUsIE5BTUUyKTsJICAgXAorICAgICAgZnB1dGMgKCdcbicsIEZJTEUpOwkJICAgXAorICAgIH0JCQkJCSAgIFwKKyAgd2hpbGUgKDApCisKKworCisjdW5kZWYgIENDMV9TUEVDCisjZGVmaW5lIENDMV9TUEVDICIle3Byb2ZpbGU6LXB9IgorCisvKiBUYXJnZXQgQ1BVIGJ1aWx0aW5zLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0NQVV9DUFBfQlVJTFRJTlMoKQkJCQlcCisgIGRvCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX2F2cjMyX18iKTsJCQkJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX18iKTsJCQkJXAorICAgICAgYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0xJTlVYX18iKTsJCQlcCisgICAgICBidWlsdGluX2RlZmluZSAoYXZyMzJfcGFydC0+bWFjcm8pOwkJCVwKKyAgICAgIGJ1aWx0aW5fZGVmaW5lIChhdnIzMl9hcmNoLT5tYWNybyk7CQkJXAorICAgICAgaWYgKGF2cjMyX2FyY2gtPnVhcmNoX3R5cGUgPT0gVUFSQ0hfVFlQRV9BVlIzMkEpCQlcCisJYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0FWUjMyQV9fIik7CQkJXAorICAgICAgZWxzZQkJCQkJCQlcCisJYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0FWUjMyQl9fIik7CQkJXAorICAgICAgaWYgKFRBUkdFVF9VTkFMSUdORURfV09SRCkJCQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9IQVNfVU5BTElHTkVEX1dPUkRfXyIpOwlcCisgICAgICBpZiAoVEFSR0VUX1NJTUQpCQkJCQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9IQVNfU0lNRF9fIik7CQkJXAorICAgICAgaWYgKFRBUkdFVF9EU1ApCQkJCQkJXAorCWJ1aWx0aW5fZGVmaW5lICgiX19BVlIzMl9IQVNfRFNQX18iKTsJCQlcCisgICAgICBpZiAoVEFSR0VUX1JNVykJCQkJCQlcCisJYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0hBU19STVdfXyIpOwkJCVwKKyAgICAgIGlmIChUQVJHRVRfQlJBTkNIX1BSRUQpCQkJCQlcCisJYnVpbHRpbl9kZWZpbmUgKCJfX0FWUjMyX0hBU19CUkFOQ0hfUFJFRF9fIik7CQlcCisgICAgICBpZiAoVEFSR0VUX0ZBU1RfRkxPQVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWlsdGluX2RlZmluZSAoIl9fQVZSMzJfRkFTVF9GTE9BVF9fIik7ICAgICAgICAgICAgICAgIFwKKyAgICB9CQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisKKworLyogQ2FsbCB0aGUgZnVuY3Rpb24gcHJvZmlsZXIgd2l0aCBhIGdpdmVuIHByb2ZpbGUgbGFiZWwuICAqLworI3VuZGVmICBGVU5DVElPTl9QUk9GSUxFUgorI2RlZmluZSBGVU5DVElPTl9QUk9GSUxFUihTVFJFQU0sIExBQkVMTk8pCQkJCVwKKyAgZG8JCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGZwcmludGYgKFNUUkVBTSwgIlx0bW92XHRsciwgbG8obWNvdW50KVxuXHRvcmhcdGxyLCBoaShtY291bnQpXG4iKTsgXAorICAgICAgZnByaW50ZiAoU1RSRUFNLCAiXHRpY2FsbCBsclxuIik7CQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgd2hpbGUgKDApCisKKyNkZWZpbmUgTk9fUFJPRklMRV9DT1VOVEVSUyAxCisKKy8qIEZvciBkeW5hbWljIGxpYnJhcmllcyB0byB3b3JrICovCisvKiAjZGVmaW5lIFBMVF9SRUdfQ0FMTF9DTE9CQkVSRUQgMSAqLworI2RlZmluZSBBVlIzMl9BTFdBWVNfUElDIDEKKworLyogdWNsaWJjIGRvZXMgbm90IGltcGxlbWVudCBzaW5mLCBjb3NmIGV0Yy4gKi8KKyN1bmRlZiBUQVJHRVRfQzk5X0ZVTkNUSU9OUworI2RlZmluZSBUQVJHRVRfQzk5X0ZVTkNUSU9OUyAwCisKKyNkZWZpbmUgTElOS19HQ0NfQ19TRVFVRU5DRV9TUEVDIFwKKyAgIiV7c3RhdGljOi0tc3RhcnQtZ3JvdXB9ICVHICVMICV7c3RhdGljOi0tZW5kLWdyb3VwfSV7IXN0YXRpYzolR30iCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9hdnIzMi9wcmVkaWNhdGVzLm1kCkBAIC0wLDAgKzEsNDE5IEBACis7OyAgIEFWUjMyIHByZWRpY2F0ZXMgZmlsZS4KKzs7ICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbi4KKzs7Cis7OyAgIFdyaXR0ZW4gYnkgUm9ubnkgUGVkZXJzZW4sIEF0bWVsIE5vcndheSwgPHJwZWRlcnNlbkBhdG1lbC5jb20+Cis7OworOzsgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7ICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7OyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKworOzsgVHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBhIG1lbW9yeSByZWZlcmVuY2Ugd2hpY2ggY29udGFpbnMgYW4KKzs7IEFkZHJlc3MgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBwb2ludGVyIHJlZ2lzdGVyCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfaW5kaXJlY3RfcmVnaXN0ZXJfb3BlcmFuZCIKKyAgKGFuZCAobWF0Y2hfY29kZSAibWVtIikKKyAgICAgICAobWF0Y2hfdGVzdCAicmVnaXN0ZXJfb3BlcmFuZChYRVhQKG9wLCAwKSwgU0ltb2RlKSIpKSkKKworCisKKzs7IEFkZHJlc3MgZXhwcmVzc2lvbiB3aXRoIGEgYmFzZSBwb2ludGVyIG9mZnNldCB3aXRoCis7OyBhIHJlZ2lzdGVyIGRpc3BsYWNlbWVudAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2luZGV4ZWRfbWVtb3J5X29wZXJhbmQiCisgIChhbmQgKG1hdGNoX2NvZGUgIm1lbSIpCisgICAgICAgKG1hdGNoX3Rlc3QgIkdFVF9DT0RFKFhFWFAob3AsIDApKSA9PSBQTFVTIikpCisgIHsKKworICAgcnR4IG9wMCA9IFhFWFAoWEVYUChvcCwgMCksIDApOworICAgcnR4IG9wMSA9IFhFWFAoWEVYUChvcCwgMCksIDEpOworCisgICByZXR1cm4gKChhdnIzMl9hZGRyZXNzX3JlZ2lzdGVyX3J0eF9wIChvcDAsIDApCisgICAgICAgICAgICAmJiBhdnIzMl9sZWdpdGltYXRlX2luZGV4X3AgKEdFVF9NT0RFKG9wKSwgb3AxLCAwKSkKKwkgICB8fCAoYXZyMzJfYWRkcmVzc19yZWdpc3Rlcl9ydHhfcCAob3AxLCAwKQorICAgICAgICAgICAgJiYgYXZyMzJfbGVnaXRpbWF0ZV9pbmRleF9wIChHRVRfTU9ERShvcCksIG9wMCwgMCkpKTsKKworIH0pCisKKzs7IE9wZXJhbmQgc3VpdGFibGUgZm9yIHRoZSBsZC5zYiBpbnN0cnVjdGlvbgorKGRlZmluZV9wcmVkaWNhdGUgImxvYWRfc2JfbWVtb3J5X29wZXJhbmQiCisgIChpb3IgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfaW5kaXJlY3RfcmVnaXN0ZXJfb3BlcmFuZCIpCisgICAgICAgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfaW5kZXhlZF9tZW1vcnlfb3BlcmFuZCIpKSkKKworCis7OyBPcGVyYW5kIHN1aXRhYmxlIGFzIG9wZXJhbmQgdG8gaW5zbnMgc2lnbiBleHRlbmRpbmcgUUkgdmFsdWVzCisoZGVmaW5lX3ByZWRpY2F0ZSAiZXh0ZW5kcWlfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJsb2FkX3NiX21lbW9yeV9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikpKQorCisoZGVmaW5lX3ByZWRpY2F0ZSAicG9zdF9pbmNfbWVtb3J5X29wZXJhbmQiCisgIChhbmQgKG1hdGNoX2NvZGUgIm1lbSIpCisgICAgICAgKG1hdGNoX3Rlc3QgIihHRVRfQ09ERShYRVhQKG9wLCAwKSkgPT0gUE9TVF9JTkMpCisgICAgICAgICAgICAgICAgICAgICAmJiBSRUdfUChYRVhQKFhFWFAob3AsIDApLCAwKSkiKSkpCisKKyhkZWZpbmVfcHJlZGljYXRlICJwcmVfZGVjX21lbW9yeV9vcGVyYW5kIgorICAoYW5kIChtYXRjaF9jb2RlICJtZW0iKQorICAgICAgIChtYXRjaF90ZXN0ICIoR0VUX0NPREUoWEVYUChvcCwgMCkpID09IFBSRV9ERUMpCisgICAgICAgICAgICAgICAgICAgICAmJiBSRUdfUChYRVhQKFhFWFAob3AsIDApLCAwKSkiKSkpCisKKzs7IE9wZXJhbmQgc3VpdGFibGUgZm9yIGFkZCBpbnN0cnVjdGlvbnMKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9hZGRfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAoYW5kIChtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIikKKyAgICAgICAgICAgIChtYXRjaF90ZXN0ICJDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKElOVFZBTChvcCksICdJJywgXCJJczIxXCIpIikpKSkKKworOzsgT3BlcmFuZCBpcyBhIHBvd2VyIG9mIHR3byBpbW1lZGlhdGUKKyhkZWZpbmVfcHJlZGljYXRlICJwb3dlcl9vZl90d29fb3BlcmFuZCIKKyAgKG1hdGNoX2NvZGUgImNvbnN0X2ludCIpCit7CisgIEhPU1RfV0lERV9JTlQgdmFsdWUgPSBJTlRWQUwgKG9wKTsKKworICByZXR1cm4gdmFsdWUgIT0gMCAmJiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT0gMDsKK30pCisKKzs7IE9wZXJhbmQgaXMgYSBtdWx0aXBsZSBvZiA4IGltbWVkaWF0ZQorKGRlZmluZV9wcmVkaWNhdGUgIm11bHRpcGxlX29mXzhfb3BlcmFuZCIKKyAgKG1hdGNoX2NvZGUgImNvbnN0X2ludCIpCit7CisgIEhPU1RfV0lERV9JTlQgdmFsdWUgPSBJTlRWQUwgKG9wKTsKKworICByZXR1cm4gKHZhbHVlICYgMHg3KSA9PSAwIDsKK30pCisKKzs7IE9wZXJhbmQgaXMgYSBtdWx0aXBsZSBvZiAxNiBpbW1lZGlhdGUKKyhkZWZpbmVfcHJlZGljYXRlICJtdWx0aXBsZV9vZl8xNl9vcGVyYW5kIgorICAobWF0Y2hfY29kZSAiY29uc3RfaW50IikKK3sKKyAgSE9TVF9XSURFX0lOVCB2YWx1ZSA9IElOVFZBTCAob3ApOworCisgIHJldHVybiAodmFsdWUgJiAweGYpID09IDAgOworfSkKKworOzsgT3BlcmFuZCBpcyBhIG1hc2sgdXNlZCBmb3IgbWFza2luZyBhd2F5IHVwcGVyIGJpdHMgb2YgYSByZWcKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9tYXNrX3VwcGVyX2JpdHNfb3BlcmFuZCIKKyAgKG1hdGNoX2NvZGUgImNvbnN0X2ludCIpCit7CisgIEhPU1RfV0lERV9JTlQgdmFsdWUgPSBJTlRWQUwgKG9wKSArIDE7CisKKyAgcmV0dXJuIHZhbHVlICE9IDEgJiYgdmFsdWUgIT0gMCAmJiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT0gMDsKK30pCisKKworOzsgT3BlcmFuZCBzdWl0YWJsZSBmb3IgbXVsIGluc3RydWN0aW9ucworKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX211bF9vcGVyYW5kIgorICAoaW9yIChtYXRjaF9vcGVyYW5kIDAgInJlZ2lzdGVyX29wZXJhbmQiKQorICAgICAgIChhbmQgKG1hdGNoX29wZXJhbmQgMCAiaW1tZWRpYXRlX29wZXJhbmQiKQorICAgICAgICAgICAgKG1hdGNoX3Rlc3QgIkNPTlNUX09LX0ZPUl9DT05TVFJBSU5UX1AoSU5UVkFMKG9wKSwgJ0snLCBcIktzMDhcIikiKSkpKQorCis7OyBUcnVlIGZvciBsb2dpY2FsIGJpbmFyeSBvcGVyYXRvcnMuCisoZGVmaW5lX3ByZWRpY2F0ZSAibG9naWNhbF9iaW5hcnlfb3BlcmF0b3IiCisgIChtYXRjaF9jb2RlICJpb3IseG9yLGFuZCIpKQorCis7OyBUcnVlIGZvciBsb2dpY2FsIHNoaWZ0IG9wZXJhdG9ycworKGRlZmluZV9wcmVkaWNhdGUgImxvZ2ljYWxfc2hpZnRfb3BlcmF0b3IiCisgIChtYXRjaF9jb2RlICJhc2hpZnQsbHNoaWZ0cnQiKSkKKworOzsgVHJ1ZSBmb3Igc2hpZnQgb3BlcmFuZCBmb3IgbG9naWNhbCBhbmQsIG9yIGFuZCBlb3IgaW5zbnMKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9sb2dpY2FsX3NoaWZ0X29wZXJhbmQiCisgIChhbmQgKG1hdGNoX2NvZGUgImFzaGlmdCxsc2hpZnRydCIpCisgICAgICAgKGlvciAoYW5kIChtYXRjaF90ZXN0ICJHRVRfQ09ERShYRVhQKG9wLCAxKSkgPT0gQ09OU1RfSU5UIikKKyAgICAgICAgICAgICAgICAgKG1hdGNoX3Rlc3QgInJlZ2lzdGVyX29wZXJhbmQoWEVYUChvcCwgMCksIEdFVF9NT0RFKFhFWFAob3AsIDApKSkiKSkKKyAgICAgICAgICAgIChhbmQgKG1hdGNoX3Rlc3QgIkdFVF9DT0RFKFhFWFAob3AsIDApKSA9PSBDT05TVF9JTlQiKQorICAgICAgICAgICAgICAgICAobWF0Y2hfdGVzdCAicmVnaXN0ZXJfb3BlcmFuZChYRVhQKG9wLCAxKSwgR0VUX01PREUoWEVYUChvcCwgMSkpKSIpKSkpCisgICkKKworCis7OyBQcmVkaWNhdGUgZm9yIHNlY29uZCBvcGVyYW5kIHRvIGFuZCwgaW9yIGFuZCB4b3IgaW5zbiBwYXR0ZXJucworKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2xvZ2ljYWxfaW5zbl9vcGVyYW5kIgorICAoaW9yIChtYXRjaF9vcGVyYW5kIDAgInJlZ2lzdGVyX29wZXJhbmQiKQorICAgICAgIChtYXRjaF9vcGVyYW5kIDAgImF2cjMyX2xvZ2ljYWxfc2hpZnRfb3BlcmFuZCIpKQorKQorCisKKzs7IFRydWUgZm9yIGF2cjMyIGNvbXBhcmlzb24gb3BlcmF0b3JzCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfY29tcGFyaXNvbl9vcGVyYXRvciIKKyAgKGlvciAobWF0Y2hfY29kZSAiZXEsIG5lLCBndCwgZ2UsIGx0LCBsZSwgZ3R1LCBnZXUsIGx0dSwgbGV1IikKKyAgICAgICAoYW5kIChtYXRjaF9jb2RlICJ1bnNwZWMiKQorICAgICAgICAgICAgKG1hdGNoX3Rlc3QgIihYSU5UKG9wLCAxKSA9PSBVTlNQRUNfQ09ORF9NSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoWElOVChvcCwgMSkgPT0gVU5TUEVDX0NPTkRfUEwpIikpKSkKKworKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2NvbmQzX2NvbXBhcmlzb25fb3BlcmF0b3IiCisgIChpb3IgKG1hdGNoX2NvZGUgImVxLCBuZSwgZ2UsIGx0LCBnZXUsIGx0dSIpCisgICAgICAgKGFuZCAobWF0Y2hfY29kZSAidW5zcGVjIikKKyAgICAgICAgICAgIChtYXRjaF90ZXN0ICIoWElOVChvcCwgMSkgPT0gVU5TUEVDX0NPTkRfTUkpCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFhJTlQob3AsIDEpID09IFVOU1BFQ19DT05EX1BMKSIpKSkpCisKKzs7IFRydWUgZm9yIGF2cjMyIGNvbXBhcmlzb24gb3BlcmFuZAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2NvbXBhcmlzb25fb3BlcmFuZCIKKyAgKGlvciAoYW5kIChtYXRjaF9jb2RlICJlcSwgbmUsIGd0LCBnZSwgbHQsIGxlLCBndHUsIGdldSwgbHR1LCBsZXUiKQorICAgICAgICAgICAgKG1hdGNoX3Rlc3QgIihDQzBfUCAoWEVYUChvcCwwKSkgJiYgcnR4X2VxdWFsX3AgKFhFWFAob3AsMSksIGNvbnN0MF9ydHgpKSIpKQorICAgICAgIChhbmQgKG1hdGNoX2NvZGUgInVuc3BlYyIpCisgICAgICAgICAgICAobWF0Y2hfdGVzdCAiKFhJTlQob3AsIDEpID09IFVOU1BFQ19DT05EX01JKQorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChYSU5UKG9wLCAxKSA9PSBVTlNQRUNfQ09ORF9QTCkiKSkpKQorCis7OyBUcnVlIGlmIHRoaXMgaXMgYSBjb25zdF9pbnQgd2l0aCBvbmUgYml0IHNldAorKGRlZmluZV9wcmVkaWNhdGUgIm9uZV9iaXRfc2V0X29wZXJhbmQiCisgIChtYXRjaF9jb2RlICJjb25zdF9pbnQiKQorICB7CisgICBpbnQgaTsKKyAgIGludCB2YWx1ZTsKKyAgIGludCBvbmVzID0gMDsKKworICAgdmFsdWUgPSBJTlRWQUwob3ApOworICAgZm9yICggaSA9IDAgOyBpIDwgMzI7IGkrKyApeworICAgICBpZiAoIHZhbHVlICYgKCAxIDw8IGkgKSApeworICAgICAgICBvbmVzKys7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAoIG9uZXMgPT0gMSApOworICB9KQorCisKKzs7IFRydWUgaWYgdGhpcyBpcyBhIGNvbnN0X2ludCB3aXRoIG9uZSBiaXQgY2xlYXJlZAorKGRlZmluZV9wcmVkaWNhdGUgIm9uZV9iaXRfY2xlYXJlZF9vcGVyYW5kIgorICAobWF0Y2hfY29kZSAiY29uc3RfaW50IikKKyAgeworICAgaW50IGk7CisgICBpbnQgdmFsdWU7CisgICBpbnQgemVyb2VzID0gMDsKKworICAgdmFsdWUgPSBJTlRWQUwob3ApOworICAgZm9yICggaSA9IDAgOyBpIDwgMzI7IGkrKyApeworICAgICBpZiAoICEodmFsdWUgJiAoIDEgPDwgaSApKSApeworICAgICAgICB6ZXJvZXMrKzsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuICggemVyb2VzID09IDEgKTsKKyAgfSkKKworCis7OyBJbW1lZGlhdGUgYWxsIHRoZSBsb3cgMTYtYml0cyBjbGVhcmVkCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfaGkxNl9pbW1lZGlhdGVfb3BlcmFuZCIKKyAgKG1hdGNoX2NvZGUgImNvbnN0X2ludCIpCisgIHsKKyAgIC8qIElmIHRoZSBsb3cgMTYtYml0cyBhcmUgemVybyB0aGVuIHRoaXMKKyAgICAgIGlzIGEgaGkxNiBpbW1lZGlhdGUuICovCisgICByZXR1cm4gKChJTlRWQUwob3ApICYgMHhmZmZmKSA9PSAwKTsKKyAgIH0KKykKKworOzsgVHJ1ZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlIG9wZXJhbmQKKyhkZWZpbmVfcHJlZGljYXRlICJyZWdpc3Rlcl9pbW1lZGlhdGVfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIpKSkKKworOzsgVHJ1ZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXIgb3IgY29uc3RfaW50IG9wZXJhbmQKKyhkZWZpbmVfcHJlZGljYXRlICJyZWdpc3Rlcl9jb25zdF9pbnRfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAoYW5kIChtYXRjaF9vcGVyYW5kIDAgImNvbnN0X2ludF9vcGVyYW5kIikKKyAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIikpKSkKKworOzsgVHJ1ZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXIgb3IgY29uc3RfZG91YmxlIG9wZXJhbmQKKyhkZWZpbmVfcHJlZGljYXRlICJyZWdpc3Rlcl9jb25zdF9kb3VibGVfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJjb25zdF9kb3VibGVfb3BlcmFuZCIpKSkKKworOzsgVHJ1ZSBpcyB0aGlzIGlzIGFuIG9wZXJhbmQgY29udGFpbmluZyBhIGxhYmVsX3JlZgorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2xhYmVsX3JlZl9vcGVyYW5kIgorICAoYW5kIChtYXRjaF9jb2RlICJtZW0iKQorICAgICAgIChtYXRjaF90ZXN0ICJhdnIzMl9maW5kX3N5bWJvbChvcCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKEdFVF9DT0RFKGF2cjMyX2ZpbmRfc3ltYm9sKG9wKSkgPT0gTEFCRUxfUkVGKSIpKSkKKworOzsgVHJ1ZSBpcyB0aGlzIGlzIGEgdmFsaWQgc3ltYm9sIHBvaW50aW5nIHRvIHRoZSBjb25zdGFudCBwb29sCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfY29uc3RfcG9vbF9vcGVyYW5kIgorICAoYW5kIChtYXRjaF9jb2RlICJzeW1ib2xfcmVmIikKKyAgICAgICAobWF0Y2hfdGVzdCAiQ09OU1RBTlRfUE9PTF9BRERSRVNTX1Aob3ApIikpCisgIHsKKyAgICAgICAgcmV0dXJuIChmbGFnX3BpYyA/ICghKHN5bWJvbF9tZW50aW9uZWRfcCAoZ2V0X3Bvb2xfY29uc3RhbnQgKG9wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxhYmVsX21lbnRpb25lZF9wIChnZXRfcG9vbF9jb25zdGFudCAob3ApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgYXZyMzJfZ290X21lbnRpb25lZF9wKGdldF9wb29sX2NvbnN0YW50IChvcCkpKQorICAgICAgICAgICAgICAgICAgICA6IHRydWUpOworICB9CispCisKKzs7IFRydWUgaXMgdGhpcyBpcyBhIG1lbW9yeSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IG9yIG1pbmkgcG9vbAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQiCisgIChpb3IgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfbGFiZWxfcmVmX29wZXJhbmQiKQorICAgICAgIChhbmQgKG1hdGNoX2NvZGUgIm1lbSIpCisgICAgICAgICAgICAobWF0Y2hfdGVzdCAiYXZyMzJfY29uc3RfcG9vbF9vcGVyYW5kKFhFWFAob3AsMCksIEdFVF9NT0RFKFhFWFAob3AsMCkpKSIpKSkpCisKKworOzsgTGVnYWwgc291cmNlIG9wZXJhbmQgZm9yIG1vdnRpIGluc25zCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfbW92dGlfc3JjX29wZXJhbmQiCisgIChpb3IgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfY29uc3RfcG9vbF9yZWZfb3BlcmFuZCIpCisgICAgICAgKGlvciAoaW9yIChtYXRjaF9vcGVyYW5kIDAgInJlZ2lzdGVyX2ltbWVkaWF0ZV9vcGVyYW5kIikKKyAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfaW5kaXJlY3RfcmVnaXN0ZXJfb3BlcmFuZCIpKQorICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQgMCAicG9zdF9pbmNfbWVtb3J5X29wZXJhbmQiKSkpKQorICAKKzs7IExlZ2FsIGRlc3RpbmF0aW9uIG9wZXJhbmQgZm9yIG1vdnRpIGluc25zCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfbW92dGlfZHN0X29wZXJhbmQiCisgIChpb3IgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kIDAgImF2cjMyX2luZGlyZWN0X3JlZ2lzdGVyX29wZXJhbmQiKSkKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJwcmVfZGVjX21lbW9yeV9vcGVyYW5kIikpKQorCisKKzs7IFRydWUgaXMgdGhpcyBpcyBhIGsxMiBvZmZzZXRlZCBtZW1vcnkgb3BlcmFuZAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2sxMl9tZW1vcnlfb3BlcmFuZCIKKyAgKGFuZCAobWF0Y2hfY29kZSAibWVtIikKKyAgICAgICAoaW9yIChtYXRjaF90ZXN0ICJSRUdfUChYRVhQKG9wLCAwKSkiKQorICAgICAgICAgICAgKG1hdGNoX3Rlc3QgIkdFVF9DT0RFKFhFWFAob3AsIDApKSA9PSBQTFVTCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgUkVHX1AoWEVYUChYRVhQKG9wLCAwKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKEdFVF9DT0RFKFhFWFAoWEVYUChvcCwgMCksIDEpKSA9PSBDT05TVF9JTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKENPTlNUX09LX0ZPUl9DT05TVFJBSU5UX1AoSU5UVkFMKFhFWFAoWEVYUChvcCwgMCksIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snLCAobW9kZSA9PSBTSW1vZGUpID8gXCJLczE0XCIgOiAoKG1vZGUgPT0gSEltb2RlKSA/IFwiS3MxM1wiIDogXCJLczEyXCIpKSkiKSkpKQorCis7OyBUcnVlIGlzIHRoaXMgaXMgYSBtZW1vcnkgb3BlcmFuZCB3aXRoIGFuIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9pbW1fZGlzcF9tZW1vcnlfb3BlcmFuZCIKKyAgKGFuZCAobWF0Y2hfY29kZSAibWVtIikKKyAgICAgICAobWF0Y2hfdGVzdCAiR0VUX0NPREUoWEVYUChvcCwgMCkpID09IFBMVVMKKyAgICAgICAgICAgICAgICAgICAgJiYgUkVHX1AoWEVYUChYRVhQKG9wLCAwKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICYmIChHRVRfQ09ERShYRVhQKFhFWFAob3AsIDApLCAxKSkgPT0gQ09OU1RfSU5UKSIpKSkKKworOzsgVHJ1ZSBpcyB0aGlzIGlzIGEgYnN3YXAgb3BlcmFuZAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2Jzd2FwX29wZXJhbmQiCisgIChpb3IgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfazEyX21lbW9yeV9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikpKQorCis7OyBUcnVlIGlzIHRoaXMgaXMgYSB2YWxpZCBjb3Byb2Nlc3NvciBpbnNuIG1lbW9yeSBvcGVyYW5kCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfY29wX21lbW9yeV9vcGVyYW5kIgorICAoYW5kIChtYXRjaF9vcGVyYW5kIDAgIm1lbW9yeV9vcGVyYW5kIikKKyAgICAgICAobm90IChtYXRjaF90ZXN0ICJHRVRfQ09ERShYRVhQKG9wLCAwKSkgPT0gUExVUworICAgICAgICAgICAgICAgICAgICAgICAgICYmIFJFR19QKFhFWFAoWEVYUChvcCwgMCksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIChHRVRfQ09ERShYRVhQKFhFWFAob3AsIDApLCAxKSkgPT0gQ09OU1RfSU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmICEoQ09OU1RfT0tfRk9SX0NPTlNUUkFJTlRfUChJTlRWQUwoWEVYUChYRVhQKG9wLCAwKSwgMCkpLCAnSycsIFwiS3UxMFwiKSkiKSkpKQorCis7OyBUcnVlIGlzIHRoaXMgaXMgYSB2YWxpZCBzb3VyY2UvZGVzdGluYXRpb24gb3BlcmFuZAorOzsgZm9yIG1vdmluZyB2YWx1ZXMgdG8vZnJvbSBhIGNvcHJvY2Vzc29yCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfY29wX21vdmVfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJhdnIzMl9jb3BfbWVtb3J5X29wZXJhbmQiKSkpCisKKworOzsgVHJ1ZSBpcyB0aGlzIGlzIGEgdmFsaWQgZXh0cmFjdCBieXRlIG9mZnNldCBmb3IgdXNlIGluCis7OyBsb2FkIGV4dHJhY3RlZCBpbmRleCBpbnNucworKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2V4dHJhY3Rfc2hpZnRfb3BlcmFuZCIKKyAgKGFuZCAobWF0Y2hfb3BlcmFuZCAwICJjb25zdF9pbnRfb3BlcmFuZCIpCisgICAgICAgKG1hdGNoX3Rlc3QgIihJTlRWQUwob3ApID09IDApIHx8IChJTlRWQUwob3ApID09IDgpCisgICAgICAgICAgICAgICAgICAgIHx8IChJTlRWQUwob3ApID09IDE2KSB8fCAoSU5UVkFMKG9wKSA9PSAyNCkiKSkpCisKKzs7IFRydWUgaXMgdGhpcyBpcyBhIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfZnBfcmVnaXN0ZXJfb3BlcmFuZCIKKyAgKGFuZCAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfdGVzdCAiUkVHTk9fUkVHX0NMQVNTKFJFR05PKG9wKSkgPT0gRlBfUkVHUyIpKSkKKworOzsgVHJ1ZSBpcyB0aGlzIGlzIHZhbGlkIGF2cjMyIHN5bWJvbCBvcGVyYW5kCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfc3ltYm9sX29wZXJhbmQiCisgIChhbmQgKG1hdGNoX2NvZGUgImxhYmVsX3JlZiwgc3ltYm9sX3JlZiwgY29uc3QiKQorICAgICAgIChtYXRjaF90ZXN0ICJhdnIzMl9maW5kX3N5bWJvbChvcCkiKSkpCisKKzs7IFRydWUgaXMgdGhpcyBpcyB2YWxpZCBvcGVyYW5kIGZvciB0aGUgbGRhLncgYW5kIGNhbGwgcHNldWRvIGluc25zCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfYWRkcmVzc19vcGVyYW5kIgorICAoYW5kIChhbmQgKG1hdGNoX2NvZGUgImxhYmVsX3JlZiwgc3ltYm9sX3JlZiIpCisgICAgICAgICAgICAobWF0Y2hfdGVzdCAiYXZyMzJfZmluZF9zeW1ib2wob3ApIikpCisgICAgICAgKGlvciAobWF0Y2hfdGVzdCAiVEFSR0VUX0hBU19BU01fQUREUl9QU0VVRE9TIikKKyAgICAgICAgICAgIChtYXRjaF90ZXN0ICJmbGFnX3BpYyIpKSApKQorCis7OyBBbiBpbW1lZGlhdGUgazE2IGFkZHJlc3Mgb3BlcmFuZAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2tzMTZfYWRkcmVzc19vcGVyYW5kIgorICAoYW5kIChtYXRjaF9vcGVyYW5kIDAgImFkZHJlc3Nfb3BlcmFuZCIpCisgICAgICAgKGlvciAobWF0Y2hfdGVzdCAiUkVHX1Aob3ApIikKKyAgICAgICAgICAgIChtYXRjaF90ZXN0ICJHRVRfQ09ERShvcCkgPT0gUExVUworICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoR0VUX0NPREUoWEVYUChvcCwwKSkgPT0gQ09OU1RfSU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoR0VUX0NPREUoWEVYUChvcCwxKSkgPT0gQ09OU1RfSU5UKSkiKSkgKSkKKworOzsgQW4gb2Zmc2V0IGsxNiBtZW1vcnkgb3BlcmFuZAorKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2tzMTZfbWVtb3J5X29wZXJhbmQiCisgIChhbmQgKG1hdGNoX2NvZGUgIm1lbSIpCisgICAgICAgKG1hdGNoX3Rlc3QgImF2cjMyX2tzMTZfYWRkcmVzc19vcGVyYW5kIChYRVhQIChvcCwgMCksIEdFVF9NT0RFIChYRVhQIChvcCwgMCkpKSIpKSkKKworOzsgQW4gaW1tZWRpYXRlIGsxMSBhZGRyZXNzIG9wZXJhbmQKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9rczExX2FkZHJlc3Nfb3BlcmFuZCIKKyAgKGFuZCAobWF0Y2hfb3BlcmFuZCAwICJhZGRyZXNzX29wZXJhbmQiKQorICAgICAgIChpb3IgKG1hdGNoX3Rlc3QgIlJFR19QKG9wKSIpCisgICAgICAgICAgICAobWF0Y2hfdGVzdCAiR0VUX0NPREUob3ApID09IFBMVVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKChHRVRfQ09ERShYRVhQKG9wLDApKSA9PSBDT05TVF9JTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdnIzMl9jb25zdF9va19mb3JfY29uc3RyYWludF9wKElOVFZBTChYRVhQKG9wLDApKSwgJ0snLCBcIktzMTFcIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoR0VUX0NPREUoWEVYUChvcCwxKSkgPT0gQ09OU1RfSU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXZyMzJfY29uc3Rfb2tfZm9yX2NvbnN0cmFpbnRfcChJTlRWQUwoWEVYUChvcCwxKSksICdLJywgXCJLczExXCIpKSkiKSkgKSkKKworOzsgVHJ1ZSBpZiB0aGlzIGlzIGEgYXZyMzIgY2FsbCBvcGVyYW5kCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfY2FsbF9vcGVyYW5kIgorICAoaW9yIChpb3IgKG1hdGNoX29wZXJhbmQgMCAicmVnaXN0ZXJfb3BlcmFuZCIpCisgICAgICAgICAgICAoaW9yIChtYXRjaF9vcGVyYW5kIDAgImF2cjMyX2NvbnN0X3Bvb2xfcmVmX29wZXJhbmQiKQorICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJhdnIzMl9hZGRyZXNzX29wZXJhbmQiKSkpCisgICAgICAgKG1hdGNoX3Rlc3QgIlNZTUJPTF9SRUZfUkNBTExfRlVOQ1RJT05fUChvcCkiKSkpCisKKzs7IFJldHVybiB0cnVlIGZvciBvcGVyYXRvcnMgcGVyZm9ybWluZyBBTFUgb3BlcmF0aW9ucworCisoZGVmaW5lX3ByZWRpY2F0ZSAiYWx1X29wZXJhdG9yIgorICAobWF0Y2hfY29kZSAiaW9yLCB4b3IsIGFuZCwgcGx1cywgbWludXMsIGFzaGlmdCwgbHNoaWZ0cnQsIGFzaGlmdHJ0IikpCisKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9hZGRfc2hpZnRfaW1tZWRpYXRlX29wZXJhbmQiCisgIChhbmQgKG1hdGNoX29wZXJhbmQgMCAiaW1tZWRpYXRlX29wZXJhbmQiKQorICAgICAgIChtYXRjaF90ZXN0ICJDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKElOVFZBTChvcCksICdLJywgXCJLdTAyXCIpIikpKQorCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfY29uZF9yZWdpc3Rlcl9pbW1lZGlhdGVfb3BlcmFuZCIKKyAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKKyAgICAgICAoYW5kIChtYXRjaF9vcGVyYW5kIDAgImltbWVkaWF0ZV9vcGVyYW5kIikKKyAgICAgICAgICAgIChtYXRjaF90ZXN0ICJDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKElOVFZBTChvcCksICdLJywgXCJLczA4XCIpIikpKSkKKworKGRlZmluZV9wcmVkaWNhdGUgImF2cjMyX2NvbmRfaW1tZWRpYXRlX29wZXJhbmQiCisgIChhbmQgKG1hdGNoX29wZXJhbmQgMCAiaW1tZWRpYXRlX29wZXJhbmQiKQorICAgICAgIChtYXRjaF90ZXN0ICJDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKElOVFZBTChvcCksICdJJywgXCJJczA4XCIpIikpKQorCisKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9jb25kX21vdmVfb3BlcmFuZCIKKyAgKGlvciAoaW9yIChtYXRjaF9vcGVyYW5kIDAgInJlZ2lzdGVyX29wZXJhbmQiKQorICAgICAgICAgICAgKGFuZCAobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIpCisgICAgICAgICAgICAgICAgIChtYXRjaF90ZXN0ICJDT05TVF9PS19GT1JfQ09OU1RSQUlOVF9QKElOVFZBTChvcCksICdLJywgXCJLczA4XCIpIikpKQorICAgICAgIChhbmQgKG1hdGNoX3Rlc3QgIlRBUkdFVF9WMl9JTlNOUyIpCisgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJtZW1vcnlfb3BlcmFuZCIpKSkpCisKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9tb3ZfaW1tZWRpYXRlX29wZXJhbmQiCisgIChhbmQgKG1hdGNoX29wZXJhbmQgMCAiaW1tZWRpYXRlX29wZXJhbmQiKQorICAgICAgIChtYXRjaF90ZXN0ICJhdnIzMl9jb25zdF9va19mb3JfbW92ZShJTlRWQUwob3ApKSIpKSkKKworCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfcm13X2FkZHJlc3Nfb3BlcmFuZCIKKyAgKGlvciAoYW5kIChtYXRjaF9jb2RlICJzeW1ib2xfcmVmIikgCisgICAgICAgICAgICAobWF0Y2hfdGVzdCAiKHtydHggc3ltYm9sID0gYXZyMzJfZmluZF9zeW1ib2wob3ApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCAmJiAoR0VUX0NPREUgKHN5bWJvbCkgPT0gU1lNQk9MX1JFRikgJiYgU1lNQk9MX1JFRl9STVdfQUREUihzeW1ib2wpO30pIikpCisgICAgICAgKGFuZCAobWF0Y2hfb3BlcmFuZCAwICJpbW1lZGlhdGVfb3BlcmFuZCIpCisgICAgICAgICAgICAobWF0Y2hfdGVzdCAiQ09OU1RfT0tfRk9SX0NPTlNUUkFJTlRfUChJTlRWQUwob3ApLCAnSycsIFwiS3MxN1wiKSIpKSkKKyAgeworICAgcmV0dXJuIFRBUkdFVF9STVcgJiYgIWZsYWdfcGljOworICB9CispCisgCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfcm13X21lbW9yeV9vcGVyYW5kIgorICAoYW5kIChtYXRjaF9jb2RlICJtZW0iKQorICAgICAgIChtYXRjaF90ZXN0ICIoR0VUX01PREUob3ApID09IFNJbW9kZSkgJiYgCisgICAgICAgICAgICAgICAgICAgIGF2cjMyX3Jtd19hZGRyZXNzX29wZXJhbmQoWEVYUChvcCwgMCksIEdFVF9NT0RFKFhFWFAob3AsIDApKSkiKSkpCisKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9ybXdfbWVtb3J5X29yX3JlZ2lzdGVyX29wZXJhbmQiCisgIChpb3IgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfcm13X21lbW9yeV9vcGVyYW5kIikKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikpKQorCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfbm9uX3Jtd19tZW1vcnlfb3BlcmFuZCIKKyAgKGFuZCAobm90IChtYXRjaF9vcGVyYW5kIDAgImF2cjMyX3Jtd19tZW1vcnlfb3BlcmFuZCIpKQorICAgICAgIChtYXRjaF9vcGVyYW5kIDAgIm1lbW9yeV9vcGVyYW5kIikpKQorCisoZGVmaW5lX3ByZWRpY2F0ZSAiYXZyMzJfbm9uX3Jtd19nZW5lcmFsX29wZXJhbmQiCisgIChhbmQgKG5vdCAobWF0Y2hfb3BlcmFuZCAwICJhdnIzMl9ybXdfbWVtb3J5X29wZXJhbmQiKSkKKyAgICAgICAobWF0Y2hfb3BlcmFuZCAwICJnZW5lcmFsX29wZXJhbmQiKSkpCisKKyhkZWZpbmVfcHJlZGljYXRlICJhdnIzMl9ub25fcm13X25vbmltbWVkaWF0ZV9vcGVyYW5kIgorICAoYW5kIChub3QgKG1hdGNoX29wZXJhbmQgMCAiYXZyMzJfcm13X21lbW9yeV9vcGVyYW5kIikpCisgICAgICAgKG1hdGNoX29wZXJhbmQgMCAibm9uaW1tZWRpYXRlX29wZXJhbmQiKSkpCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9hdnIzMi9zaW1kLm1kCkBAIC0wLDAgKzEsMTQ1IEBACis7OyAgIEFWUjMyIG1hY2hpbmUgZGVzY3JpcHRpb24gZmlsZSBmb3IgU0lNRCBpbnN0cnVjdGlvbnMuCis7OyAgIENvcHlyaWdodCAyMDAzLTIwMDYgQXRtZWwgQ29ycG9yYXRpb24uCis7OworOzsgICBXcml0dGVuIGJ5IFJvbm55IFBlZGVyc2VuLCBBdG1lbCBOb3J3YXksIDxycGVkZXJzZW5AYXRtZWwuY29tPgorOzsKKzs7ICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOzsgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorOzsgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOzsgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCis7OyAtKi0gTW9kZTogU2NoZW1lIC0qLQorCisKKzs7IFZlY3RvciBtb2RlcworKGRlZmluZV9tb2RlX21hY3JvIFZFQ00gW1YySEkgVjRRSV0pCisoZGVmaW5lX21vZGVfYXR0ciAgc2l6ZSBbKFYySEkgImgiKSAoVjRRSSAiYiIpXSkKKworKGRlZmluZV9pbnNuICJhZGQ8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWRUNNIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHBsdXM6VkVDTSAobWF0Y2hfb3BlcmFuZDpWRUNNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpWRUNNIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKV0KKyAgIlRBUkdFVF9TSU1EIgorICAicGFkZC48c2l6ZT5cdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IildKQorCisKKyhkZWZpbmVfaW5zbiAic3ViPG1vZGU+MyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VkVDTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShtaW51czpWRUNNIChtYXRjaF9vcGVyYW5kOlZFQ00gMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpWRUNNIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKV0KKyAgIlRBUkdFVF9TSU1EIgorICAicHN1Yi48c2l6ZT5cdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IildKQorCisKKyhkZWZpbmVfaW5zbiAiYWJzPG1vZGU+MiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VkVDTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShhYnM6VkVDTSAobWF0Y2hfb3BlcmFuZDpWRUNNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKV0KKyAgIlRBUkdFVF9TSU1EIgorICAicGFicy5zPHNpemU+XHQlMCwgJTEiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IildKQorCisoZGVmaW5lX2luc24gImFzaGw8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWRUNNIDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICAgICAgICAiPXIiKQorCShhc2hpZnQ6VkVDTSAobWF0Y2hfb3BlcmFuZDpWRUNNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgImltbWVkaWF0ZV9vcGVyYW5kIiAiS3UwNCIpKSldCisgICJUQVJHRVRfU0lNRCIKKyAgInBsc2wuPHNpemU+XHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSIpXSkKKworKGRlZmluZV9pbnNuICJhc2hyPG1vZGU+MyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VkVDTSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgICAgICAgICAgIj1yIikKKwkoYXNoaWZ0cnQ6VkVDTSAobWF0Y2hfb3BlcmFuZDpWRUNNIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMiAiaW1tZWRpYXRlX29wZXJhbmQiICJLdTA0IikpKV0KKyAgIlRBUkdFVF9TSU1EIgorICAicGFzci48c2l6ZT5cdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IildKQorCisoZGVmaW5lX2luc24gImxzaHI8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWRUNNIDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICAgICAgICAiPXIiKQorCShsc2hpZnRydDpWRUNNIChtYXRjaF9vcGVyYW5kOlZFQ00gMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJpbW1lZGlhdGVfb3BlcmFuZCIgIkt1MDQiKSkpXQorICAiVEFSR0VUX1NJTUQiCisgICJwbHNyLjxzaXplPlx0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUiKV0pCisKKyhkZWZpbmVfaW5zbiAic21heHYyaGkzIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWMkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisJKHNtYXg6VjJISSAobWF0Y2hfb3BlcmFuZDpWMkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlYySEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpXQorCisgICJUQVJHRVRfU0lNRCIKKyAgInBtYXguc2hcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IildKQorCisoZGVmaW5lX2luc24gInNtaW52MmhpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VjJISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCShzbWluOlYySEkgKG1hdGNoX29wZXJhbmQ6VjJISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpWMkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpKV0KKworICAiVEFSR0VUX1NJTUQiCisgICJwbWluLnNoXHQlMCwgJTEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSIpXSkKKworKGRlZmluZV9pbnNuICJ1bWF4djRxaTMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlY0UUkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkodW1heDpWNFFJIChtYXRjaF9vcGVyYW5kOlY0UUkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlY0UUkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkpXQorCisgICJUQVJHRVRfU0lNRCIKKyAgInBtYXgudWJcdCUwLCAlMSwgJTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjQiKQorICAgKHNldF9hdHRyICJ0eXBlIiAiYWx1IildKQorCisoZGVmaW5lX2luc24gInVtaW52NHFpMyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VjRRSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCSh1bWluOlY0UUkgKG1hdGNoX29wZXJhbmQ6VjRRSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6VjRRSSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKSldCisKKyAgIlRBUkdFVF9TSU1EIgorICAicG1pbi51Ylx0JTAsICUxLCAlMiIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJhbHUiKV0pCisKKworKGRlZmluZV9pbnNuICJhZGRzdWJ2MmhpIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWMkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICh2ZWNfY29uY2F0OlYySEkKKyAgICAgICAgIChwbHVzOkhJIChtYXRjaF9vcGVyYW5kOkhJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIikKKyAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOkhJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpCisgICAgICAgICAobWludXM6SEkgKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpKSkpXQorICAiVEFSR0VUX1NJTUQiCisgICJwYWRkc3ViLmhcdCUwLCAlMTpiLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSIpXSkKKworKGRlZmluZV9pbnNuICJzdWJhZGR2MmhpIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWMkhJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9ciIpCisgICAgICAgICh2ZWNfY29uY2F0OlYySEkKKyAgICAgICAgIChtaW51czpISSAobWF0Y2hfb3BlcmFuZDpISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCisgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpISSAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKQorICAgICAgICAgKHBsdXM6SEkgKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpKSkpXQorICAiVEFSR0VUX1NJTUQiCisgICJwc3ViYWRkLmhcdCUwLCAlMTpiLCAlMjpiIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IikKKyAgIChzZXRfYXR0ciAidHlwZSIgImFsdSIpXSkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL3N5bmMubWQKQEAgLTAsMCArMSwyNDQgQEAKKzs7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IEF0b21pYyBvcGVyYXRpb25zCis7Oz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworKGRlZmluZV9pbnNuICJzeW5jX2NvbXBhcmVfYW5kX3N3YXBzaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj0mciwmciIpCisJKG1hdGNoX29wZXJhbmQ6U0kgMSAibWVtb3J5X29wZXJhbmQiICIrUktzMTYsK1JLczE2IikpCisgICAoc2V0IChtYXRjaF9kdXAgMSkKKwkodW5zcGVjX3ZvbGF0aWxlOlNJCisJICBbKG1hdGNoX2R1cCAxKQorCSAgIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX2ltbWVkaWF0ZV9vcGVyYW5kIiAicixLczIxIikKKwkgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJyZWdpc3Rlcl9vcGVyYW5kIiAicixyIildCisJICBWVU5TUEVDX1NZTkNfQ01QWENIRykpICAgXQorICAiIgorICAiMDoKKyAgIHNzcmZcdDUKKyAgIGxkLndcdCUwLCUxCisgICBjcC53XHQlMCwlMgorICAgYnJuZVx0MGYKKyAgIHN0Y29uZFx0JTEsICUzCisgICBicm5lXHQwYgorICAgMDoKKyAgIgorICBbKHNldF9hdHRyICJsZW5ndGgiICIxNiwxOCIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorICApCisgCisKKyhkZWZpbmVfY29kZV9tYWNybyBhdG9taWNfb3AgW3BsdXMgbWludXMgYW5kIGlvciB4b3JdKQorKGRlZmluZV9jb2RlX2F0dHIgIGF0b21pY19hc21faW5zbiBbKHBsdXMgImFkZCIpIChtaW51cyAic3ViIikgKGFuZCAiYW5kIikgKGlvciAib3IiKSAoeG9yICJlb3IiKV0pCisoZGVmaW5lX2NvZGVfYXR0ciAgYXRvbWljX2luc24gWyhwbHVzICJhZGQiKSAobWludXMgInN1YiIpIChhbmQgImFuZCIpIChpb3IgImlvciIpICh4b3IgInhvciIpXSkKKworKGRlZmluZV9pbnNuICJzeW5jX2xvYWRzaSIKKyAgOyBOQiEgUHV0IGFuIGVhcmx5IGNsb2JiZXIgb24gdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQgdG8gCisgIDsgYXZvaWQgZ2NjIHVzaW5nIHRoZSBzYW1lIHJlZ2lzdGVyIGluIHRoZSBzb3VyY2UgYW5kIAorICA7IGRlc3RpbmF0aW9uLiBUaGlzIGlzIGRvbmUgaW4gb3JkZXIgdG8gYXZvaWQgZ2NjIHRvIAorICA7IGNsb2JiZXIgdGhlIHNvdXJjZSBvcGVyYW5kIHNpbmNlIHRoZXNlIGluc3RydWN0aW9ucworICA7IGFyZSBhY3R1YWxseSBpbnNpZGUgYSAibG9vcCIuCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKQorCSh1bnNwZWNfdm9sYXRpbGU6U0kKKyAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAxICJhdnIzMl9rczE2X21lbW9yeV9vcGVyYW5kIiAiUktzMTYiKQorICAgICAgICAgIChsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMiAiIiAiIikpXQorICAgICAgICAgVlVOU1BFQ19TWU5DX1NFVF9MT0NLX0FORF9MT0FEKSApXQorICAiIgorICAiJTI6CisgICBzc3JmXHQ1CisgICBsZC53XHQlMCwlMSIKKyAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiNiIpCisgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorICApCisgIAorKGRlZmluZV9pbnNuICJzeW5jX3N0b3JlX2lmX2xvY2siCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgImF2cjMyX2tzMTZfbWVtb3J5X29wZXJhbmQiICI9UktzMTYiKQorICAgICAgICAodW5zcGVjX3ZvbGF0aWxlOlNJCisgICAgICAgICBbKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKQorICAgICAgICAgIChsYWJlbF9yZWYgKG1hdGNoX29wZXJhbmQgMiAiIiAiIikpXQorICAgICAgICAgVlVOU1BFQ19TWU5DX1NUT1JFX0lGX0xPQ0spICldCisgICIiCisgICJzdGNvbmRcdCUwLCAlMQorICAgYnJuZVx0JTIiCisgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjYiKQorICAgKHNldF9hdHRyICJjYyIgImNsb2JiZXIiKV0KKyAgKQorCisKKyhkZWZpbmVfZXhwYW5kICJzeW5jXzxhdG9taWNfaW5zbj5zaSIKKyAgWyhzZXQgKG1hdGNoX2R1cCAyKQorCSh1bnNwZWNfdm9sYXRpbGU6U0kKKyAgICAgICAgIFsobWF0Y2hfb3BlcmFuZDpTSSAwICJhdnIzMl9rczE2X21lbW9yeV9vcGVyYW5kIiAiIikKKyAgICAgICAgICAobWF0Y2hfZHVwIDMpXQorICAgICAgICAgVlVOU1BFQ19TWU5DX1NFVF9MT0NLX0FORF9MT0FEKSkKKyAgIChzZXQgKG1hdGNoX2R1cCAyKSAKKyAgICAgICAgKGF0b21pY19vcDpTSSAobWF0Y2hfZHVwIDIpCisgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfaW1tZWRpYXRlX29wZXJhbmQiICIiKSkpCisgICAoc2V0IChtYXRjaF9kdXAgMCkKKyAgICAgICAgKHVuc3BlY192b2xhdGlsZTpTSQorICAgICAgICAgWyhtYXRjaF9kdXAgMikKKyAgICAgICAgICAobWF0Y2hfZHVwIDMpXQorICAgICAgICAgVlVOU1BFQ19TWU5DX1NUT1JFX0lGX0xPQ0spICkKKyAgICh1c2UgKG1hdGNoX2R1cCAxKSkKKyAgICh1c2UgKG1hdGNoX2R1cCA0KSldCisgICIiCisgIHsKKyAgIHJ0eCAqbWVtX2V4cHIgPSAmb3BlcmFuZHNbMF07CisgICBydHggcHRyX3JlZzsKKyAgIGlmICggIWF2cjMyX2tzMTZfbWVtb3J5X29wZXJhbmQgKCptZW1fZXhwciwgR0VUX01PREUgKCptZW1fZXhwcikpICkKKyAgICB7CisgICAgICBwdHJfcmVnID0gZm9yY2VfcmVnIChQbW9kZSwgWEVYUCAoKm1lbV9leHByLCAwKSk7CisgICAgICBYRVhQICgqbWVtX2V4cHIsIDApID0gcHRyX3JlZzsKKyAgICB9IAorICAgZWxzZSAKKyAgICB7CisgICAgICBydHggYWRkcmVzcyA9IFhFWFAgKCptZW1fZXhwciwgMCk7CisgICAgICBpZiAoIFJFR19QIChhZGRyZXNzKSApCisgICAgICAgICBwdHJfcmVnID0gYWRkcmVzczsKKyAgICAgIGVsc2UgaWYgKCBSRUdfUCAoWEVYUCAoYWRkcmVzcywgMCkpICkgCisgICAgICAgICBwdHJfcmVnID0gWEVYUCAoYWRkcmVzcywgMCk7CisgICAgICBlbHNlIAorICAgICAgICAgcHRyX3JlZyA9IFhFWFAgKGFkZHJlc3MsIDEpOworICAgIH0KKworICAgb3BlcmFuZHNbMl0gPSBnZW5fcmVnX3J0eCAoU0ltb2RlKTsKKyAgIG9wZXJhbmRzWzNdID0gZ2VuX3J0eF9MQUJFTF9SRUYoUG1vZGUsIGdlbl9sYWJlbF9ydHggKCkpOworICAgb3BlcmFuZHNbNF0gPSBwdHJfcmVnOyAgIAorCisgIH0KKyAgKQorCisKKworKGRlZmluZV9leHBhbmQgInN5bmNfb2xkXzxhdG9taWNfaW5zbj5zaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpCisJKHVuc3BlY192b2xhdGlsZTpTSQorICAgICAgICAgWyhtYXRjaF9vcGVyYW5kOlNJIDEgImF2cjMyX2tzMTZfbWVtb3J5X29wZXJhbmQiICIiKQorICAgICAgICAgIChtYXRjaF9kdXAgNCldCisgICAgICAgICBWVU5TUEVDX1NZTkNfU0VUX0xPQ0tfQU5EX0xPQUQpKQorICAgKHNldCAobWF0Y2hfZHVwIDMpIAorICAgICAgICAoYXRvbWljX29wOlNJIChtYXRjaF9kdXAgMCkKKyAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJyZWdpc3Rlcl9pbW1lZGlhdGVfb3BlcmFuZCIgIiIpKSkKKyAgIChzZXQgKG1hdGNoX2R1cCAxKQorICAgICAgICAodW5zcGVjX3ZvbGF0aWxlOlNJCisgICAgICAgICBbKG1hdGNoX2R1cCAzKQorICAgICAgICAgIChtYXRjaF9kdXAgNCldCisgICAgICAgICBWVU5TUEVDX1NZTkNfU1RPUkVfSUZfTE9DSykgKQorICAgKHVzZSAobWF0Y2hfZHVwIDIpKQorICAgKHVzZSAobWF0Y2hfZHVwIDUpKV0KKyAgIiIKKyAgeworICAgcnR4ICptZW1fZXhwciA9ICZvcGVyYW5kc1sxXTsKKyAgIHJ0eCBwdHJfcmVnOworICAgaWYgKCAhYXZyMzJfa3MxNl9tZW1vcnlfb3BlcmFuZCAoKm1lbV9leHByLCBHRVRfTU9ERSAoKm1lbV9leHByKSkgKQorICAgIHsKKyAgICAgIHB0cl9yZWcgPSBmb3JjZV9yZWcgKFBtb2RlLCBYRVhQICgqbWVtX2V4cHIsIDApKTsKKyAgICAgIFhFWFAgKCptZW1fZXhwciwgMCkgPSBwdHJfcmVnOworICAgIH0gCisgICBlbHNlIAorICAgIHsKKyAgICAgIHJ0eCBhZGRyZXNzID0gWEVYUCAoKm1lbV9leHByLCAwKTsKKyAgICAgIGlmICggUkVHX1AgKGFkZHJlc3MpICkKKyAgICAgICAgIHB0cl9yZWcgPSBhZGRyZXNzOworICAgICAgZWxzZSBpZiAoIFJFR19QIChYRVhQIChhZGRyZXNzLCAwKSkgKSAKKyAgICAgICAgIHB0cl9yZWcgPSBYRVhQIChhZGRyZXNzLCAwKTsKKyAgICAgIGVsc2UgCisgICAgICAgICBwdHJfcmVnID0gWEVYUCAoYWRkcmVzcywgMSk7CisgICAgfQorCisgICBvcGVyYW5kc1szXSA9IGdlbl9yZWdfcnR4IChTSW1vZGUpOworICAgb3BlcmFuZHNbNF0gPSBnZW5fcnR4X0xBQkVMX1JFRihQbW9kZSwgZ2VuX2xhYmVsX3J0eCAoKSk7CisgICBvcGVyYW5kc1s1XSA9IHB0cl9yZWc7CisgIH0KKyAgKQorCisoZGVmaW5lX2V4cGFuZCAic3luY19uZXdfPGF0b21pY19pbnNuPnNpIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiIikKKwkodW5zcGVjX3ZvbGF0aWxlOlNJCisgICAgICAgICBbKG1hdGNoX29wZXJhbmQ6U0kgMSAiYXZyMzJfa3MxNl9tZW1vcnlfb3BlcmFuZCIgIiIpCisgICAgICAgICAgKG1hdGNoX2R1cCAzKV0KKyAgICAgICAgIFZVTlNQRUNfU1lOQ19TRVRfTE9DS19BTkRfTE9BRCkpCisgICAoc2V0IChtYXRjaF9kdXAgMCkgCisgICAgICAgIChhdG9taWNfb3A6U0kgKG1hdGNoX2R1cCAwKQorICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX2ltbWVkaWF0ZV9vcGVyYW5kIiAiIikpKQorICAgKHNldCAobWF0Y2hfZHVwIDEpCisgICAgICAgICh1bnNwZWNfdm9sYXRpbGU6U0kKKyAgICAgICAgIFsobWF0Y2hfZHVwIDApCisgICAgICAgICAgKG1hdGNoX2R1cCAzKV0KKyAgICAgICAgIFZVTlNQRUNfU1lOQ19TVE9SRV9JRl9MT0NLKSApCisgICAodXNlIChtYXRjaF9kdXAgMikpCisgICAodXNlIChtYXRjaF9kdXAgNCkpXQorICAiIgorICB7CisgICBydHggKm1lbV9leHByID0gJm9wZXJhbmRzWzFdOworICAgcnR4IHB0cl9yZWc7CisgICBpZiAoICFhdnIzMl9rczE2X21lbW9yeV9vcGVyYW5kICgqbWVtX2V4cHIsIEdFVF9NT0RFICgqbWVtX2V4cHIpKSApCisgICAgeworICAgICAgcHRyX3JlZyA9IGZvcmNlX3JlZyAoUG1vZGUsIFhFWFAgKCptZW1fZXhwciwgMCkpOworICAgICAgWEVYUCAoKm1lbV9leHByLCAwKSA9IHB0cl9yZWc7CisgICAgfSAKKyAgIGVsc2UgCisgICAgeworICAgICAgcnR4IGFkZHJlc3MgPSBYRVhQICgqbWVtX2V4cHIsIDApOworICAgICAgaWYgKCBSRUdfUCAoYWRkcmVzcykgKQorICAgICAgICAgcHRyX3JlZyA9IGFkZHJlc3M7CisgICAgICBlbHNlIGlmICggUkVHX1AgKFhFWFAgKGFkZHJlc3MsIDApKSApIAorICAgICAgICAgcHRyX3JlZyA9IFhFWFAgKGFkZHJlc3MsIDApOworICAgICAgZWxzZSAKKyAgICAgICAgIHB0cl9yZWcgPSBYRVhQIChhZGRyZXNzLCAxKTsKKyAgICB9CisKKyAgIG9wZXJhbmRzWzNdID0gZ2VuX3J0eF9MQUJFTF9SRUYoUG1vZGUsIGdlbl9sYWJlbF9ydHggKCkpOworICAgb3BlcmFuZHNbNF0gPSBwdHJfcmVnOworICB9CisgICkKKworCis7KGRlZmluZV9pbnNuICJzeW5jXzxhdG9taWNfaW5zbj5zaSIKKzsgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgIm1lbW9yeV9vcGVyYW5kIiAiK1JLczE2IikKKzsJKHVuc3BlY192b2xhdGlsZTpTSQorOyAgICAgICAgIFsoYXRvbWljX29wOlNJIChtYXRjaF9kdXAgMCkKKzsgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpKV0KKzsgICAgICAgICBWVU5TUEVDX1NZTkNfQ01QWENIRykpCis7ICAgKGNsb2JiZXIgKG1hdGNoX3NjcmF0Y2g6U0kgMiAiPSZyIikpXQorOyAgIiIKKzsgICIwOgorOyAgIHNzcmZcdDUKKzsgICBsZC53XHQlMiwlMAorOyAgIDxhdG9taWNfYXNtX2luc24+XHQlMiwlMQorOyAgIHN0Y29uZFx0JTAsICUyCis7ICAgYnJuZVx0MGIKKzsgICIKKzsgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjE0IikKKzsgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorOyAgKQorOworOyhkZWZpbmVfaW5zbiAic3luY19uZXdfPGF0b21pY19pbnNuPnNpIgorOyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMSAibWVtb3J5X29wZXJhbmQiICIrUktzMTYiKQorOwkodW5zcGVjX3ZvbGF0aWxlOlNJCis7ICAgICAgICAgWyhhdG9taWNfb3A6U0kgKG1hdGNoX2R1cCAxKQorOyAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpXQorOyAgICAgICAgIFZVTlNQRUNfU1lOQ19DTVBYQ0hHKSkKKzsgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKQorOwkoYXRvbWljX29wOlNJIChtYXRjaF9kdXAgMSkKKzsgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoX2R1cCAyKSkpXQorOyAgIiIKKzsgICIwOgorOyAgIHNzcmZcdDUKKzsgICBsZC53XHQlMCwlMQorOyAgIDxhdG9taWNfYXNtX2luc24+XHQlMCwlMgorOyAgIHN0Y29uZFx0JTEsICUwCis7ICAgYnJuZVx0MGIKKzsgICIKKzsgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjE0IikKKzsgICAoc2V0X2F0dHIgImNjIiAiY2xvYmJlciIpXQorOyAgKQorCisoZGVmaW5lX2luc24gInN5bmNfbG9ja190ZXN0X2FuZF9zZXRzaSIKKyAgWyAoc2V0IChtYXRjaF9vcGVyYW5kOlNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKQorICAgICAgICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAibWVtb3J5X29wZXJhbmQiICIrUkt1MDAiKSkKKyAgICAoc2V0IChtYXRjaF9kdXAgMSkKKyAgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJyIikpIF0KKyAgIiIKKyAgInhjaGdcdCUwLCAlcDEsICUyIgorICBbKHNldF9hdHRyICJsZW5ndGgiICI0IildCisgICkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL3QtYXZyMzIKQEAgLTAsMCArMSw3NyBAQAorCitNRF9JTkNMVURFUz0gCSQoc3JjZGlyKS9jb25maWcvYXZyMzIvYXZyMzIubWQgXAorCQkkKHNyY2RpcikvY29uZmlnL2F2cjMyL3N5bmMubWQgXAorCQkkKHNyY2RpcikvY29uZmlnL2F2cjMyL2ZwY3AubWQgXAorCQkkKHNyY2RpcikvY29uZmlnL2F2cjMyL3NpbWQubWQgXAorICAgICAgICAkKHNyY2RpcikvY29uZmlnL2F2cjMyL3ByZWRpY2F0ZXMubWQKKworcy1jb25maWcgcy1jb25kaXRpb25zIHMtZmxhZ3Mgcy1jb2RlcyBzLWNvbnN0YW50cyBzLWVtaXQgcy1yZWNvZyBzLXByZWRzIFwKKwlzLW9waW5pdCBzLWV4dHJhY3Qgcy1wZWVwIHMtYXR0ciBzLWF0dHJ0YWIgcy1vdXRwdXQ6ICQoTURfSU5DTFVERVMpCisKKyMgV2Ugd2FudCBmaW5lIGdyYWluZWQgbGlicmFyaWVzLCBzbyB1c2UgdGhlIG5ldyBjb2RlCisjIHRvIGJ1aWxkIHRoZSBmbG9hdGluZyBwb2ludCBlbXVsYXRpb24gbGlicmFyaWVzLgorRlBCSVQgPSBmcC1iaXQuYworRFBCSVQgPSBkcC1iaXQuYworCitMSUIxQVNNU1JDID0gYXZyMzIvbGliMWZ1bmNzLlMKK0xJQjFBU01GVU5DUyA9ICBfYXZyMzJfZjY0X211bCBfYXZyMzJfZjY0X211bF9mYXN0IF9hdnIzMl9mNjRfYWRkc3ViIF9hdnIzMl9mNjRfYWRkc3ViX2Zhc3QgIF9hdnIzMl9mNjRfdG9fdTMyIFwKKyAgICAgICAgICAgICAgICBfYXZyMzJfZjY0X3RvX3MzMiBfYXZyMzJfZjY0X3RvX3U2NCBfYXZyMzJfZjY0X3RvX3M2NCBfYXZyMzJfdTMyX3RvX2Y2NCBcCisgICAgICAgICAgICAgICAgX2F2cjMyX3MzMl90b19mNjQgX2F2cjMyX2Y2NF9jbXBfZXEgX2F2cjMyX2Y2NF9jbXBfZ2UgX2F2cjMyX2Y2NF9jbXBfbHQgXAorICAgICAgICAgICAgICAgIF9hdnIzMl9mMzJfY21wX2VxIF9hdnIzMl9mMzJfY21wX2dlIF9hdnIzMl9mMzJfY21wX2x0IF9hdnIzMl9mNjRfZGl2IF9hdnIzMl9mNjRfZGl2X2Zhc3QgXAorICAgICAgICAgICAgICAgIF9hdnIzMl9mMzJfZGl2IF9hdnIzMl9mMzJfZGl2X2Zhc3QgX2F2cjMyX2YzMl9hZGRzdWIgX2F2cjMyX2YzMl9hZGRzdWJfZmFzdCBcCisgICAgICAgICAgICAgICAgX2F2cjMyX2YzMl9tdWwgX2F2cjMyX3MzMl90b19mMzIgX2F2cjMyX3UzMl90b19mMzIgX2F2cjMyX2YzMl90b19zMzIgXAorICAgICAgICAgICAgICAgIF9hdnIzMl9mMzJfdG9fdTMyIF9hdnIzMl9mMzJfdG9fZjY0IF9hdnIzMl9mNjRfdG9fZjMyIF9tdWxzaTMKKworI0xJQjJGVU5DU19FWFRSQSArPSAkKHNyY2RpcikvY29uZmlnL2F2cjMyL2xpYjJmdW5jcy5TCisKK01VTFRJTElCX09QVElPTlMgICAgID0gbWFyY2g9YXAvbWFyY2g9dWNyMS9tYXJjaD11Y3IyL21hcmNoPXVjcjJub211bAorTVVMVElMSUJfRElSTkFNRVMgICAgPSBhcCB1Y3IxIHVjcjIgdWNyMm5vbXVsCitNVUxUSUxJQl9FWENFUFRJT05TICA9CitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD9hcD1tcGFydD9hcDcwMDAKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP2FwPW1wYXJ0P2FwNzAwMQorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/YXA9bXBhcnQ/YXA3MDAyCitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD9hcD1tcGFydD9hcDcyMDAKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjE9bWFyY2g/dWMKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjE9bXBhcnQ/dWMzYTA1MTJlcworTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMj1tcGFydD91YzNhMDEyOAorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMj1tcGFydD91YzNhMDI1NgorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMj1tcGFydD91YzNhMDUxMgorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMj1tcGFydD91YzNhMTEyOAorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMj1tcGFydD91YzNhMTI1NgorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMT1tcGFydD91YzNhMTUxMmVzCitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IyPW1wYXJ0P3VjM2ExNTEyCitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3Iybm9tdWw9bXBhcnQ/dWMzYTNyZXZkCitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IyPW1wYXJ0P3VjM2EzNjQKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjI9bXBhcnQ/dWMzYTM2NHMKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjI9bXBhcnQ/dWMzYTMxMjgKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjI9bXBhcnQ/dWMzYTMxMjhzCitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IyPW1wYXJ0P3VjM2EzMjU2CitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IyPW1wYXJ0P3VjM2EzMjU2cworTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMT1tcGFydD91YzNiMDY0CitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IxPW1wYXJ0P3VjM2IwMTI4CitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IxPW1wYXJ0P3VjM2IwMjU2ZXMKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjE9bXBhcnQ/dWMzYjAyNTYKK01VTFRJTElCX01BVENIRVMgICAgICs9IG1hcmNoP3VjcjE9bXBhcnQ/dWMzYjE2NAorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMT1tcGFydD91YzNiMTEyOAorTVVMVElMSUJfTUFUQ0hFUyAgICAgKz0gbWFyY2g/dWNyMT1tcGFydD91YzNiMTI1NmVzCitNVUxUSUxJQl9NQVRDSEVTICAgICArPSBtYXJjaD91Y3IxPW1wYXJ0P3VjM2IxMjU2CisKKworRVhUUkFfTVVMVElMSUJfUEFSVFMgPSBjcnRiZWdpbi5vIGNydGJlZ2luUy5vIGNydGVuZC5vIGNydGVuZFMubyBjcnRpLm8gY3J0bi5vCisKK0NSVFNUVUZGX1RfQ0ZMQUdTID0gLW1yZWxheAorQ1JUU1RVRkZfVF9DRkxBR1NfUyA9IC1tcmVsYXggLWZQSUMKK1RBUkdFVF9MSUJHQ0MyX0NGTEFHUyArPSAtbXJlbGF4CisKK0xJQkdDQyA9IHN0bXAtbXVsdGlsaWIKK0lOU1RBTExfTElCR0NDID0gaW5zdGFsbC1tdWx0aWxpYgorCitmcC1iaXQuYzogJChzcmNkaXIpL2NvbmZpZy9mcC1iaXQuYworCWVjaG8gJyNkZWZpbmUgRkxPQVQnID4gZnAtYml0LmMKKwljYXQgJChzcmNkaXIpL2NvbmZpZy9mcC1iaXQuYyA+PiBmcC1iaXQuYworCitkcC1iaXQuYzogJChzcmNkaXIpL2NvbmZpZy9mcC1iaXQuYworCWNhdCAkKHNyY2RpcikvY29uZmlnL2ZwLWJpdC5jID4gZHAtYml0LmMKKworCisKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvY29uZmlnL2F2cjMyL3QtZWxmCkBAIC0wLDAgKzEsMTYgQEAKKworIyBBc3NlbWJsZSBzdGFydHVwIGZpbGVzLgorJChUKWNydGkubzogJChzcmNkaXIpL2NvbmZpZy9hdnIzMi9jcnRpLmFzbSAkKEdDQ19QQVNTRVMpCisJJChHQ0NfRk9SX1RBUkdFVCkgJChDUlRTVFVGRl9DRkxBR1MpICQoQ1JUU1RVRkZfVF9DRkxBR1MpICQoSU5DTFVERVMpIFwKKwktYyAtbyAkKFQpY3J0aS5vIC14IGFzc2VtYmxlci13aXRoLWNwcCAkKHNyY2RpcikvY29uZmlnL2F2cjMyL2NydGkuYXNtCisKKyQoVCljcnRuLm86ICQoc3JjZGlyKS9jb25maWcvYXZyMzIvY3J0bi5hc20gJChHQ0NfUEFTU0VTKQorCSQoR0NDX0ZPUl9UQVJHRVQpICQoQ1JUU1RVRkZfQ0ZMQUdTKSAkKENSVFNUVUZGX1RfQ0ZMQUdTKSAkKElOQ0xVREVTKSBcCisJLWMgLW8gJChUKWNydG4ubyAteCBhc3NlbWJsZXItd2l0aC1jcHAgJChzcmNkaXIpL2NvbmZpZy9hdnIzMi9jcnRuLmFzbQorCisKKyMgQnVpbGQgdGhlIGxpYnJhcmllcyBmb3IgYm90aCBoYXJkIGFuZCBzb2Z0IGZsb2F0aW5nIHBvaW50CitFWFRSQV9NVUxUSUxJQl9QQVJUUyA9IGNydGJlZ2luLm8gY3J0YmVnaW5TLm8gY3J0ZW5kLm8gY3J0ZW5kUy5vIGNydGkubyBjcnRuLm8KKworTElCR0NDID0gc3RtcC1tdWx0aWxpYgorSU5TVEFMTF9MSUJHQ0MgPSBpbnN0YWxsLW11bHRpbGliCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL2NvbmZpZy9hdnIzMi91Y2xpbnV4LWVsZi5oCkBAIC0wLDAgKzEsMjAgQEAKKworLyogUnVuLXRpbWUgVGFyZ2V0IFNwZWNpZmljYXRpb24uICAqLworI3VuZGVmICBUQVJHRVRfVkVSU0lPTgorI2RlZmluZSBUQVJHRVRfVkVSU0lPTiAgZnB1dHMgKCIgKEFWUjMyIHVDbGludXggd2l0aCBFTEYpIiwgc3RkZXJyKQorCisvKiBXZSBkb24ndCB3YW50IGEgLmpjciBzZWN0aW9uIG9uIHVDbGludXguIEFzIGlmIHRoaXMgbWFrZXMgYSBkaWZmZXJlbmNlLi4uICovCisjZGVmaW5lIFRBUkdFVF9VU0VfSkNSX1NFQ1RJT04gMAorCisvKiBIZXJlIHdlIGdvLiBEcm9wIHRoZSBjcnRiZWdpbi9jcnRlbmQgc3R1ZmYgY29tcGxldGVseS4gKi8KKyN1bmRlZiBTVEFSVEZJTEVfU1BFQworI2RlZmluZSBTVEFSVEZJTEVfU1BFQwkJCQkJCQlcCisgICIleyFzaGFyZWQ6ICV7cGc6Z2NydDEubyVzfSAleyFwZzole3A6Z2NydDEubyVzfSIJCQlcCisgICIgJXshcDole3Byb2ZpbGU6Z2NydDEubyVzfSIJCQkJCQlcCisgICIgJXshcHJvZmlsZTpjcnQxLm8lc319fX0gY3J0aS5vJXMiCisKKyN1bmRlZiBFTkRGSUxFX1NQRUMKKyNkZWZpbmUgRU5ERklMRV9TUEVDICJjcnRuLm8lcyIKKworI3VuZGVmIFRBUkdFVF9ERUZBVUxUCisjZGVmaW5lIFRBUkdFVF9ERUZBVUxUIChBVlIzMl9GTEFHX05PX0lOSVRfR09UKQotLS0gYS9nY2MvY29uZmlnL2hvc3QtbGludXguYworKysgYi9nY2MvY29uZmlnL2hvc3QtbGludXguYwpAQCAtMjUsNiArMjUsOSBAQAogI2luY2x1ZGUgImhvc3Rob29rcy5oIgogI2luY2x1ZGUgImhvc3Rob29rcy1kZWYuaCIKIAorI2lmbmRlZiBTU0laRV9NQVgKKyNkZWZpbmUgU1NJWkVfTUFYIExPTkdfTUFYCisjZW5kaWYKIAogLyogTGludXggaGFzIGEgZmVhdHVyZSBjYWxsZWQgZXhlYy1zaGllbGQtcmFuZG9taXplIHRoYXQgcGVydHVyYnMgdGhlCiAgICBhZGRyZXNzIG9mIG5vbi1maXhlZCBtYXBwZWQgc2VnbWVudHMgYnkgYSAocmVsYXRpdmVseSkgc21hbGwgYW1vdW50LgotLS0gYS9nY2MvY29uZmlnLmdjYworKysgYi9nY2MvY29uZmlnLmdjYwpAQCAtNzgxLDYgKzc4MSwyNCBAQCBhdnItKi0qKQogCXRtX2ZpbGU9ImF2ci9hdnIuaCBkYnhlbGYuaCIKIAl1c2VfZml4cHJvdG89eWVzCiAJOzsKK2F2cjMyKi0qLWxpbnV4KikKKyAgICB0bV9maWxlPSJkYnhlbGYuaCBlbGZvcy5oIGxpbnV4LmggYXZyMzIvbGludXgtZWxmLmggYXZyMzIvYXZyMzIuaCAiCisgICAgdG1ha2VfZmlsZT0idC1saW51eCBhdnIzMi90LWF2cjMyIGF2cjMyL3QtZWxmIgorCWV4dHJhX3BhcnRzPSJjcnRiZWdpbi5vIGNydGJlZ2luUy5vIGNydGVuZC5vIGNydGVuZFMubyIKKwlleHRyYV9tb2Rlcz1hdnIzMi9hdnIzMi1tb2Rlcy5kZWYKKwlnbnVfbGQ9eWVzCisJOzsKK2F2cjMyKi0qLXVjbGludXgqKQorCXRtX2ZpbGU9ImRieGVsZi5oIGVsZm9zLmggbGludXguaCBhdnIzMi9saW51eC1lbGYuaCBhdnIzMi91Y2xpbnV4LWVsZi5oIGF2cjMyL2F2cjMyLmgiCisJdG1ha2VfZmlsZT0idC1saW51eCBhdnIzMi90LWF2cjMyIGF2cjMyL3QtZWxmIgorCWV4dHJhX21vZGVzPWF2cjMyL2F2cjMyLW1vZGVzLmRlZgorCWdudV9sZD15ZXMKKwk7OworYXZyMzItKi0qKQorICAgIHRtX2ZpbGU9ImRieGVsZi5oIGVsZm9zLmggYXZyMzIvYXZyMzIuaCBhdnIzMi9hdnIzMi1lbGYuaCIKKyAgICB0bWFrZV9maWxlPSJhdnIzMi90LWF2cjMyIGF2cjMyL3QtZWxmIgorCWV4dHJhX21vZGVzPWF2cjMyL2F2cjMyLW1vZGVzLmRlZgorCTs7CiBiZmluKi1lbGYqKQogCXRtX2ZpbGU9IiR7dG1fZmlsZX0gZGJ4ZWxmLmggZWxmb3MuaCBiZmluL2VsZi5oIgogICAgICAgICB0bWFrZV9maWxlPWJmaW4vdC1iZmluLWVsZgpAQCAtMTY4MSw2ICsxNjk5LDkgQEAgcGRwMTEtKi1ic2QpCiBwZHAxMS0qLSopCiAJdXNlX2ZpeHByb3RvPXllcwogCTs7CithdnItKi0qKQorCXVzZV9maXhwcm90bz15ZXMKKwk7OwogIyBwb3J0IG5vdCB5ZXQgY29udHJpYnV0ZWQKICNwb3dlcnBjLSotb3BlbmJzZCopCiAjCXRtYWtlX2ZpbGU9IiR7dG1ha2VfZmlsZX0gcnM2MDAwL3QtZnBydWxlcyByczYwMDAvdC1mcHJ1bGVzLWZwYml0ICIKQEAgLTI3MTcsNiArMjczOCwzMiBAQCBjYXNlICIke3RhcmdldH0iIGluCiAJCWZpCiAJCTs7CiAKKwlhdnIzMiotKi0qKQorCQlzdXBwb3J0ZWRfZGVmYXVsdHM9InBhcnQgYXJjaCIKKworCQljYXNlICIkd2l0aF9wYXJ0IiBpbgorCQkiIiBcCisJCXwgImFwNzAwMCIgfCAiYXA3MDEwIiB8ICJhcDcwMjAiIHwgInVjM2EwMjU2IiB8ICJ1YzNhMDUxMiIgfCAidWMzYTExMjgiIHwgInVjM2ExMjU2IiB8ICJ1YzNhMTUxMiIgKQorCQkJIyBPSworCQkJOzsKKwkJKikKKwkJCWVjaG8gIlVua25vd24gcGFydCB1c2VkIGluIC0td2l0aC1wYXJ0PSR3aXRoX3BhcnQiIDE+JjIKKwkJCWV4aXQgMQorCQkJOzsKKwkJZXNhYworCisJCWNhc2UgIiR3aXRoX2FyY2giIGluCisJCSIiIFwKKwkJfCAiYXAiIHwgInVjIikKKwkJCSMgT0sKKwkJCTs7CisJCSopCisJCQllY2hvICJVbmtub3duIGFyY2ggdXNlZCBpbiAtLXdpdGgtYXJjaD0kd2l0aF9hcmNoIiAxPiYyCisJCQlleGl0IDEKKwkJCTs7CisJCWVzYWMKKyAgICAgICAgICAgICAgICA7OworCiAJZnIqLSotKmxpbnV4KikKIAkJc3VwcG9ydGVkX2RlZmF1bHRzPWNwdQogCQljYXNlICIkd2l0aF9jcHUiIGluCi0tLSBhL2djYy9kb2MvZXh0ZW5kLnRleGkKKysrIGIvZ2NjL2RvYy9leHRlbmQudGV4aQpAQCAtMTk4MSw3ICsxOTgxLDcgQEAgdGhpcyBhdHRyaWJ1dGUgdG8gd29yayBjb3JyZWN0bHkuCiAKIEBpdGVtIGludGVycnVwdAogQGNpbmRleCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbnMKLVVzZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgQVJNLCBBVlIsIEM0eCwgQ1JYLCBNMzJDLCBNMzJSL0QsIE1TMSwgYW5kIFhzdG9ybXkxNgorVXNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBBUk0sIEFWUiwgQVZSMzIsIEM0eCwgQ1JYLCBNMzJDLCBNMzJSL0QsIE1TMSwgYW5kIFhzdG9ybXkxNgogcG9ydHMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzIGFuIGludGVycnVwdCBoYW5kbGVyLgogVGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQgc2VxdWVuY2VzIHN1aXRhYmxlCiBmb3IgdXNlIGluIGFuIGludGVycnVwdCBoYW5kbGVyIHdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgcHJlc2VudC4KQEAgLTIwMDAsNiArMjAwMCwxNSBAQCB2b2lkIGYgKCkgX19hdHRyaWJ1dGVfXyAoKGludGVycnVwdCAoIklSCiAKIFBlcm1pc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXIgYXJlOiBJUlEsIEZJUSwgU1dJLCBBQk9SVCBhbmQgVU5ERUZALgogCitOb3RlLCBmb3IgdGhlIEFWUjMyLCB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggYmFua2luZyBzY2hlbWUgaXMgdXNlZCBmb3IKK3RoZSBpbnRlcnJ1cHQgbW9kZSB0aGlzIGludGVycnVwdCBoYW5kbGVyIGlzIHVzZWQgaW4gbGlrZSB0aGlzOgorCitAc21hbGxleGFtcGxlCit2b2lkIGYgKCkgX19hdHRyaWJ1dGVfXyAoKGludGVycnVwdCAoIkZVTEwiKSkpOworQGVuZCBzbWFsbGV4YW1wbGUKKworUGVybWlzc2libGUgdmFsdWVzIGZvciB0aGlzIHBhcmFtZXRlciBhcmU6IEZVTEwsIEhBTEYsIE5PTkUgYW5kIFVOREVGLgorCiBAaXRlbSBpbnRlcnJ1cHRfaGFuZGxlcgogQGNpbmRleCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbnMgb24gdGhlIEJsYWNrZmluLCBtNjhrLCBIOC8zMDAgYW5kIFNIIHByb2Nlc3NvcnMKIFVzZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgQmxhY2tmaW4sIG02OGssIEg4LzMwMCwgSDgvMzAwSCwgSDhTLCBhbmQgU0ggdG8KQEAgLTM0NjAsNiArMzQ2OSwyMyBAQCBwbGFjZWQgaW4gZWl0aGVyIHRoZSBAY29kZXsuYnNzX2JlbG93MTAwCiAKIEBlbmQgdGFibGUKIAorQHN1YnNlY3Rpb24gQVZSMzIgVmFyaWFibGUgQXR0cmlidXRlcworCitPbmUgYXR0cmlidXRlIGlzIGN1cnJlbnRseSBkZWZpbmVkIGZvciBBVlIzMiBjb25maWd1cmF0aW9uczoKK0Bjb2Rle3Jtd19hZGRyZXNzYWJsZX0KKworQHRhYmxlIEBjb2RlCitAaXRlbSBybXdfYWRkcmVzc2FibGUKK0BjaW5kZXggQGNvZGV7cm13X2FkZHJlc3NhYmxlfSBhdHRyaWJ1dGUKKworVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIHRoYXQgYSB2YXJpYWJsZSBjYW4gYmUgYWNjZXNzZWQgCit3aXRoIHRoZSBhZGRyZXNzaW5nIG1vZGUgb2YgdGhlIEFWUjMyIEF0b21pYyBSZWFkLU1vZGlmeS1Xcml0ZSBtZW1vcnkKK2luc3RydWN0aW9ucyBhbmQgaGVuY2UgbWFrZSBpdCBwb3NzaWJsZSBmb3IgZ2NjIHRvIGdlbmVyYXRlIHRoZXNlIAoraW5zdHJ1Y3Rpb25zIHdpdGhvdXQgdXNpbmcgYnVpbHQtaW4gZnVuY3Rpb25zIG9yIGlubGluZSBhc3NlbWJseSBzdGF0ZW1lbnRzLiAKK1ZhcmlhYmxlcyB1c2VkIHdpdGhpbiB0aGUgQVZSMzIgQXRvbWljIFJlYWQtTW9kaWZ5LVdyaXRlIGJ1aWx0LWluCitmdW5jdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgQGNvZGV7cm13X2FkZHJlc3NhYmxlfSBhdHRyaWJ1dGUuCitAZW5kIHRhYmxlCisKIEBub2RlIFR5cGUgQXR0cmlidXRlcwogQHNlY3Rpb24gU3BlY2lmeWluZyBBdHRyaWJ1dGVzIG9mIFR5cGVzCiBAY2luZGV4IGF0dHJpYnV0ZSBvZiB0eXBlcwpAQCAtNjE2Nyw2ICs2MTkzLDcgQEAgaW5zdHJ1Y3Rpb25zLCBidXQgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIAogQG1lbnUKICogQWxwaGEgQnVpbHQtaW4gRnVuY3Rpb25zOjoKICogQVJNIEJ1aWx0LWluIEZ1bmN0aW9uczo6CisqIEFWUjMyIEJ1aWx0LWluIEZ1bmN0aW9uczo6CiAqIEJsYWNrZmluIEJ1aWx0LWluIEZ1bmN0aW9uczo6CiAqIEZSLVYgQnVpbHQtaW4gRnVuY3Rpb25zOjoKICogWDg2IEJ1aWx0LWluIEZ1bmN0aW9uczo6CkBAIC02NDA1LDYgKzY0MzIsNzYgQEAgbG9uZyBsb25nIF9fYnVpbHRpbl9hcm1fd3hvciAobG9uZyBsb25nLAogbG9uZyBsb25nIF9fYnVpbHRpbl9hcm1fd3plcm8gKCkKIEBlbmQgc21hbGxleGFtcGxlCiAKK0Bub2RlIEFWUjMyIEJ1aWx0LWluIEZ1bmN0aW9ucworQHN1YnNlY3Rpb24gQVZSMzIgQnVpbHQtaW4gRnVuY3Rpb25zCisKKworCitCdWlsdC1pbiBmdW5jdGlvbnMgZm9yIGF0b21pYyBtZW1vcnkgKFJNVykgaW5zdHJ1Y3Rpb25zLiBOb3RlIHRoYXQgdGhlc2UKK2J1aWx0LWlucyB3aWxsIGZhaWwgZm9yIHRhcmdldHMgd2hlcmUgdGhlIFJNVyBpbnN0cnVjdGlvbnMgYXJlIG5vdAoraW1wbGVtZW50ZWQuIEFsc28gbm90ZSB0aGF0IHRoZXNlIGluc3RydWN0aW9ucyBvbmx5IHRoYXQgYSBLczE1IDw8IDIKK21lbW9yeSBhZGRyZXNzIGFuZCB3aWxsIHRoZXJlZm9yIG5vdCB3b3JrIHdpdGggYW55IHJ1bnRpbWUgY29tcHV0ZWQgCittZW1vcnkgYWRkcmVzc2VzLiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhhdCBhbnkKK3BvaW50ZXJzIHVzZWQgd2l0aGluIHRoZXNlIGZ1bmN0aW9ucyBwb2ludHMgdG8gYSB2YWxpZCBtZW1vcnkgYWRkcmVzcy4KKyAKK0BzbWFsbGV4YW1wbGUKK3ZvaWQgX19idWlsdGluX21lbXMoaW50ICovKnB0ciovLCBpbnQgLypiaXQqLykKK3ZvaWQgX19idWlsdGluX21lbWMoaW50ICovKnB0ciovLCBpbnQgLypiaXQqLykKK3ZvaWQgX19idWlsdGluX21lbXQoaW50ICovKnB0ciovLCBpbnQgLypiaXQqLykKK0BlbmQgc21hbGxleGFtcGxlCisKK0J1aWx0LWluIGZ1bmN0aW9ucyBmb3IgRFNQIGluc3RydWN0aW9ucy4gTm90ZSB0aGF0IHRoZXNlIGJ1aWx0LWlucyB3aWxsCitmYWlsIGZvciB0YXJnZXRzIHdoZXJlIHRoZSBEU1AgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQuCisKK0BzbWFsbGV4YW1wbGUKK2ludCBfX2J1aWx0aW5fc2F0cyAoaW50IC8qUmQqLyxpbnQgLypzYSovLCBpbnQgLypibiovKQoraW50IF9fYnVpbHRpbl9zYXR1IChpbnQgLypSZCovLGludCAvKnNhKi8sIGludCAvKmJuKi8pCitpbnQgX19idWlsdGluX3NhdHJuZHMgKGludCAvKlJkKi8saW50IC8qc2EqLywgaW50IC8qYm4qLykKK2ludCBfX2J1aWx0aW5fc2F0cm5kdSAoaW50IC8qUmQqLyxpbnQgLypzYSovLCBpbnQgLypibiovKQorc2hvcnQgX19idWlsdGluX211bHNhdGhoX2ggKHNob3J0LCBzaG9ydCkKK2ludCBfX2J1aWx0aW5fbXVsc2F0aGhfdyAoc2hvcnQsIHNob3J0KQorc2hvcnQgX19idWlsdGluX211bHNhdHJuZGhoX2ggKHNob3J0LCBzaG9ydCkKK2ludCBfX2J1aWx0aW5fbXVsc2F0cm5kd2hfdyAoaW50LCBzaG9ydCkKK2ludCBfX2J1aWx0aW5fbXVsc2F0d2hfdyAoaW50LCBzaG9ydCkKK2ludCBfX2J1aWx0aW5fbWFjc2F0aGhfdyAoaW50LCBzaG9ydCwgc2hvcnQpCitzaG9ydCBfX2J1aWx0aW5fc2F0YWRkX2ggKHNob3J0LCBzaG9ydCkKK3Nob3J0IF9fYnVpbHRpbl9zYXRzdWJfaCAoc2hvcnQsIHNob3J0KQoraW50IF9fYnVpbHRpbl9zYXRhZGRfdyAoaW50LCBpbnQpCitpbnQgX19idWlsdGluX3NhdHN1Yl93IChpbnQsIGludCkKK2xvbmcgbG9uZyBfX2J1aWx0aW5fbXVsd2hfZChpbnQsIHNob3J0KQorbG9uZyBsb25nIF9fYnVpbHRpbl9tdWxud2hfZChpbnQsIHNob3J0KQorbG9uZyBsb25nIF9fYnVpbHRpbl9tYWN3aF9kKGxvbmcgbG9uZywgaW50LCBzaG9ydCkKK2xvbmcgbG9uZyBfX2J1aWx0aW5fbWFjaGhfZChsb25nIGxvbmcsIHNob3J0LCBzaG9ydCkKK0BlbmQgc21hbGxleGFtcGxlCisKK090aGVyIGJ1aWx0LWluIGZ1bmN0aW9ucyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgY2Fubm90IGVhc2lseSBiZQorZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4gCisKK0BzbWFsbGV4YW1wbGUKK3ZvaWQgX19idWlsdGluX3NzcmYoaW50KTsKK3ZvaWQgX19idWlsdGluX2NzcmYoaW50KTsKK3ZvaWQgX19idWlsdGluX211c2ZyKGludCk7CitpbnQgX19idWlsdGluX211c3RyKHZvaWQpOworaW50IF9fYnVpbHRpbl9tZnNyKGludCAvKlN0YXR1cyBSZWdpc3RlciBBZGRyZXNzKi8pCit2b2lkIF9fYnVpbHRpbl9tdHNyKGludCAvKlN0YXR1cyBSZWdpc3RlciBBZGRyZXNzKi8sIGludCAvKlZhbHVlKi8pCitpbnQgX19idWlsdGluX21mZHIoaW50IC8qRGVidWcgUmVnaXN0ZXIgQWRkcmVzcyovKQordm9pZCBfX2J1aWx0aW5fbXRkcihpbnQgLypEZWJ1ZyBSZWdpc3RlciBBZGRyZXNzKi8sIGludCAvKlZhbHVlKi8pCit2b2lkIF9fYnVpbHRpbl9jYWNoZSh2b2lkICogLypBZGRyZXNzKi8sIGludCAvKkNhY2hlIE9wZXJhdGlvbiovKQordm9pZCBfX2J1aWx0aW5fc3luYyhpbnQgLypTeW5jIE9wZXJhdGlvbiovKQordm9pZCBfX2J1aWx0aW5fdGxicih2b2lkKQordm9pZCBfX2J1aWx0aW5fdGxicyh2b2lkKQordm9pZCBfX2J1aWx0aW5fdGxidyh2b2lkKQordm9pZCBfX2J1aWx0aW5fYnJlYWtwb2ludCh2b2lkKQoraW50IF9fYnVpbHRpbl94Y2hnKHZvaWQgKiAvKkFkZHJlc3MqLywgaW50IC8qVmFsdWUqLyApCitzaG9ydCBfX2J1aWx0aW5fYnN3YXBfMTYoc2hvcnQpCitpbnQgX19idWlsdGluX2Jzd2FwXzMyKGludCkKK3ZvaWQgX19idWlsdGluX2NvcChpbnQvKmNwbnIqLywgaW50LypjcmQqLywgaW50LypjcngqLywgaW50LypjcnkqLywgaW50LypvcCovKQoraW50IF9fYnVpbHRpbl9tdmNyX3coaW50LypjcG5yKi8sIGludC8qY3JzKi8pCit2b2lkIF9fYnVpbHRpbl9tdnJjX3coaW50LypjcG5yKi8sIGludC8qY3JkKi8sIGludC8qdmFsdWUqLykKK2xvbmcgbG9uZyBfX2J1aWx0aW5fbXZjcl9kKGludC8qY3BuciovLCBpbnQvKmNycyovKQordm9pZCBfX2J1aWx0aW5fbXZyY19kKGludC8qY3BuciovLCBpbnQvKmNyZCovLCBsb25nIGxvbmcvKnZhbHVlKi8pCitAZW5kIHNtYWxsZXhhbXBsZQorCiBAbm9kZSBCbGFja2ZpbiBCdWlsdC1pbiBGdW5jdGlvbnMKIEBzdWJzZWN0aW9uIEJsYWNrZmluIEJ1aWx0LWluIEZ1bmN0aW9ucwogCi0tLSBhL2djYy9kb2MvaW52b2tlLnRleGkKKysrIGIvZ2NjL2RvYy9pbnZva2UudGV4aQpAQCAtMTkwLDcgKzE5MCw3IEBAIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCiAtZm5vLWRlZmF1bHQtaW5saW5lICAtZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4gQGdvbAogLVdhYmkgIC1XY3Rvci1kdG9yLXByaXZhY3kgQGdvbAogLVdub24tdmlydHVhbC1kdG9yICAtV3Jlb3JkZXIgQGdvbAotLVdlZmZjKysgIC1Xbm8tZGVwcmVjYXRlZCAgLVdzdHJpY3QtbnVsbC1zZW50aW5lbCBAZ29sCistV2VmZmMrKyAgLVduby1kZXByZWNhdGVkIEBnb2wKIC1Xbm8tbm9uLXRlbXBsYXRlLWZyaWVuZCAgLVdvbGQtc3R5bGUtY2FzdCBAZ29sCiAtV292ZXJsb2FkZWQtdmlydHVhbCAgLVduby1wbWYtY29udmVyc2lvbnMgQGdvbAogLVdzaWduLXByb21vfQpAQCAtNTg4LDYgKzU4OCwxMiBAQCBPYmplY3RpdmUtQyBhbmQgT2JqZWN0aXZlLUMrKyBEaWFsZWN0c30uCiAtbWF1dG8taW5jZGVjICAtbWlubWF4ICAtbWxvbmctY2FsbHMgIC1tc2hvcnQgQGdvbAogLW1zb2Z0LXJlZy1jb3VudD1AdmFye2NvdW50fX0KIAorQGVtcGh7QVZSMzIgT3B0aW9uc30KK0BnY2NvcHRsaXN0ey1tdXNlLXJvZGF0YS1zZWN0aW9uIC1taGFyZC1mbG9hdCAtbXNvZnQtZmxvYXQgLW1yZWxheCBAZ29sCistbWZvcmNlLWRvdWJsZS1hbGlnbiAtbW5vLWluaXQtZ290IC1tcmVsYXggLW1tZC1yZW9yZy1vcHQgLW1hc20tYWRkci1wc2V1ZG9zIEBnb2wKKy1tcGFydD1AdmFye3BhcnR9IC1tY3B1PUB2YXJ7Y3B1fSAtbWFyY2g9QHZhcnthcmNofSBAZ29sICAKKy1tZmFzdC1mbG9hdCAtbWltbS1pbi1jb25zdC1wb29sfQorCiBAZW1waHtNQ29yZSBPcHRpb25zfQogQGdjY29wdGxpc3R7LW1oYXJkbGl0ICAtbW5vLWhhcmRsaXQgIC1tZGl2ICAtbW5vLWRpdiAgLW1yZWxheC1pbW1lZGlhdGVzIEBnb2wKIC1tbm8tcmVsYXgtaW1tZWRpYXRlcyAgLW13aWRlLWJpdGZpZWxkcyAgLW1uby13aWRlLWJpdGZpZWxkcyBAZ29sCkBAIC0xODY4LDE0ICsxODc0LDYgQEAgdG8gZmlsdGVyIG91dCB0aG9zZSB3YXJuaW5ncy4KIEBvcGluZGV4IFduby1kZXByZWNhdGVkCiBEbyBub3Qgd2FybiBhYm91dCB1c2FnZSBvZiBkZXByZWNhdGVkIGZlYXR1cmVzLiAgQHhyZWZ7RGVwcmVjYXRlZCBGZWF0dXJlc30uCiAKLUBpdGVtIC1Xc3RyaWN0LW51bGwtc2VudGluZWwgQHJ7KEMrKyBvbmx5KX0KLUBvcGluZGV4IFdzdHJpY3QtbnVsbC1zZW50aW5lbAotV2FybiBhbHNvIGFib3V0IHRoZSB1c2Ugb2YgYW4gdW5jYXN0ZWQgQGNvZGV7TlVMTH0gYXMgc2VudGluZWwuICBXaGVuCi1jb21waWxpbmcgb25seSB3aXRoIEdDQyB0aGlzIGlzIGEgdmFsaWQgc2VudGluZWwsIGFzIEBjb2Rle05VTEx9IGlzIGRlZmluZWQKLXRvIEBjb2Rle19fbnVsbH0uICBBbHRob3VnaCBpdCBpcyBhIG51bGwgcG9pbnRlciBjb25zdGFudCBub3QgYSBudWxsIHBvaW50ZXIsCi1pdCBpcyBndWFyYW50ZWVkIHRvIG9mIHRoZSBzYW1lIHNpemUgYXMgYSBwb2ludGVyLiAgQnV0IHRoaXMgdXNlIGlzCi1ub3QgcG9ydGFibGUgYWNyb3NzIGRpZmZlcmVudCBjb21waWxlcnMuCi0KIEBpdGVtIC1Xbm8tbm9uLXRlbXBsYXRlLWZyaWVuZCBAcnsoQysrIG9ubHkpfQogQG9waW5kZXggV25vLW5vbi10ZW1wbGF0ZS1mcmllbmQKIERpc2FibGUgd2FybmluZ3Mgd2hlbiBub24tdGVtcGxhdGl6ZWQgZnJpZW5kIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQKQEAgLTI3MzIsMTMgKzI3MzAsMTEgQEAgcmVxdWlyaW5nIEBvcHRpb257LU99LgogSWYgeW91IHdhbnQgdG8gd2FybiBhYm91dCBjb2RlIHdoaWNoIHVzZXMgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgb2YgdGhlCiB2YXJpYWJsZSBpbiBpdHMgb3duIGluaXRpYWxpemVyLCB1c2UgdGhlIEBvcHRpb257LVdpbml0LXNlbGZ9IG9wdGlvbi4KIAotVGhlc2Ugd2FybmluZ3Mgb2NjdXIgZm9yIGluZGl2aWR1YWwgdW5pbml0aWFsaXplZCBvciBjbG9iYmVyZWQKLWVsZW1lbnRzIG9mIHN0cnVjdHVyZSwgdW5pb24gb3IgYXJyYXkgdmFyaWFibGVzIGFzIHdlbGwgYXMgZm9yCi12YXJpYWJsZXMgd2hpY2ggYXJlIHVuaW5pdGlhbGl6ZWQgb3IgY2xvYmJlcmVkIGFzIGEgd2hvbGUuICBUaGV5IGRvCi1ub3Qgb2NjdXIgZm9yIHZhcmlhYmxlcyBvciBlbGVtZW50cyBkZWNsYXJlZCBAY29kZXt2b2xhdGlsZX0uICBCZWNhdXNlCi10aGVzZSB3YXJuaW5ncyBkZXBlbmQgb24gb3B0aW1pemF0aW9uLCB0aGUgZXhhY3QgdmFyaWFibGVzIG9yIGVsZW1lbnRzCi1mb3Igd2hpY2ggdGhlcmUgYXJlIHdhcm5pbmdzIHdpbGwgZGVwZW5kIG9uIHRoZSBwcmVjaXNlIG9wdGltaXphdGlvbgotb3B0aW9ucyBhbmQgdmVyc2lvbiBvZiBHQ0MgdXNlZC4KK1RoZXNlIHdhcm5pbmdzIG9jY3VyIG9ubHkgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvcgorcmVnaXN0ZXIgYWxsb2NhdGlvbi4gIFRoZXJlZm9yZSwgdGhleSBkbyBub3Qgb2NjdXIgZm9yIGEgdmFyaWFibGUgdGhhdAoraXMgZGVjbGFyZWQgQGNvZGV7dm9sYXRpbGV9LCBvciB3aG9zZSBhZGRyZXNzIGlzIHRha2VuLCBvciB3aG9zZSBzaXplCitpcyBvdGhlciB0aGFuIDEsIDIsIDQgb3IgOCBieXRlcy4gIEFsc28sIHRoZXkgZG8gbm90IG9jY3VyIGZvcgorc3RydWN0dXJlcywgdW5pb25zIG9yIGFycmF5cywgZXZlbiB3aGVuIHRoZXkgYXJlIGluIHJlZ2lzdGVycy4KIAogTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBubyB3YXJuaW5nIGFib3V0IGEgdmFyaWFibGUgdGhhdCBpcyB1c2VkIG9ubHkKIHRvIGNvbXB1dGUgYSB2YWx1ZSB0aGF0IGl0c2VsZiBpcyBuZXZlciB1c2VkLCBiZWNhdXNlIHN1Y2gKQEAgLTYyMDEsMTAgKzYxOTcsNiBAQCBJZiBudW1iZXIgb2YgY2FuZGlkYXRlcyBpbiB0aGUgc2V0IGlzIHNtCiB3ZSBhbHdheXMgdHJ5IHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBpdnMgZnJvbSB0aGUgc2V0IGR1cmluZyBpdHMKIG9wdGltaXphdGlvbiB3aGVuIGEgbmV3IGl2IGlzIGFkZGVkIHRvIHRoZSBzZXQuCiAKLUBpdGVtIHNjZXYtbWF4LWV4cHItc2l6ZQotQm91bmQgb24gc2l6ZSBvZiBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBzY2FsYXIgZXZvbHV0aW9ucyBhbmFseXplci4KLUxhcmdlIGV4cHJlc3Npb25zIHNsb3cgdGhlIGFuYWx5emVyLgotCiBAaXRlbSB2ZWN0LW1heC12ZXJzaW9uLWNoZWNrcwogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJ1bnRpbWUgY2hlY2tzIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCB3aGVuIGRvaW5nCiBsb29wIHZlcnNpb25pbmcgaW4gdGhlIHZlY3Rvcml6ZXIuICBTZWUgb3B0aW9uIGZ0cmVlLXZlY3QtbG9vcC12ZXJzaW9uCkBAIC03NDAyLDcgKzczOTQsNyBAQCBwbGF0Zm9ybS4KICogQVJDIE9wdGlvbnM6OgogKiBBUk0gT3B0aW9uczo6CiAqIEFWUiBPcHRpb25zOjoKLSogQmxhY2tmaW4gT3B0aW9uczo6CisqIEFWUjMyIE9wdGlvbnM6OgogKiBDUklTIE9wdGlvbnM6OgogKiBDUlggT3B0aW9uczo6CiAqIERhcndpbiBPcHRpb25zOjoKQEAgLTc4NjcsODEgKzc4NTksODAgQEAgY29tcGx5IHRvIHRoZSBDIHN0YW5kYXJkcywgYnV0IGl0IHdpbGwgcAogc2l6ZS4KIEBlbmQgdGFibGUKIAotQG5vZGUgQmxhY2tmaW4gT3B0aW9ucwotQHN1YnNlY3Rpb24gQmxhY2tmaW4gT3B0aW9ucwotQGNpbmRleCBCbGFja2ZpbiBPcHRpb25zCitAbm9kZSBBVlIzMiBPcHRpb25zCitAc3Vic2VjdGlvbiBBVlIzMiBPcHRpb25zCitAY2luZGV4IEFWUjMyIE9wdGlvbnMKKworVGhlc2Ugb3B0aW9ucyBhcmUgZGVmaW5lZCBmb3IgQVZSMzIgaW1wbGVtZW50YXRpb25zOgogCiBAdGFibGUgQGdjY3RhYm9wdAotQGl0ZW0gLW1vbWl0LWxlYWYtZnJhbWUtcG9pbnRlcgotQG9waW5kZXggbW9taXQtbGVhZi1mcmFtZS1wb2ludGVyCi1Eb24ndCBrZWVwIHRoZSBmcmFtZSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgZm9yIGxlYWYgZnVuY3Rpb25zLiAgVGhpcwotYXZvaWRzIHRoZSBpbnN0cnVjdGlvbnMgdG8gc2F2ZSwgc2V0IHVwIGFuZCByZXN0b3JlIGZyYW1lIHBvaW50ZXJzIGFuZAotbWFrZXMgYW4gZXh0cmEgcmVnaXN0ZXIgYXZhaWxhYmxlIGluIGxlYWYgZnVuY3Rpb25zLiAgVGhlIG9wdGlvbgotQG9wdGlvbnstZm9taXQtZnJhbWUtcG9pbnRlcn0gcmVtb3ZlcyB0aGUgZnJhbWUgcG9pbnRlciBmb3IgYWxsIGZ1bmN0aW9ucwotd2hpY2ggbWlnaHQgbWFrZSBkZWJ1Z2dpbmcgaGFyZGVyLgorQGl0ZW0gLW11c2Utcm9kYXRhLXNlY3Rpb24KK0BvcGluZGV4IG11c2Utcm9kYXRhLXNlY3Rpb24KK1VzZSBzZWN0aW9uIEBzYW1wey5yb2RhdGF9IGZvciByZWFkLW9ubHkgZGF0YSBpbnN0ZWFkIG9mIEBzYW1wey50ZXh0fS4KIAotQGl0ZW0gLW1zcGVjbGQtYW5vbWFseQotQG9waW5kZXggbXNwZWNsZC1hbm9tYWx5Ci1XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdAotY29udGFpbiBzcGVjdWxhdGl2ZSBsb2FkcyBhZnRlciBqdW1wIGluc3RydWN0aW9ucy4gIFRoaXMgb3B0aW9uIGlzIGVuYWJsZWQKLWJ5IGRlZmF1bHQuCi0KLUBpdGVtIC1tbm8tc3BlY2xkLWFub21hbHkKLUBvcGluZGV4IG1uby1zcGVjbGQtYW5vbWFseQotRG9uJ3QgZ2VuZXJhdGUgZXh0cmEgY29kZSB0byBwcmV2ZW50IHNwZWN1bGF0aXZlIGxvYWRzIGZyb20gb2NjdXJyaW5nLgotCi1AaXRlbSAtbWNzeW5jLWFub21hbHkKLUBvcGluZGV4IG1jc3luYy1hbm9tYWx5Ci1XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdAotY29udGFpbiBDU1lOQyBvciBTU1lOQyBpbnN0cnVjdGlvbnMgdG9vIHNvb24gYWZ0ZXIgY29uZGl0aW9uYWwgYnJhbmNoZXMuCi1UaGlzIG9wdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0KLUBpdGVtIC1tbm8tY3N5bmMtYW5vbWFseQotQG9waW5kZXggbW5vLWNzeW5jLWFub21hbHkKLURvbid0IGdlbmVyYXRlIGV4dHJhIGNvZGUgdG8gcHJldmVudCBDU1lOQyBvciBTU1lOQyBpbnN0cnVjdGlvbnMgZnJvbQotb2NjdXJyaW5nIHRvbyBzb29uIGFmdGVyIGEgY29uZGl0aW9uYWwgYnJhbmNoLgotCi1AaXRlbSAtbWxvdy02NGsKLUBvcGluZGV4IG1sb3ctNjRrCi1XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciBpcyBmcmVlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBrbm93bGVkZ2UgdGhhdAotdGhlIGVudGlyZSBwcm9ncmFtIGZpdHMgaW50byB0aGUgbG93IDY0ayBvZiBtZW1vcnkuCi0KLUBpdGVtIC1tbm8tbG93LTY0awotQG9waW5kZXggbW5vLWxvdy02NGsKLUFzc3VtZSB0aGF0IHRoZSBwcm9ncmFtIGlzIGFyYml0cmFyaWx5IGxhcmdlLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KK0BpdGVtIC1taGFyZC1mbG9hdAorQG9waW5kZXggbWhhcmQtZmxvYXQKK1VzZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCiAKLUBpdGVtIC1taWQtc2hhcmVkLWxpYnJhcnkKLUBvcGluZGV4IG1pZC1zaGFyZWQtbGlicmFyeQotR2VuZXJhdGUgY29kZSB0aGF0IHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMgdmlhIHRoZSBsaWJyYXJ5IElEIG1ldGhvZC4KLVRoaXMgYWxsb3dzIGZvciBleGVjdXRlIGluIHBsYWNlIGFuZCBzaGFyZWQgbGlicmFyaWVzIGluIGFuIGVudmlyb25tZW50Ci13aXRob3V0IHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQuICBUaGlzIG9wdGlvbiBpbXBsaWVzIEBvcHRpb257LWZQSUN9LgorQGl0ZW0gLW1zb2Z0LWZsb2F0CitAb3BpbmRleCBtc29mdC1mbG9hdAorVXNlIHNvZnR3YXJlIGZsb2F0aW5nLXBvaW50IGxpYnJhcnkgZm9yIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMuCiAKLUBpdGVtIC1tbm8taWQtc2hhcmVkLWxpYnJhcnkKLUBvcGluZGV4IG1uby1pZC1zaGFyZWQtbGlicmFyeQotR2VuZXJhdGUgY29kZSB0aGF0IGRvZXNuJ3QgYXNzdW1lIElEIGJhc2VkIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGJlaW5nIHVzZWQuCi1UaGlzIGlzIHRoZSBkZWZhdWx0LgorQGl0ZW0gLW1mb3JjZS1kb3VibGUtYWxpZ24KK0BvcGluZGV4IG1mb3JjZS1kb3VibGUtYWxpZ24KK0ZvcmNlIGRvdWJsZS13b3JkIGFsaWdubWVudCBmb3IgZG91YmxlLXdvcmQgbWVtb3J5IGFjY2Vzc2VzLgorCitAaXRlbSAtbW5vLWluaXQtZ290CitAb3BpbmRleCBtbm8taW5pdC1nb3QKK0RvIG5vdCBpbml0aWFsaXplIHRoZSBHT1QgcmVnaXN0ZXIgYmVmb3JlIHVzaW5nIGl0IHdoZW4gY29tcGlsaW5nIFBJQworY29kZS4KIAotQGl0ZW0gLW1zaGFyZWQtbGlicmFyeS1pZD1uCi1Ab3BpbmRleCBtc2hhcmVkLWxpYnJhcnktaWQKLVNwZWNpZmllZCB0aGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBJRCBiYXNlZCBzaGFyZWQgbGlicmFyeSBiZWluZwotY29tcGlsZWQuICBTcGVjaWZ5aW5nIGEgdmFsdWUgb2YgMCB3aWxsIGdlbmVyYXRlIG1vcmUgY29tcGFjdCBjb2RlLCBzcGVjaWZ5aW5nCi1vdGhlciB2YWx1ZXMgd2lsbCBmb3JjZSB0aGUgYWxsb2NhdGlvbiBvZiB0aGF0IG51bWJlciB0byB0aGUgY3VycmVudAotbGlicmFyeSBidXQgaXMgbm8gbW9yZSBzcGFjZSBvciB0aW1lIGVmZmljaWVudCB0aGFuIG9taXR0aW5nIHRoaXMgb3B0aW9uLgorQGl0ZW0gLW1yZWxheAorQG9waW5kZXggbXJlbGF4CitMZXQgaW52b2tlZCBhc3NlbWJsZXIgYW5kIGxpbmtlciBkbyByZWxheGluZyAKKyhFbmFibGVkIGJ5IGRlZmF1bHQgd2hlbiBvcHRpbWl6YXRpb24gbGV2ZWwgaXMgPjEpLgorVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlIGFkZHJlc3Mgb2Ygc3ltYm9scyBhcmUga25vd24gYXQgbGluayB0aW1lLAordGhlIGxpbmtlciBjYW4gb3B0aW1pemUgQHNhbXB7aWNhbGx9IGFuZCBAc2FtcHttY2FsbH0KK2luc3RydWN0aW9ucyBpbnRvIGEgQHNhbXB7cmNhbGx9IGluc3RydWN0aW9uIGlmIHBvc3NpYmxlLiAKK0xvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wgY2FuIGFsc28gYmUgb3B0aW1pemVkLiAgCisKK0BpdGVtIC1tbWQtcmVvcmctb3B0CitAb3BpbmRleCBtbWQtcmVvcmctb3B0CitQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IG9wdGltaXphdGlvbnMgaW4gcmVvcmcgc3RhZ2UuCisKK0BpdGVtIC1tYXNtLWFkZHItcHNldWRvcworQG9waW5kZXggbWFzbS1hZGRyLXBzZXVkb3MKK1VzZSBhc3NlbWJsZXIgcHNldWRvLWluc3RydWN0aW9ucyBsZGEudyBhbmQgY2FsbCBmb3IgaGFuZGxpbmcgZGlyZWN0CithZGRyZXNzZXMuIChFbmFibGVkIGJ5IGRlZmF1bHQpCisKK0BpdGVtIC1tcGFydD1AdmFye3BhcnR9CitAb3BpbmRleCBtcGFydAorR2VuZXJhdGUgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwYXJ0LiBQZXJtaXNzaWJsZSBwYXJ0cyBhcmU6IAorQHNhbXB7YXA3MDAwfSwgQHNhbXB7YXA3MDEwfSxAc2FtcHthcDcwMjB9LAorQHNhbXB7dWMzYTAxMjh9LCBAc2FtcHt1YzNhMDI1Nn0sIEBzYW1we3VjM2EwNTEyfSwKK0BzYW1we3VjM2ExMTI4fSwgQHNhbXB7dWMzYTEyNTZ9LCBAc2FtcHt1YzNhMTUxMn0sCitAc2FtcHt1YzNiMDY0fSwgQHNhbXB7dWMzYjAxMjh9LCBAc2FtcHt1YzNiMDI1Nn0sCitAc2FtcHt1YzNiMTY0fSwgQHNhbXB7dWMzYjExMjh9LCBAc2FtcHt1YzNiMTI1Nn0uCiAKLUBpdGVtIC1tbG9uZy1jYWxscwotQGl0ZW14IC1tbm8tbG9uZy1jYWxscwotQG9waW5kZXggbWxvbmctY2FsbHMKLUBvcGluZGV4IG1uby1sb25nLWNhbGxzCi1UZWxscyB0aGUgY29tcGlsZXIgdG8gcGVyZm9ybSBmdW5jdGlvbiBjYWxscyBieSBmaXJzdCBsb2FkaW5nIHRoZQotYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaW50byBhIHJlZ2lzdGVyIGFuZCB0aGVuIHBlcmZvcm1pbmcgYSBzdWJyb3V0aW5lCi1jYWxsIG9uIHRoaXMgcmVnaXN0ZXIuICBUaGlzIHN3aXRjaCBpcyBuZWVkZWQgaWYgdGhlIHRhcmdldCBmdW5jdGlvbgotd2lsbCBsaWUgb3V0c2lkZSBvZiB0aGUgMjQgYml0IGFkZHJlc3NpbmcgcmFuZ2Ugb2YgdGhlIG9mZnNldCBiYXNlZAotdmVyc2lvbiBvZiBzdWJyb3V0aW5lIGNhbGwgaW5zdHJ1Y3Rpb24uCitAaXRlbSAtbWNwdT1AdmFye2NwdS10eXBlfQorQG9waW5kZXggbWNwdQorU2FtZSBhcyAtbXBhcnQuIE9ic29sZXRlLgorCitAaXRlbSAtbWFyY2g9QHZhcnthcmNofQorQG9waW5kZXggbWFyY2gKK0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLiBQZXJtaXNzaWJsZSBhcmNoaXRlY3R1cmVzIGFyZToKK0BzYW1we2FwfSBhbmQgQHNhbXB7dWN9LiAKKworQGl0ZW0gLW1mYXN0LWZsb2F0CitAb3BpbmRleCBtZmFzdC1mbG9hdAorRW5hYmxlIGZhc3QgZmxvYXRpbmctcG9pbnQgbGlicmFyeSB0aGF0IGRvZXMgbm90IGNvbmZvcm0gdG8gaWVlZSBidXQgaXMgc3RpbGwgZ29vZCBlbm91Z2gKK2ZvciBtb3N0IGFwcGxpY2F0aW9ucy4gVGhlIGZhc3QgZmxvYXRpbmctcG9pbnQgbGlicmFyeSBkb2VzIG5vdCByb3VuZCB0byB0aGUgbmVhcmVzdCBldmVuCitidXQgYXdheSBmcm9tIHplcm8uIEVuYWJsZWQgYnkgZGVmYXVsdCBpZiB0aGUgLWZ1bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIHN3aXRjaCBpcyBzcGVjaWZpZWQuIAorCitAaXRlbSAtbWltbS1pbi1jb25zdC1wb29sCitAb3BpbmRleCBtaW1tLWluLWNvbnN0LXBvb2wKK1B1dCBsYXJnZSBpbW1lZGlhdGVzIGluIGNvbnN0YW50IHBvb2wuIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBhcmNocyB3aXRoIGluc24tY2FjaGUuCiAKLVRoaXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LiAgU3BlY2lmeWluZwotQG9wdGlvbnstbW5vLWxvbmctY2FsbHN9IHdpbGwgcmVzdG9yZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gIE5vdGUgdGhlc2UKLXN3aXRjaGVzIGhhdmUgbm8gZWZmZWN0IG9uIGhvdyB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgdG8gaGFuZGxlCi1mdW5jdGlvbiBjYWxscyB2aWEgZnVuY3Rpb24gcG9pbnRlcnMuCiBAZW5kIHRhYmxlCiAKIEBub2RlIENSSVMgT3B0aW9ucwotLS0gYS9nY2MvZG9jL21kLnRleGkKKysrIGIvZ2NjL2RvYy9tZC50ZXhpCkBAIC0xNjgxLDYgKzE2ODEsODAgQEAgQSBtZW1vcnkgcmVmZXJlbmNlIHN1aXRhYmxlIGZvciBpV01NWHQgbAogQSBtZW1vcnkgcmVmZXJlbmNlIHN1aXRhYmxlIGZvciB0aGUgQVJNdjQgbGRyc2IgaW5zdHJ1Y3Rpb24uCiBAZW5kIHRhYmxlCiAKK0BpdGVtIEFWUjMyIGZhbWlseS0tLUBmaWxle2F2cjMyLmh9CitAdGFibGUgQGNvZGUKK0BpdGVtIGYKK0Zsb2F0aW5nLXBvaW50IHJlZ2lzdGVycyAoZjAgdG8gZjE1KSAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UpCisKK0BpdGVtIEt1QHZhcntiaXRzfQorVW5zaWduZWQgY29uc3RhbnQgcmVwcmVzZW50YWJsZSB3aXRoIEB2YXJ7Yml0c30gbnVtYmVyIG9mIGJpdHMgKE11c3QgYmUKK3R3byBkaWdpdHMpLiBJLmU6IEFuIHVuc2lnbmVkIDgtYml0IGNvbnN0YW50IGlzIHdyaXR0ZW4gYXMgQHNhbXB7S3UwOH0gIAorIAorQGl0ZW0gS3NAdmFye2JpdHN9CitTaWduZWQgY29uc3RhbnQgcmVwcmVzZW50YWJsZSB3aXRoIEB2YXJ7Yml0c30gbnVtYmVyIG9mIGJpdHMgKE11c3QgYmUKK3R3byBkaWdpdHMpLiBJLmU6IEEgc2lnbmVkIDEyLWJpdCBjb25zdGFudCBpcyB3cml0dGVuIGFzIEBzYW1we0tzMTJ9ICAKKworQGl0ZW0gSXNAdmFye2JpdHN9CitUaGUgbmVnYXRlZCByYW5nZSBvZiBhIHNpZ25lZCBjb25zdGFudCByZXByZXNlbnRhYmxlIHdpdGggIEB2YXJ7Yml0c30gCitudW1iZXIgb2YgYml0cy4gVGhlIHNhbWUgYXMgQHNhbXB7S3NAdmFye2JpdHN9fSB3aXRoIGEgbmVnYXRlZCByYW5nZS4gCitUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbnN0YW50IG11c3QgYmUgaW4gdGhlIHJhbmdlIEBtYXRoey0yXntiaXRzLTF9LTF9IHRvIEBtYXRoezJee2JpdHMtMX19CisKK0BpdGVtIEcKK0Egc2luZ2xlL2RvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgaW1tZWRpYXRlIG9yIDY0LWJpdCBpbnRlZ2VyIAoraW1tZWRpYXRlIHdoZXJlIHRoZSBsZWFzdCBhbmQgbW9zdCBzaWduaWZpY2FudCB3b3JkcyBib3RoIGNhbiBiZQorbG9hZGVkIHdpdGggYSBtb3ZlIGluc3RydWN0aW9uLiBUaGF0IGlzIHRoZSB0aGUgaW50ZWdlciBmb3JtIG9mIHRoZSAKK3ZhbHVlcyBpbiB0aGUgbGVhc3QgYW5kIG1vc3Qgc2lnbmlmaWNhbnQgd29yZHMgYm90aCBhcmUgaW4gdGhlIHJhbmdlIAorQG1hdGh7LTJeezIwfX0gdG8gQG1hdGh7Ml57MjB9LTF9LgorICAgICAgICAgCitAaXRlbSBNCitBbnkgMzItYml0IGltbWVkaWF0ZSB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgc2V0IHRvIHplcm8gYW5kIHRoZQorcmVtYWluaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgc2V0IHRvIG9uZS4gCisKK0BpdGVtIEoKK0EgMzItYml0IGltbWVkaWF0ZSB3aGVyZSBhbGwgdGhlIGxvd2VyIDE2LWJpdHMgYXJlIHplcm8uIAorCitAaXRlbSBPCitBIDMyLWJpdCBpbW1lZGlhdGUgd2l0aCBvbmUgYml0IHNldCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgY2xlYXJlZC4gCisKK0BpdGVtIE4KK0EgMzItYml0IGltbWVkaWF0ZSB3aXRoIG9uZSBiaXQgY2xlYXJlZCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgc2V0LiAKKworQGl0ZW0gTAorQSAzMi1iaXQgaW1tZWRpYXRlIHdoZXJlIGFsbCB0aGUgbG93ZXIgMTYtYml0cyBhcmUgc2V0LiAKKworQGl0ZW0gUQorQW55IEFWUjMyIG1lbW9yeSByZWZlcmVuY2UgZXhjZXB0IGZvciByZWZlcmVuY2UgdXNlZCBmb3IgdGhlIGF0b21pYyBtZW1vcnkgKFJNVykgaW5zdHJ1Y3Rpb25zLgorCitAaXRlbSBSS3NAdmFye2JpdHN9CitBIG1lbW9yeSByZWZlcmVuY2Ugd2hlcmUgdGhlIGFkZHJlc3MgY29uc2lzdHMgb2YgYSBiYXNlIHJlZ2lzdGVyCitwbHVzIGEgc2lnbmVkIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgd2l0aCByYW5nZSBnaXZlbiBieSBAc2FtcHtLc0B2YXJ7Yml0c319Cit3aGljaCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIGZvciB0aGUgc2lnbmVkIGltbWVkaWF0ZSBpbnRlZ2VyIGNvbnN0cmFpbnQKK2dpdmVuIGFib3ZlLiAgCisKK0BpdGVtIFJLdUB2YXJ7Yml0c30KK0EgbWVtb3J5IHJlZmVyZW5jZSB3aGVyZSB0aGUgYWRkcmVzcyBjb25zaXN0cyBvZiBhIGJhc2UgcmVnaXN0ZXIKK3BsdXMgYW4gdW5zaWduZWQgaW1tZWRpYXRlIGRpc3BsYWNlbWVudCB3aXRoIHJhbmdlIGdpdmVuIGJ5IEBzYW1we0t1QHZhcntiaXRzfX0KK3doaWNoIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgZm9yIHRoZSB1bnNpZ25lZCBpbW1lZGlhdGUgaW50ZWdlciBjb25zdHJhaW50CitnaXZlbiBhYm92ZS4gIAorCitAaXRlbSBTCitBIG1lbW9yeSByZWZlcmVuY2Ugd2l0aCBhbiBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgb2Zmc2V0CisKK0BpdGVtIFQKK0EgbWVtb3J5IHJlZmVyZW5jZSB0byBhIGNvbnN0YW50IHBvb2wgZW50cnkKKworQGl0ZW0gVworQSB2YWxpZCBvcGVyYW5kIGZvciB1c2UgaW4gdGhlIEBzYW1we2xkYS53fSBpbnN0cnVjdGlvbiBtYWNybyB3aGVuCityZWxheGluZyBpcyBlbmFibGVkCisKK0BpdGVtIFkKK0EgbWVtb3J5IHJlZmVyZW5jZSBzdWl0YWJsZSBmb3IgdGhlIGF0b21pYyBtZW1vcnkgKFJNVykgaW5zdHJ1Y3Rpb25zLgorCitAaXRlbSBaCitBIG1lbW9yeSByZWZlcmVuY2UgdmFsaWQgZm9yIGNvcHJvY2Vzc29yIG1lbW9yeSBpbnN0cnVjdGlvbnMKKworQGVuZCB0YWJsZQorCiBAaXRlbSBBVlIgZmFtaWx5LS0tQGZpbGV7Y29uZmlnL2F2ci9jb25zdHJhaW50cy5tZH0KIEB0YWJsZSBAY29kZQogQGl0ZW0gbAotLS0gYS9nY2MvZXhwbWVkLmMKKysrIGIvZ2NjL2V4cG1lZC5jCkBAIC0zNiw2ICszNiw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICAKICNpbmNsdWRlICJyZWFsLmgiCiAjaW5jbHVkZSAicmVjb2cuaCIKICNpbmNsdWRlICJsYW5naG9va3MuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKIAogc3RhdGljIHZvaWQgc3RvcmVfZml4ZWRfYml0X2ZpZWxkIChydHgsIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQsCiAJCQkJICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCwKQEAgLTQ1NCw5ICs0NTUsMTkgQEAgc3RvcmVfYml0X2ZpZWxkIChydHggc3RyX3J0eCwgdW5zaWduZWQgSAogCSAgPyAoKEdFVF9NT0RFX1NJWkUgKGZpZWxkbW9kZSkgPj0gVU5JVFNfUEVSX1dPUkQKIAkgICAgIHx8IEdFVF9NT0RFX1NJWkUgKEdFVF9NT0RFIChvcDApKSA9PSBHRVRfTU9ERV9TSVpFIChmaWVsZG1vZGUpKQogCSAgICAgJiYgYnl0ZV9vZmZzZXQgJSBHRVRfTU9ERV9TSVpFIChmaWVsZG1vZGUpID09IDApCi0JICA6ICghIFNMT1dfVU5BTElHTkVEX0FDQ0VTUyAoZmllbGRtb2RlLCBNRU1fQUxJR04gKG9wMCkpCi0JICAgICB8fCAob2Zmc2V0ICogQklUU19QRVJfVU5JVCAlIGJpdHNpemUgPT0gMAotCQkgJiYgTUVNX0FMSUdOIChvcDApICUgR0VUX01PREVfQklUU0laRSAoZmllbGRtb2RlKSA9PSAwKSkpKQorICAgICAgICAgOiAoIAorCisgICAgICAgICAgICAgLyogTkIhIEFkZGVkIGZvciBBVlIzMiwgYW5kIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IKKyAgICAgICAgICAgICAgICBhbGwgdGFyZ2V0cyBub3QgdXNpbmcgbmFycm93IHZvbGF0aWxlIGJpdGZpZWxkcy4gSWYgdGhlCisgICAgICAgICAgICAgICAgYml0ZmllbGQgaXMgdm9sYXRpbGUgdGhlbiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gYWNjZXNzCisgICAgICAgICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBjb250YWluZXIgdHlwZS4gKi8KKyAgICAgICAgICAgICAhKE1FTV9WT0xBVElMRV9QIChvcDApIAorICAgICAgICAgICAgICAgJiYgR0VUX01PREVfQklUU0laRSAoR0VUX01PREUgKG9wMCkpICE9IGJpdHNpemUKKyAgICAgICAgICAgICAgICYmIGJpdHNpemUgPCBCSVRTX1BFUl9XT1JECisgICAgICAgICAgICAgICAmJiAhdGFyZ2V0bS5uYXJyb3dfdm9sYXRpbGVfYml0ZmllbGQgKCkpCisgICAgICAgICAgICAgJiYgKCEgU0xPV19VTkFMSUdORURfQUNDRVNTIChmaWVsZG1vZGUsIE1FTV9BTElHTiAob3AwKSkKKyAgICAgICAgICAgICAgICAgfHwgKG9mZnNldCAqIEJJVFNfUEVSX1VOSVQgJSBiaXRzaXplID09IDAKKyAgICAgICAgICAgICAgICAgICAgICYmIE1FTV9BTElHTiAob3AwKSAlIEdFVF9NT0RFX0JJVFNJWkUgKGZpZWxkbW9kZSkgPT0gMCkpKSkpCiAgICAgewogICAgICAgaWYgKE1FTV9QIChvcDApKQogCW9wMCA9IGFkanVzdF9hZGRyZXNzIChvcDAsIGZpZWxkbW9kZSwgb2Zmc2V0KTsKQEAgLTEyNTYsNiArMTI2NywxMyBAQCBleHRyYWN0X2JpdF9maWVsZCAocnR4IHN0cl9ydHgsIHVuc2lnbmVkCiAJICAgJiYgR0VUX01PREVfU0laRSAobW9kZTEpICE9IDAKIAkgICAmJiBieXRlX29mZnNldCAlIEdFVF9NT0RFX1NJWkUgKG1vZGUxKSA9PSAwKQogCSAgfHwgKE1FTV9QIChvcDApCisgICAgICAgICAgICAgLyogTkIhIEFkZGVkIGZvciBBVlIzMiwgYW5kIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IKKyAgICAgICAgICAgICAgICBhbGwgdGFyZ2V0cyBub3QgdXNpbmcgbmFycm93IHZvbGF0aWxlIGJpdGZpZWxkcy4gSWYgdGhlCisgICAgICAgICAgICAgICAgYml0ZmllbGQgaXMgdm9sYXRpbGUgdGhlbiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gYWNjZXNzCisgICAgICAgICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBjb250YWluZXIgdHlwZS4gKi8KKyAgICAgICAgICAgICAgJiYgIShNRU1fVk9MQVRJTEVfUCAob3AwKQorICAgICAgICAgICAgICAgICAgICYmIEdFVF9NT0RFX0JJVFNJWkUgKEdFVF9NT0RFIChvcDApKSAhPSBiaXRzaXplCisgICAgICAgICAgICAgICAgICAgJiYgIXRhcmdldG0ubmFycm93X3ZvbGF0aWxlX2JpdGZpZWxkICgpKQogCSAgICAgICYmICghIFNMT1dfVU5BTElHTkVEX0FDQ0VTUyAobW9kZSwgTUVNX0FMSUdOIChvcDApKQogCQkgIHx8IChvZmZzZXQgKiBCSVRTX1BFUl9VTklUICUgYml0c2l6ZSA9PSAwCiAJCSAgICAgICYmIE1FTV9BTElHTiAob3AwKSAlIGJpdHNpemUgPT0gMCkpKSkpCi0tLSBhL2djYy9leHByLmMKKysrIGIvZ2NjL2V4cHIuYwpAQCAtMzUxOSwxOCArMzUxOSwxOSBAQCBlbWl0X3NpbmdsZV9wdXNoX2luc24gKGVudW0gbWFjaGluZV9tb2RlCiAgICAgfQogICBlbHNlCiAgICAgeworICAgICAgZW1pdF9tb3ZlX2luc24gKHN0YWNrX3BvaW50ZXJfcnR4LAorCQkgICAgICBleHBhbmRfYmlub3AgKFBtb2RlLAogI2lmZGVmIFNUQUNLX0dST1dTX0RPV05XQVJECi0gICAgICAvKiA/Pz8gVGhpcyBzZWVtcyB3cm9uZyBpZiBTVEFDS19QVVNIX0NPREUgPT0gUE9TVF9ERUMuICAqLwotICAgICAgZGVzdF9hZGRyID0gZ2VuX3J0eF9QTFVTIChQbW9kZSwgc3RhY2tfcG9pbnRlcl9ydHgsCi0JCQkJR0VOX0lOVCAoLShIT1NUX1dJREVfSU5UKSByb3VuZGVkX3NpemUpKTsKKwkJCQkgICAgc3ViX29wdGFiLAogI2Vsc2UKLSAgICAgIC8qID8/PyBUaGlzIHNlZW1zIHdyb25nIGlmIFNUQUNLX1BVU0hfQ09ERSA9PSBQT1NUX0lOQy4gICovCi0gICAgICBkZXN0X2FkZHIgPSBnZW5fcnR4X1BMVVMgKFBtb2RlLCBzdGFja19wb2ludGVyX3J0eCwKLQkJCQlHRU5fSU5UIChyb3VuZGVkX3NpemUpKTsKKwkJCQkgICAgYWRkX29wdGFiLAogI2VuZGlmCi0gICAgICBkZXN0X2FkZHIgPSBnZW5fcnR4X1BSRV9NT0RJRlkgKFBtb2RlLCBzdGFja19wb2ludGVyX3J0eCwgZGVzdF9hZGRyKTsKKwkJCQkgICAgc3RhY2tfcG9pbnRlcl9ydHgsCisJCQkJICAgIEdFTl9JTlQgKHJvdW5kZWRfc2l6ZSksCisJCQkJICAgIE5VTExfUlRYLCAwLCBPUFRBQl9MSUJfV0lERU4pKTsKKyAgICAgIGRlc3RfYWRkciA9IHN0YWNrX3BvaW50ZXJfcnR4OwogICAgIH0KLQorICAKICAgZGVzdCA9IGdlbl9ydHhfTUVNIChtb2RlLCBkZXN0X2FkZHIpOwogCiAgIGlmICh0eXBlICE9IDApCkBAIC01NTA5LDcgKzU1MTAsMjEgQEAgc3RvcmVfZmllbGQgKHJ0eCB0YXJnZXQsIEhPU1RfV0lERV9JTlQgYgogICAgICBpcyBhIGJpdCBmaWVsZCwgd2UgY2Fubm90IHVzZSBhZGRyZXNzaW5nIHRvIGFjY2VzcyBpdC4KICAgICAgVXNlIGJpdC1maWVsZCB0ZWNobmlxdWVzIG9yIFNVQlJFRyB0byBzdG9yZSBpbiBpdC4gICovCiAKLSAgaWYgKG1vZGUgPT0gVk9JRG1vZGUKKyAgaWYgKAorICAgICAgLyogTkIhIEFkZGVkIGZvciBBVlIzMiwgYW5kIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IKKyAgICAgICAgIGFsbCB0YXJnZXRzIG5vdCB1c2luZyBuYXJyb3cgdm9sYXRpbGUgYml0ZmllbGRzLiBJZiB0aGUKKyAgICAgICAgIGJpdGZpZWxkIGlzIHZvbGF0aWxlIHRoZW4gd2UgbmVlZCB0byBwZXJmb3JtIGFuIGFjY2VzcworICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBjb250YWluZXIgdHlwZS4gKi8KKyAgICAgIChNRU1fUCAodGFyZ2V0KSAKKyAgICAgICAmJiBNRU1fVk9MQVRJTEVfUCAodGFyZ2V0KSAKKyAgICAgICAmJiAoKEdFVF9NT0RFICh0YXJnZXQpICE9IEJMS21vZGUKKyAgICAgICAgICAgICYmIEdFVF9NT0RFX0JJVFNJWkUgKEdFVF9NT0RFICh0YXJnZXQpKSA+IGJpdHNpemUgKQorICAgICAgICAgICAvKiBJZiBCTEttb2RlLCBjaGVjayBpZiB0aGlzIGlzIGEgcmVjb3JkLiBEbyBub3Qga25vdyAKKyAgICAgICAgICAgICAgaWYgdGhpcyBpcyByZWFsbHkgbmVjZXNhcnJ5IHRob3VnaC4uLiovCisgICAgICAgICAgIHx8IChHRVRfTU9ERSAodGFyZ2V0KSA9PSBCTEttb2RlCisgICAgICAgICAgICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IFJFQ09SRF9UWVBFKSkKKyAgICAgICAmJiAhdGFyZ2V0bS5uYXJyb3dfdm9sYXRpbGVfYml0ZmllbGQgKCkpCisgICAgICB8fCBtb2RlID09IFZPSURtb2RlCiAgICAgICB8fCAobW9kZSAhPSBCTEttb2RlICYmICEgZGlyZWN0X3N0b3JlWyhpbnQpIG1vZGVdCiAJICAmJiBHRVRfTU9ERV9DTEFTUyAobW9kZSkgIT0gTU9ERV9DT01QTEVYX0lOVAogCSAgJiYgR0VUX01PREVfQ0xBU1MgKG1vZGUpICE9IE1PREVfQ09NUExFWF9GTE9BVCkKQEAgLTc1NjAsNyArNzU3NSwyMSBAQCBleHBhbmRfZXhwcl9yZWFsXzEgKHRyZWUgZXhwLCBydHggdGFyZ2V0CiAJICAgYnkgZG9pbmcgdGhlIGV4dHJhY3QgaW50byBhbiBvYmplY3QgYXMgd2lkZSBhcyB0aGUgZmllbGQKIAkgICAod2hpY2ggd2Uga25vdyB0byBiZSB0aGUgd2lkdGggb2YgYSBiYXNpYyBtb2RlKSwgdGhlbgogCSAgIHN0b3JpbmcgaW50byBtZW1vcnksIGFuZCBjaGFuZ2luZyB0aGUgbW9kZSB0byBCTEttb2RlLiAgKi8KLQlpZiAobW9kZTEgPT0gVk9JRG1vZGUKKyAgICAgICBpZiAoICAgICAgCisgICAgICAgICAgICAvKiBOQiEgQWRkZWQgZm9yIEFWUjMyLCBhbmQgSSB0aGluayB0aGlzIHNob3VsZCBiZSB0cnVlIGZvcgorICAgICAgICAgICAgICAgYWxsIHRhcmdldHMgbm90IHVzaW5nIG5hcnJvdyB2b2xhdGlsZSBiaXRmaWVsZHMuIElmIHRoZQorICAgICAgICAgICAgICAgYml0ZmllbGQgaXMgdm9sYXRpbGUgdGhlbiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gYWNjZXNzCisgICAgICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIGNvbnRhaW5lciB0eXBlLiAqLworICAgICAgICAgICAgKE1FTV9QIChvcDApIAorICAgICAgICAgICAgICYmIE1FTV9WT0xBVElMRV9QIChvcDApIAorICAgICAgICAgICAgICYmICgoR0VUX01PREUgKG9wMCkgIT0gQkxLbW9kZQorICAgICAgICAgICAgICAgICAgJiYgR0VUX01PREVfQklUU0laRSAoR0VUX01PREUgKG9wMCkpID4gYml0c2l6ZSApCisgICAgICAgICAgICAgICAgIC8qIElmIEJMS21vZGUsIGNoZWNrIGlmIHRoaXMgaXMgYSByZWNvcmQuIERvIG5vdCBrbm93IAorICAgICAgICAgICAgICAgICAgICBpZiB0aGlzIGlzIHJlYWxseSBuZWNlc2FycnkgdGhvdWdoLi4uKi8KKyAgICAgICAgICAgICAgICAgfHwgKEdFVF9NT0RFIChvcDApID09IEJMS21vZGUKKyAgICAgICAgICAgICAgICAgICAgICYmIFRSRUVfQ09ERSAodHlwZSkgPT0gUkVDT1JEX1RZUEUpKQorICAgICAgICAgICAgICYmICF0YXJnZXRtLm5hcnJvd192b2xhdGlsZV9iaXRmaWVsZCAoKSkKKyAgICAgICAgICAgIHx8IG1vZGUxID09IFZPSURtb2RlCiAJICAgIHx8IFJFR19QIChvcDApIHx8IEdFVF9DT0RFIChvcDApID09IFNVQlJFRwogCSAgICB8fCAobW9kZTEgIT0gQkxLbW9kZSAmJiAhIGRpcmVjdF9sb2FkWyhpbnQpIG1vZGUxXQogCQkmJiBHRVRfTU9ERV9DTEFTUyAobW9kZSkgIT0gTU9ERV9DT01QTEVYX0lOVAotLS0gYS9nY2MvZmxvdy5jCisrKyBiL2djYy9mbG93LmMKQEAgLTMzMjcsMTIgKzMzMjcsMTIgQEAgbm90X3JlZ19jb25kIChydHggeCkKICAgaWYgKEdFVF9DT0RFICh4KSA9PSBOT1QpCiAgICAgcmV0dXJuIFhFWFAgKHgsIDApOwogICBpZiAoQ09NUEFSSVNPTl9QICh4KQotICAgICAgJiYgUkVHX1AgKFhFWFAgKHgsIDApKSkKKyAgICAgIC8qICYmIFJFR19QIChYRVhQICh4LCAwKSkqLykKICAgICB7Ci0gICAgICBnY2NfYXNzZXJ0IChYRVhQICh4LCAxKSA9PSBjb25zdDBfcnR4KTsKKyAgICAgIC8qZ2NjX2Fzc2VydCAoWEVYUCAoeCwgMSkgPT0gY29uc3QwX3J0eCk7Ki8KIAogICAgICAgcmV0dXJuIGdlbl9ydHhfZm10X2VlIChyZXZlcnNlZF9jb21wYXJpc29uX2NvZGUgKHgsIE5VTEwpLAotCQkJICAgICBWT0lEbW9kZSwgWEVYUCAoeCwgMCksIGNvbnN0MF9ydHgpOworCQkJICAgICBWT0lEbW9kZSwgWEVYUCAoeCwgMCksIFhFWFAgKHgsIDApIC8qY29uc3QwX3J0eCovKTsKICAgICB9CiAgIHJldHVybiBnZW5fcnR4X05PVCAoMCwgeCk7CiB9Ci0tLSBhL2djYy9mdW5jdGlvbi5jCisrKyBiL2djYy9mdW5jdGlvbi5jCkBAIC0yNjc2LDggKzI2NzYsMTIgQEAgYXNzaWduX3Bhcm1fc2V0dXBfcmVnIChzdHJ1Y3QgYXNzaWduX3BhcgogICAgIFNFVF9ERUNMX1JUTCAocGFybSwgcGFybXJlZyk7CiAKICAgLyogQ29weSB0aGUgdmFsdWUgaW50byB0aGUgcmVnaXN0ZXIuICAqLwotICBpZiAoZGF0YS0+bm9taW5hbF9tb2RlICE9IGRhdGEtPnBhc3NlZF9tb2RlCi0gICAgICB8fCBwcm9tb3RlZF9ub21pbmFsX21vZGUgIT0gZGF0YS0+cHJvbW90ZWRfbW9kZSkKKyAgaWYgKCAoZGF0YS0+bm9taW5hbF9tb2RlICE9IGRhdGEtPnBhc3NlZF9tb2RlCisgICAgICAgIC8qIEFkZGVkIGZvciBBVlIzMjogSWYgcGFzc2VkX21vZGUgaXMgZXF1YWwKKyAgICAgICAgICAgdG8gcHJvbW90ZWQgbm9taW5hbCBtb2RlIHdoeSBzaG91bGQgYmUgY29udmVydD8KKyAgICAgICAgICAgVGhlIGNvbnZlcnNpb24gc2hvdWxkIG1ha2Ugbm8gZGlmZmVyZW5jZS4gKi8KKyAgICAgICAgJiYgZGF0YS0+cGFzc2VkX21vZGUgIT0gcHJvbW90ZWRfbm9taW5hbF9tb2RlKQorICAgICAgIHx8IHByb21vdGVkX25vbWluYWxfbW9kZSAhPSBkYXRhLT5wcm9tb3RlZF9tb2RlKQogICAgIHsKICAgICAgIGludCBzYXZlX3RyZWVfdXNlZDsKIAotLS0gYS9nY2MvZ2VuZW1pdC5jCisrKyBiL2djYy9nZW5lbWl0LmMKQEAgLTEyMSw2ICsxMjEsMjQgQEAgbWF4X29wZXJhbmRfdmVjIChydHggaW5zbiwgaW50IGFyZykKIH0KIAwKIHN0YXRpYyB2b2lkCitnZW5fdmFyYXJnX3Byb2xvZ3VlKGludCBvcGVyYW5kcykKK3sKKyAgaW50IGk7CisKKyAgaWYgKG9wZXJhbmRzID4gMSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgb3BlcmFuZHM7IGkrKykKKwlwcmludGYoIiAgcnR4IG9wZXJhbmQlZCBBVFRSSUJVVEVfVU5VU0VEO1xuIiwgaSk7CisKKyAgICAgIHByaW50ZigiICB2YV9saXN0IGFyZ3M7XG5cbiIpOworICAgICAgcHJpbnRmKCIgIHZhX3N0YXJ0KGFyZ3MsIG9wZXJhbmQwKTtcbiIpOworICAgICAgZm9yIChpID0gMTsgaSA8IG9wZXJhbmRzOyBpKyspCisJcHJpbnRmKCIgIG9wZXJhbmQlZCA9IHZhX2FyZyhhcmdzLCBydHgpO1xuIiwgaSk7CisgICAgICBwcmludGYoIiAgdmFfZW5kKGFyZ3MpO1xuXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCiBwcmludF9jb2RlIChSVFhfQ09ERSBjb2RlKQogewogICBjb25zdCBjaGFyICpwMTsKQEAgLTQwNSwxOCArNDIzLDE2IEBAIGdlbl9pbnNuIChydHggaW5zbiwgaW50IGxpbmVubykKICAgICBmYXRhbCAoIm1hdGNoX2R1cCBvcGVyYW5kIG51bWJlciBoYXMgbm8gbWF0Y2hfb3BlcmFuZCIpOwogCiAgIC8qIE91dHB1dCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgYXJndW1lbnQgZGVjbGFyYXRpb25zLiAgKi8KLSAgcHJpbnRmICgicnR4XG5nZW5fJXMgKCIsIFhTVFIgKGluc24sIDApKTsKKyAgcHJpbnRmICgicnR4XG5nZW5fJXMgIiwgWFNUUiAoaW5zbiwgMCkpOworCiAgIGlmIChvcGVyYW5kcykKLSAgICBmb3IgKGkgPSAwOyBpIDwgb3BlcmFuZHM7IGkrKykKLSAgICAgIGlmIChpKQotCXByaW50ZiAoIixcblx0cnR4IG9wZXJhbmQlZCBBVFRSSUJVVEVfVU5VU0VEIiwgaSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgicnR4IG9wZXJhbmQlZCBBVFRSSUJVVEVfVU5VU0VEIiwgaSk7CisgICAgcHJpbnRmKCIocnR4IG9wZXJhbmQwIEFUVFJJQlVURV9VTlVTRUQsIC4uLilcbiIpOwogICBlbHNlCi0gICAgcHJpbnRmICgidm9pZCIpOwotICBwcmludGYgKCIpXG4iKTsKKyAgICBwcmludGYoIih2b2lkKVxuIik7CiAgIHByaW50ZiAoIntcbiIpOwogCisgIGdlbl92YXJhcmdfcHJvbG9ndWUob3BlcmFuZHMpOworCiAgIC8qIE91dHB1dCBjb2RlIHRvIGNvbnN0cnVjdCBhbmQgcmV0dXJuIHRoZSBydGwgZm9yIHRoZSBpbnN0cnVjdGlvbiBib2R5LiAgKi8KIAogICBpZiAoWFZFQ0xFTiAoaW5zbiwgMSkgPT0gMSkKQEAgLTQ1NiwxNiArNDcyLDEyIEBAIGdlbl9leHBhbmQgKHJ0eCBleHBhbmQpCiAgIG9wZXJhbmRzID0gbWF4X29wZXJhbmRfdmVjIChleHBhbmQsIDEpOwogCiAgIC8qIE91dHB1dCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgYXJndW1lbnQgZGVjbGFyYXRpb25zLiAgKi8KLSAgcHJpbnRmICgicnR4XG5nZW5fJXMgKCIsIFhTVFIgKGV4cGFuZCwgMCkpOworICBwcmludGYgKCJydHhcbmdlbl8lcyAiLCBYU1RSIChleHBhbmQsIDApKTsKICAgaWYgKG9wZXJhbmRzKQotICAgIGZvciAoaSA9IDA7IGkgPCBvcGVyYW5kczsgaSsrKQotICAgICAgaWYgKGkpCi0JcHJpbnRmICgiLFxuXHRydHggb3BlcmFuZCVkIiwgaSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgicnR4IG9wZXJhbmQlZCIsIGkpOworICAgIHByaW50ZigiKHJ0eCBvcGVyYW5kMCBBVFRSSUJVVEVfVU5VU0VELCAuLi4pXG4iKTsKICAgZWxzZQotICAgIHByaW50ZiAoInZvaWQiKTsKLSAgcHJpbnRmICgiKVxuIik7CisgICAgcHJpbnRmKCIodm9pZClcbiIpOworCiAgIHByaW50ZiAoIntcbiIpOwogCiAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IEMgY29kZSB0byB3cml0ZSwgb25seSBvbmUgaW5zbiBpcyBiZWluZyB3cml0dGVuLApAQCAtNDc1LDYgKzQ4Nyw4IEBAIGdlbl9leHBhbmQgKHJ0eCBleHBhbmQpCiAgICAgICAmJiBvcGVyYW5kcyA+IG1heF9kdXBfb3BubwogICAgICAgJiYgWFZFQ0xFTiAoZXhwYW5kLCAxKSA9PSAxKQogICAgIHsKKyAgICAgIGdlbl92YXJhcmdfcHJvbG9ndWUob3BlcmFuZHMpOworCiAgICAgICBwcmludGYgKCIgIHJldHVybiAiKTsKICAgICAgIGdlbl9leHAgKFhWRUNFWFAgKGV4cGFuZCwgMSwgMCksIERFRklORV9FWFBBTkQsIE5VTEwpOwogICAgICAgcHJpbnRmICgiO1xufVxuXG4iKTsKQEAgLTQ4OCw2ICs1MDIsNyBAQCBnZW5fZXhwYW5kIChydHggZXhwYW5kKQogICBmb3IgKDsgaSA8PSBtYXhfc2NyYXRjaF9vcG5vOyBpKyspCiAgICAgcHJpbnRmICgiICBydHggb3BlcmFuZCVkIEFUVFJJQlVURV9VTlVTRUQ7XG4iLCBpKTsKICAgcHJpbnRmICgiICBydHggX3ZhbCA9IDA7XG4iKTsKKyAgZ2VuX3ZhcmFyZ19wcm9sb2d1ZShvcGVyYW5kcyk7CiAgIHByaW50ZiAoIiAgc3RhcnRfc2VxdWVuY2UgKCk7XG4iKTsKIAogICAvKiBUaGUgZm91cnRoIG9wZXJhbmQgb2YgREVGSU5FX0VYUEFORCBpcyBzb21lIGNvZGUgdG8gYmUgZXhlY3V0ZWQKLS0tIGEvZ2NjL2dlbmZsYWdzLmMKKysrIGIvZ2NjL2dlbmZsYWdzLmMKQEAgLTEyNyw3ICsxMjcsNiBAQCBzdGF0aWMgdm9pZAogZ2VuX3Byb3RvIChydHggaW5zbikKIHsKICAgaW50IG51bSA9IG51bV9vcGVyYW5kcyAoaW5zbik7Ci0gIGludCBpOwogICBjb25zdCBjaGFyICpuYW1lID0gWFNUUiAoaW5zbiwgMCk7CiAgIGludCB0cnV0aCA9IG1heWJlX2V2YWxfY190ZXN0IChYU1RSIChpbnNuLCAyKSk7CiAKQEAgLTE1OCwxMiArMTU3LDcgQEAgZ2VuX3Byb3RvIChydHggaW5zbikKICAgaWYgKG51bSA9PSAwKQogICAgIGZwdXRzICgidm9pZCIsIHN0ZG91dCk7CiAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtOyBpKyspCi0JZnB1dHMgKCJydHgsICIsIHN0ZG91dCk7Ci0KLSAgICAgIGZwdXRzICgicnR4Iiwgc3Rkb3V0KTsKLSAgICB9CisgICAgZnB1dHMoInJ0eCwgLi4uIiwgc3Rkb3V0KTsKIAogICBwdXRzICgiKTsiKTsKIApAQCAtMTczLDEyICsxNjcsNyBAQCBnZW5fcHJvdG8gKHJ0eCBpbnNuKQogICAgIHsKICAgICAgIHByaW50ZiAoInN0YXRpYyBpbmxpbmUgcnR4XG5nZW5fJXMiLCBuYW1lKTsKICAgICAgIGlmIChudW0gPiAwKQotCXsKLQkgIHB1dGNoYXIgKCcoJyk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbnVtLTE7IGkrKykKLQkgICAgcHJpbnRmICgicnR4IEFSR19VTlVTRUQgKCVjKSwgIiwgJ2EnICsgaSk7Ci0JICBwcmludGYgKCJydHggQVJHX1VOVVNFRCAoJWMpKVxuIiwgJ2EnICsgaSk7Ci0JfQorCXB1dHMoIihydHggQVJHX1VOVVNFRChhKSwgLi4uKSIpOwogICAgICAgZWxzZQogCXB1dHMgKCIodm9pZCkiKTsKICAgICAgIHB1dHMgKCJ7XG4gIHJldHVybiAwO1xufSIpOwotLS0gYS9nY2MvZ2Vub3V0cHV0LmMKKysrIGIvZ2NjL2dlbm91dHB1dC5jCkBAIC0zODYsNyArMzg2LDcgQEAgb3V0cHV0X2luc25fZGF0YSAodm9pZCkKIAl9CiAKICAgICAgIGlmIChkLT5uYW1lICYmIGQtPm5hbWVbMF0gIT0gJyonKQotCXByaW50ZiAoIiAgICAoaW5zbl9nZW5fZm4pIGdlbl8lcyxcbiIsIGQtPm5hbWUpOworCXByaW50ZiAoIiAgICBnZW5fJXMsXG4iLCBkLT5uYW1lKTsKICAgICAgIGVsc2UKIAlwcmludGYgKCIgICAgMCxcbiIpOwogCi0tLSBhL2djYy9pZmN2dC5jCisrKyBiL2djYy9pZmN2dC5jCkBAIC03Nyw3ICs3Nyw3IEBAIHN0YXRpYyBpbnQgbnVtX3Bvc3NpYmxlX2lmX2Jsb2NrczsKIHN0YXRpYyBpbnQgbnVtX3VwZGF0ZWRfaWZfYmxvY2tzOwogCiAvKiAjIG9mIGNoYW5nZXMgbWFkZSB3aGljaCByZXF1aXJlIGxpZmUgaW5mb3JtYXRpb24gdG8gYmUgdXBkYXRlZC4gICovCi1zdGF0aWMgaW50IG51bV90cnVlX2NoYW5nZXM7CitpbnQgbnVtX3RydWVfY2hhbmdlczsKIAogLyogV2hldGhlciBjb25kaXRpb25hbCBleGVjdXRpb24gY2hhbmdlcyB3ZXJlIG1hZGUuICAqLwogc3RhdGljIGludCBjb25kX2V4ZWNfY2hhbmdlZF9wOwpAQCAtMjg3LDEyICsyODcsMTUgQEAgY29uZF9leGVjX3Byb2Nlc3NfaW5zbnMgKGNlX2lmX2Jsb2NrX3QgKgogICAgICAgaWYgKG11c3RfYmVfbGFzdCkKIAlyZXR1cm4gRkFMU0U7CiAKLSAgICAgIGlmIChtb2RpZmllZF9pbl9wICh0ZXN0LCBpbnNuKSkKLQl7Ci0JICBpZiAoIW1vZF9vaykKLQkgICAgcmV0dXJuIEZBTFNFOwotCSAgbXVzdF9iZV9sYXN0ID0gVFJVRTsKLQl9CisjaWZkZWYgSUZDVlRfQUxMT1dfTU9ESUZZX1RFU1RfSU5fSU5TTiAgICAgICAKKyAgICAgIGlmICggIUlGQ1ZUX0FMTE9XX01PRElGWV9URVNUX0lOX0lOU04gKQorI2VuZGlmCisgICAgICAgIGlmIChtb2RpZmllZF9pbl9wICh0ZXN0LCBpbnNuKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1vZF9vaykKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgbXVzdF9iZV9sYXN0ID0gVFJVRTsKKyAgICAgICAgICB9CiAKICAgICAgIC8qIE5vdyBidWlsZCB0aGUgY29uZGl0aW9uYWwgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwogICAgICAgcGF0dGVybiA9IFBBVFRFUk4gKGluc24pOwpAQCAtNTY2LDE2ICs1NjksMTkgQEAgY29uZF9leGVjX3Byb2Nlc3NfaWZfYmxvY2sgKGNlX2lmX2Jsb2NrXwogICAvKiBEbyBhbnkgbWFjaGluZSBkZXBlbmRlbnQgZmluYWwgbW9kaWZpY2F0aW9ucy4gICovCiAgIElGQ1ZUX01PRElGWV9GSU5BTCAoY2VfaW5mbyk7CiAjZW5kaWYKLQotICAvKiBDb252ZXJzaW9uIHN1Y2NlZWRlZC4gICovCi0gIGlmIChkdW1wX2ZpbGUpCi0gICAgZnByaW50ZiAoZHVtcF9maWxlLCAiJWQgaW5zbiVzIGNvbnZlcnRlZCB0byBjb25kaXRpb25hbCBleGVjdXRpb24uXG4iLAotCSAgICAgbl9pbnNucywgKG5faW5zbnMgPT0gMSkgPyAiIHdhcyIgOiAicyB3ZXJlIik7Ci0KKyAgCiAgIC8qIE1lcmdlIHRoZSBibG9ja3MhICAqLwotICBtZXJnZV9pZl9ibG9jayAoY2VfaW5mbyk7Ci0gIGNvbmRfZXhlY19jaGFuZ2VkX3AgPSBUUlVFOwotICByZXR1cm4gVFJVRTsKKyAgaWYgKCByZWxvYWRfY29tcGxldGVkICl7CisgICAgLyogQ29udmVyc2lvbiBzdWNjZWVkZWQuICAqLworICAgIGlmIChkdW1wX2ZpbGUpCisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICIlZCBpbnNuJXMgY29udmVydGVkIHRvIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbi5cbiIsCisgICAgICAgICAgICAgICBuX2luc25zLCAobl9pbnNucyA9PSAxKSA/ICIgd2FzIiA6ICJzIHdlcmUiKTsKKyAgICAKKyAgICBtZXJnZV9pZl9ibG9jayAoY2VfaW5mbyk7CisgICAgY29uZF9leGVjX2NoYW5nZWRfcCA9IFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogCiAgZmFpbDoKICNpZmRlZiBJRkNWVF9NT0RJRllfQ0FOQ0VMCkBAIC0xMDUwLDcgKzEwNTYsMTEgQEAgbm9jZV90cnlfYWRkY2MgKHN0cnVjdCBub2NlX2lmX2luZm8gKmlmXwogCSAgIT0gVU5LTk9XTikpCiAgICAgewogICAgICAgcnR4IGNvbmQgPSBpZl9pbmZvLT5jb25kOwotICAgICAgZW51bSBydHhfY29kZSBjb2RlID0gcmV2ZXJzZWRfY29tcGFyaXNvbl9jb2RlIChjb25kLCBpZl9pbmZvLT5qdW1wKTsKKyAgICAgIC8qIFRoaXMgZ2VuZXJhdGVzIHdyb25nIGNvZGUgZm9yIEFWUjMyLiBUaGUgY29uZCBjb2RlIG5lZWQgbm90IGJlIHJldmVyc2VkCisgICAgICAgICBzaW5jZSB0aGUgYWRkbW9kZWNjIHBhdHRlcm5zIGFkZCBpZiB0aGUgY29uZGl0aW9uIGlzIE5PVCBtZXQuICovCisgICAgICAvKiAgIGVudW0gcnR4X2NvZGUgY29kZSA9IHJldmVyc2VkX2NvbXBhcmlzb25fY29kZSAoY29uZCwgaWZfaW5mby0+anVtcCk7Ki8KKyAgICAgIGVudW0gcnR4X2NvZGUgY29kZSA9IEdFVF9DT0RFKGNvbmQpOworCiAKICAgICAgIC8qIEZpcnN0IHRyeSB0byB1c2UgYWRkY2MgcGF0dGVybi4gICovCiAgICAgICBpZiAoZ2VuZXJhbF9vcGVyYW5kIChYRVhQIChjb25kLCAwKSwgVk9JRG1vZGUpCkBAIC0yNjUxLDcgKzI2NjEsMTIgQEAgcHJvY2Vzc19pZl9ibG9jayAoc3RydWN0IGNlX2lmX2Jsb2NrICogYwogICAgICAgJiYgY29uZF9tb3ZlX3Byb2Nlc3NfaWZfYmxvY2sgKGNlX2luZm8pKQogICAgIHJldHVybiBUUlVFOwogCi0gIGlmIChIQVZFX2NvbmRpdGlvbmFsX2V4ZWN1dGlvbiAmJiByZWxvYWRfY29tcGxldGVkKQorICBpZiAoSEFWRV9jb25kaXRpb25hbF9leGVjdXRpb24gJiYgCisjaWZkZWYgSUZDVlRfQ09ORF9FWEVDX0JFRk9SRV9SRUxPQUQKKyAgICAgIChyZWxvYWRfY29tcGxldGVkIHx8IElGQ1ZUX0NPTkRfRVhFQ19CRUZPUkVfUkVMT0FEKSkKKyNlbHNlCisgICAgICByZWxvYWRfY29tcGxldGVkKQorI2VuZGlmCiAgICAgewogICAgICAgLyogSWYgd2UgaGF2ZSAmJiBhbmQgfHwgdGVzdHMsIHRyeSB0byBmaXJzdCBoYW5kbGUgY29tYmluaW5nIHRoZSAmJiBhbmQKICAgICAgICAgIHx8IHRlc3RzIGludG8gdGhlIGNvbmRpdGlvbmFsIGNvZGUsIGFuZCBpZiB0aGF0IGZhaWxzLCBnbyBiYWNrIGFuZApAQCAtNDAzNiw2ICs0MDUxLDE1IEBAIHJlc3Rfb2ZfaGFuZGxlX2lmX2FmdGVyX3JlbG9hZCAodm9pZCkKICAgY2xlYW51cF9jZmcgKENMRUFOVVBfRVhQRU5TSVZFCiAgICAgICAgICAgICAgICB8IENMRUFOVVBfVVBEQVRFX0xJRkUKICAgICAgICAgICAgICAgIHwgKGZsYWdfY3Jvc3NqdW1waW5nID8gQ0xFQU5VUF9DUk9TU0pVTVAgOiAwKSk7CisgIAorICAvKiBIYWNrIGZvciB0aGUgQVZSMzIgZXhwZXJpbWVudGFsIGlmY3Z0IHByb2Nlc3NpbmcgYmVmb3JlIHJlbG9hZC4KKyAgICAgVGhlIEFWUjMyIHNwZWNpZmljIGlmY3Z0IGNvZGUgbmVlZHMgdG8ga25vdyB3aGVuIGlmY3Z0IGFmdGVyIHJlbG9hZCAKKyAgICAgaGFzIGJlZ3VuLiAqLworI2lmZGVmIElGQ1ZUX0NPTkRfRVhFQ19CRUZPUkVfUkVMT0FECisgIGlmICggSUZDVlRfQ09ORF9FWEVDX0JFRk9SRV9SRUxPQUQgKQorICAgIGNmdW4tPm1hY2hpbmUtPmlmY3Z0X2FmdGVyX3JlbG9hZCA9IDE7CisjZW5kaWYKKyAgCiAgIGlmIChmbGFnX2lmX2NvbnZlcnNpb24yKQogICAgIGlmX2NvbnZlcnQgKDEpOwogICByZXR1cm4gMDsKLS0tIGEvZ2NjL2xvbmdsb25nLmgKKysrIGIvZ2NjL2xvbmdsb25nLmgKQEAgLTIyNiw2ICsyMjYsNDEgQEAgVURJdHlwZSBfX3VtdWxzaWRpMyAoVVNJdHlwZSwgVVNJdHlwZSk7CiAjZGVmaW5lIFVESVZfVElNRSAxMDAKICNlbmRpZiAvKiBfX2FybV9fICovCiAKKyNpZiBkZWZpbmVkIChfX2F2cjMyX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiYWRkXHQlMSwgJTQsICU1XG5cdGFkY1x0JTAsICUyLCAlMyIJCVwKKwkgICA6ICI9ciIgKChVU0l0eXBlKSAoc2gpKSwJCQkJCVwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkgKHNsKSkJCQkJCVwKKwkgICA6ICJyIiAoKFVTSXR5cGUpIChhaCkpLAkJCQkJXAorCSAgICAgInIiICgoVVNJdHlwZSkgKGJoKSksCQkJCQlcCisJICAgICAiciIgKChVU0l0eXBlKSAoYWwpKSwJCQkJCVwKKwkgICAgICJyIiAoKFVTSXR5cGUpIChibCkpIF9fQ0xPQkJFUl9DQykKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWJcdCUxLCAlNCwgJTVcblx0c2JjXHQlMCwgJTIsICUzIgkJXAorCSAgIDogIj1yIiAoKFVTSXR5cGUpIChzaCkpLAkJCQkJXAorCSAgICAgIj0mciIgKChVU0l0eXBlKSAoc2wpKQkJCQkJXAorCSAgIDogInIiICgoVVNJdHlwZSkgKGFoKSksCQkJCQlcCisJICAgICAiciIgKChVU0l0eXBlKSAoYmgpKSwJCQkJCVwKKwkgICAgICJyIiAoKFVTSXR5cGUpIChhbCkpLAkJCQkJXAorCSAgICAgInIiICgoVVNJdHlwZSkgKGJsKSkgX19DTE9CQkVSX0NDKQorCisjaWYgIWRlZmluZWQgKF9fQVZSMzJfVUNfXykgfHwgX19BVlIzMl9VQ19fICE9IDMKKyNkZWZpbmUgX191bXVsc2lkaTMoYSxiKSAoKFVESXR5cGUpKGEpICogKFVESXR5cGUpKGIpKQorCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKK3sJCQkJCQkJCQlcCisgIERXdW5pb24gX193OwkJCQkJCQkJXAorICBfX3cubGwgPSBfX3VtdWxzaWRpMyAodSwgdik7CQkJCQkJXAorICB3MSA9IF9fdy5zLmhpZ2g7CQkJCQkJCVwKKyAgdzAgPSBfX3cucy5sb3c7CQkJCQkJCVwKK30KKyNlbmRpZgorCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoQ09VTlQsWCkJKChDT1VOVCkgPSBfX2J1aWx0aW5fY2x6IChYKSkKKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoQ09VTlQsWCkJKChDT1VOVCkgPSBfX2J1aWx0aW5fY3R6IChYKSkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIDMyCisjZW5kaWYKKwogI2lmIGRlZmluZWQgKF9faHBwYSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKICNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCiAgIF9fYXNtX18gKCJhZGQgJTQsJTUsJTFcblx0YWRkYyAlMiwlMywlMCIJCQkJXAotLS0gYS9nY2Mvb3B0YWJzLmgKKysrIGIvZ2NjL29wdGFicy5oCkBAIC00MzEsNyArNDMxLDcgQEAgZXh0ZXJuIGVudW0gaW5zbl9jb2RlIHJlbG9hZF9vdXRfb3B0YWJbTgogZXh0ZXJuIEdUWSgoKSkgb3B0YWIgY29kZV90b19vcHRhYltOVU1fUlRYX0NPREUgKyAxXTsKIAogDAotdHlwZWRlZiBydHggKCpydHhmdW4pIChydHgpOwordHlwZWRlZiBydHggKCpydHhmdW4pIChydHgsIC4uLik7CiAKIC8qIEluZGV4ZWQgYnkgdGhlIHJ0eC1jb2RlIGZvciBhIGNvbmRpdGlvbmFsIChlLmcuIEVRLCBMVCwuLi4pCiAgICBnaXZlcyB0aGUgZ2VuX2Z1bmN0aW9uIHRvIG1ha2UgYSBicmFuY2ggdG8gdGVzdCB0aGF0IGNvbmRpdGlvbi4gICovCi0tLSBhL2djYy9yZWdyZW5hbWUuYworKysgYi9nY2MvcmVncmVuYW1lLmMKQEAgLTE1OTIsNiArMTU5Miw5IEBAIGNvcHlwcm9wX2hhcmRyZWdfZm9yd2FyZF8xIChiYXNpY19ibG9jayAKICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgIHJ0eCBpbnNuOwogCisgIHJ0eCBwcmV2X3ByZWRfdGVzdDsKKyAgaW50IHByZXZfcHJlZF9pbnNuX3NraXBwZWQgPSAwOworCiAgIGZvciAoaW5zbiA9IEJCX0hFQUQgKGJiKTsgOyBpbnNuID0gTkVYVF9JTlNOIChpbnNuKSkKICAgICB7CiAgICAgICBpbnQgbl9vcHMsIGksIGFsdCwgcHJlZGljYXRlZDsKQEAgLTE2MzAsNyArMTYzMyw2MCBAQCBjb3B5cHJvcF9oYXJkcmVnX2ZvcndhcmRfMSAoYmFzaWNfYmxvY2sgCiAJICAgICAgfHwgKHByZWRpY2F0ZWQgJiYgcmVjb2dfZGF0YS5vcGVyYW5kX3R5cGVbaV0gPT0gT1BfT1VUKSkKIAkgICAgcmVjb2dfZGF0YS5vcGVyYW5kX3R5cGVbaV0gPSBPUF9JTk9VVDsKIAl9CisgICAgICAKIAorICAgICAgLyogQWRkZWQgZm9yIHRhcmdldHMgKEFWUjMyKSB3aGljaCBzdXBwb3J0cyB0ZXN0IG9wZXJhbmRzIHRvIGJlIG1vZGlmaWVkCisgICAgICAgICBpbiBjb25kX2V4ZWMgaW5zdHJ1Y3Rpb24uIEZvciB0aGVzZSB0YXJnZXRzIHdlIGNhbm5vdCBtYWtlIGEgY2hhbmdlIHRvCisgICAgICAgICB0aGUgdGVzdCBvcGVyYW5kcyBpZiBvbmUgb2YgdGhlIHRlc3Qgb3BlcmFuZHMgaXMgYW4gb3V0cHV0IG9wZXJhbmQgVGhpcyBiZWFjdXNlCisgICAgICAgICBjaGFuZ2luZyB0aGUgdGVzdCBvcGVyYW5kcyBtaWdodCBjYXVzZSB0aGUgbmVlZCBmb3IgaW5zZXJ0aW5nIGEgbmV3IHRlc3QKKyAgICAgICAgIGluc25zIGluIHRoZSBtaWRkbGUgb2YgYSBzZXF1ZW5jZSBvZiBjb25kX2V4ZWMgaW5zbnMgYW5kIGlmIHRoZSB0ZXN0IG9wZXJhbmRzCisgICAgICAgICBhcmUgbW9kaWZpZWQgdGhlc2UgdGVzdHMgd2lsbCBmYWlsLgorICAgICAgKi8KKyAgICAgIAorICAgICAgaWYgKCBJRkNWVF9BTExPV19NT0RJRllfVEVTVF9JTl9JTlNOCisgICAgICAgICAgICYmIHByZWRpY2F0ZWQgKQorICAgICAgICB7IAorICAgICAgICAgIGludCBpbnNuX3NraXBwZWQgPSAwOworICAgICAgICAgIHJ0eCB0ZXN0ID0gQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKGluc24pKTsKKworICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwcmV2aW91cyBpbnNuIHdhcyBhIHNraXBwZWQgcHJlZGljYXRlZCBpbnNuIHdpdGggdGhlIHNhbWUKKyAgICAgICAgICAgICB0ZXN0IGFzIHRoaXMgcHJlZGljYXRlZCBpbnNucy4gSWYgc28gd2UgY2Fubm90IGRvIGFueSBtb2RpZmljYXRpb24gdG8KKyAgICAgICAgICAgICB0aGlzIGluc24gZWl0aGVyIHNpbmNlIHdlIGNhbm5vdCBlbWl0IHRoZSB0ZXN0IGluc24gYmVjYXVzZSB0aGUgb3BlcmFuZHMKKyAgICAgICAgICAgICBhcmUgY2xvYmJlcmVkLiAqLworICAgICAgICAgIGlmICggcHJldl9wcmVkX2luc25fc2tpcHBlZCAKKyAgICAgICAgICAgICAgICYmIChydHhfZXF1YWxfcCAodGVzdCwgcHJldl9wcmVkX3Rlc3QpIAorICAgICAgICAgICAgICAgICAgIHx8IHJ0eF9lcXVhbF9wICh0ZXN0LCByZXZlcnNlZF9jb25kaXRpb24gKHByZXZfcHJlZF90ZXN0KSkpICkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgIGluc25fc2tpcHBlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgb3V0cHV0IG9wZXJhbmQgaXMgdXNlZCBpbiB0aGUgdGVzdCBleHByZXNzaW9uLiAqLworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9vcHM7ICsraSkKKyAgICAgICAgICAgICAgICBpZiAoIHJlY29nX2RhdGEub3BlcmFuZF90eXBlW2ldID09IE9QX0lOT1VUIAorICAgICAgICAgICAgICAgICAgICAgJiYgcmVnX21lbnRpb25lZF9wIChyZWNvZ19kYXRhLm9wZXJhbmRbaV0sIHRlc3QpICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zbl9za2lwcGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHByZXZfcHJlZF90ZXN0ID0gdGVzdDsKKyAgICAgICAgICBwcmV2X3ByZWRfaW5zbl9za2lwcGVkID0gaW5zbl9za2lwcGVkOworICAgICAgICAgIGlmICggaW5zbl9za2lwcGVkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGluc24gPT0gQkJfRU5EIChiYikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICBwcmV2X3ByZWRfaW5zbl9za2lwcGVkID0gMDsKKyAgICAgICAgfQorICAgICAgCiAgICAgICAvKiBGb3IgZWFjaCBlYXJseWNsb2JiZXIgb3BlcmFuZCwgemFwIHRoZSB2YWx1ZSBkYXRhLiAgKi8KICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX29wczsgaSsrKQogCWlmIChyZWNvZ19vcF9hbHRbaV1bYWx0XS5lYXJseWNsb2JiZXIpCi0tLSBhL2djYy9yZWxvYWQuYworKysgYi9nY2MvcmVsb2FkLmMKQEAgLTQ1NzQsNyArNDU3NCw3IEBAIGZpbmRfcmVsb2Fkc190b3BsZXYgKHJ0eCB4LCBpbnQgb3BudW0sIGUKIAkgICAgICB4ID0gbWVtOwogCSAgICAgIGkgPSBmaW5kX3JlbG9hZHNfYWRkcmVzcyAoR0VUX01PREUgKHgpLCAmeCwgWEVYUCAoeCwgMCksICZYRVhQICh4LCAwKSwKIAkJCQkJb3BudW0sIHR5cGUsIGluZF9sZXZlbHMsIGluc24pOwotCSAgICAgIGlmICh4ICE9IG1lbSkKKyAgICAgICAgIGlmICghcnR4X2VxdWFsX3AgKHgsIG1lbSkpCiAJCXB1c2hfcmVnX2VxdWl2X2FsdF9tZW0gKHJlZ25vLCB4KTsKIAkgICAgICBpZiAoYWRkcmVzc19yZWxvYWRlZCkKIAkJKmFkZHJlc3NfcmVsb2FkZWQgPSBpOwotLS0gYS9nY2Mvc2NoZWQtZGVwcy5jCisrKyBiL2djYy9zY2hlZC1kZXBzLmMKQEAgLTY0OSw3ICs2NDksMTQgQEAgZml4dXBfc2NoZWRfZ3JvdXBzIChydHggaW5zbikKIAogICBwcmV2X25vbm5vdGUgPSBwcmV2X25vbm5vdGVfaW5zbiAoaW5zbik7CiAgIGlmIChCTE9DS19GT1JfSU5TTiAoaW5zbikgPT0gQkxPQ0tfRk9SX0lOU04gKHByZXZfbm9ubm90ZSkKLSAgICAgICYmICEgc2NoZWRfaW5zbnNfY29uZGl0aW9uc19tdXRleF9wIChpbnNuLCBwcmV2X25vbm5vdGUpKQorICAgICAgLyogTW9kaWZpY2F0aW9uIGZvciBBVlIzMiBieSBSUDogV2h5IGlzIHRoaXMgaGVyZSwgdGhpcyB3aWxsCisgICAgICAgICBjYXVzZSBpbnN0cnVjdGlvbiB0byBiZSB3aXRob3V0IGFueSBkZXBlbmRlbmNpZXMgd2hpY2ggbWlnaHQKKyAgICAgICAgIGNhdXNlIGl0IHRvIGJlIG1vdmVkIGFueXdoZXJlLiBGb3IgdGhlIEFWUjMyIHdlIHRyeSB0byBrZWVwCisgICAgICAgICBhIGdyb3VwIG9mIGNvbmRpdGlvbmFscyB0b2dldGhlciBldmVuIGlmIHRoZXkgYXJlIG11dHVhbCBleGNsdXNpdmUuCisgICAgICAqLworICAgICAgJiYgKCEgc2NoZWRfaW5zbnNfY29uZGl0aW9uc19tdXRleF9wIChpbnNuLCBwcmV2X25vbm5vdGUpCisgICAgICAgICAgfHwgR0VUX0NPREUgKFBBVFRFUk4gKGluc24pKSA9PSBDT05EX0VYRUMgKQorICAgICAgKQogICAgIGFkZF9kZXBlbmRlbmNlIChpbnNuLCBwcmV2X25vbm5vdGUsIFJFR19ERVBfQU5USSk7CiB9CiAMCkBAIC0xMTIzLDggKzExMzAsMjkgQEAgc2NoZWRfYW5hbHl6ZV9pbnNuIChzdHJ1Y3QgZGVwcyAqZGVwcywgcgogCiAgIGlmIChjb2RlID09IENPTkRfRVhFQykKICAgICB7CisjaWZkZWYgSUZDVlRfQUxMT1dfTU9ESUZZX1RFU1RfSU5fSU5TTgorICAgICAgaWYgKElGQ1ZUX0FMTE9XX01PRElGWV9URVNUX0lOX0lOU04pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGEgZ3JvdXAgb2cgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIHNhbWUgdGVzdC4gCisgICAgICAgICAgICAgSWYgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBub3Qgc2NoZWR1bGVkIGFwYXJ0IGluIG9yZGVyIHRvCisgICAgICAgICAgICAgYXZvaWQgdW5uZWNlc2FycnkgdGVzdHMgYW5kIGlmIG9uZSBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoZSB0ZXN0IGlzIG1vZGlmaWVkCisgICAgICAgICAgICAgaW4gdGhlIGluc3RydWN0aW9uIHRoaXMgaXMgbmVlZGVkIHRvIGVuc3VyZSBjb3JyZWN0IGNvZGUuICovCisgICAgICAgICAgaWYgKCBwcmV2X25vbm5vdGVfaW5zbiAoaW5zbikKKyAgICAgICAgICAgICAgICYmIElOU05fUCAocHJldl9ub25ub3RlX2luc24gKGluc24pKQorICAgICAgICAgICAgICAgJiYgR0VUX0NPREUgKFBBVFRFUk4gKHByZXZfbm9ubm90ZV9pbnNuIChpbnNuKSkpID09IENPTkRfRVhFQyAKKyAgICAgICAgICAgICAgICYmIHJ0eF9lcXVhbF9wIChYRVhQKENPTkRfRVhFQ19URVNUIChQQVRURVJOIChwcmV2X25vbm5vdGVfaW5zbiAoaW5zbikpKSwgMCksIFhFWFAgKENPTkRfRVhFQ19URVNUICh4KSwgMCkpCisgICAgICAgICAgICAgICAmJiBydHhfZXF1YWxfcCAoWEVYUChDT05EX0VYRUNfVEVTVCAoUEFUVEVSTiAocHJldl9ub25ub3RlX2luc24gKGluc24pKSksIDEpLCBYRVhQIChDT05EX0VYRUNfVEVTVCAoeCksIDEpKQorICAgICAgICAgICAgICAgJiYgKCBHRVRfQ09ERSAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKHByZXZfbm9ubm90ZV9pbnNuIChpbnNuKSkpKSA9PSBHRVRfQ09ERSAoQ09ORF9FWEVDX1RFU1QgKHgpKQorICAgICAgICAgICAgICAgICAgICB8fCBHRVRfQ09ERSAoQ09ORF9FWEVDX1RFU1QgKFBBVFRFUk4gKHByZXZfbm9ubm90ZV9pbnNuIChpbnNuKSkpKSA9PSByZXZlcnNlZF9jb21wYXJpc29uX2NvZGUgKENPTkRfRVhFQ19URVNUICh4KSwgaW5zbikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTQ0hFRF9HUk9VUF9QIChpbnNuKSA9IDE7CisgICAgICAgICAgICAgIC8vQ0FOVF9NT1ZFIChwcmV2X25vbm5vdGVfaW5zbiAoaW5zbikpID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmICAgICAgCiAgICAgICBzY2hlZF9hbmFseXplXzIgKGRlcHMsIENPTkRfRVhFQ19URVNUICh4KSwgaW5zbik7CiAKKwogICAgICAgLyogPz8/IFNob3VsZCBiZSByZWNvcmRpbmcgY29uZGl0aW9ucyBzbyB3ZSByZWR1Y2UgdGhlIG51bWJlciBvZgogCSBmYWxzZSBkZXBlbmRlbmNpZXMuICAqLwogICAgICAgeCA9IENPTkRfRVhFQ19DT0RFICh4KTsKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvc2liY2FsbC0zLmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvc2liY2FsbC0zLmMKQEAgLTUsNyArNSw3IEBACiAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEluYy4KICAgIENvbnRyaWJ1dGVkIGJ5IEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGJpdHJhbmdlLmNvbT4gICovCiAKLS8qIHsgZGctZG8gcnVuIHsgeGZhaWwgYXJjLSotKiBhdnItKi0qIGM0eC0qLSogY3Jpcy0qLSogaDgzMDAtKi0qIGhwcGEqNjQqLSotKiBtMzJyLSotKiBtNjhoYzE/LSotKiBtNjgxPy0qLSogbTY4MCotKi0qIG02OGstKi0qIG1jb3JlLSotKiBtbjEwMzAwLSotKiB4c3Rvcm15MTYtKi0qIHY4NTAqLSotKiB2YXgtKi0qIHh0ZW5zYS0qLSogfSB9ICovCisvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIGFyYy0qLSogYXZyLSotKiBhdnIzMi0qLSogYzR4LSotKiBjcmlzLSotKiBoODMwMC0qLSogaHBwYSo2NCotKi0qIG0zMnItKi0qIG02OGhjMT8tKi0qIG02ODE/LSotKiBtNjgwKi0qLSogbTY4ay0qLSogbWNvcmUtKi0qIG1uMTAzMDAtKi0qIHhzdG9ybXkxNi0qLSogdjg1MCotKi0qIHZheC0qLSogeHRlbnNhLSotKiB9IH0gKi8KIC8qIHsgZGctb3B0aW9ucyAiLU8yIC1mb3B0aW1pemUtc2libGluZy1jYWxscyIgfSAqLwogCiAvKiBUaGUgb3B0aW9uIC1mb3B0aW1pemUtc2libGluZy1jYWxscyBpcyB0aGUgZGVmYXVsdCwgYnV0IHNlcnZlcyBhcwotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9zaWJjYWxsLTQuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9zaWJjYWxsLTQuYwpAQCAtNSw3ICs1LDcgQEAKICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLgogICAgQ29udHJpYnV0ZWQgYnkgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYml0cmFuZ2UuY29tPiAgKi8KIAotLyogeyBkZy1kbyBydW4geyB4ZmFpbCBhcmMtKi0qIGF2ci0qLSogYzR4LSotKiBjcmlzLSotKiBoODMwMC0qLSogaHBwYSo2NCotKi0qIG0zMnItKi0qIG02OGhjMT8tKi0qIG02ODE/LSotKiBtNjgwKi0qLSogbTY4ay0qLSogbWNvcmUtKi0qIG1uMTAzMDAtKi0qIHhzdG9ybXkxNi0qLSogdjg1MCotKi0qIHZheC0qLSogeHRlbnNhLSotKiB9IH0gKi8KKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgYXJjLSotKiBhdnItKi0qIGF2cjMyLSotKiBjNHgtKi0qIGNyaXMtKi0qIGg4MzAwLSotKiBocHBhKjY0Ki0qLSogbTMyci0qLSogbTY4aGMxPy0qLSogbTY4MT8tKi0qIG02ODAqLSotKiBtNjhrLSotKiBtY29yZS0qLSogbW4xMDMwMC0qLSogeHN0b3JteTE2LSotKiB2ODUwKi0qLSogdmF4LSotKiB4dGVuc2EtKi0qIH0gfSAqLwogLyogeyBkZy1vcHRpb25zICItTzIgLWZvcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIiB9ICovCiAKIC8qIFRoZSBvcHRpb24gLWZvcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIGlzIHRoZSBkZWZhdWx0LCBidXQgc2VydmVzIGFzCi0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyYW1wb2xpbmUtMS5jCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyYW1wb2xpbmUtMS5jCkBAIC00Niw2ICs0Niw4IEBAIHZvaWQgZm9vICh2b2lkKQogCiBpbnQgbWFpbiAodm9pZCkKIHsKKyNpZm5kZWYgTk9fVFJBTVBPTElORVMKICAgZm9vICgpOworI2VuZGlmCiAgIHJldHVybiAwOwogfQotLS0gYS9nY2MvdGVzdHN1aXRlL2crKy5vbGQtZGVqYS9nKysucHQvc3RhdGljMTEuQworKysgYi9nY2MvdGVzdHN1aXRlL2crKy5vbGQtZGVqYS9nKysucHQvc3RhdGljMTEuQwpAQCAtMiw3ICsyLDcgQEAKIC8vIGluIHRoZWlyIGRlamFnbnUgYmFzZWJvYXJkIGRlc2NyaXB0aW9uKSByZXF1aXJlIHRoYXQgdGhlIHN0YXR1cyBpcwogLy8gZmluYWwgd2hlbiBleGl0IGlzIGVudGVyZWQgKG9yIG1haW4gcmV0dXJucyksIGFuZCBub3QgIm92ZXJydWxlZCIgYnkgYQogLy8gZGVzdHJ1Y3RvciBjYWxsaW5nIF9leGl0LiAgSXQncyBub3QgcmVhbGx5IHdvcnRoIGl0IHRvIGhhbmRsZSB0aGF0LgotLy8geyBkZy1kbyBydW4geyB4ZmFpbCBtbWl4LWtudXRoLW1taXh3YXJlIHh0ZW5zYS0qLWVsZiogYXJtKi0qLWVsZiBhcm0qLSotZWFiaSBtNjhrLSotZWxmIH0gfQorLy8geyBkZy1kbyBydW4geyB4ZmFpbCBtbWl4LWtudXRoLW1taXh3YXJlIHh0ZW5zYS0qLWVsZiogYXZyMzItKi1lbGYgYXJtKi0qLWVsZiBhcm0qLSotZWFiaSBtNjhrLSotZWxmIH0gfQogCiAvLyBCdWc6IGcrKyB3YXMgZmFpbGluZyB0byBkZXN0cm95IEM8aW50Pjo6YSBiZWNhdXNlIGl0IHdhcyB1c2luZyB0d28KIC8vIGRpZmZlcmVudCBzZW50cnkgdmFyaWFibGVzIGZvciBjb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uLgotLS0gYS9nY2MvdmVyc2lvbi5jCisrKyBiL2djYy92ZXJzaW9uLmMKQEAgLTgsNyArOCw3IEBACiAgICBpbiBwYXJlbnRoZXNlcy4gIFlvdSBtYXkgYWxzbyB3aXNoIHRvIGluY2x1ZGUgYSBudW1iZXIgaW5kaWNhdGluZwogICAgdGhlIHJldmlzaW9uIG9mIHlvdXIgbW9kaWZpZWQgY29tcGlsZXIuICAqLwogCi0jZGVmaW5lIFZFUlNVRkZJWCAiIgorI2RlZmluZSBWRVJTVUZGSVggIi1hdG1lbC4xLjEuMy5hdnIzMmxpbnV4LjEiCiAKIC8qIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBvbmxpbmUgZG9jdW1lbnQgZ2l2aW5nIGluc3RydWN0aW9ucyBmb3IKICAgIHJlcG9ydGluZyBidWdzLiAgSWYgeW91IGRpc3RyaWJ1dGUgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIEdDQywKQEAgLTE3LDkgKzE3LDkgQEAKICAgIGZvcndhcmQgdXMgYnVncyByZXBvcnRlZCB0byB5b3UsIGlmIHlvdSBkZXRlcm1pbmUgdGhhdCB0aGV5IGFyZQogICAgbm90IGJ1Z3MgaW4geW91ciBtb2RpZmljYXRpb25zLikgICovCiAKLWNvbnN0IGNoYXIgYnVnX3JlcG9ydF91cmxbXSA9ICI8VVJMOmh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWw+IjsKK2NvbnN0IGNoYXIgYnVnX3JlcG9ydF91cmxbXSA9ICI8VVJMOmh0dHA6Ly93d3cuYXRtZWwuY29tL2F2cjMyLz4iOwogCiAvKiBUaGUgY29tcGxldGUgdmVyc2lvbiBzdHJpbmcsIGFzc2VtYmxlZCBmcm9tIHNldmVyYWwgcGllY2VzLgogICAgQkFTRVZFUiwgREFURVNUQU1QLCBhbmQgREVWUEhBU0UgYXJlIGRlZmluZWQgYnkgdGhlIE1ha2VmaWxlLiAgKi8KIAotY29uc3QgY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0gQkFTRVZFUiBEQVRFU1RBTVAgREVWUEhBU0UgVkVSU1VGRklYOworY29uc3QgY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0gQkFTRVZFUiBWRVJTVUZGSVggREFURVNUQU1QIERFVlBIQVNFOwotLS0gYS9saWJzdGRjKystdjMvYWNpbmNsdWRlLm00CisrKyBiL2xpYnN0ZGMrKy12My9hY2luY2x1ZGUubTQKQEAgLTEyNSwxNSArMTI1LDYgQEAgQUNfREVGVU4oW0dMSUJDWFhfQ09ORklHVVJFXSwgWwogICAjIyBvdGhlciBtYWNyb3MgZnJvbSBkb2luZyB0aGUgc2FtZS4gIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRlZC4pICAtcG1lCiAgIG5lZWRfbGlibWF0aD1ubwogCi0gICMgQ2hlY2sgZm9yIHVDbGliYyBzaW5jZSBMaW51eCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uCi0gICMgZGlyZWN0b3JpZXMgZGVwZW5kaW5nIG9uIHRoZSBDIGxpYnJhcnkgaW4gdXNlLgotICBBQ19FR1JFUF9DUFAoW191c2luZ191Y2xpYmNdLCBbCi0gICNpbmNsdWRlIDxzdGRpby5oPgotICAjaWYgX19VQ0xJQkNfXwotICAgIF91c2luZ191Y2xpYmMKLSAgI2VuZGlmCi0gIF0sIHVjbGliYz15ZXMsIHVjbGliYz1ubykKLQogICAjIEZpbmQgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3JpZXMgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGluZm8uCiAgICMgQWxzbyBwb3NzaWJseSBtb2RpZnkgZmxhZ3MgdXNlZCBlbHNld2hlcmUsIGFzIG5lZWRlZCBieSB0aGUgcGxhdGZvcm0uCiAgIEdMSUJDWFhfQ0hFQ0tfSE9TVApAQCAtMTM4OSw4ICsxMzgwLDggQEAgQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NMT0NBTEVdLCBbCiAgICAgICAjZW5kaWYKICAgICAgIGludCBtYWluKCkKICAgICAgIHsKLQljb25zdCBjaGFyIF9fb25lW10gPSAixHVnbGVpbiBBdWdtZW4iOwotICAgICAgICBjb25zdCBjaGFyIF9fdHdvW10gPSAixHVnbGVpbiI7CisJY29uc3QgY2hhciBfX29uZVtdID0gIsOEdWdsZWluIEF1Z21lbiI7CisgICAgICAgIGNvbnN0IGNoYXIgX190d29bXSA9ICLDhHVnbGVpbiI7CiAgICAgICAgCWludCBpOwogICAgICAgICBpbnQgajsKICAgICAgICAgX19sb2NhbGVfdCAgICAgICAgbG9jOwotLS0gYS9saWJzdGRjKystdjMvY29uZmlnL29zL2dudS1saW51eC9jdHlwZV9iYXNlLmgKKysrIGIvbGlic3RkYysrLXYzL2NvbmZpZy9vcy9nbnUtbGludXgvY3R5cGVfYmFzZS5oCkBAIC0zMSw2ICszMSw4IEBACiAvLwogLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcwogLy8KKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CiAgIAogLyoqIEBmaWxlIGN0eXBlX2Jhc2UuaAogICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KQEAgLTQ1LDggKzQ3LDEyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRShzdGQpCiAgIHN0cnVjdCBjdHlwZV9iYXNlCiAgIHsKICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZWRlZnMuCi0gICAgdHlwZWRlZiBjb25zdCBpbnQqIAkJX190b190eXBlOwotCisjaWZkZWYgX19VQ0xJQkNfXworICAgIHR5cGVkZWYgY29uc3QgX19jdHlwZV90b3VwbG93X3QqICAgX190b190eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIGNvbnN0IGludCogICAgICAgICBfX3RvX3R5cGU7CisjZW5kaWYKKyAKICAgICAvLyBOQjogT2Zmc2V0cyBpbnRvIGN0eXBlPGNoYXI+OjpfTV90YWJsZSBmb3JjZSBhIHBhcnRpY3VsYXIgc2l6ZQogICAgIC8vIG9uIHRoZSBtYXNrIHR5cGUuIEJlY2F1c2Ugb2YgdGhpcywgd2UgZG9uJ3QgdXNlIGFuIGVudW0uCiAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAJbWFzazsgICAKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvTWFrZWZpbGUuaW4KKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvTWFrZWZpbGUuaW4KQEAgLTM2LDYgKzM2LDcgQEAgUE9TVF9VTklOU1RBTEwgPSA6CiBidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAogaG9zdF90cmlwbGV0ID0gQGhvc3RACiB0YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACitMSUJPQkpESVIgPQogRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKIAkkKHRvcF9zcmNkaXIpL2ZyYWdtZW50LmFtCiBzdWJkaXIgPSBpbmNsdWRlCi0tLSBhL2xpYnN0ZGMrKy12My9saWJtYXRoL01ha2VmaWxlLmluCisrKyBiL2xpYnN0ZGMrKy12My9saWJtYXRoL01ha2VmaWxlLmluCkBAIC0zNyw2ICszNyw3IEBAIFBPU1RfVU5JTlNUQUxMID0gOgogYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKIGhvc3RfdHJpcGxldCA9IEBob3N0QAogdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorTElCT0JKRElSID0KIHN1YmRpciA9IGxpYm1hdGgKIERJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgogQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotLS0gYS9saWJzdGRjKystdjMvbGlic3VwYysrL01ha2VmaWxlLmluCisrKyBiL2xpYnN0ZGMrKy12My9saWJzdXBjKysvTWFrZWZpbGUuaW4KQEAgLTM4LDYgKzM4LDcgQEAgUE9TVF9VTklOU1RBTEwgPSA6CiBidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAogaG9zdF90cmlwbGV0ID0gQGhvc3RACiB0YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACitMSUJPQkpESVIgPQogRElTVF9DT01NT04gPSAkKGdsaWJjeHhpbnN0YWxsX0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCiAJJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX3NyY2RpcikvZnJhZ21lbnQuYW0KIHN1YmRpciA9IGxpYnN1cGMrKwotLS0gYS9saWJzdGRjKystdjMvTWFrZWZpbGUuaW4KKysrIGIvbGlic3RkYysrLXYzL01ha2VmaWxlLmluCkBAIC0zNiw2ICszNiw3IEBAIFBPU1RfVU5JTlNUQUxMID0gOgogYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKIGhvc3RfdHJpcGxldCA9IEBob3N0QAogdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorTElCT0JKRElSID0KIERJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvLi4vY29uZmlnLmd1ZXNzIFwKIAkkKHNyY2RpcikvLi4vY29uZmlnLnN1YiAkKHNyY2RpcikvLi4vaW5zdGFsbC1zaCBcCiAJJChzcmNkaXIpLy4uL2x0bWFpbi5zaCAkKHNyY2RpcikvLi4vbWlzc2luZyBcCi0tLSBhL2xpYnN0ZGMrKy12My9wby9NYWtlZmlsZS5pbgorKysgYi9saWJzdGRjKystdjMvcG8vTWFrZWZpbGUuaW4KQEAgLTM2LDYgKzM2LDcgQEAgUE9TVF9VTklOU1RBTEwgPSA6CiBidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAogaG9zdF90cmlwbGV0ID0gQGhvc3RACiB0YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACitMSUJPQkpESVIgPQogRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKIAkkKHRvcF9zcmNkaXIpL2ZyYWdtZW50LmFtCiBzdWJkaXIgPSBwbwotLS0gYS9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCisrKyBiL2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4KQEAgLTM2LDYgKzM2LDcgQEAgUE9TVF9VTklOU1RBTEwgPSA6CiBidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAogaG9zdF90cmlwbGV0ID0gQGhvc3RACiB0YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACitMSUJPQkpESVIgPQogRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKIAkkKHRvcF9zcmNkaXIpL2ZyYWdtZW50LmFtCiBzdWJkaXIgPSBzcmMKLS0tIGEvTWFrZWZpbGUuZGVmCisrKyBiL01ha2VmaWxlLmRlZgpAQCAtNDgxLDcgKzQ4MSw3IEBAIGxhbmdfZW52X2RlcGVuZGVuY2llcyA9IHsgbW9kdWxlPXJkYTsgfTsKIGxhbmdfZW52X2RlcGVuZGVuY2llcyA9IHsgbW9kdWxlPXdpbnN1cDsgfTsKIGxhbmdfZW52X2RlcGVuZGVuY2llcyA9IHsgbW9kdWxlPXF0aHJlYWRzOyB9OwogCi1kZXBlbmRlbmNpZXMgPSB7IG1vZHVsZT1hbGwtdGFyZ2V0LWxpYmdsb3NzOyBvbj1jb25maWd1cmUtdGFyZ2V0LW5ld2xpYjsgfTsKK2RlcGVuZGVuY2llcyA9IHsgbW9kdWxlPWFsbC10YXJnZXQtbGliZ2xvc3M7IG9uPWFsbC10YXJnZXQtbmV3bGliOyB9OwogZGVwZW5kZW5jaWVzID0geyBtb2R1bGU9YWxsLXRhcmdldC13aW5zdXA7IG9uPWFsbC10YXJnZXQtbGliaWJlcnR5OyB9OwogZGVwZW5kZW5jaWVzID0geyBtb2R1bGU9YWxsLXRhcmdldC13aW5zdXA7IG9uPWFsbC10YXJnZXQtbGlidGVybWNhcDsgfTsKIAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtNDM3OTEsNyArNDM3OTEsNyBAQCBhbGwtdGFyZ2V0LWxpYm9iamM6IG1heWJlLWFsbC10YXJnZXQtYm9lCiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKy12MzogbWF5YmUtYWxsLXRhcmdldC1saWJpYmVydHkKIGluc3RhbGwtdGFyZ2V0LWxpYnNzcDogbWF5YmUtaW5zdGFsbC1nY2MKIGluc3RhbGwtdGFyZ2V0LWxpYmdvbXA6IG1heWJlLWluc3RhbGwtZ2NjCi1hbGwtdGFyZ2V0LWxpYmdsb3NzOiBtYXliZS1jb25maWd1cmUtdGFyZ2V0LW5ld2xpYgorYWxsLXRhcmdldC1saWJnbG9zczogbWF5YmUtYWxsLXRhcmdldC1uZXdsaWIKIGFsbC10YXJnZXQtd2luc3VwOiBtYXliZS1hbGwtdGFyZ2V0LWxpYmliZXJ0eQogYWxsLXRhcmdldC13aW5zdXA6IG1heWJlLWFsbC10YXJnZXQtbGlidGVybWNhcAogCi0tLSBhL2djYy9jb25maWd1cmUuYWMKKysrIGIvZ2NjL2NvbmZpZ3VyZS5hYwpAQCAtMjE1OCw3ICsyMTU4LDcgQEAgTDI6XSwKICAgYXNfdmVyPWAkZ2NjX2N2X2FzIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKICAgaWYgZWNobyAiJGFzX3ZlciIgfCBncmVwIEdOVSA+IC9kZXYvbnVsbDsgdGhlbgogY2hhbmdlcXVvdGUoLClkbmwKLSAgICBhc192ZXI9YGVjaG8gJGFzX3ZlciB8IHNlZCAtZSAncy9HTlUgYXNzZW1ibGVyIFwoWzAtOS5dWzAtOS5dKlwpLiovXDEvJ2AKKyAgICBhc192ZXI9YGVjaG8gJGFzX3ZlciB8IHNlZCAtZSAncy9HTlUgYXNzZW1ibGVyXCggKEdOVSBCaW51dGlscylcKVw/IFwoWzAtOS5dWzAtOS5dKlwpLiovXDIvJ2AKICAgICBhc19tYWpvcj1gZWNobyAkYXNfdmVyIHwgc2VkICdzL1wuLiovLydgCiAgICAgYXNfbWlub3I9YGVjaG8gJGFzX3ZlciB8IHNlZCAncy9bXi5dKlwuXChbMC05XSpcKS4qL1wxLydgCiBjaGFuZ2VxdW90ZShbLF0pZG5sCkBAIC0yOTcxLDcgKzI5NzEsNyBAQCBlc2FjCiBjYXNlICIkdGFyZ2V0IiBpbgogICBpPzg2Ki0qLSogfCBtaXBzKi0qLSogfCBhbHBoYSotKi0qIHwgcG93ZXJwYyotKi0qIHwgc3BhcmMqLSotKiB8IG02OCotKi0qIFwKICAgfCB4ODZfNjQqLSotKiB8IGhwcGEqLSotKiB8IGFybSotKi0qIHwgc3Ryb25nYXJtKi0qLSogfCB4c2NhbGUqLSotKiBcCi0gIHwgeHN0b3JteTE2Ki0qLSogfCBjcmlzLSotKiB8IHh0ZW5zYS0qLSogfCBiZmluLSotKiB8IHNjb3JlKi0qLSopCisgIHwgeHN0b3JteTE2Ki0qLSogfCBjcmlzLSotKiB8IHh0ZW5zYS0qLSogfCBiZmluLSotKiB8IHNjb3JlKi0qLSogfCBhdnIzMi0qLSopCiAgICAgaW5zbj0ibm9wIgogICAgIDs7CiAgIGlhNjQqLSotKiB8IHMzOTAqLSotKikKLS0tIGEvZ2NjL2NvbmZpZ3VyZQorKysgYi9nY2MvY29uZmlndXJlCkBAIC0xNDAyMyw3ICsxNDAyMyw3IEBAIEwyOicgPiBjb25mdGVzdC5zCiAgICMgYXJiaXRyYXJ5IHNlY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYW5kIHRyeSB0aGUgdGVzdC4KICAgYXNfdmVyPWAkZ2NjX2N2X2FzIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKICAgaWYgZWNobyAiJGFzX3ZlciIgfCBncmVwIEdOVSA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGFzX3Zlcj1gZWNobyAkYXNfdmVyIHwgc2VkIC1lICdzL0dOVSBhc3NlbWJsZXIgXChbMC05Ll1bMC05Ll0qXCkuKi9cMS8nYAorICAgIGFzX3Zlcj1gZWNobyAkYXNfdmVyIHwgc2VkIC1lICdzL0dOVSBhc3NlbWJsZXJcKCAoR05VIEJpbnV0aWxzKVwpXD8gXChbMC05Ll1bMC05Ll0qXCkuKi9cMi8nYAogICAgIGFzX21ham9yPWBlY2hvICRhc192ZXIgfCBzZWQgJ3MvXC4uKi8vJ2AKICAgICBhc19taW5vcj1gZWNobyAkYXNfdmVyIHwgc2VkICdzL1teLl0qXC5cKFswLTldKlwpLiovXDEvJ2AKICAgICBpZiB0ZXN0ICRhc19tYWpvciAtZXEgMiAmJiB0ZXN0ICRhc19taW5vciAtbHQgMTEKQEAgLTE1NjEwLDcgKzE1NjEwLDcgQEAgZXNhYwogY2FzZSAiJHRhcmdldCIgaW4KICAgaT84NiotKi0qIHwgbWlwcyotKi0qIHwgYWxwaGEqLSotKiB8IHBvd2VycGMqLSotKiB8IHNwYXJjKi0qLSogfCBtNjgqLSotKiBcCiAgIHwgeDg2XzY0Ki0qLSogfCBocHBhKi0qLSogfCBhcm0qLSotKiB8IHN0cm9uZ2FybSotKi0qIHwgeHNjYWxlKi0qLSogXAotICB8IHhzdG9ybXkxNiotKi0qIHwgY3Jpcy0qLSogfCB4dGVuc2EtKi0qIHwgYmZpbi0qLSogfCBzY29yZSotKi0qKQorICB8IHhzdG9ybXkxNiotKi0qIHwgY3Jpcy0qLSogfCB4dGVuc2EtKi0qIHwgYmZpbi0qLSogfCBzY29yZSotKi0qIHwgYXZyMzItKi0qKQogICAgIGluc249Im5vcCIKICAgICA7OwogICBpYTY0Ki0qLSogfCBzMzkwKi0qLSopCg==